KiCad PCB EDA Suite
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-2022 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 <widgets/unit_binder.h>
31#include <wx/statbox.h>
32#include <zones.h>
33
35
36
38{
39public:
41 CONVERT_SETTINGS* aConvertSettings );
42
43private:
44 bool TransferDataToWindow() override;
45 bool TransferDataFromWindow() override;
46
47 void OnStyleSelection( wxCommandEvent& event ) override;
48 void OnLayerSelection( wxDataViewEvent& event ) override;
49 void OnUpdateUI( wxUpdateUIEvent& ) override;
50
51private:
54 ZONE_SETTINGS m_settings; // working copy of zone settings
62
66};
67
68
70 CONVERT_SETTINGS* aConvertSettings )
71{
72 DIALOG_NON_COPPER_ZONES_EDITOR dlg( aParent, aSettings, aConvertSettings );
73
74 return dlg.ShowQuasiModal();
75}
76
77#define MIN_THICKNESS 10*pcbIUScale.IU_PER_MILS
78
80 ZONE_SETTINGS* aSettings,
81 CONVERT_SETTINGS* aConvertSettings ) :
83 m_outlineHatchPitch( aParent, m_stBorderHatchPitchText,
84 m_outlineHatchPitchCtrl, m_outlineHatchUnits ),
85 m_minWidth( aParent, m_MinWidthLabel, m_MinWidthCtrl, m_MinWidthUnits ),
86 m_hatchRotation( aParent, m_hatchOrientLabel, m_hatchOrientCtrl, m_hatchOrientUnits ),
87 m_hatchWidth( aParent, m_hatchWidthLabel, m_hatchWidthCtrl, m_hatchWidthUnits),
88 m_hatchGap( aParent, m_hatchGapLabel, m_hatchGapCtrl, m_hatchGapUnits ),
89 m_cornerSmoothingType( ZONE_SETTINGS::SMOOTHING_UNDEFINED ),
90 m_cornerRadius( aParent, m_cornerRadiusLabel, m_cornerRadiusCtrl, m_cornerRadiusUnits ),
91 m_convertSettings( aConvertSettings ),
92 m_cbIgnoreLineWidths( nullptr ),
93 m_cbDeleteOriginals( nullptr )
94{
95 m_parent = aParent;
96
97 m_ptr = aSettings;
98 m_settings = *aSettings;
99
100 if( aConvertSettings )
101 {
102 wxStaticBox* bConvertBox = new wxStaticBox( this, wxID_ANY,
103 _( "Conversion Settings" ) );
104 wxStaticBoxSizer* bConvertSizer = new wxStaticBoxSizer( bConvertBox, wxVERTICAL );
105
106 m_cbIgnoreLineWidths = new wxCheckBox( this, wxID_ANY,
107 _( "Ignore source object line widths" ) );
108 bConvertSizer->Add( m_cbIgnoreLineWidths, 0, wxLEFT|wxRIGHT, 5 );
109
110 m_cbDeleteOriginals = new wxCheckBox( this, wxID_ANY,
111 _( "Delete source objects after conversion" ) );
112 bConvertSizer->Add( m_cbDeleteOriginals, 0, wxALL, 5 );
113
114 GetSizer()->Insert( 0, bConvertSizer, 0, wxALL|wxEXPAND, 10 );
115
116 wxStaticLine* line = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
117 wxLI_HORIZONTAL );
118 GetSizer()->Insert( 1, line, 0, wxLEFT|wxRIGHT|wxEXPAND, 10 );
119
120 SetTitle( _( "Convert to Non Copper Zone" ) );
121 }
122
123 bool fpEditorMode = m_parent->IsType( FRAME_FOOTPRINT_EDITOR );
124
126
128
130
132}
133
134
136{
137 if( m_cornerSmoothingType != m_cornerSmoothingChoice->GetSelection() )
138 {
140
142 m_cornerRadiusLabel->SetLabel( _( "Chamfer distance:" ) );
143 else
144 m_cornerRadiusLabel->SetLabel( _( "Fillet radius:" ) );
145 }
146
148}
149
150
152{
154 {
157 }
158
161
163 m_cbLocked->SetValue( m_settings.m_Locked );
164
166 {
167 case ZONE_BORDER_DISPLAY_STYLE::NO_HATCH: m_OutlineDisplayCtrl->SetSelection( 0 ); break;
170 }
171
173
175
176 switch( m_settings.m_FillMode )
177 {
178 case ZONE_FILL_MODE::HATCH_PATTERN: m_GridStyleCtrl->SetSelection( 1 ); break;
179 default: m_GridStyleCtrl->SetSelection( 0 ); break;
180 }
181
184
185 // Gives a reasonable value to grid style parameters, if currently there are no defined
186 // parameters for grid pattern thickness and gap (if the value is 0)
187 // the grid pattern thickness default value is (arbitrary) m_ZoneMinThickness * 4
188 // or 1mm
189 // the grid pattern gap default value is (arbitrary) m_ZoneMinThickness * 6
190 // or 1.5 mm
191 int bestvalue = m_settings.m_HatchThickness;
192
193 if( bestvalue <= 0 ) // No defined value for m_hatchWidth
194 bestvalue = std::max( m_settings.m_ZoneMinThickness * 4, pcbIUScale.mmToIU( 1.0 ) );
195
196 m_hatchWidth.SetValue( std::max( bestvalue, m_settings.m_ZoneMinThickness ) );
197
198 bestvalue = m_settings.m_HatchGap;
199
200 if( bestvalue <= 0 ) // No defined value for m_hatchGap
201 bestvalue = std::max( m_settings.m_ZoneMinThickness * 6, pcbIUScale.mmToIU( 1.5 ) );
202
203 m_hatchGap.SetValue( std::max( bestvalue, m_settings.m_ZoneMinThickness ) );
204
207
208 // Enable/Disable some widgets
209 wxCommandEvent event;
210 OnStyleSelection( event );
211
212 return true;
213}
214
215
217{
218 bool enable = m_GridStyleCtrl->GetSelection() >= 1;
219 m_hatchRotation.Enable( enable );
220 m_hatchWidth.Enable( enable );
221 m_hatchGap.Enable( enable );
222 m_smoothLevelLabel->Enable( enable );
223 m_spinCtrlSmoothLevel->Enable( enable );
224 m_smoothValueLabel->Enable( enable );
225 m_spinCtrlSmoothValue->Enable( enable );
226}
227
228
230{
231 if( event.GetColumn() != 0 )
232 return;
233
234 int row = m_layers->ItemToRow( event.GetItem() );
235 bool val = m_layers->GetToggleValue( row, 0 );
236
237 wxVariant layerID;
238 m_layers->GetValue( layerID, row, 2 );
239 m_settings.m_Layers.set( ToLAYER_ID( layerID.GetInteger() ), val );
240}
241
242
244{
246 {
249 }
250
252
254 ? 0 : m_cornerRadius.GetValue() );
255
257
258 switch( m_OutlineDisplayCtrl->GetSelection() )
259 {
263 }
264
267 return false;
268
270
271 if( m_GridStyleCtrl->GetSelection() > 0 )
273 else
275
276
278 {
279 int minThickness = m_minWidth.GetValue();
280
281 if( !m_hatchWidth.Validate( minThickness, INT_MAX ) )
282 return false;
283
284 if( !m_hatchGap.Validate( minThickness, INT_MAX ) )
285 return false;
286 }
287
288
294
295 m_settings.m_Locked = m_cbLocked->GetValue();
296
297 // Get the layer selection for this zone
298 int layer = -1;
299 for( int ii = 0; ii < m_layers->GetItemCount(); ++ii )
300 {
301 if( m_layers->GetToggleValue( (unsigned) ii, 0 ) )
302 {
303 layer = ii;
304 break;
305 }
306 }
307
308 if( layer < 0 )
309 {
310 DisplayError( this, _( "No layer selected." ) );
311 return false;
312 }
313
314 *m_ptr = m_settings;
315 return true;
316}
317
318
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
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:97
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:794
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:70
EDA_ANGLE m_HatchOrientation
Definition: zone_settings.h:88
double m_HatchSmoothingValue
Definition: zone_settings.h:91
int m_ZoneMinThickness
Definition: zone_settings.h:85
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:83
void SetCornerSmoothingType(int aType)
int m_HatchSmoothingLevel
Definition: zone_settings.h:89
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:280
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:41
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:926
wxFont GetInfoFont(wxWindow *aWindow)
Definition: ui_common.cpp:144
constexpr int mmToIU(double mm) const
Definition: base_units.h:89
#define ZONE_BORDER_HATCH_MINDIST_MM
Definition: zones.h:40
#define ZONE_BORDER_HATCH_MAXDIST_MM
Definition: zones.h:41