26#include <wx/stdpaths.h>
27#include <wx/process.h>
29#include <wx/filedlg.h>
100 const wxString& aBoardPath,
103 m_editFrame( aEditFrame ),
105 m_userOriginX( 0.0 ),
106 m_userOriginY( 0.0 ),
108 m_boardPath( aBoardPath )
114 { wxID_CANCEL,
_(
"Close" ) } } );
124 brdFile.SetExt( wxT(
"step" ) );
125 path = brdFile.GetFullPath();
166 m_noDNP = cfg->m_ExportStep.no_dnp;
197 wxCommandEvent
dummy;
204 tmpStr = wxEmptyString;
255 wxCommandEvent
dummy;
263 tmpStr = wxEmptyString;
269 size_t bad_count = 0;
275 if( model.m_Scale.x != 1.0 || model.m_Scale.y != 1.0 || model.m_Scale.z != 1.0 )
277 bad_scales.Append( wxS(
"\n") );
278 bad_scales.Append( model.m_Filename );
287 if( !bad_scales.empty()
288 && !
Pgm().GetCommonSettings()->m_DoNotShowAgain.scaled_3d_models_warning )
290 wxString extendedMsg =
_(
"Non-unity scaled models:" ) + wxT(
"\n" ) + bad_scales;
293 "Model scaling is not reliable for mechanical export." ),
294 _(
"Model Scale Warning" ), wxOK | wxICON_WARNING );
295 msgDlg.SetExtendedMessage( extendedMsg );
327 cfg->m_ExportStep.origin_mode =
static_cast<int>(
m_origin );
335 cfg->m_ExportStep.origin_x = val;
338 cfg->m_ExportStep.origin_y = val;
394 wxFileName autosaveProjFile;
409 autosaveProjFile = brdFile;
410 autosaveProjFile.SetName( autosaveFileName );
411 autosaveProjFile.SetExt(
"kicad_pro" );
415 brdFile.SetName( autosaveFileName );
422 if( !autosaveProjFile.GetFullPath().IsEmpty() )
423 wxRemoveFile( autosaveProjFile.GetFullPath() );
450 wxString
filter =
_(
"STEP files" )
452 +
_(
"Binary glTF files" )
456 +
_(
"BREP (OCCT) files" )
466 wxFileName fn(
Prj().AbsolutePath(
path ) );
468 wxFileDialog dlg(
this,
_(
"3D Model Output File" ), fn.GetPath(), fn.GetFullName(),
filter,
471 if( dlg.ShowModal() == wxID_CANCEL )
474 path = dlg.GetPath();
477 fn = wxFileName(
path );
495 int sepIdx = std::max(
path.Find(
'/',
true ),
path.Find(
'\\',
true ) );
496 int dotIdx =
path.Find(
'.',
true );
498 if( dotIdx == -1 || dotIdx < sepIdx )
499 path <<
'.' << newExt;
501 path =
path.Mid( 0, dotIdx ) <<
'.' << newExt;
532 case 0: tolerance = 0.001;
break;
534 case 1: tolerance = 0.01;
break;
535 case 2: tolerance = 0.1;
break;
543 std::function<bool( wxString* )> textResolver =
544 [&]( wxString* token ) ->
bool
597 "%.3f mm tolerance.\n"
598 "Run DRC for a full analysis." ),
603 wxFileName fn(
Prj().AbsolutePath(
path ) );
607 msg.Printf(
_(
"File '%s' already exists. Do you want overwrite this file?" ),
610 if( wxMessageBox( msg,
_(
"STEP/GLTF Export" ), wxYES_NO | wxICON_QUESTION,
this ) == wxNO )
614 wxFileName appK2S( wxStandardPaths::Get().GetExecutablePath() );
617 if( appK2S.GetPath().Find(
"/Contents/Applications/pcbnew.app/Contents/MacOS" ) != wxNOT_FOUND )
619 appK2S.AppendDir( wxT(
".." ) );
620 appK2S.AppendDir( wxT(
".." ) );
621 appK2S.AppendDir( wxT(
".." ) );
622 appK2S.AppendDir( wxT(
".." ) );
623 appK2S.AppendDir( wxT(
"MacOS" ) );
626 if( wxGetEnv( wxT(
"KICAD_RUN_FROM_BUILD_DIR" ),
nullptr ) )
628 appK2S.RemoveLastDir();
629 appK2S.AppendDir(
"kicad" );
633 appK2S.SetName( wxT(
"kicad-cli" ) );
636 wxString cmdK2S = wxT(
"\"" );
637 cmdK2S.Append( appK2S.GetFullPath() );
638 cmdK2S.Append( wxT(
"\"" ) );
640 cmdK2S.Append( wxT(
" pcb" ) );
641 cmdK2S.Append( wxT(
" export" ) );
643 cmdK2S.Append( wxT(
" " ) );
647 cmdK2S.Append( wxT(
" --no-unspecified" ) );
650 cmdK2S.Append( wxT(
" --no-dnp" ) );
653 cmdK2S.Append( wxT(
" --subst-models" ) );
656 cmdK2S.Append( wxT(
" --no-optimize-step" ) );
659 cmdK2S.Append( wxT(
" --no-board-body" ) );
662 cmdK2S.Append( wxT(
" --no-components" ) );
665 cmdK2S.Append( wxT(
" --include-tracks" ) );
668 cmdK2S.Append( wxT(
" --include-pads" ) );
671 cmdK2S.Append( wxT(
" --include-zones" ) );
674 cmdK2S.Append( wxT(
" --include-inner-copper" ) );
677 cmdK2S.Append( wxT(
" --include-silkscreen" ) );
680 cmdK2S.Append( wxT(
" --include-soldermask" ) );
683 cmdK2S.Append( wxT(
" --fuse-shapes" ) );
686 cmdK2S.Append( wxT(
" --cut-vias-in-body" ) );
689 cmdK2S.Append( wxT(
" --fill-all-vias" ) );
698 cmdK2S.Append( wxString::Format( wxT(
" --net-filter %c%s%c" ),
706 wxArrayString components;
709 std::for_each( selection.
begin(), selection.
end(),
712 if( item->Type() == PCB_FOOTPRINT_T )
713 components.push_back( static_cast<FOOTPRINT*>( item )->GetReference() );
716 cmdK2S.Append( wxString::Format( wxT(
" --component-filter %c%s%c" ),
717 dblquote, wxJoin( components,
',' ), dblquote ) );
722 cmdK2S.Append( wxString::Format( wxT(
" --component-filter %c%s%c" ),
733 wxFAIL_MSG( wxT(
"Unsupported origin option: how did we get here?" ) );
737 cmdK2S.Append( wxT(
" --drill-origin" ) );
741 cmdK2S.Append( wxT(
" --grid-origin" ) );
757 cmdK2S.Append( wxString::Format( wxT(
" --user-origin=%c%.6fx%.6fmm%c" ),
758 quote, xOrg, yOrg, quote ) );
769 cmdK2S.Append( wxString::Format( wxT(
" --user-origin=%c%.6fx%.6fmm%c" ),
770 quote, xOrg, yOrg, quote ) );
777 cmdK2S.Append( wxString::Format( wxT(
" --min-distance=%c%.3fmm%c" ),
778 quote, tolerance, quote ) );
782 cmdK2S.Append( wxString::Format( wxT(
" -f -o %c%s%c" ),
783 dblquote, fn.GetFullPath(), dblquote ) );
787 cmdK2S.Append( wxString::Format( wxT(
" %c%s%c" ), dblquote,
m_boardPath, dblquote ) );
789 wxLogTrace(
traceKiCad2Step, wxT(
"export step command: %s" ), cmdK2S );
constexpr EDA_IU_SCALE pcbIUScale
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
bool IsContentModified() const
int ExportSTEP(const TOOL_EVENT &aEvent)
Information pertinent to a Pcbnew printed circuit board.
bool ResolveTextVar(wxString *token, int aDepth) const
BOX2I ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
const FOOTPRINTS & Footprints() const
const wxString & GetFileName() const
PROJECT * GetProject() const
constexpr const Vec GetCenter() const
DO_NOT_SHOW_AGAIN m_DoNotShowAgain
Class DIALOG_EXPORT_STEP_BASE.
wxCheckBox * m_cbExportTracks
wxCheckBox * m_cbSubstModels
TEXT_CTRL_EVAL * m_STEP_Xorg
TEXT_CTRL_EVAL * m_STEP_Yorg
wxRadioButton * m_rbOnlySelected
wxRadioButton * m_rbGridOrigin
wxCheckBox * m_cbExportBody
wxCheckBox * m_cbRemoveUnspecified
wxCheckBox * m_cbOverwriteFile
wxCheckBox * m_cbRemoveDNP
wxBoxSizer * bSizerSTEPFile
wxCheckBox * m_cbExportComponents
wxCheckBox * m_cbOptimizeStep
wxCheckBox * m_cbFuseShapes
wxRadioButton * m_rbBoardCenterOrigin
wxTextCtrl * m_outputFileName
wxCheckBox * m_cbExportInnerCopper
wxChoice * m_choiceTolerance
wxChoice * m_STEP_OrgUnitChoice
wxTextCtrl * m_txtNetFilter
wxCheckBox * m_cbExportSoldermask
wxCheckBox * m_cbExportPads
wxChoice * m_choiceFormat
wxCheckBox * m_cbExportZones
wxRadioButton * m_rbAllComponents
wxRadioButton * m_rbUserDefinedOrigin
wxCheckBox * m_cbExportSilkscreen
wxRadioButton * m_rbFilteredComponents
wxCheckBox * m_cbCutViasInBody
wxRadioButton * m_rbDrillAndPlotOrigin
wxTextCtrl * m_txtComponentFilter
STD_BITMAP_BUTTON * m_browseButton
wxCheckBox * m_cbFillAllVias
void onFormatChoice(wxCommandEvent &event) override
STEP_ORIGIN_OPTION GetOriginOption()
static int m_formatLastChoice
static bool m_exportSoldermask
static bool m_cutViasInBody
void OnFmtChoiceOptionChanged()
int GetOrgUnitsChoice() const
void onCbExportComponents(wxCommandEvent &event) override
static bool m_fillAllVias
PCB_EDIT_FRAME * m_editFrame
void OnComponentModeChange(wxCommandEvent &event) override
@ STEP_ORIGIN_BOARD_CENTER
DIALOG_EXPORT_STEP(PCB_EDIT_FRAME *aEditFrame, const wxString &aBoardPath)
static COMPONENT_MODE m_componentMode
void onUpdateXPos(wxUpdateUIEvent &aEvent) override
static bool m_exportComponents
static bool m_exportZones
STEP_ORIGIN_OPTION m_origin
JOB_EXPORT_PCB_3D * m_job
void onExportButton(wxCommandEvent &aEvent) override
static bool m_exportBoardBody
static bool m_exportSilkscreen
static wxString m_componentFilter
static int m_toleranceLastChoice
static bool m_optimizeStep
void onUpdateUnits(wxUpdateUIEvent &aEvent) override
bool GetNoUnspecifiedOption()
static bool m_exportInnerCopper
void onUpdateYPos(wxUpdateUIEvent &aEvent) override
static bool m_exportTracks
void onBrowseClicked(wxCommandEvent &aEvent) override
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
SETTINGS_MANAGER * GetSettingsManager() const
A base class for most all the KiCad significant classes used in schematics and boards.
double m_BoardOutlinesChainingEpsilon
bool m_IncludeUnspecified
wxString m_ComponentFilter
bool m_UsePcbCenterOrigin
JOB_EXPORT_PCB_3D::FORMAT m_format
wxString GetSettingsDialogTitle() const override
void SetStepFormat(EXPORTER_STEP_PARAMS::FORMAT aFormat)
EXPORTER_STEP_PARAMS m_3dparams
Despite the name; also used for other formats.
void SetConfiguredOutputPath(const wxString &aPath)
Sets the configured output path for the job, this path is always saved to file.
wxString GetConfiguredOutputPath() const
Returns the configured output path for the job.
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
bool DoNotShowAgain() const
Checks the 'do not show again' setting for the dialog.
void DoNotShowCheckbox(wxString file, int line)
Shows the 'do not show again' checkbox.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
PCBNEW_SETTINGS * GetPcbNewSettings() const
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
The main frame for Pcbnew.
void SetLastPath(LAST_PATH_TYPE aType, const wxString &aLastPath)
Set the path of the last file successfully read.
bool DoAutoSave()
Perform auto save when the board has been modified and not saved within the auto save interval.
wxString GetLastPath(LAST_PATH_TYPE aType)
Get the last path for a particular type.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
virtual COMMON_SETTINGS * GetCommonSettings() const
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
void SaveProjectCopy(const wxString &aFullPath, PROJECT *aProject=nullptr)
Save a copy of the current project under the given path.
Represent a set of closed polygons.
void SetValue(const wxString &aValue) override
Set a new value in evaluator buffer and display it in the wxTextCtrl.
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
bool BuildBoardPolygonOutlines(BOARD *aBoard, SHAPE_POLY_SET &aOutlines, int aErrorMax, int aChainingEpsilon, OUTLINE_ERROR_HANDLER *aErrorHandler, bool aAllowUseArcsInPolygons)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
static const std::map< wxString, int > c_formatExtToChoice
static const std::vector< wxString > c_formatCommand
static const std::string BrepFileExtension
static const std::string StepFileAbrvExtension
static const std::string XaoFileExtension
static const std::string GltfBinaryFileExtension
static const std::string StlFileExtension
static const std::string AutoSaveFilePrefix
static const std::string PlyFileExtension
static const std::string StepFileExtension
const wxChar *const traceKiCad2Step
Flag to enable KiCad2Step debug tracing.
This file is part of the common library.
std::optional< V > get_opt(const std::map< wxString, V > &aMap, const wxString &aKey)
KICOMMON_API double DoubleValueFromString(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Convert aTextValue to a double.
PGM_BASE & Pgm()
The global program "get" accessor.
std::vector< FAB_LAYER_COLOR > dummy
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
bool scaled_3d_models_warning
constexpr double IUTomm(int iu) const
constexpr int mmToIU(double mm) const
wxLogTrace helper definitions.
VECTOR2< double > VECTOR2D
wxString AddFileExtListToFilter(const std::vector< std::string > &aExts)
Build the wildcard extension file dialog wildcard filter to add to the base message dialog.
Definition of file extensions used in Kicad.
#define FN_NORMALIZE_FLAGS
Default flags to pass to wxFileName::Normalize().