KiCad PCB EDA Suite
zone_settings.cpp
Go to the documentation of this file.
1 
5 /*
6  * This program source code file is part of KiCad, a free EDA CAD application.
7  *
8  * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
9  * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
10  * Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors.
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, you may find one here:
24  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
25  * or you may search the http://www.gnu.org website for the version 2 license,
26  * or you may write to the Free Software Foundation, Inc.,
27  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
28  */
29 
30 #include <zone_settings.h>
31 
32 #include <convert_to_biu.h>
33 #include <pcbnew.h>
34 #include <pcb_base_frame.h>
35 #include <board.h>
37 #include <zones.h>
38 
39 #include <zone.h>
40 #include <wx/dataview.h>
41 #include <widgets/color_swatch.h>
42 
44 {
45  m_ZonePriority = 0;
46  m_FillMode = ZONE_FILL_MODE::POLYGONS; // Mode for filling zone
47  // Zone clearance value
49  // Min thickness value in filled areas (this is the minimum width of copper to fill solid areas) :
51  m_HatchThickness = 0; // good value of grid line thickness if m_FillMode = ZFM_GRID_PATTERN
52  m_HatchGap = 0; // good value of grid line gap if m_FillMode = ZFM_GRID_PATTERN
53  m_HatchOrientation = 0.0; // Grid style: orientation of grid lines in degrees
54  m_HatchSmoothingLevel = 0; // Grid pattern smoothing type. 0 = no smoothing
55  m_HatchSmoothingValue = 0.1; // Grid pattern chamfer value relative to the gap value
56  m_HatchHoleMinArea = 0.3; // Min size before holes are dropped (ratio of hole size)
57  m_HatchBorderAlgorithm = 1; // 0 = use zone min thickness; 1 = use hatch width
58  m_NetcodeSelection = 0; // Net code selection for the current zone
60  // outlines only, short
61  // hatches or full hatches
62 
63  m_Layers.reset().set( F_Cu );
64  m_Name = wxEmptyString;
65 
66  // thickness of the gap in thermal reliefs:
68  // thickness of the copper bridge in thermal reliefs:
70 
71  m_padConnection = ZONE_CONNECTION::THERMAL; // How pads are covered by copper in zone
72 
73  m_Zone_45_Only = false;
74 
76  m_cornerRadius = 0;
77 
79  m_minIslandArea = 0;
80 
81  SetIsRuleArea( false );
82  SetDoNotAllowCopperPour( false );
83  SetDoNotAllowVias( true );
84  SetDoNotAllowTracks( true );
85  SetDoNotAllowPads( true );
86  SetDoNotAllowFootprints( false );
87 }
88 
89 
91 {
92  m_ZonePriority = aSource.GetPriority();
93  m_FillMode = aSource.GetFillMode();
97  m_HatchGap = aSource.GetHatchGap();
103  m_NetcodeSelection = aSource.GetNetCode();
104  m_Name = aSource.GetZoneName();
108  m_padConnection = aSource.GetPadConnection();
110  m_cornerRadius = aSource.GetCornerRadius();
111  m_isRuleArea = aSource.GetIsRuleArea();
117  m_Zone_45_Only = aSource.GetHV45();
119  m_minIslandArea = aSource.GetMinIslandArea();
120 
121  m_Layers = aSource.GetLayerSet();
122 
123  return *this;
124 }
125 
126 
127 void ZONE_SETTINGS::ExportSetting( ZONE& aTarget, bool aFullExport ) const
128 {
129  aTarget.SetFillMode( m_FillMode );
133  aTarget.SetHatchGap( m_HatchGap );
143  aTarget.SetCornerRadius( m_cornerRadius );
144  aTarget.SetIsRuleArea( GetIsRuleArea() );
150  aTarget.SetHV45( m_Zone_45_Only );
152  aTarget.SetMinIslandArea( GetMinIslandArea() );
153 
154  if( aFullExport )
155  {
156  aTarget.SetPriority( m_ZonePriority );
157  aTarget.SetLayerSet( m_Layers );
158  aTarget.SetZoneName( m_Name );
159 
160  if( !m_isRuleArea )
161  aTarget.SetNetCode( m_NetcodeSelection );
162  }
163 
164  // call SetBorderDisplayStyle last, because hatch lines will be rebuilt,
165  // using new parameters values
167  true );
168 }
169 
170 
172 {
173  if( aRadius < 0 )
174  m_cornerRadius = 0;
175  else
176  m_cornerRadius = aRadius;
177 }
178 
179 
180 #ifdef __WXOSX_MAC__
181 const static wxSize LAYER_BITMAP_SIZE( 28, 28 ); // wxCocoa impl unhappy if this isn't square...
182 #else
183 const static wxSize LAYER_BITMAP_SIZE( 24, 16 );
184 #endif
185 
186 const static wxSize CHECKERBOARD_SIZE( 8, 8 );
187 
188 
189 // A helper for setting up a dialog list for specifying zone layers. Used by all three
190 // zone settings dialogs.
191 void ZONE_SETTINGS::SetupLayersList( wxDataViewListCtrl* aList, PCB_BASE_FRAME* aFrame,
192  bool aShowCopper, bool aFpEditorMode )
193 {
194  BOARD* board = aFrame->GetBoard();
195  COLOR4D backgroundColor = aFrame->GetColorSettings()->GetColor( LAYER_PCB_BACKGROUND );
196  LSET layers = aShowCopper ? LSET::AllCuMask( board->GetCopperLayerCount() )
197  : LSET::AllNonCuMask();
198 
199  // In the Footprint Editor In1_Cu is used as a proxy for "all inner layers"
200  if( aFpEditorMode )
201  layers.set( In1_Cu );
202 
203  wxDataViewColumn* checkColumn = aList->AppendToggleColumn( wxEmptyString );
204  wxDataViewColumn* layerColumn = aList->AppendIconTextColumn( wxEmptyString );
205  wxDataViewColumn* layerIDColumn = aList->AppendTextColumn( wxEmptyString );
206  layerIDColumn->SetHidden( true );
207 
208  int textWidth = 0;
209 
210  for( LSEQ layer = layers.UIOrder(); layer; ++layer )
211  {
212  PCB_LAYER_ID layerID = *layer;
213  wxString layerName = board->GetLayerName( layerID );
214 
215  if( aFpEditorMode && layerID == In1_Cu )
216  layerName = _( "Inner layers" );
217 
218  // wxCOL_WIDTH_AUTOSIZE doesn't work on all platforms, so we calculate width here
219  textWidth = std::max( textWidth, KIUI::GetTextSize( layerName, aList ).x );
220 
221  COLOR4D layerColor = aFrame->GetColorSettings()->GetColor( layerID );
222  auto bitmap = COLOR_SWATCH::MakeBitmap( layerColor, backgroundColor, LAYER_BITMAP_SIZE,
223  CHECKERBOARD_SIZE, aList->GetBackgroundColour() );
224  wxIcon icon;
225  icon.CopyFromBitmap( bitmap );
226 
227  wxVector<wxVariant> row;
228  row.push_back( wxVariant( m_Layers.test( layerID ) ) );
229  row.push_back( wxVariant( wxDataViewIconText( layerName, icon ) ) );
230  row.push_back( wxVariant( wxString::Format( "%i", layerID ) ) );
231  aList->AppendItem( row );
232 
233  if( m_Layers.test( layerID ) )
234  aList->SetToggleValue( true, (unsigned) aList->GetItemCount() - 1, 0 );
235  }
236 
237  int checkColSize = 22;
238  int layerColSize = textWidth + LAYER_BITMAP_SIZE.x + 15;
239 
240  // You'd think the fact that m_layers is a list would encourage wxWidgets not to save room
241  // for the tree expanders... but you'd be wrong. Force indent to 0.
242  aList->SetIndent( 0 );
243  aList->SetMinClientSize( wxSize( checkColSize + layerColSize, aList->GetMinClientSize().y ) );
244 
245  checkColumn->SetWidth( checkColSize );
246  layerColumn->SetWidth( layerColSize );
247 }
248 
249 
int m_HatchSmoothingLevel
Definition: zone_settings.h:87
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:750
int GetHatchGap() const
Definition: zone.h:254
void SetIslandRemovalMode(ISLAND_REMOVAL_MODE aRemove)
Definition: zone.h:762
void SetCornerRadius(unsigned int aRadius)
Definition: zone.cpp:358
void SetHatchThickness(int aThickness)
Definition: zone.h:252
int GetNetCode() const
Function GetNetCode.
void SetZoneName(const wxString &aName)
Definition: zone.h:132
bool GetDoNotAllowFootprints() const
Definition: zone.h:752
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:332
void SetDoNotAllowTracks(bool aEnable)
Definition: zone.h:757
const bool GetDoNotAllowFootprints() const
int GetHatchThickness() const
Definition: zone.h:251
unsigned GetPriority() const
Function GetPriority.
Definition: zone.h:124
const bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
Definition: zone.h:747
void SetBorderDisplayStyle(ZONE_BORDER_DISPLAY_STYLE aHatchStyle, int aHatchPitch, bool aRebuildHatch)
Function SetBorderDisplayStyle sets all hatch parameters for the zone.
Definition: zone.cpp:893
double m_HatchSmoothingValue
Definition: zone_settings.h:89
long long int GetMinIslandArea() const
ZONE_BORDER_DISPLAY_STYLE m_ZoneBorderDisplayStyle
Option to show the zone area (outlines only, short hatches or full hatches.
virtual COLOR_SETTINGS * GetColorSettings() override
Helper to retrieve the current color settings.
void SetLayerSet(LSET aLayerSet) override
Definition: zone.cpp:243
bool GetDoNotAllowVias() const
Definition: zone.h:749
static wxBitmap MakeBitmap(KIGFX::COLOR4D aColor, KIGFX::COLOR4D aBackground, wxSize aSize, wxSize aCheckerboardSize, KIGFX::COLOR4D aCheckerboardBackground)
Make a simple color swatch bitmap.
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
Definition: lset.cpp:773
double m_HatchHoleMinArea
Definition: zone_settings.h:90
virtual LSET GetLayerSet() const override
Function GetLayerSet returns a std::bitset of all layers on which the item physically resides.
Definition: zone.cpp:288
double GetHatchSmoothingValue() const
Definition: zone.h:263
bool SetNetCode(int aNetCode, bool aNoAssert)
Sets net using a net code.
long long int m_minIslandArea
ISLAND_REMOVAL_MODE m_removeIslands
wxString m_Name
Definition: zone_settings.h:95
#define ZONE_THERMAL_RELIEF_COPPER_WIDTH_MIL
Definition: zones.h:30
const ISLAND_REMOVAL_MODE GetIslandRemovalMode() const
void SetHV45(bool aConstrain)
Definition: zone.h:818
void SetPriority(unsigned aPriority)
Function SetPriority.
Definition: zone.h:118
void SetFillMode(ZONE_FILL_MODE aFillMode)
Definition: zone.h:180
ZONE_FILL_MODE GetFillMode() const
Definition: zone.h:181
ZONE_SETTINGS & operator<<(const ZONE &aSource)
operator << ( const ZONE& ) was Function ImportSetting copies settings from a given zone into this ob...
Classes used in Pcbnew, CvPcb and GerbView.
void SetIsRuleArea(bool aEnable)
Definition: zone.h:754
void SetDoNotAllowFootprints(bool aEnable)
int GetThermalReliefGap() const
Definition: zone.h:190
void SetDoNotAllowVias(bool aEnable)
int m_NetcodeSelection
Definition: zone_settings.h:93
double GetHatchHoleMinArea() const
Definition: zone.h:266
void SetHatchSmoothingValue(double aValue)
Definition: zone.h:264
bool GetDoNotAllowPads() const
Definition: zone.h:751
PCB_LAYER_ID
A quick note on layer IDs:
bool GetDoNotAllowCopperPour() const
Definition: zone.h:748
LSET is a set of PCB_LAYER_IDs.
int GetMinThickness() const
Definition: zone.h:242
void SetHatchGap(int aStep)
Definition: zone.h:255
wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
Definition: ui_common.cpp:57
int m_cornerSmoothingType
int GetHatchSmoothingLevel() const
Definition: zone.h:260
static int GetDefaultHatchPitch()
Function GetDefaultHatchPitchMils.
Definition: zone.cpp:1091
void SetDoNotAllowPads(bool aEnable)
void ExportSetting(ZONE &aTarget, bool aFullExport=true) const
Function ExportSetting copy settings to a given zone.
void SetDoNotAllowPads(bool aEnable)
Definition: zone.h:758
int GetLocalClearance(wxString *aSource) const override
Function GetLocalClearance returns any local clearances set in the "classic" (ie: pre-rule) system.
Definition: zone.cpp:470
void SetCornerSmoothingType(int aType)
Definition: zone.h:696
bool GetDoNotAllowTracks() const
Definition: zone.h:750
bool m_keepoutDoNotAllowPads
#define ZONE_CLEARANCE_MIL
Definition: zones.h:33
void SetDoNotAllowVias(bool aEnable)
Definition: zone.h:756
const bool GetDoNotAllowVias() const
ZONE handles a list of polygons defining a copper zone.
Definition: zone.h:57
void SetMinThickness(int aMinThickness)
Definition: zone.h:243
void SetDoNotAllowTracks(bool aEnable)
ZONE_BORDER_DISPLAY_STYLE GetHatchStyle() const
Definition: zone.h:612
void SetHatchHoleMinArea(double aPct)
Definition: zone.h:267
void SetIsRuleArea(bool aEnable)
bool GetHV45() const
Definition: zone.h:817
#define ZONE_THICKNESS_MIL
Definition: zones.h:31
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
const bool GetDoNotAllowTracks() const
ZONE_CONNECTION m_padConnection
ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:67
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
double GetHatchOrientation() const
Definition: zone.h:257
void SetHatchSmoothingLevel(int aLevel)
Definition: zone.h:261
Use thermal relief for pads.
unsigned int GetCornerRadius() const
Definition: zone.h:702
ZONE_SETTINGS()
class ZONE_SETTINGS used to handle zones parameters
const bool GetDoNotAllowPads() const
int m_HatchBorderAlgorithm
Definition: zone_settings.h:91
ZONE_FILL_MODE m_FillMode
Definition: zone_settings.h:81
int GetHatchBorderAlgorithm() const
Definition: zone.h:269
COLOR4D GetColor(int aLayer) const
const ISLAND_REMOVAL_MODE GetIslandRemovalMode() const
Definition: zone.h:761
void SetPadConnection(ZONE_CONNECTION aPadConnection)
Definition: zone.h:240
void SetMinIslandArea(long long int aArea)
Definition: zone.h:766
long m_ThermalReliefSpokeWidth
void SetHatchBorderAlgorithm(int aAlgo)
Definition: zone.h:270
static const wxSize CHECKERBOARD_SIZE(8, 8)
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:186
void SetDoNotAllowCopperPour(bool aEnable)
Definition: zone.h:755
#define _(s)
Definition: 3d_actions.cpp:33
bool m_keepoutDoNotAllowCopperPour
int GetCopperLayerCount() const
Definition: board.cpp:425
void SetCornerRadius(int aRadius)
const bool GetDoNotAllowCopperPour() const
void SetHatchOrientation(double aStep)
Definition: zone.h:258
bool m_keepoutDoNotAllowFootprints
void SetThermalReliefGap(int aThermalReliefGap)
Definition: zone.h:183
void SetDoNotAllowCopperPour(bool aEnable)
void SetupLayersList(wxDataViewListCtrl *aList, PCB_BASE_FRAME *aFrame, bool aShowCopper, bool aFpEditorMode=false)
A helper routine for the various zone dialogs (copper, non-copper, keepout).
long long int GetMinIslandArea() const
Definition: zone.h:765
#define ZONE_THERMAL_RELIEF_GAP_MIL
Definition: zones.h:29
void SetLocalClearance(int aClearance)
Definition: zone.h:156
int GetThermalReliefSpokeWidth() const
Definition: zone.h:200
BOARD * GetBoard() const
bool m_keepoutDoNotAllowTracks
ZONE_CONNECTION GetPadConnection(PAD *aPad, wxString *aSource=nullptr) const
Definition: zone.cpp:771
static const wxSize LAYER_BITMAP_SIZE(24, 16)
unsigned int m_cornerRadius
wxString GetZoneName() const
Definition: zone.h:131
LSEQ UIOrder() const
Definition: lset.cpp:888
int GetCornerSmoothingType() const
Definition: zone.h:698
double m_HatchOrientation
Definition: zone_settings.h:86
PCB_BASE_FRAME basic PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
long m_ThermalReliefGap
int m_ZoneMinThickness
Definition: zone_settings.h:83
bool m_keepoutDoNotAllowVias
void SetDoNotAllowFootprints(bool aEnable)
Definition: zone.h:759
void SetThermalReliefSpokeWidth(int aThermalReliefSpokeWidth)
Definition: zone.h:193
COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:100