29#include <wx/wfstream.h> 
   30#include <wx/zstream.h> 
   46#include "vrml_layer.h" 
   62                              const wxString& aFullFileName, 
double aMMtoWRMLunit,
 
   63                              bool aIncludeUnspecified, 
bool aIncludeDNP,
 
   64                              bool aExport3DFiles, 
bool aUseRelativePaths,
 
   65                              const wxString& a3D_Subdir,
 
   66                              double aXRef, 
double aYRef )
 
   68    return pcb_exporter->ExportVRML_File( aProject, aMessages,
 
   69                                          aFullFileName, aMMtoWRMLunit,
 
   70                                          aIncludeUnspecified, aIncludeDNP,
 
   71                                          aExport3DFiles, aUseRelativePaths,
 
   72                                          a3D_Subdir, aXRef, aYRef );
 
 
   83#define ERR_APPROX_MAX_MM 0.005 
  130    COLOR4D boardBody( 0, 0, 0, 0 );
 
  138                if( aColorName.StartsWith( wxT( 
"#" ) ) )
 
  146                        if( 
color.m_ColorName == aColorName )
 
  147                            return color.m_Color;
 
  156        wxString colorName = stackupItem->GetColor();
 
  158        switch( stackupItem->GetType() )
 
  161            if( stackupItem->GetBrdLayerId() == 
F_SilkS )
 
  168            if( stackupItem->GetBrdLayerId() == 
F_Mask )
 
  179            if( boardBody == 
COLOR4D( 0, 0, 0, 0 ) )
 
  180                boardBody = layerColor;
 
  182                boardBody = boardBody.
Mix( layerColor, 1.0 - layerColor.
a );
 
  184            boardBody.
a += ( 1.0 - boardBody.
a ) * layerColor.
a / 2;
 
  193    if( boardBody == 
COLOR4D( 0, 0, 0, 0 ) )
 
  198    if( finishName.EndsWith( wxT( 
"OSP" ) ) )
 
  202    else if( finishName.EndsWith( wxT( 
"IG" ) )
 
  203          || finishName.EndsWith( wxT( 
"gold" ) ) )
 
  207    else if( finishName.StartsWith( wxT( 
"HAL" ) )
 
  208          || finishName.StartsWith( wxT( 
"HASL" ) )
 
  209          || finishName.EndsWith( wxT( 
"tin" ) )
 
  210          || finishName.EndsWith( wxT( 
"nickel" ) ) )
 
  214    else if( finishName.EndsWith( wxT( 
"silver" ) ) )
 
  220            []( 
const COLOR4D& aColor, 
double aSpecular, 
double aAmbient, 
double aShiny )
 
  226                                   spec.
r, spec.
g, spec.
b,
 
  227                                   aAmbient, 1.0 - aColor.
a, aShiny );
 
 
  275#define ADD_COLOR( list, r, g, b, a, name ) \ 
  276    list.emplace_back( r/255.0, g/255.0, b/255.0, a, name ) 
 
  337    if( aWorldScale < 0.001 || aWorldScale > 10.0 )
 
  338        throw( std::runtime_error( 
"WorldScale out of range (valid range is 0.001 to 10.0)" ) );
 
 
  352    m_holes.SetVertexOffsets( aXoff, aYoff );
 
 
  380    default:                                    
return false;
 
 
  393    for( 
int lcnt = 0; lcnt < 2; lcnt++ )
 
  398        m_board->ConvertBrdLayerToPolygonalContours( pcb_layer, holes );
 
 
  419    VRML_LAYER* vrmllayer[] =
 
  425    for( 
int lcnt = 0; ; lcnt++ )
 
  427        if( vrmllayer[lcnt] == 
nullptr )
 
  431        m_board->ConvertBrdLayerToPolygonalContours( pcb_layer[lcnt], outlines );
 
 
  441                                            VRML_LAYER* aLayer, 
bool aPlane, 
bool aTop,
 
  442                                            double aTop_z, 
double aBottom_z )
 
  445    static const char* shape_boiler[] =
 
  452        "          appearance Appearance {\n",
 
  453        "            material Material {\n",
 
  457        "          geometry IndexedFaceSet {\n",
 
  459        "            coord Coordinate {\n",
 
  476    int marker_found = 0, lineno = 0;
 
  478    while( marker_found < 4 )
 
  480        if( shape_boiler[lineno] )
 
  482            aOut_file << shape_boiler[lineno];
 
  488            switch( marker_found )
 
  492                std::streamsize lastPrecision = aOut_file.precision();
 
  493                aOut_file << 
"              diffuseColor " << std::setprecision(3);
 
  498                aOut_file << 
"              specularColor ";
 
  499                aOut_file << aColor.
spec_red << 
" ";
 
  500                aOut_file << aColor.
spec_grn << 
" ";
 
  501                aOut_file << aColor.
spec_blu << 
"\n";
 
  503                aOut_file << 
"              emissiveColor ";
 
  504                aOut_file << aColor.
emit_red << 
" ";
 
  505                aOut_file << aColor.
emit_grn << 
" ";
 
  506                aOut_file << aColor.
emit_blu << 
"\n";
 
  508                aOut_file << 
"              ambientIntensity " << aColor.
ambient << 
"\n";
 
  509                aOut_file << 
"              transparency " << aColor.
transp << 
"\n";
 
  510                aOut_file << 
"              shininess " << aColor.
shiny << 
"\n";
 
  511                aOut_file.precision( lastPrecision );
 
  518                    aLayer->WriteVertices( aTop_z, aOut_file, 
m_precision );
 
  520                    aLayer->Write3DVertices( aTop_z, aBottom_z, aOut_file, 
m_precision );
 
  528                    aLayer->WriteIndices( aTop, aOut_file );
 
  530                    aLayer->Write3DIndices( aOut_file );
 
 
  722    int copper_layers = 
m_board->GetCopperLayerCount();
 
  729    int orderFromTop = 0;
 
 
  759    for( 
int icnt = 0; icnt < aOutlines.
OutlineCount(); icnt++ )
 
  763        int seg = aVlayer->NewContour();
 
  765        for( 
int jj = 0; jj < outline.
PointCount(); jj++ )
 
  769                throw( std::runtime_error( aVlayer->GetError() ) );
 
  772        aVlayer->EnsureWinding( seg, 
false );
 
 
  781        wxLogWarning( 
_( 
"Board outline is malformed. Run DRC for a full analysis." ) );
 
  786    for( 
int cnt = 0; cnt < 
m_pcbOutlines.OutlineCount(); cnt++ )
 
  792        for( 
int j = 0; j < outline.
PointCount(); j++ )
 
  810                wxLogError( 
_( 
"VRML Export Failed: Could not add holes to contours." ) );
 
  820            m_holes.EnsureWinding( seg, 
true );
 
 
  838        via->LayerPair( &top_layer, &bottom_layer );
 
  841        if( top_layer != 
F_Cu && bottom_layer != 
B_Cu )
 
  847        if( hole_radius <= 0 )
 
  864        double minSegLength = 
M_PI * 2.0 * hole_radius / nsides;
 
  865        double maxSegLength = minSegLength*2.0;
 
  867        m_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
 
  868        m_plated_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
 
  870        m_holes.AddCircle( x, -y, hole_radius, 
true, 
true );
 
 
  883    double  hole_drill      = std::min( hole_drill_w, hole_drill_h );
 
  897        double minSegLength = 
M_PI * hole_drill / nsides;
 
  898        double maxSegLength = minSegLength*2.0;
 
  900        m_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
 
  901        m_plated_holes.SetArcParams( nsides*2, minSegLength, maxSegLength );
 
  919                                        hole_drill_w * 2.0, hole_drill_h * 2.0,
 
  924                m_holes.AddSlot( hole_x, -hole_y, hole_drill_w * 2.0, hole_drill_h * 2.0,
 
  935                m_plated_holes.AddCircle( hole_x, -hole_y, hole_drill, 
true, 
false );
 
  939                m_holes.AddCircle( hole_x, -hole_y, hole_drill, 
true, 
false );
 
 
  951static void build_quat( 
double x, 
double y, 
double z, 
double a, 
double q[4] )
 
  953    double sina = sin( a / 2 );
 
 
  965    rot[3] = acos( q[3] ) * 2;
 
  967    for( 
int i = 0; i < 3; i++ )
 
  968        rot[i] = q[i] / sin( rot[3] / 2 );
 
 
  977    tmp[0] = q2[3] * q1[0] + q2[0] * q1[3] + q2[1] * q1[2] - q2[2] * q1[1];
 
  978    tmp[1] = q2[3] * q1[1] + q2[1] * q1[3] + q2[2] * q1[0] - q2[0] * q1[2];
 
  979    tmp[2] = q2[3] * q1[2] + q2[2] * q1[3] + q2[0] * q1[1] - q2[1] * q1[0];
 
  980    tmp[3] = q2[3] * q1[3] - q2[0] * q1[0] - q2[1] * q1[1] - q2[2] * q1[2];
 
 
  996    wxCHECK( aFootprint,  );
 
  999    wxString footprintBasePath = wxEmptyString;
 
 1015            footprintBasePath = fpRow->
GetFullURI( 
true );
 
 1032    std::vector<const EMBEDDED_FILES*> embeddedFilesStack;
 
 1036    auto sM = aFootprint->
Models().begin();
 
 1037    auto eM = aFootprint->
Models().end();
 
 1048        embeddedFilesStack.clear();
 
 1050        embeddedFilesStack.push_back( 
m_board->GetEmbeddedFiles() );
 
 1053                                                         std::move( embeddedFilesStack ) );
 
 1060        double rotx = -sM->m_Rotation.x;
 
 1061        double roty = -sM->m_Rotation.y;
 
 1062        double rotz = -sM->m_Rotation.z;
 
 1072        double q1[4], q2[4], rot[4];
 
 1085        double offsetFactor = 1000.0f * 
pcbIUScale.IU_PER_MILS / 25.4f;
 
 1089        double offsetx = sM->m_Offset.x * offsetFactor;
 
 1090        double offsety = sM->m_Offset.y * offsetFactor;
 
 1091        double offsetz = sM->m_Offset.z * offsetFactor;
 
 1107            wxCHECK( aOutputFile,  );
 
 1109            int old_precision = aOutputFile->precision();
 
 1112            embeddedFilesStack.clear();
 
 1114            embeddedFilesStack.push_back( 
m_board->GetEmbeddedFiles() );
 
 1116            wxFileName srcFile = 
m_Cache3Dmodels->GetResolver()->ResolvePath( sM->m_Filename, footprintBasePath,
 
 1117                                                                              std::move( embeddedFilesStack ) );
 
 1118            if( !srcFile.FileExists() ) {
 
 1126            dstFile.SetName( srcFile.GetName() );
 
 1127            dstFile.SetExt( wxT( 
"wrl" ) );
 
 1130            wxDateTime srcModTime = srcFile.GetModificationTime();
 
 1131            wxDateTime destModTime = wxDateTime();
 
 1133            if( dstFile.FileExists() )
 
 1134                destModTime = dstFile.GetModificationTime();
 
 1136            if( srcModTime != destModTime )
 
 1138                wxString fileExt = srcFile.GetExt();
 
 1139                fileExt.LowerCase();
 
 1143                if( fileExt == wxT( 
"wrl" ) )
 
 1145                    if( !wxCopyFile( srcFile.GetFullPath(), dstFile.GetFullPath() ) )
 
 1151                else if( fileExt == wxT( 
"wrz" ) )
 
 1153                    wxFileInputStream input_file_stream( srcFile.GetFullPath() );
 
 1154                    if( !input_file_stream.IsOk() || input_file_stream.GetSize() == wxInvalidSize )
 
 1160                    wxZlibInputStream   zlib_input_stream( input_file_stream, wxZLIB_GZIP );
 
 1161                    wxFFileOutputStream output_file_stream( dstFile.GetFullPath() );
 
 1162                    if( !zlib_input_stream.IsOk() || !output_file_stream.IsOk() )
 
 1164                        output_file_stream.Close();
 
 1169                    output_file_stream.Write( zlib_input_stream );
 
 1170                    output_file_stream.Close();
 
 1175                    if( ( 
nullptr == mod3d) ||
 
 1185            (*aOutputFile) << 
"Transform {\n";
 
 1188            if( 
std::abs( rot[3] ) > 0.0001745 )
 
 1190                (*aOutputFile) << 
"  rotation ";
 
 1191                (*aOutputFile) << rot[0] << 
" " << rot[1] << 
" " << rot[2] << 
" " << rot[3] << 
"\n";
 
 1194            (*aOutputFile) << 
"  translation ";
 
 1195            (*aOutputFile) << trans.
x << 
" ";
 
 1196            (*aOutputFile) << trans.
y << 
" ";
 
 1197            (*aOutputFile) << trans.
z << 
"\n";
 
 1199            (*aOutputFile) << 
"  scale ";
 
 1200            (*aOutputFile) << sM->m_Scale.x << 
" ";
 
 1201            (*aOutputFile) << sM->m_Scale.y << 
" ";
 
 1202            (*aOutputFile) << sM->m_Scale.z << 
"\n";
 
 1204            (*aOutputFile) << 
"  children [\n    Inline {\n      url \"";
 
 1208                wxFileName tmp = dstFile;
 
 1209                tmp.SetExt( wxT( 
"" ) );
 
 1210                tmp.SetName( wxT( 
"" ) );
 
 1211                tmp.RemoveLastDir();
 
 1212                dstFile.MakeRelativeTo( tmp.GetPath() );
 
 1215            wxString fn = dstFile.GetFullPath();
 
 1216            fn.Replace( wxT( 
"\\" ), wxT( 
"/" ) );
 
 1217            (*aOutputFile) << 
TO_UTF8( fn ) << 
"\"\n    } ]\n";
 
 1218            (*aOutputFile) << 
"  }\n";
 
 1220            aOutputFile->precision( old_precision );
 
 1224        if( 
nullptr == mod3d )
 
 1233            if( 
std::abs( rot[3] ) > 0.0001745 )
 
 1237            modelShape->
SetScale( 
SGPOINT( sM->m_Scale.x, sM->m_Scale.y, sM->m_Scale.z ) );
 
 
 1258                                         const wxString& aFullFileName, 
double aMMtoWRMLunit,
 
 1259                                         bool aIncludeUnspecified, 
bool aIncludeDNP,
 
 1260                                         bool aExport3DFiles, 
bool aUseRelativePaths,
 
 1261                                         const wxString& a3D_Subdir,
 
 1262                                         double aXRef, 
double aYRef )
 
 1264    if( aProject == 
nullptr )
 
 1267            *aMessages = 
_( 
"No project when exporting the VRML file");
 
 1275    wxFileName subdir( a3D_Subdir, wxT( 
"" ) );
 
 1277    m_Subdir3DFpModels = subdir.GetAbsolutePath( wxFileName( aFullFileName ).GetPath() );
 
 1291        SetOffset( -aXRef / 2.54, aYRef / 2.54 );
 
 1299    bool              success  = 
true;
 
 1330    catch( 
const std::exception& e )
 
 1333            *aMessages << 
_( 
"VRML Export Failed:\n" ) << 
From_UTF8( e.what() );
 
 
 1342                                      bool aIncludeUnspecified, 
bool aIncludeDNP,
 
 1343                                      bool aExport3DFiles, 
bool aUseRelativePaths,
 
 1344                                      const wxString& a3D_Subdir,
 
 1345                                      double aXRef, 
double aYRef )
 
 1352                                       aIncludeUnspecified, aIncludeDNP,
 
 1353                                       aExport3DFiles, aUseRelativePaths,
 
 1354                                       a3D_Subdir, aXRef, aYRef );
 
 1356    if( !msgs.IsEmpty() )
 
 1357        wxMessageBox( msgs );
 
 
 1369            throw( std::runtime_error( 
"Could not create 3D model subdirectory" ) );
 
 1374    if( output_file.fail() )
 
 1376        std::ostringstream ostr;
 
 1377        ostr << 
"Could not open file '" << 
TO_UTF8( aFullFileName ) << 
"'";
 
 1378        throw( std::runtime_error( ostr.str().c_str() ) );
 
 1381    output_file.imbue( std::locale::classic() );
 
 1384    wxString fn = aFullFileName;
 
 1385    fn.Replace( wxT( 
"\\" ) , wxT( 
"/" ) );
 
 1386    output_file << 
"#VRML V2.0 utf8\n";
 
 1387    output_file << 
"WorldInfo {\n";
 
 1388    output_file << 
"  title \"" << 
TO_UTF8( fn ) << 
" - Generated by Pcbnew\"\n";
 
 1389    output_file << 
"}\n";
 
 1390    output_file << 
"Transform {\n";
 
 1391    output_file << 
"  scale " << std::setprecision( 
m_precision );
 
 1395    output_file << 
"  children [\n";
 
 1405    output_file << 
"]\n}\n";
 
 
 1412    if( colorIdx == -1 )
 
 
 1438                                           VRML_LAYER* layer, 
double top_z, 
bool aTopPlane )
 
 1440    std::vector< double > vertices;
 
 1441    std::vector< int > idxPlane;
 
 1443    if( !( *layer ).Get2DTriangles( vertices, idxPlane, top_z, aTopPlane ) )
 
 1448    if( ( idxPlane.size() % 3 ) )
 
 1450        throw( std::runtime_error( 
"[BUG] index lists are not a multiple of 3 (not a triangle " 
 1454    std::vector< SGPOINT > vlist;
 
 1455    size_t nvert = vertices.size() / 3;
 
 1458    for( 
size_t i = 0; i < nvert; ++i, j+= 3 )
 
 1459        vlist.emplace_back( vertices[j], vertices[j+1], vertices[j+2] );
 
 1468    coordIdx.
SetIndices( idxPlane.size(), &idxPlane[0] );
 
 1474        for( 
size_t i = 0; i < nvert; ++i )
 
 1479        for( 
size_t i = 0; i < nvert; ++i )
 
 1486    if( 
nullptr != modelColor )
 
 
 1497                                           VRML_LAYER* layer, 
double top_z, 
double bottom_z )
 
 1499    std::vector< double > vertices;
 
 1500    std::vector< int > idxPlane;
 
 1501    std::vector< int > idxSide;
 
 1503    if( top_z < bottom_z )
 
 1510    if( !( *layer ).Get3DTriangles( vertices, idxPlane, idxSide, top_z, bottom_z )
 
 1511            || idxPlane.empty() || idxSide.empty() )
 
 1516    if( ( idxPlane.size() % 3 ) || ( idxSide.size() % 3 ) )
 
 1518        throw( std::runtime_error( 
"[BUG] index lists are not a multiple of 3 (not a " 
 1519                                   "triangle list)" ) );
 
 1522    std::vector< SGPOINT > vlist;
 
 1523    size_t nvert = vertices.size() / 3;
 
 1526    for( 
size_t i = 0; i < nvert; ++i, j+= 3 )
 
 1527        vlist.emplace_back( vertices[j], vertices[j+1], vertices[j+2] );
 
 1536    coordIdx.
SetIndices( idxPlane.size(), &idxPlane[0] );
 
 1543    for( 
size_t i = 0; i < j; ++i )
 
 1547    for( 
size_t i = 0; i < j; ++i )
 
 1553    if( 
nullptr != modelColor )
 
 1571    std::vector< int >::iterator sI = idxSide.begin();
 
 1572    std::vector< int >::iterator eI = idxSide.end();
 
 
defines the basic data associated with a single 3D model.
 
constexpr EDA_IU_SCALE pcbIUScale
 
#define ADD_COLOR(list, r, g, b, a, name)
 
static bool g_ColorsLoaded
 
@ BS_ITEM_TYPE_SILKSCREEN
 
@ BS_ITEM_TYPE_DIELECTRIC
 
@ BS_ITEM_TYPE_SOLDERMASK
 
Manage one layer needed to make a physical board.
 
Manage layers needed to make a physical board.
 
const std::vector< BOARD_STACKUP_ITEM * > & GetList() const
 
wxString m_FinishType
The name of external copper finish.
 
Information pertinent to a Pcbnew printed circuit board.
 
VRML_COLOR & GetColor(VRML_COLOR_INDEX aIndex)
 
static CUSTOM_COLORS_LIST m_MaskColors
 
SGNODE * m_sgmaterial[VRML_COLOR_LAST]
 
static CUSTOM_COLORS_LIST m_PasteColors
 
static KIGFX::COLOR4D m_DefaultSolderPaste
 
VRML_LAYER m_top_soldermask
 
bool GetLayer3D(int layer, VRML_LAYER **vlayer)
 
bool SetScale(double aWorldScale)
 
SGNODE * getSGColor(VRML_COLOR_INDEX colorIdx)
 
void ComputeLayer3D_Zpos()
 
EXPORTER_PCB_VRML(BOARD *aBoard)
 
SHAPE_POLY_SET m_pcbOutlines
 
VRML_LAYER m_plated_holes
 
void SetLayerZ(int aLayer, double aValue)
 
void ExportVrmlPolygonSet(VRML_LAYER *aVlayer, const SHAPE_POLY_SET &aOutlines)
 
void create_vrml_shell(IFSG_TRANSFORM &PcbOutput, VRML_COLOR_INDEX colorID, VRML_LAYER *layer, double top_z, double bottom_z)
 
void write_triangle_bag(std::ostream &aOut_file, const VRML_COLOR &aColor, VRML_LAYER *aLayer, bool aPlane, bool aTop, double aTop_z, double aBottom_z)
 
bool m_includeUnspecified
 
void initStaticColorList()
 
std::list< SGNODE * > m_components
 
static KIGFX::COLOR4D m_DefaultSilkscreen
 
static CUSTOM_COLORS_LIST m_SilkscreenColors
 
void SetOffset(double aXoff, double aYoff)
 
double GetLayerZ(int aLayer)
 
bool ExportVRML_File(PROJECT *aProject, wxString *aMessages, const wxString &aFullFileName, double aMMtoWRMLunit, bool aIncludeUnspecified, bool aIncludeDNP, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
Export a VRML file image of the board.
 
void ExportVrmlPadHole(PAD *aPad)
 
static CUSTOM_COLORS_LIST m_BoardColors
 
void create_vrml_plane(IFSG_TRANSFORM &PcbOutput, VRML_COLOR_INDEX colorID, VRML_LAYER *layer, double aHeight, bool aTopPlane)
 
bool m_UseInlineModelsInBrdfile
 
wxString m_Subdir3DFpModels
 
static KIGFX::COLOR4D m_DefaultBoardBody
 
static CUSTOM_COLORS_LIST m_FinishColors
 
static KIGFX::COLOR4D m_DefaultSolderMask
 
bool m_UseRelPathIn3DModelFilename
 
void ExportVrmlFootprint(FOOTPRINT *aFootprint, std::ostream *aOutputFile)
 
void ExportFp3DModelsAsLinkedFile(const wxString &aFullFileName)
 
VRML_LAYER m_bot_soldermask
 
VRML_COLOR vrml_colors_list[VRML_COLOR_LAST]
 
void ExportVrmlSolderMask()
 
void writeLayers(const char *aFileName, OSTREAM *aOutputFile)
 
void ExportStandardLayers()
 
static KIGFX::COLOR4D m_DefaultSurfaceFinish
 
double m_BoardToVrmlScale
 
IFSG_TRANSFORM m_OutputPCB
 
void ExportVrmlViaHoles()
 
S3D_CACHE * m_Cache3Dmodels
 
Wrapper to expose an API for writing VRML files, without exposing all the many structures used in the...
 
EXPORTER_VRML(BOARD *aBoard)
 
EXPORTER_PCB_VRML * pcb_exporter
 
bool ExportVRML_File(PROJECT *aProject, wxString *aMessages, const wxString &aFullFileName, double aMMtoWRMLunit, bool aIncludeUnspecified, bool aIncludeDNP, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
Exports the board and its footprint shapes 3D (vrml files only) as a vrml file.
 
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...
 
bool SetDiffuse(float aRVal, float aGVal, float aBVal)
 
bool SetSpecular(float aRVal, float aGVal, float aBVal)
 
bool SetShininess(float aShininess) noexcept
 
bool SetAmbient(float aRVal, float aGVal, float aBVal)
 
bool SetTransparency(float aTransparency) noexcept
 
The wrapper for SGCOORDINDEX.
 
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
 
The wrapper for SGCOORDS.
 
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
 
bool SetCoordsList(size_t aListSize, const SGPOINT *aCoordsList)
 
bool AddCoord(double aXValue, double aYValue, double aZValue)
 
The wrapper for the SGFACESET class.
 
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
 
bool AddIndex(int aIndex)
Add a single index to the list.
 
bool SetIndices(size_t nIndices, int *aIndexList)
Set the number of indices and creates a copy of the given index data.
 
bool SetParent(SGNODE *aParent)
Set the parent SGNODE of this object.
 
SGNODE * GetRawPtr(void) noexcept
Return the raw internal SGNODE pointer.
 
bool AddChildNode(SGNODE *aNode)
Add a node as a child owned by this node.
 
bool AddRefNode(SGNODE *aNode)
Add a reference to an existing node which is not owned by (not a child of) this node.
 
The wrapper for the SGNORMALS class.
 
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
 
bool AddNormal(double aXValue, double aYValue, double aZValue)
 
The wrapper for the SGSHAPE class.
 
bool NewNode(SGNODE *aParent) override
Create a new node to associate with this wrapper.
 
A color representation with 4 components: red, green, blue, alpha.
 
COLOR4D Brightened(double aFactor) const
Return a color that is brighter by a given factor, without modifying object.
 
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
 
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...
 
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
 
const VECTOR2I & GetDrillSize() const
 
PAD_ATTRIB GetAttribute() const
 
VECTOR2I GetPosition() const override
 
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
 
PAD_DRILL_SHAPE GetDrillShape() const
 
bool ExportVRML_File(const wxString &aFullFileName, double aMMtoWRMLunit, bool aIncludeUnspecified, bool aIncludeDNP, bool aExport3DFiles, bool aUseRelativePaths, const wxString &a3D_Subdir, double aXRef, double aYRef)
Create the file(s) exporting current BOARD to a VRML file.
 
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
 
static S3D_CACHE * Get3DCacheManager(PROJECT *aProject, bool updateProjDir=false)
Return a pointer to an instance of the 3D cache manager.
 
Container for project specific data.
 
The base class of all Scene Graph nodes.
 
void SetVector(double aXVal, double aYVal, double aZVal)
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
int PointCount() const
Return the number of points (vertices) in this line chain.
 
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
 
Represent a set of closed polygons.
 
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
 
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
 
void BooleanIntersection(const SHAPE_POLY_SET &b)
Perform boolean polyset intersection.
 
int OutlineCount() const
Return the number of outlines in the set.
 
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
 
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
 
std::vector< CUSTOM_COLOR_ITEM > CUSTOM_COLORS_LIST
 
static constexpr EDA_ANGLE FULL_CIRCLE
 
static void build_quat(double x, double y, double z, double a, double q[4])
 
static void compose_quat(double q1[4], double q2[4], double qr[4])
 
static void from_quat(double q[4], double rot[4])
 
#define ERR_APPROX_MAX_MM
 
@ VRML_COLOR_TOP_SOLDMASK
 
@ VRML_COLOR_BOT_SOLDMASK
 
a few functions useful in geometry calculations.
 
int GetArcToSegmentCount(int aRadius, int aErrorMax, const EDA_ANGLE &aArcAngle)
 
collects header files for all SG* wrappers and the API
 
PCB_LAYER_ID
A quick note on layer IDs:
 
This file contains miscellaneous commonly used macros and functions.
 
SGLIB_API bool WriteVRML(const char *filename, bool overwrite, SGNODE *aTopNode, bool reuse, bool renameNodes)
Write out the given node and its subnodes to a VRML2 file.
 
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
 
SGLIB_API SGVECTOR CalcTriNorm(const SGPOINT &p1, const SGPOINT &p2, const SGPOINT &p3)
Return the normal vector of a triangle described by vertices p1, p2, p3.
 
SGLIB_API void DestroyNode(SGNODE *aNode) noexcept
Delete the given SG* class node.
 
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
 
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
 
#define OPEN_OSTREAM(var, name)
 
#define CLOSE_STREAM(var)
 
wxString From_UTF8(const char *cstring)
 
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
 
A class to handle a custom color (predefined color) for the color picker dialog.
 
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
 
double DEG2RAD(double deg)
 
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)