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 <schematic.h>
38#include <text_var_dependency.h>
49#include <sim/spice_settings.h>
50#include <tool/tool_manager.h>
52
53
56{
57 return ::GetColorSettings( DEFAULT_THEME )->GetColor( aLayer );
58}
59
60
83
84
86{
87 // Load the drawing sheet from the filename stored in BASE_SCREEN::m_DrawingSheetFileName.
88 // If empty, or not existing, the default drawing sheet is loaded.
89
92 resolver.SetProject( &Prj() );
93 resolver.SetProgramBase( &Pgm() );
94
95 wxString filename = resolver.ResolvePath( settings.m_SchDrawingSheetFileName,
96 Prj().GetProjectPath(),
98 wxString msg;
99
100 if( !DS_DATA_MODEL::GetTheInstance().LoadDrawingSheet( filename, &msg ) )
101 ShowInfoBarError( msg, true );
102}
103
104
105void SCH_EDIT_FRAME::ShowSchematicSetupDialog( const wxString& aInitialPage )
106{
107 static std::mutex dialogMutex; // Local static mutex
108
109 std::unique_lock<std::mutex> dialogLock( dialogMutex, std::try_to_lock );
110
111 // One dialog at a time.
112 if( !dialogLock.owns_lock() )
113 {
115 m_schematicSetupDialog->Raise(); // Brings the existing dialog to the front
116
117 return;
118 }
119
120 std::map<wxString, std::vector<wxString>> oldAliases = Prj().GetProjectFile().m_BusAliases;
121
122 DIALOG_SCHEMATIC_SETUP dlg( this );
123
124 if( !aInitialPage.IsEmpty() )
125 dlg.SetInitialPage( aInitialPage, wxEmptyString );
126
127 // Assign dlg to the m_schematicSetupDialog pointer to track its status.
128 // No, this does not escape the function context.
129 NULLER raii_nuller( (void*&) m_schematicSetupDialog ); m_schematicSetupDialog = &dlg;
130
131 if( dlg.ShowModal() == wxID_OK )
132 {
133 // Mark document as modified so that project settings can be saved as part of doc save
134 OnModify();
135
137
140
141 // CROSS_REF keys deliberately excluded — those are driven by per-item
142 // SCH_COMMIT changes.
143 if( SCHEMATIC_TEXT_VAR_ADAPTER* adapter = Schematic().GetTextVarAdapter() )
144 adapter->Tracker().InvalidateProjectScoped();
145
147
148 GetRenderSettings()->SetDefaultPenWidth( Schematic().Settings().m_DefaultLineWidth );
153
154 GetRenderSettings()->SetDashLengthRatio( Schematic().Settings().m_DashedLineDashRatio );
155 GetRenderSettings()->SetGapLengthRatio( Schematic().Settings().m_DashedLineGapRatio );
156
159
160 std::map<wxString, std::vector<wxString>> newAliases = Prj().GetProjectFile().m_BusAliases;
161
162 if( oldAliases != newAliases )
164
166 GetCanvas()->Refresh();
167 }
168}
169
170
172{
173 wxFileName fn = Schematic().RootScreen()->GetFileName(); //ConfigFileName
174
176
177 if( !fn.HasName() || !IsWritable( fn, false ) )
178 return;
179
181
182 if( Kiway().Player( FRAME_SIMULATOR, false ) )
184
185 // Save the page layout file if doesn't exist yet (e.g. if we opened a non-kicad schematic)
186
187 // TODO: We need to remove dependence on BASE_SCREEN
189
191 {
192 FILENAME_RESOLVER resolve;
193 resolve.SetProject( &Prj() );
194 resolve.SetProgramBase( &Pgm() );
195
196 wxFileName layoutfn( resolve.ResolvePath( BASE_SCREEN::m_DrawingSheetFileName,
197 Prj().GetProjectPath(),
198 { Schematic().GetEmbeddedFiles() } ) );
199
200 bool success = true;
201
202 if( !layoutfn.IsAbsolute() )
203 success = layoutfn.MakeAbsolute( Prj().GetProjectPath() );
204
205 if( success && layoutfn.IsOk() && !layoutfn.FileExists() && layoutfn.HasName() )
206 {
207 if( layoutfn.DirExists() && layoutfn.IsDirWritable() )
208 {
209 try
210 {
211 DS_DATA_MODEL::GetTheInstance().Save( layoutfn.GetFullPath() );
212 }
213 catch( const IO_ERROR& ioe )
214 {
215 wxLogError( _( "Failed to save drawing sheet '%s': %s" ),
216 layoutfn.GetFullPath(), ioe.What() );
217 }
218 }
219 }
220 }
221
222 // Propagate the root schematic revision to the project file for IPC-2581 BOM export
223 if( Schematic().RootScreen() )
224 {
227 }
228
229 // Update top-level sheets information in the project file
230 const std::vector<SCH_SHEET*>& topLevelSheets = Schematic().GetTopLevelSheets();
231
232 if( !topLevelSheets.empty() )
233 {
234 std::vector<TOP_LEVEL_SHEET_INFO>& projectSheets = Prj().GetProjectFile().GetTopLevelSheets();
235 projectSheets.clear();
236
237 wxString projectPath = Prj().GetProjectPath();
238
239 for( SCH_SHEET* sheet : topLevelSheets )
240 {
242 info.uuid = sheet->m_Uuid;
243 info.name = sheet->GetName();
244
245 // For top-level sheets, get the filename from the screen, not from the sheet's
246 // SHEET_FILENAME field (which is only used for sheet instances on parent sheets)
247 wxString filename;
248
249 if( sheet->GetScreen() )
250 filename = sheet->GetScreen()->GetFileName();
251
252 // Make the filename relative to the project path
253 wxFileName sheetFn( filename );
254
255 if( sheetFn.IsAbsolute() )
256 sheetFn.MakeRelativeTo( projectPath );
257
258 info.filename = sheetFn.GetFullPath();
259
260 projectSheets.push_back( std::move( info ) );
261 }
262 }
263
264 GetSettingsManager()->SaveProject( fn.GetFullPath() );
265}
266
267
269{
270 PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings();
271
272 if( TOOL_MANAGER* toolMgr = GetToolManager() )
273 {
274 if( SCH_SELECTION_TOOL* selTool = toolMgr->GetTool<SCH_SELECTION_TOOL>() )
275 localSettings.m_SchSelectionFilter = selTool->GetFilter();
276 }
277
278 localSettings.m_SchHierarchyCollapsed = m_hierarchy->GetCollapsedPaths();
279}
280
281
283{
284 // For now, axes are forced off in Eeschema even if turned on in config
286 cfg->m_Window.grid.axes_enabled = false;
287
289
290 SCH_SEARCH_DATA* searchData = dynamic_cast<SCH_SEARCH_DATA*>( m_findReplaceData.get() );
291
292 if( searchData )
293 {
300 }
301
303
308}
309
310
312{
315 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
316
317 if( cfg )
318 {
319 cfg->m_System.units = static_cast<int>( GetUserUnits() );
320 cfg->m_AuiPanels.show_schematic_hierarchy = hierarchy_pane.IsShown();
321 cfg->m_AuiPanels.schematic_hierarchy_float = hierarchy_pane.IsFloating();
322
323 // Other parameters (hierarchy_panel_float_width, hierarchy_panel_float_height,
324 // and hierarchy_panel_docked_width should have been updated when resizing the
325 // hierarchy panel
326
327 SCH_SEARCH_DATA* searchData = dynamic_cast<SCH_SEARCH_DATA*>( m_findReplaceData.get() );
328
329 if( searchData )
330 {
337 }
338
339 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
340 m_show_search = searchPaneInfo.IsShown();
342 cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
343 cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
344 cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
345
346 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
347 cfg->m_AuiPanels.show_properties = propertiesPane.IsShown();
348 cfg->m_AuiPanels.properties_splitter = m_propertiesPanel->SplitterProportion();
350
351 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
352 cfg->m_AuiPanels.show_net_nav_panel = netNavigatorPane.IsShown();
353 cfg->m_AuiPanels.float_net_nav_panel = netNavigatorPane.IsFloating();
354
355 if( netNavigatorPane.IsDocked() )
356 {
358 }
359 else
360 {
361 cfg->m_AuiPanels.net_nav_panel_float_pos = netNavigatorPane.floating_pos;
362 cfg->m_AuiPanels.net_nav_panel_float_size = netNavigatorPane.floating_size;
363 }
364
365 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
366 cfg->m_AuiPanels.design_blocks_show = designBlocksPane.IsShown();
367
368 if( designBlocksPane.IsDocked() )
369 {
371 }
372 else
373 {
374 cfg->m_AuiPanels.design_blocks_panel_float_height = designBlocksPane.floating_size.y;
375 cfg->m_AuiPanels.design_blocks_panel_float_width = designBlocksPane.floating_size.x;
376 }
377
378 m_designBlocksPane->SaveSettings();
379
380 wxAuiPaneInfo& remoteSymbolPane = m_auimgr.GetPane( RemoteSymbolPaneName() );
381 cfg->m_AuiPanels.remote_symbol_show = remoteSymbolPane.IsShown();
382
383 if( remoteSymbolPane.IsDocked() )
384 {
386 }
387 else
388 {
389 cfg->m_AuiPanels.remote_symbol_panel_float_height = remoteSymbolPane.floating_size.y;
390 cfg->m_AuiPanels.remote_symbol_panel_float_width = remoteSymbolPane.floating_size.x;
391 }
392 }
393}
394
395
397{
398 wxCHECK_RET( aCfg, "Call to SCH_BASE_FRAME::LoadSettings with null settings" );
399
401
402 // Move legacy user grids to grid list
403 if( !aCfg->m_Window.grid.user_grid_x.empty() )
404 {
405 aCfg->m_Window.grid.grids.emplace_back( GRID{ "User Grid",
407 aCfg->m_Window.grid.user_grid_y } );
408 aCfg->m_Window.grid.user_grid_x = wxEmptyString;
409 aCfg->m_Window.grid.user_grid_y = wxEmptyString;
410 }
411
412 if( aCfg->m_Window.grid.last_size_idx > (int) aCfg->m_Window.grid.grids.size() )
413 aCfg->m_Window.grid.last_size_idx = 1;
414
415 if( aCfg->m_Window.grid.fast_grid_1 > (int) aCfg->m_Window.grid.grids.size() )
416 aCfg->m_Window.grid.fast_grid_1 = 1;
417
418 if( aCfg->m_Window.grid.fast_grid_2 > (int) aCfg->m_Window.grid.grids.size() )
419 aCfg->m_Window.grid.fast_grid_2 = 2;
420}
421
422
424{
425 wxCHECK_RET( aCfg, wxS( "Call to SCH_BASE_FRAME::SaveSettings with null settings" ) );
426
428}
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
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:1666
void MarkDirty()
Force redraw of view on the next rendering.
Definition view.h:676
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:644
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.