KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eeschema.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) 2004 Jean-Pierre Charras, [email protected]
5 * Copyright (C) 2008 Wayne Stambaugh <[email protected]>
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <pgm_base.h>
27#include <kiface_base.h>
29#include <confirm.h>
30#include <gestfich.h>
31#include <eda_dde.h>
33#include "eeschema_helpers.h"
34#include <eeschema_settings.h>
35#include <sch_edit_frame.h>
37#include <symbol_edit_frame.h>
38#include <symbol_viewer_frame.h>
40#include <symbol_lib_table.h>
47#include <kiway.h>
50#include <sexpr/sexpr.h>
51#include <sexpr/sexpr_parser.h>
52#include <kiface_ids.h>
54#include <wx/ffile.h>
56
57#include <schematic.h>
58#include <connection_graph.h>
68#include <sim/simulator_frame.h>
69
71#include <toolbars_sch_editor.h>
73
74#include <wx/crt.h>
75
76// The main sheet of the project
78
79
80namespace SCH {
81
82
83// TODO: This should move out of this file
84static std::unique_ptr<SCHEMATIC> readSchematicFromFile( const std::string& aFilename )
85{
86 SCH_IO* pi = SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD );
87 std::unique_ptr<SCHEMATIC> schematic = std::make_unique<SCHEMATIC>( nullptr );
88
90
91 // TODO: this must load the schematic's project, not a default project. At the very minimum
92 // variable resolution won't work without the project, but there might also be issues with
93 // netclasses, etc.
94 manager.LoadProject( "" );
95 schematic->Reset();
96 schematic->SetProject( &manager.Prj() );
97 schematic->SetRoot( pi->LoadSchematicFile( aFilename, schematic.get() ) );
98 schematic->CurrentSheet().push_back( &schematic->Root() );
99
100 SCH_SCREENS screens( schematic->Root() );
101
102 for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
103 screen->UpdateLocalLibSymbolLinks();
104
105 SCH_SHEET_LIST sheets = schematic->Hierarchy();
106
107 // Restore all of the loaded symbol instances from the root sheet screen.
108 sheets.UpdateSymbolInstanceData( schematic->RootScreen()->GetSymbolInstances() );
109
110 if( schematic->RootScreen()->GetFileFormatVersionAtLoad() < 20230221 )
111 {
112 for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
113 screen->FixLegacyPowerSymbolMismatches();
114 }
115
116 for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
117 screen->MigrateSimModels();
118
119 sheets.AnnotatePowerSymbols();
120
121 // NOTE: This is required for multi-unit symbols to be correct
122 for( SCH_SHEET_PATH& sheet : sheets )
123 sheet.UpdateAllScreenReferences();
124
125 // TODO: this must handle SchematicCleanup somehow. The original version didn't because
126 // it knew that QA test cases were saved in a clean state.
127
128 // TODO: does this need to handle PruneOrphanedSymbolInstances() and
129 // PruneOrphanedSheetInstances()?
130
131 schematic->ConnectionGraph()->Recalculate( sheets, true );
132
133 return schematic;
134}
135
136
137// TODO: This should move out of this file
138bool generateSchematicNetlist( const wxString& aFilename, std::string& aNetlist )
139{
140 std::unique_ptr<SCHEMATIC> schematic = readSchematicFromFile( aFilename.ToStdString() );
141 NETLIST_EXPORTER_KICAD exporter( schematic.get() );
142 STRING_FORMATTER formatter;
143
144 exporter.Format( &formatter, GNL_ALL | GNL_OPT_KICAD );
145 aNetlist = formatter.GetString();
146
147 return true;
148}
149
150
151static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
152{
153 // Of course all are virtual overloads, implementations of the KIFACE.
154
155 IFACE( const char* aName, KIWAY::FACE_T aType ) :
156 KIFACE_BASE( aName, aType ),
158 {}
159
160 bool OnKifaceStart( PGM_BASE* aProgram, int aCtlBits, KIWAY* aKiway ) override;
161
162 void Reset() override;
163
164 void OnKifaceEnd() override;
165
166 wxWindow* CreateKiWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 ) override
167 {
168 switch( aClassId )
169 {
170 case FRAME_SCH:
171 {
172 SCH_EDIT_FRAME* frame = new SCH_EDIT_FRAME( aKiway, aParent );
173
175
176 if( Kiface().IsSingle() )
177 {
178 // only run this under single_top, not under a project manager.
180 }
181
182 return frame;
183 }
184
186 return new SYMBOL_EDIT_FRAME( aKiway, aParent );
187
188 case FRAME_SIMULATOR:
189 {
190 try
191 {
192 SIMULATOR_FRAME* frame = new SIMULATOR_FRAME( aKiway, aParent );
193 return frame;
194 }
195 catch( const SIMULATOR_INIT_ERR& )
196 {
197 // catch the init err exception as we don't want it to bubble up
198 // its going to be some ngspice install issue but we don't want to log that
199 return nullptr;
200 }
201 }
202
203 case FRAME_SCH_VIEWER:
204 return new SYMBOL_VIEWER_FRAME( aKiway, aParent );
205
207 {
208 bool cancelled = false;
209 SYMBOL_CHOOSER_FRAME* chooser = new SYMBOL_CHOOSER_FRAME( aKiway, aParent, cancelled );
211 if( cancelled )
212 {
213 chooser->Destroy();
214 return nullptr;
215 }
216
217 return chooser;
218 }
219
221 InvokeSchEditSymbolLibTable( aKiway, aParent );
222 // Dialog has completed; nothing to return.
223 return nullptr;
224
227 // Dialog has completed; nothing to return.
228 return nullptr;
229
231 return new PANEL_SYM_DISPLAY_OPTIONS( aParent, GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" ) );
232
234 {
238 if( !frame )
239 frame = aKiway->Player( FRAME_SCH_VIEWER, false );
240
241 if( !frame )
242 frame = aKiway->Player( FRAME_SCH, false );
243
244 if( frame )
245 SetUserUnits( frame->GetUserUnits() );
246
247 return new PANEL_GRID_SETTINGS( aParent, this, frame, cfg, FRAME_SCH_SYMBOL_EDITOR );
248 }
249
251 {
252 EDA_BASE_FRAME* frame = aKiway->Player( FRAME_SCH_SYMBOL_EDITOR, false );
253
254 if( !frame )
255 frame = aKiway->Player( FRAME_SCH_VIEWER, false );
256
257 if( !frame )
258 frame = aKiway->Player( FRAME_SCH, false );
259
260 if( frame )
261 SetUserUnits( frame->GetUserUnits() );
262
263 return new PANEL_SYM_EDITING_OPTIONS( aParent, this, frame );
264 }
265
267 {
268 APP_SETTINGS_BASE* cfg = GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
269 TOOLBAR_SETTINGS* tb = GetToolbarSettings<SYMBOL_EDIT_TOOLBAR_SETTINGS>( "symbol_editor-toolbars" );
270
271 std::vector<TOOL_ACTION*> actions;
272 std::vector<ACTION_TOOLBAR_CONTROL*> controls;
273
274 for( TOOL_ACTION* action : ACTION_MANAGER::GetActionList() )
275 actions.push_back( action );
276
277 for( ACTION_TOOLBAR_CONTROL* control : ACTION_TOOLBAR::GetCustomControlList() )
278 controls.push_back( control );
279
280 return new PANEL_TOOLBAR_CUSTOMIZATION( aParent, cfg, tb, actions, controls );
281 }
282
283 case PANEL_SYM_COLORS:
284 return new PANEL_SYM_COLOR_SETTINGS( aParent );
285
287 return new PANEL_EESCHEMA_DISPLAY_OPTIONS( aParent, GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" ) );
288
289 case PANEL_SCH_GRIDS:
290 {
291 EESCHEMA_SETTINGS* cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
292 EDA_BASE_FRAME* frame = aKiway->Player( FRAME_SCH, false );
293
294 if( !frame )
295 frame = aKiway->Player( FRAME_SCH_SYMBOL_EDITOR, false );
296
297 if( !frame )
298 frame = aKiway->Player( FRAME_SCH_VIEWER, false );
299
300 if( frame )
301 SetUserUnits( frame->GetUserUnits() );
302
303 return new PANEL_GRID_SETTINGS( aParent, this, frame, cfg, FRAME_SCH );
304 }
305
307 {
308 EDA_BASE_FRAME* frame = aKiway->Player( FRAME_SCH, false );
309
310 if( !frame )
311 frame = aKiway->Player( FRAME_SCH_SYMBOL_EDITOR, false );
312
313 if( !frame )
314 frame = aKiway->Player( FRAME_SCH_VIEWER, false );
315
316 if( frame )
317 SetUserUnits( frame->GetUserUnits() );
318
319 return new PANEL_EESCHEMA_EDITING_OPTIONS( aParent, this, frame );
320 }
321
323 {
324 APP_SETTINGS_BASE* cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
325 TOOLBAR_SETTINGS* tb = GetToolbarSettings<SCH_EDIT_TOOLBAR_SETTINGS>( "eeschema-toolbars" );
326
327 std::vector<TOOL_ACTION*> actions;
328 std::vector<ACTION_TOOLBAR_CONTROL*> controls;
329
330 for( TOOL_ACTION* action : ACTION_MANAGER::GetActionList() )
331 actions.push_back( action );
332
333 for( ACTION_TOOLBAR_CONTROL* control : ACTION_TOOLBAR::GetCustomControlList() )
334 controls.push_back( control );
335
336 return new PANEL_TOOLBAR_CUSTOMIZATION( aParent, cfg, tb, actions, controls );
337 }
338
339 case PANEL_SCH_COLORS:
340 return new PANEL_EESCHEMA_COLOR_SETTINGS( aParent );
341
343 return new PANEL_TEMPLATE_FIELDNAMES( aParent, nullptr );
344
346 return new PANEL_SIMULATOR_PREFERENCES( aParent );
347
348 default:
349 return nullptr;
350 }
351 }
352
363 void* IfaceOrAddress( int aDataId ) override
364 {
365 switch( aDataId )
366 {
368 return (void*) generateSchematicNetlist;
369 }
370
371 return nullptr;
372 }
373
379 void SaveFileAs( const wxString& aProjectBasePath, const wxString& aProjectName,
380 const wxString& aNewProjectBasePath, const wxString& aNewProjectName,
381 const wxString& aSrcFilePath, wxString& aErrors ) override;
382
383
384 int HandleJob( JOB* aJob, REPORTER* aReporter, PROGRESS_REPORTER* aProgressReporter ) override;
385
386 bool HandleJobConfig( JOB* aJob, wxWindow* aParent ) override;
387
388private:
389 bool loadGlobalLibTable();
391
392 std::unique_ptr<EESCHEMA_JOBS_HANDLER> m_jobHandler;
393
394} kiface( "eeschema", KIWAY::FACE_SCH );
395
396} // namespace
397
398using namespace SCH;
399
400
402
403
404// KIFACE_GETTER's actual spelling is a substitution macro found in kiway.h.
405// KIFACE_GETTER will not have name mangling due to declaration in kiway.h.
406KIFACE_API KIFACE* KIFACE_GETTER( int* aKIFACEversion, int aKiwayVersion, PGM_BASE* aProgram )
407{
408 return &kiface;
409}
410
411
412bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits, KIWAY* aKiway )
413{
414 // This is process-level-initialization, not project-level-initialization of the DSO.
415 // Do nothing in here pertinent to a project!
417
418 // Register the symbol editor settings as well because they share a KiFACE and need to be
419 // loaded prior to use to avoid threading deadlocks
421 aProgram->GetSettingsManager().RegisterSettings( symSettings ); // manager takes ownership
422
423 // We intentionally register KifaceSettings after SYMBOL_EDITOR_SETTINGS
424 // In legacy configs, many settings were in a single editor config nd the migration routine
425 // for the main editor file will try and call into the now separate settings stores
426 // to move the settings into them
428
429 start_common( aCtlBits );
430
432 {
433 // we didnt get anywhere deregister the settings
434 aProgram->GetSettingsManager().FlushAndRelease( symSettings, false );
435 aProgram->GetSettingsManager().FlushAndRelease( KifaceSettings(), false );
436 return false;
437 }
438
439 m_jobHandler = std::make_unique<EESCHEMA_JOBS_HANDLER>( aKiway );
440
442 {
443 m_jobHandler->SetReporter( &CLI_REPORTER::GetInstance() );
444 m_jobHandler->SetProgressReporter( &CLI_PROGRESS_REPORTER::GetInstance() );
445 }
446
447 return true;
448}
449
450
452{
454}
455
456
458{
460
461 if( !fn.FileExists() )
462 {
463 if( !( m_start_flags & KFCTL_CLI ) )
464 {
465 // Ensure the splash screen does not hide the dialog:
466 Pgm().HideSplash();
467
468 DIALOG_GLOBAL_SYM_LIB_TABLE_CONFIG symDialog( nullptr );
469
470 if( symDialog.ShowModal() != wxID_OK )
471 return false;
472 }
473 }
474 else
475 {
476 try
477 {
478 // The global table is not related to a specific project. All projects
479 // will use the same global table. So the KIFACE::OnKifaceStart() contract
480 // of avoiding anything project specific is not violated here.
482 return false;
483 }
484 catch( const IO_ERROR& ioe )
485 {
486 // if we are here, a incorrect global symbol library table was found.
487 // Incorrect global symbol library table is not a fatal error:
488 // the user just has to edit the (partially) loaded table.
489 wxString msg =
490 _( "An error occurred attempting to load the global symbol library table.\n"
491 "Please edit this global symbol library table in Preferences menu." );
492
493 DisplayErrorMessage( nullptr, msg, ioe.What() );
494 }
495 }
496
497 return true;
498}
499
500
502{
503 try
504 {
506
507 if( !fn.FileExists() )
508 {
509 DESIGN_BLOCK_LIB_TABLE emptyTable;
510 emptyTable.Save( fn.GetFullPath() );
511 }
512
513 // The global table is not related to a specific project. All projects
514 // will use the same global table. So the KIFACE::OnKifaceStart() contract
515 // of avoiding anything project specific is not violated here.
518 return false;
519 }
520 catch( const IO_ERROR& ioe )
521 {
522 // if we are here, a incorrect global design block library table was found.
523 // Incorrect global design block library table is not a fatal error:
524 // the user just has to edit the (partially) loaded table.
525 wxString msg =
526 _( "An error occurred attempting to load the global design block library table.\n"
527 "Please edit this global design block library table in Preferences menu." );
528
529 DisplayErrorMessage( nullptr, msg, ioe.What() );
530 }
531
532 return true;
533}
534
535
537{
538 end_common();
539}
540
541
542static void traverseSEXPR( SEXPR::SEXPR* aNode,
543 const std::function<void( SEXPR::SEXPR* )>& aVisitor )
544{
545 aVisitor( aNode );
546
547 if( aNode->IsList() )
548 {
549 for( unsigned i = 0; i < aNode->GetNumberOfChildren(); i++ )
550 traverseSEXPR( aNode->GetChild( i ), aVisitor );
551 }
552}
553
554
555void IFACE::SaveFileAs( const wxString& aProjectBasePath, const wxString& aProjectName,
556 const wxString& aNewProjectBasePath, const wxString& aNewProjectName,
557 const wxString& aSrcFilePath, wxString& aErrors )
558{
559 wxFileName destFile( aSrcFilePath );
560 wxString destPath = destFile.GetPathWithSep();
561 wxUniChar pathSep = wxFileName::GetPathSeparator();
562 wxString ext = destFile.GetExt();
563
564 if( destPath.StartsWith( aProjectBasePath + pathSep ) )
565 destPath.Replace( aProjectBasePath, aNewProjectBasePath, false );
566
567 destFile.SetPath( destPath );
568
573 {
574 if( destFile.GetName() == aProjectName )
575 {
576 destFile.SetName( aNewProjectName );
577 }
578 else if( destFile.GetName() == aNewProjectName )
579 {
580 wxString msg;
581
582 if( !aErrors.empty() )
583 aErrors += wxS( "\n" );
584
585 msg.Printf( _( "Cannot copy file '%s' as it will be overwritten by the new root "
586 "sheet file." ), destFile.GetFullPath() );
587 aErrors += msg;
588 return;
589 }
590
591 // Sheet paths when auto-generated are relative to the root, so those will stay
592 // pointing to whatever they were pointing at.
593 // The author can create their own absolute and relative sheet paths. Absolute
594 // sheet paths aren't an issue, and relative ones will continue to work as long
595 // as the author didn't include any '..'s. If they did, it's still not clear
596 // whether they should be adjusted or not (as the author may be duplicating an
597 // entire tree with several projects within it), so we leave this as an exercise
598 // to the author.
599
600 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
601 }
603 {
604 // Symbols are not project-specific. Keep their source names.
605 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
606 }
610 {
611 if( destFile.GetName() == aProjectName + wxS( "-cache" ) )
612 destFile.SetName( aNewProjectName + wxS( "-cache" ) );
613
614 if( destFile.GetName() == aProjectName + wxS( "-rescue" ) )
615 destFile.SetName( aNewProjectName + wxS( "-rescue" ) );
616
617 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
618 }
619 else if( ext == FILEEXT::NetlistFileExtension )
620 {
621 bool success = false;
622
623 if( destFile.GetName() == aProjectName )
624 destFile.SetName( aNewProjectName );
625
626 try
627 {
628 SEXPR::PARSER parser;
629 std::unique_ptr<SEXPR::SEXPR> sexpr( parser.ParseFromFile( TO_UTF8( aSrcFilePath ) ) );
630
631 traverseSEXPR( sexpr.get(), [&]( SEXPR::SEXPR* node )
632 {
633 if( node->IsList() && node->GetNumberOfChildren() > 1
634 && node->GetChild( 0 )->IsSymbol()
635 && node->GetChild( 0 )->GetSymbol() == "source" )
636 {
637 auto pathNode = dynamic_cast<SEXPR::SEXPR_STRING*>( node->GetChild( 1 ) );
638 auto symNode = dynamic_cast<SEXPR::SEXPR_SYMBOL*>( node->GetChild( 1 ) );
639 wxString path;
640
641 if( pathNode )
642 path = pathNode->m_value;
643 else if( symNode )
644 path = symNode->m_value;
645
646 if( path == aProjectName + wxS( ".sch" ) )
647 path = aNewProjectName + wxS( ".sch" );
648 else if( path == aProjectBasePath + "/" + aProjectName + wxS( ".sch" ) )
649 path = aNewProjectBasePath + "/" + aNewProjectName + wxS( ".sch" );
650 else if( path.StartsWith( aProjectBasePath ) )
651 path.Replace( aProjectBasePath, aNewProjectBasePath, false );
652
653 if( pathNode )
654 pathNode->m_value = path;
655 else if( symNode )
656 symNode->m_value = path;
657 }
658 } );
659
660 wxFFile destNetList( destFile.GetFullPath(), "wb" );
661
662 if( destNetList.IsOpened() )
663 success = destNetList.Write( sexpr->AsString( 0 ) );
664
665 // wxFFile dtor will close the file
666 }
667 catch( ... )
668 {
669 success = false;
670 }
671
672 if( !success )
673 {
674 wxString msg;
675
676 if( !aErrors.empty() )
677 aErrors += wxS( "\n" );
678
679 msg.Printf( _( "Cannot copy file '%s'." ), destFile.GetFullPath() );
680 aErrors += msg;
681 }
682 }
683 else if( destFile.GetName() == FILEEXT::SymbolLibraryTableFileName )
684 {
685 SYMBOL_LIB_TABLE symbolLibTable;
686 symbolLibTable.Load( aSrcFilePath );
687
688 for( unsigned i = 0; i < symbolLibTable.GetCount(); i++ )
689 {
690 LIB_TABLE_ROW& row = symbolLibTable.At( i );
691 wxString uri = row.GetFullURI();
692
693 uri.Replace( wxS( "/" ) + aProjectName + wxS( "-cache.lib" ),
694 wxS( "/" ) + aNewProjectName + wxS( "-cache.lib" ) );
695 uri.Replace( wxS( "/" ) + aProjectName + wxS( "-rescue.lib" ),
696 wxS( "/" ) + aNewProjectName + wxS( "-rescue.lib" ) );
697 uri.Replace( wxS( "/" ) + aProjectName + wxS( ".lib" ),
698 wxS( "/" ) + aNewProjectName + wxS( ".lib" ) );
699
700 row.SetFullURI( uri );
701 }
702
703 try
704 {
705 symbolLibTable.Save( destFile.GetFullPath() );
706 }
707 catch( ... )
708 {
709 wxString msg;
710
711 if( !aErrors.empty() )
712 aErrors += "\n";
713
714 msg.Printf( _( "Cannot copy file '%s'." ), destFile.GetFullPath() );
715 aErrors += msg;
716 }
717 }
718 else
719 {
720 wxFAIL_MSG( wxS( "Unexpected filetype for Eeschema::SaveFileAs()" ) );
721 }
722}
723
724
725int IFACE::HandleJob( JOB* aJob, REPORTER* aReporter, PROGRESS_REPORTER* aProgressReporter )
726{
727 return m_jobHandler->RunJob( aJob, aReporter, aProgressReporter );
728}
729
730
731bool IFACE::HandleJobConfig( JOB* aJob, wxWindow* aParent )
732{
733 return m_jobHandler->HandleJobConfig( aJob, aParent );
734}
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
static std::list< TOOL_ACTION * > & GetActionList()
Return list of TOOL_ACTIONs.
static std::list< ACTION_TOOLBAR_CONTROL * > & GetCustomControlList()
Get the list of custom controls that could be used on toolbars.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
static PROGRESS_REPORTER & GetInstance()
static REPORTER & GetInstance()
Definition reporter.cpp:129
static wxString GetGlobalTableFileName()
static bool LoadGlobalTable(DESIGN_BLOCK_LIB_TABLE &aTable)
Load the global design block library table into aTable.
static DESIGN_BLOCK_LIB_TABLE & GetGlobalLibTable()
int ShowModal() override
The base frame for deriving all KiCad main window classes.
static void SetSchEditFrame(SCH_EDIT_FRAME *aSchEditFrame)
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()
An simple container class that lets us dispatch output jobs to kifaces.
Definition job.h:183
A KIFACE implementation.
Definition kiface_base.h:39
KIFACE_BASE(const char *aKifaceName, KIWAY::FACE_T aId)
Definition kiface_base.h:67
void InitSettings(APP_SETTINGS_BASE *aSettings)
Definition kiface_base.h:97
void end_common()
Common things to do for a top program module, during OnKifaceEnd();.
APP_SETTINGS_BASE * KifaceSettings() const
Definition kiface_base.h:95
bool start_common(int aCtlBits)
Common things to do for a top program module, during OnKifaceStart().
int m_start_flags
flags provided in OnKifaceStart()
bool IsSingle() const
Is this KIFACE running under single_top?
void CreateServer(int service, bool local=true)
Definition eda_dde.cpp:43
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:286
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:395
FACE_T
Known KIFACE implementations.
Definition kiway.h:292
@ FACE_SCH
eeschema DSO
Definition kiway.h:293
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
void SetFullURI(const wxString &aFullURI)
Change the full URI for the library.
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
LIB_TABLE_ROW & At(unsigned aIndex)
Get the 'n'th LIB_TABLE_ROW object.
void Load(const wxString &aFileName)
Load the library table using the path defined by aFileName aFallBackTable.
unsigned GetCount() const
Get the number of rows contained in the table.
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
Generate the KiCad netlist format supported by Pcbnew.
void Format(OUTPUTFORMATTER *aOutputFormatter, int aCtl)
Output this s-expression netlist into aOutputFormatter.
Container for data for KiCad programs.
Definition pgm_base.h:103
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:125
void HideSplash()
Definition pgm_base.cpp:333
A progress reporter interface for use in multi-threaded environments.
A pure virtual class used to derive REPORTER objects from.
Definition reporter.h:73
Schematic editor (Eeschema) main window.
Base class that schematic file and library loading and saving plugins should derive from.
Definition sch_io.h:57
virtual SCH_SHEET * LoadSchematicFile(const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const std::map< std::string, UTF8 > *aProperties=nullptr)
Load information from some input file format that this SCH_IO implementation knows about,...
Definition sch_io.cpp:67
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
Definition sch_screen.h:758
SCH_SCREEN * GetNext()
SCH_SCREEN * GetFirst()
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
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:47
T * RegisterSettings(T *aSettings, bool aLoadNow=true)
Take ownership of the pointer passed in.
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Load a project or sets up a new project with a specified path.
PROJECT & Prj() const
A helper while we are not MDI-capable – return the one and only project.
void FlushAndRelease(JSON_SETTINGS *aSettings, bool aSave=true)
If the given settings object is registered, save it to disk and unregister it.
std::unique_ptr< SEXPR > ParseFromFile(const std::string &aFilename)
size_t GetNumberOfChildren() const
Definition sexpr.cpp:71
bool IsList() const
Definition sexpr.h:49
SEXPR * GetChild(size_t aIndex) const
Definition sexpr.cpp:49
The SIMULATOR_FRAME holds the main user-interface for running simulations.
Simple error container for failure to init the simulation engine and ultimately abort the frame const...
Implement an OUTPUTFORMATTER to a memory buffer.
Definition richio.h:449
const std::string & GetString()
Definition richio.h:472
Symbol library viewer main window.
The symbol library editor main window.
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
static bool LoadGlobalTable(SYMBOL_LIB_TABLE &aTable)
Load the global symbol library table into aTable.
Symbol library viewer main window.
UNITS_PROVIDER(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits)
EDA_UNITS GetUserUnits() const
void SetUserUnits(EDA_UNITS aUnits)
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:194
This file is part of the common library.
#define _(s)
DDE server & client.
#define KICAD_SCH_PORT_SERVICE_NUMBER
Eeschema listens on this port for commands from Pcbnew.
Definition eda_dde.h:43
EDA_UNITS
Definition eda_units.h:48
SCH_SHEET * g_RootSheet
Definition eeschema.cpp:77
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
Definition eeschema.cpp:401
static void traverseSEXPR(SEXPR::SEXPR *aNode, const std::function< void(SEXPR::SEXPR *)> &aVisitor)
Definition eeschema.cpp:542
@ PANEL_SYM_EDIT_GRIDS
Definition frame_type.h:73
@ FRAME_SCH_SYMBOL_EDITOR
Definition frame_type.h:35
@ PANEL_SCH_FIELD_NAME_TEMPLATES
Definition frame_type.h:83
@ PANEL_SCH_TOOLBARS
Definition frame_type.h:82
@ FRAME_SCH_VIEWER
Definition frame_type.h:36
@ PANEL_SCH_DISP_OPTIONS
Definition frame_type.h:78
@ PANEL_SCH_SIMULATOR
Definition frame_type.h:84
@ FRAME_SCH
Definition frame_type.h:34
@ PANEL_SYM_TOOLBARS
Definition frame_type.h:76
@ FRAME_SIMULATOR
Definition frame_type.h:38
@ PANEL_SYM_EDIT_OPTIONS
Definition frame_type.h:74
@ PANEL_SCH_EDIT_OPTIONS
Definition frame_type.h:80
@ PANEL_SYM_DISP_OPTIONS
Definition frame_type.h:72
@ DIALOG_SCH_LIBRARY_TABLE
Definition frame_type.h:123
@ PANEL_SYM_COLORS
Definition frame_type.h:75
@ PANEL_SCH_GRIDS
Definition frame_type.h:79
@ PANEL_SCH_COLORS
Definition frame_type.h:81
@ DIALOG_DESIGN_BLOCK_LIBRARY_TABLE
Definition frame_type.h:122
@ FRAME_SYMBOL_CHOOSER
Definition frame_type.h:37
void KiCopyFile(const wxString &aSrcPath, const wxString &aDestPath, wxString &aErrors)
Definition gestfich.cpp:290
static const std::string LegacySchematicFileExtension
static const std::string NetlistFileExtension
static const std::string SymbolLibraryTableFileName
static const std::string SchematicSymbolFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string LegacySymbolLibFileExtension
static const std::string KiCadSymbolLibFileExtension
static const std::string BackupFileSuffix
static const std::string LegacySymbolDocumentFileExtension
#define KIFACE_API
@ KIFACE_NETLIST_SCHEMATIC
Definition kiface_ids.h:56
#define KFCTL_CLI
Running as CLI app.
Definition kiway.h:162
#define KIFACE_GETTER
Definition kiway.h:110
static std::unique_ptr< SCHEMATIC > readSchematicFromFile(const std::string &aFilename)
Definition eeschema.cpp:84
SCH::IFACE KIFACE_BASE, UNITS_PROVIDER kiface("eeschema", KIWAY::FACE_SCH)
bool generateSchematicNetlist(const wxString &aFilename, std::string &aNetlist)
Definition eeschema.cpp:138
#define GNL_ALL
@ GNL_OPT_KICAD
void InvokeEditDesignBlockLibTable(KIWAY *aKiway, wxWindow *aParent)
void InvokeSchEditSymbolLibTable(KIWAY *aKiway, wxWindow *aParent)
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:913
see class PGM_BASE
T * GetToolbarSettings(const wxString &aFilename)
T * GetAppSettings(const char *aFilename)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
bool OnKifaceStart(PGM_BASE *aProgram, int aCtlBits, KIWAY *aKiway) override
Typically start_common() is called from here.
Implement a participant in the KIWAY alchemy.
Definition kiway.h:153
bool OnKifaceStart(PGM_BASE *aProgram, int aCtlBits, KIWAY *aKiway) override
Typically start_common() is called from here.
Definition eeschema.cpp:412
bool loadGlobalDesignBlockLibTable()
Definition eeschema.cpp:501
void SaveFileAs(const wxString &aProjectBasePath, const wxString &aProjectName, const wxString &aNewProjectBasePath, const wxString &aNewProjectName, const wxString &aSrcFilePath, wxString &aErrors) override
Saving a file under a different name is delegated to the various KIFACEs because the project doesn't ...
Definition eeschema.cpp:555
wxWindow * CreateKiWindow(wxWindow *aParent, int aClassId, KIWAY *aKiway, int aCtlBits=0) override
Create a wxWindow for the current project.
Definition eeschema.cpp:166
IFACE(const char *aName, KIWAY::FACE_T aType)
Definition eeschema.cpp:155
void Reset() override
Reloads global state.
Definition eeschema.cpp:451
void * IfaceOrAddress(int aDataId) override
Return a pointer to the requested object.
Definition eeschema.cpp:363
int HandleJob(JOB *aJob, REPORTER *aReporter, PROGRESS_REPORTER *aProgressReporter) override
Definition eeschema.cpp:725
std::unique_ptr< EESCHEMA_JOBS_HANDLER > m_jobHandler
Definition eeschema.cpp:392
bool loadGlobalLibTable()
Definition eeschema.cpp:457
bool HandleJobConfig(JOB *aJob, wxWindow *aParent) override
Definition eeschema.cpp:731
void OnKifaceEnd() override
Called just once just before the DSO is to be unloaded.
Definition eeschema.cpp:536
Definition of file extensions used in Kicad.