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 {
80  SCHEMATIC_SETTINGS& settings = Schematic().Settings();
82 
88 
89  // Verify some values, because the config file can be edited by hand, and have bad values:
92 
93  // Load the drawing sheet from the filename stored in BASE_SCREEN::m_DrawingSheetFileName.
94  // If empty, or not existing, the default drawing sheet is loaded.
96  Prj().GetProjectPath() );
97 
98  if( !DS_DATA_MODEL::GetTheInstance().LoadDrawingSheet( filename ) )
99  ShowInfoBarError( _( "Error loading drawing sheet." ), true );
100 
101  return true;
102 }
103 
104 
105 void SCH_EDIT_FRAME::ShowSchematicSetupDialog( const wxString& aInitialPage )
106 {
107  DIALOG_SCHEMATIC_SETUP dlg( this );
108 
109  if( !aInitialPage.IsEmpty() )
110  dlg.SetInitialPage( aInitialPage, wxEmptyString );
111 
112  if( dlg.ShowQuasiModal() == wxID_OK )
113  {
115 
117 
118  Kiway().CommonSettingsChanged( false, true );
119 
120  GetRenderSettings()->SetDefaultPenWidth( Schematic().Settings().m_DefaultLineWidth );
125 
126  GetCanvas()->GetView()->MarkDirty();
128  GetCanvas()->Refresh();
129  }
130 }
131 
132 
134 {
135  std::vector<double>& sizeMultipliers = eeconfig()->m_Drawing.junction_size_mult_list;
136 
137  NETCLASSPTR defaultNetclass = Prj().GetProjectFile().NetSettings().m_NetClasses.GetDefault();
138  int sizeChoice = Schematic().Settings().m_JunctionSizeChoice;
139  int junctionSize = defaultNetclass->GetWireWidth() * sizeMultipliers[ sizeChoice ];
140 
141  return std::max( junctionSize, 1 );
142 }
143 
144 
146 {
147  wxFileName fn = Schematic().RootScreen()->GetFileName(); //ConfigFileName
148 
149  fn.SetExt( ProjectFileExtension );
150 
151  if( !fn.HasName() || !IsWritable( fn, false ) )
152  return;
153 
155 
156  GetSettingsManager()->SaveProject( fn.GetFullPath() );
157 }
158 
159 
161 {
162  // For now, axes are forced off in Eeschema even if turned on in config
163  eeconfig()->m_Window.grid.axes_enabled = false;
164 
166 
173 
174  if( eeconfig() )
175  {
178  GetRenderSettings()->SetShowPageLimits( eeconfig()->m_Appearance.show_page_limits );
179  }
180 }
181 
182 
184 {
186 
187  // TODO(JE) do we need to keep m_userUnits around?
188  if( eeconfig() )
189  eeconfig()->m_System.units = static_cast<int>( m_userUnits );
190 }
191 
192 
194 {
195  wxCHECK_RET( aCfg, wxT( "Call to SCH_BASE_FRAME::LoadSettings with null settings" ) );
196 
198 
199  // Currently values read from config file are not used because the user cannot
200  // change this config
201  // if( aCfg->m_Window.grid.sizes.empty() ) // Will be probably never enabled
202  {
203  /*
204  * Do NOT add others values (mainly grid values in mm), because they can break the
205  * schematic: Because wires and pins are considered as connected when the are to the
206  * same coordinate we cannot mix coordinates in mils (internal units) and mm (that
207  * cannot exactly converted in mils in many cases). In fact schematic must only use
208  * 50 and 25 mils to place labels, wires and symbols others values are useful only
209  * for graphic items (mainly in library editor) so use integer values in mils only.
210  * The 100 mil grid is added to help conform to the KiCad Library Convention which
211  * states: "Using a 100mil grid, pin ends and origin must lie on grid nodes IEC-60617"
212  */
213  aCfg->m_Window.grid.sizes = { wxT( "100 mil" ),
214  wxT( "50 mil" ),
215  wxT( "25 mil" ),
216  wxT( "10 mil" ),
217  wxT( "5 mil" ),
218  wxT( "2 mil" ),
219  wxT( "1 mil" ) };
220  }
221 
222  // Currently values read from config file are not used because the user cannot
223  // change this config
224  // if( aCfg->m_Window.zoom_factors.empty() )
225  {
227  }
228 }
229 
230 
232 {
233  wxCHECK_RET( aCfg, wxT( "Call to SCH_BASE_FRAME::SaveSettings with null settings" ) );
234 
236 }
237 
238 
240  PANEL_HOTKEYS_EDITOR* aHotkeysPanel )
241 {
242  wxTreebook* book = aParent->GetTreebook();
243 
244  book->AddPage( new wxPanel( book ), _( "Symbol Editor" ) );
245  book->AddSubPage( new PANEL_GAL_DISPLAY_OPTIONS( this, aParent ), _( "Display Options" ) );
246  book->AddSubPage( new PANEL_SYM_EDITING_OPTIONS( this, book ), _( "Editing Options" ) );
247  book->AddSubPage( new PANEL_SYM_COLOR_SETTINGS( this, book ), _( "Colors" ) );
248 
249  aHotkeysPanel->AddHotKeys( GetToolManager() );
250 }
251 
252 
253 static std::mutex s_symbolTableMutex;
254 
255 
256 SYMBOL_LIB_TABLE* PROJECT::SchSymbolLibTable()
257 {
258  std::lock_guard<std::mutex> lock( s_symbolTableMutex );
259 
260  // This is a lazy loading function, it loads the project specific table when
261  // that table is asked for, not before.
263 
264  // its gotta be NULL or a SYMBOL_LIB_TABLE, or a bug.
265  wxASSERT( !tbl || tbl->Type() == SYMBOL_LIB_TABLE_T );
266 
267  if( !tbl )
268  {
269  // Stack the project specific SYMBOL_LIB_TABLE overlay on top of the global table.
270  // ~SYMBOL_LIB_TABLE() will not touch the fallback table, so multiple projects may
271  // stack this way, all using the same global fallback table.
273 
275 
276  wxString prjPath;
277 
278  wxGetEnv( PROJECT_VAR_NAME, &prjPath );
279 
280  if( !prjPath.IsEmpty() )
281  {
282  wxFileName fn( prjPath, SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
283 
284  try
285  {
286  tbl->Load( fn.GetFullPath() );
287  }
288  catch( const IO_ERROR& ioe )
289  {
290  wxString msg;
291  msg.Printf( _( "Error loading the symbol library table '%s'." ),
292  fn.GetFullPath() );
293  DisplayErrorMessage( nullptr, msg, ioe.What() );
294  }
295  }
296  }
297 
298  return tbl;
299 }
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
static const wxString & GetSymbolLibTableFileName()
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
const wxString & GetFileName() const
Definition: sch_screen.h:145
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:292
SETTINGS_MANAGER * GetSettingsManager() const
bool SaveProject(const wxString &aFullPath=wxEmptyString, PROJECT *aProject=nullptr)
Saves a loaded project.
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
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:167
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
Definition: project.h:38
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1482
NET_SETTINGS & NetSettings()
Definition: project_file.h:96
int GetSchematicJunctionSize()
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
void RebuildNetClassAssignments()
Rebuild netclass assignments from the netclass membership lists.
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
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, WX_INFOBAR::MESSAGE_TYPE aType=WX_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...
static const wxString ResolvePath(const wxString &aPath, const wxString &aProjectPath)
Resolve a path which might be project-relative or contain env variable references.
static int GetSubpartFirstId()
Definition: lib_symbol.h:531
static DS_DATA_MODEL & GetTheInstance()
static function: returns the instance of DS_DATA_MODEL used in the application
Item needs to be redrawn.
Definition: view_item.h:52
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
NETCLASSES m_NetClasses
Definition: net_settings.h:40
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
SCH_LAYER_ID
Eeschema drawing layers.
Definition: layer_ids.h:335
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.
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)
#define ZOOM_LIST_EESCHEMA
Definition: zoom_defines.h:38
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:525
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.
bool IsWritable(const wxFileName &aFileName, bool aVerbose=true)
Checks if aFileName can be written.
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.
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.
These settings were stored in SCH_BASE_FRAME previously.
virtual void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition: kiway.cpp:564
NETCLASSPTR GetDefault() const
Definition: netclass.h:253
std::vector< double > junction_size_mult_list
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 MarkDirty()
Force redraw of view on the next rendering.
Definition: view.h:633
void SetShowPageLimits(bool aDraw)
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103