KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eeschema_config.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 The 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
20#include <mutex>
21#include <wx/ffile.h>
22
23#include <confirm.h>
25#include <kiway.h>
26#include <symbol_edit_frame.h>
28#include <filename_resolver.h>
29#include <pgm_base.h>
33#include <sch_edit_frame.h>
35#include <sch_painter.h>
36#include <connection_graph.h>
37#include <schematic.h>
39#include <text_var_dependency.h>
50#include <sim/spice_settings.h>
51#include <tool/tool_manager.h>
53
54
57{
58 return ::GetColorSettings( DEFAULT_THEME )->GetColor( aLayer );
59}
60
61
84
85
87{
88 // Load the drawing sheet from the filename stored in BASE_SCREEN::m_DrawingSheetFileName.
89 // If empty, or not existing, the default drawing sheet is loaded.
90
93 resolver.SetProject( &Prj() );
94 resolver.SetProgramBase( &Pgm() );
95
96 wxString filename = resolver.ResolvePath( settings.m_SchDrawingSheetFileName,
97 Prj().GetProjectPath(),
99 wxString msg;
100
101 if( !DS_DATA_MODEL::GetTheInstance().LoadDrawingSheet( filename, &msg ) )
102 ShowInfoBarError( msg, true );
103}
104
105
106void SCH_EDIT_FRAME::ShowSchematicSetupDialog( const wxString& aInitialPage )
107{
108 static std::mutex dialogMutex; // Local static mutex
109
110 std::unique_lock<std::mutex> dialogLock( dialogMutex, std::try_to_lock );
111
112 // One dialog at a time.
113 if( !dialogLock.owns_lock() )
114 {
116 m_schematicSetupDialog->Raise(); // Brings the existing dialog to the front
117
118 return;
119 }
120
121 std::map<wxString, std::vector<wxString>> oldAliases = Prj().GetProjectFile().m_BusAliases;
122
123 DIALOG_SCHEMATIC_SETUP dlg( this );
124
125 if( !aInitialPage.IsEmpty() )
126 dlg.SetInitialPage( aInitialPage, wxEmptyString );
127
128 // Assign dlg to the m_schematicSetupDialog pointer to track its status.
129 // No, this does not escape the function context.
130 NULLER raii_nuller( (void*&) m_schematicSetupDialog ); m_schematicSetupDialog = &dlg;
131
132 if( dlg.ShowModal() == wxID_OK )
133 {
134 // Mark document as modified so that project settings can be saved as part of doc save
135 OnModify();
136
138
141
142 // CROSS_REF keys deliberately excluded — those are driven by per-item
143 // SCH_COMMIT changes.
144 if( SCHEMATIC_TEXT_VAR_ADAPTER* adapter = Schematic().GetTextVarAdapter() )
145 adapter->Tracker().InvalidateProjectScoped();
146
148
149 GetRenderSettings()->SetDefaultPenWidth( Schematic().Settings().m_DefaultLineWidth );
154
155 GetRenderSettings()->SetDashLengthRatio( Schematic().Settings().m_DashedLineDashRatio );
156 GetRenderSettings()->SetGapLengthRatio( Schematic().Settings().m_DashedLineGapRatio );
157
160
161 std::map<wxString, std::vector<wxString>> newAliases = Prj().GetProjectFile().m_BusAliases;
162
163 if( oldAliases != newAliases )
164 {
166 }
167 else if( CONNECTION_GRAPH* graph = Schematic().ConnectionGraph() )
168 {
169 // No connectivity rebuild ran, so a net-chain netclass override or a deleted/renamed
170 // netclass would otherwise leave the chain-derived assignments stale. Re-derive them
171 // directly; chain membership is unaffected by the setup dialog.
172 graph->ApplyNetChainNetclasses();
173 }
174
176 GetCanvas()->Refresh();
177 }
178}
179
180
182{
183 wxFileName fn = Schematic().RootScreen()->GetFileName(); //ConfigFileName
184
186
187 if( !fn.HasName() || !IsWritable( fn, false ) )
188 return;
189
191
192 if( Kiway().Player( FRAME_SIMULATOR, false ) )
194
195 // Save the page layout file if doesn't exist yet (e.g. if we opened a non-kicad schematic)
196
197 // TODO: We need to remove dependence on BASE_SCREEN
199
201 {
202 FILENAME_RESOLVER resolve;
203 resolve.SetProject( &Prj() );
204 resolve.SetProgramBase( &Pgm() );
205
206 wxFileName layoutfn( resolve.ResolvePath( BASE_SCREEN::m_DrawingSheetFileName,
207 Prj().GetProjectPath(),
208 { Schematic().GetEmbeddedFiles() } ) );
209
210 bool success = true;
211
212 if( !layoutfn.IsAbsolute() )
213 success = layoutfn.MakeAbsolute( Prj().GetProjectPath() );
214
215 if( success && layoutfn.IsOk() && !layoutfn.FileExists() && layoutfn.HasName() )
216 {
217 if( layoutfn.DirExists() && layoutfn.IsDirWritable() )
218 {
219 try
220 {
221 DS_DATA_MODEL::GetTheInstance().Save( layoutfn.GetFullPath() );
222 }
223 catch( const IO_ERROR& ioe )
224 {
225 wxLogError( _( "Failed to save drawing sheet '%s': %s" ),
226 layoutfn.GetFullPath(), ioe.What() );
227 }
228 }
229 }
230 }
231
232 // Propagate the root schematic revision to the project file for IPC-2581 BOM export
233 if( Schematic().RootScreen() )
234 {
237 }
238
239 // Update top-level sheets information in the project file
240 const std::vector<SCH_SHEET*>& topLevelSheets = Schematic().GetTopLevelSheets();
241
242 if( !topLevelSheets.empty() )
243 {
244 std::vector<TOP_LEVEL_SHEET_INFO>& projectSheets = Prj().GetProjectFile().GetTopLevelSheets();
245 projectSheets.clear();
246
247 wxString projectPath = Prj().GetProjectPath();
248
249 for( SCH_SHEET* sheet : topLevelSheets )
250 {
252 info.uuid = sheet->m_Uuid;
253 info.name = sheet->GetName();
254
255 // For top-level sheets, get the filename from the screen, not from the sheet's
256 // SHEET_FILENAME field (which is only used for sheet instances on parent sheets)
257 wxString filename;
258
259 if( sheet->GetScreen() )
260 filename = sheet->GetScreen()->GetFileName();
261
262 // Make the filename relative to the project path
263 wxFileName sheetFn( filename );
264
265 if( sheetFn.IsAbsolute() )
266 sheetFn.MakeRelativeTo( projectPath );
267
268 info.filename = sheetFn.GetFullPath();
269
270 projectSheets.push_back( std::move( info ) );
271 }
272 }
273
274 GetSettingsManager()->SaveProject( fn.GetFullPath() );
275}
276
277
279{
280 PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings();
281
282 if( TOOL_MANAGER* toolMgr = GetToolManager() )
283 {
284 if( SCH_SELECTION_TOOL* selTool = toolMgr->GetTool<SCH_SELECTION_TOOL>() )
285 localSettings.m_SchSelectionFilter = selTool->GetFilter();
286 }
287
288 localSettings.m_SchHierarchyCollapsed = m_hierarchy->GetCollapsedPaths();
289}
290
291
293{
294 // For now, axes are forced off in Eeschema even if turned on in config
296 cfg->m_Window.grid.axes_enabled = false;
297
299
300 SCH_SEARCH_DATA* searchData = dynamic_cast<SCH_SEARCH_DATA*>( m_findReplaceData.get() );
301
302 if( searchData )
303 {
310 }
311
313
318}
319
320
322{
325 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
326
327 if( cfg )
328 {
329 cfg->m_System.units = static_cast<int>( GetUserUnits() );
330 cfg->m_AuiPanels.show_schematic_hierarchy = hierarchy_pane.IsShown();
331 cfg->m_AuiPanels.schematic_hierarchy_float = hierarchy_pane.IsFloating();
332
333 // Other parameters (hierarchy_panel_float_width, hierarchy_panel_float_height,
334 // and hierarchy_panel_docked_width should have been updated when resizing the
335 // hierarchy panel
336
337 SCH_SEARCH_DATA* searchData = dynamic_cast<SCH_SEARCH_DATA*>( m_findReplaceData.get() );
338
339 if( searchData )
340 {
347 }
348
349 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
350 m_show_search = searchPaneInfo.IsShown();
352 cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
353 cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
354 cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
355
356 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
357 cfg->m_AuiPanels.show_properties = propertiesPane.IsShown();
358 cfg->m_AuiPanels.properties_splitter = m_propertiesPanel->SplitterProportion();
360
361 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
362 cfg->m_AuiPanels.show_net_nav_panel = netNavigatorPane.IsShown();
363 cfg->m_AuiPanels.float_net_nav_panel = netNavigatorPane.IsFloating();
364
365 if( netNavigatorPane.IsDocked() )
366 {
368 }
369 else
370 {
371 cfg->m_AuiPanels.net_nav_panel_float_pos = netNavigatorPane.floating_pos;
372 cfg->m_AuiPanels.net_nav_panel_float_size = netNavigatorPane.floating_size;
373 }
374
375 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
376 cfg->m_AuiPanels.design_blocks_show = designBlocksPane.IsShown();
377
378 if( designBlocksPane.IsDocked() )
379 {
381 }
382 else
383 {
384 cfg->m_AuiPanels.design_blocks_panel_float_height = designBlocksPane.floating_size.y;
385 cfg->m_AuiPanels.design_blocks_panel_float_width = designBlocksPane.floating_size.x;
386 }
387
388 m_designBlocksPane->SaveSettings();
389
390 wxAuiPaneInfo& remoteSymbolPane = m_auimgr.GetPane( RemoteSymbolPaneName() );
391 cfg->m_AuiPanels.remote_symbol_show = remoteSymbolPane.IsShown();
392
393 if( remoteSymbolPane.IsDocked() )
394 {
396 }
397 else
398 {
399 cfg->m_AuiPanels.remote_symbol_panel_float_height = remoteSymbolPane.floating_size.y;
400 cfg->m_AuiPanels.remote_symbol_panel_float_width = remoteSymbolPane.floating_size.x;
401 }
402 }
403}
404
405
407{
408 wxCHECK_RET( aCfg, "Call to SCH_BASE_FRAME::LoadSettings with null settings" );
409
411
412 // Move legacy user grids to grid list
413 if( !aCfg->m_Window.grid.user_grid_x.empty() )
414 {
415 aCfg->m_Window.grid.grids.emplace_back( GRID{ "User Grid",
417 aCfg->m_Window.grid.user_grid_y } );
418 aCfg->m_Window.grid.user_grid_x = wxEmptyString;
419 aCfg->m_Window.grid.user_grid_y = wxEmptyString;
420 }
421
422 if( aCfg->m_Window.grid.last_size_idx > (int) aCfg->m_Window.grid.grids.size() )
423 aCfg->m_Window.grid.last_size_idx = 1;
424
425 if( aCfg->m_Window.grid.fast_grid_1 > (int) aCfg->m_Window.grid.grids.size() )
426 aCfg->m_Window.grid.fast_grid_1 = 1;
427
428 if( aCfg->m_Window.grid.fast_grid_2 > (int) aCfg->m_Window.grid.grids.size() )
429 aCfg->m_Window.grid.fast_grid_2 = 2;
430}
431
432
434{
435 wxCHECK_RET( aCfg, wxS( "Call to SCH_BASE_FRAME::SaveSettings with null settings" ) );
436
438}
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
WINDOW_SETTINGS m_Window
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
Definition base_screen.h:85
Calculate the connectivity of a schematic and generates netlists.
int ShowModal() override
static DS_DATA_MODEL & GetTheInstance()
Return the instance of DS_DATA_MODEL used in the application.
void Save(const wxString &aFullFileName)
Save the description in a file.
SETTINGS_MANAGER * GetSettingsManager() const
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, INFOBAR_MESSAGE_TYPE aType=INFOBAR_MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
wxAuiManager m_auimgr
bool IsWritable(const wxFileName &aFileName, bool aVerbose=true)
Check if aFileName can be written.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
static const wxString PropertiesPaneName()
static const wxString RemoteSymbolPaneName()
SEARCH_PANE * m_searchPane
static const wxString DesignBlocksPaneName()
std::unique_ptr< EDA_SEARCH_DATA > m_findReplaceData
PROPERTIES_PANEL * m_propertiesPanel
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
FIND_REPLACE_EXTRA m_FindReplaceExtra
Provide an extensible class to resolve 3D model paths.
wxString ResolvePath(const wxString &aFileName, const wxString &aWorkingPath, std::vector< const EMBEDDED_FILES * > aEmbeddedFilesStack)
Determine the full path of the given file name.
void SetProgramBase(PGM_BASE *aBase)
Set a pointer to the application's PGM_BASE instance used to extract the local env vars.
bool SetProject(const PROJECT *aProject, bool *flgChanged=nullptr)
Set the current KiCad project directory as the first entry in the model path list.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
void SetDefaultPenWidth(int aWidth)
void SetDefaultFont(const wxString &aFont)
void SetGapLengthRatio(double aRatio)
void SetDashLengthRatio(double aRatio)
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:1685
void MarkDirty()
Force redraw of view on the next rendering.
Definition view.h:681
virtual void CommonSettingsChanged(int aFlags=0)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition kiway.cpp:594
bool SaveToFile(const wxString &aDirectory="", bool aForce=false) override
Calls Store() and then saves the JSON document contents into the parent JSON_SETTINGS.
Definition raii.h:38
void SetInitialPage(const wxString &aPage, const wxString &aParentPage=wxEmptyString)
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:130
SCHEMATIC_SETTINGS * m_SchematicSettings
struct IP2581_BOM m_IP2581Bom
Layer pair list for the board.
std::map< wxString, std::vector< wxString > > m_BusAliases
Bus alias definitions for the schematic project.
std::vector< TOP_LEVEL_SHEET_INFO > & GetTopLevelSheets()
The project local settings are things that are attached to a particular project, but also might be pa...
SCH_SELECTION_FILTER_OPTIONS m_SchSelectionFilter
std::vector< wxString > m_SchHierarchyCollapsed
Collapsed nodes in the schematic hierarchy navigator.
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition project.cpp:187
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
Definition project.h:210
void IncrementNetclassesTicker()
Definition project.h:118
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:204
void IncrementTextVarsTicker()
Definition project.h:115
These are loaded from Eeschema settings but then overwritten by the project settings.
std::shared_ptr< NGSPICE_SETTINGS > m_NgspiceSettings
Ngspice simulator settings.
Bridges SCHEMATIC's listener stream into the generic TEXT_VAR_TRACKER.
SCHEMATIC_SETTINGS & Settings() const
void RecordERCExclusions()
Scan existing markers and record data from any that are Excluded.
EMBEDDED_FILES * GetEmbeddedFiles() override
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
std::vector< SCH_SHEET * > GetTopLevelSheets() const
Get the list of top-level sheets.
SCH_RENDER_SETTINGS * GetRenderSettings()
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
EESCHEMA_SETTINGS * eeconfig() const
PANEL_SCH_SELECTION_FILTER * m_selectionFilterPanel
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void ShowSchematicSetupDialog(const wxString &aInitialPage=wxEmptyString)
void RefreshOperatingPointDisplay()
Refresh the display of any operating points.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
void SaveProjectLocalSettings() override
Save changes to the project settings to the project (.pro) file.
DIALOG_SCHEMATIC_SETUP * m_schematicSetupDialog
PANEL_REMOTE_SYMBOL * m_remoteSymbolPane
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, PROGRESS_REPORTER *aProgressReporter=nullptr)
Generate the connection data for the entire schematic hierarchy.
SCHEMATIC & Schematic() const
bool LoadProjectSettings()
Load the KiCad project file (*.pro) settings specific to Eeschema.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
static const wxString SearchPaneName()
SCH_DESIGN_BLOCK_PANE * m_designBlocksPane
void LoadDrawingSheet()
Load the drawing sheet file.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
wxGenericTreeCtrl * m_netNavigator
static const wxString SchematicHierarchyPaneName()
static const wxString NetNavigatorPaneName()
void saveProjectSettings() override
Save any design-related project settings associated with this frame.
HIERARCHY_PANE * m_hierarchy
int m_SymbolLineWidth
Override line widths for symbol drawing objects set to default line width.
const wxString & GetFileName() const
Definition sch_screen.h:154
TITLE_BLOCK & GetTitleBlock()
Definition sch_screen.h:165
SCH_SELECTION_FILTER_OPTIONS & GetFilter()
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition sch_sheet.h:48
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Save a loaded project.
const wxString & GetRevision() const
Definition title_block.h:86
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Master controller class:
EDA_UNITS GetUserUnits() const
This file is part of the common library.
#define _(s)
COLOR4D GetLayerColor(SCH_LAYER_ID aLayer)
Helper for all the old plotting/printing code while it still exists.
static FILENAME_RESOLVER * resolver
@ FRAME_SIMULATOR
Definition frame_type.h:38
static const std::string ProjectFileExtension
PROJECT & Prj()
Definition kicad.cpp:669
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:451
@ REPAINT
Item needs to be redrawn.
Definition view_item.h:58
PGM_BASE & Pgm()
The global program "get" accessor.
see class PGM_BASE
@ GLOBAL_CLEANUP
Definition schematic.h:78
#define DEFAULT_THEME
KIWAY Kiway(KFCTL_STANDALONE)
wxString user_grid_x
std::vector< GRID > grids
wxString user_grid_y
Common grid settings, available to every frame.
wxString schRevision
Auto-propagated schematic title block revision.
Information about a top-level schematic sheet.
GRID_SETTINGS grid
#define TEXTVARS_CHANGED
Definition of file extensions used in Kicad.