72 void BindCtrls(
size_t aFrom,
size_t aTo, std::function<
void()> aCb )
77 for(
size_t i = aFrom; i <= aTo; ++i )
80 [aCb]( wxCommandEvent& aEvent )
93 virtual bool Validate( wxArrayString& aErrs )
const {
return true; }
98 wxTextCtrl*
GetCtrl(
size_t aIndex )
const
107 return static_cast<int>(
m_boundCtrls[aIndex].m_Binder->GetValue() );
125 m_boundCtrls[aIndex].m_Binder->ChangeAngleValue( aValue );
165 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
187 bool Validate( wxArrayString& aErrs )
const override
194 aErrs.push_back(
_(
"Rectangle cannot be zero-sized." ) );
303 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
431 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
447 bool Validate( wxArrayString& aErrs )
const override
453 aErrs.push_back(
_(
"Arc angle must be greater than 0" ) );
461 if( start == mid || mid ==
end || start ==
end )
463 aErrs.push_back(
_(
"Arc must have 3 distinct points" ) );
474 if( max_offset >= ( std::numeric_limits<VECTOR2I::coord_type>::max() / 2.0 )
475 || center_i == start || center_i ==
end )
477 aErrs.push_back( wxString::Format(
_(
"Invalid Arc with radius %f and angle %f." ),
563 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
585 bool Validate( wxArrayString& aErrs )
const override
589 aErrs.push_back(
_(
"Radius must be greater than 0" ) );
660 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
758 const wxString& aName,
bool aRelative, std::vector<BOUND_CONTROL>& aBoundCtrls )
763 wxWindow* parent = aSizer.GetContainingWindow();
765 wxStaticText* titleLabel =
new wxStaticText( parent, wxID_ANY, aName );
766 aSizer.Add( titleLabel, wxGBPosition( row, col ), wxGBSpan( 1, 3 ),
767 wxALIGN_CENTER_VERTICAL | wxALIGN_CENTER_HORIZONTAL | wxALL | wxEXPAND );
770 for(
size_t coord = 0; coord < 2; ++coord )
772 wxStaticText* label =
new wxStaticText( parent, wxID_ANY, coord == 0 ?
_(
"X:" ) :
_(
"Y:" ) );
773 aSizer.Add( label, wxGBPosition( row, col ), wxDefaultSpan,
774 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT, col > 0 ? 20 : 5 );
776 wxTextCtrl* ctrl =
new wxTextCtrl( parent, wxID_ANY,
"" );
777 aSizer.Add( ctrl, wxGBPosition( row, col + 1 ), wxDefaultSpan,
778 wxEXPAND | wxALIGN_CENTER_VERTICAL, 5 );
780 wxStaticText* units =
new wxStaticText( parent, wxID_ANY,
_(
"mm" ) );
781 aSizer.Add( units, wxGBPosition( row, col + 2 ), wxDefaultSpan,
782 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
784 auto binder = std::make_unique<UNIT_BINDER>( &aFrame, label, ctrl, units );
791 aBoundCtrls.push_back(
BOUND_CONTROL{ std::move( binder ), ctrl } );
795 if( !aSizer.IsColGrowable( col + 1 ) )
796 aSizer.AddGrowableCol( col + 1 );
802 bool aIsAngle, std::vector<BOUND_CONTROL>& aBoundCtrls )
805 wxWindow* parent = aSizer.GetContainingWindow();
807 wxStaticText* label =
new wxStaticText( parent, wxID_ANY, aName + wxS(
":" ) );
808 aSizer.Add( label, wxGBPosition( row, col ), wxDefaultSpan,
809 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT, col > 0 ? 20 : 5 );
811 wxTextCtrl* ctrl =
new wxTextCtrl( parent, wxID_ANY );
812 aSizer.Add( ctrl, wxGBPosition( row, col + 1 ), wxDefaultSpan,
813 wxEXPAND | wxALIGN_CENTER_VERTICAL, 5 );
815 wxStaticText* units =
new wxStaticText( parent, wxID_ANY,
_(
"mm" ) );
816 aSizer.Add( units, wxGBPosition( row, col + 2 ), wxDefaultSpan,
817 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
819 auto binder = std::make_unique<UNIT_BINDER>( &aFrame, label, ctrl, units );
820 binder->SetCoordType( aCoordType );
824 binder->SetPrecision( 4 );
828 aBoundCtrls.push_back(
BOUND_CONTROL{ std::move( binder ), ctrl } );
830 if( !aSizer.IsColGrowable( col + 1 ) )
831 aSizer.AddGrowableCol( col + 1 );
842 m_thickness( aParent, m_thicknessLabel, m_thicknessCtrl, m_thicknessUnits ),
843 m_solderMaskMargin( aParent, m_solderMaskMarginLabel, m_solderMaskMarginCtrl, m_solderMaskMarginUnit ),
844 m_workingCopy( *m_item )
854 std::set<int> shownPages;
856 const auto showPage =
857 [&]( wxSizer& aMainSizer,
bool aSelect = false )
860 wxWindow* page = aMainSizer.GetContainingWindow();
865 shownPages.insert( pageIdx );
873 case SHAPE_T::RECTANGLE:
892 case SHAPE_T::SEGMENT:
926 case SHAPE_T::CIRCLE:
939 case SHAPE_T::BEZIER:
955 case SHAPE_T::UNDEFINED:
956 wxFAIL_MSG(
"Undefined shape" );
963 if( shownPages.count( i ) == 0 )
1002 for(
const auto& [ lineStyle, lineStyleDesc ] :
lineTypeNames )
1048 wxCHECK_RET( aShape, wxT(
"ShowGraphicItemPropertiesDialog() error: NULL item" ) );
1111 return DIALOG_SHAPE_PROPERTIES_BASE::TransferDataToWindow();
1117 if( !DIALOG_SHAPE_PROPERTIES_BASE::TransferDataFromWindow() )
1169 commit.Push(
_(
"Edit Shape Properties" ) );
1184 wxArrayString errors;
1186 if( !DIALOG_SHAPE_PROPERTIES_BASE::Validate() )
1197 errors.Add(
_(
"Line width must be greater than zero." ) );
1200 case SHAPE_T::CIRCLE:
1202 errors.Add(
_(
"Line width must be greater than zero for an unfilled circle." ) );
1206 case SHAPE_T::RECTANGLE:
1208 errors.Add(
_(
"Line width must be greater than zero for an unfilled rectangle." ) );
1214 errors.Add(
_(
"Line width must be greater than zero for an unfilled polygon." ) );
1218 case SHAPE_T::SEGMENT:
1220 errors.Add(
_(
"Line width must be greater than zero." ) );
1224 case SHAPE_T::BEZIER:
1226 errors.Add(
_(
"Line width must be greater than zero for an unfilled curve." ) );
1235 if( errors.GetCount() )
1242 return errors.GetCount() == 0;
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
ARC_GEOM_SYNCER(PCB_SHAPE &aShape, std::vector< BOUND_CONTROL > &aBoundCtrls)
void updateAll() override
bool Validate(wxArrayString &aErrs) const override
BASE_SET & set(size_t pos)
BEZIER_GEOM_SYNCER(PCB_SHAPE &aShape, std::vector< BOUND_CONTROL > &aBoundCtrls)
void updateAll() override
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
void SetLocked(bool aLocked) override
bool IsLocked() const override
virtual bool IsOnCopperLayer() const
const NETINFO_LIST & GetNetInfo() const
void OnCenterPointChange()
bool Validate(wxArrayString &aErrs) const override
void updateCenterRadius()
CIRCLE_GEOM_SYNCER(PCB_SHAPE &aShape, std::vector< BOUND_CONTROL > &aBoundCtrls)
void updateAll() override
void OnCenterRadiusChange()
Class DIALOG_SHAPE_PROPERTIES_BASE.
wxGridBagSizer * m_gbsBezier
wxGridBagSizer * m_gbsRectangleByCorners
wxGridBagSizer * m_gbsCircleCenterRadius
wxCheckBox * m_hasSolderMask
wxGridBagSizer * m_gbsRectangleByCenterSize
wxGridBagSizer * m_gbsCircleCenterPoint
wxGridBagSizer * m_gbsLineByStartMid
NET_SELECTOR * m_netSelector
wxGridBagSizer * m_gbsLineByEnds
wxStaticText * m_netLabel
wxStaticText * m_solderMaskMarginUnit
wxGridBagSizer * m_gbsRectangleByCornerSize
PCB_LAYER_BOX_SELECTOR * m_LayerSelectionCtrl
wxTextCtrl * m_solderMaskMarginCtrl
wxNotebook * m_notebookShapeDefs
wxStaticText * m_techLayersLabel
wxStaticText * m_solderMaskMarginLabel
wxGridBagSizer * m_gbsLineByLengthAngle
wxBitmapComboBox * m_lineStyleCombo
wxGridBagSizer * m_gbsArcByCSA
wxGridBagSizer * m_gbsArcBySME
wxStaticText * m_fillLabel
PCB_BASE_EDIT_FRAME * m_parent
DIALOG_SHAPE_PROPERTIES(SCH_BASE_FRAME *aParent, SCH_SHAPE *aShape)
UNIT_BINDER m_solderMaskMargin
~DIALOG_SHAPE_PROPERTIES()
std::unique_ptr< GEOM_SYNCER > m_geomSync
bool TransferDataToWindow() override
std::vector< BOUND_CONTROL > m_boundCtrls
void onLayerSelection(wxCommandEvent &event) override
void onTechLayersChanged(wxCommandEvent &event) override
bool TransferDataFromWindow() 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...
FRAME_T GetFrameType() const
The base class for create windows for drawing purpose.
EDA_ITEM_FLAGS GetEditFlags() const
void SetFlags(EDA_ITEM_FLAGS aMask)
UI_FILL_MODE GetFillModeProp() const
const VECTOR2I & GetBezierC2() const
void SetBezierC2(const VECTOR2I &aPt)
void SetCenter(const VECTOR2I &aCenter)
void SetFillModeProp(UI_FILL_MODE)
void SetLineStyle(const LINE_STYLE aStyle)
void RebuildBezierToSegmentsPointsList(int aMaxError)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetEnd(const VECTOR2I &aEnd)
void SetBezierC1(const VECTOR2I &aPt)
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
wxString SHAPE_T_asString() const
const VECTOR2I & GetBezierC1() const
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
Set the end point from the angle center and start.
void SetWidth(int aWidth)
VECTOR2I GetArcMid() const
static const TOOL_EVENT SelectedEvent
A class that operates over a list of BOUND_CONTROLs and keeps them in sync with a PCB_SHAPE.
void ChangeValue(size_t aIndex, int aValue)
wxTextCtrl * GetCtrl(size_t aIndex) const
EDA_ANGLE GetAngleValue(size_t aIndex) const
void BindCtrls(size_t aFrom, size_t aTo, std::function< void()> aCb)
void SetShape(PCB_SHAPE &aShape)
virtual void updateAll()=0
int GetIntValue(size_t aIndex) const
virtual bool Validate(wxArrayString &aErrs) const
const PCB_SHAPE & GetShape() const
void ChangeAngleValue(size_t aIndex, const EDA_ANGLE &aValue)
std::vector< BOUND_CONTROL > & m_boundCtrls
GEOM_SYNCER(PCB_SHAPE &aShape, std::vector< BOUND_CONTROL > &aBoundCtrls)
void ListSet(const wxString &aList)
Add a list of items.
int GetLayerSelection() const
int SetLayerSelection(int layer)
bool SetLayersHotkeys(bool value)
void updateStartMidpoint()
LINE_GEOM_SYNCER(PCB_SHAPE &aShape, std::vector< BOUND_CONTROL > &aBoundCtrls)
void OnStartMidpointChange()
void updateAll() override
LSET is a set of PCB_LAYER_IDs.
static const LSET & ForbiddenFootprintLayers()
Layers which are not allowed within footprint definitions.
void SetNetInfo(const NETINFO_LIST *aNetInfoList)
void SetIndeterminateString(const wxString &aString)
void SetSelectedNetcode(int aNetcode)
Common, abstract interface for edit frames.
void ShowGraphicItemPropertiesDialog(PCB_SHAPE *aShape)
virtual PCB_LAYER_ID GetActiveLayer() const
The main frame for Pcbnew.
void SetBoardFrame(PCB_BASE_FRAME *aFrame)
void SetNotAllowedLayerSet(const LSET &aMask)
std::optional< int > GetLocalSolderMaskMargin() const
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
bool HasSolderMask() const
void SetHasSolderMask(bool aVal)
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
wxString GetFriendlyName() const override
STROKE_PARAMS GetStroke() const override
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Class that keeps a rectangle's various fields all up to date.
void updateAll() override
bool Validate(wxArrayString &aErrs) const override
void OnCenterSizeChange()
RECTANGLE_GEOM_SYNCER(PCB_SHAPE &aShape, std::vector< BOUND_CONTROL > &aBoundCtrls)
void OnCornerSizeChange()
LINE_STYLE GetLineStyle() const
virtual long long int GetValue()
Return the current value in Internal Units.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
bool IsNull() const
Return true if the control holds no value (ie: empty string, not 0).
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
static constexpr EDA_ANGLE ANGLE_0
#define IN_EDIT
Item currently edited.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
bool IsExternalCopperLayer(int aLayerId)
Test whether a layer is an external (F_Cu or B_Cu) copper layer.
PCB_LAYER_ID ToLAYER_ID(int aLayer)
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
KICOMMON_API wxFont GetSmallInfoFont(wxWindow *aWindow)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
static void AddXYPointToSizer(EDA_DRAW_FRAME &aFrame, wxGridBagSizer &aSizer, int row, int col, const wxString &aName, bool aRelative, std::vector< BOUND_CONTROL > &aBoundCtrls)
void AddFieldToSizer(EDA_DRAW_FRAME &aFrame, wxGridBagSizer &aSizer, int row, int col, const wxString &aName, ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType, bool aIsAngle, std::vector< BOUND_CONTROL > &aBoundCtrls)
static std::map< SHAPE_T, int > s_lastTabForShape
static bool isCopper(const PNS::ITEM *aItem)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
const std::map< LINE_STYLE, struct LINE_STYLE_DESC > lineTypeNames
Conversion map between LINE_STYLE values and style names displayed.
std::unique_ptr< UNIT_BINDER > m_Binder
VECTOR2I GetRotated(const VECTOR2I &aVector, const EDA_ANGLE &aAngle)
Return a new VECTOR2I that is the result of rotating aVector by aAngle.
const VECTOR2I CalcArcCenter(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Determine the center of an arc or circle given three points on its circumference.
#define INDETERMINATE_STATE
Used for holding indeterminate values, such as with multiple selections holding different values or c...
VECTOR2< int32_t > VECTOR2I