From b89d4a7f2099ff9aa2aa82d182da16a9b55248b6 Mon Sep 17 00:00:00 2001
From: Alex Shvartzkop <dudesuchamazing@gmail.com>
Date: Sun, 19 May 2024 04:28:43 +0300
Subject: [PATCH] 3D model export improvements:

- Option to export pads separately from tracks+vias
- Options export silkscreen and soldermask as flat faces
- Improve 3D model export dialog layout
- Use VisMaterialTool to specify metallic-roughness for glTF.
- Less OCCT boolean operations (faster, less bugs)

Fixes https://gitlab.com/kicad/code/kicad/-/issues/2072
---
 common/jobs/job_export_pcb_3d.cpp          |    3 +
 common/jobs/job_export_pcb_3d.h            |    3 +
 kicad/cli/command_pcb_export_3d.cpp        |   20 +-
 pcbnew/dialogs/dialog_export_step.cpp      |   99 +-
 pcbnew/dialogs/dialog_export_step_base.cpp |  211 +-
 pcbnew/dialogs/dialog_export_step_base.fbp | 2721 ++++++++++----------
 pcbnew/dialogs/dialog_export_step_base.h   |   47 +-
 pcbnew/exporters/step/exporter_step.cpp    |  310 ++-
 pcbnew/exporters/step/exporter_step.h      |   17 +-
 pcbnew/exporters/step/step_pcb_model.cpp   | 1136 ++++----
 pcbnew/exporters/step/step_pcb_model.h     |   60 +-
 pcbnew/menubar_pcb_editor.cpp              |    3 +-
 pcbnew/pcbnew_jobs_handler.cpp             |    3 +
 13 files changed, 2499 insertions(+), 2134 deletions(-)

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">&quot;STEP&quot; &quot;GLB (Binary glTF)&quot; &quot;XAO&quot; &quot;BREP (OCCT)&quot;</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">&quot;mm&quot; &quot;inch&quot;</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 &apos;Do not populate&apos; 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 &apos;Do not populate&apos;</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 &apos;Unspecified&apos; 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 &apos;Unspecified&apos;</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">&quot;mm&quot; &quot;inch&quot;</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 &apos;Do not populate&apos; 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 &apos;Do not populate&apos;</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 &apos;Unspecified&apos; 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 &apos;Unspecified&apos;</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;