KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_non_copper_zones_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) 2019 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>
31#include <widgets/unit_binder.h>
32#include <wx/statbox.h>
33#include <wx/statline.h>
34#include <wx/radiobut.h>
35#include <zones.h>
36
38
39
41{
42public:
44 CONVERT_SETTINGS* aConvertSettings );
45
46private:
47 bool TransferDataToWindow() override;
48 bool TransferDataFromWindow() override;
49
50 void OnStyleSelection( wxCommandEvent& event ) override;
51 void OnLayerSelection( wxDataViewEvent& event ) override;
52 void OnUpdateUI( wxUpdateUIEvent& ) override;
53
54private:
57 ZONE_SETTINGS m_settings; // working copy of zone settings
65
67 wxRadioButton* m_rbCenterline;
68 wxRadioButton* m_rbEnvelope;
70};
71
72
74 CONVERT_SETTINGS* aConvertSettings )
75{
76 DIALOG_NON_COPPER_ZONES_EDITOR dlg( aParent, aSettings, aConvertSettings );
77
78 // TODO: why does this require QuasiModal?
79 return dlg.ShowQuasiModal();
80}
81
82#define MIN_THICKNESS 10*pcbIUScale.IU_PER_MILS
83
85 ZONE_SETTINGS* aSettings,
86 CONVERT_SETTINGS* aConvertSettings ) :
88 m_outlineHatchPitch( aParent, m_stBorderHatchPitchText,
89 m_outlineHatchPitchCtrl, m_outlineHatchUnits ),
90 m_minWidth( aParent, m_MinWidthLabel, m_MinWidthCtrl, m_MinWidthUnits ),
91 m_hatchRotation( aParent, m_hatchOrientLabel, m_hatchOrientCtrl, m_hatchOrientUnits ),
92 m_hatchWidth( aParent, m_hatchWidthLabel, m_hatchWidthCtrl, m_hatchWidthUnits),
93 m_hatchGap( aParent, m_hatchGapLabel, m_hatchGapCtrl, m_hatchGapUnits ),
94 m_cornerSmoothingType( ZONE_SETTINGS::SMOOTHING_UNDEFINED ),
95 m_cornerRadius( aParent, m_cornerRadiusLabel, m_cornerRadiusCtrl, m_cornerRadiusUnits ),
96 m_convertSettings( aConvertSettings ),
97 m_rbCenterline( nullptr ),
98 m_rbEnvelope( nullptr ),
99 m_cbDeleteOriginals( nullptr )
100{
101 m_parent = aParent;
102
103 m_ptr = aSettings;
104 m_settings = *aSettings;
105
106 if( aConvertSettings )
107 {
108 wxStaticBox* bConvertBox = new wxStaticBox( this, wxID_ANY, _( "Conversion Settings" ) );
109 wxStaticBoxSizer* bConvertSizer = new wxStaticBoxSizer( bConvertBox, wxVERTICAL );
110
111 m_rbCenterline = new wxRadioButton( this, wxID_ANY, _( "Use centerlines" ) );
112 bConvertSizer->Add( m_rbCenterline, 0, wxLEFT|wxRIGHT, 5 );
113
114 bConvertSizer->AddSpacer( 2 );
115 m_rbEnvelope = new wxRadioButton( this, wxID_ANY, _( "Create bounding hull" ) );
116 bConvertSizer->Add( m_rbEnvelope, 0, wxLEFT|wxRIGHT, 5 );
117
118 bConvertSizer->AddSpacer( 6 );
119 m_cbDeleteOriginals = new wxCheckBox( this, wxID_ANY,
120 _( "Delete source objects after conversion" ) );
121 bConvertSizer->Add( m_cbDeleteOriginals, 0, wxALL, 5 );
122
123 GetSizer()->Insert( 0, bConvertSizer, 0, wxALL|wxEXPAND, 10 );
124
125 wxStaticLine* line = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
126 wxLI_HORIZONTAL );
127 GetSizer()->Insert( 1, line, 0, wxLEFT|wxRIGHT|wxEXPAND, 10 );
128
129 SetTitle( _( "Convert to Non Copper Zone" ) );
130 }
131
132 bool fpEditorMode = m_parent->IsType( FRAME_FOOTPRINT_EDITOR );
133
135
137
139
141}
142
143
145{
146 if( m_cornerSmoothingType != m_cornerSmoothingChoice->GetSelection() )
147 {
149
151 m_cornerRadiusLabel->SetLabel( _( "Chamfer distance:" ) );
152 else
153 m_cornerRadiusLabel->SetLabel( _( "Fillet radius:" ) );
154 }
155
157}
158
159
161{
163 {
165 m_rbEnvelope->SetValue( true );
166 else
167 m_rbCenterline->SetValue( true );
168
170 }
171
174
176 m_cbLocked->SetValue( m_settings.m_Locked );
177
179 {
180 case ZONE_BORDER_DISPLAY_STYLE::NO_HATCH: m_OutlineDisplayCtrl->SetSelection( 0 ); break;
181 case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE: m_OutlineDisplayCtrl->SetSelection( 1 ); break;
182 case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL: m_OutlineDisplayCtrl->SetSelection( 2 ); break;
183 case ZONE_BORDER_DISPLAY_STYLE::INVISIBLE_BORDER: break; // Not used for standard zones
184 }
185
187
189
190 switch( m_settings.m_FillMode )
191 {
192 case ZONE_FILL_MODE::HATCH_PATTERN: m_GridStyleCtrl->SetSelection( 1 ); break;
193 default: m_GridStyleCtrl->SetSelection( 0 ); break;
194 }
195
196 m_hatchRotation.SetUnits( EDA_UNITS::DEGREES );
198
199 // Gives a reasonable value to grid style parameters, if currently there are no defined
200 // parameters for grid pattern thickness and gap (if the value is 0)
201 // the grid pattern thickness default value is (arbitrary) m_ZoneMinThickness * 4
202 // or 1mm
203 // the grid pattern gap default value is (arbitrary) m_ZoneMinThickness * 6
204 // or 1.5 mm
205 int bestvalue = m_settings.m_HatchThickness;
206
207 if( bestvalue <= 0 ) // No defined value for m_hatchWidth
208 bestvalue = std::max( m_settings.m_ZoneMinThickness * 4, pcbIUScale.mmToIU( 1.0 ) );
209
210 m_hatchWidth.SetValue( std::max( bestvalue, m_settings.m_ZoneMinThickness ) );
211
212 bestvalue = m_settings.m_HatchGap;
213
214 if( bestvalue <= 0 ) // No defined value for m_hatchGap
215 bestvalue = std::max( m_settings.m_ZoneMinThickness * 6, pcbIUScale.mmToIU( 1.5 ) );
216
217 m_hatchGap.SetValue( std::max( bestvalue, m_settings.m_ZoneMinThickness ) );
218
221
222 // Enable/Disable some widgets
223 wxCommandEvent event;
224 OnStyleSelection( event );
225
226 return true;
227}
228
229
231{
232 bool enable = m_GridStyleCtrl->GetSelection() >= 1;
233 m_hatchRotation.Enable( enable );
234 m_hatchWidth.Enable( enable );
235 m_hatchGap.Enable( enable );
236 m_smoothLevelLabel->Enable( enable );
237 m_spinCtrlSmoothLevel->Enable( enable );
238 m_smoothValueLabel->Enable( enable );
239 m_spinCtrlSmoothValue->Enable( enable );
240}
241
242
244{
245 if( event.GetColumn() != 0 )
246 return;
247
248 int row = m_layers->ItemToRow( event.GetItem() );
249 bool val = m_layers->GetToggleValue( row, 0 );
250
251 wxVariant layerID;
252 m_layers->GetValue( layerID, row, 2 );
253 m_settings.m_Layers.set( ToLAYER_ID( layerID.GetInteger() ), val );
254}
255
256
258{
260 {
261 if( m_rbEnvelope->GetValue() )
263 else
265
267 }
268
270
272 ? 0 : m_cornerRadius.GetValue() );
273
275
276 switch( m_OutlineDisplayCtrl->GetSelection() )
277 {
278 case 0: m_settings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::NO_HATCH; break;
279 case 1: m_settings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE; break;
280 case 2: m_settings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL; break;
281 }
282
285 return false;
286
288
289 if( m_GridStyleCtrl->GetSelection() > 0 )
290 m_settings.m_FillMode = ZONE_FILL_MODE::HATCH_PATTERN;
291 else
292 m_settings.m_FillMode = ZONE_FILL_MODE::POLYGONS;
293
294
295 if( m_settings.m_FillMode == ZONE_FILL_MODE::HATCH_PATTERN )
296 {
297 int minThickness = m_minWidth.GetValue();
298
299 if( !m_hatchWidth.Validate( minThickness, INT_MAX ) )
300 return false;
301
302 if( !m_hatchGap.Validate( minThickness, INT_MAX ) )
303 return false;
304 }
305
306
312
313 m_settings.m_Locked = m_cbLocked->GetValue();
314
315 // Get the layer selection for this zone
316 int layer = -1;
317 for( int ii = 0; ii < m_layers->GetItemCount(); ++ii )
318 {
319 if( m_layers->GetToggleValue( (unsigned) ii, 0 ) )
320 {
321 layer = ii;
322 break;
323 }
324 }
325
326 if( layer < 0 )
327 {
328 DisplayError( this, _( "No layer selected." ) );
329 return false;
330 }
331
332 *m_ptr = m_settings;
333 return true;
334}
335
336
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
Class DIALOG_NONCOPPER_ZONES_PROPERTIES_BASE.
DIALOG_NON_COPPER_ZONES_EDITOR(PCB_BASE_FRAME *aParent, ZONE_SETTINGS *aSettings, CONVERT_SETTINGS *aConvertSettings)
void OnStyleSelection(wxCommandEvent &event) override
void OnLayerSelection(wxDataViewEvent &event) override
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:102
void SetupStandardButtons(std::map< int, wxString > aLabels={})
int ShowQuasiModal()
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
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
Definition: lset.cpp:758
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
virtual long long int GetValue()
Return the current value in Internal Units.
void Enable(bool aEnable)
Enable/disable the label, widget and units label.
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...
virtual EDA_ANGLE GetAngleValue()
virtual void SetAngleValue(const EDA_ANGLE &aValue)
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:72
EDA_ANGLE m_HatchOrientation
Definition: zone_settings.h:90
double m_HatchSmoothingValue
Definition: zone_settings.h:93
int m_ZoneMinThickness
Definition: zone_settings.h:87
void SetCornerRadius(int aRadius)
void SetupLayersList(wxDataViewListCtrl *aList, PCB_BASE_FRAME *aFrame, LSET aLayers, bool aFpEditorMode)
A helper routine for the various zone dialogs (copper, non-copper, keepout).
int GetCornerSmoothingType() const
ZONE_FILL_MODE m_FillMode
Definition: zone_settings.h:85
void SetCornerSmoothingType(int aType)
int m_HatchSmoothingLevel
Definition: zone_settings.h:91
unsigned int GetCornerRadius() const
ZONE_BORDER_DISPLAY_STYLE m_ZoneBorderDisplayStyle
Option to show the zone area (outlines only, short hatches or full hatches.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:170
This file is part of the common library.
int InvokeNonCopperZonesEditor(PCB_BASE_FRAME *aParent, ZONE_SETTINGS *aSettings, CONVERT_SETTINGS *aConvertSettings)
Function InvokeNonCopperZonesEditor invokes up a modal dialog window for non-copper zone editing.
#define _(s)
@ FRAME_FOOTPRINT_EDITOR
Definition: frame_type.h:43
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:880
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
Definition: ui_common.cpp:154
@ CENTERLINE
@ BOUNDING_HULL
CONVERT_STRATEGY m_Strategy
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
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