KiCad PCB EDA Suite
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 (C) 2014-2021 KiCad Developers, see AUTHORS.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 #include <mutex>
25 
26 #include <symbol_library.h>
27 #include <confirm.h>
35 #include <kiway.h>
36 #include <symbol_edit_frame.h>
38 #include <panel_hotkeys_editor.h>
39 #include <pgm_base.h>
40 #include <project/project_file.h>
41 #include <project/net_settings.h>
42 #include <sch_edit_frame.h>
43 #include <sch_painter.h>
44 #include <schematic.h>
45 #include <settings/app_settings.h>
47 #include <symbol_lib_table.h>
48 #include <widgets/paged_dialog.h>
51 #include <zoom_defines.h>
52 #include <wx/treebook.h>
53 
54 
57 {
58  return Pgm().GetSettingsManager().GetColorSettings()->GetColor( aLayer );
59 }
60 
61 
63  PANEL_HOTKEYS_EDITOR* aHotkeysPanel )
64 {
65  wxTreebook* book = aParent->GetTreebook();
66 
67  book->AddPage( new wxPanel( book ), _( "Schematic Editor" ) );
68  book->AddSubPage( new PANEL_EESCHEMA_DISPLAY_OPTIONS( this, book ), _( "Display Options" ) );
69  book->AddSubPage( new PANEL_EESCHEMA_EDITING_OPTIONS( this, book ), _( "Editing Options" ) );
70  book->AddSubPage( new PANEL_EESCHEMA_COLOR_SETTINGS( this, book ), _( "Colors" ) );
71  book->AddSubPage( new PANEL_EESCHEMA_TEMPLATE_FIELDNAMES( this, book, true ),
72  _( "Field Name Templates" ) );
73 
74  aHotkeysPanel->AddHotKeys( GetToolManager() );
75 }
76 
77 
79 {
86 
87  // Verify some values, because the config file can be edited by hand,
88  // and have bad values:
91 
92  // Load the drawing sheet description file, from the filename stored in
93  // BASE_SCREEN::m_DrawingSheetFileName, read in config project file
94  // If empty, or not existing, the default descr is loaded
96  Prj().GetProjectPath() );
97 
98  if( !DS_DATA_MODEL::GetTheInstance().LoadDrawingSheet( filename ) )
99  {
100  ShowInfoBarError( _( "Error loading drawing sheet." ), true );
101  }
102 
103  return true;
104 }
105 
106 
107 void SCH_EDIT_FRAME::ShowSchematicSetupDialog( const wxString& aInitialPage )
108 {
109  DIALOG_SCHEMATIC_SETUP dlg( this );
110 
111  if( !aInitialPage.IsEmpty() )
112  dlg.SetInitialPage( aInitialPage, wxEmptyString );
113 
114  if( dlg.ShowQuasiModal() == wxID_OK )
115  {
118 
119  Kiway().CommonSettingsChanged( false, true );
120  GetCanvas()->Refresh();
121  }
122 }
123 
124 
126 {
127  wxFileName fn = Schematic().RootScreen()->GetFileName(); //ConfigFileName
128 
129  fn.SetExt( ProjectFileExtension );
130 
131  if( !fn.HasName() || !IsWritable( fn ) )
132  return;
133 
135 
136  GetSettingsManager()->SaveProject( fn.GetFullPath() );
137 }
138 
139 
141 {
142  // For now, axes are forced off in Eeschema even if turned on in config
143  eeconfig()->m_Window.grid.axes_enabled = false;
144 
146 
153 
154  if( eeconfig() )
155  {
158  GetRenderSettings()->SetShowPageLimits( eeconfig()->m_Appearance.show_page_limits );
159  }
160 }
161 
162 
164 {
166 
167  // TODO(JE) do we need to keep m_userUnits around?
168  if( eeconfig() )
169  eeconfig()->m_System.units = static_cast<int>( m_userUnits );
170 }
171 
172 
174 {
175  wxCHECK_RET( aCfg, "Call to SCH_BASE_FRAME::SaveSettings with null settings" );
176 
178 
179  // Currently values read from config file are not used because the user cannot
180  // change this config
181  // if( aCfg->m_Window.grid.sizes.empty() ) // Will be probably never enabled
182  {
183  /*
184  * Do NOT add others values (mainly grid values in mm), because they can break the
185  * schematic: Because wires and pins are considered as connected when the are to the
186  * same coordinate we cannot mix coordinates in mils (internal units) and mm (that
187  * cannot exactly converted in mils in many cases). In fact schematic must only use
188  * 50 and 25 mils to place labels, wires and symbols others values are useful only
189  * for graphic items (mainly in library editor) so use integer values in mils only.
190  * The 100 mil grid is added to help conform to the KiCad Library Convention which
191  * states: "Using a 100mil grid, pin ends and origin must lie on grid nodes IEC-60617"
192  */
193  aCfg->m_Window.grid.sizes = { "100 mil",
194  "50 mil",
195  "25 mil",
196  "10 mil",
197  "5 mil",
198  "2 mil",
199  "1 mil" };
200  }
201 
202  // Currently values read from config file are not used because the user cannot
203  // change this config
204  // if( aCfg->m_Window.zoom_factors.empty() )
205  {
207  }
208 }
209 
210 
212 {
213  wxCHECK_RET( aCfg, "Call to SCH_BASE_FRAME::SaveSettings with null settings" );
214 
216 }
217 
218 
220  PANEL_HOTKEYS_EDITOR* aHotkeysPanel )
221 {
222  wxTreebook* book = aParent->GetTreebook();
223 
224  book->AddPage( new wxPanel( book ), _( "Symbol Editor" ) );
225  book->AddSubPage( new PANEL_GAL_DISPLAY_OPTIONS( this, aParent ), _( "Display Options" ) );
226  book->AddSubPage( new PANEL_SYM_EDITING_OPTIONS( this, book ), _( "Editing Options" ) );
227  book->AddSubPage( new PANEL_SYM_COLOR_SETTINGS( this, book ), _( "Colors" ) );
228 
229  aHotkeysPanel->AddHotKeys( GetToolManager() );
230 }
231 
232 
233 static std::mutex s_symbolTableMutex;
234 
235 
236 SYMBOL_LIB_TABLE* PROJECT::SchSymbolLibTable()
237 {
238  std::lock_guard<std::mutex> lock( s_symbolTableMutex );
239 
240  // This is a lazy loading function, it loads the project specific table when
241  // that table is asked for, not before.
243 
244  // its gotta be NULL or a SYMBOL_LIB_TABLE, or a bug.
245  wxASSERT( !tbl || tbl->Type() == SYMBOL_LIB_TABLE_T );
246 
247  if( !tbl )
248  {
249  // Stack the project specific SYMBOL_LIB_TABLE overlay on top of the global table.
250  // ~SYMBOL_LIB_TABLE() will not touch the fallback table, so multiple projects may
251  // stack this way, all using the same global fallback table.
253 
255 
256  wxString prjPath;
257 
258  wxGetEnv( PROJECT_VAR_NAME, &prjPath );
259 
260  if( !prjPath.IsEmpty() )
261  {
262  wxFileName fn( prjPath, SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
263 
264  try
265  {
266  tbl->Load( fn.GetFullPath() );
267  }
268  catch( const IO_ERROR& ioe )
269  {
270  wxString msg;
271  msg.Printf( _( "Error loading the symbol library table '%s'." ),
272  fn.GetFullPath() );
273  DisplayErrorMessage( nullptr, msg, ioe.What() );
274  }
275  }
276  }
277 
278  return tbl;
279 }
static const wxString & GetSymbolLibTableFileName()
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
const wxString & GetFileName() const
Definition: sch_screen.h:137
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:53
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:265
SETTINGS_MANAGER * GetSettingsManager() const
void SaveProjectSettings() override
Save changes to the project settings to the project (.pro) file.
This file is part of the common library.
const std::string ProjectFileExtension
void SetInitialPage(const wxString &aPage, const wxString &aParentPage=wxEmptyString)
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:145
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
Definition: project.h:38
NET_SETTINGS & NetSettings()
Definition: project_file.h:94
KIGFX::SCH_RENDER_SETTINGS * GetRenderSettings()
void AddHotKeys(TOOL_MANAGER *aToolMgr)
virtual _ELEM * GetElem(ELEM_T aIndex)
Get and set the elements for this project.
Definition: project.cpp:246
bool IsWritable(const wxFileName &aFileName)
Checks if aFileName can be written.
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106
std::vector< double > zoom_factors
Definition: app_settings.h:86
virtual void SetElem(ELEM_T aIndex, _ELEM *aElem)
Definition: project.cpp:258
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
EESCHEMA_SETTINGS * eeconfig() const
wxTreebook * GetTreebook()
Definition: paged_dialog.h:37
static int GetSubpartFirstId()
Definition: lib_symbol.h:520
static DS_DATA_MODEL & GetTheInstance()
static function: returns the instance of DS_DATA_MODEL used in the application
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
std::vector< wxString > sizes
Definition: app_settings.h:52
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:99
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
KICAD_T Type() override
GRID_SETTINGS grid
Definition: app_settings.h:89
int ShowQuasiModal()
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
void ResolveNetClassAssignments(bool aRebuildFromScratch=false)
Explode the list of netclass assignments to include atomic members of composite labels (buses).
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
SCHEMATIC & Schematic() const
Definition of file extensions used in Kicad.
COLOR4D GetLayerColor(SCH_LAYER_ID aLayer)
Helper for all the old plotting/printing code while it still exists.
Definition for symbol library class.
#define _(s)
SCH_LAYER_ID
Eeschema drawing layers.
#define ZOOM_LIST_EESCHEMA
Definition: zoom_defines.h:38
SCHEMATIC_SETTINGS * m_defaults
void Load(const wxString &aFileName)
Load the library table using the path defined by aFileName aFallBackTable.
void InstallPreferences(PAGED_DIALOG *aParent, PANEL_HOTKEYS_EDITOR *aHotkeysPanel) override
Allow the symbol editor to install its preferences panel into the preferences dialog.
static int GetSubpartIdSeparator()
Definition: lib_symbol.h:514
bool LoadProjectSettings()
Load the KiCad project file (*.pro) settings specific to Eeschema.
WINDOW_SETTINGS m_Window
Definition: app_settings.h:181
see class PGM_BASE
void InstallPreferences(PAGED_DIALOG *aParent, PANEL_HOTKEYS_EDITOR *aHotkeysPanel) override
Allow Eeschema to install its preferences panels into the preferences dialog.
static std::mutex s_symbolTableMutex
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
Definition: base_screen.h:85
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
static const wxString MakeFullFileName(const wxString &aShortFileName, const wxString &aProjectPath)
bool SaveProject(const wxString &aFullPath=wxEmptyString)
Saves a loaded project.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
EDA_UNITS m_userUnits
Map containing the UI update handlers registered with wx for each action.
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
virtual void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition: kiway.cpp:553
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:54
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
Definition: schematic.cpp:117
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void SetDefaultPenWidth(int aWidth)
void ShowSchematicSetupDialog(const wxString &aInitialPage=wxEmptyString)
static void SetSubpartIdNotation(int aSep, int aFirstId)
Set the separator char between the subpart id and the reference 0 (no separator) or '.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:75
void RecordERCExclusions()
Scan existing markers and record data from any that are Excluded.
void SetShowPageLimits(bool aDraw)
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103