75 void BindCtrls(
size_t aFrom,
size_t aTo, std::function<
void()> aCb )
80 for(
size_t i = aFrom; i <= aTo; ++i )
83 [aCb]( wxCommandEvent& aEvent )
96 virtual bool Validate( wxArrayString& aErrs )
const {
return true; }
110 return static_cast<int>(
m_boundCtrls[aIndex].m_Binder->GetValue() );
128 m_boundCtrls[aIndex].m_Binder->ChangeAngleValue( aValue );
168 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
190 bool Validate( wxArrayString& aErrs )
const override
197 aErrs.push_back(
_(
"Rectangle cannot be zero-sized." ) );
306 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
434 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
450 bool Validate( wxArrayString& aErrs )
const override
456 aErrs.push_back(
_(
"Arc angle must be greater than 0" ) );
464 if( start == mid || mid ==
end || start ==
end )
466 aErrs.push_back(
_(
"Arc must have 3 distinct points" ) );
477 if( max_offset >= ( std::numeric_limits<VECTOR2I::coord_type>::max() / 2.0 )
478 || center_i == start || center_i ==
end )
480 aErrs.push_back( wxString::Format(
_(
"Invalid Arc with radius %f and angle %f." ),
566 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
588 bool Validate( wxArrayString& aErrs )
const override
592 aErrs.push_back(
_(
"Radius must be greater than 0" ) );
663 wxASSERT( aBoundCtrls.size() ==
NUM_CTRLS );
764 const wxString& aName,
bool aRelative, std::vector<BOUND_CONTROL>& aBoundCtrls )
769 wxWindow* parent = aSizer.GetContainingWindow();
771 wxStaticText* titleLabel =
new wxStaticText( parent, wxID_ANY, aName );
772 aSizer.Add( titleLabel, wxGBPosition( row, col ), wxGBSpan( 1, 3 ),
773 wxALIGN_CENTER_VERTICAL | wxALIGN_CENTER_HORIZONTAL | wxALL | wxEXPAND );
776 for(
size_t coord = 0; coord < 2; ++coord )
778 wxStaticText* label =
new wxStaticText( parent, wxID_ANY, coord == 0 ?
_(
"X:" ) :
_(
"Y:" ) );
779 aSizer.Add( label, wxGBPosition( row, col ), wxDefaultSpan,
780 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT, col > 0 ? 20 : 5 );
782 wxTextCtrl* ctrl =
new wxTextCtrl( parent, wxID_ANY,
"" );
783 aSizer.Add( ctrl, wxGBPosition( row, col + 1 ), wxDefaultSpan,
784 wxEXPAND | wxALIGN_CENTER_VERTICAL, 5 );
786 wxStaticText* units =
new wxStaticText( parent, wxID_ANY,
_(
"mm" ) );
787 aSizer.Add( units, wxGBPosition( row, col + 2 ), wxDefaultSpan,
788 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
790 auto binder = std::make_unique<UNIT_BINDER>( &aFrame, label, ctrl, units );
797 aBoundCtrls.push_back(
BOUND_CONTROL{ std::move( binder ), ctrl } );
801 if( !aSizer.IsColGrowable( col + 1 ) )
802 aSizer.AddGrowableCol( col + 1 );
808 bool aIsAngle, std::vector<BOUND_CONTROL>& aBoundCtrls )
811 wxWindow* parent = aSizer.GetContainingWindow();
813 wxStaticText* label =
new wxStaticText( parent, wxID_ANY, aName + wxS(
":" ) );
814 aSizer.Add( label, wxGBPosition( row, col ), wxDefaultSpan,
815 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT, col > 0 ? 20 : 5 );
817 wxTextCtrl* ctrl =
new wxTextCtrl( parent, wxID_ANY );
818 aSizer.Add( ctrl, wxGBPosition( row, col + 1 ), wxDefaultSpan,
819 wxEXPAND | wxALIGN_CENTER_VERTICAL, 5 );
821 wxStaticText* units =
new wxStaticText( parent, wxID_ANY,
_(
"mm" ) );
822 aSizer.Add( units, wxGBPosition( row, col + 2 ), wxDefaultSpan,
823 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
825 auto binder = std::make_unique<UNIT_BINDER>( &aFrame, label, ctrl, units );
826 binder->SetCoordType( aCoordType );
830 binder->SetPrecision( 4 );
834 aBoundCtrls.push_back(
BOUND_CONTROL{ std::move( binder ), ctrl } );
836 if( !aSizer.IsColGrowable( col + 1 ) )
837 aSizer.AddGrowableCol( col + 1 );
853 SetTitle( wxString::Format( GetTitle(),
m_item->GetFriendlyName() ) );
861 std::set<int> shownPages;
863 const auto showPage =
864 [&]( wxSizer& aMainSizer,
bool aSelect = false )
867 wxWindow* page = aMainSizer.GetContainingWindow();
872 shownPages.insert( pageIdx );
878 switch(
m_item->GetShape() )
975 wxFAIL_MSG(
"Undefined shape" );
982 if( shownPages.count( i ) == 0 )
1019 for(
const auto& [ lineStyle, lineStyleDesc ] :
lineTypeNames )
1051 wxCHECK_RET( aShape, wxT(
"ShowGraphicItemPropertiesDialog() error: NULL item" ) );
1122 int style =
static_cast<int>(
m_item->GetStroke().GetLineStyle() );
1133 if(
m_item->GetLocalSolderMaskMargin().has_value() )
1140 int net =
m_item->GetNetCode();
1156 return DIALOG_SHAPE_PROPERTIES_BASE::TransferDataToWindow();
1162 if( !DIALOG_SHAPE_PROPERTIES_BASE::TransferDataFromWindow() )
1173 bool pushCommit = (
m_item->GetEditFlags() == 0 );
1182 bool wasLocked =
m_item->IsLocked();
1198 m_item->SetLineStyle( it->first );
1205 m_item->SetLocalSolderMaskMargin( {} );
1209 m_item->RebuildBezierToSegmentsPointsList(
m_item->GetMaxError() );
1211 if(
m_item->IsOnCopperLayer() )
1214 m_item->SetNetCode( -1 );
1217 commit.Push(
_(
"Edit Shape Properties" ) );
1223 if( wasLocked !=
m_item->IsLocked() )
1232 wxArrayString errors;
1234 if( !DIALOG_SHAPE_PROPERTIES_BASE::Validate() )
1241 switch(
m_item->GetShape() )
1245 errors.Add(
_(
"Line width must be greater than zero." ) );
1250 errors.Add(
_(
"Line width must be greater than zero for an unfilled circle." ) );
1257 errors.Add(
_(
"Line width must be greater than zero for an unfilled rectangle." ) );
1259 int shortSide = std::min(
m_item->GetRectangleWidth(),
m_item->GetRectangleHeight() );
1263 errors.Add(
_(
"Corner radius must be less than or equal to half the smaller side." ) );
1272 errors.Add(
_(
"Line width must be greater than zero for an unfilled polygon." ) );
1278 errors.Add(
_(
"Line width must be greater than zero." ) );
1284 errors.Add(
_(
"Line width must be greater than zero for an unfilled curve." ) );
1293 if( errors.GetCount() )
1300 return errors.GetCount() == 0;
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
ARC_GEOM_SYNCER(PCB_SHAPE &aShape, std::vector< BOUND_CONTROL > &aBoundCtrls)
void updateAll() override
bool Validate(wxArrayString &aErrs) const override
BEZIER_GEOM_SYNCER(PCB_SHAPE &aShape, std::vector< BOUND_CONTROL > &aBoundCtrls)
void updateAll() override
bool IsLocked() const override
const NETINFO_LIST & GetNetInfo() const
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
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_cbRoundRect
wxCheckBox * m_hasSolderMask
wxGridBagSizer * m_gbsRectangleByCenterSize
wxGridBagSizer * m_gbsCircleCenterPoint
wxTextCtrl * m_cornerRadiusCtrl
wxGridBagSizer * m_gbsLineByStartMid
NET_SELECTOR * m_netSelector
wxTextCtrl * m_thicknessCtrl
wxGridBagSizer * m_gbsLineByEnds
wxStaticText * m_netLabel
wxStaticText * m_solderMaskMarginUnit
wxGridBagSizer * m_gbsRectangleByCornerSize
wxStaticText * m_thicknessUnits
PCB_LAYER_BOX_SELECTOR * m_LayerSelectionCtrl
wxTextCtrl * m_solderMaskMarginCtrl
wxNotebook * m_notebookShapeDefs
wxStaticText * m_techLayersLabel
wxStaticText * m_cornerRadiusUnits
wxStaticText * m_solderMaskMarginLabel
wxGridBagSizer * m_gbsLineByLengthAngle
wxBitmapComboBox * m_lineStyleCombo
wxStaticText * m_thicknessLabel
wxGridBagSizer * m_gbsArcByCSA
wxGridBagSizer * m_gbsArcBySME
wxStaticText * m_fillLabel
wxStaticText * m_cornerRadiusLabel
DIALOG_SHAPE_PROPERTIES_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("%s Properties"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
PCB_BASE_EDIT_FRAME * m_parent
UNIT_BINDER m_cornerRadius
DIALOG_SHAPE_PROPERTIES(SCH_BASE_FRAME *aParent, SCH_SHAPE *aShape)
UNIT_BINDER m_solderMaskMargin
std::unique_ptr< GEOM_SYNCER > m_geomSync
bool TransferDataToWindow() override
void onCornerRadius(wxCommandEvent &event) override
~DIALOG_SHAPE_PROPERTIES() override=default
void onRoundedRectChanged(wxCommandEvent &event) 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...
The base class for create windows for drawing purpose.
UI_FILL_MODE GetFillModeProp() const
const VECTOR2I & GetBezierC2() const
void SetBezierC2(const VECTOR2I &aPt)
void SetCenter(const VECTOR2I &aCenter)
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.
const VECTOR2I & GetBezierC1() const
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
Set the end point from the angle center and start.
int GetCornerRadius() const
VECTOR2I GetArcMid() const
static const TOOL_EVENT SelectedEvent
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.
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 & AllLayersMask()
Common, abstract interface for edit frames.
void ShowGraphicItemPropertiesDialog(PCB_SHAPE *aShape)
virtual PCB_LAYER_ID GetActiveLayer() const
The main frame for Pcbnew.
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
STROKE_PARAMS GetStroke() const override
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
void updateAll() override
bool Validate(wxArrayString &aErrs) const override
void OnCenterSizeChange()
RECTANGLE_GEOM_SYNCER(PCB_SHAPE &aShape, std::vector< BOUND_CONTROL > &aBoundCtrls)
void OnCornerSizeChange()
virtual void ChangeValue(int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion WITHOUT trigger...
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.
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
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
VECTOR2< double > VECTOR2D