55#include <Message_PrinterOStream.hxx>
56#include <Standard_Failure.hxx>
58#include <Standard_Version.hxx>
62#include <wx/tokenzr.h>
65#define OCC_VERSION_MIN 0x070500
67#if OCC_VERSION_HEX < OCC_VERSION_MIN
68#include <Message_Messenger.hxx>
80#if OCC_VERSION_HEX < OCC_VERSION_MIN
81 virtual void Send(
const TCollection_ExtendedString& theString,
82 const Message_Gravity theGravity,
83 const Standard_Boolean theToPutEol )
const override
85 Send( TCollection_AsciiString( theString ), theGravity, theToPutEol );
88 virtual void Send(
const TCollection_AsciiString& theString,
89 const Message_Gravity theGravity,
90 const Standard_Boolean theToPutEol )
const override
92 virtual void send(
const TCollection_AsciiString& theString,
93 const Message_Gravity theGravity )
const override
96 wxString msg( theString.ToCString() );
98#if OCC_VERSION_HEX < OCC_VERSION_MIN
151 m_resolver = std::make_unique<FILENAME_RESOLVER>();
171 if( aLayer == aStartLayer || aLayer == aEndLayer )
190 int startIdx = layerToIndex( aStartLayer );
191 int endIdx = layerToIndex( aEndLayer );
192 int layerIdx = layerToIndex( aLayer );
197 int minIdx = std::min( startIdx, endIdx );
198 int maxIdx = std::max( startIdx, endIdx );
200 return ( layerIdx >= minIdx && layerIdx <= maxIdx );
207 bool hasdata =
false;
208 std::vector<PAD*> padsMatchingNetFilter;
214 std::shared_ptr<SHAPE_SEGMENT> holeShape =
pad->GetEffectiveHoleShape();
217 holeShape->TransformToPolygon( holePoly,
pad->GetMaxError(),
ERROR_INSIDE );
224 if(
pad->IsOnLayer( pcblayer ) )
232 if(
m_pcbModel->AddHole( *holeShape, platingThickness,
F_Cu,
B_Cu,
false, aOrigin,
true,
true ) )
248 if( secondaryDrill.
size.
x > 0 )
251 secondaryDrill.
size.
x );
253 secondaryDrill.
end, aOrigin );
279 if( tertiaryDrill.
size.
x > 0 )
282 tertiaryDrill.
size.
x );
284 tertiaryDrill.
end, aOrigin );
313 wxLogTrace(
traceKiCad2Step, wxT(
"PAD post-machining check: frontPM.mode.has_value=%d frontPM.size=%d frontPM.depth=%d frontPM.angle=%d" ),
315 wxLogTrace(
traceKiCad2Step, wxT(
"PAD post-machining check: backPM.mode.has_value=%d backPM.size=%d backPM.depth=%d backPM.angle=%d" ),
319 bool frontPMValid = frontPM.
mode.has_value() && frontPM.
size > 0 &&
325 wxLogTrace(
traceKiCad2Step, wxT(
"PAD front post-machining: mode=%d (COUNTERBORE=2, COUNTERSINK=3)" ),
326 static_cast<int>( *frontPM.
mode ) );
333 frontPM.
depth,
true, aOrigin );
338 frontPM.
depth, frontPM.
angle,
true, aOrigin );
344 for(
const auto& [layer, diameter] : knockouts )
361 bool backPMValid = backPM.
mode.has_value() && backPM.
size > 0 &&
367 wxLogTrace(
traceKiCad2Step, wxT(
"PAD back post-machining: mode=%d (COUNTERBORE=2, COUNTERSINK=3)" ),
368 static_cast<int>( *backPM.
mode ) );
375 backPM.
depth,
false, aOrigin );
386 for(
const auto& [layer, diameter] : knockouts )
403 if( !
m_params.m_NetFilter.IsEmpty() && !
pad->GetNetname().Matches(
m_params.m_NetFilter ) )
408 if(
m_pcbModel->AddPadShape(
pad, aOrigin,
false, castellated ? aClipPolygon :
nullptr) )
420 pad->TransformShapeToPolygon( poly, cuLayer,
pad->GetSolderMaskExpansion( cuLayer ),
428 padsMatchingNetFilter.push_back(
pad );
450 std::map<const SHAPE_POLY_SET::POLYGON*, PAD*> polyPadMap;
455 for(
PAD*
pad : padsMatchingNetFilter )
457 if( !
pad->IsOnLayer( pcblayer ) )
460 std::shared_ptr<SHAPE_POLY_SET> padPoly =
pad->GetEffectivePolygon( pcblayer );
463 if( padPoly->Collide( &gfxPoly ) )
465 polyPadMap[&poly] =
pad;
477 auto it = polyPadMap.find( &poly );
479 if( it == polyPadMap.end() )
500 wxString footprintBasePath = wxEmptyString;
503 double posY = (aFootprint->
GetPosition().y) - aOrigin.
y;
507 std::optional<LIBRARY_TABLE_ROW*> fpRow =
519 bool componentFilter = !
m_params.m_ComponentFilter.IsEmpty();
520 std::vector<wxString> componentFilterPatterns;
522 if( componentFilter )
524 wxStringTokenizer tokenizer(
m_params.m_ComponentFilter,
", \t\r\n", wxTOKEN_STRTOK );
526 while( tokenizer.HasMoreTokens() )
527 componentFilterPatterns.push_back( tokenizer.GetNextToken() );
531 for(
const wxString& pattern : componentFilterPatterns )
548 if( !fp_model.m_Show || fp_model.m_Filename.empty() )
551 std::vector<wxString> searchedPaths;
552 std::vector<const EMBEDDED_FILES*> embeddedFilesStack;
554 embeddedFilesStack.push_back(
m_board->GetEmbeddedFiles() );
556 wxString mainPath =
m_resolver->ResolvePath( fp_model.m_Filename, footprintBasePath,
557 embeddedFilesStack );
559 if( mainPath.empty() || !wxFileName::FileExists( mainPath ) )
562 if( mainPath.empty() )
563 mainPath = fp_model.m_Filename;
565 m_reporter->Report( wxString::Format(
_(
"Could not add 3D model for %s.\n"
566 "File not found: %s\n" ),
573 fp_model.m_Filename.AfterLast(
'/' ).AfterLast(
'\\' ).BeforeLast(
'.' );
575 std::vector<wxString> altFilenames;
582 const auto& map = filesPtr->EmbeddedFileMap();
584 for(
auto& [fname, file] : map )
586 if( fname.BeforeLast(
'.' ) == baseName )
588 wxFileName temp_file = filesPtr->GetTemporaryFileName( fname );
590 if( !temp_file.IsOk() )
593 wxString altPath = temp_file.GetFullPath();
595 if( mainPath == altPath )
598 altFilenames.emplace_back( altPath );
609 VECTOR3D modelRot = fp_model.m_Rotation;
614 baseName, mainPath, altFilenames, aFootprint->
GetReference(), bottomSide,
616 modelRot, fp_model.m_Scale,
m_params.m_SubstModels ) )
621 catch(
const Standard_Failure& e )
623 m_reporter->Report( wxString::Format(
_(
"Could not add 3D model for %s.\n"
624 "OpenCASCADE error: %s\n" ),
626 e.GetMessageString() ),
645 double height = standoff + bodyThickness;
656 if(
m_pcbModel->AddExtrudedBody( outline, bottomSide, standoff, height, aOrigin, colorKey,
662 catch(
const Standard_Failure& e )
664 m_reporter->Report( wxString::Format(
_(
"Could not add extruded body for %s.\n"
665 "OpenCASCADE error: %s\n" ),
675 m_pcbModel->AddExtrudedPins( aFootprint, bottomSide, standoff, aOrigin );
677 catch(
const Standard_Failure& e )
679 m_reporter->Report( wxString::Format(
_(
"Could not add extruded pins for %s.\n"
680 "OpenCASCADE error: %s\n" ),
694 bool skipCopper = !
m_params.m_ExportTracksVias
695 || ( !
m_params.m_NetFilter.IsEmpty()
716 std::shared_ptr<SHAPE_SEGMENT> holeShape =
via->GetEffectiveHoleShape();
718 holeShape->TransformToPolygon( holePoly,
via->GetMaxError(),
ERROR_INSIDE );
726 via->LayerPair( &top_layer, &bot_layer );
732 const std::shared_ptr<SHAPE>& shape =
via->GetEffectiveShape( pcblayer );
740 m_pcbModel->AddBarrel( *holeShape, top_layer, bot_layer,
true, aOrigin,
via->GetNetname() );
770 if( secondaryDrill.
size.
x > 0 )
773 secondaryDrill.
size.
x );
775 secondaryDrill.
end, aOrigin );
801 if( tertiaryDrill.
size.
x > 0 )
804 tertiaryDrill.
size.
x );
806 tertiaryDrill.
end, aOrigin );
835 wxLogTrace(
traceKiCad2Step, wxT(
"VIA post-machining check: frontPM.mode.has_value=%d frontPM.size=%d frontPM.depth=%d frontPM.angle=%d" ),
837 wxLogTrace(
traceKiCad2Step, wxT(
"VIA post-machining check: backPM.mode.has_value=%d backPM.size=%d backPM.depth=%d backPM.angle=%d" ),
841 bool frontPMValid = frontPM.
mode.has_value() && frontPM.
size > 0 &&
847 wxLogTrace(
traceKiCad2Step, wxT(
"VIA front post-machining: mode=%d (COUNTERBORE=2, COUNTERSINK=3)" ),
848 static_cast<int>( *frontPM.
mode ) );
855 frontPM.
depth,
true, aOrigin );
860 frontPM.
depth, frontPM.
angle,
true, aOrigin );
866 for(
const auto& [layer, diameter] : knockouts )
883 bool backPMValid = backPM.
mode.has_value() && backPM.
size > 0 &&
889 wxLogTrace(
traceKiCad2Step, wxT(
"VIA back post-machining: mode=%d (COUNTERBORE=2, COUNTERSINK=3)" ),
890 static_cast<int>( *backPM.
mode ) );
897 backPM.
depth,
false, aOrigin );
908 for(
const auto& [layer, diameter] : knockouts )
946 LSET layers = zone->GetLayerSet();
950 && !zone->GetNetname().Matches(
m_params.m_NetFilter ) )
957 bool isMaskLayer = ( layer ==
F_Mask || layer ==
B_Mask );
960 if( aSolderMaskOnly && !isMaskLayer )
964 if( !aSolderMaskOnly && isMaskLayer && !
m_params.m_ExportZones )
968 zone->TransformSolidAreasShapesToPolygon( layer, fill_shape );
973 m_poly_shapes[layer][zone->GetNetname()].Append( fill_shape );
993 switch( aItem->
Type() )
1021 for(
SHAPE* shape : shapes )
1026 SHAPE_SEGMENT seg( a, b, graphic->GetWidth() );
1027 seg.TransformToPolygon( m_poly_shapes[pcblayer][graphic->GetNetname()],
1028 maxError, ERROR_INSIDE );
1032 for(
SHAPE* shape : shapes )
1078 textbox->PCB_SHAPE::TransformShapeToPolygon(
m_poly_shapes[pcblayer][wxEmptyString], pcblayer, 0,
1106 default: wxFAIL_MSG(
"buildGraphic3DShape: unhandled item type" );
1169 if( !
m_board->GetBoardPolygonOutlines( pcbOutlines,
1174 wxLogWarning(
_(
"Board outline is malformed. Run DRC for a full analysis." ) );
1185 origin =
m_board->GetDesignSettings().GetAuxOrigin();
1186 else if(
m_params.m_UseGridOrigin )
1187 origin =
m_board->GetDesignSettings().GetGridOrigin();
1246 poly.SimplifyOutlines(
pcbIUScale.mmToIU( 0.003 ) );
1254 m_pcbModel->AddPolygonShapes( &mask, pcblayer, origin, wxEmptyString );
1262 poly.SimplifyOutlines(
pcbIUScale.mmToIU( 0.003 ) );
1266 poly.BooleanSubtract( holes );
1269 poly.BooleanIntersection( pcbOutlinesNoArcs );
1271 m_pcbModel->AddPolygonShapes( &poly, pcblayer, origin, netname );
1278 m_reporter->Report( wxString::Format( wxT(
"Board outline: found %d initial points.\n" ),
1298 struct SCOPED_PRINTER
1300 Handle( Message_Printer ) m_handle;
1302 SCOPED_PRINTER(
const Handle( Message_Printer ) & aHandle ) : m_handle( aHandle )
1304 Message::DefaultMessenger()->AddPrinter( m_handle );
1307 ~SCOPED_PRINTER() { Message::DefaultMessenger()->RemovePrinter( m_handle ); }
1310 Message::DefaultMessenger()->RemovePrinters( STANDARD_TYPE( Message_PrinterOStream ) );
1315 if(
m_params.m_OutputFile.IsEmpty() )
1317 wxFileName fn =
m_board->GetFileName();
1318 fn.SetName( fn.GetName() );
1319 fn.SetExt(
m_params.GetDefaultExportExtension() );
1321 m_params.m_OutputFile = fn.GetFullName();
1345 m_reporter->Report( wxString::Format( wxT(
"Build %s data.\n" ),
m_params.GetFormatName() ),
1351 "** Error building STEP board model. Export aborted. **\n" ),
1356 m_reporter->Report( wxString::Format( wxT(
"Writing %s file.\n" ),
m_params.GetFormatName() ),
1359 bool success =
true;
1382 "** Error writing %s file. **\n" ),
1389 m_reporter->Report( wxString::Format( wxT(
"%s file '%s' created.\n" ),
1395 catch(
const std::bad_alloc& )
1397 m_reporter->Report( wxString::Format(
_(
"\n** Out of memory while exporting %s file. **\n"
1398 "The board may have too many objects (e.g., vias, tracks, components) "
1399 "to process with available system memory.\n"
1400 "Try disabling 'Fuse Shapes' option, reducing board complexity, "
1401 "or freeing up system memory.\n" ),
1406 catch(
const Standard_Failure& e )
1408 wxString errorMsg = e.GetMessageString();
1409 m_reporter->Report( wxString::Format(
_(
"\nOpenCASCADE error: %s\n" ), errorMsg ),
1413 if( errorMsg.Contains(
"alloc" ) || errorMsg.Contains(
"memory" ) ||
1414 errorMsg.IsEmpty() )
1416 m_reporter->Report(
_(
"This error may indicate insufficient memory. Consider disabling "
1417 "'Fuse Shapes', reducing the number of vias/components, or freeing "
1418 "system memory.\n" ),
1422 m_reporter->Report( wxString::Format(
_(
"** Error exporting %s file. Export aborted. **\n" ),
1430 m_reporter->Report( wxString::Format(
_(
"\n** Unexpected error while exporting %s file. **\n"
1431 "This may be caused by insufficient system memory, especially "
1432 "when exporting boards with many vias or components with 'Fuse Shapes' enabled.\n"
1433 "Try disabling 'Fuse Shapes', reducing board complexity, "
1434 "or freeing up system memory.\n" ),
1444 "Export time %.3f s\n" ),
void ApplyExtrusionTransform(SHAPE_POLY_SET &aOutline, const EXTRUDED_3D_BODY *aBody, const VECTOR2I &aFpPos)
Apply 2D extrusion transforms (rotation, scale, offset) to an outline.
bool GetExtrusionOutline(const FOOTPRINT *aFootprint, SHAPE_POLY_SET &aOutline, PCB_LAYER_ID aLayerOverride)
Get the extrusion outline polygon for a footprint in board coordinates.
constexpr EDA_IU_SCALE pcbIUScale
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
wxString GetNetname() const
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual void TransformShapeToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, KIGFX::RENDER_SETTINGS *aRenderSettings=nullptr) const
Convert the item shape to a polyset.
Information pertinent to a Pcbnew printed circuit board.
const wxString & GetFileName() const
PROJECT * GetProject() const
KICAD_T Type() const
Returns the type of object.
const SHAPE_POLY_SET & GetHatching() const
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
bool IsHatchedFill() const
LINE_STYLE GetLineStyle() const
bool buildTrack3DShape(PCB_TRACK *aTrack, const VECTOR2D &aOrigin)
bool buildFootprint3DShapes(FOOTPRINT *aFootprint, const VECTOR2D &aOrigin, SHAPE_POLY_SET *aClipPolygon)
std::map< PCB_LAYER_ID, SHAPE_POLY_SET > m_poly_holes
bool isLayerInBackdrillSpan(PCB_LAYER_ID aLayer, PCB_LAYER_ID aStartLayer, PCB_LAYER_ID aEndLayer) const
Check if a copper layer is within a backdrill layer span (inclusive).
EXPORTER_STEP_PARAMS m_params
wxString m_pcbBaseName
the name of the project (board short filename (no path, no ext) used to identify items in step file
std::unique_ptr< FILENAME_RESOLVER > m_resolver
bool buildBoard3DShapes()
std::unique_ptr< STEP_PCB_MODEL > m_pcbModel
std::map< PCB_LAYER_ID, std::map< wxString, SHAPE_POLY_SET > > m_poly_shapes
KIGFX::COLOR4D m_copperColor
EXPORTER_STEP(BOARD *aBoard, const EXPORTER_STEP_PARAMS &aParams, REPORTER *aReporter)
bool buildGraphic3DShape(BOARD_ITEM *aItem, const VECTOR2D &aOrigin)
KIGFX::COLOR4D m_padColor
void buildZones3DShape(VECTOR2D aOrigin, bool aSolderMaskOnly=false)
static KIGFX::COLOR4D GetDefaultColor(EXTRUSION_MATERIAL aMaterial)
static uint32_t PackColorKey(const KIGFX::COLOR4D &aColor)
EXTRUSION_MATERIAL m_material
virtual void Send(const TCollection_ExtendedString &theString, const Message_Gravity theGravity, const Standard_Boolean theToPutEol) const override
SEVERITY getSeverity(const Message_Gravity theGravity) const
KICAD_PRINTER(REPORTER *aReporter)
virtual void Send(const TCollection_AsciiString &theString, const Message_Gravity theGravity, const Standard_Boolean theToPutEol) const override
A color representation with 4 components: red, green, blue, alpha.
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
PCB specific render settings.
void SetGapLengthRatio(double aRatio)
void SetDashLengthRatio(double aRatio)
std::optional< LIBRARY_TABLE_ROW * > GetRow(const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::GetRow but filtered to the LIBRARY_TABLE_TYPE of this adapter.
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false)
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
LSET is a set of PCB_LAYER_IDs.
static const LSET & ExternalCuMask()
Return a mask holding the Front and Bottom layers.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static const LSET & InternalCuMask()
Return a complete set of internal copper layers which is all Cu layers except F_Cu and B_Cu.
A PADSTACK defines the characteristics of a single or multi-layer pad, in the IPC sense of the word.
POST_MACHINING_PROPS & FrontPostMachining()
DRILL_PROPS & TertiaryDrill()
DRILL_PROPS & SecondaryDrill()
POST_MACHINING_PROPS & BackPostMachining()
Parameters and options when plotting/printing a board.
double GetDashedLineGapRatio() const
double GetDashedLineDashRatio() const
int GetWidth() const override
int GetSolderMaskExpansion() const
void TransformShapeToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, KIGFX::RENDER_SETTINGS *aRenderSettings=nullptr) const override
Convert the item shape to a polyset.
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the shape to a closed polygon.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
bool IsBorderEnabled() const
Disables the border, this is done by changing the stroke internally.
void TransformTextToPolySet(SHAPE_POLY_SET &aBuffer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc) const
Function TransformTextToPolySet Convert the text to a polygonSet describing the actual character stro...
int GetSolderMaskExpansion() const
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the track shape to a closed polygon.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
static FOOTPRINT_LIBRARY_ADAPTER * FootprintLibAdapter(PROJECT *aProject)
A pure virtual class used to derive REPORTER objects from.
Represent a set of closed polygons.
void ClearArcs()
Removes all arc references from all the outlines and holes in the polyset.
int FullPointCount() const
Return the number of points in the shape poly set.
void Simplify()
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections)
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
void Unfracture()
Convert a single outline slitted ("fractured") polygon into a set ouf outlines with holes.
void SimplifyOutlines(int aMaxError=0)
Simplifies the lines in the polyset.
void Deflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError)
int OutlineCount() const
Return the number of outlines in the set.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const std::vector< POLYGON > & CPolygons() const
void TransformToPolygon(SHAPE_POLY_SET &aBuffer, int aError, ERROR_LOC aErrorLoc) const override
Fills a SHAPE_POLY_SET with a polygon representation of this shape.
An abstract shape on 2D plane.
Simple container to manage line stroke parameters.
static void Stroke(const SHAPE *aShape, LINE_STYLE aLineStyle, int aWidth, const KIGFX::RENDER_SETTINGS *aRenderSettings, const std::function< void(const VECTOR2I &a, const VECTOR2I &b)> &aStroker)
Handle a list of polygons defining a copper zone.
void TransformCircleToPolygon(SHAPE_LINE_CHAIN &aBuffer, const VECTOR2I &aCenter, int aRadius, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a circle to a polygon, using multiple straight lines.
@ ROUND_ALL_CORNERS
All angles are rounded.
static const std::string KiCadUriPrefix
const wxChar *const traceKiCad2Step
Flag to enable KiCad2Step debug tracing.
Handle(KICAD3D_INFO) KICAD3D_INFO
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
bool IsInnerCopperLayer(int aLayerId)
Test whether a layer is an inner (In1_Cu to In30_Cu) copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
@ PTH
Plated through hole pad.
@ CASTELLATED
a pad with a castellated through hole
BARCODE class definition.
PGM_BASE & Pgm()
The global program "get" accessor.
int64_t GetRunningMicroSecs()
An alternate way to calculate an elapsed time (in microsecondes) to class PROF_COUNTER.
static constexpr double OCC_MAX_DISTANCE_TO_MERGE_POINTS
Default distance between points to treat them as separate ones (mm) 0.001 mm or less is a reasonable ...
LINE_STYLE
Dashed line types.
! The properties of a padstack drill. Drill position is always the pad position (origin).
VECTOR2I size
Drill diameter (x == y) or slot dimensions (x != y)
std::optional< PAD_DRILL_POST_MACHINING_MODE > mode
std::vector< std::vector< std::string > > table
wxLogTrace helper definitions.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D
VECTOR3< double > VECTOR3D
Definition of file extensions used in Kicad.