26#include <wx/stdpaths.h>
27#include <wx/process.h>
29#include <wx/filedlg.h>
149 { wxID_CANCEL,
_(
"Close" ) } } );
158 brdFile.SetExt( wxT(
"step" ) );
159 path = brdFile.GetFullPath();
204 tmpStr = wxEmptyString;
209 size_t bad_count = 0;
215 if( model.m_Scale.x != 1.0 || model.m_Scale.y != 1.0 || model.m_Scale.z != 1.0 )
217 bad_scales.Append( wxS(
"\n") );
218 bad_scales.Append( model.m_Filename );
227 if( !bad_scales.empty()
230 wxString extendedMsg =
_(
"Non-unity scaled models:" ) + wxT(
"\n" ) + bad_scales;
233 "Model scaling is not reliable for mechanical export." ),
234 _(
"Model Scale Warning" ), wxOK | wxICON_WARNING );
235 msgDlg.SetExtendedMessage( extendedMsg );
262 catch(
const std::runtime_error& e )
264 wxFAIL_MSG( e.what() );
323 "Please save the PCB and try again" ) );
356 wxString
filter =
_(
"STEP files" )
358 +
_(
"Binary glTF files" )
363 wxFileName fn(
Prj().AbsolutePath(
path ) );
365 wxFileDialog dlg(
this,
_(
"STEP Output File" ), fn.GetPath(), fn.GetFullName(),
filter,
368 if( dlg.ShowModal() == wxID_CANCEL )
381 std::function<bool( wxString* )> textResolver =
382 [&]( wxString* token ) ->
bool
409 case 0: tolerance = 0.001;
break;
411 case 1: tolerance = 0.01;
break;
412 case 2: tolerance = 0.1;
break;
425 chainingEpsilon,
nullptr );
429 _(
"Board outline is missing or not closed using %.3f mm tolerance.\n"
430 "Run DRC for a full analysis." ), tolerance ) );
434 wxFileName fn(
Prj().AbsolutePath(
path ) );
438 msg.Printf(
_(
"File '%s' already exists. Do you want overwrite this file?" ),
441 if( wxMessageBox( msg,
_(
"STEP/GLTF Export" ), wxYES_NO | wxICON_QUESTION,
this ) == wxNO )
445 wxFileName appK2S( wxStandardPaths::Get().GetExecutablePath() );
448 if( appK2S.GetPath().Find(
"/Contents/Applications/pcbnew.app/Contents/MacOS" ) != wxNOT_FOUND )
450 appK2S.AppendDir( wxT(
".." ) );
451 appK2S.AppendDir( wxT(
".." ) );
452 appK2S.AppendDir( wxT(
".." ) );
453 appK2S.AppendDir( wxT(
".." ) );
454 appK2S.AppendDir( wxT(
"MacOS" ) );
457 if( wxGetEnv( wxT(
"KICAD_RUN_FROM_BUILD_DIR" ),
nullptr ) )
459 appK2S.RemoveLastDir();
460 appK2S.AppendDir(
"kicad" );
464 appK2S.SetName( wxT(
"kicad-cli" ) );
467 wxString cmdK2S = wxT(
"\"" );
468 cmdK2S.Append( appK2S.GetFullPath() );
469 cmdK2S.Append( wxT(
"\"" ) );
471 cmdK2S.Append( wxT(
" pcb" ) );
472 cmdK2S.Append( wxT(
" export" ) );
475 cmdK2S.Append( wxT(
" glb" ) );
477 cmdK2S.Append( wxT(
" brep" ) );
479 cmdK2S.Append( wxT(
" step" ) );
482 cmdK2S.Append( wxT(
" --no-unspecified" ) );
485 cmdK2S.Append( wxT(
" --no-dnp" ) );
488 cmdK2S.Append( wxT(
" --subst-models" ) );
491 cmdK2S.Append( wxT(
" --no-optimize-step" ) );
494 cmdK2S.Append( wxT(
" --no-board-body" ) );
497 cmdK2S.Append( wxT(
" --no-components" ) );
500 cmdK2S.Append( wxT(
" --include-tracks" ) );
503 cmdK2S.Append( wxT(
" --include-zones" ) );
506 cmdK2S.Append( wxT(
" --include-inner-copper" ) );
509 cmdK2S.Append( wxT(
" --fuse-shapes" ) );
521 wxFAIL_MSG( wxT(
"Unsupported origin option: how did we get here?" ) );
525 cmdK2S.Append( wxT(
" --drill-origin" ) );
529 cmdK2S.Append( wxT(
" --grid-origin" ) );
545 cmdK2S.Append( wxString::Format( wxT(
" --user-origin=%c%.6fx%.6fmm%c" ),
546 quote, xOrg, yOrg, quote ) );
557 cmdK2S.Append( wxString::Format( wxT(
" --user-origin=%c%.6fx%.6fmm%c" ),
558 quote, xOrg, yOrg, quote ) );
565 cmdK2S.Append( wxString::Format( wxT(
" --min-distance=%c%.3fmm%c" ),
566 quote, tolerance, quote ) );
570 cmdK2S.Append( wxString::Format( wxT(
" -f -o %c%s%c" ),
571 dblquote, fn.GetFullPath(), dblquote ) );
575 cmdK2S.Append( wxString::Format( wxT(
" %c%s%c" ), dblquote,
m_boardPath, dblquote ) );
577 wxLogTrace(
traceKiCad2Step, wxT(
"export step command: %s" ), cmdK2S );
constexpr EDA_IU_SCALE pcbIUScale
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
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
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_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
wxCheckBox * m_cbExportZones
wxRadioButton * m_rbUserDefinedOrigin
wxRadioButton * m_rbDrillAndPlotOrigin
STD_BITMAP_BUTTON * m_browseButton
STEP_ORIGIN_OPTION GetOriginOption()
int GetOrgUnitsChoice() const
@ STEP_ORIGIN_BOARD_CENTER
PCB_EDIT_FRAME * m_parent
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 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...
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.
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.
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::string BrepFileExtension
static const std::string StepFileAbrvExtension
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.
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.
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().