KiCad PCB EDA Suite
dialog_board_setup.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) 2017-2022 KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19#include <pcb_edit_frame.h>
20#include <panel_setup_layers.h>
26#include <../board_stackup_manager/panel_board_stackup.h>
27#include <../board_stackup_manager/panel_board_finish.h>
28#include <confirm.h>
30#include <kiface_base.h>
31#include <drc/drc_item.h>
33#include <io_mgr.h>
36#include <project.h>
42
43#include "dialog_board_setup.h"
44#include "panel_setup_rules.h"
45
46#include <wx/treebook.h>
47
48using std::placeholders::_1;
49
50
52 PAGED_DIALOG( aFrame, _( "Board Setup" ), false,
53 _( "Import Settings from Another Board..." ) ),
54 m_frame( aFrame )
55{
57 BOARD* board = aFrame->GetBoard();
59
60 m_layers = new PANEL_SETUP_LAYERS( this, aFrame );
62 m_formatting = new PANEL_SETUP_FORMATTING( this, aFrame );
63 m_constraints = new PANEL_SETUP_CONSTRAINTS( this, aFrame );
64 m_rules = new PANEL_SETUP_RULES( this, aFrame );
65 m_tracksAndVias = new PANEL_SETUP_TRACKS_AND_VIAS( this, aFrame );
66 m_maskAndPaste = new PANEL_SETUP_MASK_AND_PASTE( this, aFrame );
68 m_boardFinish = new PANEL_SETUP_BOARD_FINISH( this, board );
69
71 bds.m_DRCSeverities );
72
73 m_netclasses = new PANEL_SETUP_NETCLASSES( this, aFrame, project.NetSettings(),
74 board->GetNetClassAssignmentCandidates(), false );
75
77
78 /*
79 * WARNING: If you change page names you MUST update calls to ShowBoardSetupDialog().
80 */
81
82 m_treebook->AddPage( new wxPanel( GetTreebook() ), _( "Board Stackup" ) );
83
84 m_currentPage = -1;
85
86 /*
87 * WARNING: Code currently relies on the layers setup coming before the physical stackup panel,
88 * and thus transferring data to the board first. See comment in
89 * PANEL_SETUP_BOARD_STACKUP::TransferDataFromWindow and rework this logic if it is determined
90 * that the order of these pages should be changed.
91 */
92 m_treebook->AddSubPage( m_layers, _( "Board Editor Layers" ) );
94
95 m_treebook->AddSubPage( m_physicalStackup, _( "Physical Stackup" ) );
96
97 // Change this value if m_physicalStackup is not the page 2 of m_treebook
98 m_physicalStackupPage = 2; // The page number (from 0) to select the m_physicalStackup panel
99
100 m_treebook->AddSubPage( m_boardFinish, _( "Board Finish" ) );
101 m_treebook->AddSubPage( m_maskAndPaste, _( "Solder Mask/Paste" ) );
102
103 m_treebook->AddPage( new wxPanel( GetTreebook() ), _( "Text & Graphics" ) );
104 m_treebook->AddSubPage( m_textAndGraphics, _( "Defaults" ) );
105 m_treebook->AddSubPage( m_formatting, _( "Formatting" ) );
106 m_treebook->AddSubPage( m_textVars, _( "Text Variables" ) );
107
108 m_treebook->AddPage( new wxPanel( GetTreebook() ), _( "Design Rules" ) );
109 m_treebook->AddSubPage( m_constraints, _( "Constraints" ) );
110 m_treebook->AddSubPage( m_tracksAndVias, _( "Pre-defined Sizes" ) );
111 m_treebook->AddSubPage( m_netclasses, _( "Net Classes" ) );
112 m_treebook->AddSubPage( m_rules, _( "Custom Rules" ) );
113 m_treebook->AddSubPage( m_severities, _( "Violation Severity" ) );
114
115 for( size_t i = 0; i < m_treebook->GetPageCount(); ++i )
116 m_treebook->ExpandNode( i );
117
118 m_treebook->SetMinSize( wxSize( -1, 580 ) );
119
121
122 if( Prj().IsReadOnly() )
123 {
124 m_infoBar->ShowMessage( _( "Project is missing or read-only. Some settings will not "
125 "be editable." ), wxICON_WARNING );
126 }
127
128 wxBookCtrlEvent evt( wxEVT_TREEBOOK_PAGE_CHANGED, wxID_ANY, 0 );
129
130 wxQueueEvent( m_treebook, evt.Clone() );
131}
132
133
135{
136}
137
138
139void DIALOG_BOARD_SETUP::onPageChanged( wxBookCtrlEvent& aEvent )
140{
142
143 int page = aEvent.GetSelection();
144
145 // Ensure layer page always gets updated even if we aren't moving towards it
148
149 if( page == m_physicalStackupPage )
151 else if( Prj().IsReadOnly() )
152 KIUI::Disable( m_treebook->GetPage( page ) );
153
154 m_currentPage = page;
155}
156
157
158void DIALOG_BOARD_SETUP::onAuxiliaryAction( wxCommandEvent& aEvent )
159{
160 DIALOG_IMPORT_SETTINGS importDlg( this, m_frame );
161
162 if( importDlg.ShowModal() == wxID_CANCEL )
163 return;
164
165 wxFileName boardFn( importDlg.GetFilePath() );
166 wxFileName projectFn( boardFn );
167
168 projectFn.SetExt( ProjectFileExtension );
169
170 if( !m_frame->GetSettingsManager()->LoadProject( projectFn.GetFullPath(), false ) )
171 {
172 wxString msg = wxString::Format( _( "Error importing settings from board:\n"
173 "Associated project file %s could not be loaded" ),
174 projectFn.GetFullPath() );
175 DisplayErrorMessage( this, msg );
176
177 return;
178 }
179
180 // Flag so user can stop work if it will result in deleted inner copper layers
181 // and still clean up this function properly.
182 bool okToProceed = true;
183
184 PROJECT* otherPrj = m_frame->GetSettingsManager()->GetProject( projectFn.GetFullPath() );
185
187
188 BOARD* otherBoard = nullptr;
189
190 try
191 {
192 WX_PROGRESS_REPORTER progressReporter( this, _( "Loading PCB" ), 1 );
193
194 otherBoard = pi->Load( boardFn.GetFullPath(), nullptr, nullptr, nullptr,
195 &progressReporter );
196
197 if( importDlg.m_LayersOpt->GetValue() )
198 {
199 BOARD* loadedBoard = m_frame->GetBoard();
200
201 // Check if "Import Settings" board has more layers than the current board.
202 okToProceed = m_layers->CheckCopperLayerCount( loadedBoard, otherBoard );
203 }
204 }
205 catch( const IO_ERROR& ioe )
206 {
207 // You wouldn't think boardFn.GetFullPath() would throw, but we get a stack buffer
208 // underflow from ASAN. While it's probably an ASAN error, a second try/catch doesn't
209 // cost us much.
210 try
211 {
212 if( ioe.Problem() != wxT( "CANCEL" ) )
213 {
214 wxString msg = wxString::Format( _( "Error loading board file:\n%s" ),
215 boardFn.GetFullPath() );
216 DisplayErrorMessage( this, msg, ioe.What() );
217 }
218
219 if( otherPrj != &m_frame->Prj() )
220 m_frame->GetSettingsManager()->UnloadProject( otherPrj, false );
221 }
222 catch(...)
223 {
224 // That was already our best-efforts
225 }
226
227 return;
228 }
229
230 if( okToProceed )
231 {
232 otherBoard->SetProject( otherPrj );
233
234 // If layers options are imported, import also the stackup
235 // layers options and stackup are linked, so they cannot be imported
236 // separately, and stackup can be imported only after layers options
237 if( importDlg.m_LayersOpt->GetValue() )
238 {
239 m_layers->ImportSettingsFrom( otherBoard );
241 m_boardFinish->ImportSettingsFrom( otherBoard );
242 }
243
244 if( importDlg.m_TextAndGraphicsOpt->GetValue() )
246
247 if( importDlg.m_FormattingOpt->GetValue() )
248 m_formatting->ImportSettingsFrom( otherBoard );
249
250 if( importDlg.m_ConstraintsOpt->GetValue() )
251 m_constraints->ImportSettingsFrom( otherBoard );
252
253 if( importDlg.m_NetclassesOpt->GetValue() )
255
256 if( importDlg.m_TracksAndViasOpt->GetValue() )
257 m_tracksAndVias->ImportSettingsFrom( otherBoard );
258
259 if( importDlg.m_MaskAndPasteOpt->GetValue() )
260 m_maskAndPaste->ImportSettingsFrom( otherBoard );
261
262 if( importDlg.m_SeveritiesOpt->GetValue() )
264
265 if( otherPrj != &m_frame->Prj() )
266 otherBoard->ClearProject();
267 }
268
269 // Clean up and free memory before leaving
270 if( otherPrj != &m_frame->Prj() )
271 m_frame->GetSettingsManager()->UnloadProject( otherPrj, false );
272
273 delete otherBoard;
274}
Container for design settings for a BOARD object.
std::map< int, SEVERITY > m_DRCSeverities
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:265
std::set< wxString > GetNetClassAssignmentCandidates() const
Return the set of netname candidates for netclass assignment.
Definition: board.cpp:1437
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
Definition: board.cpp:162
void ClearProject()
Definition: board.cpp:196
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:618
DIALOG_BOARD_SETUP(PCB_EDIT_FRAME *aFrame)
PANEL_SETUP_TEXT_AND_GRAPHICS * m_textAndGraphics
PANEL_SETUP_FORMATTING * m_formatting
PCB_EDIT_FRAME * m_frame
PANEL_SETUP_TRACKS_AND_VIAS * m_tracksAndVias
PANEL_SETUP_MASK_AND_PASTE * m_maskAndPaste
PANEL_SETUP_NETCLASSES * m_netclasses
void onAuxiliaryAction(wxCommandEvent &aEvent) override
PANEL_SETUP_CONSTRAINTS * m_constraints
PANEL_SETUP_RULES * m_rules
PANEL_SETUP_BOARD_STACKUP * m_physicalStackup
PANEL_TEXT_VARIABLES * m_textVars
PANEL_SETUP_BOARD_FINISH * m_boardFinish
PANEL_SETUP_LAYERS * m_layers
void onPageChanged(wxBookCtrlEvent &aEvent) override
PANEL_SETUP_SEVERITIES * m_severities
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
static std::vector< std::reference_wrapper< RC_ITEM > > GetItemsWithSeverities()
Definition: drc_item.h:122
SETTINGS_MANAGER * GetSettingsManager() const
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:76
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
virtual const wxString Problem() const
what was the problem?
Definition: exceptions.cpp:46
@ KICAD_SEXP
S-expression Pcbnew file format.
Definition: io_mgr.h:56
static PLUGIN * PluginFind(PCB_FILE_T aFileType)
Return a PLUGIN which the caller can use to import, export, save, or load design documents.
Definition: io_mgr.cpp:58
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
WX_INFOBAR * m_infoBar
Definition: paged_dialog.h:67
wxTreebook * m_treebook
Definition: paged_dialog.h:63
virtual void onPageChanged(wxBookCtrlEvent &aEvent)
wxTreebook * GetTreebook()
Definition: paged_dialog.h:37
void ImportSettingsFrom(BOARD *aBoard)
void ImportSettingsFrom(BOARD *aBoard)
void OnLayersOptionsChanged(LSET aNewLayerSet)
Must be called if the copper layers count has changed or solder mask, solder paste or silkscreen laye...
void ImportSettingsFrom(BOARD *aBoard)
void ImportSettingsFrom(SCHEMATIC_SETTINGS &aSettings)
bool CheckCopperLayerCount(BOARD *aWorkingBoard, BOARD *aImportedBoard)
Check and warn if inner copper layers will be deleted.
void SyncCopperLayers(int aNumCopperLayers)
Called when switching to this tab to make sure that any changes to the copper layer count made on the...
void ImportSettingsFrom(BOARD *aBoard)
void ImportSettingsFrom(const std::shared_ptr< NET_SETTINGS > &aNetSettings)
void ImportSettingsFrom(std::map< int, SEVERITY > &aSettings)
BOARD * GetBoard() const
The main frame for Pcbnew.
Releases a PLUGIN in the context of a potential thrown exception through its destructor.
Definition: io_mgr.h:564
virtual BOARD * Load(const wxString &aFileName, BOARD *aAppendToMe, const PROPERTIES *aProperties=nullptr, PROJECT *aProject=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr)
Load information from some input file format that this PLUGIN implementation knows about into either ...
Definition: plugin.cpp:46
The backing store for a PROJECT, in JSON format.
Definition: project_file.h:65
std::shared_ptr< NET_SETTINGS > m_NetSettings
Net settings for this project (owned here)
Definition: project_file.h:168
Container for project specific data.
Definition: project.h:63
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:148
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads a project or sets up a new project with a specified path.
PROJECT * GetProject(const wxString &aFullPath) const
Retrieves a loaded project by name.
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Saves, unloads and unregisters the given PROJECT.
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Definition: infobar.cpp:142
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:299
This file is part of the common library.
#define _(s)
const std::string ProjectFileExtension
void Disable(wxWindow *aWindow)
Makes a window read-only.
Definition: ui_common.cpp:309
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
Definition of file extensions used in Kicad.