KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eeschema_helpers.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
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 3
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/gpl-3.0.html
19 * or you may search the http://www.gnu.org website for the version 3 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 "eeschema_helpers.h"
25
26#include <connection_graph.h>
27#include <locale_io.h>
28#include <schematic.h>
29#include <sch_commit.h>
30#include <sch_edit_frame.h>
31#include <sch_label.h>
32#include <sch_io/sch_io.h>
33#include <sch_io/sch_io_mgr.h>
36#include <tool/tool_manager.h>
37#include <kiface_base.h>
38
39#include <wx/app.h>
40
41
43
44
46{
47 s_SchEditFrame = aSchEditFrame;
48}
49
50
51SCHEMATIC* EESCHEMA_HELPERS::LoadSchematic( const wxString& aFileName, bool aSetActive,
52 bool aForceDefaultProject, PROJECT* aProject, bool aCalculateConnectivity )
53{
54 if( aFileName.EndsWith( FILEEXT::KiCadSchematicFileExtension ) )
55 return LoadSchematic( aFileName, SCH_IO_MGR::SCH_KICAD, aSetActive, aForceDefaultProject,
56 aProject, aCalculateConnectivity );
57 else if( aFileName.EndsWith( FILEEXT::LegacySchematicFileExtension ) )
58 return LoadSchematic( aFileName, SCH_IO_MGR::SCH_LEGACY, aSetActive, aForceDefaultProject,
59 aProject, aCalculateConnectivity );
60
61 // as fall back for any other kind use the legacy format
62 return LoadSchematic( aFileName, SCH_IO_MGR::SCH_LEGACY, aSetActive, aForceDefaultProject, aProject,
63 aCalculateConnectivity );
64}
65
66
67SCHEMATIC* EESCHEMA_HELPERS::LoadSchematic( const wxString& aFileName,
68 SCH_IO_MGR::SCH_FILE_T aFormat,
69 bool aSetActive,
70 bool aForceDefaultProject,
71 PROJECT* aProject,
72 bool aCalculateConnectivity )
73{
74 wxFileName pro = aFileName;
76 pro.MakeAbsolute();
77 wxString projectPath = pro.GetFullPath();
78
79 // Ensure the "C" locale is temporary set, before reading any file
80 // It also avoid wxWidget alerts about locale issues, later, when using Python 3
82
83 PROJECT* project = aProject;
85
86 if( !project )
87 {
88 project = mgr.GetProject( projectPath );
89 }
90
91 if( !aForceDefaultProject )
92 {
93 if( !project )
94 {
95 if( wxFileExists( projectPath ) )
96 {
97 mgr.LoadProject( projectPath, aSetActive );
98 project = mgr.GetProject( projectPath );
99 }
100 }
101 else if( s_SchEditFrame && project == &mgr.Prj() )
102 {
103 // Project is already loaded? Then so is the board
104 return &s_SchEditFrame->Schematic();
105 }
106 }
107
108 // Board cannot be loaded without a project, so create the default project
109 if( !project || aForceDefaultProject )
110 project = &mgr.Prj();
111
112 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( aFormat ) );
113
114 SCHEMATIC* schematic = new SCHEMATIC( project );
115 schematic->CreateDefaultScreens();
116
117 wxFileName schFile = aFileName;
118 schFile.MakeAbsolute();
119
120 try
121 {
122 SCH_SHEET* rootSheet = pi->LoadSchematicFile( schFile.GetFullPath(), schematic );
123
124 if( rootSheet )
125 schematic->SetTopLevelSheets( { rootSheet } );
126 else
127 return nullptr;
128 }
129 catch( ... )
130 {
131 return nullptr;
132 }
133
134 SCH_SHEET_LIST sheetList = schematic->BuildSheetListSortedByPageNumbers();
135 SCH_SCREENS screens( schematic->Root() );
136
137 for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
138 screen->UpdateLocalLibSymbolLinks();
139
140 if( schematic->RootScreen()->GetFileFormatVersionAtLoad() < 20221002 )
141 sheetList.UpdateSymbolInstanceData( schematic->RootScreen()->GetSymbolInstances());
142
143 sheetList.UpdateSheetInstanceData( schematic->RootScreen()->GetSheetInstances());
144
145 if( schematic->RootScreen()->GetFileFormatVersionAtLoad() < 20230221 )
147
148 for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
149 screen->MigrateSimModels();
150
151 sheetList.AnnotatePowerSymbols();
152
153 schematic->ConnectionGraph()->Reset();
154
155 TOOL_MANAGER* toolManager = new TOOL_MANAGER;
156 toolManager->SetEnvironment( schematic, nullptr, nullptr, Kiface().KifaceSettings(), nullptr );
157
158 if( aCalculateConnectivity )
159 {
160 SCH_COMMIT dummyCommit( toolManager );
161 schematic->RecalculateConnections( &dummyCommit, GLOBAL_CLEANUP, toolManager );
162 }
163
165
166 schematic->SetSheetNumberAndCount();
167 schematic->RecomputeIntersheetRefs();
168
169 for( SCH_SHEET_PATH& sheet : sheetList )
170 {
171 sheet.UpdateAllScreenReferences();
172 sheet.LastScreen()->TestDanglingEnds( nullptr, nullptr );
173 }
174
175 if( aCalculateConnectivity )
176 schematic->ConnectionGraph()->Recalculate( sheetList, true );
177
178 return schematic;
179}
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
void Recalculate(const SCH_SHEET_LIST &aSheetList, bool aUnconditional=false, std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr)
Update the connection graph for the given list of sheets.
static void SetSchEditFrame(SCH_EDIT_FRAME *aSchEditFrame)
static SCH_EDIT_FRAME * s_SchEditFrame
static SCHEMATIC * LoadSchematic(const wxString &aFileName, bool aSetActive, bool aForceDefaultProject, PROJECT *aProject=nullptr, bool aCalculateConnectivity=true)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition locale_io.h:41
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:131
Container for project specific data.
Definition project.h:65
Holds all the data relating to one schematic.
Definition schematic.h:88
void CreateDefaultScreens()
void ResolveERCExclusionsPostUpdate()
Update markers to match recorded exclusions.
void RecomputeIntersheetRefs()
Update the schematic's page reference map for all global labels, and refresh the labels so that they ...
SCH_SHEET_LIST BuildSheetListSortedByPageNumbers() const
CONNECTION_GRAPH * ConnectionGraph() const
Definition schematic.h:199
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
void SetTopLevelSheets(const std::vector< SCH_SHEET * > &aSheets)
SCH_SHEET & Root() const
Definition schematic.h:132
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, TOOL_MANAGER *aToolManager, PROGRESS_REPORTER *aProgressReporter=nullptr, KIGFX::SCH_VIEW *aSchView=nullptr, std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr, PICKED_ITEMS_LIST *aLastChangeList=nullptr)
Generate the connection data for the entire schematic hierarchy.
Schematic editor (Eeschema) main window.
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
Definition sch_screen.h:749
SCH_SCREEN * GetNext()
void FixLegacyPowerSymbolMismatches()
Fix legacy power symbols that have mismatched value text fields and invisible power pin names.
SCH_SCREEN * GetFirst()
const std::vector< SCH_SYMBOL_INSTANCE > & GetSymbolInstances() const
Definition sch_screen.h:522
int GetFileFormatVersionAtLoad() const
Definition sch_screen.h:139
const std::vector< SCH_SHEET_INSTANCE > & GetSheetInstances() const
Definition sch_screen.h:527
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void UpdateSheetInstanceData(const std::vector< SCH_SHEET_INSTANCE > &aSheetInstances)
Update all of the sheet instance information using aSheetInstances.
void AnnotatePowerSymbols()
Silently annotate the not yet annotated power symbols of the entire hierarchy of the sheet path list.
void UpdateSymbolInstanceData(const std::vector< SCH_SYMBOL_INSTANCE > &aSymbolInstances)
Update all of the symbol instance information using aSymbolInstances.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition sch_sheet.h:48
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Load a project or sets up a new project with a specified path.
PROJECT * GetProject(const wxString &aFullPath) const
Retrieve a loaded project by name.
PROJECT & Prj() const
A helper while we are not MDI-capable – return the one and only project.
Master controller class:
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Set the work environment (model, view, view controls and the parent window).
static const std::string LegacySchematicFileExtension
static const std::string ProjectFileExtension
static const std::string KiCadSchematicFileExtension
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
Definition io_mgr.h:33
PGM_BASE & Pgm()
The global program "get" accessor.
@ GLOBAL_CLEANUP
Definition schematic.h:77
std::vector< FAB_LAYER_COLOR > dummy
Definition of file extensions used in Kicad.