KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_rule_area_properties.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <kiface_base.h>
27#include <confirm.h>
28#include <pcb_edit_frame.h>
29#include <pcbnew_settings.h>
30#include <zone_settings.h>
32#include <widgets/unit_binder.h>
33#include <wx/statbox.h>
34#include <wx/statline.h>
35#include <wx/radiobut.h>
36
37#define LAYER_LIST_COLUMN_CHECK 0
38#define LAYER_LIST_COLUMN_ICON 1
39#define LAYER_LIST_COLUMN_NAME 2
40#define LAYER_LIST_ROW_ALL_INNER_LAYERS 1
41
42
44{
45public:
47 CONVERT_SETTINGS* aConvertSettings );
48
49private:
50 bool TransferDataToWindow() override;
51 bool TransferDataFromWindow() override;
52
53 void OnLayerSelection( wxDataViewEvent& event ) override;
54
55private:
61
63 wxRadioButton* m_rbCenterline;
64 wxRadioButton* m_rbBoundingHull;
65 wxStaticText* m_gapLabel;
66 wxTextCtrl* m_gapCtrl;
67 wxStaticText* m_gapUnits;
70};
71
72
74 CONVERT_SETTINGS* aConvertSettings )
75{
76 DIALOG_RULE_AREA_PROPERTIES dlg( aCaller, aZoneSettings, aConvertSettings );
77
78 return dlg.ShowModal();
79}
80
81
83 ZONE_SETTINGS* aSettings,
84 CONVERT_SETTINGS* aConvertSettings ) :
86 m_outlineHatchPitch( aParent, m_stBorderHatchPitchText,
87 m_outlineHatchPitchCtrl, m_outlineHatchUnits ),
88 m_convertSettings( aConvertSettings ),
89 m_rbCenterline( nullptr ),
90 m_rbBoundingHull( nullptr ),
91 m_cbDeleteOriginals( nullptr )
92{
93 m_parent = aParent;
94
95 m_ptr = aSettings;
96 m_zonesettings = *aSettings;
97
98 if( aConvertSettings )
99 {
100 wxStaticBox* bConvertBox = new wxStaticBox( this, wxID_ANY,
101 _( "Conversion Settings" ) );
102 wxStaticBoxSizer* bConvertSizer = new wxStaticBoxSizer( bConvertBox, wxVERTICAL );
103
104 m_rbCenterline = new wxRadioButton( this, wxID_ANY, _( "Use centerlines" ) );
105 bConvertSizer->Add( m_rbCenterline, 0, wxLEFT|wxRIGHT, 5 );
106
107 bConvertSizer->AddSpacer( 2 );
108 m_rbBoundingHull = new wxRadioButton( this, wxID_ANY, _( "Create bounding hull" ) );
109 bConvertSizer->Add( m_rbBoundingHull, 0, wxLEFT|wxRIGHT, 5 );
110
111 m_gapLabel = new wxStaticText( this, wxID_ANY, _( "Gap:" ) );
112 m_gapCtrl = new wxTextCtrl( this, wxID_ANY );
113 m_gapUnits = new wxStaticText( this, wxID_ANY, _( "mm" ) );
114 m_gap = new UNIT_BINDER( aParent, m_gapLabel, m_gapCtrl, m_gapUnits );
115
116 wxBoxSizer* hullParamsSizer = new wxBoxSizer( wxHORIZONTAL );
117 hullParamsSizer->Add( m_gapLabel, 0, wxALIGN_CENTRE_VERTICAL, 5 );
118 hullParamsSizer->Add( m_gapCtrl, 1, wxALIGN_CENTRE_VERTICAL|wxLEFT|wxRIGHT, 3 );
119 hullParamsSizer->Add( m_gapUnits, 0, wxALIGN_CENTRE_VERTICAL, 5 );
120
121 bConvertSizer->AddSpacer( 2 );
122 bConvertSizer->Add( hullParamsSizer, 0, wxLEFT, 26 );
123
124 bConvertSizer->AddSpacer( 6 );
125 m_cbDeleteOriginals = new wxCheckBox( this, wxID_ANY,
126 _( "Delete source objects after conversion" ) );
127 bConvertSizer->Add( m_cbDeleteOriginals, 0, wxALL, 5 );
128
129 GetSizer()->Insert( 0, bConvertSizer, 0, wxALL|wxEXPAND, 10 );
130
131 wxStaticLine* line = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
132 wxLI_HORIZONTAL );
133 GetSizer()->Insert( 1, line, 0, wxLEFT|wxRIGHT|wxEXPAND, 10 );
134
135 SetTitle( _( "Convert to Rule Area" ) );
136 }
137
139
140 BOARD* board = m_parent->GetBoard();
142
144
146
148}
149
150
152{
154 {
156 m_rbBoundingHull->SetValue( true );
157 else
158 m_rbCenterline->SetValue( true );
159
161 }
162
163 // Init keepout parameters:
169
171
172 m_tcName->SetValue( m_zonesettings.m_Name );
173
175 {
176 case ZONE_BORDER_DISPLAY_STYLE::INVISIBLE_BORDER: // Not used for standard zones. Here use NO_HATCH
177 case ZONE_BORDER_DISPLAY_STYLE::NO_HATCH: m_OutlineDisplayCtrl->SetSelection( 0 ); break;
178 case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE: m_OutlineDisplayCtrl->SetSelection( 1 ); break;
179 case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL: m_OutlineDisplayCtrl->SetSelection( 2 ); break;
180 }
181
183
185
186 return true;
187}
188
189
191{
192 if( event.GetColumn() != 0 )
193 return;
194
195 int row = m_layers->ItemToRow( event.GetItem() );
196 wxVariant layerID;
197 m_layers->GetValue( layerID, row, LAYER_LIST_COLUMN_NAME );
198 bool selected = m_layers->GetToggleValue( row, LAYER_LIST_COLUMN_CHECK );
199
200 // In footprint editor, we have only 3 possible layer selection: C_Cu, inner layers, B_Cu.
201 // So row LAYER_LIST_ROW_ALL_INNER_LAYERS selection is fp editor specific.
202 // in board editor, this row is a normal selection
204 {
205 if( selected )
207 else
208 m_zonesettings.m_Layers &= ~LSET::InternalCuMask();
209 }
210 else
211 {
212 m_zonesettings.m_Layers.set( ToLAYER_ID( layerID.GetInteger() ), selected );
213 }
214}
215
216
218{
220 {
221 if( m_rbBoundingHull->GetValue() )
222 {
225 }
226 else
227 {
229 }
230
232 }
233
234 // Init keepout parameters:
241
242 if( m_zonesettings.m_Layers.count() == 0 )
243 {
244 DisplayError( this, _( "No layers selected." ) );
245 return false;
246 }
247
248 switch( m_OutlineDisplayCtrl->GetSelection() )
249 {
250 case 0:
251 m_zonesettings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::NO_HATCH;
252 break;
253 case 1:
254 m_zonesettings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE;
255 break;
256 case 2:
257 m_zonesettings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL;
258 break;
259 }
260
263 return false;
264
266
267 m_zonesettings.m_Locked = m_cbLocked->GetValue();
268 m_zonesettings.m_ZonePriority = 0; // for a keepout, this param is not used.
269
270 m_zonesettings.m_Name = m_tcName->GetValue();
271
273 return true;
274}
275
276
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:276
int GetCopperLayerCount() const
Definition: board.cpp:665
Class DIALOG_RULE_AREA_PROPERTIES_BASE.
void OnLayerSelection(wxDataViewEvent &event) override
ZONE_SETTINGS m_zonesettings
the working copy of zone settings
ZONE_SETTINGS * m_ptr
the pointer to the zone settings of the zone to edit
DIALOG_RULE_AREA_PROPERTIES(PCB_BASE_FRAME *aParent, ZONE_SETTINGS *aSettings, CONVERT_SETTINGS *aConvertSettings)
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:97
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...
bool IsType(FRAME_T aType) const
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:573
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
Definition: lset.cpp:884
static LSET InternalCuMask()
Return a complete set of internal copper layers which is all Cu layers except F_Cu and B_Cu.
Definition: lset.cpp:823
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:863
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
BOARD * GetBoard() const
int GetIntValue()
Definition: unit_binder.h:127
virtual bool Validate(double aMin, double aMax, EDA_UNITS aUnits=EDA_UNITS::UNSCALED)
Validate the control against the given range, informing the user of any errors found.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:71
bool GetDoNotAllowCopperPour() const
void SetIsRuleArea(bool aEnable)
bool GetDoNotAllowTracks() const
void SetDoNotAllowVias(bool aEnable)
bool GetDoNotAllowFootprints() const
bool GetDoNotAllowPads() const
void SetDoNotAllowTracks(bool aEnable)
bool GetDoNotAllowVias() const
unsigned m_ZonePriority
Definition: zone_settings.h:82
void SetupLayersList(wxDataViewListCtrl *aList, PCB_BASE_FRAME *aFrame, LSET aLayers, bool aFpEditorMode)
A helper routine for the various zone dialogs (copper, non-copper, keepout).
wxString m_Name
Definition: zone_settings.h:98
void SetDoNotAllowFootprints(bool aEnable)
void SetDoNotAllowPads(bool aEnable)
ZONE_BORDER_DISPLAY_STYLE m_ZoneBorderDisplayStyle
Option to show the zone area (outlines only, short hatches or full hatches.
void SetDoNotAllowCopperPour(bool aEnable)
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:280
This file is part of the common library.
#define LAYER_LIST_ROW_ALL_INNER_LAYERS
int InvokeRuleAreaEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aZoneSettings, CONVERT_SETTINGS *aConvertSettings)
Function InvokeRuleAreaEditor invokes up a modal dialog window for copper zone editing.
#define LAYER_LIST_COLUMN_NAME
#define LAYER_LIST_COLUMN_CHECK
#define _(s)
@ FRAME_FOOTPRINT_EDITOR
Definition: frame_type.h:43
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:1022
@ CENTERLINE
@ BOUNDING_HULL
CONVERT_STRATEGY m_Strategy
constexpr int mmToIU(double mm) const
Definition: base_units.h:89
Class ZONE_SETTINGS used to handle zones parameters in dialogs.
#define ZONE_BORDER_HATCH_MINDIST_MM
Definition: zones.h:40
#define ZONE_BORDER_HATCH_MAXDIST_MM
Definition: zones.h:41