26#include <wx/stdpaths.h>
27#include <wx/process.h>
29#include <wx/filedlg.h>
191 { wxID_CANCEL,
_(
"Close" ) } } );
200 brdFile.SetExt( wxT(
"step" ) );
201 path = brdFile.GetFullPath();
256 wxCommandEvent
dummy;
263 tmpStr = wxEmptyString;
268 size_t bad_count = 0;
274 if( model.m_Scale.x != 1.0 || model.m_Scale.y != 1.0 || model.m_Scale.z != 1.0 )
276 bad_scales.Append( wxS(
"\n") );
277 bad_scales.Append( model.m_Filename );
286 if( !bad_scales.empty()
287 && !
Pgm().GetCommonSettings()->m_DoNotShowAgain.scaled_3d_models_warning )
289 wxString extendedMsg =
_(
"Non-unity scaled models:" ) + wxT(
"\n" ) + bad_scales;
292 "Model scaling is not reliable for mechanical export." ),
293 _(
"Model Scale Warning" ), wxOK | wxICON_WARNING );
294 msgDlg.SetExtendedMessage( extendedMsg );
328 catch(
const std::runtime_error& e )
330 wxFAIL_MSG( e.what() );
398 wxFileName autosaveProjFile;
405 "Please save the PCB and try again" ) );
414 autosaveProjFile = brdFile;
415 autosaveProjFile.SetName( autosaveFileName );
416 autosaveProjFile.SetExt(
"kicad_pro" );
420 brdFile.SetName( autosaveFileName );
427 if( !autosaveProjFile.GetFullPath().IsEmpty() )
428 wxRemoveFile( autosaveProjFile.GetFullPath() );
453 wxString
filter =
_(
"STEP files" )
455 +
_(
"Binary glTF files" )
459 +
_(
"BREP (OCCT) files" )
465 wxFileName fn(
Prj().AbsolutePath(
path ) );
467 wxFileDialog dlg(
this,
_(
"3D Model Output File" ), fn.GetPath(), fn.GetFullName(),
filter,
470 if( dlg.ShowModal() == wxID_CANCEL )
473 path = dlg.GetPath();
476 fn = wxFileName(
path );
494 int sepIdx = std::max(
path.Find(
'/',
true ),
path.Find(
'\\',
true ) );
495 int dotIdx =
path.Find(
'.',
true );
497 if( dotIdx == -1 || dotIdx < sepIdx )
498 path <<
'.' << newExt;
500 path =
path.Mid( 0, dotIdx ) <<
'.' << newExt;
529 std::function<bool( wxString* )> textResolver =
530 [&]( wxString* token ) ->
bool
571 case 0: tolerance = 0.001;
break;
573 case 1: tolerance = 0.01;
break;
574 case 2: tolerance = 0.1;
break;
587 chainingEpsilon,
nullptr );
591 _(
"Board outline is missing or not closed using %.3f mm tolerance.\n"
592 "Run DRC for a full analysis." ), tolerance ) );
596 wxFileName fn(
Prj().AbsolutePath(
path ) );
600 msg.Printf(
_(
"File '%s' already exists. Do you want overwrite this file?" ),
603 if( wxMessageBox( msg,
_(
"STEP/GLTF Export" ), wxYES_NO | wxICON_QUESTION,
this ) == wxNO )
607 wxFileName appK2S( wxStandardPaths::Get().GetExecutablePath() );
610 if( appK2S.GetPath().Find(
"/Contents/Applications/pcbnew.app/Contents/MacOS" ) != wxNOT_FOUND )
612 appK2S.AppendDir( wxT(
".." ) );
613 appK2S.AppendDir( wxT(
".." ) );
614 appK2S.AppendDir( wxT(
".." ) );
615 appK2S.AppendDir( wxT(
".." ) );
616 appK2S.AppendDir( wxT(
"MacOS" ) );
619 if( wxGetEnv( wxT(
"KICAD_RUN_FROM_BUILD_DIR" ),
nullptr ) )
621 appK2S.RemoveLastDir();
622 appK2S.AppendDir(
"kicad" );
626 appK2S.SetName( wxT(
"kicad-cli" ) );
629 wxString cmdK2S = wxT(
"\"" );
630 cmdK2S.Append( appK2S.GetFullPath() );
631 cmdK2S.Append( wxT(
"\"" ) );
633 cmdK2S.Append( wxT(
" pcb" ) );
634 cmdK2S.Append( wxT(
" export" ) );
636 cmdK2S.Append( wxT(
" " ) );
640 cmdK2S.Append( wxT(
" --no-unspecified" ) );
643 cmdK2S.Append( wxT(
" --no-dnp" ) );
646 cmdK2S.Append( wxT(
" --subst-models" ) );
649 cmdK2S.Append( wxT(
" --no-optimize-step" ) );
652 cmdK2S.Append( wxT(
" --no-board-body" ) );
655 cmdK2S.Append( wxT(
" --no-components" ) );
658 cmdK2S.Append( wxT(
" --include-tracks" ) );
661 cmdK2S.Append( wxT(
" --include-pads" ) );
664 cmdK2S.Append( wxT(
" --include-zones" ) );
667 cmdK2S.Append( wxT(
" --include-inner-copper" ) );
670 cmdK2S.Append( wxT(
" --include-silkscreen" ) );
673 cmdK2S.Append( wxT(
" --include-soldermask" ) );
676 cmdK2S.Append( wxT(
" --fuse-shapes" ) );
685 cmdK2S.Append( wxString::Format( wxT(
" --net-filter %c%s%c" ), dblquote,
m_netFilter,
693 wxArrayString components;
696 std::for_each( selection.
begin(), selection.
end(),
699 if( item->Type() == PCB_FOOTPRINT_T )
700 components.push_back( static_cast<FOOTPRINT*>( item )->GetReference() );
703 cmdK2S.Append( wxString::Format( wxT(
" --component-filter %c%s%c" ), dblquote,
704 wxJoin( components,
',' ), dblquote ) );
709 cmdK2S.Append( wxString::Format( wxT(
" --component-filter %c%s%c" ), dblquote,
720 wxFAIL_MSG( wxT(
"Unsupported origin option: how did we get here?" ) );
724 cmdK2S.Append( wxT(
" --drill-origin" ) );
728 cmdK2S.Append( wxT(
" --grid-origin" ) );
744 cmdK2S.Append( wxString::Format( wxT(
" --user-origin=%c%.6fx%.6fmm%c" ),
745 quote, xOrg, yOrg, quote ) );
756 cmdK2S.Append( wxString::Format( wxT(
" --user-origin=%c%.6fx%.6fmm%c" ),
757 quote, xOrg, yOrg, quote ) );
764 cmdK2S.Append( wxString::Format( wxT(
" --min-distance=%c%.3fmm%c" ),
765 quote, tolerance, quote ) );
769 cmdK2S.Append( wxString::Format( wxT(
" -f -o %c%s%c" ),
770 dblquote, fn.GetFullPath(), dblquote ) );
774 cmdK2S.Append( wxString::Format( wxT(
" %c%s%c" ), dblquote,
m_boardPath, dblquote ) );
776 wxLogTrace(
traceKiCad2Step, wxT(
"export step command: %s" ), cmdK2S );
constexpr EDA_IU_SCALE pcbIUScale
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
BOX2I ComputeBoundingBox(bool aBoardEdgesOnly=false, bool aIncludeHiddenText=false) const
Calculate the bounding box containing all board items (or board edge segments).
bool ResolveTextVar(wxString *token, int aDepth) const
const FOOTPRINTS & Footprints() const
const wxString & GetFileName() const
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
wxRadioButton * m_rbDrillAndPlotOrigin
wxTextCtrl * m_txtComponentFilter
STD_BITMAP_BUTTON * m_browseButton
void onFormatChoice(wxCommandEvent &event) override
STEP_ORIGIN_OPTION GetOriginOption()
static int m_formatLastChoice
static bool m_exportSoldermask
void OnFmtChoiceOptionChanged()
int GetOrgUnitsChoice() const
void onCbExportComponents(wxCommandEvent &event) override
void OnComponentModeChange(wxCommandEvent &event) override
@ STEP_ORIGIN_BOARD_CENTER
PCB_EDIT_FRAME * m_parent
static COMPONENT_MODE m_componentMode
void onUpdateXPos(wxUpdateUIEvent &aEvent) override
static bool m_exportComponents
static bool m_exportZones
STEP_ORIGIN_OPTION m_origin
void onExportButton(wxCommandEvent &aEvent) override
static bool m_exportBoardBody
DIALOG_EXPORT_STEP(PCB_EDIT_FRAME *aParent, const wxString &aBoardPath)
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...
A base class for most all the KiCad significant classes used in schematics and boards.
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
bool DoNotShowAgain() const
void DoNotShowCheckbox(wxString file, int line)
Checks the 'do not show again' setting for the dialog.
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.
DIALOG_EXPORT_STEP m_ExportStep
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() override
Perform auto save when the board has been modified and not saved within the auto save interval.
void OnExportSTEP(wxCommandEvent &event)
Export the current BOARD to a STEP assembly.
wxString GetLastPath(LAST_PATH_TYPE aType)
Get the last path for a particular type.
bool IsContentModified() const override
Get if the current board has been modified but not saved.
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)
Saves 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)
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 AutoSaveFilePrefix
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)
Function DoubleValueFromString converts aTextValue to a double.
SETTINGS_MANAGER * GetSettingsManager()
PGM_BASE & Pgm()
The global Program "get" accessor.
std::vector< FAB_LAYER_COLOR > dummy
bool scaled_3d_models_warning
constexpr double IUTomm(int iu) const
constexpr int mmToIU(double mm) const
wxLogTrace helper definitions.
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().