KiCad PCB EDA Suite
dialog_rule_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 <kiface_i.h>
27 #include <confirm.h>
28 #include <pcb_edit_frame.h>
29 #include <pcbnew_settings.h>
30 #include <footprint_edit_frame.h>
31 #include <class_zone.h>
32 #include <zones.h>
33 #include <zone_settings.h>
35 
36 #define LAYER_LIST_COLUMN_CHECK 0
37 #define LAYER_LIST_COLUMN_ICON 1
38 #define LAYER_LIST_COLUMN_NAME 2
39 #define LAYER_LIST_ROW_ALL_INNER_LAYERS 1
40 
42 {
43 public:
45 
46 private:
50  bool m_isFpEditor;
52 
53  bool TransferDataToWindow() override;
54  bool TransferDataFromWindow() override;
55 
56  void OnLayerSelection( wxDataViewEvent& event ) override;
57 };
58 
59 
61 {
62  DIALOG_RULE_AREA_PROPERTIES dlg( aCaller, aSettings );
63 
64  return dlg.ShowModal();
65 }
66 
67 
69  ZONE_SETTINGS* aSettings ) :
71 {
72  m_parent = aParent;
73 
74  m_ptr = aSettings;
75  m_zonesettings = *aSettings;
76 
77  m_isFpEditor = dynamic_cast<FOOTPRINT_EDIT_FRAME*>( aParent ) != nullptr;
78 
79  bool fpEditorMode = m_parent->IsType( FRAME_FOOTPRINT_EDITOR );
80  m_zonesettings.SetupLayersList( m_layers, m_parent, true, fpEditorMode );
81 
82  m_sdbSizerButtonsOK->SetDefault();
83 
85 }
86 
87 
89 {
90  // Init keepout parameters:
96 
98 
99  m_tcName->SetValue( m_zonesettings.m_Name );
100 
102  {
103  case ZONE_BORDER_DISPLAY_STYLE::NO_HATCH: m_OutlineDisplayCtrl->SetSelection( 0 ); break;
104  case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE: m_OutlineDisplayCtrl->SetSelection( 1 ); break;
105  case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL: m_OutlineDisplayCtrl->SetSelection( 2 ); break;
106  }
107 
109 
110  return true;
111 }
112 
113 
114 void DIALOG_RULE_AREA_PROPERTIES::OnLayerSelection( wxDataViewEvent& event )
115 {
116  if( event.GetColumn() != 0 )
117  return;
118 
119  int row = m_layers->ItemToRow( event.GetItem() );
120  wxVariant layerID;
121  m_layers->GetValue( layerID, row, LAYER_LIST_COLUMN_NAME );
122  bool selected = m_layers->GetToggleValue( row, LAYER_LIST_COLUMN_CHECK );
123 
124  // In footprint editor, we have only 3 possible layer selection: C_Cu, inner layers, B_Cu.
125  // So row LAYER_LIST_ROW_ALL_INNER_LAYERS selection is fp editor specific.
126  // in board editor, this row is a normal selection
128  {
129  if( selected )
131  else
132  m_zonesettings.m_Layers &= ~LSET::InternalCuMask();
133  }
134  else
135  m_zonesettings.m_Layers.set( ToLAYER_ID( layerID.GetInteger() ), selected );
136 }
137 
138 
140 {
141  // Init keepout parameters:
148 
149  if( m_zonesettings.m_Layers.count() == 0 )
150  {
151  DisplayError( NULL, _( "No layers selected." ) );
152  return false;
153  }
154 
155  switch( m_OutlineDisplayCtrl->GetSelection() )
156  {
160  }
161 
162  auto cfg = m_parent->GetPcbNewSettings();
164 
166  m_zonesettings.m_ZonePriority = 0; // for a keepout, this param is not used.
167 
168  m_zonesettings.m_Name = m_tcName->GetValue();
169 
171  return true;
172 }
173 
174 
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:240
Class DIALOG_RULE_AREA_PROPERTIES_BASE.
const bool GetDoNotAllowFootprints() const
This file is part of the common library.
#define LAYER_LIST_COLUMN_CHECK
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...
#define LAYER_LIST_COLUMN_NAME
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:115
void SetDoNotAllowFootprints(bool aEnable)
ZONE_SETTINGS m_zonesettings
the working copy of zone settings
void SetDoNotAllowVias(bool aEnable)
LSET is a set of PCB_LAYER_IDs.
#define NULL
void SetDoNotAllowPads(bool aEnable)
DIALOG_RULE_AREA_PROPERTIES(PCB_BASE_FRAME *aParent, ZONE_SETTINGS *aSettings)
static LSET InternalCuMask()
Return a complete set of internal copper layers which is all Cu layers except F_Cu and B_Cu.
Definition: lset.cpp:709
#define LAYER_LIST_ROW_ALL_INNER_LAYERS
const bool GetDoNotAllowVias() const
void SetDoNotAllowTracks(bool aEnable)
void SetIsRuleArea(bool aEnable)
const bool GetDoNotAllowTracks() const
int InvokeRuleAreaEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aSettings)
Function InvokeRuleAreaEditor invokes up a modal dialog window for copper zone editing.
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 OnLayerSelection(wxDataViewEvent &event) override
ZONE_SETTINGS * m_ptr
the pointer to the zone settings of the zone to edit
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).
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:897
PCB_BASE_FRAME basic PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.