7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-19 18:51:40 +00:00

ADDED: Component filter for STEP export

Also refactor to avoid duplication of settings

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18290
This commit is contained in:
Jon Evans 2024-08-03 14:41:24 -04:00
parent 4091eda7dc
commit 7349d79096
10 changed files with 729 additions and 356 deletions

View File

@ -21,35 +21,40 @@
#include <jobs/job_export_pcb_3d.h>
wxString EXPORTER_STEP_PARAMS::GetDefaultExportExtension() const
{
switch( m_Format )
{
case EXPORTER_STEP_PARAMS::FORMAT::STEP: return wxS( "step" );
case EXPORTER_STEP_PARAMS::FORMAT::BREP: return wxS( "brep" );
case EXPORTER_STEP_PARAMS::FORMAT::XAO: return wxS( "xao" );
case EXPORTER_STEP_PARAMS::FORMAT::GLB: return wxS( "glb" );
default: return wxEmptyString; // shouldn't happen
}
}
wxString EXPORTER_STEP_PARAMS::GetFormatName() const
{
switch( m_Format )
{
// honestly these names shouldn't be translated since they are mostly industry standard acronyms
case EXPORTER_STEP_PARAMS::FORMAT::STEP: return wxS( "STEP" );
case EXPORTER_STEP_PARAMS::FORMAT::BREP: return wxS( "BREP" );
case EXPORTER_STEP_PARAMS::FORMAT::XAO: return wxS( "XAO" );
case EXPORTER_STEP_PARAMS::FORMAT::GLB: return wxS( "Binary GLTF" );
default: return wxEmptyString; // shouldn't happen
}
}
JOB_EXPORT_PCB_3D::JOB_EXPORT_PCB_3D( bool aIsCli ) :
JOB( "3d", aIsCli ),
m_overwrite( false ),
m_useGridOrigin( false ),
m_useDrillOrigin( false ),
m_hasUserOrigin( false ),
m_boardOnly( false ),
m_includeUnspecified( false ),
m_includeDNP( false ),
m_substModels( false ),
m_optimizeStep( false ),
m_filename(),
m_outputFile(),
m_xOrigin( 0.0 ),
m_yOrigin( 0.0 ),
// max dist to chain 2 items (lines or curves) to build the board outlines
m_BoardOutlinesChainingEpsilon( 0.01 ), // 0.01 mm is a good value
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 ),
m_vrmlModelDir( wxEmptyString ),
m_vrmlRelativePaths( false )
{
}
}

View File

@ -22,9 +22,79 @@
#define JOB_EXPORT_STEP_H
#include <kicommon.h>
#include <math/vector2d.h>
#include <wx/string.h>
#include "job.h"
// Default value to chain 2 shapes when creating the board outlines
// from shapes on Edges.Cut layer
#define BOARD_DEFAULT_CHAINING_EPSILON 0.01
class KICOMMON_API EXPORTER_STEP_PARAMS
{
public:
EXPORTER_STEP_PARAMS() :
m_Origin(),
m_Overwrite( false ),
m_UseGridOrigin( false ),
m_UseDrillOrigin( false ),
m_IncludeUnspecified( true ),
m_IncludeDNP( true ),
m_SubstModels( true ),
m_BoardOutlinesChainingEpsilon( BOARD_DEFAULT_CHAINING_EPSILON ),
m_BoardOnly( false ),
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 )
{};
enum class FORMAT
{
STEP,
BREP,
XAO,
GLB
};
wxString m_OutputFile;
wxString m_NetFilter;
wxString m_ComponentFilter;
VECTOR2D m_Origin;
bool m_Overwrite;
bool m_UseGridOrigin;
bool m_UseDrillOrigin;
bool m_IncludeUnspecified;
bool m_IncludeDNP;
bool m_SubstModels;
double m_BoardOutlinesChainingEpsilon;
bool m_BoardOnly;
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;
wxString GetDefaultExportExtension() const;
wxString GetFormatName() const;
};
class KICOMMON_API JOB_EXPORT_PCB_3D : public JOB
{
public:
@ -48,32 +118,14 @@ public:
TENTHS // inches
};
bool m_overwrite;
bool m_useGridOrigin;
bool m_useDrillOrigin;
bool m_hasUserOrigin;
bool m_boardOnly;
bool m_includeUnspecified;
bool m_includeDNP;
bool m_substModels;
bool m_optimizeStep;
wxString m_netFilter;
wxString m_filename;
wxString m_outputFile;
double m_xOrigin;
double m_yOrigin;
double m_BoardOutlinesChainingEpsilon;
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;
/// Despite the name; also used for other formats
EXPORTER_STEP_PARAMS m_params;
VRML_UNITS m_vrmlUnits;
wxString m_vrmlModelDir;
bool m_vrmlRelativePaths;

View File

@ -53,6 +53,7 @@
#define ARG_VRML_UNITS "--units"
#define ARG_VRML_MODELS_DIR "--models-dir"
#define ARG_VRML_MODELS_RELATIVE "--models-relative"
#define ARG_COMPONENT_FILTER "--component-filter"
#define REGEX_QUANTITY "([\\s]*[+-]?[\\d]*[.]?[\\d]*)"
#define REGEX_DELIMITER "(?:[\\s]*x)"
@ -120,6 +121,12 @@ CLI::PCB_EXPORT_3D_COMMAND::PCB_EXPORT_3D_COMMAND( const std::string& aNa
.help( UTF8STDSTR( _( "Exclude 3D models for components" ) ) )
.flag();
m_argParser.add_argument( ARG_COMPONENT_FILTER )
.help( UTF8STDSTR( _( "Only include component 3D models matching this list of "
"reference designators (comma-separated, wildcards supported)"
) ) )
.default_value( std::string() );
m_argParser.add_argument( ARG_INCLUDE_TRACKS )
.help( UTF8STDSTR( _( "Export tracks and vias" ) ) )
.flag();
@ -196,37 +203,42 @@ CLI::PCB_EXPORT_3D_COMMAND::PCB_EXPORT_3D_COMMAND( const std::string& aNa
int CLI::PCB_EXPORT_3D_COMMAND::doPerform( KIWAY& aKiway )
{
std::unique_ptr<JOB_EXPORT_PCB_3D> step( new JOB_EXPORT_PCB_3D( true ) );
EXPORTER_STEP_PARAMS& params = step->m_params;
if( m_format == JOB_EXPORT_PCB_3D::FORMAT::STEP || m_format == JOB_EXPORT_PCB_3D::FORMAT::BREP
|| m_format == JOB_EXPORT_PCB_3D::FORMAT::XAO
|| m_format == JOB_EXPORT_PCB_3D::FORMAT::GLB )
{
step->m_useDrillOrigin = m_argParser.get<bool>( ARG_DRILL_ORIGIN );
step->m_useGridOrigin = m_argParser.get<bool>( ARG_GRID_ORIGIN );
step->m_substModels = m_argParser.get<bool>( ARG_SUBST_MODELS );
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() );
params.m_UseDrillOrigin = m_argParser.get<bool>( ARG_DRILL_ORIGIN );
params.m_UseGridOrigin = m_argParser.get<bool>( ARG_GRID_ORIGIN );
params.m_SubstModels = m_argParser.get<bool>( ARG_SUBST_MODELS );
params.m_ExportBoardBody = !m_argParser.get<bool>( ARG_NO_BOARD_BODY );
params.m_ExportComponents = !m_argParser.get<bool>( ARG_NO_COMPONENTS );
params.m_ExportTracksVias = m_argParser.get<bool>( ARG_INCLUDE_TRACKS );
params.m_ExportPads = m_argParser.get<bool>( ARG_INCLUDE_PADS );
params.m_ExportZones = m_argParser.get<bool>( ARG_INCLUDE_ZONES );
params.m_ExportInnerCopper = m_argParser.get<bool>( ARG_INCLUDE_INNER_COPPER );
params.m_ExportSilkscreen = m_argParser.get<bool>( ARG_INCLUDE_SILKSCREEN );
params.m_ExportSoldermask = m_argParser.get<bool>( ARG_INCLUDE_SOLDERMASK );
params.m_FuseShapes = m_argParser.get<bool>( ARG_FUSE_SHAPES );
params.m_BoardOnly = m_argParser.get<bool>( ARG_BOARD_ONLY );
params.m_NetFilter = From_UTF8( m_argParser.get<std::string>( ARG_NET_FILTER ).c_str() );
params.m_ComponentFilter =
From_UTF8( m_argParser.get<std::string>( ARG_COMPONENT_FILTER ).c_str() );
}
if( m_format == JOB_EXPORT_PCB_3D::FORMAT::STEP )
{
step->m_optimizeStep = !m_argParser.get<bool>( ARG_NO_OPTIMIZE_STEP );
params.m_OptimizeStep = !m_argParser.get<bool>( ARG_NO_OPTIMIZE_STEP );
}
step->m_includeUnspecified = !m_argParser.get<bool>( ARG_NO_UNSPECIFIED );
step->m_includeDNP = !m_argParser.get<bool>( ARG_NO_DNP );
step->m_overwrite = m_argParser.get<bool>( ARG_FORCE );
params.m_IncludeUnspecified = !m_argParser.get<bool>( ARG_NO_UNSPECIFIED );
params.m_IncludeDNP = !m_argParser.get<bool>( ARG_NO_DNP );
params.m_Overwrite = m_argParser.get<bool>( ARG_FORCE );
params.m_OutputFile = m_argOutput;
step->m_filename = m_argInput;
step->m_outputFile = m_argOutput;
step->m_format = m_format;
step->SetVarOverrides( m_argDefineVars );
@ -283,13 +295,13 @@ int CLI::PCB_EXPORT_3D_COMMAND::doPerform( KIWAY& aKiway )
std::smatch sm;
std::string str( userOrigin.ToUTF8() );
std::regex_search( str, sm, re_pattern );
step->m_xOrigin = atof( sm.str( 1 ).c_str() );
step->m_yOrigin = atof( sm.str( 2 ).c_str() );
step->m_params.m_Origin.x = atof( sm.str( 1 ).c_str() );
step->m_params.m_Origin.y = atof( sm.str( 2 ).c_str() );
// Default unit for m_xOrigin and m_yOrigin is mm.
// Convert in to board units. If the value is given in inches, it will be converted later
step->m_xOrigin = pcbIUScale.mmToIU( step->m_xOrigin );
step->m_yOrigin = pcbIUScale.mmToIU( step->m_yOrigin );
step->m_params.m_Origin.x = pcbIUScale.mmToIU( step->m_params.m_Origin.x );
step->m_params.m_Origin.y = pcbIUScale.mmToIU( step->m_params.m_Origin.y );
std::string tunit( sm[3] );
@ -305,8 +317,7 @@ int CLI::PCB_EXPORT_3D_COMMAND::doPerform( KIWAY& aKiway )
// only in, inch and mm are valid:
if( !tunit.compare( "in" ) || !tunit.compare( "inch" ) )
{
step->m_xOrigin *= 25.4;
step->m_yOrigin *= 25.4;
step->m_params.m_Origin *= 25.4;
}
else if( tunit.compare( "mm" ) )
{
@ -331,7 +342,7 @@ int CLI::PCB_EXPORT_3D_COMMAND::doPerform( KIWAY& aKiway )
std::smatch sm;
std::string str( minDistance.ToUTF8() );
std::regex_search( str, sm, re_pattern );
step->m_BoardOutlinesChainingEpsilon = atof( sm.str( 1 ).c_str() );
step->m_params.m_BoardOutlinesChainingEpsilon = atof( sm.str( 1 ).c_str() );
std::string tunit( sm[2] );
@ -339,7 +350,7 @@ int CLI::PCB_EXPORT_3D_COMMAND::doPerform( KIWAY& aKiway )
{
if( !tunit.compare( "in" ) || !tunit.compare( "inch" ) )
{
step->m_BoardOutlinesChainingEpsilon *= 25.4;
step->m_params.m_BoardOutlinesChainingEpsilon *= 25.4;
}
else if( tunit.compare( "mm" ) )
{

View File

@ -87,6 +87,7 @@ protected:
void onUpdateYPos( wxUpdateUIEvent& aEvent ) override;
void onExportButton( wxCommandEvent& aEvent ) override;
void onFormatChoice( wxCommandEvent& event ) override;
void OnComponentModeChange( wxCommandEvent& event ) override;
int GetOrgUnitsChoice() const
{
@ -126,6 +127,13 @@ protected:
}
private:
enum class COMPONENT_MODE
{
EXPORT_ALL,
EXPORT_SELECTED,
CUSTOM_FILTER
};
PCB_EDIT_FRAME* m_parent;
STEP_ORIGIN_OPTION m_origin; // The last preference for STEP origin option
double m_userOriginX; // remember last User Origin X value
@ -144,6 +152,8 @@ private:
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_componentFilter; // filter component reference designators
static COMPONENT_MODE m_componentMode;
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
@ -162,6 +172,7 @@ 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::COMPONENT_MODE DIALOG_EXPORT_STEP::m_componentMode = COMPONENT_MODE::EXPORT_ALL;
DIALOG_EXPORT_STEP::DIALOG_EXPORT_STEP( PCB_EDIT_FRAME* aParent, const wxString& aBoardPath ) :
DIALOG_EXPORT_STEP_BASE( aParent )
@ -227,6 +238,20 @@ DIALOG_EXPORT_STEP::DIALOG_EXPORT_STEP( PCB_EDIT_FRAME* aParent, const wxString&
m_cbSubstModels->SetValue( cfg->m_ExportStep.replace_models );
m_cbOverwriteFile->SetValue( cfg->m_ExportStep.overwrite_file );
m_txtComponentFilter->SetValue( m_componentFilter );
switch( m_componentMode )
{
case COMPONENT_MODE::EXPORT_ALL:
case COMPONENT_MODE::EXPORT_SELECTED:
m_txtComponentFilter->Disable();
break;
case COMPONENT_MODE::CUSTOM_FILTER:
m_txtComponentFilter->Enable();
break;
}
m_STEP_OrgUnitChoice->SetSelection( m_originUnits );
wxString tmpStr;
tmpStr << m_userOriginX;
@ -329,6 +354,14 @@ DIALOG_EXPORT_STEP::~DIALOG_EXPORT_STEP()
m_exportSilkscreen = m_cbExportSilkscreen->GetValue();
m_exportSoldermask = m_cbExportSoldermask->GetValue();
m_fuseShapes = m_cbFuseShapes->GetValue();
m_componentFilter = m_txtComponentFilter->GetValue();
if( m_rbAllComponents->GetValue() )
m_componentMode = COMPONENT_MODE::EXPORT_ALL;
else if( m_rbOnlySelected->GetValue() )
m_componentMode = COMPONENT_MODE::EXPORT_SELECTED;
else
m_componentMode = COMPONENT_MODE::CUSTOM_FILTER;
}
@ -456,6 +489,12 @@ void DIALOG_EXPORT_STEP::onFormatChoice( wxCommandEvent& event )
}
void DIALOG_EXPORT_STEP::OnComponentModeChange( wxCommandEvent& event )
{
m_txtComponentFilter->Enable( m_rbFilteredComponents->GetValue() );
}
void DIALOG_EXPORT_STEP::onExportButton( wxCommandEvent& aEvent )
{
wxString path = m_outputFileName->GetValue();
@ -479,6 +518,14 @@ void DIALOG_EXPORT_STEP::onExportButton( wxCommandEvent& aEvent )
}
m_netFilter = m_txtNetFilter->GetValue();
m_componentFilter = m_txtComponentFilter->GetValue();
if( m_rbAllComponents->GetValue() )
m_componentMode = COMPONENT_MODE::EXPORT_ALL;
else if( m_rbOnlySelected->GetValue() )
m_componentMode = COMPONENT_MODE::EXPORT_SELECTED;
else
m_componentMode = COMPONENT_MODE::CUSTOM_FILTER;
double tolerance; // default value in mm
m_toleranceLastChoice = m_choiceTolerance->GetSelection();
@ -614,6 +661,34 @@ void DIALOG_EXPORT_STEP::onExportButton( wxCommandEvent& aEvent )
dblquote ) );
}
switch( m_componentMode )
{
case COMPONENT_MODE::EXPORT_SELECTED:
{
wxArrayString components;
SELECTION& selection = m_parent->GetCurrentSelection();
std::for_each( selection.begin(), selection.end(),
[&components]( EDA_ITEM* item )
{
if( item->Type() == PCB_FOOTPRINT_T )
components.push_back( static_cast<FOOTPRINT*>( item )->GetReference() );
} );
cmdK2S.Append( wxString::Format( wxT( " --component-filter %c%s%c" ), dblquote,
wxJoin( components, ',' ), dblquote ) );
break;
}
case COMPONENT_MODE::CUSTOM_FILTER:
cmdK2S.Append( wxString::Format( wxT( " --component-filter %c%s%c" ), dblquote,
m_componentFilter, dblquote ) );
break;
default:
break;
}
switch( GetOriginOption() )
{
case STEP_ORIGIN_0:

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -64,6 +64,30 @@ DIALOG_EXPORT_STEP_BASE::DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID i
m_cbExportComponents = new wxCheckBox( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Export components"), wxDefaultPosition, wxDefaultSize, 0 );
sbGeneralOptions->Add( m_cbExportComponents, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizer51;
bSizer51 = new wxBoxSizer( wxVERTICAL );
m_rbAllComponents = new wxRadioButton( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("All components"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
m_rbAllComponents->SetValue( true );
bSizer51->Add( m_rbAllComponents, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_rbOnlySelected = new wxRadioButton( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Only selected"), wxDefaultPosition, wxDefaultSize, 0 );
m_rbOnlySelected->SetToolTip( _("Export only the component models that are selected in the PCB editor") );
bSizer51->Add( m_rbOnlySelected, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_rbFilteredComponents = new wxRadioButton( sbGeneralOptions->GetStaticBox(), wxID_ANY, _("Components matching filter:"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer51->Add( m_rbFilteredComponents, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_txtComponentFilter = new wxTextCtrl( sbGeneralOptions->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_txtComponentFilter->Enable( false );
m_txtComponentFilter->SetToolTip( _("A list of comma-selected reference designators to export (wildcards are supported)") );
bSizer51->Add( m_txtComponentFilter, 0, wxALL|wxEXPAND, 5 );
sbGeneralOptions->Add( bSizer51, 1, wxEXPAND|wxLEFT, 20 );
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.") );
@ -254,6 +278,10 @@ DIALOG_EXPORT_STEP_BASE::DIALOG_EXPORT_STEP_BASE( wxWindow* parent, wxWindowID i
// 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_rbAllComponents->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::OnComponentModeChange ), NULL, this );
m_rbOnlySelected->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::OnComponentModeChange ), NULL, this );
m_rbFilteredComponents->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::OnComponentModeChange ), NULL, this );
m_txtComponentFilter->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_EXPORT_STEP_BASE::OnComponentFilterTextClick ), 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 );
m_STEP_Yorg->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_EXPORT_STEP_BASE::onUpdateYPos ), NULL, this );
@ -265,6 +293,10 @@ 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_rbAllComponents->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::OnComponentModeChange ), NULL, this );
m_rbOnlySelected->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::OnComponentModeChange ), NULL, this );
m_rbFilteredComponents->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( DIALOG_EXPORT_STEP_BASE::OnComponentModeChange ), NULL, this );
m_txtComponentFilter->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_EXPORT_STEP_BASE::OnComponentFilterTextClick ), 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 );
m_STEP_Yorg->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_EXPORT_STEP_BASE::onUpdateYPos ), NULL, this );

View File

@ -1,34 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="17"/>
<FileVersion major="1" minor="18"/>
<object class="Project" expanded="true">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="cpp_class_decoration"></property>
<property name="cpp_disconnect_events">1</property>
<property name="cpp_event_generation">connect</property>
<property name="cpp_help_provider">none</property>
<property name="cpp_namespace"></property>
<property name="cpp_precompiled_header"></property>
<property name="cpp_use_array_enum">0</property>
<property name="cpp_use_enum">1</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">dialog_export_step_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="image_path_wrapper_function_name"></property>
<property name="indent_with_spaces"></property>
<property name="internationalize">1</property>
<property name="lua_skip_events">1</property>
<property name="lua_ui_table">UI</property>
<property name="name">dialog_export_step_base</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="php_disconnect_events">0</property>
<property name="php_disconnect_mode">source_name</property>
<property name="php_skip_events">1</property>
<property name="python_disconnect_events">0</property>
<property name="python_disconnect_mode">source_name</property>
<property name="python_image_path_wrapper_function_name"></property>
<property name="python_indent_with_spaces"></property>
<property name="python_skip_events">1</property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_array_enum">0</property>
<property name="use_enum">1</property>
<property name="use_microsoft_bom">0</property>
<property name="use_native_eol">0</property>
<object class="Dialog" expanded="true">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
@ -80,10 +82,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -142,10 +144,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -208,10 +210,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -270,10 +272,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -335,10 +337,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
@ -433,10 +435,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -498,10 +500,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -563,10 +565,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -619,6 +621,281 @@
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">20</property>
<property name="flag">wxEXPAND|wxLEFT</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="true">
<property name="minimum_size"></property>
<property name="name">bSizer51</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxRadioButton" 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">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</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">All 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_rbAllComponents</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">1</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnRadioButton">OnComponentModeChange</event>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxRadioButton" 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">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</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">Only selected</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_rbOnlySelected</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 only the component models that are selected in the PCB editor</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>
<event name="OnRadioButton">OnComponentModeChange</event>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxRadioButton" 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">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</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">Components matching filter:</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_rbFilteredComponents</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>
<event name="OnRadioButton">OnComponentModeChange</event>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" 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">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</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">0</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">0</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_txtComponentFilter</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">A list of comma-selected reference designators to export (wildcards are supported)</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"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnLeftUp">OnComponentFilterTextClick</event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
@ -628,10 +905,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -693,10 +970,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -758,10 +1035,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -823,10 +1100,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -888,10 +1165,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -953,10 +1230,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1018,10 +1295,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1083,10 +1360,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1148,10 +1425,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1210,10 +1487,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1237,7 +1514,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
@ -1275,10 +1552,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1337,10 +1614,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1425,10 +1702,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1490,10 +1767,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1555,10 +1832,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1620,10 +1897,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1715,10 +1992,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1777,10 +2054,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1843,10 +2120,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1905,10 +2182,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -1971,10 +2248,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -2033,10 +2310,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -2115,10 +2392,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -2180,10 +2457,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -2245,10 +2522,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -2310,10 +2587,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -2375,10 +2652,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -29,8 +29,8 @@ class TEXT_CTRL_EVAL;
#include <wx/button.h>
#include <wx/sizer.h>
#include <wx/checkbox.h>
#include <wx/statbox.h>
#include <wx/radiobut.h>
#include <wx/statbox.h>
#include <wx/valtext.h>
#include <wx/dialog.h>
@ -54,6 +54,10 @@ class DIALOG_EXPORT_STEP_BASE : public DIALOG_SHIM
wxCheckBox* m_cbExportCompound_hidden;
wxCheckBox* m_cbExportBody;
wxCheckBox* m_cbExportComponents;
wxRadioButton* m_rbAllComponents;
wxRadioButton* m_rbOnlySelected;
wxRadioButton* m_rbFilteredComponents;
wxTextCtrl* m_txtComponentFilter;
wxCheckBox* m_cbExportTracks;
wxCheckBox* m_cbExportPads;
wxCheckBox* m_cbExportZones;
@ -88,6 +92,8 @@ class DIALOG_EXPORT_STEP_BASE : public DIALOG_SHIM
// 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 OnComponentModeChange( wxCommandEvent& event ) { event.Skip(); }
virtual void OnComponentFilterTextClick( wxMouseEvent& event ) { event.Skip(); }
virtual void onUpdateUnits( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void onUpdateXPos( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void onUpdateYPos( wxUpdateUIEvent& event ) { event.Skip(); }

View File

@ -116,32 +116,6 @@ private:
};
wxString EXPORTER_STEP_PARAMS::GetDefaultExportExtension()
{
switch( m_format )
{
case EXPORTER_STEP_PARAMS::FORMAT::STEP: return wxS( "step" );
case EXPORTER_STEP_PARAMS::FORMAT::BREP: return wxS( "brep" );
case EXPORTER_STEP_PARAMS::FORMAT::XAO: return wxS( "xao" );
case EXPORTER_STEP_PARAMS::FORMAT::GLB: return wxS( "glb" );
default: return wxEmptyString; // shouldn't happen
}
}
wxString EXPORTER_STEP_PARAMS::GetFormatName()
{
switch( m_format )
{
// honestly these names shouldn't be translated since they are mostly industry standard acronyms
case EXPORTER_STEP_PARAMS::FORMAT::STEP: return wxS( "STEP" );
case EXPORTER_STEP_PARAMS::FORMAT::BREP: return wxS( "BREP" );
case EXPORTER_STEP_PARAMS::FORMAT::XAO: return wxS( "XAO" );
case EXPORTER_STEP_PARAMS::FORMAT::GLB: return wxS( "Binary GLTF" );
default: return wxEmptyString; // shouldn't happen
}
}
EXPORTER_STEP::EXPORTER_STEP( BOARD* aBoard, const EXPORTER_STEP_PARAMS& aParams ) :
m_params( aParams ),
m_error( false ),
@ -152,7 +126,7 @@ EXPORTER_STEP::EXPORTER_STEP( BOARD* aBoard, const EXPORTER_STEP_PARAMS& aParams
{
m_copperColor = COLOR4D( 0.7, 0.61, 0.0, 1.0 );
if( m_params.m_exportComponents )
if( m_params.m_ExportComponents )
m_padColor = COLOR4D( 0.50, 0.50, 0.50, 1.0 );
else
m_padColor = m_copperColor;
@ -216,15 +190,15 @@ bool EXPORTER_STEP::buildFootprint3DShapes( FOOTPRINT* aFootprint, VECTOR2D aOri
//}
}
if( !m_params.m_netFilter.IsEmpty() && !pad->GetNetname().Matches( m_params.m_netFilter ) )
if( !m_params.m_NetFilter.IsEmpty() && !pad->GetNetname().Matches( m_params.m_NetFilter ) )
continue;
if( m_params.m_exportPads )
if( m_params.m_ExportPads )
{
if( m_pcbModel->AddPadShape( pad, aOrigin, false ) )
hasdata = true;
if( m_params.m_exportSoldermask )
if( m_params.m_ExportSoldermask )
{
for( PCB_LAYER_ID pcblayer : pad->GetLayerSet().Seq() )
{
@ -247,7 +221,7 @@ bool EXPORTER_STEP::buildFootprint3DShapes( FOOTPRINT* aFootprint, VECTOR2D aOri
// Build 3D shapes of the footprint graphic items:
for( PCB_LAYER_ID pcblayer : m_layersToExport.Seq() )
{
if( IsCopperLayer( pcblayer ) && !m_params.m_exportTracksVias )
if( IsCopperLayer( pcblayer ) && !m_params.m_ExportTracksVias )
continue;
SHAPE_POLY_SET buffer;
@ -257,7 +231,7 @@ bool EXPORTER_STEP::buildFootprint3DShapes( FOOTPRINT* aFootprint, VECTOR2D aOri
true, /* include shapes */
false /* include private items */ );
if( m_params.m_netFilter.IsEmpty() || !IsCopperLayer( pcblayer ) )
if( m_params.m_NetFilter.IsEmpty() || !IsCopperLayer( pcblayer ) )
{
m_poly_shapes[pcblayer].Append( buffer );
}
@ -284,12 +258,12 @@ bool EXPORTER_STEP::buildFootprint3DShapes( FOOTPRINT* aFootprint, VECTOR2D aOri
}
}
if( ( !(aFootprint->GetAttributes() & (FP_THROUGH_HOLE|FP_SMD)) ) && !m_params.m_includeUnspecified )
if( ( !(aFootprint->GetAttributes() & (FP_THROUGH_HOLE|FP_SMD)) ) && !m_params.m_IncludeUnspecified )
{
return hasdata;
}
if( ( aFootprint->GetAttributes() & FP_DNP ) && !m_params.m_includeDNP )
if( ( aFootprint->GetAttributes() & FP_DNP ) && !m_params.m_IncludeDNP )
{
return hasdata;
}
@ -320,11 +294,36 @@ bool EXPORTER_STEP::buildFootprint3DShapes( FOOTPRINT* aFootprint, VECTOR2D aOri
}
// Exit early if we don't want to include footprint models
if( m_params.m_boardOnly || !m_params.m_exportComponents )
if( m_params.m_BoardOnly || !m_params.m_ExportComponents )
{
return hasdata;
}
bool componentFilter = !m_params.m_ComponentFilter.IsEmpty();
std::vector<wxString> componentFilterPatterns;
if( componentFilter )
{
wxStringTokenizer tokenizer( m_params.m_ComponentFilter, wxS( "," ), wxTOKEN_STRTOK );
while( tokenizer.HasMoreTokens() )
componentFilterPatterns.push_back( tokenizer.GetNextToken().Trim( false ) );
bool found = false;
for( const wxString& pattern : componentFilterPatterns )
{
if( aFootprint->GetReference().Matches( pattern ) )
{
found = true;
break;
}
}
if( !found )
return hasdata;
}
VECTOR2D newpos( pcbIUScale.IUTomm( posX ), pcbIUScale.IUTomm( posY ) );
for( const FP_3DMODEL& fp_model : aFootprint->Models() )
@ -363,7 +362,7 @@ bool EXPORTER_STEP::buildFootprint3DShapes( FOOTPRINT* aFootprint, VECTOR2D aOri
newpos,
aFootprint->GetOrientation().AsRadians(),
fp_model.m_Offset, modelRot,
fp_model.m_Scale, m_params.m_substModels ) )
fp_model.m_Scale, m_params.m_SubstModels ) )
{
hasdata = true;
}
@ -383,7 +382,7 @@ bool EXPORTER_STEP::buildFootprint3DShapes( FOOTPRINT* aFootprint, VECTOR2D aOri
bool EXPORTER_STEP::buildTrack3DShape( PCB_TRACK* aTrack, VECTOR2D aOrigin )
{
if( !m_params.m_netFilter.IsEmpty() && !aTrack->GetNetname().Matches( m_params.m_netFilter ) )
if( !m_params.m_NetFilter.IsEmpty() && !aTrack->GetNetname().Matches( m_params.m_NetFilter ) )
return true;
int maxError = m_board->GetDesignSettings().m_MaxError;
@ -441,8 +440,8 @@ void EXPORTER_STEP::buildZones3DShape( VECTOR2D aOrigin )
{
LSET layers = zone->GetLayerSet();
if( ( layers & LSET::AllCuMask() ).count() && !m_params.m_netFilter.IsEmpty()
&& !zone->GetNetname().Matches( m_params.m_netFilter ) )
if( ( layers & LSET::AllCuMask() ).count() && !m_params.m_NetFilter.IsEmpty()
&& !zone->GetNetname().Matches( m_params.m_NetFilter ) )
{
continue;
}
@ -476,8 +475,8 @@ bool EXPORTER_STEP::buildGraphic3DShape( BOARD_ITEM* aItem, VECTOR2D aOrigin )
{
PCB_SHAPE* graphic = static_cast<PCB_SHAPE*>( aItem );
if( IsCopperLayer( pcblayer ) && !m_params.m_netFilter.IsEmpty()
&& !graphic->GetNetname().Matches( m_params.m_netFilter ) )
if( IsCopperLayer( pcblayer ) && !m_params.m_NetFilter.IsEmpty()
&& !graphic->GetNetname().Matches( m_params.m_NetFilter ) )
{
return true;
}
@ -533,12 +532,12 @@ bool EXPORTER_STEP::buildBoard3DShapes()
// Determine the coordinate system reference:
// Precedence of reference point is Drill Origin > Grid Origin > User Offset
if( m_params.m_useDrillOrigin )
if( m_params.m_UseDrillOrigin )
origin = m_board->GetDesignSettings().GetAuxOrigin();
else if( m_params.m_useGridOrigin )
else if( m_params.m_UseGridOrigin )
origin = m_board->GetDesignSettings().GetGridOrigin();
else
origin = m_params.m_origin;
origin = m_params.m_Origin;
m_pcbModel = std::make_unique<STEP_PCB_MODEL>( m_pcbBaseName );
@ -547,8 +546,8 @@ bool EXPORTER_STEP::buildBoard3DShapes()
m_pcbModel->SetStackup( m_board->GetStackupOrDefault() );
m_pcbModel->SetEnabledLayers( m_layersToExport );
m_pcbModel->SetFuseShapes( m_params.m_fuseShapes );
m_pcbModel->SetNetFilter( m_params.m_netFilter );
m_pcbModel->SetFuseShapes( m_params.m_FuseShapes );
m_pcbModel->SetNetFilter( m_params.m_NetFilter );
// Note: m_params.m_BoardOutlinesChainingEpsilon is used only to build the board outlines,
// not to set OCC chaining epsilon (much smaller)
@ -566,7 +565,7 @@ bool EXPORTER_STEP::buildBoard3DShapes()
for( FOOTPRINT* fp : m_board->Footprints() )
buildFootprint3DShapes( fp, origin );
if( m_params.m_exportTracksVias )
if( m_params.m_ExportTracksVias )
{
for( PCB_TRACK* track : m_board->Tracks() )
buildTrack3DShape( track, origin );
@ -575,7 +574,7 @@ bool EXPORTER_STEP::buildBoard3DShapes()
for( BOARD_ITEM* item : m_board->Drawings() )
buildGraphic3DShape( item, origin );
if( m_params.m_exportZones )
if( m_params.m_ExportZones )
{
buildZones3DShape( origin );
}
@ -622,7 +621,7 @@ bool EXPORTER_STEP::buildBoard3DShapes()
msg.Printf( wxT( "Board outline: find %d initial points\n" ), pcbOutlines.FullPointCount() );
ReportMessage( msg );
if( !m_pcbModel->CreatePCB( pcbOutlines, origin, m_params.m_exportBoardBody ) )
if( !m_pcbModel->CreatePCB( pcbOutlines, origin, m_params.m_ExportBoardBody ) )
{
ReportMessage( wxT( "could not create PCB solid model\n" ) );
return false;
@ -643,27 +642,27 @@ bool EXPORTER_STEP::Export()
ReportMessage( _( "Determining PCB data\n" ) );
if( m_params.m_outputFile.IsEmpty() )
if( m_params.m_OutputFile.IsEmpty() )
{
wxFileName fn = m_board->GetFileName();
fn.SetName( fn.GetName() );
fn.SetExt( m_params.GetDefaultExportExtension() );
m_params.m_outputFile = fn.GetFullName();
m_params.m_OutputFile = fn.GetFullName();
}
m_layersToExport = LSET::ExternalCuMask();
if( m_params.m_exportInnerCopper )
if( m_params.m_ExportInnerCopper )
m_layersToExport |= LSET::InternalCuMask();
if( m_params.m_exportSilkscreen )
if( m_params.m_ExportSilkscreen )
{
m_layersToExport.set( F_SilkS );
m_layersToExport.set( B_SilkS );
}
if( m_params.m_exportSoldermask )
if( m_params.m_ExportSoldermask )
{
m_layersToExport.set( F_Mask );
m_layersToExport.set( B_Mask );
@ -684,13 +683,13 @@ bool EXPORTER_STEP::Export()
ReportMessage( wxString::Format( _( "Writing %s file\n" ), m_params.GetFormatName() ) );
bool success = true;
if( m_params.m_format == EXPORTER_STEP_PARAMS::FORMAT::STEP )
success = m_pcbModel->WriteSTEP( m_outputFile, m_params.m_optimizeStep );
else if( m_params.m_format == EXPORTER_STEP_PARAMS::FORMAT::BREP )
if( m_params.m_Format == EXPORTER_STEP_PARAMS::FORMAT::STEP )
success = m_pcbModel->WriteSTEP( m_outputFile, m_params.m_OptimizeStep );
else if( m_params.m_Format == EXPORTER_STEP_PARAMS::FORMAT::BREP )
success = m_pcbModel->WriteBREP( m_outputFile );
else if( m_params.m_format == EXPORTER_STEP_PARAMS::FORMAT::XAO )
else if( m_params.m_Format == EXPORTER_STEP_PARAMS::FORMAT::XAO )
success = m_pcbModel->WriteXAO( m_outputFile );
else if( m_params.m_format == EXPORTER_STEP_PARAMS::FORMAT::GLB )
else if( m_params.m_Format == EXPORTER_STEP_PARAMS::FORMAT::GLB )
success = m_pcbModel->WriteGLTF( m_outputFile );
if( !success )

View File

@ -28,12 +28,10 @@
#include <geometry/shape_poly_set.h>
#include <gal/color4d.h>
#include <jobs/job_export_pcb_3d.h> // For EXPORTER_STEP_PARAMS
#include <layer_ids.h>
#include <lset.h>
// Default value to chain 2 shapes when creating the board outlines
// from shapes on Edges.Cut layer
#define BOARD_DEFAULT_CHAINING_EPSILON 0.01
class PCBMODEL;
class BOARD;
@ -43,68 +41,6 @@ class PCB_TRACK;
class FILENAME_RESOLVER;
class STEP_PCB_MODEL;
class EXPORTER_STEP_PARAMS
{
public:
EXPORTER_STEP_PARAMS() :
m_origin(),
m_overwrite( false ),
m_useGridOrigin( false ),
m_useDrillOrigin( false ),
m_includeUnspecified( true ),
m_includeDNP( true ),
m_substModels( true ),
m_BoardOutlinesChainingEpsilon( BOARD_DEFAULT_CHAINING_EPSILON ),
m_boardOnly( false ),
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 )
{};
enum class FORMAT
{
STEP,
BREP,
XAO,
GLB
};
wxString m_outputFile;
wxString m_netFilter;
VECTOR2D m_origin;
bool m_overwrite;
bool m_useGridOrigin;
bool m_useDrillOrigin;
bool m_includeUnspecified;
bool m_includeDNP;
bool m_substModels;
double m_BoardOutlinesChainingEpsilon;
bool m_boardOnly;
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;
wxString GetDefaultExportExtension();
wxString GetFormatName();
};
class EXPORTER_STEP
{

View File

@ -125,7 +125,7 @@ int PCBNEW_JOBS_HANDLER::JobExportStep( JOB* aJob )
brd->GetProject()->ApplyTextVars( aJob->GetVarOverrides() );
brd->SynchronizeProperties();
if( aStepJob->m_outputFile.IsEmpty() )
if( aStepJob->m_params.m_OutputFile.IsEmpty() )
{
wxFileName fn = brd->GetFileName();
fn.SetName( fn.GetName() );
@ -146,7 +146,7 @@ int PCBNEW_JOBS_HANDLER::JobExportStep( JOB* aJob )
return CLI::EXIT_CODES::ERR_UNKNOWN; // shouldnt have gotten here
}
aStepJob->m_outputFile = fn.GetFullName();
aStepJob->m_params.m_OutputFile = fn.GetFullName();
}
if( aStepJob->m_format == JOB_EXPORT_PCB_3D::FORMAT::VRML )
@ -164,8 +164,8 @@ int PCBNEW_JOBS_HANDLER::JobExportStep( JOB* aJob )
EXPORTER_VRML vrmlExporter( brd );
wxString messages;
double originX = pcbIUScale.IUTomm( aStepJob->m_xOrigin );
double originY = pcbIUScale.IUTomm( aStepJob->m_yOrigin );
double originX = pcbIUScale.IUTomm( aStepJob->m_params.m_Origin.x );
double originY = pcbIUScale.IUTomm( aStepJob->m_params.m_Origin.y );
if( !aStepJob->m_hasUserOrigin )
{
@ -175,15 +175,15 @@ int PCBNEW_JOBS_HANDLER::JobExportStep( JOB* aJob )
}
bool success = vrmlExporter.ExportVRML_File(
brd->GetProject(), &messages, aStepJob->m_outputFile, scale,
aStepJob->m_includeUnspecified, aStepJob->m_includeDNP,
brd->GetProject(), &messages, aStepJob->m_params.m_OutputFile, scale,
aStepJob->m_params.m_IncludeUnspecified, aStepJob->m_params.m_IncludeDNP,
!aStepJob->m_vrmlModelDir.IsEmpty(), aStepJob->m_vrmlRelativePaths,
aStepJob->m_vrmlModelDir, originX, originY );
if ( success )
{
m_reporter->Report( wxString::Format( _( "Successfully exported VRML to %s" ),
aStepJob->m_outputFile ),
aStepJob->m_params.m_OutputFile ),
RPT_SEVERITY_INFO );
}
else
@ -194,48 +194,28 @@ int PCBNEW_JOBS_HANDLER::JobExportStep( JOB* aJob )
}
else
{
EXPORTER_STEP_PARAMS params;
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;
params.m_BoardOutlinesChainingEpsilon = aStepJob->m_BoardOutlinesChainingEpsilon;
params.m_overwrite = aStepJob->m_overwrite;
params.m_substModels = aStepJob->m_substModels;
params.m_origin = VECTOR2D( aStepJob->m_xOrigin, aStepJob->m_yOrigin );
params.m_useDrillOrigin = aStepJob->m_useDrillOrigin;
params.m_useGridOrigin = aStepJob->m_useGridOrigin;
params.m_boardOnly = aStepJob->m_boardOnly;
params.m_optimizeStep = aStepJob->m_optimizeStep;
params.m_netFilter = aStepJob->m_netFilter;
EXPORTER_STEP_PARAMS params = aStepJob->m_params;
switch( aStepJob->m_format )
{
case JOB_EXPORT_PCB_3D::FORMAT::STEP:
params.m_format = EXPORTER_STEP_PARAMS::FORMAT::STEP;
params.m_Format = EXPORTER_STEP_PARAMS::FORMAT::STEP;
break;
case JOB_EXPORT_PCB_3D::FORMAT::BREP:
params.m_format = EXPORTER_STEP_PARAMS::FORMAT::BREP;
params.m_Format = EXPORTER_STEP_PARAMS::FORMAT::BREP;
break;
case JOB_EXPORT_PCB_3D::FORMAT::XAO:
params.m_format = EXPORTER_STEP_PARAMS::FORMAT::XAO;
params.m_Format = EXPORTER_STEP_PARAMS::FORMAT::XAO;
break;
case JOB_EXPORT_PCB_3D::FORMAT::GLB:
params.m_format = EXPORTER_STEP_PARAMS::FORMAT::GLB;
params.m_Format = EXPORTER_STEP_PARAMS::FORMAT::GLB;
break;
default:
return CLI::EXIT_CODES::ERR_UNKNOWN; // shouldnt have gotten here
}
EXPORTER_STEP stepExporter( brd, params );
stepExporter.m_outputFile = aStepJob->m_outputFile;
stepExporter.m_outputFile = params.m_OutputFile;
if( !stepExporter.Export() )
return CLI::EXIT_CODES::ERR_UNKNOWN;