22#include <wx/bmpbuttn.h>
23#include <wx/clntdata.h>
26#include <wx/rearrangectrl.h>
141 [
this]( wxUpdateUIEvent& aEvent )
161 wxArrayInt plotAllLayersOrder;
162 wxArrayString plotAllLayersChoicesStrings;
163 std::vector<PCB_LAYER_ID> layersIdChoiceList;
173 plotAllLayersChoicesStrings.Add( layerName );
174 layersIdChoiceList.push_back( layer );
177 plotAllLayersOrder.push_back( order );
179 plotAllLayersOrder.push_back( ~order );
184 int checkColSize = 22;
185 int layerColSize = textWidth + 15;
197 wxStaticBox* allLayersLabel =
new wxStaticBox(
this, wxID_ANY,
_(
"Plot on All Layers" ) );
198 wxStaticBoxSizer* sbSizer =
new wxStaticBoxSizer( allLayersLabel, wxVERTICAL );
201 wxDefaultPosition, wxDefaultSize,
202 plotAllLayersOrder, plotAllLayersChoicesStrings, 0 );
210 for(
size_t idx = 0; idx < layersIdChoiceList.size(); idx++ )
212 wxString& txt = plotAllLayersChoicesStrings[idx];
221 wxBoxSizer* bButtonSizer;
222 bButtonSizer =
new wxBoxSizer( wxHORIZONTAL );
225 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
226 m_bpMoveUp->SetToolTip(
_(
"Move current selection up" ) );
229 bButtonSizer->Add(
m_bpMoveUp, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3 );
232 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
233 m_bpMoveDown->SetToolTip(
_(
"Move current selection down" ) );
236 bButtonSizer->Add(
m_bpMoveDown, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
238 sbSizer->Add( bButtonSizer, 0, wxALL | wxEXPAND, 3 );
240 bmiddleSizer->Insert( 1, sbSizer, 1, wxALL | wxEXPAND, 5 );
252 { wxID_APPLY,
_(
"Generate Drill Files..." ) },
253 { wxID_CANCEL,
_(
"Close" ) } } );
256 GetSizer()->Fit(
this );
257 GetSizer()->SetSizeHints(
this );
295 if( !
m_job->m_variant.IsEmpty() )
299 if( idx != wxNOT_FOUND )
307 if( !currentVariant.IsEmpty() )
311 if( idx != wxNOT_FOUND )
399 ||
m_plotOpts.GetCrossoutDNPFPsOnFabLayers() );
455 wxCommandEvent cmd_event;
471 wxString label = singleFile ?
_(
"Output file:" ) :
_(
"Output directory:" );
480 m_outputDirectoryName->SetToolTip(
_(
"Target file for the plot. Can be absolute or relative to the board "
481 "file location." ) );
486 "the board file location." ) );
571 m_job->m_subtractSolderMaskFromSilk =
m_plotOpts.GetSubtractMaskFromSilk();
573 m_job->m_crossoutDNPFPsOnFabLayers =
m_plotOpts.GetCrossoutDNPFPsOnFabLayers();
574 m_job->m_hideDNPFPsOnFabLayers =
m_plotOpts.GetHideDNPFPsOnFabLayers();
575 m_job->m_sketchDNPFPsOnFabLayers =
m_plotOpts.GetSketchDNPFPsOnFabLayers();
576 m_job->m_sketchPadsOnFabLayers =
m_plotOpts.GetSketchPadsOnFabLayers();
584 m_job->m_plotLayerSequence =
m_plotOpts.GetLayerSelection().SeqStackupForPlotting();
585 m_job->m_plotOnAllLayersSequence =
m_plotOpts.GetPlotOnAllLayersSequence();
618 int knownViolations = 0;
629 if( !
m_job && ( knownViolations || exclusions ) )
660 if( ( selection != 0 ) && ( selection != wxNOT_FOUND ) )
670 [&]( wxRearrangeList* aList,
PCB_LAYER_ID aLayer ) ->
int
672 for(
int ii = 0; ii < (int) aList->GetCount(); ++ii )
687 while( currentPos > idx )
699#define ID_LAYER_FAB 13001
700#define ID_SELECT_COPPER_LAYERS 13002
701#define ID_DESELECT_COPPER_LAYERS 13003
702#define ID_SELECT_ALL_LAYERS 13004
703#define ID_DESELECT_ALL_LAYERS 13005
704#define ID_STACKUP_ORDER 13006
714 menu.Append(
new wxMenuItem( &menu,
ID_LAYER_FAB,
_(
"Select Fab Layers" ) ) );
716 menu.AppendSeparator();
720 menu.AppendSeparator();
724 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
725 [&]( wxCommandEvent& aCmd )
727 switch( aCmd.GetId() )
735 if( ( layermask & fab_layer_set ).
any() )
789 menu.AppendSeparator();
790 menu.Append(
new wxMenuItem( &menu,
ID_STACKUP_ORDER,
_(
"Order as Board Stackup" ) ) );
792 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
793 [&]( wxCommandEvent& aCmd )
795 switch( aCmd.GetId() )
811 LSEQ stackup =
m_editFrame->GetBoard()->GetEnabledLayers().SeqStackupForPlotting();
856 std::function<bool( wxString* )> textResolver =
857 [&]( wxString* token ) ->
bool
859 return m_editFrame->GetBoard()->ResolveTextVar( token, 0 );
864 wxDirDialog dirDialog(
this,
_(
"Select Output Directory" ),
path );
866 if( dirDialog.ShowModal() == wxID_CANCEL )
869 wxFileName dirName = wxFileName::DirName( dirDialog.GetPath() );
871 wxFileName fn(
Prj().AbsolutePath(
m_editFrame->GetBoard()->GetFileName() ) );
872 wxString defaultPath = fn.GetPathWithSep();
873 wxFileName relPathTest;
875 relPathTest.Assign( dirDialog.GetPath() );
878 if( relPathTest.MakeRelativeTo( defaultPath ) )
880 if(
IsOK(
this, wxString::Format(
_(
"Do you want to use a path relative to\n'%s'?" ), defaultPath ) ) )
881 dirName.MakeRelativeTo( defaultPath );
923 wxSizer* shownFormatSizer =
nullptr;
1029static bool setDouble(
double* aResult,
double aValue,
double aMin,
double aMax )
1036 else if( aValue > aMax )
1047static bool setInt(
int* aResult,
int aValue,
int aMin,
int aMax )
1054 else if( aValue > aMax )
1132 msg.ToDouble( &tmpDouble );
1138 msg.Printf(
_(
"X scale constrained." ) );
1144 msg.ToDouble( &tmpDouble );
1150 msg.Printf(
_(
"Y scale constrained." ) );
1159 msg.Printf(
_(
"Width correction constrained. The width correction value must be in the"
1160 " range of [%s; %s] for the current design rules." ),
1188 LSET selectedLayers;
1190 for(
unsigned i = 0; i <
m_layerList.size(); i++ )
1200 wxArrayInt plotOnAllLayers;
1205 size_t count = plotOnAllLayers.GetCount();
1207 for(
size_t i = 0; i < count; i++ )
1209 int index = plotOnAllLayers.Item( i );
1212 commonLayers.push_back( client_layer );
1220 selectedLayers = selectedLayers | disabledCopperLayers;
1229 dirStr.Replace( wxT(
"\\" ), wxT(
"/" ) );
1258 EndModal( wxID_OK );
1276 DisplayError(
this,
_(
"No layer selected, Nothing to plot" ) );
1283 std::function<bool( wxString* )> textResolver =
1284 [&]( wxString* token ) ->
bool
1287 return m_editFrame->GetBoard()->ResolveTextVar( token, 0 );
1292 wxFileName outputDir = wxFileName::DirName(
path );
1293 wxString boardFilename =
m_editFrame->GetBoard()->GetFileName();
1299 msg.Printf(
_(
"Could not write plot files to folder '%s'." ), outputDir.GetPath() );
1312 case 0:
m_plotOpts.SetAutoScale(
true );
break;
1353 wxArrayInt plotOnAllLayers;
1358 size_t count = plotOnAllLayers.GetCount();
1360 for(
size_t i = 0; i < count; i++ )
1362 int index = plotOnAllLayers.Item( i );
1365 commonLayers.push_back( client_layer );
1400 std::function<bool( wxString* )> textResolver =
1401 [&]( wxString* token ) ->
bool
1403 return m_editFrame->GetBoard()->ResolveTextVar( token, 0 );
1408 if( !wxDirExists(
path ) )
1410 DisplayError(
this, wxString::Format(
_(
"Directory '%s' does not exist." ),
path ) );
1414 wxLaunchDefaultApplication(
path );
1448 m_hideDNP->Enable( aEvent.IsChecked() );
constexpr EDA_IU_SCALE pcbIUScale
constexpr EDA_IU_SCALE unityScale
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
wxString m_ColorTheme
Active color theme name.
BASE_SET & set(size_t pos)
Container for design settings for a BOARD object.
int GetSmallestClearanceValue() const
int m_SolderMaskExpansion
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
Information pertinent to a Pcbnew printed circuit board.
void SetCurrentVariant(const wxString &aVariant)
wxArrayString GetVariantNamesForUI() const
Return the variant names for UI display.
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
wxString GetCurrentVariant() const
PROJECT * GetProject() const
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
BOARD_DESIGN_SETTINGS & GetDesignSettings()
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
wxCheckBox * m_frontFPPropertyPopups
wxStaticText * m_DRCExclusionsWarning
wxTextCtrl * m_widthAdjustCtrl
wxCheckBox * m_backFPPropertyPopups
wxTextCtrl * m_fineAdjustXCtrl
wxBoxSizer * bmiddleSizer
wxStaticBoxSizer * m_PDFOptionsSizer
wxCheckBox * m_disableApertMacros
wxChoice * m_coordFormatCtrl
wxCheckBox * m_DXF_plotModeOpt
wxChoice * m_SVGColorChoice
wxStaticText * m_staticTextPlotFmt
wxStaticBoxSizer * m_pngOptionsSizer
wxCheckBox * m_DXF_exportAsMultiLayeredFile
STD_BITMAP_BUTTON * m_browseButton
wxTextCtrl * m_outputDirectoryName
wxSpinCtrl * m_svgPrecsision
wxTextCtrl * m_fineAdjustYCtrl
wxCheckBox * m_plotPadNumbers
wxCheckBox * m_useAuxOriginCheckBox
wxStaticBoxSizer * m_PSOptionsSizer
STD_BITMAP_BUTTON * m_openDirButton
wxCheckBox * m_plotPSNegativeOpt
wxChoice * m_variantChoiceCtrl
wxStaticText * m_widthAdjustLabel
wxCheckBox * m_SVG_fitPageToBoard
wxStaticText * m_pdfBackgroundColorText
wxCheckBox * m_DXF_plotTextStrokeFontOpt
wxCheckBox * m_useGerberExtensions
wxCheckBox * m_plotSheetRef
wxBoxSizer * m_SizerSolderMaskAlert
wxCheckBox * m_generateGerberJobFile
wxRadioButton * m_crossoutDNP
wxButton * m_sdbSizer1Apply
wxCheckBox * m_useGerberX2Format
wxCheckListBox * m_layerCheckListBox
wxCheckBox * m_plotMirrorOpt
wxStaticText * m_staticTextDir
wxStaticText * m_widthAdjustUnits
wxStaticBoxSizer * m_svgOptionsSizer
COLOR_SWATCH * m_pdfBackgroundColorSwatch
wxCheckBox * m_forcePSA4OutputOpt
wxCheckBox * m_useGerberNetAttributes
wxCheckBox * m_sketchPadsOnFabLayers
wxCheckBox * m_pngAntialias
wxCheckBox * m_subtractMaskFromSilk
wxBoxSizer * m_PlotOptionsSizer
wxChoice * m_DXF_plotUnits
DIALOG_PLOT_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Plot"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
wxStaticBoxSizer * m_SizerDXF_options
wxCheckBox * m_pdfMetadata
wxChoice * m_drillShapeOpt
wxRadioButton * m_hideDNP
wxCheckBox * m_zoneFillCheck
wxStaticBoxSizer * m_GerberOptionsSizer
WX_HTML_REPORT_PANEL * m_messagesPanel
wxChoice * m_PDFColorChoice
wxChoice * m_plotFormatOpt
void onPDFColorChoice(wxCommandEvent &event) override
DIALOG_PLOT(PCB_EDIT_FRAME *aEditFrame)
void OnRightClickLayers(wxMouseEvent &event)
static LSEQ s_lastAllLayersOrder
The plot on all layers ordering the last time the dialog was opened.
JOB_EXPORT_PCB_PLOT * m_job
PCB_PLOT_PARAMS m_plotOpts
STD_BITMAP_BUTTON * m_bpMoveUp
void onPlotAllListMoveUp(wxCommandEvent &aEvent)
void OnChangeDXFPlotMode(wxCommandEvent &event) override
int m_widthAdjustMinValue
UNIT_BINDER m_trackWidthCorrection
void onBoardSetup(wxHyperlinkEvent &aEvent) override
void OnRightClickAllLayers(wxMouseEvent &event)
void onSketchPads(wxCommandEvent &event) override
void Plot(wxCommandEvent &event) override
wxString m_DRCWarningTemplate
wxRearrangeList * m_plotAllLayersList
bool TransferDataToWindow() override
void onPlotAllListMoveDown(wxCommandEvent &aEvent)
void onRunDRC(wxCommandEvent &event) override
void arrangeAllLayersList(const LSEQ &aSeq)
void onOpenOutputDirectory(wxCommandEvent &event) override
void updatePdfColorOptions()
PCB_EDIT_FRAME * m_editFrame
STD_BITMAP_BUTTON * m_bpMoveDown
void updateJobOutputLabel()
wxString getSelectedVariant() const
void CreateDrillFile(wxCommandEvent &event) override
void onDNPCheckbox(wxCommandEvent &event) override
PLOT_FORMAT getPlotFormat()
void transferPlotParamsToJob()
int m_widthAdjustMaxValue
void onOutputDirectoryBrowseClicked(wxCommandEvent &event) override
void OnGerberX2Checked(wxCommandEvent &event) override
void SetPlotFormat(wxCommandEvent &event) override
void SetupStandardButtons(std::map< int, wxString > aLabels={})
bool m_plotGraphicItemsUsingContours
bool m_useBoardPlotParams
bool m_useProtelFileExtension
bool m_includeNetlistAttributes
bool m_disableApertureMacros
bool m_pdfFrontFPPropertyPopups
@ ALL_LAYERS_SEPARATE_FILE
The most traditional output mode KiCad has had.
@ ONE_PAGE_PER_LAYER_ONE_FILE
"Single Document" mode
wxString m_pdfBackgroundColor
The background color specified in a hex string.
bool m_pdfBackFPPropertyPopups
GEN_MODE m_pdfGenMode
uused by the cli, will be removed when the other behavior is deprecated
double m_trackWidthCorrection
virtual wxString GetSettingsDialogTitle() const
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
LSEQ UIOrder() const
Return the copper, technical and user layers in the order shown in layer widget.
LSEQ SeqStackupForPlotting() const
Return the sequence that is typical for a bottom-to-top stack-up.
static const LSET & AllTechMask()
Return a mask holding all technical layers (no CU layer) on both side.
The main frame for Pcbnew.
void ShowBoardSetupDialog(const wxString &aInitialPage=wxEmptyString, wxWindow *aParent=nullptr)
A helper wxWidgets control client data object to store layer IDs.
PCB_LAYER_ID Layer() const
void SetData(PCB_LAYER_ID aId)
PCB_LAYER_ID_CLIENT_DATA()
PCB_LAYER_ID_CLIENT_DATA(PCB_LAYER_ID aId)
static void PlotJobToPlotOpts(PCB_PLOT_PARAMS &aOpts, JOB_EXPORT_PCB_PLOT *aJob, REPORTER &aReporter)
True when the board's out-of-date-chart policy regenerated charts during the last Plot().
bool Plot(const wxString &aOutputPath, const LSEQ &aLayersToPlot, const LSEQ &aCommonLayers, bool aUseGerberFileExtensions, bool aOutputPathIsSingle=false, std::optional< wxString > aLayerName=std::nullopt, std::optional< wxString > aSheetName=std::nullopt, std::optional< wxString > aSheetPath=std::nullopt, std::vector< wxString > *aOutputFiles=nullptr)
Parameters and options when plotting/printing a board.
void SetDrillMarksType(DRILL_MARKS aVal)
void SetLayerSelection(const LSET &aSelection)
void SetOutputDirectory(const wxString &aDir)
void SetSketchPadsOnFabLayers(bool aFlag)
void SetUseGerberX2format(bool aUse)
void SetA4Output(int aForce)
void SetPlotOnAllLayersSequence(LSEQ aSeq)
void SetDXFPlotPolygonMode(bool aFlag)
void SetPlotFrameRef(bool aFlag)
void SetSketchDNPFPsOnFabLayers(bool aFlag)
bool m_PDFMetadata
Generate PDF metadata for SUBJECT and AUTHOR.
void SetDashedLineGapRatio(double aVal)
void SetPlotPadNumbers(bool aFlag)
COLOR4D m_backgroundColor
Background color to use for PNG and PDF plotting.
bool m_PDFFrontFPPropertyPopups
Generate PDF property popup menus for footprints.
void SetDisableGerberMacros(bool aDisable)
void SetDXFMultiLayeredExportOption(bool aFlag)
void SetScaleSelection(int aSelection)
void SetFineScaleAdjustX(double aVal)
void SetMirror(bool aFlag)
void SetBlackAndWhite(bool blackAndWhite)
void SetGerberPrecision(int aPrecision)
void SetSubtractMaskFromSilk(bool aSubtract)
void SetHideDNPFPsOnFabLayers(bool aFlag)
void SetUseGerberProtelExtensions(bool aUse)
void SetDashedLineDashRatio(double aVal)
void SetDXFPlotUnits(DXF_UNITS aUnit)
void SetPngAntialias(bool aFlag)
void SetIncludeGerberNetlistInfo(bool aUse)
void SetCreateGerberJobFile(bool aCreate)
bool m_PDFSingle
Generate a single PDF file for all layers.
void SetNegative(bool aFlag)
void SetUseAuxOrigin(bool aAux)
bool m_PDFBackFPPropertyPopups
on front and/or back of board
void SetTextMode(PLOT_TEXT_MODE aVal)
void SetSvgFitPageToBoard(int aSvgFitPageToBoard)
void SetSvgPrecision(unsigned aPrecision)
void SetCrossoutDNPFPsOnFabLayers(bool aFlag)
void SetFormat(PLOT_FORMAT aFormat)
void SetFineScaleAdjustY(double aVal)
void SetWidthAdjust(int aVal)
The backing store for a PROJECT, in JSON format.
wxString m_PcbLastPath[LAST_PATH_SIZE]
MRU path storage.
A pure virtual class used to derive REPORTER objects from.
A type-safe container of any type.
wxString ExpandPathVariables(const wxString &aPath, const PROJECT *aProject, const std::function< bool(wxString *)> *aTextResolver)
Expand text variables, environment variables and a leading '~' in a user-entered file path.
wxString ResolveProjectPath(const wxString &aPath, const PROJECT *aProject, const std::function< bool(wxString *)> *aTextResolver)
Expand a user-entered file path as ExpandPathVariables() does, then anchor a relative result at the p...
bool EnsureFileDirectoryExists(wxFileName *aTargetFullFileName, const wxString &aBaseFilename, REPORTER *aReporter)
Make aTargetFullFileName absolute and create the path of this file if it doesn't yet exist.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
static bool setDouble(double *aResult, double aValue, double aMin, double aMax)
static bool setInt(int *aResult, int aValue, int aMin, int aMax)
PCB_LAYER_ID_CLIENT_DATA * getLayerClientData(const wxRearrangeList *aList, int aIdx)
#define ID_SELECT_ALL_LAYERS
static double selectionToScale(int selection)
#define ID_DESELECT_COPPER_LAYERS
#define ID_DESELECT_ALL_LAYERS
#define ID_SELECT_COPPER_LAYERS
Classes used to generate a Gerber job file in JSON.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Return the string from aValue according to aUnits (inch, mm ...) for display.
KICOMMON_API wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
DRILL_MARKS
Plots and prints can show holes in pads and vias 3 options are available:
PLOT_FORMAT
The set of supported output plot formats.
Plotting engines similar to ps (PostScript, Gerber, svg)
COLOR_SETTINGS * GetColorSettings(const wxString &aName)
T * GetAppSettings(const char *aFilename)
IbisParser parser & reporter
Definition of file extensions used in Kicad.