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  {
104  case ZONE_BORDER_DISPLAY_STYLE::NO_HATCH: m_OutlineDisplayCtrl->SetSelection( 0 ); break;
105  case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE: m_OutlineDisplayCtrl->SetSelection( 1 ); break;
106  case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL: m_OutlineDisplayCtrl->SetSelection( 2 ); break;
107  }
108 
110 
111  return true;
112 }
113 
114 
116 {
117  if( event.GetColumn() != 0 )
118  return;
119 
120  int row = m_layers->ItemToRow( event.GetItem() );
121  wxVariant layerID;
122  m_layers->GetValue( layerID, row, LAYER_LIST_COLUMN_NAME );
123  bool selected = m_layers->GetToggleValue( row, LAYER_LIST_COLUMN_CHECK );
124 
125  // In footprint editor, we have only 3 possible layer selection: C_Cu, inner layers, B_Cu.
126  // So row LAYER_LIST_ROW_ALL_INNER_LAYERS selection is fp editor specific.
127  // in board editor, this row is a normal selection
129  {
130  if( selected )
132  else
133  m_zonesettings.m_Layers &= ~LSET::InternalCuMask();
134  }
135  else
136  m_zonesettings.m_Layers.set( ToLAYER_ID( layerID.GetInteger() ), selected );
137 }
138 
139 
141 {
142  // Init keepout parameters:
149 
150  // Test for not allowed items: should have at least one item not allowed:
156  {
157  DisplayError( NULL, _("No items are disallowed. The keepout will have no effect." ) );
158  return false;
159  }
160 
161  if( m_zonesettings.m_Layers.count() == 0 )
162  {
163  DisplayError( NULL, _( "No layers selected." ) );
164  return false;
165  }
166 
167  switch( m_OutlineDisplayCtrl->GetSelection() )
168  {
172  }
173 
174  auto cfg = m_parent->GetPcbNewSettings();
176 
178  m_zonesettings.m_ZonePriority = 0; // for a keepout, this param is not used.
179 
180  m_zonesettings.m_Name = m_tcName->GetValue();
181 
183  return true;
184 }
185 
186 
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.
const bool GetDoNotAllowFootprints() const
This file is part of the common library.
ZONE_BORDER_DISPLAY_STYLE m_ZoneBorderDisplayStyle
Option to show the zone area (outlines only, short hatches or full hatches.
void FinishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
wxString m_Name
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)
static LSET InternalCuMask()
Function InternalCuMask() returns a complete set of internal copper layers, which is all Cu layers ex...
Definition: lset.cpp:679
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:856
PCB_BASE_FRAME basic PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.