52#include <Message_PrinterOStream.hxx>  
   53#include <Standard_Failure.hxx>        
   55#include <Standard_Version.hxx> 
   61#define OCC_VERSION_MIN 0x070500 
   63#if OCC_VERSION_HEX < OCC_VERSION_MIN 
   64#include <Message_Messenger.hxx> 
   76#if OCC_VERSION_HEX < OCC_VERSION_MIN 
   77    virtual void Send( 
const TCollection_ExtendedString& theString,
 
   78                       const Message_Gravity theGravity,
 
   79                       const Standard_Boolean theToPutEol )
 const override 
   81        Send( TCollection_AsciiString( theString ), theGravity, theToPutEol );
 
 
   84    virtual void Send( 
const TCollection_AsciiString& theString,
 
   85                       const Message_Gravity theGravity,
 
   86                       const Standard_Boolean theToPutEol ) 
const override 
   88    virtual void send( 
const TCollection_AsciiString& theString,
 
   89                       const Message_Gravity theGravity ) 
const override 
   92        wxString msg( theString.ToCString() );
 
   94#if OCC_VERSION_HEX < OCC_VERSION_MIN 
 
 
  147    m_resolver = std::make_unique<FILENAME_RESOLVER>();
 
 
  163    bool              hasdata = 
false;
 
  164    std::vector<PAD*> padsMatchingNetFilter;
 
  170        std::shared_ptr<SHAPE_SEGMENT> holeShape = 
pad->GetEffectiveHoleShape();
 
  173        holeShape->TransformToPolygon( holePoly, 
pad->GetMaxError(), 
ERROR_INSIDE );
 
  180            if( 
pad->IsOnLayer( pcblayer ) )
 
  188            if( 
m_pcbModel->AddHole( *holeShape, platingThickness, 
F_Cu, 
B_Cu, 
false, aOrigin, 
true, 
true ) )
 
  199        if( !
m_params.m_NetFilter.IsEmpty() && !
pad->GetNetname().Matches( 
m_params.m_NetFilter ) )
 
  204            if( 
m_pcbModel->AddPadShape( 
pad, aOrigin, 
false, castellated ? aClipPolygon : 
nullptr) )
 
  216                    pad->TransformShapeToPolygon( poly, cuLayer, 
pad->GetSolderMaskExpansion( cuLayer ),
 
  224        padsMatchingNetFilter.push_back( 
pad );
 
  246            std::map<const SHAPE_POLY_SET::POLYGON*, PAD*> polyPadMap;
 
  251                for( 
PAD* 
pad : padsMatchingNetFilter )
 
  253                    if( !
pad->IsOnLayer( pcblayer ) )
 
  256                    std::shared_ptr<SHAPE_POLY_SET> padPoly = 
pad->GetEffectivePolygon( pcblayer );
 
  259                    if( padPoly->Collide( &gfxPoly ) )
 
  261                        polyPadMap[&poly] = 
pad;
 
  273                    auto it = polyPadMap.find( &poly );
 
  275                    if( it == polyPadMap.end() )
 
  295    wxString footprintBasePath = wxEmptyString;
 
  298    double posY = (aFootprint->
GetPosition().y) - aOrigin.
y;
 
  309                footprintBasePath = fpRow->
GetFullURI( 
true );
 
  323    bool componentFilter = !
m_params.m_ComponentFilter.IsEmpty();
 
  324    std::vector<wxString> componentFilterPatterns;
 
  326    if( componentFilter )
 
  328        wxStringTokenizer tokenizer( 
m_params.m_ComponentFilter, 
", \t\r\n", wxTOKEN_STRTOK );
 
  330        while( tokenizer.HasMoreTokens() )
 
  331            componentFilterPatterns.push_back( tokenizer.GetNextToken() );
 
  335        for( 
const wxString& pattern : componentFilterPatterns )
 
  352        if( !fp_model.m_Show || fp_model.m_Filename.empty() )
 
  355        std::vector<wxString> searchedPaths;
 
  356        std::vector<const EMBEDDED_FILES*> embeddedFilesStack;
 
  358        embeddedFilesStack.push_back( 
m_board->GetEmbeddedFiles() );
 
  360        wxString mname = 
m_resolver->ResolvePath( fp_model.m_Filename, footprintBasePath,
 
  361                                                  std::move( embeddedFilesStack ) );
 
  363        if( mname.empty() || !wxFileName::FileExists( mname ) )
 
  367                mname = fp_model.m_Filename;
 
  369            m_reporter->Report( wxString::Format( 
_( 
"Could not add 3D model for %s.\n" 
  370                                                     "File not found: %s\n" ),
 
  377        std::string fname( mname.ToUTF8() );
 
  378        std::string refName( aFootprint->
GetReference().ToUTF8() );
 
  385            VECTOR3D modelRot = fp_model.m_Rotation;
 
  389            if( 
m_pcbModel->AddComponent( fname, refName, bottomSide, newpos,
 
  391                                          fp_model.m_Offset, modelRot,
 
  392                                          fp_model.m_Scale, 
m_params.m_SubstModels ) )
 
  397        catch( 
const Standard_Failure& e )
 
  399            m_reporter->Report( wxString::Format( 
_( 
"Could not add 3D model for %s.\n" 
  400                                                     "OpenCASCADE error: %s\n" ),
 
  402                                                  e.GetMessageString() ),
 
 
  414    bool skipCopper = !
m_params.m_ExportTracksVias
 
  415                      || ( !
m_params.m_NetFilter.IsEmpty()
 
  436        std::shared_ptr<SHAPE_SEGMENT> holeShape = 
via->GetEffectiveHoleShape();
 
  438        holeShape->TransformToPolygon( holePoly, 
via->GetMaxError(), 
ERROR_INSIDE );
 
  446        via->LayerPair( &top_layer, &bot_layer );
 
  452                const std::shared_ptr<SHAPE>& shape = 
via->GetEffectiveShape( pcblayer );
 
  460            m_pcbModel->AddBarrel( *holeShape, top_layer, bot_layer, 
true, aOrigin, 
via->GetNetname() );
 
 
  495        LSET layers = zone->GetLayerSet();
 
  498            && !zone->GetNetname().Matches( 
m_params.m_NetFilter ) )
 
  506            zone->TransformSolidAreasShapesToPolygon( layer, fill_shape );
 
  511            m_poly_shapes[layer][zone->GetNetname()].Append( fill_shape );
 
 
  531    switch( aItem->
Type() )
 
  559            for( 
SHAPE* shape : shapes )
 
  564                            SHAPE_SEGMENT seg( a, b, graphic->GetWidth() );
 
  565                            seg.TransformToPolygon( m_poly_shapes[pcblayer][graphic->GetNetname()],
 
  566                                                    maxError, ERROR_INSIDE );
 
  570            for( 
SHAPE* shape : shapes )
 
  616            textbox->PCB_SHAPE::TransformShapeToPolygon( 
m_poly_shapes[pcblayer][wxEmptyString], pcblayer, 0,
 
  644    default: wxFAIL_MSG( 
"buildGraphic3DShape: unhandled item type" );
 
 
  707    if( !
m_board->GetBoardPolygonOutlines( pcbOutlines,
 
  711        wxLogWarning( 
_( 
"Board outline is malformed. Run DRC for a full analysis." ) );
 
  722        origin = 
m_board->GetDesignSettings().GetAuxOrigin();
 
  724        origin = 
m_board->GetDesignSettings().GetGridOrigin();
 
  777                poly.SimplifyOutlines( 
pcbIUScale.mmToIU( 0.003 ) );
 
  785            m_pcbModel->AddPolygonShapes( &mask, pcblayer, origin, wxEmptyString );
 
  793                poly.SimplifyOutlines( 
pcbIUScale.mmToIU( 0.003 ) );
 
  797                poly.BooleanSubtract( holes );
 
  800                poly.BooleanIntersection( pcbOutlinesNoArcs );
 
  802                m_pcbModel->AddPolygonShapes( &poly, pcblayer, origin, netname );
 
  809    m_reporter->Report( wxString::Format( wxT( 
"Board outline: found %d initial points.\n" ),
 
 
  829    struct SCOPED_PRINTER
 
  831        Handle( Message_Printer ) m_handle;
 
  833        SCOPED_PRINTER( 
const Handle( Message_Printer ) & aHandle ) : m_handle( aHandle )
 
  835            Message::DefaultMessenger()->AddPrinter( m_handle );
 
  838        ~SCOPED_PRINTER() { Message::DefaultMessenger()->RemovePrinter( m_handle ); }
 
  841    Message::DefaultMessenger()->RemovePrinters( STANDARD_TYPE( Message_PrinterOStream ) );
 
  846    if( 
m_params.m_OutputFile.IsEmpty() )
 
  848        wxFileName fn = 
m_board->GetFileName();
 
  849        fn.SetName( fn.GetName() );
 
  850        fn.SetExt( 
m_params.GetDefaultExportExtension() );
 
  852        m_params.m_OutputFile = fn.GetFullName();
 
  876        m_reporter->Report( wxString::Format( wxT( 
"Build %s data.\n" ), 
m_params.GetFormatName() ),
 
  882                                   "** Error building STEP board model. Export aborted. **\n" ),
 
  887        m_reporter->Report( wxString::Format( wxT( 
"Writing %s file.\n" ), 
m_params.GetFormatName() ),
 
  913                                                     "** Error writing %s file. **\n" ),
 
  920            m_reporter->Report( wxString::Format( wxT( 
"%s file '%s' created.\n" ),
 
  926    catch( 
const Standard_Failure& e )
 
  930                                                 "** Error exporting %s file. Export aborted. **\n" ),
 
  939                                                 "** Error exporting %s file. Export aborted. **\n" ),
 
  949                                             "Export time %.3f s\n" ),
 
 
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
 
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) 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
 
void buildZones3DShape(VECTOR2D aOrigin)
 
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
 
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
 
Hold a record identifying a library accessed by the appropriate footprint library #PLUGIN object in t...
 
const FP_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an FP_LIB_TABLE_ROW if aNickName is found in this table or in any chained fall back table frag...
 
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.
 
PCB specific render settings.
 
void SetGapLengthRatio(double aRatio)
 
void SetDashLengthRatio(double aRatio)
 
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
 
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
 
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.
 
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) 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 FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
 
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)
 
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.
 
@ ROUND_ALL_CORNERS
All angles are rounded.
 
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.
 
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.