diff --git a/common/jobs/job_export_pcb_3d.cpp b/common/jobs/job_export_pcb_3d.cpp index 758274ee61..90ff04c93f 100644 --- a/common/jobs/job_export_pcb_3d.cpp +++ b/common/jobs/job_export_pcb_3d.cpp @@ -41,8 +41,11 @@ JOB_EXPORT_PCB_3D::JOB_EXPORT_PCB_3D( bool aIsCli ) : m_exportBoardBody( true ), m_exportComponents( true ), m_exportTracks( false ), + m_exportPads( false ), m_exportZones( false ), m_exportInnerCopper( false ), + m_exportSilkscreen( false ), + m_exportSoldermask( false ), m_fuseShapes( false ), m_format( JOB_EXPORT_PCB_3D::FORMAT::UNKNOWN ), m_vrmlUnits( JOB_EXPORT_PCB_3D::VRML_UNITS::METERS ), diff --git a/common/jobs/job_export_pcb_3d.h b/common/jobs/job_export_pcb_3d.h index ca7c28e512..9679809c83 100644 --- a/common/jobs/job_export_pcb_3d.h +++ b/common/jobs/job_export_pcb_3d.h @@ -66,8 +66,11 @@ public: bool m_exportBoardBody; bool m_exportComponents; bool m_exportTracks; + bool m_exportPads; bool m_exportZones; bool m_exportInnerCopper; + bool m_exportSilkscreen; + bool m_exportSoldermask; bool m_fuseShapes; JOB_EXPORT_PCB_3D::FORMAT m_format; diff --git a/kicad/cli/command_pcb_export_3d.cpp b/kicad/cli/command_pcb_export_3d.cpp index 8d9861b843..a299299c2e 100644 --- a/kicad/cli/command_pcb_export_3d.cpp +++ b/kicad/cli/command_pcb_export_3d.cpp @@ -41,8 +41,11 @@ #define ARG_NO_BOARD_BODY "--no-board-body" #define ARG_NO_COMPONENTS "--no-components" #define ARG_INCLUDE_TRACKS "--include-tracks" +#define ARG_INCLUDE_PADS "--include-pads" #define ARG_INCLUDE_ZONES "--include-zones" #define ARG_INCLUDE_INNER_COPPER "--include-inner-copper" +#define ARG_INCLUDE_SILKSCREEN "--include-silkscreen" +#define ARG_INCLUDE_SOLDERMASK "--include-soldermask" #define ARG_FUSE_SHAPES "--fuse-shapes" #define ARG_NO_OPTIMIZE_STEP "--no-optimize-step" #define ARG_NET_FILTER "--net-filter" @@ -118,7 +121,11 @@ CLI::PCB_EXPORT_3D_COMMAND::PCB_EXPORT_3D_COMMAND( const std::string& aNa .flag(); m_argParser.add_argument( ARG_INCLUDE_TRACKS ) - .help( UTF8STDSTR( _( "Export tracks" ) ) ) + .help( UTF8STDSTR( _( "Export tracks and vias" ) ) ) + .flag(); + + m_argParser.add_argument( ARG_INCLUDE_PADS ) + .help( UTF8STDSTR( _( "Export pads" ) ) ) .flag(); m_argParser.add_argument( ARG_INCLUDE_ZONES ) @@ -129,6 +136,14 @@ CLI::PCB_EXPORT_3D_COMMAND::PCB_EXPORT_3D_COMMAND( const std::string& aNa .help( UTF8STDSTR( _( "Export elements on inner copper layers" ) ) ) .flag(); + m_argParser.add_argument( ARG_INCLUDE_SILKSCREEN ) + .help( UTF8STDSTR( _( "Export silkscreen graphics as a set of flat faces" ) ) ) + .flag(); + + m_argParser.add_argument( ARG_INCLUDE_SOLDERMASK ) + .help( UTF8STDSTR( _( "Export soldermask layers as a set of flat faces" ) ) ) + .flag(); + m_argParser.add_argument( ARG_FUSE_SHAPES ) .help( UTF8STDSTR( _( "Fuse overlapping geometry together" ) ) ) .flag(); @@ -192,8 +207,11 @@ int CLI::PCB_EXPORT_3D_COMMAND::doPerform( KIWAY& aKiway ) step->m_exportBoardBody = !m_argParser.get<bool>( ARG_NO_BOARD_BODY ); step->m_exportComponents = !m_argParser.get<bool>( ARG_NO_COMPONENTS ); step->m_exportTracks = m_argParser.get<bool>( ARG_INCLUDE_TRACKS ); + step->m_exportPads = m_argParser.get<bool>( ARG_INCLUDE_PADS ); step->m_exportZones = m_argParser.get<bool>( ARG_INCLUDE_ZONES ); step->m_exportInnerCopper = m_argParser.get<bool>( ARG_INCLUDE_INNER_COPPER ); + step->m_exportSilkscreen = m_argParser.get<bool>( ARG_INCLUDE_SILKSCREEN ); + step->m_exportSoldermask = m_argParser.get<bool>( ARG_INCLUDE_SOLDERMASK ); step->m_fuseShapes = m_argParser.get<bool>( ARG_FUSE_SHAPES ); step->m_boardOnly = m_argParser.get<bool>( ARG_BOARD_ONLY ); step->m_netFilter = From_UTF8( m_argParser.get<std::string>( ARG_NET_FILTER ).c_str() ); diff --git a/pcbnew/dialogs/dialog_export_step.cpp b/pcbnew/dialogs/dialog_export_step.cpp index c341de39da..3dcbc3de78 100644 --- a/pcbnew/dialogs/dialog_export_step.cpp +++ b/pcbnew/dialogs/dialog_export_step.cpp @@ -47,9 +47,24 @@ #include <widgets/text_ctrl_eval.h> #include <wildcards_and_files_ext.h> #include <filename_resolver.h> +#include <core/map_helpers.h> #include <settings/settings_manager.h> +// Maps m_choiceFormat selection to extension (and kicad-cli command) +static const std::vector<wxString> c_formatCommand = { FILEEXT::StepFileExtension, + FILEEXT::GltfBinaryFileExtension, + FILEEXT::XaoFileExtension, + FILEEXT::BrepFileExtension }; + +// Maps file extensions to m_choiceFormat selection +static const std::map<wxString, int> c_formatExtToChoice = { { FILEEXT::StepFileExtension, 0 }, + { FILEEXT::StepFileAbrvExtension, 0 }, + { FILEEXT::GltfBinaryFileExtension, 1 }, + { FILEEXT::XaoFileExtension, 2 }, + { FILEEXT::BrepFileExtension, 3 } }; + + class DIALOG_EXPORT_STEP : public DIALOG_EXPORT_STEP_BASE { public: @@ -71,6 +86,7 @@ protected: void onUpdateXPos( wxUpdateUIEvent& aEvent ) override; void onUpdateYPos( wxUpdateUIEvent& aEvent ) override; void onExportButton( wxCommandEvent& aEvent ) override; + void onFormatChoice( wxCommandEvent& event ) override; int GetOrgUnitsChoice() const { @@ -118,25 +134,33 @@ private: bool m_noUnspecified; // remember last preference for No Unspecified Component bool m_noDNP; // remember last preference for No DNP Component static bool m_optimizeStep; // remember last preference for Optimize STEP file (stored only for the session) - static bool m_exportBoardBody; // remember last preference to export board body (stored only for the session) + static bool m_exportBoardBody; // remember last preference to export board body (stored only for the session) static bool m_exportComponents; // remember last preference to export components (stored only for the session) - static bool m_exportTracks; // remember last preference to export tracks (stored only for the session) + static bool m_exportTracks; // remember last preference to export tracks and vias (stored only for the session) + static bool m_exportPads; // remember last preference to export pads (stored only for the session) static bool m_exportZones; // remember last preference to export zones (stored only for the session) - static bool m_fuseShapes; // remember last preference to fuse shapes (stored only for the session) static bool m_exportInnerCopper; // remember last preference to export inner layers (stored only for the session) + static bool m_exportSilkscreen; // remember last preference to export silkscreen (stored only for the session) + static bool m_exportSoldermask; // remember last preference to export soldermask (stored only for the session) + static bool m_fuseShapes; // remember last preference to fuse shapes (stored only for the session) wxString m_netFilter; // filter copper nets wxString m_boardPath; // path to the exported board file static int m_toleranceLastChoice; // Store m_tolerance option during a session + static int m_formatLastChoice; // Store format option during a session }; int DIALOG_EXPORT_STEP::m_toleranceLastChoice = -1; // Use default +int DIALOG_EXPORT_STEP::m_formatLastChoice = -1; // Use default bool DIALOG_EXPORT_STEP::m_optimizeStep = true; bool DIALOG_EXPORT_STEP::m_exportBoardBody = true; bool DIALOG_EXPORT_STEP::m_exportComponents = true; bool DIALOG_EXPORT_STEP::m_exportTracks = false; +bool DIALOG_EXPORT_STEP::m_exportPads = false; bool DIALOG_EXPORT_STEP::m_exportZones = false; bool DIALOG_EXPORT_STEP::m_exportInnerCopper = false; +bool DIALOG_EXPORT_STEP::m_exportSilkscreen = false; +bool DIALOG_EXPORT_STEP::m_exportSoldermask = false; bool DIALOG_EXPORT_STEP::m_fuseShapes = false; DIALOG_EXPORT_STEP::DIALOG_EXPORT_STEP( PCB_EDIT_FRAME* aParent, const wxString& aBoardPath ) : @@ -192,8 +216,11 @@ DIALOG_EXPORT_STEP::DIALOG_EXPORT_STEP( PCB_EDIT_FRAME* aParent, const wxString& m_cbExportBody->SetValue( m_exportBoardBody ); m_cbExportComponents->SetValue( m_exportComponents ); m_cbExportTracks->SetValue( m_exportTracks ); + m_cbExportPads->SetValue( m_exportPads ); m_cbExportZones->SetValue( m_exportZones ); m_cbExportInnerCopper->SetValue( m_exportInnerCopper ); + m_cbExportSilkscreen->SetValue( m_exportSilkscreen ); + m_cbExportSoldermask->SetValue( m_exportSoldermask ); m_cbFuseShapes->SetValue( m_fuseShapes ); m_cbRemoveUnspecified->SetValue( m_noUnspecified ); m_cbRemoveDNP->SetValue( m_noDNP ); @@ -247,6 +274,9 @@ DIALOG_EXPORT_STEP::DIALOG_EXPORT_STEP( PCB_EDIT_FRAME* aParent, const wxString& if( m_toleranceLastChoice >= 0 ) m_choiceTolerance->SetSelection( m_toleranceLastChoice ); + if( m_formatLastChoice >= 0 ) + m_choiceFormat->SetSelection( m_formatLastChoice ); + // Now all widgets have the size fixed, call FinishDialogSettings finishDialogSettings(); } @@ -288,12 +318,16 @@ DIALOG_EXPORT_STEP::~DIALOG_EXPORT_STEP() m_netFilter = m_txtNetFilter->GetValue(); m_toleranceLastChoice = m_choiceTolerance->GetSelection(); + m_formatLastChoice = m_choiceFormat->GetSelection(); m_optimizeStep = m_cbOptimizeStep->GetValue(); m_exportBoardBody = m_cbExportBody->GetValue(); m_exportComponents = m_cbExportComponents->GetValue(); m_exportTracks = m_cbExportTracks->GetValue(); + m_exportPads = m_cbExportPads->GetValue(); m_exportZones = m_cbExportZones->GetValue(); m_exportInnerCopper = m_cbExportInnerCopper->GetValue(); + m_exportSilkscreen = m_cbExportSilkscreen->GetValue(); + m_exportSoldermask = m_cbExportSoldermask->GetValue(); m_fuseShapes = m_cbFuseShapes->GetValue(); } @@ -374,22 +408,51 @@ void DIALOG_EXPORT_STEP::onUpdateYPos( wxUpdateUIEvent& aEvent ) void DIALOG_EXPORT_STEP::onBrowseClicked( wxCommandEvent& aEvent ) { + // clang-format off wxString filter = _( "STEP files" ) + AddFileExtListToFilter( { FILEEXT::StepFileExtension, FILEEXT::StepFileAbrvExtension } ) + "|" + _( "Binary glTF files" ) - + AddFileExtListToFilter( { FILEEXT::GltfBinaryFileExtension } ); + + AddFileExtListToFilter( { FILEEXT::GltfBinaryFileExtension } ) + "|" + + _( "XAO files" ) + + AddFileExtListToFilter( { FILEEXT::XaoFileExtension} ) + "|" + + _( "BREP (OCCT) files" ) + + AddFileExtListToFilter( { FILEEXT::BrepFileExtension } ); + // clang-format on // Build the absolute path of current output directory to preselect it in the file browser. wxString path = ExpandEnvVarSubstitutions( m_outputFileName->GetValue(), &Prj() ); wxFileName fn( Prj().AbsolutePath( path ) ); - wxFileDialog dlg( this, _( "STEP Output File" ), fn.GetPath(), fn.GetFullName(), filter, + wxFileDialog dlg( this, _( "3D Model Output File" ), fn.GetPath(), fn.GetFullName(), filter, wxFD_SAVE ); if( dlg.ShowModal() == wxID_CANCEL ) return; - m_outputFileName->SetValue( dlg.GetPath() ); + path = dlg.GetPath(); + m_outputFileName->SetValue( path ); + + fn = wxFileName( path ); + + if( auto formatChoice = get_opt( c_formatExtToChoice, fn.GetExt().Lower() ) ) + m_choiceFormat->SetSelection( *formatChoice ); +} + + +void DIALOG_EXPORT_STEP::onFormatChoice( wxCommandEvent& event ) +{ + wxString newExt = c_formatCommand[m_choiceFormat->GetSelection()]; + wxString path = m_outputFileName->GetValue(); + + int sepIdx = std::max( path.Find( '/', true ), path.Find( '\\', true ) ); + int dotIdx = path.Find( '.', true ); + + if( dotIdx == -1 || dotIdx < sepIdx ) + path << '.' << newExt; + else + path = path.Mid( 0, dotIdx ) << '.' << newExt; + + m_outputFileName->SetValue( path ); } @@ -419,12 +482,16 @@ void DIALOG_EXPORT_STEP::onExportButton( wxCommandEvent& aEvent ) double tolerance; // default value in mm m_toleranceLastChoice = m_choiceTolerance->GetSelection(); + m_formatLastChoice = m_choiceFormat->GetSelection(); m_optimizeStep = m_cbOptimizeStep->GetValue(); m_exportBoardBody = m_cbExportBody->GetValue(); m_exportComponents = m_cbExportComponents->GetValue(); m_exportTracks = m_cbExportTracks->GetValue(); + m_exportPads = m_cbExportPads->GetValue(); m_exportZones = m_cbExportZones->GetValue(); m_exportInnerCopper = m_cbExportInnerCopper->GetValue(); + m_exportSilkscreen = m_cbExportSilkscreen->GetValue(); + m_exportSoldermask = m_cbExportSoldermask->GetValue(); m_fuseShapes = m_cbFuseShapes->GetValue(); switch( m_choiceTolerance->GetSelection() ) @@ -494,14 +561,8 @@ void DIALOG_EXPORT_STEP::onExportButton( wxCommandEvent& aEvent ) cmdK2S.Append( wxT( " pcb" ) ); cmdK2S.Append( wxT( " export" ) ); - if( fn.GetExt() == FILEEXT::GltfBinaryFileExtension ) - cmdK2S.Append( wxT( " glb" ) ); - else if( fn.GetExt() == FILEEXT::BrepFileExtension ) - cmdK2S.Append( wxT( " brep" ) ); - else if( fn.GetExt() == FILEEXT::XaoFileExtension ) - cmdK2S.Append( wxT( " xao" ) ); - else - cmdK2S.Append( wxT( " step" ) ); + cmdK2S.Append( wxT( " " ) ); + cmdK2S.Append( c_formatCommand[m_choiceFormat->GetSelection()] ); if( GetNoUnspecifiedOption() ) cmdK2S.Append( wxT( " --no-unspecified" ) ); @@ -524,12 +585,21 @@ void DIALOG_EXPORT_STEP::onExportButton( wxCommandEvent& aEvent ) if( m_exportTracks ) cmdK2S.Append( wxT( " --include-tracks" ) ); + if( m_exportPads ) + cmdK2S.Append( wxT( " --include-pads" ) ); + if( m_exportZones ) cmdK2S.Append( wxT( " --include-zones" ) ); if( m_exportInnerCopper ) cmdK2S.Append( wxT( " --include-inner-copper" ) ); + if( m_exportSilkscreen ) + cmdK2S.Append( wxT( " --include-silkscreen" ) ); + + if( m_exportSoldermask ) + cmdK2S.Append( wxT( " --include-soldermask" ) ); + if( m_fuseShapes ) cmdK2S.Append( wxT( " --fuse-shapes" ) ); @@ -607,5 +677,4 @@ void DIALOG_EXPORT_STEP::onExportButton( wxCommandEvent& aEvent ) DIALOG_EXPORT_STEP_LOG* log = new DIALOG_EXPORT_STEP_LOG( this, cmdK2S ); log->ShowModal(); - Close(); } diff --git a/pcbnew/dialogs/dialog_export_step_base.cpp b/pcbnew/dialogs/dialog_export_step_base.cpp index b54bc30e5d..edf5d00f2b 100644 --- a/pcbnew/dialogs/dialog_export_step_base.cpp +++ b/pcbnew/dialogs/dialog_export_step_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf) +// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -20,13 +20,23 @@ DIALOG_EXPORT_STEP_BASE::DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID i bSizerTop = new wxBoxSizer( wxHORIZONTAL ); + m_txtFormat = new wxStaticText( this, wxID_ANY, _("Format:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_txtFormat->Wrap( -1 ); + bSizerTop->Add( m_txtFormat, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxString m_choiceFormatChoices[] = { _("STEP"), _("GLB (Binary glTF)"), _("XAO"), _("BREP (OCCT)") }; + int m_choiceFormatNChoices = sizeof( m_choiceFormatChoices ) / sizeof( wxString ); + m_choiceFormat = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceFormatNChoices, m_choiceFormatChoices, 0 ); + m_choiceFormat->SetSelection( 0 ); + bSizerTop->Add( m_choiceFormat, 0, wxALL, 5 ); + m_txtBrdFile = new wxStaticText( this, wxID_ANY, _("File:"), wxDefaultPosition, wxDefaultSize, 0 ); m_txtBrdFile->Wrap( -1 ); bSizerTop->Add( m_txtBrdFile, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); m_outputFileName = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_outputFileName->SetToolTip( _("Enter a filename if you do not want to use default file names\nCan be used only when printing the current sheet") ); - m_outputFileName->SetMinSize( wxSize( 450,-1 ) ); + m_outputFileName->SetMinSize( wxSize( 400,-1 ) ); bSizerTop->Add( m_outputFileName, 1, wxALIGN_CENTER_VERTICAL, 5 ); @@ -34,28 +44,107 @@ DIALOG_EXPORT_STEP_BASE::DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID i bSizerTop->Add( m_browseButton, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizerSTEPFile->Add( bSizerTop, 0, wxEXPAND|wxALL, 10 ); + bSizerSTEPFile->Add( bSizerTop, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 6 ); - wxBoxSizer* bSizer2; - bSizer2 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizerMain; + bSizerMain = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* sbGeneralOptions; + sbGeneralOptions = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("General Options") ), wxVERTICAL ); + + m_cbExportCompound_hidden = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export as Compound shape"), wxDefaultPosition, wxDefaultSize, 0 ); + m_cbExportCompound_hidden->Hide(); + m_cbExportCompound_hidden->SetToolTip( _("Merges all shapes into a single Compound shape. Useful for external software that does de-duplication based on shape names.") ); + + sbGeneralOptions->Add( m_cbExportCompound_hidden, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_cbExportBody = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export board body"), wxDefaultPosition, wxDefaultSize, 0 ); + sbGeneralOptions->Add( m_cbExportBody, 0, wxALL, 5 ); + + m_cbExportComponents = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export components"), wxDefaultPosition, wxDefaultSize, 0 ); + sbGeneralOptions->Add( m_cbExportComponents, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_cbExportTracks = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export tracks and vias"), wxDefaultPosition, wxDefaultSize, 0 ); + m_cbExportTracks->SetToolTip( _("Export tracks and vias on external copper layers.") ); + + sbGeneralOptions->Add( m_cbExportTracks, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_cbExportPads = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export pads"), wxDefaultPosition, wxDefaultSize, 0 ); + sbGeneralOptions->Add( m_cbExportPads, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_cbExportZones = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export zones"), wxDefaultPosition, wxDefaultSize, 0 ); + m_cbExportZones->SetToolTip( _("Export zones on external copper layers.") ); + + sbGeneralOptions->Add( m_cbExportZones, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_cbExportInnerCopper = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export inner copper layers"), wxDefaultPosition, wxDefaultSize, 0 ); + sbGeneralOptions->Add( m_cbExportInnerCopper, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_cbExportSilkscreen = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export silkscreen"), wxDefaultPosition, wxDefaultSize, 0 ); + m_cbExportSilkscreen->SetToolTip( _("Export silkscreen graphics as a set of flat faces.") ); + + sbGeneralOptions->Add( m_cbExportSilkscreen, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_cbExportSoldermask = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export solder mask"), wxDefaultPosition, wxDefaultSize, 0 ); + m_cbExportSoldermask->SetToolTip( _("Export solder mask layers as a set of flat faces.") ); + + sbGeneralOptions->Add( m_cbExportSoldermask, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_cbFuseShapes = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Fuse shapes (time consuming)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_cbFuseShapes->SetToolTip( _("Combine intersecting geometry into one shape.") ); + + sbGeneralOptions->Add( m_cbFuseShapes, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_cbExportSolderpaste_hidden = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export solder paste"), wxDefaultPosition, wxDefaultSize, 0 ); + m_cbExportSolderpaste_hidden->Hide(); + m_cbExportSolderpaste_hidden->SetToolTip( _("Export solder paste graphics.") ); + + sbGeneralOptions->Add( m_cbExportSolderpaste_hidden, 0, wxBOTTOM|wxRIGHT, 5 ); + + m_staticTextNetFilter = new wxStaticText( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Net filter (supports wildcards):"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextNetFilter->Wrap( -1 ); + sbGeneralOptions->Add( m_staticTextNetFilter, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); + + m_txtNetFilter = new wxTextCtrl( sbGeneralOptions->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_txtNetFilter->SetToolTip( _("Only copper items belonging to nets matching this filter will be exported.") ); + + sbGeneralOptions->Add( m_txtNetFilter, 0, wxALL|wxEXPAND, 5 ); + + m_staticTextTolerance = new wxStaticText( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Board outline chaining tolerance:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTolerance->Wrap( -1 ); + sbGeneralOptions->Add( m_staticTextTolerance, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); + + wxString m_choiceToleranceChoices[] = { _("Tight (0.001 mm)"), _("Standard (0.01 mm)"), _("Loose (0.1 mm)") }; + int m_choiceToleranceNChoices = sizeof( m_choiceToleranceChoices ) / sizeof( wxString ); + m_choiceTolerance = new wxChoice( sbGeneralOptions->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceToleranceNChoices, m_choiceToleranceChoices, 0 ); + m_choiceTolerance->SetSelection( 1 ); + m_choiceTolerance->SetToolTip( _("Tolerance sets the distance between two points that are considered joined when building the board outlines.") ); + + sbGeneralOptions->Add( m_choiceTolerance, 0, wxALL|wxEXPAND, 5 ); + + + bSizerMain->Add( sbGeneralOptions, 1, wxEXPAND|wxALL, 5 ); + + wxBoxSizer* bSizer5; + bSizer5 = new wxBoxSizer( wxVERTICAL ); wxStaticBoxSizer* sbCoordinates; sbCoordinates = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Coordinates") ), wxVERTICAL ); m_rbDrillAndPlotOrigin = new wxRadioButton( sbCoordinates->GetStaticBox(), wxID_ANY, _("Drill/place file origin"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); - sbCoordinates->Add( m_rbDrillAndPlotOrigin, 0, wxBOTTOM|wxRIGHT, 5 ); + sbCoordinates->Add( m_rbDrillAndPlotOrigin, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_rbGridOrigin = new wxRadioButton( sbCoordinates->GetStaticBox(), wxID_ANY, _("Grid origin"), wxDefaultPosition, wxDefaultSize, 0 ); - sbCoordinates->Add( m_rbGridOrigin, 0, wxBOTTOM|wxRIGHT, 5 ); + sbCoordinates->Add( m_rbGridOrigin, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_rbUserDefinedOrigin = new wxRadioButton( sbCoordinates->GetStaticBox(), wxID_ANY, _("User defined origin"), wxDefaultPosition, wxDefaultSize, 0 ); - sbCoordinates->Add( m_rbUserDefinedOrigin, 0, wxBOTTOM|wxRIGHT, 5 ); + sbCoordinates->Add( m_rbUserDefinedOrigin, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_rbBoardCenterOrigin = new wxRadioButton( sbCoordinates->GetStaticBox(), wxID_ANY, _("Board center origin"), wxDefaultPosition, wxDefaultSize, 0 ); - sbCoordinates->Add( m_rbBoardCenterOrigin, 0, wxBOTTOM|wxRIGHT, 5 ); + sbCoordinates->Add( m_rbBoardCenterOrigin, 0, wxALL, 5 ); - bSizer2->Add( sbCoordinates, 0, wxEXPAND|wxRIGHT|wxLEFT, 10 ); + bSizer5->Add( sbCoordinates, 0, wxEXPAND|wxALL, 5 ); wxStaticBoxSizer* sbUserDefinedOrigin; sbUserDefinedOrigin = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("User Defined Origin") ), wxVERTICAL ); @@ -106,10 +195,10 @@ DIALOG_EXPORT_STEP_BASE::DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID i fgSizer1->Add( m_STEP_Yorg, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - sbUserDefinedOrigin->Add( fgSizer1, 1, wxEXPAND, 5 ); + sbUserDefinedOrigin->Add( fgSizer1, 1, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - bSizer2->Add( sbUserDefinedOrigin, 0, wxEXPAND|wxRIGHT|wxLEFT, 10 ); + bSizer5->Add( sbUserDefinedOrigin, 0, wxEXPAND|wxALL, 5 ); wxStaticBoxSizer* sbOtherOptions; sbOtherOptions = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Other Options") ), wxVERTICAL ); @@ -117,114 +206,34 @@ DIALOG_EXPORT_STEP_BASE::DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID i m_cbRemoveDNP = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Ignore 'Do not populate' components"), wxDefaultPosition, wxDefaultSize, 0 ); m_cbRemoveDNP->SetToolTip( _("Do not show components marked 'Do not populate'") ); - sbOtherOptions->Add( m_cbRemoveDNP, 0, wxBOTTOM|wxRIGHT, 5 ); + sbOtherOptions->Add( m_cbRemoveDNP, 0, wxALL, 5 ); m_cbRemoveUnspecified = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Ignore 'Unspecified' components"), wxDefaultPosition, wxDefaultSize, 0 ); m_cbRemoveUnspecified->SetToolTip( _("Do not show components with Footprint Type 'Unspecified'") ); - sbOtherOptions->Add( m_cbRemoveUnspecified, 0, wxBOTTOM|wxRIGHT, 5 ); + sbOtherOptions->Add( m_cbRemoveUnspecified, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_cbSubstModels = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Substitute similarly named models"), wxDefaultPosition, wxDefaultSize, 0 ); m_cbSubstModels->SetToolTip( _("Replace VRML models with STEP models of the same name") ); - sbOtherOptions->Add( m_cbSubstModels, 0, wxBOTTOM|wxRIGHT, 5 ); + sbOtherOptions->Add( m_cbSubstModels, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_cbOverwriteFile = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Overwrite old file"), wxDefaultPosition, wxDefaultSize, 0 ); - sbOtherOptions->Add( m_cbOverwriteFile, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_staticline11_hidden = new wxStaticLine( sbOtherOptions->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - m_staticline11_hidden->Hide(); - - sbOtherOptions->Add( m_staticline11_hidden, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + sbOtherOptions->Add( m_cbOverwriteFile, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_cbOptimizeStep = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Optimize STEP file"), wxDefaultPosition, wxDefaultSize, 0 ); m_cbOptimizeStep->SetToolTip( _("Disables writing parametric curves. Optimizes file size and write/read times, but may reduce compatibility with other software.") ); - sbOtherOptions->Add( m_cbOptimizeStep, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_cbExportCompound_hidden = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Export as Compound shape"), wxDefaultPosition, wxDefaultSize, 0 ); - m_cbExportCompound_hidden->Hide(); - m_cbExportCompound_hidden->SetToolTip( _("Merges all shapes into a single Compound shape. Useful for external software that does de-duplication based on shape names.") ); - - sbOtherOptions->Add( m_cbExportCompound_hidden, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_staticline1 = new wxStaticLine( sbOtherOptions->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - sbOtherOptions->Add( m_staticline1, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - m_cbExportBody = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Export board body"), wxDefaultPosition, wxDefaultSize, 0 ); - sbOtherOptions->Add( m_cbExportBody, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_cbExportComponents = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Export components"), wxDefaultPosition, wxDefaultSize, 0 ); - sbOtherOptions->Add( m_cbExportComponents, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_cbExportTracks = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Export tracks, pads and vias"), wxDefaultPosition, wxDefaultSize, 0 ); - m_cbExportTracks->SetToolTip( _("Export tracks, pads and vias on external copper layers.") ); - - sbOtherOptions->Add( m_cbExportTracks, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_cbExportZones = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Export zones"), wxDefaultPosition, wxDefaultSize, 0 ); - m_cbExportZones->SetToolTip( _("Export zones on external copper layers.") ); - - sbOtherOptions->Add( m_cbExportZones, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_cbExportInnerCopper = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Export inner copper layers"), wxDefaultPosition, wxDefaultSize, 0 ); - sbOtherOptions->Add( m_cbExportInnerCopper, 0, wxBOTTOM|wxEXPAND|wxRIGHT, 5 ); - - m_cbFuseShapes = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Fuse shapes (time consuming)"), wxDefaultPosition, wxDefaultSize, 0 ); - m_cbFuseShapes->SetToolTip( _("Combine intersecting geometry into one shape.") ); - - sbOtherOptions->Add( m_cbFuseShapes, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_cbExportSilkscreen_hidden = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Export silkscreen"), wxDefaultPosition, wxDefaultSize, 0 ); - m_cbExportSilkscreen_hidden->Hide(); - m_cbExportSilkscreen_hidden->SetToolTip( _("Export silkscreen graphics.") ); - - sbOtherOptions->Add( m_cbExportSilkscreen_hidden, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_cbExportSoldermask_hidden = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Export solder mask"), wxDefaultPosition, wxDefaultSize, 0 ); - m_cbExportSoldermask_hidden->Hide(); - m_cbExportSoldermask_hidden->SetToolTip( _("Export solder mask graphics.") ); - - sbOtherOptions->Add( m_cbExportSoldermask_hidden, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_cbExportSolderpaste_hidden = new wxCheckBox( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Export solder paste"), wxDefaultPosition, wxDefaultSize, 0 ); - m_cbExportSolderpaste_hidden->Hide(); - m_cbExportSolderpaste_hidden->SetToolTip( _("Export solder paste graphics.") ); - - sbOtherOptions->Add( m_cbExportSolderpaste_hidden, 0, wxBOTTOM|wxRIGHT, 5 ); - - m_staticTextNetFilter = new wxStaticText( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Net filter (supports wildcards):"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextNetFilter->Wrap( -1 ); - sbOtherOptions->Add( m_staticTextNetFilter, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); - - m_txtNetFilter = new wxTextCtrl( sbOtherOptions->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_txtNetFilter->SetToolTip( _("Only copper items belonging to nets matching this filter will be exported.") ); - - sbOtherOptions->Add( m_txtNetFilter, 0, wxALL|wxEXPAND, 5 ); - - m_staticTextTolerance = new wxStaticText( sbOtherOptions->GetStaticBox(), wxID_ANY, _("Board outline chaining tolerance:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTolerance->Wrap( -1 ); - sbOtherOptions->Add( m_staticTextTolerance, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); - - wxString m_choiceToleranceChoices[] = { _("Tight (0.001 mm)"), _("Standard (0.01 mm)"), _("Loose (0.1 mm)") }; - int m_choiceToleranceNChoices = sizeof( m_choiceToleranceChoices ) / sizeof( wxString ); - m_choiceTolerance = new wxChoice( sbOtherOptions->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceToleranceNChoices, m_choiceToleranceChoices, 0 ); - m_choiceTolerance->SetSelection( 1 ); - m_choiceTolerance->SetToolTip( _("Tolerance sets the distance between two points that are considered joined when building the board outlines.") ); - - sbOtherOptions->Add( m_choiceTolerance, 0, wxALL|wxEXPAND, 5 ); + sbOtherOptions->Add( m_cbOptimizeStep, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer2->Add( sbOtherOptions, 1, wxEXPAND|wxRIGHT|wxLEFT, 10 ); + bSizer5->Add( sbOtherOptions, 1, wxEXPAND|wxALL, 5 ); - bSizerSTEPFile->Add( bSizer2, 1, wxBOTTOM|wxEXPAND|wxTOP, 5 ); - - wxBoxSizer* bSizer81; - bSizer81 = new wxBoxSizer( wxHORIZONTAL ); + bSizerMain->Add( bSizer5, 1, wxEXPAND, 5 ); - bSizerSTEPFile->Add( bSizer81, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 10 ); + bSizerSTEPFile->Add( bSizerMain, 1, wxEXPAND, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizerOK = new wxButton( this, wxID_OK ); @@ -243,6 +252,7 @@ DIALOG_EXPORT_STEP_BASE::DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID i this->Centre( wxBOTH ); // Connect Events + m_choiceFormat->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::onFormatChoice ), NULL, this ); m_browseButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::onBrowseClicked ), NULL, this ); m_STEP_OrgUnitChoice->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_EXPORT_STEP_BASE::onUpdateUnits ), NULL, this ); m_STEP_Xorg->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_EXPORT_STEP_BASE::onUpdateXPos ), NULL, this ); @@ -253,6 +263,7 @@ DIALOG_EXPORT_STEP_BASE::DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID i DIALOG_EXPORT_STEP_BASE::~DIALOG_EXPORT_STEP_BASE() { // Disconnect Events + m_choiceFormat->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::onFormatChoice ), NULL, this ); m_browseButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::onBrowseClicked ), NULL, this ); m_STEP_OrgUnitChoice->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_EXPORT_STEP_BASE::onUpdateUnits ), NULL, this ); m_STEP_Xorg->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_EXPORT_STEP_BASE::onUpdateXPos ), NULL, this ); diff --git a/pcbnew/dialogs/dialog_export_step_base.fbp b/pcbnew/dialogs/dialog_export_step_base.fbp index c941e31670..283c6a708d 100644 --- a/pcbnew/dialogs/dialog_export_step_base.fbp +++ b/pcbnew/dialogs/dialog_export_step_base.fbp @@ -51,7 +51,7 @@ <property name="size">-1,-1</property> <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property> <property name="subclass">DIALOG_SHIM; dialog_shim.h</property> - <property name="title">Export STEP / BREP / XAO / GLTF</property> + <property name="title">Export 3D Model</property> <property name="tooltip"></property> <property name="two_step_creation">0</property> <property name="window_extra_style"></property> @@ -62,15 +62,143 @@ <property name="name">bSizerSTEPFile</property> <property name="orient">wxVERTICAL</property> <property name="permission">protected</property> - <object class="sizeritem" expanded="true"> - <property name="border">10</property> - <property name="flag">wxEXPAND|wxALL</property> + <object class="sizeritem" expanded="false"> + <property name="border">6</property> + <property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property> <property name="proportion">0</property> - <object class="wxBoxSizer" expanded="true"> + <object class="wxBoxSizer" expanded="false"> <property name="minimum_size"></property> <property name="name">bSizerTop</property> <property name="orient">wxHORIZONTAL</property> <property name="permission">protected</property> + <object class="sizeritem" expanded="true"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxStaticText" expanded="true"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Format:</property> + <property name="markup">0</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_txtFormat</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</property> + </object> + </object> + <object class="sizeritem" expanded="true"> + <property name="border">5</property> + <property name="flag">wxALL</property> + <property name="proportion">0</property> + <object class="wxChoice" expanded="true"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="choices">"STEP" "GLB (Binary glTF)" "XAO" "BREP (OCCT)"</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_choiceFormat</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="selection">0</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <event name="OnChoice">onFormatChoice</event> + </object> + </object> <object class="sizeritem" expanded="false"> <property name="border">5</property> <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> @@ -133,11 +261,11 @@ <property name="wrap">-1</property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> <property name="flag">wxALIGN_CENTER_VERTICAL</property> <property name="proportion">1</property> - <object class="wxTextCtrl" expanded="true"> + <object class="wxTextCtrl" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -172,7 +300,7 @@ <property name="maxlength">0</property> <property name="min_size"></property> <property name="minimize_button">0</property> - <property name="minimum_size">450,-1</property> + <property name="minimum_size">400,-1</property> <property name="moveable">1</property> <property name="name">m_outputFileName</property> <property name="pane_border">1</property> @@ -198,11 +326,11 @@ <property name="window_style"></property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property> <property name="proportion">0</property> - <object class="wxBitmapButton" expanded="true"> + <object class="wxBitmapButton" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -277,1104 +405,30 @@ </object> <object class="sizeritem" expanded="true"> <property name="border">5</property> - <property name="flag">wxBOTTOM|wxEXPAND|wxTOP</property> + <property name="flag">wxEXPAND</property> <property name="proportion">1</property> <object class="wxBoxSizer" expanded="true"> <property name="minimum_size"></property> - <property name="name">bSizer2</property> + <property name="name">bSizerMain</property> <property name="orient">wxHORIZONTAL</property> <property name="permission">none</property> - <object class="sizeritem" expanded="false"> - <property name="border">10</property> - <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property> - <property name="proportion">0</property> - <object class="wxStaticBoxSizer" expanded="false"> - <property name="id">wxID_ANY</property> - <property name="label">Coordinates</property> - <property name="minimum_size"></property> - <property name="name">sbCoordinates</property> - <property name="orient">wxVERTICAL</property> - <property name="parent">1</property> - <property name="permission">none</property> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxRadioButton" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Drill/place file origin</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_rbDrillAndPlotOrigin</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style">wxRB_GROUP</property> - <property name="subclass">; forward_declare</property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="value">0</property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxRadioButton" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Grid origin</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_rbGridOrigin</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass">; forward_declare</property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="value">0</property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxRadioButton" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">User defined origin</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_rbUserDefinedOrigin</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass">; forward_declare</property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="value">0</property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxRadioButton" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Board center origin</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_rbBoardCenterOrigin</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass">; forward_declare</property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="value">0</property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">10</property> - <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property> - <property name="proportion">0</property> - <object class="wxStaticBoxSizer" expanded="false"> - <property name="id">wxID_ANY</property> - <property name="label">User Defined Origin</property> - <property name="minimum_size"></property> - <property name="name">sbUserDefinedOrigin</property> - <property name="orient">wxVERTICAL</property> - <property name="parent">1</property> - <property name="permission">none</property> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxEXPAND</property> - <property name="proportion">1</property> - <object class="wxFlexGridSizer" expanded="false"> - <property name="cols">2</property> - <property name="flexible_direction">wxBOTH</property> - <property name="growablecols"></property> - <property name="growablerows"></property> - <property name="hgap">0</property> - <property name="minimum_size"></property> - <property name="name">fgSizer1</property> - <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property> - <property name="permission">none</property> - <property name="rows">0</property> - <property name="vgap">5</property> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> - <property name="proportion">0</property> - <object class="wxStaticText" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Units:</property> - <property name="markup">0</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_staticTextUnits</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass"></property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - <property name="wrap">-1</property> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT</property> - <property name="proportion">0</property> - <object class="wxChoice" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="choices">"mm" "inch"</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_STEP_OrgUnitChoice</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="selection">0</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass"></property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - <event name="OnUpdateUI">onUpdateUnits</event> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> - <property name="proportion">0</property> - <object class="wxStaticText" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">X position:</property> - <property name="markup">0</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_staticTextXpos</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass"></property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - <property name="wrap">-1</property> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT</property> - <property name="proportion">0</property> - <object class="wxTextCtrl" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="maxlength">8</property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_STEP_Xorg</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass">TEXT_CTRL_EVAL; widgets/text_ctrl_eval.h</property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NUMERIC</property> - <property name="validator_type">wxTextValidator</property> - <property name="validator_variable"></property> - <property name="value">0</property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - <event name="OnUpdateUI">onUpdateXPos</event> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> - <property name="proportion">0</property> - <object class="wxStaticText" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Y position:</property> - <property name="markup">0</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_staticTextYpos</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass"></property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - <property name="wrap">-1</property> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT</property> - <property name="proportion">0</property> - <object class="wxTextCtrl" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="maxlength">8</property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_STEP_Yorg</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass">TEXT_CTRL_EVAL; widgets/text_ctrl_eval.h</property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NUMERIC</property> - <property name="validator_type">wxTextValidator</property> - <property name="validator_variable"></property> - <property name="value">0</property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - <event name="OnUpdateUI">onUpdateYPos</event> - </object> - </object> - </object> - </object> - </object> - </object> <object class="sizeritem" expanded="true"> - <property name="border">10</property> - <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property> + <property name="border">5</property> + <property name="flag">wxEXPAND|wxALL</property> <property name="proportion">1</property> <object class="wxStaticBoxSizer" expanded="true"> <property name="id">wxID_ANY</property> - <property name="label">Other Options</property> + <property name="label">General Options</property> <property name="minimum_size"></property> - <property name="name">sbOtherOptions</property> + <property name="name">sbGeneralOptions</property> <property name="orient">wxVERTICAL</property> <property name="parent">1</property> <property name="permission">none</property> <object class="sizeritem" expanded="false"> <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> <property name="proportion">0</property> <object class="wxCheckBox" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="checked">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Ignore 'Do not populate' components</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_cbRemoveDNP</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass"></property> - <property name="toolbar_pane">0</property> - <property name="tooltip">Do not show components marked 'Do not populate'</property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="true"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="checked">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Ignore 'Unspecified' components</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_cbRemoveUnspecified</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass"></property> - <property name="toolbar_pane">0</property> - <property name="tooltip">Do not show components with Footprint Type 'Unspecified'</property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxCheckBox" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="checked">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Substitute similarly named models</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_cbSubstModels</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass"></property> - <property name="toolbar_pane">0</property> - <property name="tooltip">Replace VRML models with STEP models of the same name</property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxCheckBox" expanded="false"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="checked">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Overwrite old file</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_cbOverwriteFile</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass"></property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="true"> - <property name="border">5</property> - <property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property> - <property name="proportion">0</property> - <object class="wxStaticLine" expanded="true"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">1</property> - <property name="id">wxID_ANY</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_staticline11_hidden</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style">wxLI_HORIZONTAL</property> - <property name="subclass">; ; forward_declare</property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="true"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="checked">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="label">Optimize STEP file</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_cbOptimizeStep</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass"></property> - <property name="toolbar_pane">0</property> - <property name="tooltip">Disables writing parametric curves. Optimizes file size and write/read times, but may reduce compatibility with other software.</property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="true"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -1435,70 +489,11 @@ <property name="window_style"></property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> - <property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property> + <property name="flag">wxALL</property> <property name="proportion">0</property> - <object class="wxStaticLine" expanded="true"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">0</property> - <property name="id">wxID_ANY</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_staticline1</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style">wxLI_HORIZONTAL</property> - <property name="subclass">; ; forward_declare</property> - <property name="toolbar_pane">0</property> - <property name="tooltip"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="true"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> + <object class="wxCheckBox" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -1559,11 +554,11 @@ <property name="window_style"></property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> + <object class="wxCheckBox" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -1624,9 +619,74 @@ <property name="window_style"></property> </object> </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Export tracks and vias</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_cbExportTracks</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip">Export tracks and vias on external copper layers.</property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> <object class="sizeritem" expanded="true"> <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> <property name="proportion">0</property> <object class="wxCheckBox" expanded="true"> <property name="BottomDockable">1</property> @@ -1658,7 +718,7 @@ <property name="gripper">0</property> <property name="hidden">0</property> <property name="id">wxID_ANY</property> - <property name="label">Export tracks, pads and vias</property> + <property name="label">Export pads</property> <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> @@ -1666,7 +726,7 @@ <property name="minimize_button">0</property> <property name="minimum_size"></property> <property name="moveable">1</property> - <property name="name">m_cbExportTracks</property> + <property name="name">m_cbExportPads</property> <property name="pane_border">1</property> <property name="pane_position"></property> <property name="pane_size"></property> @@ -1679,7 +739,7 @@ <property name="style"></property> <property name="subclass">; ; forward_declare</property> <property name="toolbar_pane">0</property> - <property name="tooltip">Export tracks, pads and vias on external copper layers.</property> + <property name="tooltip"></property> <property name="validator_data_type"></property> <property name="validator_style">wxFILTER_NONE</property> <property name="validator_type">wxDefaultValidator</property> @@ -1689,11 +749,11 @@ <property name="window_style"></property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> + <object class="wxCheckBox" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -1754,11 +814,11 @@ <property name="window_style"></property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> - <property name="flag">wxBOTTOM|wxEXPAND|wxRIGHT</property> + <property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property> <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> + <object class="wxCheckBox" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -1819,11 +879,141 @@ <property name="window_style"></property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> + <object class="wxCheckBox" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Export silkscreen</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_cbExportSilkscreen</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip">Export silkscreen graphics as a set of flat faces.</property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Export solder mask</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_cbExportSoldermask</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip">Export solder mask layers as a set of flat faces.</property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -1884,141 +1074,11 @@ <property name="window_style"></property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> <property name="flag">wxBOTTOM|wxRIGHT</property> <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="checked">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">1</property> - <property name="id">wxID_ANY</property> - <property name="label">Export silkscreen</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_cbExportSilkscreen_hidden</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass">; ; forward_declare</property> - <property name="toolbar_pane">0</property> - <property name="tooltip">Export silkscreen graphics.</property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="true"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> - <property name="BottomDockable">1</property> - <property name="LeftDockable">1</property> - <property name="RightDockable">1</property> - <property name="TopDockable">1</property> - <property name="aui_layer"></property> - <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> - <property name="best_size"></property> - <property name="bg"></property> - <property name="caption"></property> - <property name="caption_visible">1</property> - <property name="center_pane">0</property> - <property name="checked">0</property> - <property name="close_button">1</property> - <property name="context_help"></property> - <property name="context_menu">1</property> - <property name="default_pane">0</property> - <property name="dock">Dock</property> - <property name="dock_fixed">0</property> - <property name="docking">Left</property> - <property name="drag_accept_files">0</property> - <property name="enabled">1</property> - <property name="fg"></property> - <property name="floatable">1</property> - <property name="font"></property> - <property name="gripper">0</property> - <property name="hidden">1</property> - <property name="id">wxID_ANY</property> - <property name="label">Export solder mask</property> - <property name="max_size"></property> - <property name="maximize_button">0</property> - <property name="maximum_size"></property> - <property name="min_size"></property> - <property name="minimize_button">0</property> - <property name="minimum_size"></property> - <property name="moveable">1</property> - <property name="name">m_cbExportSoldermask_hidden</property> - <property name="pane_border">1</property> - <property name="pane_position"></property> - <property name="pane_size"></property> - <property name="permission">protected</property> - <property name="pin_button">1</property> - <property name="pos"></property> - <property name="resize">Resizable</property> - <property name="show">1</property> - <property name="size"></property> - <property name="style"></property> - <property name="subclass">; ; forward_declare</property> - <property name="toolbar_pane">0</property> - <property name="tooltip">Export solder mask graphics.</property> - <property name="validator_data_type"></property> - <property name="validator_style">wxFILTER_NONE</property> - <property name="validator_type">wxDefaultValidator</property> - <property name="validator_variable"></property> - <property name="window_extra_style"></property> - <property name="window_name"></property> - <property name="window_style"></property> - </object> - </object> - <object class="sizeritem" expanded="true"> - <property name="border">5</property> - <property name="flag">wxBOTTOM|wxRIGHT</property> - <property name="proportion">0</property> - <object class="wxCheckBox" expanded="true"> + <object class="wxCheckBox" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -2079,11 +1139,11 @@ <property name="window_style"></property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> <property name="flag">wxLEFT|wxRIGHT|wxTOP</property> <property name="proportion">0</property> - <object class="wxStaticText" expanded="true"> + <object class="wxStaticText" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -2141,11 +1201,11 @@ <property name="wrap">-1</property> </object> </object> - <object class="sizeritem" expanded="true"> + <object class="sizeritem" expanded="false"> <property name="border">5</property> <property name="flag">wxALL|wxEXPAND</property> <property name="proportion">0</property> - <object class="wxTextCtrl" expanded="true"> + <object class="wxTextCtrl" expanded="false"> <property name="BottomDockable">1</property> <property name="LeftDockable">1</property> <property name="RightDockable">1</property> @@ -2335,17 +1395,1046 @@ </object> </object> </object> - </object> - </object> - <object class="sizeritem" expanded="false"> - <property name="border">10</property> - <property name="flag">wxEXPAND|wxLEFT|wxRIGHT|wxTOP</property> - <property name="proportion">0</property> - <object class="wxBoxSizer" expanded="false"> - <property name="minimum_size"></property> - <property name="name">bSizer81</property> - <property name="orient">wxHORIZONTAL</property> - <property name="permission">none</property> + <object class="sizeritem" expanded="true"> + <property name="border">5</property> + <property name="flag">wxEXPAND</property> + <property name="proportion">1</property> + <object class="wxBoxSizer" expanded="true"> + <property name="minimum_size"></property> + <property name="name">bSizer5</property> + <property name="orient">wxVERTICAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxEXPAND|wxALL</property> + <property name="proportion">0</property> + <object class="wxStaticBoxSizer" expanded="false"> + <property name="id">wxID_ANY</property> + <property name="label">Coordinates</property> + <property name="minimum_size"></property> + <property name="name">sbCoordinates</property> + <property name="orient">wxVERTICAL</property> + <property name="parent">1</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxRadioButton" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Drill/place file origin</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_rbDrillAndPlotOrigin</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style">wxRB_GROUP</property> + <property name="subclass">; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="value">0</property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxRadioButton" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Grid origin</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_rbGridOrigin</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="value">0</property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxRadioButton" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">User defined origin</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_rbUserDefinedOrigin</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="value">0</property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxALL</property> + <property name="proportion">0</property> + <object class="wxRadioButton" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Board center origin</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_rbBoardCenterOrigin</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="value">0</property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxEXPAND|wxALL</property> + <property name="proportion">0</property> + <object class="wxStaticBoxSizer" expanded="false"> + <property name="id">wxID_ANY</property> + <property name="label">User Defined Origin</property> + <property name="minimum_size"></property> + <property name="name">sbUserDefinedOrigin</property> + <property name="orient">wxVERTICAL</property> + <property name="parent">1</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property> + <property name="proportion">1</property> + <object class="wxFlexGridSizer" expanded="false"> + <property name="cols">2</property> + <property name="flexible_direction">wxBOTH</property> + <property name="growablecols"></property> + <property name="growablerows"></property> + <property name="hgap">0</property> + <property name="minimum_size"></property> + <property name="name">fgSizer1</property> + <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property> + <property name="permission">none</property> + <property name="rows">0</property> + <property name="vgap">5</property> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxStaticText" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Units:</property> + <property name="markup">0</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_staticTextUnits</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxChoice" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="choices">"mm" "inch"</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_STEP_OrgUnitChoice</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="selection">0</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <event name="OnUpdateUI">onUpdateUnits</event> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxStaticText" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">X position:</property> + <property name="markup">0</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_staticTextXpos</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxTextCtrl" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="maxlength">8</property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_STEP_Xorg</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">TEXT_CTRL_EVAL; widgets/text_ctrl_eval.h</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NUMERIC</property> + <property name="validator_type">wxTextValidator</property> + <property name="validator_variable"></property> + <property name="value">0</property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <event name="OnUpdateUI">onUpdateXPos</event> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxStaticText" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Y position:</property> + <property name="markup">0</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_staticTextYpos</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxTextCtrl" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="maxlength">8</property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_STEP_Yorg</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">TEXT_CTRL_EVAL; widgets/text_ctrl_eval.h</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NUMERIC</property> + <property name="validator_type">wxTextValidator</property> + <property name="validator_variable"></property> + <property name="value">0</property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <event name="OnUpdateUI">onUpdateYPos</event> + </object> + </object> + </object> + </object> + </object> + </object> + <object class="sizeritem" expanded="true"> + <property name="border">5</property> + <property name="flag">wxEXPAND|wxALL</property> + <property name="proportion">1</property> + <object class="wxStaticBoxSizer" expanded="true"> + <property name="id">wxID_ANY</property> + <property name="label">Other Options</property> + <property name="minimum_size"></property> + <property name="name">sbOtherOptions</property> + <property name="orient">wxVERTICAL</property> + <property name="parent">1</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxALL</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Ignore 'Do not populate' components</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_cbRemoveDNP</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip">Do not show components marked 'Do not populate'</property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Ignore 'Unspecified' components</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_cbRemoveUnspecified</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip">Do not show components with Footprint Type 'Unspecified'</property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Substitute similarly named models</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_cbSubstModels</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip">Replace VRML models with STEP models of the same name</property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Overwrite old file</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_cbOverwriteFile</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="false"> + <property name="border">5</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="false"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Optimize STEP file</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_cbOptimizeStep</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip">Disables writing parametric curves. Optimizes file size and write/read times, but may reduce compatibility with other software.</property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + </object> + </object> + </object> + </object> </object> </object> <object class="sizeritem" expanded="false"> diff --git a/pcbnew/dialogs/dialog_export_step_base.h b/pcbnew/dialogs/dialog_export_step_base.h index dba570a22f..7d4fb9a1b7 100644 --- a/pcbnew/dialogs/dialog_export_step_base.h +++ b/pcbnew/dialogs/dialog_export_step_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf) +// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -20,6 +20,7 @@ class TEXT_CTRL_EVAL; #include <wx/font.h> #include <wx/colour.h> #include <wx/settings.h> +#include <wx/choice.h> #include <wx/textctrl.h> #include <wx/bmpbuttn.h> #include <wx/bitmap.h> @@ -27,12 +28,10 @@ class TEXT_CTRL_EVAL; #include <wx/icon.h> #include <wx/button.h> #include <wx/sizer.h> -#include <wx/radiobut.h> -#include <wx/statbox.h> -#include <wx/choice.h> -#include <wx/valtext.h> #include <wx/checkbox.h> -#include <wx/statline.h> +#include <wx/statbox.h> +#include <wx/radiobut.h> +#include <wx/valtext.h> #include <wx/dialog.h> /////////////////////////////////////////////////////////////////////////// @@ -47,9 +46,26 @@ class DIALOG_EXPORT_STEP_BASE : public DIALOG_SHIM protected: wxBoxSizer* bSizerSTEPFile; wxBoxSizer* bSizerTop; + wxStaticText* m_txtFormat; + wxChoice* m_choiceFormat; wxStaticText* m_txtBrdFile; wxTextCtrl* m_outputFileName; STD_BITMAP_BUTTON* m_browseButton; + wxCheckBox* m_cbExportCompound_hidden; + wxCheckBox* m_cbExportBody; + wxCheckBox* m_cbExportComponents; + wxCheckBox* m_cbExportTracks; + wxCheckBox* m_cbExportPads; + wxCheckBox* m_cbExportZones; + wxCheckBox* m_cbExportInnerCopper; + wxCheckBox* m_cbExportSilkscreen; + wxCheckBox* m_cbExportSoldermask; + wxCheckBox* m_cbFuseShapes; + wxCheckBox* m_cbExportSolderpaste_hidden; + wxStaticText* m_staticTextNetFilter; + wxTextCtrl* m_txtNetFilter; + wxStaticText* m_staticTextTolerance; + wxChoice* m_choiceTolerance; wxRadioButton* m_rbDrillAndPlotOrigin; wxRadioButton* m_rbGridOrigin; wxRadioButton* m_rbUserDefinedOrigin; @@ -64,28 +80,13 @@ class DIALOG_EXPORT_STEP_BASE : public DIALOG_SHIM wxCheckBox* m_cbRemoveUnspecified; wxCheckBox* m_cbSubstModels; wxCheckBox* m_cbOverwriteFile; - wxStaticLine* m_staticline11_hidden; wxCheckBox* m_cbOptimizeStep; - wxCheckBox* m_cbExportCompound_hidden; - wxStaticLine* m_staticline1; - wxCheckBox* m_cbExportBody; - wxCheckBox* m_cbExportComponents; - wxCheckBox* m_cbExportTracks; - wxCheckBox* m_cbExportZones; - wxCheckBox* m_cbExportInnerCopper; - wxCheckBox* m_cbFuseShapes; - wxCheckBox* m_cbExportSilkscreen_hidden; - wxCheckBox* m_cbExportSoldermask_hidden; - wxCheckBox* m_cbExportSolderpaste_hidden; - wxStaticText* m_staticTextNetFilter; - wxTextCtrl* m_txtNetFilter; - wxStaticText* m_staticTextTolerance; - wxChoice* m_choiceTolerance; wxStdDialogButtonSizer* m_sdbSizer; wxButton* m_sdbSizerOK; wxButton* m_sdbSizerCancel; // Virtual event handlers, override them in your derived class + virtual void onFormatChoice( wxCommandEvent& event ) { event.Skip(); } virtual void onBrowseClicked( wxCommandEvent& event ) { event.Skip(); } virtual void onUpdateUnits( wxUpdateUIEvent& event ) { event.Skip(); } virtual void onUpdateXPos( wxUpdateUIEvent& event ) { event.Skip(); } @@ -95,7 +96,7 @@ class DIALOG_EXPORT_STEP_BASE : public DIALOG_SHIM public: - DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Export STEP / BREP / XAO / GLTF"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Export 3D Model"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); ~DIALOG_EXPORT_STEP_BASE(); diff --git a/pcbnew/exporters/step/exporter_step.cpp b/pcbnew/exporters/step/exporter_step.cpp index 065236f90c..093fb6441a 100644 --- a/pcbnew/exporters/step/exporter_step.cpp +++ b/pcbnew/exporters/step/exporter_step.cpp @@ -28,6 +28,7 @@ #include <board.h> #include <board_design_settings.h> #include <footprint.h> +#include <pcb_textbox.h> #include <pcb_track.h> #include <pcb_shape.h> #include <pad.h> @@ -149,9 +150,16 @@ EXPORTER_STEP::EXPORTER_STEP( BOARD* aBoard, const EXPORTER_STEP_PARAMS& aParams m_board( aBoard ), m_pcbModel( nullptr ) { - m_solderMaskColor = COLOR4D( 0.08, 0.20, 0.14, 0.83 ); m_copperColor = COLOR4D( 0.7, 0.61, 0.0, 1.0 ); + if( m_params.m_exportComponents ) + m_padColor = COLOR4D( 0.50, 0.50, 0.50, 1.0 ); + else + m_padColor = m_copperColor; + + // TODO: make configurable + m_platingThickness = pcbIUScale.mmToIU( 0.025 ); + // Init m_pcbBaseName to the board short filename (no path, no ext) // m_pcbName is used later to identify items in step file wxFileName fn( aBoard->GetFileName() ); @@ -177,61 +185,99 @@ bool EXPORTER_STEP::buildFootprint3DShapes( FOOTPRINT* aFootprint, VECTOR2D aOri { bool hasdata = false; std::vector<PAD*> padsMatchingNetFilter; + int maxError = m_board->GetDesignSettings().m_MaxError; // Dump the pad holes into the PCB for( PAD* pad : aFootprint->Pads() ) { - if( m_pcbModel->AddPadHole( pad, aOrigin ) ) - hasdata = true; + std::shared_ptr<SHAPE_SEGMENT> holeShape = pad->GetEffectiveHoleShape(); + + SHAPE_POLY_SET holePoly; + holeShape->TransformToPolygon( holePoly, maxError, ERROR_INSIDE ); + + for( PCB_LAYER_ID pcblayer : pad->GetLayerSet().Seq() ) + { + if( pad->IsOnLayer( pcblayer ) ) + m_poly_holes[pcblayer].Append( holePoly ); + } + + if( pad->HasHole() ) + { + int platingThickness = pad->GetAttribute() == PAD_ATTRIB::PTH ? m_platingThickness : 0; + + if( m_pcbModel->AddHole( *holeShape, platingThickness, F_Cu, B_Cu, false, aOrigin ) ) + hasdata = true; + + //// Cut holes in silkscreen (buggy: insufficient polyset self-intersection checking) + //if( m_layersToExport.Contains( F_SilkS ) || m_layersToExport.Contains( B_SilkS ) ) + //{ + // m_poly_holes[F_SilkS].Append( holePoly ); + // m_poly_holes[B_SilkS].Append( holePoly ); + //} + } if( !m_params.m_netFilter.IsEmpty() && !pad->GetNetname().Matches( m_params.m_netFilter ) ) continue; - if( m_params.m_exportTracksVias ) + if( m_params.m_exportPads ) { if( m_pcbModel->AddPadShape( pad, aOrigin, false ) ) hasdata = true; + + if( m_params.m_exportSoldermask ) + { + for( PCB_LAYER_ID pcblayer : pad->GetLayerSet().Seq() ) + { + if( pcblayer != F_Mask && pcblayer != B_Mask ) + continue; + + SHAPE_POLY_SET poly; + + pad->TransformShapeToPolygon( poly, pcblayer, pad->GetSolderMaskExpansion(), + maxError, ERROR_INSIDE ); + + m_poly_shapes[pcblayer].Append( poly ); + } + } } padsMatchingNetFilter.push_back( pad ); } - // Build 3D shapes of the footprint graphic items on external layers: - if( m_params.m_exportTracksVias ) + // Build 3D shapes of the footprint graphic items: + for( PCB_LAYER_ID pcblayer : m_layersToExport.Seq() ) { - int maxError = m_board->GetDesignSettings().m_MaxError; + if( IsCopperLayer( pcblayer ) && !m_params.m_exportTracksVias ) + continue; - for( PCB_LAYER_ID pcblayer : LSET( aFootprint->GetLayerSet() & LSET::AllCuMask() ).Seq() ) + SHAPE_POLY_SET buffer; + + aFootprint->TransformFPShapesToPolySet( buffer, pcblayer, 0, maxError, ERROR_INSIDE, + true, /* include text */ + true, /* include shapes */ + false /* include private items */ ); + + if( m_params.m_netFilter.IsEmpty() || !IsCopperLayer( pcblayer ) ) { - SHAPE_POLY_SET buffer; - - aFootprint->TransformFPShapesToPolySet( buffer, pcblayer, 0, maxError, ERROR_INSIDE, - false, /* include text */ - true, /* include shapes */ - false /* include private items */ ); - - if( m_params.m_netFilter.IsEmpty() ) + m_poly_shapes[pcblayer].Append( buffer ); + } + else + { + // Only add shapes colliding with any matching pads + for( const SHAPE_POLY_SET::POLYGON& poly : buffer.CPolygons() ) { - m_poly_copper_shapes[pcblayer].Append( buffer ); - } - else - { - // Only add shapes colliding with any matching pads - for( const SHAPE_POLY_SET::POLYGON& poly : buffer.CPolygons() ) + for( PAD* pad : padsMatchingNetFilter ) { - for( PAD* pad : padsMatchingNetFilter ) + if( !pad->IsOnLayer( pcblayer ) ) + continue; + + std::shared_ptr<SHAPE_POLY_SET> padPoly = pad->GetEffectivePolygon(); + SHAPE_POLY_SET gfxPoly( poly ); + + if( padPoly->Collide( &gfxPoly ) ) { - if( !pad->IsOnLayer( pcblayer ) ) - continue; - - std::shared_ptr<SHAPE_POLY_SET> padPoly = pad->GetEffectivePolygon(); - SHAPE_POLY_SET gfxPoly( poly ); - - if( padPoly->Collide( &gfxPoly ) ) - { - m_poly_copper_shapes[pcblayer].Append( gfxPoly ); - break; - } + m_poly_shapes[pcblayer].Append( gfxPoly ); + break; } } } @@ -340,25 +386,50 @@ bool EXPORTER_STEP::buildTrack3DShape( PCB_TRACK* aTrack, VECTOR2D aOrigin ) if( !m_params.m_netFilter.IsEmpty() && !aTrack->GetNetname().Matches( m_params.m_netFilter ) ) return true; + int maxError = m_board->GetDesignSettings().m_MaxError; + if( aTrack->Type() == PCB_VIA_T ) { - return m_pcbModel->AddViaShape( static_cast<const PCB_VIA*>( aTrack ), aOrigin ); + PCB_VIA* via = static_cast<PCB_VIA*>( aTrack ); + + std::shared_ptr<SHAPE_SEGMENT> holeShape = via->GetEffectiveHoleShape(); + SHAPE_POLY_SET holePoly; + holeShape->TransformToPolygon( holePoly, maxError, ERROR_INSIDE ); + + LSET layers( via->GetLayerSet() & m_layersToExport ); + + for( PCB_LAYER_ID pcblayer : layers.Seq() ) + { + const std::shared_ptr<SHAPE>& shape = via->GetEffectiveShape( pcblayer ); + + SHAPE_POLY_SET poly; + shape->TransformToPolygon( poly, maxError, ERROR_INSIDE ); + m_poly_shapes[pcblayer].Append( poly ); + m_poly_holes[pcblayer].Append( holePoly ); + } + + //// Cut holes in silkscreen (buggy: insufficient polyset self-intersection checking) + //if( m_layersToExport.Contains( F_SilkS ) || m_layersToExport.Contains( B_SilkS ) ) + //{ + // m_poly_holes[F_SilkS].Append( holePoly ); + // m_poly_holes[B_SilkS].Append( holePoly ); + //} + + PCB_LAYER_ID top_layer, bot_layer; + via->LayerPair( &top_layer, &bot_layer ); + + m_pcbModel->AddHole( *holeShape, m_platingThickness, top_layer, bot_layer, true, aOrigin ); + m_pcbModel->AddBarrel( *holeShape, top_layer, bot_layer, true, aOrigin ); + + return true; } PCB_LAYER_ID pcblayer = aTrack->GetLayer(); - if( !IsCopperLayer( pcblayer ) ) + if( !m_layersToExport.Contains( pcblayer ) ) return false; - if( aTrack->Type() == PCB_ARC_T ) - { - int maxError = m_board->GetDesignSettings().m_MaxError; - - aTrack->TransformShapeToPolygon( m_poly_copper_shapes[pcblayer], pcblayer, 0, maxError, - ERROR_INSIDE ); - } - else - m_pcbModel->AddTrackSegment( aTrack, aOrigin ); + aTrack->TransformShapeToPolygon( m_poly_shapes[pcblayer], pcblayer, 0, maxError, ERROR_INSIDE ); return true; } @@ -368,19 +439,23 @@ void EXPORTER_STEP::buildZones3DShape( VECTOR2D aOrigin ) { for( ZONE* zone : m_board->Zones() ) { - if( !m_params.m_netFilter.IsEmpty() && !zone->GetNetname().Matches( m_params.m_netFilter ) ) - continue; + LSET layers = zone->GetLayerSet(); - for( PCB_LAYER_ID layer : zone->GetLayerSet().CuStack() ) + if( ( layers & LSET::AllCuMask() ).count() && !m_params.m_netFilter.IsEmpty() + && !zone->GetNetname().Matches( m_params.m_netFilter ) ) { - SHAPE_POLY_SET copper_shape; - zone->TransformSolidAreasShapesToPolygon( layer, copper_shape ); - copper_shape.Unfracture( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + continue; + } - copper_shape.SimplifyOutlines( - ADVANCED_CFG::GetCfg().m_TriangulateSimplificationLevel ); + for( PCB_LAYER_ID layer : layers.Seq() ) + { + SHAPE_POLY_SET fill_shape; + zone->TransformSolidAreasShapesToPolygon( layer, fill_shape ); + fill_shape.Unfracture( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); - m_pcbModel->AddCopperPolygonShapes( &copper_shape, layer, aOrigin, false ); + fill_shape.SimplifyOutlines( ADVANCED_CFG::GetCfg().m_TriangulateSimplificationLevel ); + + m_poly_shapes[layer].Append( fill_shape ); } } } @@ -388,23 +463,53 @@ void EXPORTER_STEP::buildZones3DShape( VECTOR2D aOrigin ) bool EXPORTER_STEP::buildGraphic3DShape( BOARD_ITEM* aItem, VECTOR2D aOrigin ) { - PCB_SHAPE* graphic = dynamic_cast<PCB_SHAPE*>( aItem ); + PCB_LAYER_ID pcblayer = aItem->GetLayer(); - if( !graphic ) - return false; - - if( !m_params.m_netFilter.IsEmpty() && !graphic->GetNetname().Matches( m_params.m_netFilter ) ) - return true; - - PCB_LAYER_ID pcblayer = graphic->GetLayer(); - - if( !IsCopperLayer( pcblayer ) ) + if( !m_layersToExport.Contains( pcblayer ) ) return false; int maxError = m_board->GetDesignSettings().m_MaxError; - graphic->TransformShapeToPolygon( m_poly_copper_shapes[pcblayer], pcblayer, 0, maxError, - ERROR_INSIDE ); + switch( aItem->Type() ) + { + case PCB_SHAPE_T: + { + PCB_SHAPE* graphic = static_cast<PCB_SHAPE*>( aItem ); + + if( IsCopperLayer( pcblayer ) && !m_params.m_netFilter.IsEmpty() + && !graphic->GetNetname().Matches( m_params.m_netFilter ) ) + { + return true; + } + + graphic->TransformShapeToPolygon( m_poly_shapes[pcblayer], pcblayer, 0, maxError, + ERROR_INSIDE ); + + break; + } + + case PCB_TEXT_T: + { + PCB_TEXT* text = static_cast<PCB_TEXT*>( aItem ); + + text->TransformTextToPolySet( m_poly_shapes[pcblayer], 0, maxError, ERROR_INSIDE ); + break; + } + + case PCB_TEXTBOX_T: + { + PCB_TEXTBOX* textbox = static_cast<PCB_TEXTBOX*>( aItem ); + + textbox->TransformTextToPolySet( m_poly_shapes[pcblayer], 0, maxError, ERROR_INSIDE ); + break; + } + + case PCB_TABLE_T: + // JEY TODO: tables + break; + + default: wxFAIL_MSG( "buildGraphic3DShape: unhandled item type" ); + } return true; } @@ -424,13 +529,6 @@ bool EXPORTER_STEP::buildBoard3DShapes() wxLogWarning( _( "Board outline is malformed. Run DRC for a full analysis." ) ); } - LSET layersToExport = LSET::ExternalCuMask(); - - if( m_params.m_exportInnerCopper ) - layersToExport |= LSET::InternalCuMask(); - - layersToExport &= m_board->GetEnabledLayers(); - VECTOR2D origin; // Determine the coordinate system reference: @@ -444,12 +542,11 @@ bool EXPORTER_STEP::buildBoard3DShapes() m_pcbModel = std::make_unique<STEP_PCB_MODEL>( m_pcbBaseName ); - // TODO: Handle when top & bottom soldermask colours are different... - m_pcbModel->SetBoardColor( m_solderMaskColor.r, m_solderMaskColor.g, m_solderMaskColor.b ); m_pcbModel->SetCopperColor( m_copperColor.r, m_copperColor.g, m_copperColor.b ); + m_pcbModel->SetPadColor( m_padColor.r, m_padColor.g, m_padColor.b ); m_pcbModel->SetStackup( m_board->GetStackupOrDefault() ); - m_pcbModel->SetEnabledLayers( layersToExport ); + m_pcbModel->SetEnabledLayers( m_layersToExport ); m_pcbModel->SetFuseShapes( m_params.m_fuseShapes ); m_pcbModel->SetNetFilter( m_params.m_netFilter ); @@ -473,15 +570,45 @@ bool EXPORTER_STEP::buildBoard3DShapes() { for( PCB_TRACK* track : m_board->Tracks() ) buildTrack3DShape( track, origin ); - - for( BOARD_ITEM* item : m_board->Drawings() ) - buildGraphic3DShape( item, origin ); } - for( PCB_LAYER_ID pcblayer : layersToExport.Seq() ) + for( BOARD_ITEM* item : m_board->Drawings() ) + buildGraphic3DShape( item, origin ); + + SHAPE_POLY_SET pcbOutlinesNoArcs = pcbOutlines; + pcbOutlinesNoArcs.ClearArcs(); + + for( PCB_LAYER_ID pcblayer : m_layersToExport.Seq() ) { - m_pcbModel->AddCopperPolygonShapes( &m_poly_copper_shapes[pcblayer], pcblayer, origin, - true ); + SHAPE_POLY_SET poly = m_poly_shapes[pcblayer]; + poly.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + + poly.SimplifyOutlines( pcbIUScale.mmToIU( 0.003 ) ); + poly.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + + SHAPE_POLY_SET holes = m_poly_holes[pcblayer]; + holes.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + + // Mask layer is negative + if( pcblayer == F_Mask || pcblayer == B_Mask ) + { + SHAPE_POLY_SET mask = pcbOutlinesNoArcs; + + mask.BooleanSubtract( poly, SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + mask.BooleanSubtract( holes, SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + + poly = mask; + } + else + { + // Subtract holes + poly.BooleanSubtract( holes, SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + + // Clip to board outline + poly.BooleanIntersection( pcbOutlinesNoArcs, SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + } + + m_pcbModel->AddPolygonShapes( &poly, pcblayer, origin ); } if( m_params.m_exportZones ) @@ -525,6 +652,25 @@ bool EXPORTER_STEP::Export() m_params.m_outputFile = fn.GetFullName(); } + m_layersToExport = LSET::ExternalCuMask(); + + if( m_params.m_exportInnerCopper ) + m_layersToExport |= LSET::InternalCuMask(); + + if( m_params.m_exportSilkscreen ) + { + m_layersToExport.set( F_SilkS ); + m_layersToExport.set( B_SilkS ); + } + + if( m_params.m_exportSoldermask ) + { + m_layersToExport.set( F_Mask ); + m_layersToExport.set( B_Mask ); + } + + m_layersToExport &= m_board->GetEnabledLayers(); + try { ReportMessage( wxString::Format( _( "Build %s data\n" ), m_params.GetFormatName() ) ); diff --git a/pcbnew/exporters/step/exporter_step.h b/pcbnew/exporters/step/exporter_step.h index 87df37fe1c..39fee17110 100644 --- a/pcbnew/exporters/step/exporter_step.h +++ b/pcbnew/exporters/step/exporter_step.h @@ -58,8 +58,11 @@ public: m_exportBoardBody( true ), m_exportComponents( true ), m_exportTracksVias( false ), + m_exportPads( false ), m_exportZones( false ), m_exportInnerCopper( false ), + m_exportSilkscreen( false ), + m_exportSoldermask( false ), m_fuseShapes( false ), m_optimizeStep( true ), m_format( FORMAT::STEP ) @@ -89,8 +92,11 @@ public: bool m_exportBoardBody; bool m_exportComponents; bool m_exportTracksVias; + bool m_exportPads; bool m_exportZones; bool m_exportInnerCopper; + bool m_exportSilkscreen; + bool m_exportSoldermask; bool m_fuseShapes; bool m_optimizeStep; FORMAT m_format; @@ -135,10 +141,15 @@ private: /// used to identify items in step file wxString m_pcbBaseName; - std::map<PCB_LAYER_ID, SHAPE_POLY_SET> m_poly_copper_shapes; + std::map<PCB_LAYER_ID, SHAPE_POLY_SET> m_poly_shapes; + std::map<PCB_LAYER_ID, SHAPE_POLY_SET> m_poly_holes; - KIGFX::COLOR4D m_solderMaskColor; - KIGFX::COLOR4D m_copperColor; + LSET m_layersToExport; + + KIGFX::COLOR4D m_copperColor; + KIGFX::COLOR4D m_padColor; + + int m_platingThickness; // plating thickness for TH pads/vias }; #endif diff --git a/pcbnew/exporters/step/step_pcb_model.cpp b/pcbnew/exporters/step/step_pcb_model.cpp index 0c5d19cc63..f249441d6e 100644 --- a/pcbnew/exporters/step/step_pcb_model.cpp +++ b/pcbnew/exporters/step/step_pcb_model.cpp @@ -78,6 +78,7 @@ #include <XCAFDoc_DocumentTool.hxx> #include <XCAFDoc_ColorTool.hxx> #include <XCAFDoc_ShapeTool.hxx> +#include <XCAFDoc_VisMaterialTool.hxx> #include <XCAFDoc_Area.hxx> #include <XCAFDoc_Centroid.hxx> #include <XCAFDoc_Location.hxx> @@ -87,16 +88,12 @@ #include <BRep_Tool.hxx> #include <BRepMesh_IncrementalMesh.hxx> -#include <BRepBuilderAPI.hxx> -#include <BRepBuilderAPI_Transform.hxx> #include <BRepBuilderAPI_GTransform.hxx> #include <BRepBuilderAPI_MakeEdge.hxx> #include <BRepBuilderAPI_MakeWire.hxx> #include <BRepBuilderAPI_MakeFace.hxx> -#include <BRepBuilderAPI_MakeVertex.hxx> #include <BRepExtrema_DistShapeShape.hxx> #include <BRepPrimAPI_MakePrism.hxx> -#include <BRepPrimAPI_MakeCylinder.hxx> #include <BRepTools.hxx> #include <BRepLib_MakeWire.hxx> #include <BRepAdaptor_Surface.hxx> @@ -596,6 +593,97 @@ static Standard_Boolean rescaleShapes( const TDF_Label& theLabel, const gp_XYZ& } +static bool fuseShapes( auto& aInputShapes, TopoDS_Shape& aOutShape ) +{ + BRepAlgoAPI_Fuse mkFuse; + TopTools_ListOfShape shapeArguments, shapeTools; + + for( TopoDS_Shape& sh : aInputShapes ) + { + if( sh.IsNull() ) + continue; + + if( shapeArguments.IsEmpty() ) + shapeArguments.Append( sh ); + else + shapeTools.Append( sh ); + } + + mkFuse.SetRunParallel( true ); + mkFuse.SetToFillHistory( false ); + mkFuse.SetArguments( shapeArguments ); + mkFuse.SetTools( shapeTools ); + mkFuse.Build(); + + if( mkFuse.HasErrors() || mkFuse.HasWarnings() ) + { + ReportMessage( _( "** Got problems while fusing shapes **\n" ) ); + + if( mkFuse.HasErrors() ) + { + ReportMessage( _( "Errors:\n" ) ); + mkFuse.DumpErrors( std::cout ); + } + + if( mkFuse.HasWarnings() ) + { + ReportMessage( _( "Warnings:\n" ) ); + mkFuse.DumpWarnings( std::cout ); + } + + std::cout << "\n"; + } + + if( mkFuse.IsDone() ) + { + TopoDS_Shape fusedShape = mkFuse.Shape(); + + ShapeUpgrade_UnifySameDomain unify( fusedShape, true, true, false ); + unify.History() = nullptr; + unify.Build(); + + TopoDS_Shape unifiedShapes = unify.Shape(); + + if( unifiedShapes.IsNull() ) + { + ReportMessage( _( "** ShapeUpgrade_UnifySameDomain produced a null shape **\n" ) ); + } + else + { + aOutShape = unifiedShapes; + return true; + } + } + + return false; +} + + +static TopoDS_Compound makeCompound( auto& aInputShapes ) +{ + TopoDS_Compound compound; + BRep_Builder builder; + builder.MakeCompound( compound ); + + for( TopoDS_Shape& shape : aInputShapes ) + builder.Add( compound, shape ); + + return compound; +} + + +// Try to fuse shapes. If that fails, just add them to a compound +static TopoDS_Shape fuseShapesOrCompound( auto& aInputShapes ) +{ + TopoDS_Shape outShape; + + if( fuseShapes( aInputShapes, outShape ) ) + return outShape; + + return makeCompound( aInputShapes ); +} + + // Sets names in assembly to <aPrefix> (<old name>), or to <aPrefix> static Standard_Boolean prefixNames( const TDF_Label& aLabel, const TCollection_ExtendedString& aPrefix ) @@ -643,6 +731,7 @@ STEP_PCB_MODEL::STEP_PCB_MODEL( const wxString& aPcbName ) m_assy = XCAFDoc_DocumentTool::ShapeTool( m_doc->Main() ); m_assy_label = m_assy->NewShape(); m_hasPCB = false; + m_simplifyShapes = true; m_components = 0; m_precision = USER_PREC; m_angleprec = USER_ANGLE_PREC; @@ -651,9 +740,6 @@ STEP_PCB_MODEL::STEP_PCB_MODEL( const wxString& aPcbName ) m_pcbName = aPcbName; m_maxError = pcbIUScale.mmToIU( ARC_TO_SEGMENT_MAX_ERROR_MM ); m_fuseShapes = false; - - // TODO: make configurable - m_platingThickness = pcbIUScale.mmToIU( 0.025 ); } @@ -670,13 +756,11 @@ bool STEP_PCB_MODEL::AddPadShape( const PAD* aPad, const VECTOR2D& aOrigin, bool for( PCB_LAYER_ID pcb_layer : aPad->GetLayerSet().Seq() ) { - if( !IsCopperLayer( pcb_layer ) ) - continue; - if( !m_enabledLayers.Contains( pcb_layer ) ) continue; - TopoDS_Shape curr_shape; + if( pcb_layer == F_Mask || pcb_layer == B_Mask ) + continue; double Zpos, thickness; getLayerZPlacement( pcb_layer, Zpos, thickness ); @@ -685,134 +769,28 @@ bool STEP_PCB_MODEL::AddPadShape( const PAD* aPad, const VECTOR2D& aOrigin, bool { // Pad surface as a separate face for FEM simulations. if( pcb_layer == F_Cu ) - thickness += 0.01; + thickness += 0.005; else if( pcb_layer == B_Cu ) - thickness -= 0.01; + thickness -= 0.005; } TopoDS_Shape testShape; // Make a shape on copper layers - std::shared_ptr<SHAPE> effShapePtr = aPad->GetEffectiveShape( pcb_layer ); + SHAPE_POLY_SET polySet; + aPad->TransformShapeToPolygon( polySet, pcb_layer, 0, ARC_HIGH_DEF, ERROR_INSIDE ); - wxCHECK( effShapePtr->Type() == SHAPE_TYPE::SH_COMPOUND, false ); - SHAPE_COMPOUND* compoundShape = static_cast<SHAPE_COMPOUND*>( effShapePtr.get() ); + success &= MakeShapes( m_board_copper_pads, polySet, m_simplifyShapes, thickness, Zpos, + aOrigin ); - std::vector<TopoDS_Shape> topodsShapes; - - for( SHAPE* shape : compoundShape->Shapes() ) + if( testShape.IsNull() ) { - if( shape->Type() == SHAPE_TYPE::SH_SEGMENT || shape->Type() == SHAPE_TYPE::SH_CIRCLE ) - { - VECTOR2I start, end; - int width = 0; + std::vector<TopoDS_Shape> testShapes; - if( shape->Type() == SHAPE_TYPE::SH_SEGMENT ) - { - SHAPE_SEGMENT* sh_seg = static_cast<SHAPE_SEGMENT*>( shape ); + MakeShapes( testShapes, polySet, m_simplifyShapes, 0.0, Zpos + thickness, aOrigin ); - start = sh_seg->GetSeg().A; - end = sh_seg->GetSeg().B; - width = sh_seg->GetWidth(); - } - else if( shape->Type() == SHAPE_TYPE::SH_CIRCLE ) - { - SHAPE_CIRCLE* sh_circ = static_cast<SHAPE_CIRCLE*>( shape ); - - start = end = sh_circ->GetCenter(); - width = sh_circ->GetRadius() * 2; - } - - TopoDS_Shape topods_shape; - - if( MakeShapeAsThickSegment( topods_shape, start, end, width, thickness, Zpos, - aOrigin ) ) - { - topodsShapes.emplace_back( topods_shape ); - - if( testShape.IsNull() ) - { - MakeShapeAsThickSegment( testShape, start, end, width, 0.0, - Zpos + thickness, aOrigin ); - } - } - else - { - success = false; - } - } - else - { - SHAPE_POLY_SET polySet; - shape->TransformToPolygon( polySet, ARC_HIGH_DEF, ERROR_INSIDE ); - - success &= MakeShapes( topodsShapes, polySet, false, thickness, Zpos, aOrigin ); - - if( testShape.IsNull() ) - { - std::vector<TopoDS_Shape> testShapes; - - MakeShapes( testShapes, polySet, false, 0.0, Zpos + thickness, aOrigin ); - - if( testShapes.size() > 0 ) - testShape = testShapes.front(); - } - } - } - - // Fuse shapes - if( topodsShapes.size() == 1 ) - { - m_board_copper_pads.emplace_back( topodsShapes.front() ); - } - else - { - BRepAlgoAPI_Fuse mkFuse; - TopTools_ListOfShape shapeArguments, shapeTools; - - for( TopoDS_Shape& sh : topodsShapes ) - { - if( sh.IsNull() ) - continue; - - if( shapeArguments.IsEmpty() ) - shapeArguments.Append( sh ); - else - shapeTools.Append( sh ); - } - - mkFuse.SetRunParallel( true ); - mkFuse.SetToFillHistory( false ); - mkFuse.SetArguments( shapeArguments ); - mkFuse.SetTools( shapeTools ); - mkFuse.Build(); - - if( mkFuse.IsDone() ) - { - TopoDS_Shape fusedShape = mkFuse.Shape(); - - ShapeUpgrade_UnifySameDomain unify( fusedShape, true, true, false ); - unify.History() = nullptr; - unify.Build(); - - TopoDS_Shape unifiedShapes = unify.Shape(); - - if( !unifiedShapes.IsNull() ) - { - m_board_copper_pads.emplace_back( unifiedShapes ); - } - else - { - ReportMessage( - _( "** ShapeUpgrade_UnifySameDomain produced a null shape **\n" ) ); - m_board_copper_pads.emplace_back( fusedShape ); - } - } - else - { - for( TopoDS_Shape& sh : topodsShapes ) - m_board_copper_pads.emplace_back( sh ); - } + if( testShapes.size() > 0 ) + testShape = testShapes.front(); } if( !aVia && !testShape.IsNull() ) @@ -872,45 +850,80 @@ bool STEP_PCB_MODEL::AddPadShape( const PAD* aPad, const VECTOR2D& aOrigin, bool } -bool STEP_PCB_MODEL::AddViaShape( const PCB_VIA* aVia, const VECTOR2D& aOrigin ) +bool STEP_PCB_MODEL::AddHole( const SHAPE_SEGMENT& aShape, int aPlatingThickness, + PCB_LAYER_ID aLayerTop, PCB_LAYER_ID aLayerBot, bool aVia, + const VECTOR2D& aOrigin ) { - // A via is very similar to a round pad. So, for now, used AddPadHole() to - // create a via+hole shape - PAD dummy( nullptr ); - int hole = aVia->GetDrillValue(); - dummy.SetDrillSize( VECTOR2I( hole, hole ) ); - dummy.SetPosition( aVia->GetStart() ); - dummy.SetSize( VECTOR2I( aVia->GetWidth(), aVia->GetWidth() ) ); + double margin = 0.001; // a small margin on the Z axix to be sure the hole + // is bigger than the board with copper + // must be > OCC_MAX_DISTANCE_TO_MERGE_POINTS - if( AddPadHole( &dummy, aOrigin ) ) + // Pads are taller by 0.01 mm + if( !aVia ) + margin += 0.01; + + double f_pos, f_thickness; + double b_pos, b_thickness; + getLayerZPlacement( aLayerTop, f_pos, f_thickness ); + getLayerZPlacement( aLayerBot, b_pos, b_thickness ); + double top = std::max( f_pos, f_pos + f_thickness ); + double bottom = std::min( b_pos, b_pos + b_thickness ); + + double holeZsize = ( top - bottom ) + ( margin * 2 ); + + double boardDrill = aShape.GetWidth(); + double copperDrill = boardDrill - aPlatingThickness * 2; + + TopoDS_Shape copperHole, boardHole; + + if( MakeShapeAsThickSegment( copperHole, aShape.GetSeg().A, aShape.GetSeg().B, copperDrill, + holeZsize, bottom - margin, aOrigin ) ) { - if( !AddPadShape( &dummy, aOrigin, true ) ) - return false; + m_copperCutouts.push_back( copperHole ); + } + else + { + return false; + } + + if( MakeShapeAsThickSegment( boardHole, aShape.GetSeg().A, aShape.GetSeg().B, boardDrill, + holeZsize, bottom - margin, aOrigin ) ) + { + m_boardCutouts.push_back( boardHole ); + } + else + { + return false; } return true; } -bool STEP_PCB_MODEL::AddTrackSegment( const PCB_TRACK* aTrack, const VECTOR2D& aOrigin ) +bool STEP_PCB_MODEL::AddBarrel( const SHAPE_SEGMENT& aShape, PCB_LAYER_ID aLayerTop, + PCB_LAYER_ID aLayerBot, bool aVia, const VECTOR2D& aOrigin ) { - PCB_LAYER_ID pcblayer = aTrack->GetLayer(); + double f_pos, f_thickness; + double b_pos, b_thickness; + getLayerZPlacement( aLayerTop, f_pos, f_thickness ); + getLayerZPlacement( aLayerBot, b_pos, b_thickness ); + double top = std::max( f_pos, f_pos + f_thickness ); + double bottom = std::min( b_pos, b_pos + b_thickness ); - if( !m_enabledLayers.Contains( pcblayer ) ) - return true; + TopoDS_Shape plating; - TopoDS_Shape shape; + if( !MakeShapeAsThickSegment( plating, aShape.GetSeg().A, aShape.GetSeg().B, aShape.GetWidth(), + ( top - bottom ), bottom, aOrigin ) ) + { + return false; + } - double zposition, thickness; - getLayerZPlacement( pcblayer, zposition, thickness ); + if( aVia ) + m_board_copper_vias.push_back( plating ); + else + m_board_copper_pads.push_back( plating ); - bool success = MakeShapeAsThickSegment( shape, aTrack->GetStart(), aTrack->GetEnd(), - aTrack->GetWidth(), thickness, zposition, aOrigin ); - - if( success ) - m_board_copper_tracks.push_back( shape ); - - return success; + return true; } @@ -1024,8 +1037,8 @@ void STEP_PCB_MODEL::getBoardBodyZPlacement( double& aZPos, double& aThickness ) } -bool STEP_PCB_MODEL::AddCopperPolygonShapes( const SHAPE_POLY_SET* aPolyShapes, PCB_LAYER_ID aLayer, - const VECTOR2D& aOrigin, bool aTrack ) +bool STEP_PCB_MODEL::AddPolygonShapes( const SHAPE_POLY_SET* aPolyShapes, PCB_LAYER_ID aLayer, + const VECTOR2D& aOrigin ) { bool success = true; @@ -1038,8 +1051,12 @@ bool STEP_PCB_MODEL::AddCopperPolygonShapes( const SHAPE_POLY_SET* aPolyShapes, double z_pos, thickness; getLayerZPlacement( aLayer, z_pos, thickness ); - if( !MakeShapes( aTrack ? m_board_copper_tracks : m_board_copper_zones, *aPolyShapes, true, - thickness, z_pos, aOrigin ) ) + std::vector<TopoDS_Shape>& targetVec = IsCopperLayer( aLayer ) ? m_board_copper + : aLayer == F_SilkS || aLayer == B_SilkS + ? m_board_silkscreen + : m_board_soldermask; + + if( !MakeShapes( targetVec, *aPolyShapes, m_simplifyShapes, thickness, z_pos, aOrigin ) ) { ReportMessage( wxString::Format( wxT( "Could not add shape (%d points) to copper layer on %s.\n" ), @@ -1052,57 +1069,6 @@ bool STEP_PCB_MODEL::AddCopperPolygonShapes( const SHAPE_POLY_SET* aPolyShapes, } -bool STEP_PCB_MODEL::AddPadHole( const PAD* aPad, const VECTOR2D& aOrigin ) -{ - if( aPad == nullptr || !aPad->GetDrillSize().x ) - return false; - - const double margin = 0.01; // a small margin on the Z axix to be sure the hole - // is bigger than the board with copper - // must be > OCC_MAX_DISTANCE_TO_MERGE_POINTS - - double f_pos, f_thickness; - double b_pos, b_thickness; - getLayerZPlacement( F_Cu, f_pos, f_thickness ); - getLayerZPlacement( B_Cu, b_pos, b_thickness ); - double top = std::max( f_pos, f_pos + f_thickness ); - double bottom = std::min( b_pos, b_pos + b_thickness ); - - double holeZsize = ( top - bottom ) + ( margin * 2 ); - - std::shared_ptr<SHAPE_SEGMENT> seg_hole = aPad->GetEffectiveHoleShape(); - - double boardDrill = std::min( aPad->GetDrillSize().x, aPad->GetDrillSize().y ); - - int platingThickness = aPad->GetAttribute() == PAD_ATTRIB::PTH ? m_platingThickness : 0; - double copperDrill = boardDrill - platingThickness * 2; - - TopoDS_Shape copperHole, boardHole; - - if( MakeShapeAsThickSegment( copperHole, seg_hole->GetSeg().A, seg_hole->GetSeg().B, - copperDrill, holeZsize, bottom - margin, aOrigin ) ) - { - m_copperCutouts.push_back( copperHole ); - } - else - { - return false; - } - - if( MakeShapeAsThickSegment( boardHole, seg_hole->GetSeg().A, seg_hole->GetSeg().B, boardDrill, - holeZsize, bottom - margin, aOrigin ) ) - { - m_boardCutouts.push_back( boardHole ); - } - else - { - return false; - } - - return true; -} - - bool STEP_PCB_MODEL::AddComponent( const std::string& aFileNameUTF8, const std::string& aRefDes, bool aBottom, VECTOR2D aPosition, double aRotation, VECTOR3D aOffset, VECTOR3D aOrientation, VECTOR3D aScale, bool aSubstituteModels ) @@ -1114,7 +1080,7 @@ bool STEP_PCB_MODEL::AddComponent( const std::string& aFileNameUTF8, const std:: } wxString fileName( wxString::FromUTF8( aFileNameUTF8.c_str() ) ); - ReportMessage( wxString::Format( wxT( "Add component %s.\n" ), aRefDes ) ); + ReportMessage( wxString::Format( wxT( "Adding component %s.\n" ), aRefDes ) ); // first retrieve a label TDF_Label lmodel; @@ -1170,6 +1136,12 @@ void STEP_PCB_MODEL::SetFuseShapes( bool aValue ) } +void STEP_PCB_MODEL::SetSimplifyShapes( bool aValue ) +{ + m_simplifyShapes = aValue; +} + + void STEP_PCB_MODEL::SetStackup( const BOARD_STACKUP& aStackup ) { m_stackup = aStackup; @@ -1182,14 +1154,6 @@ void STEP_PCB_MODEL::SetNetFilter( const wxString& aFilter ) } -void STEP_PCB_MODEL::SetBoardColor( double r, double g, double b ) -{ - m_boardColor[0] = r; - m_boardColor[1] = g; - m_boardColor[2] = b; -} - - void STEP_PCB_MODEL::SetCopperColor( double r, double g, double b ) { m_copperColor[0] = r; @@ -1198,6 +1162,14 @@ void STEP_PCB_MODEL::SetCopperColor( double r, double g, double b ) } +void STEP_PCB_MODEL::SetPadColor( double r, double g, double b ) +{ + m_padColor[0] = r; + m_padColor[1] = g; + m_padColor[2] = b; +} + + void STEP_PCB_MODEL::OCCSetMergeMaxDistance( double aDistance ) { // Ensure a minimal value (in mm) @@ -1211,61 +1183,6 @@ bool STEP_PCB_MODEL::isBoardOutlineValid() } -// A helper function to know if a SHAPE_LINE_CHAIN is encoding a circle (now unused) -#if 0 -static bool IsChainCircle( const SHAPE_LINE_CHAIN& aChain ) -{ - // If aChain is a circle it - // - contains only one arc - // - this arc has the same start and end point - const std::vector<SHAPE_ARC>& arcs = aChain.CArcs(); - - if( arcs.size() == 1 ) - { - const SHAPE_ARC& arc = arcs[0]; - - if( arc. GetP0() == arc.GetP1() ) - return true; - } - - return false; -} -#endif - - -bool STEP_PCB_MODEL::MakeShapeAsCylinder( TopoDS_Shape& aShape, - const SHAPE_LINE_CHAIN& aChain, double aThickness, - double aZposition, const VECTOR2D& aOrigin ) -{ - if( !aShape.IsNull() ) - return false; // there is already data in the shape object - - if( !aChain.IsClosed() ) - return false; // the loop is not closed - - const std::vector<SHAPE_ARC>& arcs = aChain.CArcs(); - const SHAPE_ARC& arc = arcs[0]; - - TopoDS_Shape base_shape; - base_shape = BRepPrimAPI_MakeCylinder( - pcbIUScale.IUTomm( arc.GetRadius() ), aThickness ).Shape(); - gp_Trsf shift; - shift.SetTranslation( gp_Vec( pcbIUScale.IUTomm( arc.GetCenter().x - aOrigin.x ), - -pcbIUScale.IUTomm( arc.GetCenter().y - aOrigin.y ), - aZposition ) ); - BRepBuilderAPI_Transform round_shape( base_shape, shift ); - aShape = round_shape; - - if( aShape.IsNull() ) - { - ReportMessage( wxT( "failed to create a cylinder vertical shape\n" ) ); - return false; - } - - return true; -} - - bool STEP_PCB_MODEL::MakeShapeAsThickSegment( TopoDS_Shape& aShape, VECTOR2D aStartPoint, VECTOR2D aEndPoint, double aWidth, double aThickness, @@ -1369,7 +1286,6 @@ bool STEP_PCB_MODEL::MakeShapeAsThickSegment( TopoDS_Shape& aShape, return false; } - BRepBuilderAPI_MakeFace face; try @@ -1417,11 +1333,208 @@ static wxString formatBBox( const BOX2I& aBBox ) } +static bool makeWireFromChain( BRepLib_MakeWire& aMkWire, const SHAPE_LINE_CHAIN& aChain, + double aMergeOCCMaxDist, double aZposition, const VECTOR2D& aOrigin ) +{ + auto toPoint = [&]( const VECTOR2D& aKiCoords ) -> gp_Pnt + { + return gp_Pnt( pcbIUScale.IUTomm( aKiCoords.x - aOrigin.x ), + -pcbIUScale.IUTomm( aKiCoords.y - aOrigin.y ), aZposition ); + }; + + try + { + auto addSegment = [&]( const VECTOR2I& aPt0, const VECTOR2I& aPt1 ) -> bool + { + if( aPt0 == aPt1 ) + return false; + + gp_Pnt start = toPoint( aPt0 ); + gp_Pnt end = toPoint( aPt1 ); + + BRepBuilderAPI_MakeEdge mkEdge( start, end ); + + if( !mkEdge.IsDone() || mkEdge.Edge().IsNull() ) + { + ReportMessage( wxString::Format( wxT( "failed to make segment edge at (%d " + "%d) -> (%d %d), skipping\n" ), + aPt0.x, aPt0.y, aPt1.x, aPt1.y ) ); + } + else + { + aMkWire.Add( mkEdge.Edge() ); + + if( aMkWire.Error() != BRepLib_WireDone ) + { + ReportMessage( wxString::Format( wxT( "failed to add segment edge " + "at (%d %d) -> (%d %d)\n" ), + aPt0.x, aPt0.y, aPt1.x, aPt1.y ) ); + return false; + } + } + + return true; + }; + + auto addArc = [&]( const VECTOR2I& aPt0, const SHAPE_ARC& aArc ) -> bool + { + // Do not export too short segments: they create broken shape because OCC thinks + Handle( Geom_Curve ) curve; + + if( aArc.GetCentralAngle() == ANGLE_360 ) + { + gp_Ax2 axis = gp::XOY(); + axis.SetLocation( toPoint( aArc.GetCenter() ) ); + + curve = GC_MakeCircle( axis, pcbIUScale.IUTomm( aArc.GetRadius() ) ).Value(); + } + else + { + curve = GC_MakeArcOfCircle( toPoint( aPt0 ), toPoint( aArc.GetArcMid() ), + toPoint( aArc.GetP1() ) ) + .Value(); + } + + if( curve.IsNull() ) + return false; + + aMkWire.Add( BRepBuilderAPI_MakeEdge( curve ) ); + + if( !aMkWire.IsDone() ) + { + ReportMessage( wxString::Format( + wxT( "failed to add arc curve from (%d %d), arc p0 " + "(%d %d), mid (%d %d), p1 (%d %d)\n" ), + aPt0.x, aPt0.y, aArc.GetP0().x, aArc.GetP0().y, aArc.GetArcMid().x, + aArc.GetArcMid().y, aArc.GetP1().x, aArc.GetP1().y ) ); + return false; + } + + return true; + }; + + VECTOR2I firstPt; + VECTOR2I lastPt; + bool isFirstShape = true; + + for( int i = 0; i <= aChain.PointCount() && i != -1; i = aChain.NextShape( i ) ) + { + if( i == 0 ) + { + if( aChain.IsArcSegment( 0 ) && aChain.IsArcSegment( aChain.PointCount() - 1 ) + && aChain.ArcIndex( 0 ) == aChain.ArcIndex( aChain.PointCount() - 1 ) ) + { + // Skip first arc (we should encounter it later) + int nextShape = aChain.NextShape( i ); + + // If nextShape points to the end, then we have a circle. + if( nextShape != -1 ) + i = nextShape; + } + } + + if( isFirstShape ) + lastPt = aChain.CPoint( i ); + + bool isArc = aChain.IsArcSegment( i ); + + if( aChain.IsArcStart( i ) ) + { + const SHAPE_ARC& currentArc = aChain.Arc( aChain.ArcIndex( i ) ); + + if( isFirstShape ) + { + firstPt = currentArc.GetP0(); + lastPt = firstPt; + } + + if( addSegment( lastPt, currentArc.GetP0() ) ) + lastPt = currentArc.GetP0(); + + if( addArc( lastPt, currentArc ) ) + lastPt = currentArc.GetP1(); + } + else if( !isArc ) + { + const SEG& seg = aChain.CSegment( i ); + + if( isFirstShape ) + { + firstPt = seg.A; + lastPt = firstPt; + } + + if( addSegment( lastPt, seg.A ) ) + lastPt = seg.A; + + if( addSegment( lastPt, seg.B ) ) + lastPt = seg.B; + } + + isFirstShape = false; + } + + if( lastPt != firstPt && !addSegment( lastPt, firstPt ) ) + { + ReportMessage( + wxString::Format( wxT( "** Failed to close wire at %d, %d -> %d, %d **\n" ), + lastPt.x, lastPt.y, firstPt.x, firstPt.y ) ); + + return false; + } + } + catch( const Standard_Failure& e ) + { + ReportMessage( wxString::Format( wxT( "makeWireFromChain: OCC exception: %s\n" ), + e.GetMessageString() ) ); + return false; + } + + return true; +} + + bool STEP_PCB_MODEL::MakeShapes( std::vector<TopoDS_Shape>& aShapes, const SHAPE_POLY_SET& aPolySet, bool aConvertToArcs, double aThickness, double aZposition, const VECTOR2D& aOrigin ) { - SHAPE_POLY_SET simplified = aPolySet; - simplified.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + SHAPE_POLY_SET workingPoly = aPolySet; + workingPoly.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE ); + + SHAPE_POLY_SET fallbackPoly = workingPoly; + + if( aConvertToArcs ) + { + SHAPE_POLY_SET approximated = workingPoly; + + for( size_t polyId = 0; polyId < approximated.CPolygons().size(); polyId++ ) + { + SHAPE_POLY_SET::POLYGON& polygon = approximated.Polygon( polyId ); + + for( size_t contId = 0; contId < polygon.size(); contId++ ) + { + SHAPE_LINE_CHAIN approxChain = approximateLineChainWithArcs( polygon[contId] ); + polygon[contId] = approxChain; + } + } + + fallbackPoly = workingPoly; + workingPoly = approximated; + + // TODO: this is not accurate because it doesn't check arcs. + /*if( approximated.IsSelfIntersecting() ) + { + ReportMessage( wxString::Format( _( "\nApproximated polygon self-intersection check " + "failed\n" ) ) ); + + ReportMessage( wxString::Format( _( "z: %g; bounding box: %s\n" ), aZposition, + formatBBox( workingPoly.BBox() ) ) ); + } + else + { + fallbackPoly = workingPoly; + workingPoly = approximated; + }*/ + } auto toPoint = [&]( const VECTOR2D& aKiCoords ) -> gp_Pnt { @@ -1429,173 +1542,20 @@ bool STEP_PCB_MODEL::MakeShapes( std::vector<TopoDS_Shape>& aShapes, const SHAPE -pcbIUScale.IUTomm( aKiCoords.y - aOrigin.y ), aZposition ); }; - gp_Pln basePlane( gp_Pnt( 0.0, 0.0, aZposition ), gp::DZ() ); + gp_Pln basePlane( gp_Pnt( 0.0, 0.0, aZposition ), + std::signbit( aThickness ) ? -gp::DZ() : gp::DZ() ); - for( const SHAPE_POLY_SET::POLYGON& polygon : simplified.CPolygons() ) + for( size_t polyId = 0; polyId < workingPoly.CPolygons().size(); polyId++ ) { - auto makeWireFromChain = [&]( BRepLib_MakeWire& aMkWire, - const SHAPE_LINE_CHAIN& aChain ) -> bool - { - try - { - auto addSegment = [&]( const VECTOR2I& aPt0, const VECTOR2I& aPt1 ) -> bool - { - if( aPt0 == aPt1 ) - return false; + SHAPE_POLY_SET::POLYGON& polygon = workingPoly.Polygon( polyId ); - gp_Pnt start = toPoint( aPt0 ); - gp_Pnt end = toPoint( aPt1 ); - - BRepBuilderAPI_MakeEdge mkEdge( start, end ); - - if( !mkEdge.IsDone() || mkEdge.Edge().IsNull() ) - { - ReportMessage( wxString::Format( wxT( "failed to make segment edge at (%d " - "%d) -> (%d %d), skipping\n" ), - aPt0.x, aPt0.y, aPt1.x, aPt1.y ) ); - } - else - { - aMkWire.Add( mkEdge.Edge() ); - - if( aMkWire.Error() != BRepLib_WireDone ) - { - ReportMessage( wxString::Format( wxT( "failed to add segment edge " - "at (%d %d) -> (%d %d)\n" ), - aPt0.x, aPt0.y, aPt1.x, aPt1.y ) ); - return false; - } - } - - return true; - }; - - auto addArc = [&]( const VECTOR2I& aPt0, const SHAPE_ARC& aArc ) -> bool - { - // Do not export too short segments: they create broken shape because OCC thinks - Handle( Geom_Curve ) curve; - - if( aArc.GetCentralAngle() == ANGLE_360 ) - { - gp_Ax2 axis = gp::XOY(); - axis.SetLocation( toPoint( aArc.GetCenter() ) ); - - curve = GC_MakeCircle( axis, pcbIUScale.IUTomm( aArc.GetRadius() ) ) - .Value(); - } - else - { - curve = GC_MakeArcOfCircle( toPoint( aPt0 ), toPoint( aArc.GetArcMid() ), - toPoint( aArc.GetP1() ) ) - .Value(); - } - - if( curve.IsNull() ) - return false; - - aMkWire.Add( BRepBuilderAPI_MakeEdge( curve ) ); - - if( !aMkWire.IsDone() ) - { - ReportMessage( wxString::Format( - wxT( "failed to add arc curve from (%d %d), arc p0 " - "(%d %d), mid (%d %d), p1 (%d %d)\n" ), - aPt0.x, aPt0.y, aArc.GetP0().x, aArc.GetP0().y, aArc.GetArcMid().x, - aArc.GetArcMid().y, aArc.GetP1().x, aArc.GetP1().y ) ); - return false; - } - - return true; - }; - - VECTOR2I firstPt; - VECTOR2I lastPt; - bool isFirstShape = true; - - for( int i = 0; i <= aChain.PointCount() && i != -1; i = aChain.NextShape( i ) ) - { - if( i == 0 ) - { - if( aChain.IsArcSegment( 0 ) - && aChain.IsArcSegment( aChain.PointCount() - 1 ) - && aChain.ArcIndex( 0 ) == aChain.ArcIndex( aChain.PointCount() - 1 ) ) - { - // Skip first arc (we should encounter it later) - int nextShape = aChain.NextShape( i ); - - // If nextShape points to the end, then we have a circle. - if( nextShape != -1 ) - i = nextShape; - } - } - - if( isFirstShape ) - lastPt = aChain.CPoint( i ); - - bool isArc = aChain.IsArcSegment( i ); - - if( aChain.IsArcStart( i ) ) - { - const SHAPE_ARC& currentArc = aChain.Arc( aChain.ArcIndex( i ) ); - - if( isFirstShape ) - { - firstPt = currentArc.GetP0(); - lastPt = firstPt; - } - - if( addSegment( lastPt, currentArc.GetP0() ) ) - lastPt = currentArc.GetP0(); - - if( addArc( lastPt, currentArc ) ) - lastPt = currentArc.GetP1(); - } - else if( !isArc ) - { - const SEG& seg = aChain.CSegment( i ); - - if( isFirstShape ) - { - firstPt = seg.A; - lastPt = firstPt; - } - - if( addSegment( lastPt, seg.A ) ) - lastPt = seg.A; - - if( addSegment( lastPt, seg.B ) ) - lastPt = seg.B; - } - - isFirstShape = false; - } - - if( lastPt != firstPt && !addSegment( lastPt, firstPt ) ) - { - ReportMessage( wxString::Format( - wxT( "** Failed to close wire at %d, %d -> %d, %d **\n" ), lastPt.x, - lastPt.y, firstPt.x, firstPt.y ) ); - - return false; - } - } - catch( const Standard_Failure& e ) - { - ReportMessage( wxString::Format( wxT( "makeWireFromChain: OCC exception: %s\n" ), - e.GetMessageString() ) ); - return false; - } - - return true; - }; - - auto tryMakeWire = [&makeWireFromChain, - &aZposition]( const SHAPE_LINE_CHAIN& aContour ) -> TopoDS_Wire + auto tryMakeWire = [this, &aZposition, + &aOrigin]( const SHAPE_LINE_CHAIN& aContour ) -> TopoDS_Wire { TopoDS_Wire wire; BRepLib_MakeWire mkWire; - makeWireFromChain( mkWire, aContour ); + makeWireFromChain( mkWire, aContour, m_mergeOCCMaxDist, aZposition, aOrigin ); if( mkWire.IsDone() ) { @@ -1637,25 +1597,23 @@ bool STEP_PCB_MODEL::MakeShapes( std::vector<TopoDS_Shape>& aShapes, const SHAPE { try { - TopoDS_Wire wire; + TopoDS_Wire wire = tryMakeWire( polygon[contId] ); - // Try to approximate the polygon with arcs first - if( aConvertToArcs ) - wire = tryMakeWire( approximateLineChainWithArcs( polygon[contId] ) ); - - // Fall back to original shape - if( wire.IsNull() ) + if( aConvertToArcs && wire.IsNull() ) { - wire = tryMakeWire( polygon[contId] ); + ReportMessage( wxString::Format( _( "Using non-simplified polygon.\n" ) ) ); - if( aConvertToArcs && !wire.IsNull() ) - ReportMessage( wxString::Format( _( "Using non-simplified polygon.\n" ) ) ); + // Fall back to original shape + wire = tryMakeWire( fallbackPoly.CPolygon( polyId )[contId] ); } if( contId == 0 ) // Outline { if( !wire.IsNull() ) { + if( basePlane.Axis().Direction().Z() < 0 ) + wire.Reverse(); + mkFace = BRepBuilderAPI_MakeFace( basePlane, wire ); } else @@ -1673,7 +1631,8 @@ bool STEP_PCB_MODEL::MakeShapes( std::vector<TopoDS_Shape>& aShapes, const SHAPE { if( !wire.IsNull() ) { - wire.Reverse(); + if( basePlane.Axis().Direction().Z() > 0 ) + wire.Reverse(); mkFace.Add( wire ); } @@ -1698,26 +1657,38 @@ bool STEP_PCB_MODEL::MakeShapes( std::vector<TopoDS_Shape>& aShapes, const SHAPE if( mkFace.IsDone() ) { + TopoDS_Shape faceShape = mkFace.Shape(); + + wxString fn = wxString( "S:\\SProjects\\KiBugs\\step\\kicad-step-holes-bug\\kicad-step-" + "holes-bug\\f2_" ) + << "_shape_" << aPolySet.Centre().x << "_" << aPolySet.Centre().y + << ".brep"; + + wxFFileOutputStream ffStream( fn ); + wxStdOutputStream stdStream( ffStream ); + + BRepTools::Write( faceShape, stdStream, false, false, + TopTools_FormatVersion_VERSION_1 ); + if( aThickness != 0.0 ) { - TopoDS_Shape prism = BRepPrimAPI_MakePrism( mkFace, gp_Vec( 0, 0, aThickness ) ); + TopoDS_Shape prism = BRepPrimAPI_MakePrism( faceShape, gp_Vec( 0, 0, aThickness ) ); aShapes.push_back( prism ); if( prism.IsNull() ) { - ReportMessage( wxT( "Failed to create a prismatic shape\n" ) ); + ReportMessage( _( "Failed to create a prismatic shape\n" ) ); return false; } } else { - aShapes.push_back( mkFace ); + aShapes.push_back( faceShape ); } } else { - wxASSERT( false ); - return false; + ReportMessage( wxString::Format( _( "** Face skipped **\n" ) ) ); } } @@ -1725,6 +1696,52 @@ bool STEP_PCB_MODEL::MakeShapes( std::vector<TopoDS_Shape>& aShapes, const SHAPE } +// These colors are based on 3D viewer's colors and are different to "gbrjobColors" +static std::vector<FAB_LAYER_COLOR> s_soldermaskColors = { + { NotSpecifiedPrm(), wxColor( 20, 51, 36 ) }, // Not specified, not in .gbrjob file + { _HKI( "Green" ), wxColor( 20, 51, 36 ) }, // used in .gbrjob file + { _HKI( "Red" ), wxColor( 181, 19, 21 ) }, // used in .gbrjob file + { _HKI( "Blue" ), wxColor( 2, 59, 162 ) }, // used in .gbrjob file + { _HKI( "Purple" ), wxColor( 32, 2, 53 ) }, // used in .gbrjob file + { _HKI( "Black" ), wxColor( 11, 11, 11 ) }, // used in .gbrjob file + { _HKI( "White" ), wxColor( 245, 245, 245 ) }, // used in .gbrjob file + { _HKI( "Yellow" ), wxColor( 194, 195, 0 ) }, // used in .gbrjob file + { _HKI( "User defined" ), wxColor( 128, 128, 128 ) } // Free; the name is a dummy name here +}; + + +static bool colorFromStackup( BOARD_STACKUP_ITEM_TYPE aType, const wxString& aColorStr, + COLOR4D& aColorOut ) +{ + if( !IsPrmSpecified( aColorStr ) ) + return false; + + if( aColorStr.StartsWith( wxT( "#" ) ) ) // User defined color + { + aColorOut = COLOR4D( aColorStr ); + return true; + } + else + { + const std::vector<FAB_LAYER_COLOR>& colors = + ( aType == BS_ITEM_TYPE_SOLDERMASK || aType == BS_ITEM_TYPE_SILKSCREEN ) + ? s_soldermaskColors + : GetStandardColors( aType ); + + for( const FAB_LAYER_COLOR& fabColor : colors ) + { + if( fabColor.GetName() == aColorStr ) + { + aColorOut = fabColor.GetColor( aType ); + return true; + } + } + } + + return false; +} + + bool STEP_PCB_MODEL::CreatePCB( SHAPE_POLY_SET& aOutline, VECTOR2D aOrigin, bool aPushBoardBody ) { if( m_hasPCB ) @@ -1735,7 +1752,9 @@ bool STEP_PCB_MODEL::CreatePCB( SHAPE_POLY_SET& aOutline, VECTOR2D aOrigin, bool return true; } - Handle( XCAFDoc_ColorTool ) colorTool = XCAFDoc_DocumentTool::ColorTool( m_doc->Main() ); + Handle( XCAFDoc_VisMaterialTool ) visMatTool = + XCAFDoc_DocumentTool::VisMaterialTool( m_doc->Main() ); + m_hasPCB = true; // whether or not operations fail we note that CreatePCB has been invoked // Support for more than one main outline (more than one board) @@ -1898,18 +1917,62 @@ bool STEP_PCB_MODEL::CreatePCB( SHAPE_POLY_SET& aOutline, VECTOR2D aOrigin, bool buildBSB( m_copperCutouts, bsbHoles ); subtractShapes( _( "pads" ), m_board_copper_pads, m_copperCutouts, bsbHoles ); - subtractShapes( _( "tracks" ), m_board_copper_tracks, m_copperCutouts, bsbHoles ); - subtractShapes( _( "zones" ), m_board_copper_zones, m_copperCutouts, bsbHoles ); + subtractShapes( _( "vias" ), m_board_copper_vias, m_copperCutouts, bsbHoles ); + } + + if( m_fuseShapes ) + { + ReportMessage( wxT( "Fusing shapes\n" ) ); + + TopTools_ListOfShape shapesToFuse; + + for( TopoDS_Shape& shape : m_board_copper ) + shapesToFuse.Append( shape ); + + for( TopoDS_Shape& shape : m_board_copper_pads ) + shapesToFuse.Append( shape ); + + for( TopoDS_Shape& shape : m_board_copper_vias ) + shapesToFuse.Append( shape ); + + TopoDS_Shape fusedShape = fuseShapesOrCompound( shapesToFuse ); + + if( !fusedShape.IsNull() ) + { + m_board_copper_fused.emplace_back( fusedShape ); + + m_board_copper.clear(); + m_board_copper_pads.clear(); + m_board_copper_vias.clear(); + } } // push the board to the data structure ReportMessage( wxT( "\nGenerate board full shape.\n" ) ); - auto pushToAssembly = [&]( std::vector<TopoDS_Shape>& aShapesList, Quantity_Color aColor, - const wxString& aShapeName ) + // AddComponent adds a label that has a reference (not a parent/child relation) to the real + // label. We need to extract that real label to name it for the STEP output cleanly + // Why are we trying to name the bare board? Because CAD tools like SolidWorks do fun things + // like "deduplicate" imported STEPs by swapping STEP assembly components with already + // identically named assemblies. So we want to avoid having the PCB be generally defaulted + // to "Component" or "Assembly". + + auto pushToAssembly = [&]( std::vector<TopoDS_Shape>& aShapesList, Quantity_ColorRGBA aColor, + const TDF_Label& aVisMatLabel, const wxString& aShapeName, + bool aCompound ) { + if( aShapesList.empty() ) + return; + + std::vector<TopoDS_Shape> newList; + + if( aCompound ) + newList.emplace_back( makeCompound( aShapesList ) ); + else + newList = aShapesList; + int i = 1; - for( TopoDS_Shape& shape : aShapesList ) + for( TopoDS_Shape& shape : newList ) { Handle( TDataStd_TreeNode ) node; @@ -1918,16 +1981,18 @@ bool STEP_PCB_MODEL::CreatePCB( SHAPE_POLY_SET& aOutline, VECTOR2D aOrigin, bool m_pcb_labels.push_back( lbl ); if( m_pcb_labels.back().IsNull() ) - break; + return; lbl.FindAttribute( XCAFDoc::ShapeRefGUID(), node ); TDF_Label shpLbl = node->Father()->Label(); if( !shpLbl.IsNull() ) { - colorTool->SetColor( shpLbl, aColor, XCAFDoc_ColorSurf ); + if( visMatTool && !aVisMatLabel.IsNull() ) + visMatTool->SetShapeMaterial( shpLbl, aVisMatLabel ); + wxString shapeName; - if( aShapesList.size() > 1 ) + if( newList.size() > 1 ) { shapeName = wxString::Format( wxT( "%s_%s_%d" ), m_pcbName, aShapeName, i ); } @@ -1945,110 +2010,69 @@ bool STEP_PCB_MODEL::CreatePCB( SHAPE_POLY_SET& aOutline, VECTOR2D aOrigin, bool } }; - // AddComponent adds a label that has a reference (not a parent/child relation) to the real - // label. We need to extract that real label to name it for the STEP output cleanly - // Why are we trying to name the bare board? Because CAD tools like SolidWorks do fun things - // like "deduplicate" imported STEPs by swapping STEP assembly components with already - // identically named assemblies. So we want to avoid having the PCB be generally defaulted - // to "Component" or "Assembly". - - // Init colors for the board body and the copper items (if any) - Quantity_Color board_color( m_boardColor[0], m_boardColor[1], m_boardColor[2], - Quantity_TOC_RGB ); - Quantity_Color copper_color( m_copperColor[0], m_copperColor[1], m_copperColor[2], - Quantity_TOC_RGB ); - - if( m_fuseShapes ) + auto makeMaterial = [&]( const TCollection_AsciiString& aName, + const Quantity_ColorRGBA& aBaseColor, double aMetallic, + double aRoughness ) -> TDF_Label { - ReportMessage( wxT( "Fusing shapes\n" ) ); + Handle( XCAFDoc_VisMaterial ) vismat = new XCAFDoc_VisMaterial; + XCAFDoc_VisMaterialPBR pbr; + pbr.BaseColor = aBaseColor; + pbr.Metallic = aMetallic; + pbr.Roughness = aRoughness; + vismat->SetPbrMaterial( pbr ); + return visMatTool->AddMaterial( vismat, aName ); + }; - auto iterateCopperItems = [this]( std::function<void( TopoDS_Shape& )> aFn ) + // Init colors for the board items + Quantity_ColorRGBA copper_color( m_copperColor[0], m_copperColor[1], m_copperColor[2], 1.0 ); + Quantity_ColorRGBA pad_color( m_padColor[0], m_padColor[1], m_padColor[2], 1.0 ); + + Quantity_ColorRGBA board_color( 0.3f, 0.3f, 0.3f, 1.0f ); + Quantity_ColorRGBA silk_color( 1.0f, 1.0f, 1.0f, 0.9f ); + Quantity_ColorRGBA mask_color( 0.08f, 0.2f, 0.14f, 0.83f ); + + // Get colors from stackup + for( const BOARD_STACKUP_ITEM* item : m_stackup.GetList() ) + { + COLOR4D col; + + if( !colorFromStackup( item->GetType(), item->GetColor(), col ) ) + continue; + + if( item->GetBrdLayerId() == F_Mask || item->GetBrdLayerId() == B_Mask ) { - for( TopoDS_Shape& shape : m_board_copper_tracks ) - aFn( shape ); - - for( TopoDS_Shape& shape : m_board_copper_zones ) - aFn( shape ); - - for( TopoDS_Shape& shape : m_board_copper_pads ) - aFn( shape ); - }; - - BRepAlgoAPI_Fuse mkFuse; - TopTools_ListOfShape shapeArguments, shapeTools; - - iterateCopperItems( - [&]( TopoDS_Shape& sh ) - { - if( sh.IsNull() ) - return; - - if( shapeArguments.IsEmpty() ) - shapeArguments.Append( sh ); - else - shapeTools.Append( sh ); - } ); - - mkFuse.SetRunParallel( true ); - mkFuse.SetToFillHistory( false ); - mkFuse.SetArguments( shapeArguments ); - mkFuse.SetTools( shapeTools ); - mkFuse.Build(); - - if( mkFuse.HasErrors() || mkFuse.HasWarnings() ) - { - ReportMessage( _( "** Got problems while fusing shapes **\n" ) ); - - if( mkFuse.HasErrors() ) - { - ReportMessage( _( "Errors:\n" ) ); - mkFuse.DumpErrors( std::cout ); - } - - if( mkFuse.HasWarnings() ) - { - ReportMessage( _( "Warnings:\n" ) ); - mkFuse.DumpWarnings( std::cout ); - } - - std::cout << "\n"; + col.Darken( 0.2 ); + mask_color.SetValues( col.r, col.g, col.b, col.a ); } - if( mkFuse.IsDone() ) - { - ReportMessage( wxT( "Removing extra edges/faces\n" ) ); + if( item->GetBrdLayerId() == F_SilkS || item->GetBrdLayerId() == B_SilkS ) + silk_color.SetValues( col.r, col.g, col.b, col.a ); - TopoDS_Shape fusedShape = mkFuse.Shape(); - - ShapeUpgrade_UnifySameDomain unify( fusedShape, true, true, false ); - unify.History() = nullptr; - unify.Build(); - - TopoDS_Shape unifiedShapes = unify.Shape(); - - if( !unifiedShapes.IsNull() ) - { - m_board_copper_fused.emplace_back( unifiedShapes ); - } - else - { - ReportMessage( _( "** ShapeUpgrade_UnifySameDomain produced a null shape **\n" ) ); - m_board_copper_fused.emplace_back( fusedShape ); - } - - m_board_copper_tracks.clear(); - m_board_copper_zones.clear(); - m_board_copper_pads.clear(); - } + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC && item->GetTypeName() == KEY_CORE ) + board_color.SetValues( col.r, col.g, col.b, col.a ); } - pushToAssembly( m_board_copper_tracks, copper_color, "track" ); - pushToAssembly( m_board_copper_zones, copper_color, "zone" ); - pushToAssembly( m_board_copper_pads, copper_color, "pad" ); - pushToAssembly( m_board_copper_fused, copper_color, "copper" ); + if( !m_enabledLayers.Contains( F_Mask ) && !m_enabledLayers.Contains( B_Mask ) ) + { + board_color = mask_color; + board_color.SetAlpha( 1.0 ); + } + + TDF_Label mask_mat = makeMaterial( "soldermask", mask_color, 0.0, 0.6 ); + TDF_Label silk_mat = makeMaterial( "silkscreen", silk_color, 0.0, 0.9 ); + TDF_Label copper_mat = makeMaterial( "copper", copper_color, 1.0, 0.4 ); + TDF_Label pad_mat = makeMaterial( "pad", pad_color, 1.0, 0.4 ); + TDF_Label board_mat = makeMaterial( "board", board_color, 0.0, 0.8 ); + + pushToAssembly( m_board_copper, copper_color, copper_mat, "copper", true ); + pushToAssembly( m_board_copper_pads, pad_color, pad_mat, "pad", true ); + pushToAssembly( m_board_copper_vias, copper_color, copper_mat, "via", true ); + pushToAssembly( m_board_copper_fused, copper_color, copper_mat, "copper", true ); + pushToAssembly( m_board_silkscreen, silk_color, silk_mat, "silkscreen", true ); + pushToAssembly( m_board_soldermask, mask_color, mask_mat, "soldermask", true ); if( aPushBoardBody ) - pushToAssembly( m_board_outlines, board_color, "PCB" ); + pushToAssembly( m_board_outlines, board_color, board_mat, "PCB", false ); #if( defined OCC_VERSION_HEX ) && ( OCC_VERSION_HEX > 0x070101 ) m_assy->UpdateAssemblies(); @@ -2830,8 +2854,8 @@ bool STEP_PCB_MODEL::WriteGLTF( const wxString& aFileName ) // These deflection values basically affect the accuracy of the mesh generated, a tighter // deflection will result in larger meshes // We could make this a tunable parameter, but for now fix it - const Standard_Real linearDeflection = 0.01; - const Standard_Real angularDeflection = 0.5; + const Standard_Real linearDeflection = 0.14; + const Standard_Real angularDeflection = DEG2RAD( 30.0 ); BRepMesh_IncrementalMesh mesh( shape, linearDeflection, Standard_False, angularDeflection, Standard_True ); } diff --git a/pcbnew/exporters/step/step_pcb_model.h b/pcbnew/exporters/step/step_pcb_model.h index 5bd3a8896b..7941ec1c60 100644 --- a/pcbnew/exporters/step/step_pcb_model.h +++ b/pcbnew/exporters/step/step_pcb_model.h @@ -81,36 +81,34 @@ public: STEP_PCB_MODEL( const wxString& aPcbName ); virtual ~STEP_PCB_MODEL(); - // add a pad hole or slot (must be in final position) - bool AddPadHole( const PAD* aPad, const VECTOR2D& aOrigin ); - // add a pad shape (must be in final position) bool AddPadShape( const PAD* aPad, const VECTOR2D& aOrigin, bool aVia ); - // add a via shape - bool AddViaShape( const PCB_VIA* aVia, const VECTOR2D& aOrigin ); + // add a pad hole or slot (must be in final position) + bool AddHole( const SHAPE_SEGMENT& aShape, int aPlatingThickness, PCB_LAYER_ID aLayerTop, + PCB_LAYER_ID aLayerBot, bool aVia, const VECTOR2D& aOrigin ); - // add a track segment shape (do not use it for track arcs) - bool AddTrackSegment( const PCB_TRACK* aTrack, const VECTOR2D& aOrigin ); + // add a plated hole shape (without the hole) + bool AddBarrel( const SHAPE_SEGMENT& aShape, PCB_LAYER_ID aLayerTop, PCB_LAYER_ID aLayerBot, + bool aVia, const VECTOR2D& aOrigin ); - // add a set of polygons (must be in final position) on top or bottom of the board as copper - bool AddCopperPolygonShapes( const SHAPE_POLY_SET* aPolyShapes, PCB_LAYER_ID aLayer, - const VECTOR2D& aOrigin, bool aTrack ); + // add a set of polygons (must be in final position) + bool AddPolygonShapes( const SHAPE_POLY_SET* aPolyShapes, PCB_LAYER_ID aLayer, + const VECTOR2D& aOrigin ); // add a component at the given position and orientation bool AddComponent( const std::string& aFileName, const std::string& aRefDes, bool aBottom, VECTOR2D aPosition, double aRotation, VECTOR3D aOffset, VECTOR3D aOrientation, VECTOR3D aScale, bool aSubstituteModels = true ); - void SetBoardColor( double r, double g, double b ); void SetCopperColor( double r, double g, double b ); + void SetPadColor( double r, double g, double b ); void SetEnabledLayers( const LSET& aLayers ); - void SetFuseShapes( bool aValue ); - + void SetSimplifyShapes( bool aValue ); + void SetAddVisMaterials( bool aValue ); void SetStackup( const BOARD_STACKUP& aStackup ); - void SetNetFilter( const wxString& aFilter ); // Set the max distance (in mm) to consider 2 points have the same coordinates @@ -123,11 +121,11 @@ public: bool CreatePCB( SHAPE_POLY_SET& aOutline, VECTOR2D aOrigin, bool aPushBoardBody ); /** - * Convert a SHAPE_POLY_SET to TopoDS_Shape's (polygonal vertical prisms) + * Convert a SHAPE_POLY_SET to TopoDS_Shape's (polygonal vertical prisms, or flat faces) * @param aShapes is the TopoDS_Shape list to append to * @param aPolySet is a polygon set * @param aConvertToArcs set to approximate with arcs - * @param aThickness is the height of the created prism + * @param aThickness is the height of the created prism, or 0.0: flat face pointing up, -0.0: down. * @param aOrigin is the origin of the coordinates * @return true if success */ @@ -136,27 +134,13 @@ public: const VECTOR2D& aOrigin ); /** - * Convert a SHAPE_LINE_CHAIN containing only one 360 deg arc to a TopoDS_Shape - * ( vertical cylinder) - * it is a specialized version of MakeShape() - * @param aShape is the TopoDS_Shape to initialize (must be empty) - * @param aChain is a closed SHAPE_LINE_CHAIN, image of a circle: containing one 360 deg arc - * @param aThickness is the height of the created cylinder - * @param aOrigin is the origin of the coordinates - * @return true if success - */ - bool MakeShapeAsCylinder( TopoDS_Shape& aShape, const SHAPE_LINE_CHAIN& aChain, - double aThickness, double aZposition, const VECTOR2D& aOrigin ); - - /** - * Convert a SHAPE_LINE_CHAIN containing only one 360 deg arc to a TopoDS_Shape - * ( vertical cylinder) - * it is a specialized version of MakeShape() + * Make a segment shape based on start and end point. If they're too close, make a cylinder. + * It is a specialized version of MakeShape() * @param aShape is the TopoDS_Shape to initialize (must be empty) * @param aStartPoint is the start point of the segment * @param aEndPoint is the end point of the segment * @param aWidth is the width of the segment - * @param aThickness is the height of the created cylinder + * @param aThickness is the height of the created segment, or 0.0: flat face pointing up, -0.0: down. * @param aOrigin is the origin of the coordinates * @return true if success */ @@ -237,15 +221,15 @@ private: Handle( XCAFDoc_ShapeTool ) m_assy; TDF_Label m_assy_label; bool m_hasPCB; // set true if CreatePCB() has been invoked + bool m_simplifyShapes; // convert parts of outlines to arcs where possible bool m_fuseShapes; // fuse geometry together - int m_platingThickness; // plating thickness for TH pads/vias std::vector<TDF_Label> m_pcb_labels; // labels for the PCB model (one by main outline) MODEL_MAP m_models; // map of file names to model labels int m_components; // number of successfully loaded components; double m_precision; // model (length unit) numeric precision double m_angleprec; // angle numeric precision - double m_boardColor[3]; // board body, RGB values double m_copperColor[3]; // copper, RGB values + double m_padColor[3]; // pads, RGB values BOARD_STACKUP m_stackup; // board stackup LSET m_enabledLayers; // a set of layers enabled for export wxString m_netFilter; // remove nets not matching this wildcard @@ -260,10 +244,12 @@ private: // Main outlines (more than one board) std::vector<TopoDS_Shape> m_board_outlines; - std::vector<TopoDS_Shape> m_board_copper_zones; - std::vector<TopoDS_Shape> m_board_copper_tracks; + std::vector<TopoDS_Shape> m_board_copper; std::vector<TopoDS_Shape> m_board_copper_pads; + std::vector<TopoDS_Shape> m_board_copper_vias; std::vector<TopoDS_Shape> m_board_copper_fused; + std::vector<TopoDS_Shape> m_board_silkscreen; + std::vector<TopoDS_Shape> m_board_soldermask; // Data for pads std::map<wxString, std::pair<gp_Pnt, TopoDS_Shape>> m_pad_points; diff --git a/pcbnew/menubar_pcb_editor.cpp b/pcbnew/menubar_pcb_editor.cpp index 5676608bd9..c81f8f3a73 100644 --- a/pcbnew/menubar_pcb_editor.cpp +++ b/pcbnew/menubar_pcb_editor.cpp @@ -133,7 +133,8 @@ void PCB_EDIT_FRAME::doReCreateMenuBar() ID_GEN_EXPORT_FILE_VRML, BITMAPS::export3d ); submenuExport->Add( _( "IDFv3..." ), _( "Export IDF 3D board representation" ), ID_GEN_EXPORT_FILE_IDF3, BITMAPS::export_idf ); - submenuExport->Add( _( "STEP / BREP / XAO..." ), _( "Export STEP / BREP / XAO 3D board representation" ), + submenuExport->Add( _( "STEP / GLB / BREP / XAO..." ), + _( "Export STEP / GLB / BREP / XAO 3D board representation" ), ID_GEN_EXPORT_FILE_STEP, BITMAPS::export_step ); submenuExport->Add( _( "SVG..." ), _( "Export SVG board representation" ), ID_GEN_PLOT_SVG, BITMAPS::export_svg ); diff --git a/pcbnew/pcbnew_jobs_handler.cpp b/pcbnew/pcbnew_jobs_handler.cpp index 9c858c47ad..a7ca7cfc38 100644 --- a/pcbnew/pcbnew_jobs_handler.cpp +++ b/pcbnew/pcbnew_jobs_handler.cpp @@ -195,8 +195,11 @@ int PCBNEW_JOBS_HANDLER::JobExportStep( JOB* aJob ) params.m_exportBoardBody = aStepJob->m_exportBoardBody; params.m_exportComponents = aStepJob->m_exportComponents; params.m_exportTracksVias = aStepJob->m_exportTracks; + params.m_exportPads = aStepJob->m_exportPads; params.m_exportZones = aStepJob->m_exportZones; params.m_exportInnerCopper = aStepJob->m_exportInnerCopper; + params.m_exportSilkscreen = aStepJob->m_exportSilkscreen; + params.m_exportSoldermask = aStepJob->m_exportSoldermask; params.m_fuseShapes = aStepJob->m_fuseShapes; params.m_includeUnspecified = aStepJob->m_includeUnspecified; params.m_includeDNP = aStepJob->m_includeDNP;