KiCad PCB EDA Suite
dialog_keepout_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 <dick@softplc.com>
6  * Copyright (C) 1992-2019 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 <fctsys.h>
27 #include <kiface_i.h>
28 #include <confirm.h>
29 #include <pcb_edit_frame.h>
30 #include <pcbnew_settings.h>
31 #include <footprint_edit_frame.h>
32 #include <class_zone.h>
33 #include <zones.h>
34 #include <zone_settings.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 
43 {
44 public:
46 
47 private:
51  bool m_isFpEditor;
53 
54  bool TransferDataToWindow() override;
55  bool TransferDataFromWindow() override;
56 
57  void OnLayerSelection( wxDataViewEvent& event ) override;
58 };
59 
60 
62 {
63  DIALOG_KEEPOUT_AREA_PROPERTIES dlg( aCaller, aSettings );
64 
65  return dlg.ShowModal();
66 }
67 
68 
70  ZONE_SETTINGS* aSettings ) :
72 {
73  m_parent = aParent;
74 
75  m_ptr = aSettings;
76  m_zonesettings = *aSettings;
77 
78  m_isFpEditor = dynamic_cast<FOOTPRINT_EDIT_FRAME*>( aParent ) != nullptr;
79 
80  bool fpEditorMode = m_parent->IsType( FRAME_FOOTPRINT_EDITOR );
81  m_zonesettings.SetupLayersList( m_layers, m_parent, true, fpEditorMode );
82 
83  m_sdbSizerButtonsOK->SetDefault();
84 
86 }
87 
88 
90 {
91  // Init keepout parameters:
97 
99 
100  m_tcName->SetValue( m_zonesettings.m_Name );
101 
103  {
105  m_OutlineAppearanceCtrl->SetSelection( 0 );
106  break;
108  m_OutlineAppearanceCtrl->SetSelection( 1 );
109  break;
111  m_OutlineAppearanceCtrl->SetSelection( 2 );
112  break;
113  }
114 
116 
117  return true;
118 }
119 
120 
122 {
123  if( event.GetColumn() != 0 )
124  return;
125 
126  int row = m_layers->ItemToRow( event.GetItem() );
127  wxVariant layerID;
128  m_layers->GetValue( layerID, row, LAYER_LIST_COLUMN_NAME );
129  bool selected = m_layers->GetToggleValue( row, LAYER_LIST_COLUMN_CHECK );
130 
131  // In footprint editor, we have only 3 possible layer selection: C_Cu, inner layers, B_Cu.
132  // So row LAYER_LIST_ROW_ALL_INNER_LAYERS selection is fp editor specific.
133  // in board editor, this row is a normal selection
135  {
136  if( selected )
138  else
139  m_zonesettings.m_Layers &= ~LSET::InternalCuMask();
140  }
141  else
142  m_zonesettings.m_Layers.set( ToLAYER_ID( layerID.GetInteger() ), selected );
143 }
144 
145 
147 {
148  // Init keepout parameters:
155 
156  // Test for not allowed items: should have at least one item not allowed:
162  {
163  DisplayError( NULL, _("Tracks, vias, and pads are allowed. The keepout will have no effect." ) );
164  return false;
165  }
166 
167  if( m_zonesettings.m_Layers.count() == 0 )
168  {
169  DisplayError( NULL, _( "No layers selected." ) );
170  return false;
171  }
172 
173  switch( m_OutlineAppearanceCtrl->GetSelection() )
174  {
175  case 0:
177  break;
178  case 1:
180  break;
181  case 2:
183  break;
184  }
185 
186  auto cfg = m_parent->GetPcbNewSettings();
187  cfg->m_Zones.hatching_style = static_cast<int>( m_zonesettings.m_Zone_HatchingStyle );
188 
190  m_zonesettings.m_ZonePriority = 0; // for a keepout, this param is not used.
191 
192  m_zonesettings.m_Name = m_tcName->GetValue();
193 
195  return true;
196 }
197 
198 
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:239
int InvokeKeepoutAreaEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aSettings)
Function InvokeKeepoutAreaEditor invokes up a modal dialog window for copper zone editing.
LSET m_Layers
Layers that this zone exists on.
Definition: zone_settings.h:97
const bool GetDoNotAllowFootprints() const
This file is part of the common library.
void FinishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
wxString m_Name
Unique name for the current zone (can be blank)
Definition: zone_settings.h:95
PCBNEW_SETTINGS * GetPcbNewSettings()
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:114
#define LAYER_LIST_COLUMN_NAME
#define LAYER_LIST_ROW_ALL_INNER_LAYERS
void SetDoNotAllowFootprints(bool aEnable)
void SetDoNotAllowVias(bool aEnable)
LSET is a set of PCB_LAYER_IDs.
#define NULL
void SetDoNotAllowPads(bool aEnable)
DIALOG_KEEPOUT_AREA_PROPERTIES(PCB_BASE_FRAME *aParent, ZONE_SETTINGS *aSettings)
int m_ZonePriority
Priority (0 ... N) of the zone.
Definition: zone_settings.h:81
ZONE_HATCH_STYLE m_Zone_HatchingStyle
Option to show the zone area (outlines only, short hatches or full hatches.
static LSET InternalCuMask()
Function InternalCuMask() returns a complete set of internal copper layers, which is all Cu layers ex...
Definition: lset.cpp:672
void OnLayerSelection(wxDataViewEvent &event) override
void SetIsKeepout(bool aEnable)
const bool GetDoNotAllowVias() const
void SetDoNotAllowTracks(bool aEnable)
#define LAYER_LIST_COLUMN_CHECK
ZONE_SETTINGS * m_ptr
the pointer to the zone settings of the zone to edit
Class DIALOG_KEEPOUT_AREA_PROPERTIES_BASE.
const bool GetDoNotAllowTracks() const
ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:67
const bool GetDoNotAllowPads() const
bool IsType(FRAME_T aType) const
#define _(s)
Definition: 3d_actions.cpp:33
const bool GetDoNotAllowCopperPour() const
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).
ZONE_SETTINGS m_zonesettings
the working copy of zone settings
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:849
PCB_BASE_FRAME basic PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.