31 #include <wx/msgdlg.h> 33 #include <boost/algorithm/string/join.hpp> 133 ARRAY_AXIS::NUMBERING_TYPE::NUMBERING_NUMERIC,
134 _(
"Numerals (0,1,2,...,9,10)" ),
137 ARRAY_AXIS::NUMBERING_TYPE::NUMBERING_HEX,
138 _(
"Hexadecimal (0,1,...,F,10,...)" ),
141 ARRAY_AXIS::NUMBERING_TYPE::NUMBERING_ALPHA_NO_IOSQXZ,
142 _(
"Alphabet, minus IOSQXZ" ),
145 ARRAY_AXIS::NUMBERING_TYPE::NUMBERING_ALPHA_FULL,
146 _(
"Alphabet, full 26 characters" ),
151 std::unique_ptr<ARRAY_OPTIONS>& aSettings,
152 bool aIsFootprintEditor,
const wxPoint& aOrigPos ) :
154 m_settings( aSettings ),
155 m_originalItemPosition( aOrigPos ),
156 m_isFootprintEditor( aIsFootprintEditor ),
157 m_hSpacing( aParent, m_labelDx, m_entryDx, m_unitLabelDx ),
158 m_vSpacing( aParent, m_labelDy, m_entryDy, m_unitLabelDy ),
159 m_hOffset( aParent, m_labelOffsetX, m_entryOffsetX, m_unitLabelOffsetX ),
160 m_vOffset( aParent, m_labelOffsetY, m_entryOffsetY, m_unitLabelOffsetY ),
161 m_hCentre( aParent, m_labelCentreX, m_entryCentreX, m_unitLabelCentreX ),
162 m_vCentre( aParent, m_labelCentreY, m_entryCentreY, m_unitLabelCentreY ),
163 m_circRadius( aParent, m_labelCircRadius, m_valueCircRadius, m_unitLabelCircRadius ),
164 m_circAngle( aParent, m_labelCircAngle, m_entryCircAngle, m_unitLabelCircAngle ),
178 const wxString label = wxGetTranslation( numData.m_label );
179 void* clientData = (
void*) &numData;
242 SetMinSize( GetSize() );
262 static bool validateLongEntry(
const wxTextEntry& entry,
long& dest,
const wxString& description,
263 wxArrayString& errors )
267 if( !entry.GetValue().ToLong( &dest ) )
270 err.Printf(
_(
"Bad numeric value for %s: %s" ), description, entry.GetValue() );
290 const wxTextCtrl& aStepEntry,
ARRAY_AXIS& aAxis,
291 wxArrayString& errors )
293 void* clientData = typeEntry.GetClientData( typeEntry.GetSelection() );
294 const NUMBERING_LIST_DATA* numberingData = static_cast<NUMBERING_LIST_DATA*>( clientData );
296 wxCHECK_MSG( numberingData,
false, wxT(
"Failed to get client data from list control." ) );
300 const wxString
text = offsetEntry.GetValue();
306 errors.Add(
wxString::Format(
_(
"Could not determine numbering start from '%s': " 307 "expected value consistent with alphabet '%s'." ),
325 std::unique_ptr<ARRAY_OPTIONS> newSettings;
327 wxArrayString errors;
332 auto newGrid = std::make_unique<ARRAY_GRID_OPTIONS>();
358 if( newGrid->GetNumberingStartIsSpecified() )
365 newGrid->m_pri_axis, errors );
367 if( newGrid->m_2dArrayNumbering )
371 newGrid->m_sec_axis, errors )
380 newGrid->m_2dArrayNumbering =
false;
381 newGrid->m_pri_axis.SetAxisType( ARRAY_AXIS::NUMBERING_TYPE::NUMBERING_NUMERIC );
382 newGrid->m_pri_axis.SetOffset( 1 );
388 newSettings = std::move( newGrid );
392 auto newCirc = std::make_unique<ARRAY_CIRCULAR_OPTIONS>();
409 if( newCirc->GetNumberingStartIsSpecified() )
418 newCirc->m_axis.SetAxisType( ARRAY_AXIS::NUMBERING_TYPE::NUMBERING_NUMERIC );
419 newCirc->m_axis.SetOffset( 1 );
425 newSettings = std::move( newCirc );
445 if( errors.IsEmpty() )
446 errorStr =
_(
"Bad parameters");
448 errorStr = boost::algorithm::join( errors, wxT(
"\n" ) );
450 wxMessageBox( errorStr );
wxRadioButton * m_radioBtnUniqueRefs
wxTextCtrl * m_entryGridPriNumberingOffset
wxString m_CircNumberingOffset
void OnParameterChanged(wxCommandEvent &event) override
Implementation of conversion functions that require both schematic and board internal units.
wxPanel * m_gridPadNumberingPanel
wxRadioButton * m_radioBtnKeepRefs
std::unique_ptr< ARRAY_OPTIONS > & m_settings
The settings to re-seat on dialog OK.
wxRadioBox * m_radioBoxGridStaggerType
wxCheckBox * m_entryRotateItemsCb
wxPanel * m_footprintReannotatePanel
bool m_FootprintKeepAnnotations
wxStaticText * m_labelGridNumberingOffset
wxPanel * m_circularPanel
wxPanel * m_circularPadNumberingPanel
static bool validateLongEntry(const wxTextEntry &entry, long &dest, const wxString &description, wxArrayString &errors)
Validate and save a long integer entry.
void SetAxisType(NUMBERING_TYPE aType)
Set the axis numbering type.
bool SetOffset(const wxString &aOffsetName)
Set the axis start (as a string, which should decode to a valid index in the alphabet)
long m_GridSecondaryAxisScheme
wxRadioBox * m_rbGridStartNumberingOpt
TEXT_CTRL_EVAL * m_entryStagger
wxTextCtrl * m_entryCircNumberingStep
wxStaticText * m_labelPriAxisNumbering
WIDGET_SAVE_RESTORE m_cfg_persister
wxCheckBox * m_checkBoxGridReverseNumbering
long m_GridPrimaryAxisScheme
bool m_CircRotatationStep
CREATE_ARRAY_DIALOG_ENTRIES()
Construct with some sensible defaults.
long m_GridPrimaryAxisStep
void SetStep(int aStep)
Set the skip between consecutive numbers (useful when doing a partial array, e.g.
wxChoice * m_choiceCircNumbering
TEXT_CTRL_EVAL * m_entryNy
wxString m_GridSecondaryNumOffset
wxRadioBox * m_rbCircStartNumberingOpt
Class that contains information about a single array axis and the numbering of items along that axis.
void calculateCircularArrayProperties()
wxTextCtrl * m_entryCircNumberingStart
wxRadioBox * m_radioBoxGridNumberingScheme
wxStaticText * m_labelSecAxisNumbering
bool TransferDataFromWindow() override
wxButton * m_stdButtonsOK
TEXT_CTRL_EVAL * m_entryNx
wxChoice * m_choiceSecAxisNumbering
wxTextCtrl * m_entryGridSecNumberingStep
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Struct containing the last-entered values for the dialog.
DIALOG_CREATE_ARRAY(PCB_BASE_FRAME *aParent, std::unique_ptr< ARRAY_OPTIONS > &aOptions, bool enableNumbering, const wxPoint &aOrigPos)
Construct a new dialog.
virtual void SetUnits(EDA_UNITS aUnits)
Normally not needed (as the UNIT_BINDER inherits from the parent frame), but can be used to set to DE...
wxString m_GridPrimaryNumOffset
wxNotebook * m_gridTypeNotebook
TEXT_CTRL_EVAL * m_entryCircCount
static const std::vector< NUMBERING_LIST_DATA > numberingTypeData
List of type <--> name mappings (in order) for the numbering type list boxes.
Local mapping for list-box <-> numbering type.
wxRadioBox * m_radioBoxGridNumberingAxis
void setControlEnablement()
long m_GridSecondaryAxisStep
static bool validateAxisOptions(const wxTextCtrl &offsetEntry, const wxChoice &typeEntry, const wxTextCtrl &aStepEntry, ARRAY_AXIS &aAxis, wxArrayString &errors)
Validates and saves (if valid) the type and offset of an array axis numbering.
wxTextCtrl * m_entryGridSecNumberingOffset
wxTextCtrl * m_entryGridPriNumberingStep
virtual void SetValue(int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
virtual long long int GetValue()
Return the current value in Internal Units.
long m_Grid2dArrayNumbering
void SetCoordType(ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType)
Set the current origin transform mode.
ARRAY_AXIS::NUMBERING_TYPE m_numbering_type
Class DIALOG_CREATE_ARRAY_BASE.
double DoubleValueFromString(EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType)
Function DoubleValueFromString converts aTextValue to a double.
bool m_FootprintReannotate
static constexpr int Millimeter2iu(double mm)
const wxString & GetAlphabet() const
Get the alphabet for the current numbering scheme.
static CREATE_ARRAY_DIALOG_ENTRIES s_arrayOptions
wxChoice * m_choicePriAxisNumbering
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
wxTextCtrl * m_entryCircAngle
const wxPoint m_originalItemPosition