KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_edit_frame.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) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 1992-2024 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <algorithm>
26#include <api/api_handler_sch.h>
27#include <api/api_server.h>
28#include <base_units.h>
29#include <bitmaps.h>
30#include <symbol_library.h>
31#include <confirm.h>
32#include <connection_graph.h>
33#include <dialogs/dialog_erc.h>
38#include <eeschema_id.h>
39#include <executable_names.h>
42#include <gestfich.h>
44#include <invoke_sch_dialog.h>
45#include <string_utils.h>
46#include <kiface_base.h>
47#include <kiplatform/app.h>
48#include <kiway.h>
49#include <symbol_edit_frame.h>
50#include <symbol_viewer_frame.h>
51#include <pgm_base.h>
52#include <core/profile.h>
55#include <python_scripting.h>
56#include <sch_edit_frame.h>
58#include <sch_painter.h>
59#include <sch_marker.h>
60#include <sch_sheet_pin.h>
61#include <sch_commit.h>
62#include <sch_rule_area.h>
64#include <advanced_config.h>
65#include <sim/simulator_frame.h>
66#include <tool/action_manager.h>
67#include <tool/action_toolbar.h>
68#include <tool/common_control.h>
69#include <tool/common_tools.h>
70#include <tool/embed_tool.h>
71#include <tool/picker_tool.h>
73#include <tool/selection.h>
75#include <tool/tool_manager.h>
76#include <tool/zoom_tool.h>
77#include <tools/ee_actions.h>
83#include <tools/sch_edit_tool.h>
88#include <tools/sch_move_tool.h>
91#include <unordered_set>
92#include <view/view_controls.h>
93#include <widgets/wx_infobar.h>
98#include <wx/cmdline.h>
99#include <wx/app.h>
100#include <wx/filedlg.h>
101#include <wx/socket.h>
102#include <wx/debug.h>
104#include <widgets/wx_aui_utils.h>
106
107#ifdef KICAD_IPC_API
109#endif
110
111
112#define DIFF_SYMBOLS_DIALOG_NAME wxT( "DiffSymbolsDialog" )
113
114
115BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, SCH_BASE_FRAME )
118
119 EVT_SIZE( SCH_EDIT_FRAME::OnSize )
120
123
125
126 EVT_MENU( wxID_EXIT, SCH_EDIT_FRAME::OnExit )
127 EVT_MENU( wxID_CLOSE, SCH_EDIT_FRAME::OnExit )
128
129 // Drop files event
130 EVT_DROP_FILES( SCH_EDIT_FRAME::OnDropFiles )
131END_EVENT_TABLE()
132
133
134wxDEFINE_EVENT( EDA_EVT_SCHEMATIC_CHANGING, wxCommandEvent );
135wxDEFINE_EVENT( EDA_EVT_SCHEMATIC_CHANGED, wxCommandEvent );
136
137
138SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
139 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH, wxT( "Eeschema" ), wxDefaultPosition,
141 m_ercDialog( nullptr ),
142 m_diffSymbolDialog( nullptr ),
143 m_symbolFieldsTableDialog( nullptr ),
144 m_netNavigator( nullptr ),
145 m_highlightedConnChanged( false ),
146 m_designBlocksPane( nullptr )
147{
148 m_maximizeByDefault = true;
149 m_schematic = new SCHEMATIC( nullptr );
150
151 m_showBorderAndTitleBlock = true; // true to show sheet references
152 m_supportsAutoSave = true;
153 m_syncingPcbToSchSelection = false;
154 m_aboutTitle = _HKI( "KiCad Schematic Editor" );
155 m_show_search = false;
156
157 m_findReplaceDialog = nullptr;
158
159 m_findReplaceData = std::make_unique<SCH_SEARCH_DATA>();
160
161 // Give an icon
162 wxIcon icon;
163 wxIconBundle icon_bundle;
164
165 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 48 ) );
166 icon_bundle.AddIcon( icon );
167 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 128 ) );
168 icon_bundle.AddIcon( icon );
169 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 256 ) );
170 icon_bundle.AddIcon( icon );
171 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema_32 ) );
172 icon_bundle.AddIcon( icon );
173 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema_16 ) );
174 icon_bundle.AddIcon( icon );
175
176 SetIcons( icon_bundle );
177
178 LoadSettings( eeconfig() );
179
180 // NB: also links the schematic to the loaded project
181 CreateScreens();
182
183 SCH_SHEET_PATH root;
184 root.push_back( &Schematic().Root() );
185 SetCurrentSheet( root );
186
187 setupTools();
188 setupUIConditions();
189 ReCreateMenuBar();
190 ReCreateHToolbar();
191 ReCreateVToolbar();
192 ReCreateOptToolbar();
193
194#ifdef KICAD_IPC_API
196 &SCH_EDIT_FRAME::onPluginAvailabilityChanged, this );
197#endif
198
199 m_hierarchy = new HIERARCHY_PANE( this );
200
201 // Initialize common print setup dialog settings.
202 m_pageSetupData.GetPrintData().SetPrintMode( wxPRINT_MODE_PRINTER );
203 m_pageSetupData.GetPrintData().SetQuality( wxPRINT_QUALITY_MEDIUM );
204 m_pageSetupData.GetPrintData().SetBin( wxPRINTBIN_AUTO );
205 m_pageSetupData.GetPrintData().SetNoCopies( 1 );
206
207 m_searchPane = new SCH_SEARCH_PANE( this );
208 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
209
210 m_propertiesPanel->SetSplitterProportion( eeconfig()->m_AuiPanels.properties_splitter );
211
212 m_selectionFilterPanel = new PANEL_SCH_SELECTION_FILTER( this );
213 m_designBlocksPane = new DESIGN_BLOCK_PANE( this, nullptr, m_designBlockHistoryList );
214
215 m_auimgr.SetManagedWindow( this );
216
217 CreateInfoBar();
218
219 // Rows; layers 4 - 6
220 m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( wxS( "MainToolbar" ) )
221 .Top().Layer( 6 ) );
222
223 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) )
224 .Bottom().Layer( 6 ) );
225
226 // Columns; layers 1 - 3
227 m_auimgr.AddPane( m_hierarchy, EDA_PANE().Palette().Name( SchematicHierarchyPaneName() )
228 .Caption( _( "Schematic Hierarchy" ) )
229 .Left().Layer( 3 ).Position( 1 )
230 .TopDockable( false )
231 .BottomDockable( false )
232 .CloseButton( false )
233 .MinSize( FromDIP( wxSize( 120, 60 ) ) )
234 .BestSize( FromDIP( wxSize( 200, 200 ) ) )
235 .FloatingSize( FromDIP( wxSize( 200, 200 ) ) )
236 .FloatingPosition( FromDIP( wxPoint( 50, 50 ) ) )
237 .Show( false ) );
238
239 m_auimgr.AddPane( m_propertiesPanel, defaultPropertiesPaneInfo( this ) );
240 m_auimgr.AddPane( m_selectionFilterPanel, defaultSchSelectionFilterPaneInfo( this ) );
241
242 m_auimgr.AddPane( m_designBlocksPane, defaultDesignBlocksPaneInfo( this ) );
243
244 m_auimgr.AddPane( createHighlightedNetNavigator(), defaultNetNavigatorPaneInfo() );
245
246 m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( wxS( "OptToolbar" ) )
247 .Left().Layer( 2 ) );
248
249 m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( wxS( "ToolsToolbar" ) )
250 .Right().Layer( 2 ) );
251
252 // Center
253 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
254 .Center() );
255
256 m_auimgr.AddPane( m_searchPane, EDA_PANE()
257 .Name( SearchPaneName() )
258 .Bottom()
259 .Caption( _( "Search" ) )
260 .PaneBorder( false )
261 .MinSize( FromDIP( wxSize( 180, 60 ) ) )
262 .BestSize( FromDIP( wxSize( 180, 100 ) ) )
263 .FloatingSize( FromDIP( wxSize( 480, 200 ) ) )
264 .CloseButton( false )
265 .DestroyOnClose( false )
266 .Show( m_show_search ) );
267
268 FinishAUIInitialization();
269
270 resolveCanvasType();
271 SwitchCanvas( m_canvasType );
272
273 GetCanvas()->GetGAL()->SetAxesEnabled( false );
274
275 KIGFX::SCH_VIEW* view = GetCanvas()->GetView();
276 static_cast<KIGFX::SCH_PAINTER*>( view->GetPainter() )->SetSchematic( m_schematic );
277
278 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
279 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
280 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
281 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
282 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
283 EESCHEMA_SETTINGS* cfg = eeconfig();
284
285 hierarchy_pane.Show( cfg->m_AuiPanels.show_schematic_hierarchy );
286 netNavigatorPane.Show( cfg->m_AuiPanels.show_net_nav_panel );
287 propertiesPane.Show( cfg->m_AuiPanels.show_properties );
288 designBlocksPane.Show( cfg->m_AuiPanels.design_blocks_show );
289 updateSelectionFilterVisbility();
290
291 // The selection filter doesn't need to grow in the vertical direction when docked
292 selectionFilterPane.dock_proportion = 0;
293
296 {
297 // Show at end, after positioning
298 hierarchy_pane.FloatingSize( cfg->m_AuiPanels.hierarchy_panel_float_width,
300 }
301
302 if( cfg->m_AuiPanels.net_nav_panel_float_size.GetWidth() > 0
303 && cfg->m_AuiPanels.net_nav_panel_float_size.GetHeight() > 0 )
304 {
305 netNavigatorPane.FloatingSize( cfg->m_AuiPanels.net_nav_panel_float_size );
306 netNavigatorPane.FloatingPosition( cfg->m_AuiPanels.net_nav_panel_float_pos );
307 }
308
310 SetAuiPaneSize( m_auimgr, propertiesPane, cfg->m_AuiPanels.properties_panel_width, -1 );
311
313 hierarchy_pane.Float();
314
316 && ( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_TOP
317 || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) )
318 {
319 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
320 searchPane.Direction( cfg->m_AuiPanels.search_panel_dock_direction );
321 SetAuiPaneSize( m_auimgr, searchPane, -1, cfg->m_AuiPanels.search_panel_height );
322 }
323
324 else if( cfg->m_AuiPanels.search_panel_width > 0
325 && ( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_LEFT
326 || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) )
327 {
328 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
329 searchPane.Direction( cfg->m_AuiPanels.search_panel_dock_direction );
330 SetAuiPaneSize( m_auimgr, searchPane, cfg->m_AuiPanels.search_panel_width, -1 );
331 }
332
334 netNavigatorPane.Float();
335
337 SetAuiPaneSize( m_auimgr, designBlocksPane,
339
341 {
342 // If the net navigator is not show, let the hierarchy navigator take all of the vertical
343 // space.
345 {
346 SetAuiPaneSize( m_auimgr, hierarchy_pane,
348 }
349 else
350 {
351 SetAuiPaneSize( m_auimgr, hierarchy_pane,
354
355 SetAuiPaneSize( m_auimgr, netNavigatorPane,
357 cfg->m_AuiPanels.net_nav_panel_docked_size.GetHeight() );
358 }
359
360 // wxAUI hack: force width by setting MinSize() and then Fixed()
361 // thanks to ZenJu https://github.com/wxWidgets/wxWidgets/issues/13180
362 hierarchy_pane.MinSize( cfg->m_AuiPanels.hierarchy_panel_docked_width, 60 );
363 hierarchy_pane.Fixed();
364 netNavigatorPane.MinSize( cfg->m_AuiPanels.net_nav_panel_docked_size.GetWidth(), 60 );
365 netNavigatorPane.Fixed();
366 m_auimgr.Update();
367
368 // now make it resizable again
369 hierarchy_pane.Resizable();
370 netNavigatorPane.Resizable();
371 m_auimgr.Update();
372
373 // Note: DO NOT call m_auimgr.Update() anywhere after this; it will nuke the size
374 // back to minimum.
375 hierarchy_pane.MinSize( FromDIP( wxSize( 120, 60 ) ) );
376 netNavigatorPane.MinSize( FromDIP( wxSize( 120, 60 ) ) );
377 }
378 else
379 {
380 m_auimgr.Update();
381 }
382
383 LoadProjectSettings();
384 LoadDrawingSheet();
385
391
392 initScreenZoom();
393
394 m_hierarchy->Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::OnResizeHierarchyNavigator, this );
395 m_netNavigator->Bind( wxEVT_TREE_SEL_CHANGING, &SCH_EDIT_FRAME::onNetNavigatorSelChanging,
396 this );
397 m_netNavigator->Bind( wxEVT_TREE_SEL_CHANGED, &SCH_EDIT_FRAME::onNetNavigatorSelection, this );
398 m_netNavigator->Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::onResizeNetNavigator, this );
399
400 // This is used temporarily to fix a client size issue on GTK that causes zoom to fit
401 // to calculate the wrong zoom size. See SCH_EDIT_FRAME::onSize().
402 Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::onSize, this );
403
404 setupUnits( eeconfig() );
405
406 // Net list generator
407 DefaultExecFlags();
408
409 updateTitle();
410 m_toolManager->GetTool<SCH_NAVIGATE_TOOL>()->ResetHistory();
411
412#ifdef KICAD_IPC_API
413 m_apiHandler = std::make_unique<API_HANDLER_SCH>( this );
414 Pgm().GetApiServer().RegisterHandler( m_apiHandler.get() );
415#endif
416
417 // Default shutdown reason until a file is loaded
418 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New schematic file is unsaved" ) );
419
420 // Init for dropping files
422 DragAcceptFiles( true );
423
424 // Ensure the window is on top
425 Raise();
426
427 // Now that all sizes are fixed, set the initial hierarchy_pane floating position to the
428 // top-left corner of the canvas
429 wxPoint canvas_pos = GetCanvas()->GetScreenPosition();
430 hierarchy_pane.FloatingPosition( canvas_pos.x + 10, canvas_pos.y + 10 );
431
432 Bind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &SCH_EDIT_FRAME::onCloseSymbolDiffDialog, this );
433 Bind( EDA_EVT_CLOSE_ERC_DIALOG, &SCH_EDIT_FRAME::onCloseErcDialog, this );
434 Bind( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, &SCH_EDIT_FRAME::onCloseSymbolFieldsTableDialog,
435 this );
436}
437
438
440{
441#ifdef KICAD_IPC_API
442 Pgm().GetApiServer().DeregisterHandler( m_apiHandler.get() );
443 wxTheApp->Unbind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED,
444 &SCH_EDIT_FRAME::onPluginAvailabilityChanged, this );
445#endif
446
447 m_hierarchy->Unbind( wxEVT_SIZE, &SCH_EDIT_FRAME::OnResizeHierarchyNavigator, this );
448
449 // Ensure m_canvasType is up to date, to save it in config
451
452 SetScreen( nullptr );
453
454 if( m_schematic )
456
457 // Delete all items not in draw list before deleting schematic
458 // to avoid dangling pointers stored in these items
461
462 delete m_schematic;
463 m_schematic = nullptr;
464
465 // Close the project if we are standalone, so it gets cleaned up properly
466 if( Kiface().IsSingle() )
467 {
468 try
469 {
470 GetSettingsManager()->UnloadProject( &Prj(), false );
471 }
472 catch( const nlohmann::detail::type_error& e )
473 {
474 wxFAIL_MSG( wxString::Format( wxT( "Settings exception occurred: %s" ), e.what() ) );
475 }
476 }
477
478 delete m_hierarchy;
480}
481
482
484{
485 aEvent.Skip();
486
487 // 1st Call: Handle the size update during the first resize event.
489
490 // Defer the second size capture
491 CallAfter([this]() {
493 });
494}
495
496
498{
499 // Called when resizing the Hierarchy Navigator panel
500 // Store the current pane size
501 // It allows to retrieve the last defined pane size when switching between
502 // docked and floating pane state
503 // Note: *DO NOT* call m_auimgr.Update() here: it crashes KiCad at least on Windows
504
505 EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
506 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
507
508 if( cfg && m_hierarchy->IsShownOnScreen() )
509 {
510 cfg->m_AuiPanels.hierarchy_panel_float_width = hierarchy_pane.floating_size.x;
511 cfg->m_AuiPanels.hierarchy_panel_float_height = hierarchy_pane.floating_size.y;
512
513 // initialize hierarchy_panel_docked_width and best size only if the hierarchy_pane
514 // width is > 0 (i.e. if its size is already set and has meaning)
515 // if it is floating, its size is not initialized (only floating_size is initialized)
516 // initializing hierarchy_pane.best_size is useful when switching to float pane and
517 // after switching to the docked pane, to retrieve the last docked pane width
518 if( hierarchy_pane.rect.width > 50 ) // 50 is a good margin
519 {
520 cfg->m_AuiPanels.hierarchy_panel_docked_width = hierarchy_pane.rect.width;
521 hierarchy_pane.best_size.x = hierarchy_pane.rect.width;
522 }
523 }
524}
525
526
528{
529 // Create the manager and dispatcher & route draw panel events to the dispatcher
532 GetCanvas()->GetViewControls(), config(), this );
533 m_actions = new EE_ACTIONS();
535
536 // Register tools
556
557 // Run the selection tool, it is supposed to be always active
559
561}
562
563
565{
567
569 SCH_EDITOR_CONDITIONS cond( this );
570
571 wxASSERT( mgr );
572
573 auto hasElements =
574 [ this ] ( const SELECTION& aSel )
575 {
576 return GetScreen() &&
577 ( !GetScreen()->Items().empty() || !SELECTION_CONDITIONS::Idle( aSel ) );
578 };
579
580 auto searchPaneCond =
581 [this] ( const SELECTION& )
582 {
583 return m_auimgr.GetPane( SearchPaneName() ).IsShown();
584 };
585
586 auto propertiesCond =
587 [this] ( const SELECTION& )
588 {
589 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
590 };
591
592 auto hierarchyNavigatorCond =
593 [ this ] ( const SELECTION& aSel )
594 {
595 return m_auimgr.GetPane( SchematicHierarchyPaneName() ).IsShown();
596 };
597
598 auto netNavigatorCond =
599 [ this ] (const SELECTION& aSel )
600 {
601 return m_auimgr.GetPane( NetNavigatorPaneName() ).IsShown();
602 };
603
604 auto designBlockCond =
605 [ this ] (const SELECTION& aSel )
606 {
607 return m_auimgr.GetPane( DesignBlocksPaneName() ).IsShown();
608 };
609
610 auto undoCond =
611 [ this ] (const SELECTION& aSel )
612 {
614 return true;
615
616 return GetUndoCommandCount() > 0;
617 };
618
619#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
620#define CHECK( x ) ACTION_CONDITIONS().Check( x )
621
623 mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) );
625
626 mgr->SetConditions( EE_ACTIONS::showSearch, CHECK( searchPaneCond ) );
627 mgr->SetConditions( EE_ACTIONS::showHierarchy, CHECK( hierarchyNavigatorCond ) );
628 mgr->SetConditions( EE_ACTIONS::showNetNavigator, CHECK( netNavigatorCond ) );
629 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
630 mgr->SetConditions( EE_ACTIONS::showDesignBlockPanel, CHECK( designBlockCond ) );
635 CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) );
636 mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) );
637 mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
638
640 CHECK( cond.LineMode( LINE_MODE::LINE_MODE_FREE ) ) );
642 CHECK( cond.LineMode( LINE_MODE::LINE_MODE_90 ) ) );
644 CHECK( cond.LineMode( LINE_MODE::LINE_MODE_45 ) ) );
645
646 mgr->SetConditions( ACTIONS::cut, ENABLE( hasElements ) );
647 mgr->SetConditions( ACTIONS::copy, ENABLE( hasElements ) );
648 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( hasElements ) );
651 mgr->SetConditions( ACTIONS::doDelete, ENABLE( hasElements ) );
652 mgr->SetConditions( ACTIONS::duplicate, ENABLE( hasElements ) );
653 mgr->SetConditions( ACTIONS::selectAll, ENABLE( hasElements ) );
654 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( hasElements ) );
655
656 mgr->SetConditions( EE_ACTIONS::rotateCW, ENABLE( hasElements ) );
657 mgr->SetConditions( EE_ACTIONS::rotateCCW, ENABLE( hasElements ) );
658 mgr->SetConditions( EE_ACTIONS::mirrorH, ENABLE( hasElements ) );
659 mgr->SetConditions( EE_ACTIONS::mirrorV, ENABLE( hasElements ) );
660
665
666 if( SCRIPTING::IsWxAvailable() )
667 {
669 CHECK( cond.ScriptingConsoleVisible() ) );
670 }
671
672 auto showHiddenPinsCond =
673 [this]( const SELECTION& )
674 {
675 return GetShowAllPins();
676 };
677
678 auto showHiddenFieldsCond =
679 [this]( const SELECTION& )
680 {
682 return cfg && cfg->m_Appearance.show_hidden_fields;
683 };
684
685 auto showDirectiveLabelsCond =
686 [this]( const SELECTION& )
687 {
689 return cfg && cfg->m_Appearance.show_directive_labels;
690 };
691
692 auto showERCErrorsCond =
693 [this]( const SELECTION& )
694 {
696 return cfg && cfg->m_Appearance.show_erc_errors;
697 };
698
699 auto showERCWarningsCond =
700 [this]( const SELECTION& )
701 {
703 return cfg && cfg->m_Appearance.show_erc_warnings;
704 };
705
706 auto showERCExclusionsCond =
707 [this]( const SELECTION& )
708 {
710 return cfg && cfg->m_Appearance.show_erc_exclusions;
711 };
712
713 auto markSimExclusionsCond =
714 [this]( const SELECTION& )
715 {
717 return cfg && cfg->m_Appearance.mark_sim_exclusions;
718 };
719
720 auto showOPVoltagesCond =
721 [this]( const SELECTION& )
722 {
724 return cfg && cfg->m_Appearance.show_op_voltages;
725 };
726
727 auto showOPCurrentsCond =
728 [this]( const SELECTION& )
729 {
731 return cfg && cfg->m_Appearance.show_op_currents;
732 };
733
734 auto showPinAltModeIconsCond =
735 [this]( const SELECTION& )
736 {
738 return cfg && cfg->m_Appearance.show_pin_alt_icons;
739 };
740
741 auto showAnnotateAutomaticallyCond =
742 [this]( const SELECTION& )
743 {
745 return cfg && cfg->m_AnnotatePanel.automatic;
746 };
747
748 auto remapSymbolsCondition =
749 [&]( const SELECTION& aSel )
750 {
751 SCH_SCREENS schematic( Schematic().Root() );
752
753 // The remapping can only be performed on legacy projects.
754 return schematic.HasNoFullyDefinedLibIds();
755 };
756
757 auto belowRootSheetCondition =
758 [this]( const SELECTION& aSel )
759 {
761 return navigateTool && navigateTool->CanGoUp();
762 };
763
764 mgr->SetConditions( EE_ACTIONS::leaveSheet, ENABLE( belowRootSheetCondition ) );
765
766 /* Some of these are bound by default to arrow keys which will get a different action if we
767 * disable the buttons. So always leave them enabled so the action is consistent.
768 * https://gitlab.com/kicad/code/kicad/-/issues/14783
769 mgr->SetConditions( EE_ACTIONS::navigateUp, ENABLE( belowRootSheetCondition ) );
770 mgr->SetConditions( EE_ACTIONS::navigateForward, ENABLE( navHistoryHasForward ) );
771 mgr->SetConditions( EE_ACTIONS::navigateBack, ENABLE( navHistoryHsBackward ) );
772 */
773
774 mgr->SetConditions( EE_ACTIONS::remapSymbols, ENABLE( remapSymbolsCondition ) );
775 mgr->SetConditions( EE_ACTIONS::toggleHiddenPins, CHECK( showHiddenPinsCond ) );
776 mgr->SetConditions( EE_ACTIONS::toggleHiddenFields, CHECK( showHiddenFieldsCond ) );
777 mgr->SetConditions( EE_ACTIONS::toggleDirectiveLabels, CHECK( showDirectiveLabelsCond ) );
778 mgr->SetConditions( EE_ACTIONS::toggleERCErrors, CHECK( showERCErrorsCond ) );
779 mgr->SetConditions( EE_ACTIONS::toggleERCWarnings, CHECK( showERCWarningsCond ) );
780 mgr->SetConditions( EE_ACTIONS::toggleERCExclusions, CHECK( showERCExclusionsCond ) );
781 mgr->SetConditions( EE_ACTIONS::markSimExclusions, CHECK( markSimExclusionsCond ) );
782 mgr->SetConditions( EE_ACTIONS::toggleOPVoltages, CHECK( showOPVoltagesCond ) );
783 mgr->SetConditions( EE_ACTIONS::toggleOPCurrents, CHECK( showOPCurrentsCond ) );
784 mgr->SetConditions( EE_ACTIONS::togglePinAltIcons, CHECK( showPinAltModeIconsCond ) );
785 mgr->SetConditions( EE_ACTIONS::toggleAnnotateAuto, CHECK( showAnnotateAutomaticallyCond ) );
787
790
791#define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
792
822
823#undef CURRENT_TOOL
824#undef CHECK
825#undef ENABLE
826}
827
828
830{
831 // we cannot store a pointer to an item in the display list here since
832 // that item may be deleted, such as part of a line concatenation or other.
833 // So simply always keep a copy of the object which is to be repeated.
834
835 if( aItem )
836 {
837 m_items_to_repeat.clear();
838
839 AddCopyForRepeatItem( aItem );
840 }
841}
842
843
845{
846 // we cannot store a pointer to an item in the display list here since
847 // that item may be deleted, such as part of a line concatenation or other.
848 // So simply always keep a copy of the object which is to be repeated.
849
850 if( aItem )
851 {
852 std::unique_ptr<SCH_ITEM> repeatItem( static_cast<SCH_ITEM*>( aItem->Duplicate() ) );
853
854 // Clone() preserves the flags & parent, we want 'em cleared.
855 repeatItem->ClearFlags();
856 repeatItem->SetParent( nullptr );
857
858 m_items_to_repeat.emplace_back( std::move( repeatItem ) );
859 }
860}
861
862
864{
865 return Schematic().GetItem( aId );
866}
867
868
870{
872}
873
874
876{
877 return GetCurrentSheet().LastScreen();
878}
879
880
882{
883 return *m_schematic;
884}
885
886
888{
889 return GetCurrentSheet().Last()->GetName();
890}
891
892
894{
896}
897
898
900{
903
904 SCH_SHEET* rootSheet = new SCH_SHEET( m_schematic );
905 m_schematic->SetRoot( rootSheet );
906
907 SCH_SCREEN* rootScreen = new SCH_SCREEN( m_schematic );
908 const_cast<KIID&>( rootSheet->m_Uuid ) = rootScreen->GetUuid();
909 m_schematic->Root().SetScreen( rootScreen );
910 SetScreen( Schematic().RootScreen() );
911
912
913 m_schematic->RootScreen()->SetFileName( wxEmptyString );
914
915 // Don't leave root page number empty
916 SCH_SHEET_PATH rootSheetPath;
917
918 rootSheetPath.push_back( rootSheet );
919 m_schematic->RootScreen()->SetPageNumber( wxT( "1" ) );
920 rootSheetPath.SetPageNumber( wxT( "1" ) );
921
922 if( GetScreen() == nullptr )
923 {
924 SCH_SCREEN* screen = new SCH_SCREEN( m_schematic );
925 SetScreen( screen );
926 }
927}
928
929
931{
932 return m_schematic->CurrentSheet();
933}
934
935
937{
938 if( aSheet != GetCurrentSheet() )
939 {
940 FocusOnItem( nullptr );
941
942 Schematic().SetCurrentSheet( aSheet );
943 GetCanvas()->DisplaySheet( aSheet.LastScreen() );
944 }
945}
946
947
949{
951
952 for( SCH_ITEM* item : screen->Items() )
953 item->ClearCaches();
954
955 for( const std::pair<const wxString, LIB_SYMBOL*>& libSymbol : screen->GetLibSymbols() )
956 {
957 wxCHECK2( libSymbol.second, continue );
958 libSymbol.second->ClearCaches();
959 }
960
961 if( Schematic().Settings().m_IntersheetRefsShow )
963
964 FocusOnItem( nullptr );
965
966 GetCanvas()->DisplaySheet( GetCurrentSheet().LastScreen() );
967
969 selectionTool->Reset( TOOL_BASE::REDRAW );
970
972}
973
974
975bool SCH_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
976{
977 // Exit interactive editing
978 // Note this this will commit *some* pending changes. For instance, the EE_POINT_EDITOR
979 // will cancel any drag currently in progress, but commit all changes from previous drags.
980 if( m_toolManager )
982
983 // Shutdown blocks must be determined and vetoed as early as possible
984 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
985 && IsContentModified() )
986 {
987 return false;
988 }
989
990 if( Kiface().IsSingle() )
991 {
992 auto* symbolEditor = (SYMBOL_EDIT_FRAME*) Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
993
994 if( symbolEditor && !symbolEditor->Close() ) // Can close symbol editor?
995 return false;
996
997 auto* symbolViewer = (SYMBOL_VIEWER_FRAME*) Kiway().Player( FRAME_SCH_VIEWER, false );
998
999 if( symbolViewer && !symbolViewer->Close() ) // Can close symbol viewer?
1000 return false;
1001
1002 // SYMBOL_CHOOSER_FRAME is always modal so this shouldn't come up, but better safe than
1003 // sorry.
1004 auto* chooser = (SYMBOL_CHOOSER_FRAME*) Kiway().Player( FRAME_SYMBOL_CHOOSER, false );
1005
1006 if( chooser && !chooser->Close() ) // Can close symbol chooser?
1007 return false;
1008 }
1009 else
1010 {
1011 auto* symbolEditor = (SYMBOL_EDIT_FRAME*) Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
1012
1013 if( symbolEditor && symbolEditor->IsSymbolFromSchematic() )
1014 {
1015 if( !symbolEditor->CanCloseSymbolFromSchematic( true ) )
1016 return false;
1017 }
1018 }
1019
1020 if( !Kiway().PlayerClose( FRAME_SIMULATOR, false ) ) // Can close the simulator?
1021 return false;
1022
1024 && !m_symbolFieldsTableDialog->Close( false ) ) // Can close the symbol fields table?
1025 {
1026 return false;
1027 }
1028
1029 // We may have gotten multiple events; don't clean up twice
1030 if( !Schematic().IsValid() )
1031 return false;
1032
1033 if( IsContentModified() )
1034 {
1035 wxFileName fileName = Schematic().RootScreen()->GetFileName();
1036 wxString msg = _( "Save changes to '%s' before closing?" );
1037
1038 if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
1039 [&]() -> bool
1040 {
1041 return SaveProject();
1042 } ) )
1043 {
1044 return false;
1045 }
1046 }
1047
1048 return true;
1049}
1050
1051
1053{
1054 SCH_SHEET_LIST sheetlist = Schematic().Hierarchy();
1055
1056 // Shutdown all running tools
1057 if( m_toolManager )
1059
1060 // Close modeless dialogs. They're trouble when they get destroyed after the frame.
1061 Unbind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &SCH_EDIT_FRAME::onCloseSymbolDiffDialog, this );
1062 Unbind( EDA_EVT_CLOSE_ERC_DIALOG, &SCH_EDIT_FRAME::onCloseErcDialog, this );
1063 Unbind( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE,
1065 m_netNavigator->Unbind( wxEVT_TREE_SEL_CHANGING, &SCH_EDIT_FRAME::onNetNavigatorSelChanging,
1066 this );
1067 m_netNavigator->Unbind( wxEVT_TREE_SEL_CHANGED, &SCH_EDIT_FRAME::onNetNavigatorSelection,
1068 this );
1069
1070 // Close the find dialog and preserve its setting if it is displayed.
1072 {
1075
1076 m_findReplaceDialog->Destroy();
1077 m_findReplaceDialog = nullptr;
1078 }
1079
1080 if( m_diffSymbolDialog )
1081 {
1082 m_diffSymbolDialog->Destroy();
1083 m_diffSymbolDialog = nullptr;
1084 }
1085
1086 if( m_ercDialog )
1087 {
1088 m_ercDialog->Destroy();
1089 m_ercDialog = nullptr;
1090 }
1091
1093 {
1094 m_symbolFieldsTableDialog->Destroy();
1095 m_symbolFieldsTableDialog = nullptr;
1096 }
1097
1098 // Make sure local settings are persisted
1100
1101 // Shutdown all running tools
1102 if( m_toolManager )
1103 {
1105 // prevent the canvas from trying to dispatch events during close
1106 GetCanvas()->SetEventDispatcher( nullptr );
1107 delete m_toolManager;
1108 m_toolManager = nullptr;
1109 }
1110
1111 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
1112
1113 if( hierarchy_pane.IsShown() && hierarchy_pane.IsFloating() )
1114 {
1115 hierarchy_pane.Show( false );
1116 m_auimgr.Update();
1117 }
1118
1119 SCH_SCREENS screens( Schematic().Root() );
1120 wxFileName fn;
1121
1122 for( SCH_SCREEN* screen = screens.GetFirst(); screen != nullptr; screen = screens.GetNext() )
1123 {
1124 fn = Prj().AbsolutePath( screen->GetFileName() );
1125
1126 // Auto save file name is the normal file name prepended with FILEEXT::AutoSaveFilePrefix.
1127 fn.SetName( FILEEXT::AutoSaveFilePrefix + fn.GetName() );
1128
1129 if( fn.IsFileWritable() )
1130 wxRemoveFile( fn.GetFullPath() );
1131 }
1132
1133 wxFileName tmpFn = Prj().GetProjectFullName();
1134 wxFileName autoSaveFileName( tmpFn.GetPath(), getAutoSaveFileName() );
1135
1136 if( autoSaveFileName.IsFileWritable() )
1137 wxRemoveFile( autoSaveFileName.GetFullPath() );
1138
1139 sheetlist.ClearModifyStatus();
1140
1141 wxString fileName = Prj().AbsolutePath( Schematic().RootScreen()->GetFileName() );
1142
1143 if( !Schematic().GetFileName().IsEmpty() && !Schematic().RootScreen()->IsEmpty() )
1144 UpdateFileHistory( fileName );
1145
1146 Schematic().RootScreen()->Clear( true );
1147
1148 // all sub sheets are deleted, only the main sheet is usable
1150
1151 // Clear view before destroying schematic as repaints depend on schematic being valid
1152 SetScreen( nullptr );
1153
1154 Schematic().Reset();
1155
1156 // Prevents any rogue events from continuing (i.e. search panel tries to redraw)
1157 Show( false );
1158
1159 Destroy();
1160}
1161
1162
1164{
1165 return Schematic().ErcSettings().GetSeverity( aErrorCode );
1166}
1167
1168
1170{
1172
1173 if( GetScreen() )
1175
1176 m_autoSaveRequired = true;
1177
1178 if( GetCanvas() )
1179 GetCanvas()->Refresh();
1180
1181 if( !GetTitle().StartsWith( wxS( "*" ) ) )
1182 updateTitle();
1183}
1184
1185
1187{
1188 if( Kiface().IsSingle() )
1189 {
1190 DisplayError( this, _( "Cannot update the PCB, because the Schematic Editor is opened"
1191 " in stand-alone mode. In order to create/update PCBs from"
1192 " schematics, launch the KiCad shell and create a project." ) );
1193 return;
1194 }
1195
1196 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PCB_EDITOR, false );
1197
1198 if( !frame )
1199 {
1200 wxFileName fn = Prj().GetProjectFullName();
1201 fn.SetExt( FILEEXT::PcbFileExtension );
1202
1203 frame = Kiway().Player( FRAME_PCB_EDITOR, true );
1204
1205 // If Kiway() cannot create the Pcbnew frame, it shows a error message, and
1206 // frame is null
1207 if( !frame )
1208 return;
1209
1210 frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
1211 }
1212
1213 if( !frame->IsVisible() )
1214 frame->Show( true );
1215
1216 // On Windows, Raise() does not bring the window on screen, when iconized
1217 if( frame->IsIconized() )
1218 frame->Iconize( false );
1219
1220 frame->Raise();
1221
1222 std::string payload;
1224}
1225
1226
1227void SCH_EDIT_FRAME::UpdateHierarchyNavigator( bool aRefreshNetNavigator )
1228{
1229 m_toolManager->GetTool<SCH_NAVIGATE_TOOL>()->CleanHistory();
1231
1232 if( aRefreshNetNavigator )
1234}
1235
1236
1238{
1239 // Update only the hierarchy navigation tree labels.
1240 // The tree list is expectyed to be up to date
1242}
1243
1244
1246{
1248}
1249
1250
1252{
1253 wxString findString;
1254
1255 EE_SELECTION& selection = m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
1256
1257 if( selection.Size() == 1 )
1258 {
1259 EDA_ITEM* front = selection.Front();
1260
1261 switch( front->Type() )
1262 {
1263 case SCH_SYMBOL_T:
1264 {
1265 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( front );
1266 findString = UnescapeString( symbol->GetField( VALUE_FIELD )->GetText() );
1267 break;
1268 }
1269
1270 case SCH_FIELD_T:
1271 findString = UnescapeString( static_cast<SCH_FIELD*>( front )->GetText() );
1272 break;
1273
1274 case SCH_LABEL_T:
1275 case SCH_GLOBAL_LABEL_T:
1276 case SCH_HIER_LABEL_T:
1277 case SCH_SHEET_PIN_T:
1278 findString = UnescapeString( static_cast<SCH_LABEL_BASE*>( front )->GetText() );
1279 break;
1280
1281 case SCH_TEXT_T:
1282 findString = UnescapeString( static_cast<SCH_TEXT*>( front )->GetText() );
1283
1284 if( findString.Contains( wxT( "\n" ) ) )
1285 findString = findString.Before( '\n' );
1286
1287 break;
1288
1289 default:
1290 break;
1291 }
1292 }
1293
1295 m_findReplaceDialog->Destroy();
1296
1298 static_cast<SCH_SEARCH_DATA*>( m_findReplaceData.get() ),
1299 wxDefaultPosition, wxDefaultSize,
1300 aReplace ? wxFR_REPLACEDIALOG : 0 );
1301
1304 m_findReplaceDialog->Show( true );
1305}
1306
1307
1308void SCH_EDIT_FRAME::ShowFindReplaceStatus( const wxString& aMsg, int aStatusTime )
1309{
1310 // Prepare the infobar, since we don't know its state
1313
1314 m_infoBar->ShowMessageFor( aMsg, aStatusTime, wxICON_INFORMATION );
1315}
1316
1317
1319{
1320 m_infoBar->Dismiss();
1321}
1322
1323
1325{
1328
1329 m_findReplaceDialog->Destroy();
1330 m_findReplaceDialog = nullptr;
1331
1333}
1334
1335
1336void SCH_EDIT_FRAME::OnLoadFile( wxCommandEvent& event )
1337{
1338 wxString fn = GetFileFromHistory( event.GetId(), _( "Schematic" ) );
1339
1340 if( fn.size() )
1341 OpenProjectFiles( std::vector<wxString>( 1, fn ) );
1342}
1343
1344
1345void SCH_EDIT_FRAME::OnClearFileHistory( wxCommandEvent& aEvent )
1346{
1348}
1349
1350
1352{
1353 // Only standalone mode can directly load a new document
1354 if( !Kiface().IsSingle() )
1355 return;
1356
1357 wxString pro_dir = m_mruPath;
1358
1359 wxFileDialog dlg( this, _( "New Schematic" ), pro_dir, wxEmptyString,
1361
1362 if( dlg.ShowModal() != wxID_CANCEL )
1363 {
1364 // Enforce the extension, wxFileDialog is inept.
1365 wxFileName create_me =
1367
1368 if( create_me.FileExists() )
1369 {
1370 wxString msg;
1371 msg.Printf( _( "Schematic file '%s' already exists." ), create_me.GetFullName() );
1372 DisplayError( this, msg );
1373 return ;
1374 }
1375
1376 // OpenProjectFiles() requires absolute
1377 wxASSERT_MSG( create_me.IsAbsolute(), wxS( "wxFileDialog returned non-absolute path" ) );
1378
1379 OpenProjectFiles( std::vector<wxString>( 1, create_me.GetFullPath() ), KICTL_CREATE );
1380 m_mruPath = create_me.GetPath();
1381 }
1382}
1383
1384
1386{
1387 // Only standalone mode can directly load a new document
1388 if( !Kiface().IsSingle() )
1389 return;
1390
1391 wxString pro_dir = m_mruPath;
1392 wxString wildcards = FILEEXT::AllSchematicFilesWildcard()
1394 + wxS( "|" ) + FILEEXT::LegacySchematicFileWildcard();
1395
1396 wxFileDialog dlg( this, _( "Open Schematic" ), pro_dir, wxEmptyString,
1397 wildcards, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
1398
1399 if( dlg.ShowModal() != wxID_CANCEL )
1400 {
1401 OpenProjectFiles( std::vector<wxString>( 1, dlg.GetPath() ) );
1403 }
1404}
1405
1406
1408{
1409 wxFileName kicad_board = Prj().AbsolutePath( Schematic().GetFileName() );
1410
1411 if( kicad_board.IsOk() && !Schematic().GetFileName().IsEmpty() )
1412 {
1413 kicad_board.SetExt( FILEEXT::PcbFileExtension );
1414 wxFileName legacy_board( kicad_board );
1415 legacy_board.SetExt( FILEEXT::LegacyPcbFileExtension );
1416 wxFileName& boardfn = legacy_board;
1417
1418 if( !legacy_board.FileExists() || kicad_board.FileExists() )
1419 boardfn = kicad_board;
1420
1421 if( Kiface().IsSingle() )
1422 {
1423 ExecuteFile( PCBNEW_EXE, boardfn.GetFullPath() );
1424 }
1425 else
1426 {
1427 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PCB_EDITOR, false );
1428
1429 if( !frame )
1430 {
1431 frame = Kiway().Player( FRAME_PCB_EDITOR, true );
1432
1433 // frame can be null if Cvpcb cannot be run. No need to show a warning
1434 // Kiway() generates the error messages
1435 if( !frame )
1436 return;
1437
1438 frame->OpenProjectFiles( std::vector<wxString>( 1, boardfn.GetFullPath() ) );
1439 }
1440
1441 if( !frame->IsVisible() )
1442 frame->Show( true );
1443
1444 // On Windows, Raise() does not bring the window on screen, when iconized
1445 if( frame->IsIconized() )
1446 frame->Iconize( false );
1447
1448 frame->Raise();
1449 }
1450 }
1451 else
1452 {
1453 // If we are running inside a project, it should be impossible for this case to happen
1454 wxASSERT( Kiface().IsSingle() );
1456 }
1457}
1458
1459
1461{
1462 wxFileName fn = Prj().AbsolutePath( Schematic().GetFileName() );
1463 fn.SetExt( FILEEXT::NetlistFileExtension );
1464
1465 if( !ReadyToNetlist( _( "Assigning footprints requires a fully annotated schematic." ) ) )
1466 return;
1467
1468 try
1469 {
1470 KIWAY_PLAYER* player = Kiway().Player( FRAME_CVPCB, false ); // test open already.
1471
1472 if( !player )
1473 {
1474 player = Kiway().Player( FRAME_CVPCB, true );
1475
1476 // player can be null if Cvpcb cannot be run. No need to show a warning
1477 // Kiway() generates the error messages
1478 if( !player )
1479 return;
1480
1481 player->Show( true );
1482 }
1483
1484 // Ensure the netlist (mainly info about symbols) is up to date
1487
1488 player->Raise();
1489 }
1490 catch( const IO_ERROR& )
1491 {
1492 DisplayError( this, _( "Could not open CvPcb" ) );
1493 }
1494}
1495
1496
1497void SCH_EDIT_FRAME::OnExit( wxCommandEvent& event )
1498{
1499 if( event.GetId() == wxID_EXIT )
1500 Kiway().OnKiCadExit();
1501
1502 if( event.GetId() == wxID_CLOSE || Kiface().IsSingle() )
1503 Close( false );
1504}
1505
1506
1508{
1509 wxString fileName = Prj().AbsolutePath( GetScreen()->GetFileName() );
1510 const SCH_RENDER_SETTINGS* cfg = static_cast<const SCH_RENDER_SETTINGS*>( aSettings );
1512
1513 cfg->GetPrintDC()->SetBackground( wxBrush( bg.ToColour() ) );
1514 cfg->GetPrintDC()->Clear();
1515
1516 cfg->GetPrintDC()->SetLogicalFunction( wxCOPY );
1517 GetScreen()->Print( cfg );
1518 PrintDrawingSheet( cfg, GetScreen(), Schematic().GetProperties(), schIUScale.IU_PER_MILS, fileName );
1519}
1520
1521
1523{
1525 SIM_LIB_MGR simLibMgr( &Prj() );
1526 NULL_REPORTER devnull;
1527
1528 // Patch for bug early in V7.99 dev
1529 if( settings.m_OPO_VRange.EndsWith( 'A' ) )
1530 settings.m_OPO_VRange[ settings.m_OPO_VRange.Length() - 1 ] = 'V';
1531
1532 // Update items which may have ${OP} text variables
1533 //
1535 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1536 {
1537 int flags = 0;
1538
1539 auto invalidateTextVars =
1540 [&flags]( EDA_TEXT* text )
1541 {
1542 if( text->HasTextVars() )
1543 {
1544 text->ClearRenderCache();
1545 text->ClearBoundingBoxCache();
1547 }
1548 };
1549
1550 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
1551 {
1552 item->RunOnChildren(
1553 [&invalidateTextVars]( SCH_ITEM* aChild )
1554 {
1555 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
1556 invalidateTextVars( text );
1557 } );
1558 }
1559
1560 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1561 invalidateTextVars( text );
1562
1563 return flags;
1564 } );
1565
1566 // Update OP overlay items
1567 //
1568 for( SCH_ITEM* item : GetScreen()->Items() )
1569 {
1571 continue;
1572
1573 if( item->Type() == SCH_LINE_T )
1574 {
1575 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1576
1577 if( !line->GetOperatingPoint().IsEmpty() )
1578 GetCanvas()->GetView()->Update( line );
1579
1580 line->SetOperatingPoint( wxEmptyString );
1581 // update value from netlist, below
1582 }
1583 else if( item->Type() == SCH_SYMBOL_T )
1584 {
1585 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1586 wxString ref = symbol->GetRef( &GetCurrentSheet() );
1587 std::vector<SCH_PIN*> pins = symbol->GetPins( &GetCurrentSheet() );
1588
1589 // Power symbols and other symbols which have the reference starting with "#" are
1590 // not included in simulation
1591 if( ref.StartsWith( '#' ) || symbol->GetExcludedFromSim() )
1592 continue;
1593
1594 for( SCH_PIN* pin : pins )
1595 {
1596 if( !pin->GetOperatingPoint().IsEmpty() )
1597 GetCanvas()->GetView()->Update( pin );
1598
1599 pin->SetOperatingPoint( wxEmptyString );
1600 }
1601
1602 if( pins.size() == 2 )
1603 {
1604 wxString op = m_schematic->GetOperatingPoint( ref, settings.m_OPO_IPrecision,
1605 settings.m_OPO_IRange );
1606
1607 if( !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1608 {
1609 pins[0]->SetOperatingPoint( op );
1610 GetCanvas()->GetView()->Update( symbol );
1611 }
1612 }
1613 else
1614 {
1615 SIM_MODEL& model = simLibMgr.CreateModel( &GetCurrentSheet(), *symbol,
1616 devnull ).model;
1617
1618 SPICE_ITEM spiceItem;
1619 spiceItem.refName = ref;
1620 ref = model.SpiceGenerator().ItemName( spiceItem );
1621
1622 for( const auto& modelPin : model.GetPins() )
1623 {
1624 SCH_PIN* symbolPin = symbol->GetPin( modelPin.get().symbolPinNumber );
1625 wxString signalName = ref + wxS( ":" ) + modelPin.get().modelPinName;
1626 wxString op = m_schematic->GetOperatingPoint( signalName,
1627 settings.m_OPO_IPrecision,
1628 settings.m_OPO_IRange );
1629
1630 if( symbolPin && !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1631 {
1632 symbolPin->SetOperatingPoint( op );
1633 GetCanvas()->GetView()->Update( symbol );
1634 }
1635 }
1636 }
1637 }
1638 }
1639
1640 for( const auto& [ key, subgraphList ] : m_schematic->m_connectionGraph->GetNetMap() )
1641 {
1642 wxString op = m_schematic->GetOperatingPoint( key.Name, settings.m_OPO_VPrecision,
1643 settings.m_OPO_VRange );
1644
1645 if( !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1646 {
1647 for( CONNECTION_SUBGRAPH* subgraph : subgraphList )
1648 {
1649 SCH_LINE* longestWire = nullptr;
1650 double length = 0.0;
1651
1652 if( subgraph->GetSheet().GetExcludedFromSim() )
1653 continue;
1654
1655 for( SCH_ITEM* item : subgraph->GetItems() )
1656 {
1657 if( item->Type() == SCH_LINE_T )
1658 {
1659 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1660
1661 if( line->IsWire() && line->GetLength() > length )
1662 {
1663 longestWire = line;
1664 length = line->GetLength();
1665 }
1666 }
1667 }
1668
1669 if( longestWire )
1670 {
1671 longestWire->SetOperatingPoint( op );
1672 GetCanvas()->GetView()->Update( longestWire );
1673 }
1674 }
1675 }
1676 }
1677}
1678
1679
1681{
1682 if( aItem->Type() == SCH_GLOBAL_LABEL_T || aItem->Type() == SCH_HIER_LABEL_T )
1683 {
1684 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( aItem );
1685
1686 if( label->AutoRotateOnPlacement() )
1687 {
1688 SPIN_STYLE spin = aScreen->GetLabelOrientationForPoint( label->GetPosition(),
1689 label->GetSpinStyle(),
1690 &GetCurrentSheet() );
1691
1692 if( spin != label->GetSpinStyle() )
1693 {
1694 label->SetSpinStyle( spin );
1695
1696 for( SCH_ITEM* item : aScreen->Items().OfType( SCH_GLOBAL_LABEL_T ) )
1697 {
1698 SCH_LABEL_BASE* otherLabel = static_cast<SCH_LABEL_BASE*>( item );
1699
1700 if( otherLabel != label && otherLabel->GetText() == label->GetText() )
1701 otherLabel->AutoplaceFields( aScreen, false );
1702 }
1703 }
1704 }
1705 }
1706}
1707
1708
1710{
1711 SCH_SCREEN* screen = GetScreen();
1712
1713 wxCHECK( screen, /* void */ );
1714
1715 wxString title;
1716
1717 if( !screen->GetFileName().IsEmpty() )
1718 {
1719 wxFileName fn( Prj().AbsolutePath( screen->GetFileName() ) );
1720 bool readOnly = false;
1721 bool unsaved = false;
1722
1723 if( fn.IsOk() && screen->FileExists() )
1724 readOnly = screen->IsReadOnly();
1725 else
1726 unsaved = true;
1727
1728 if( IsContentModified() )
1729 title = wxT( "*" );
1730
1731 title += fn.GetName();
1732
1733 wxString sheetPath = GetCurrentSheet().PathHumanReadable( false, true );
1734
1735 if( sheetPath != title )
1736 title += wxString::Format( wxT( " [%s]" ), sheetPath );
1737
1738 if( readOnly )
1739 title += wxS( " " ) + _( "[Read Only]" );
1740
1741 if( unsaved )
1742 title += wxS( " " ) + _( "[Unsaved]" );
1743 }
1744 else
1745 {
1746 title = _( "[no schematic loaded]" );
1747 }
1748
1749 title += wxT( " \u2014 " ) + _( "Schematic Editor" );
1750
1751 SetTitle( title );
1752}
1753
1754
1756{
1758 GetScreen()->m_zoomInitialized = true;
1759}
1760
1761
1763{
1764 wxString highlightedConn = GetHighlightedConnection();
1765 bool hasHighlightedConn = !highlightedConn.IsEmpty();
1766 SCHEMATIC_SETTINGS& settings = Schematic().Settings();
1768 SCH_COMMIT localCommit( m_toolManager );
1769
1770 if( !aCommit )
1771 aCommit = &localCommit;
1772
1773#ifdef PROFILE
1774 PROF_TIMER timer;
1775#endif
1776
1777 // Ensure schematic graph is accurate
1778 if( aCleanupFlags == LOCAL_CLEANUP )
1779 {
1780 SchematicCleanUp( aCommit, GetScreen() );
1781 }
1782 else if( aCleanupFlags == GLOBAL_CLEANUP )
1783 {
1784 for( const SCH_SHEET_PATH& sheet : list )
1785 SchematicCleanUp( aCommit, sheet.LastScreen() );
1786 }
1787
1788#ifdef PROFILE
1789 timer.Stop();
1790 wxLogTrace( "CONN_PROFILE", "SchematicCleanUp() %0.4f ms", timer.msecs() );
1791#endif
1792
1793 if( settings.m_IntersheetRefsShow )
1795
1796 std::function<void( SCH_ITEM* )> changeHandler =
1797 [&]( SCH_ITEM* aChangedItem ) -> void
1798 {
1799 GetCanvas()->GetView()->Update( aChangedItem, KIGFX::REPAINT );
1800
1801 SCH_CONNECTION* connection = aChangedItem->Connection();
1802
1804 return;
1805
1806 if( !hasHighlightedConn )
1807 {
1808 // No highlighted connection, but connectivity has changed, so refresh
1809 // the list of all nets
1811 }
1812 else if( connection
1813 && ( connection->Name() == highlightedConn
1814 || connection->HasDriverChanged() ) )
1815 {
1817 }
1818 };
1819
1820 if( !ADVANCED_CFG::GetCfg().m_IncrementalConnectivity || aCleanupFlags == GLOBAL_CLEANUP
1821 || m_undoList.m_CommandsList.empty()|| Schematic().ConnectionGraph()->IsMinor() )
1822 {
1823 // Clear all resolved netclass caches in case labels have changed
1824 Prj().GetProjectFile().NetSettings()->ClearAllCaches();
1825
1826 // Update all rule areas so we can cascade implied connectivity changes
1827 std::unordered_set<SCH_SCREEN*> all_screens;
1828
1829 for( const SCH_SHEET_PATH& path : list )
1830 all_screens.insert( path.LastScreen() );
1831
1832 SCH_RULE_AREA::UpdateRuleAreasInScreens( all_screens, GetCanvas()->GetView() );
1833
1834 // Recalculate all connectivity
1835 Schematic().ConnectionGraph()->Recalculate( list, true, &changeHandler );
1836 }
1837 else
1838 {
1839 struct CHANGED_ITEM
1840 {
1841 SCH_ITEM* item;
1842 SCH_ITEM* linked_item;
1843 SCH_SCREEN* screen;
1844 };
1845
1846 PICKED_ITEMS_LIST* changed_list = m_undoList.m_CommandsList.back();
1847
1848 // Final change sets
1849 std::set<SCH_ITEM*> changed_items;
1850 std::set<VECTOR2I> pts;
1851 std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> item_paths;
1852
1853 // Working change sets
1854 std::unordered_set<SCH_SCREEN*> changed_screens;
1855 std::set<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> changed_rule_areas;
1856 std::vector<CHANGED_ITEM> changed_connectable_items;
1857
1858 // Lambda to add an item to the connectivity update sets
1859 auto addItemToChangeSet = [&changed_items, &pts, &item_paths]( CHANGED_ITEM itemData )
1860 {
1861 std::vector<SCH_SHEET_PATH>& paths = itemData.screen->GetClientSheetPaths();
1862
1863 std::vector<VECTOR2I> tmp_pts = itemData.item->GetConnectionPoints();
1864 pts.insert( tmp_pts.begin(), tmp_pts.end() );
1865 changed_items.insert( itemData.item );
1866
1867 for( SCH_SHEET_PATH& path : paths )
1868 item_paths.insert( std::make_pair( path, itemData.item ) );
1869
1870 if( !itemData.linked_item || !itemData.linked_item->IsConnectable() )
1871 return;
1872
1873 tmp_pts = itemData.linked_item->GetConnectionPoints();
1874 pts.insert( tmp_pts.begin(), tmp_pts.end() );
1875 changed_items.insert( itemData.linked_item );
1876
1877 // We have to directly add the pins here because the link may not exist on the schematic
1878 // anymore and so won't be picked up by GetScreen()->Items().Overlapping() below.
1879 if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( itemData.linked_item ) )
1880 {
1881 std::vector<SCH_PIN*> pins = symbol->GetPins();
1882 changed_items.insert( pins.begin(), pins.end() );
1883 }
1884
1885 for( SCH_SHEET_PATH& path : paths )
1886 item_paths.insert( std::make_pair( path, itemData.linked_item ) );
1887 };
1888
1889 // Get all changed connectable items and determine all changed screens
1890 for( unsigned ii = 0; ii < changed_list->GetCount(); ++ii )
1891 {
1892 switch( changed_list->GetPickedItemStatus( ii ) )
1893 {
1894 // Only care about changed, new, and deleted items, the other
1895 // cases are not connectivity-related
1896 case UNDO_REDO::CHANGED:
1897 case UNDO_REDO::NEWITEM:
1898 case UNDO_REDO::DELETED:
1899 break;
1900
1901 default:
1902 continue;
1903 }
1904
1905 SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( changed_list->GetPickedItem( ii ) );
1906
1907 if( item )
1908 {
1909 SCH_SCREEN* screen =
1910 static_cast<SCH_SCREEN*>( changed_list->GetScreenForItem( ii ) );
1911 changed_screens.insert( screen );
1912
1913 if( item->Type() == SCH_RULE_AREA_T )
1914 {
1915 SCH_RULE_AREA* ruleArea = static_cast<SCH_RULE_AREA*>( item );
1916
1917 // Clear item and directive associations for this rule area
1918 ruleArea->ResetDirectivesAndItems( GetCanvas()->GetView() );
1919
1920 changed_rule_areas.insert( { ruleArea, screen } );
1921 }
1922 else if( item->IsConnectable() )
1923 {
1924 SCH_ITEM* linked_item =
1925 dynamic_cast<SCH_ITEM*>( changed_list->GetPickedItemLink( ii ) );
1926 changed_connectable_items.push_back( { item, linked_item, screen } );
1927 }
1928 }
1929 }
1930
1931 // Update rule areas in changed screens to propagate any directive connectivity changes
1932 std::vector<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> forceUpdateRuleAreas =
1933 SCH_RULE_AREA::UpdateRuleAreasInScreens( changed_screens, GetCanvas()->GetView() );
1934
1935 std::for_each( forceUpdateRuleAreas.begin(), forceUpdateRuleAreas.end(),
1936 [&]( std::pair<SCH_RULE_AREA*, SCH_SCREEN*>& updatedRuleArea )
1937 {
1938 changed_rule_areas.insert( updatedRuleArea );
1939 } );
1940
1941 // If a SCH_RULE_AREA was changed, we need to add all past and present contained items to
1942 // update their connectivity
1943 for( const std::pair<SCH_RULE_AREA*, SCH_SCREEN*>& changedRuleArea : changed_rule_areas )
1944 {
1945 for( SCH_ITEM* containedItem :
1946 changedRuleArea.first->GetPastAndPresentContainedItems() )
1947 {
1948 addItemToChangeSet( { containedItem, nullptr, changedRuleArea.second } );
1949 }
1950 }
1951
1952 // Add all changed items, and associated items, to the change set
1953 for( CHANGED_ITEM& changed_item_data : changed_connectable_items )
1954 {
1955 addItemToChangeSet( changed_item_data );
1956
1957 // If a SCH_DIRECTIVE_LABEL was changed which is attached to a SCH_RULE_AREA, we need
1958 // to add the contained items to the change set to force update of their connectivity
1959 if( changed_item_data.item->Type() == SCH_DIRECTIVE_LABEL_T )
1960 {
1961 const std::vector<VECTOR2I> labelConnectionPoints =
1962 changed_item_data.item->GetConnectionPoints();
1963
1964 EE_RTREE::EE_TYPE candidateRuleAreas =
1965 changed_item_data.screen->Items().Overlapping(
1966 SCH_RULE_AREA_T, changed_item_data.item->GetBoundingBox() );
1967
1968 for( SCH_ITEM* candidateRuleArea : candidateRuleAreas )
1969 {
1970 SCH_RULE_AREA* ruleArea = static_cast<SCH_RULE_AREA*>( candidateRuleArea );
1971 std::vector<SHAPE*> borderShapes = ruleArea->MakeEffectiveShapes( true );
1972
1973 if( ruleArea->GetPolyShape().CollideEdge( labelConnectionPoints[0], nullptr,
1974 5 ) )
1975 {
1976 for( SCH_ITEM* containedItem : ruleArea->GetPastAndPresentContainedItems() )
1977 addItemToChangeSet(
1978 { containedItem, nullptr, changed_item_data.screen } );
1979 }
1980 }
1981 }
1982 }
1983
1984 for( const VECTOR2I& pt: pts )
1985 {
1986 for( SCH_ITEM* item : GetScreen()->Items().Overlapping( pt ) )
1987 {
1988 // Leave this check in place. Overlapping items are not necessarily connectable.
1989 if( !item->IsConnectable() )
1990 continue;
1991
1992 if( item->Type() == SCH_LINE_T )
1993 {
1994 if( item->HitTest( pt ) )
1995 changed_items.insert( item );
1996 }
1997 else if( item->Type() == SCH_SYMBOL_T && item->IsConnected( pt ) )
1998 {
1999 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
2000 std::vector<SCH_PIN*> pins = symbol->GetPins();
2001
2002 changed_items.insert( pins.begin(), pins.end() );
2003 }
2004 else if( item->Type() == SCH_SHEET_T )
2005 {
2006 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
2007
2008 wxCHECK2( sheet, continue );
2009
2010 std::vector<SCH_SHEET_PIN*> sheetPins = sheet->GetPins();
2011 changed_items.insert( sheetPins.begin(), sheetPins.end() );
2012 }
2013 else
2014 {
2015 if( item->IsConnected( pt ) )
2016 changed_items.insert( item );
2017 }
2018 }
2019 }
2020
2021 std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> all_items =
2022 Schematic().ConnectionGraph()->ExtractAffectedItems( changed_items );
2023
2024 all_items.insert( item_paths.begin(), item_paths.end() );
2025
2026 CONNECTION_GRAPH new_graph( &Schematic() );
2027
2028 new_graph.SetLastCodes( Schematic().ConnectionGraph() );
2029
2030 std::shared_ptr<NET_SETTINGS> netSettings = Prj().GetProjectFile().NetSettings();
2031
2032 std::set<wxString> affectedNets;
2033
2034 for( auto&[ path, item ] : all_items )
2035 {
2036 wxCHECK2( item, continue );
2037 item->SetConnectivityDirty();
2038 SCH_CONNECTION* conn = item->Connection();
2039
2040 if( conn )
2041 {
2042 affectedNets.insert( conn->Name() );
2043 }
2044 }
2045
2046 // Reset resolved netclass cache for this connection
2047 for( const wxString& netName : affectedNets )
2048 netSettings->ClearCacheForNet( netName );
2049
2050 new_graph.Recalculate( list, false, &changeHandler );
2051 Schematic().ConnectionGraph()->Merge( new_graph );
2052 }
2053
2055 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
2056 {
2057 int flags = 0;
2058 SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem );
2059 SCH_CONNECTION* connection = item ? item->Connection() : nullptr;
2060
2061 auto invalidateTextVars =
2062 [&flags]( EDA_TEXT* text )
2063 {
2064 if( text->HasTextVars() )
2065 {
2066 text->ClearRenderCache();
2067 text->ClearBoundingBoxCache();
2069 }
2070 };
2071
2072 if( connection && connection->HasDriverChanged() )
2073 {
2074 connection->ClearDriverChanged();
2075 flags |= KIGFX::REPAINT;
2076 }
2077
2078 if( item )
2079 {
2080 item->RunOnChildren(
2081 [&invalidateTextVars]( SCH_ITEM* aChild )
2082 {
2083 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
2084 invalidateTextVars( text );
2085 } );
2086
2087 if( flags & KIGFX::GEOMETRY )
2088 GetScreen()->Update( item, false ); // Refresh RTree
2089 }
2090
2091 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
2092 invalidateTextVars( text );
2093
2094 return flags;
2095 } );
2096
2098 || !Schematic().ConnectionGraph()->FindFirstSubgraphByName( highlightedConn ) )
2099 {
2103 }
2104
2105 if( !localCommit.Empty() )
2106 localCommit.Push( _( "Schematic Cleanup" ) );
2107}
2108
2109
2111{
2113 {
2114 for( SCH_FIELD& field : label->GetFields() )
2115 field.ClearBoundingBoxCache();
2116
2117 label->ClearBoundingBoxCache();
2118 GetCanvas()->GetView()->Update( label );
2119 } );
2120}
2121
2122
2124{
2126
2128}
2129
2130
2131std::unique_ptr<GRID_HELPER> SCH_EDIT_FRAME::MakeGridHelper()
2132{
2133 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
2134}
2135
2136
2137void SCH_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
2138{
2139 SCH_BASE_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
2140
2141 SCHEMATIC_SETTINGS& settings = Schematic().Settings();
2142
2144
2146
2150
2151 KIGFX::VIEW* view = GetCanvas()->GetView();
2157
2159
2160 settings.m_TemplateFieldNames.DeleteAllFieldNameTemplates( true /* global */ );
2161
2162 if( !cfg->m_Drawing.field_names.IsEmpty() )
2164
2166
2167 for( SCH_ITEM* item : screen->Items() )
2168 item->ClearCaches();
2169
2170 for( const auto& [ libItemName, libSymbol ] : screen->GetLibSymbols() )
2171 libSymbol->ClearCaches();
2172
2174
2176 Layout();
2177 SendSizeEvent();
2178}
2179
2180
2182{
2183 // Store the current zoom level into the current screen before calling
2184 // DisplayCurrentSheet() that set the zoom to GetScreen()->m_LastZoomLevel
2186
2187 // Rebuild the sheet view (draw area and any other items):
2189}
2190
2191
2193{
2194 // call my base class
2196
2197 // tooltips in toolbars
2199
2200 m_auimgr.GetPane( m_hierarchy ).Caption( _( "Schematic Hierarchy" ) );
2201 m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
2202 m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
2203 m_auimgr.Update();
2205
2206 // status bar
2208
2209 updateTitle();
2210
2211 // This ugly hack is to fix an option(left) toolbar update bug that seems to only affect
2212 // windows. See https://bugs.launchpad.net/kicad/+bug/1816492. For some reason, calling
2213 // wxWindow::Refresh() does not resolve the issue. Only a resize event seems to force the
2214 // toolbar to update correctly.
2215#if defined( __WXMSW__ )
2216 PostSizeEvent();
2217#endif
2218}
2219
2220
2222{
2223 if( !GetHighlightedConnection().IsEmpty() )
2224 {
2225 SetStatusText( wxString::Format( _( "Highlighted net: %s" ),
2227 }
2228 else
2229 {
2230 SetStatusText( wxT( "" ) );
2231 }
2232}
2233
2234
2236{
2237 if( m_toolManager )
2239
2240 SCH_BASE_FRAME::SetScreen( aScreen );
2241 GetCanvas()->DisplaySheet( static_cast<SCH_SCREEN*>( aScreen ) );
2242
2243 if( m_toolManager )
2245}
2246
2247
2248const BOX2I SCH_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
2249{
2250 BOX2I bBoxDoc;
2251
2252 if( aIncludeAllVisible )
2253 {
2254 // Get the whole page size and return that
2257 bBoxDoc = BOX2I( VECTOR2I( 0, 0 ), VECTOR2I( sizeX, sizeY ) );
2258 }
2259 else
2260 {
2261 // Get current drawing-sheet in a form we can compare to an EDA_ITEM
2263 EDA_ITEM* dsAsItem = static_cast<EDA_ITEM*>( ds );
2264
2265 // Calc the bounding box of all items on screen except the page border
2266 for( EDA_ITEM* item : GetScreen()->Items() )
2267 {
2268 if( item != dsAsItem ) // Ignore the drawing-sheet itself
2269 bBoxDoc.Merge( item->GetBoundingBox() );
2270 }
2271 }
2272
2273 return bBoxDoc;
2274}
2275
2276
2278{
2279 return Schematic().Hierarchy().IsModified();
2280}
2281
2282
2284{
2285 EESCHEMA_SETTINGS* cfg = eeconfig();
2286 return cfg && cfg->m_Appearance.show_hidden_pins;
2287}
2288
2289
2291{
2292 static KIID lastBrightenedItemID( niluuid );
2293
2295 SCH_ITEM* lastItem = Schematic().GetItem( lastBrightenedItemID, &dummy );
2296
2297 if( lastItem && lastItem != aItem )
2298 {
2299 lastItem->ClearBrightened();
2300
2301 UpdateItem( lastItem );
2302 lastBrightenedItemID = niluuid;
2303 }
2304
2305 if( aItem )
2306 {
2307 if( !aItem->IsBrightened() )
2308 {
2309 aItem->SetBrightened();
2310
2311 UpdateItem( aItem );
2312 lastBrightenedItemID = aItem->m_Uuid;
2313 }
2314
2316 }
2317}
2318
2319
2321{
2322 return Schematic().GetFileName();
2323}
2324
2325
2327{
2328 return m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
2329}
2330
2331
2332void SCH_EDIT_FRAME::onSize( wxSizeEvent& aEvent )
2333{
2334 if( IsShown() )
2335 {
2336 // We only need this until the frame is done resizing and the final client size is
2337 // established.
2338 Unbind( wxEVT_SIZE, &SCH_EDIT_FRAME::onSize, this );
2340 }
2341
2342 // Skip() is called in the base class.
2343 EDA_DRAW_FRAME::OnSize( aEvent );
2344}
2345
2346
2348 const KIID& aSchematicSymbolUUID )
2349{
2350 SCH_SHEET_PATH principalPath;
2351 SCH_SHEET_LIST sheets = Schematic().Hierarchy();
2352 SCH_ITEM* item = sheets.GetItem( aSchematicSymbolUUID, &principalPath );
2353 SCH_SYMBOL* principalSymbol = dynamic_cast<SCH_SYMBOL*>( item );
2354 SCH_COMMIT commit( m_toolManager );
2355
2356 if( !principalSymbol )
2357 return;
2358
2359 wxString principalRef;
2360
2361 if( principalSymbol->IsAnnotated( &principalPath ) )
2362 principalRef = principalSymbol->GetRef( &principalPath, false );
2363
2364 std::vector< std::pair<SCH_SYMBOL*, SCH_SHEET_PATH> > allUnits;
2365
2366 for( const SCH_SHEET_PATH& path : sheets )
2367 {
2368 for( SCH_ITEM* candidate : path.LastScreen()->Items().OfType( SCH_SYMBOL_T ) )
2369 {
2370 SCH_SYMBOL* candidateSymbol = static_cast<SCH_SYMBOL*>( candidate );
2371
2372 if( candidateSymbol == principalSymbol
2373 || ( candidateSymbol->IsAnnotated( &path )
2374 && candidateSymbol->GetRef( &path, false ) == principalRef ) )
2375 {
2376 allUnits.emplace_back( candidateSymbol, path );
2377 }
2378 }
2379 }
2380
2381 for( auto& [ unit, path ] : allUnits )
2382 {
2383 // This needs to be done before the LIB_SYMBOL is changed to prevent stale
2384 // library symbols in the schematic file.
2385 path.LastScreen()->Remove( unit );
2386
2387 if( !unit->IsNew() )
2388 commit.Modify( unit, path.LastScreen() );
2389
2390 unit->SetLibSymbol( aSymbol.Flatten().release() );
2391 unit->UpdateFields( &GetCurrentSheet(),
2392 true, /* update style */
2393 true, /* update ref */
2394 true, /* update other fields */
2395 false, /* reset ref */
2396 false /* reset other fields */ );
2397
2398 path.LastScreen()->Append( unit );
2399 GetCanvas()->GetView()->Update( unit );
2400 }
2401
2402 if( !commit.Empty() )
2403 commit.Push( _( "Save Symbol to Schematic" ) );
2404}
2405
2406
2407void SCH_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
2408{
2409 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
2410
2411 if( SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( aItem ) )
2412 sch_item->ClearCaches();
2413}
2414
2415
2417{
2418 wxCHECK( m_toolManager, /* void */ );
2419
2423
2424 wxCHECK( screen, /* void */ );
2425
2427
2428 SCH_BASE_FRAME::SetScreen( screen );
2429
2430 SetSheetNumberAndCount(); // will also update CurrentScreen()'s sheet number info
2431
2433
2434 // update the references, units, and intersheet-refs
2436
2437 // dangling state can also have changed if different units with different pin locations are
2438 // used
2441
2443
2444 wxCHECK( selectionTool, /* void */ );
2445
2446 auto visit =
2447 [&]( EDA_ITEM* item )
2448 {
2450 && !m_findReplaceData->findString.IsEmpty()
2451 && item->Matches( *m_findReplaceData, &GetCurrentSheet() ) )
2452 {
2453 item->SetForceVisible( true );
2454 selectionTool->BrightenItem( item );
2455 }
2456 else if( item->IsBrightened() )
2457 {
2458 item->SetForceVisible( false );
2459 selectionTool->UnbrightenItem( item );
2460 }
2461 };
2462
2463 for( SCH_ITEM* item : screen->Items() )
2464 {
2465 visit( item );
2466
2467 item->RunOnChildren(
2468 [&]( SCH_ITEM* aChild )
2469 {
2470 visit( aChild );
2471 } );
2472 }
2473
2474 if( !screen->m_zoomInitialized )
2475 {
2477 }
2478 else
2479 {
2480 // Set zoom to last used in this screen
2481 GetCanvas()->GetView()->SetScale( GetScreen()->m_LastZoomLevel );
2482 GetCanvas()->GetView()->SetCenter( GetScreen()->m_ScrollCenter );
2483 }
2484
2485 updateTitle();
2486
2487 HardRedraw(); // Ensure all items are redrawn (especially the drawing-sheet items)
2488
2489 // Allow tools to re-add their VIEW_ITEMs after the last call to Clear in HardRedraw
2491
2493
2494 wxCHECK( editTool, /* void */ );
2495
2497 editTool->UpdateNetHighlighting( dummy );
2498
2500
2502}
2503
2504
2506{
2507 if( !m_diffSymbolDialog )
2509 _( "Compare Symbol with Library" ) );
2510
2511 return m_diffSymbolDialog;
2512}
2513
2514
2515void SCH_EDIT_FRAME::onCloseSymbolDiffDialog( wxCommandEvent& aEvent )
2516{
2517 if( m_diffSymbolDialog && aEvent.GetString() == DIFF_SYMBOLS_DIALOG_NAME )
2518 {
2519 m_diffSymbolDialog->Destroy();
2520 m_diffSymbolDialog = nullptr;
2521 }
2522}
2523
2524
2526{
2527 if( !m_ercDialog )
2528 m_ercDialog = new DIALOG_ERC( this );
2529
2530 return m_ercDialog;
2531}
2532
2533
2534void SCH_EDIT_FRAME::onCloseErcDialog( wxCommandEvent& aEvent )
2535{
2536 if( m_ercDialog )
2537 {
2538 m_ercDialog->Destroy();
2539 m_ercDialog = nullptr;
2540 }
2541}
2542
2543
2545{
2548
2550}
2551
2552
2554{
2556 {
2557 m_symbolFieldsTableDialog->Destroy();
2558 m_symbolFieldsTableDialog = nullptr;
2559 }
2560}
2561
2562
2563void SCH_EDIT_FRAME::AddSchematicChangeListener( wxEvtHandler* aListener )
2564{
2565 auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(),
2566 aListener );
2567
2568 // Don't add duplicate listeners.
2569 if( it == m_schematicChangeListeners.end() )
2570 m_schematicChangeListeners.push_back( aListener );
2571}
2572
2573
2575{
2576 auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(),
2577 aListener );
2578
2579 // Don't add duplicate listeners.
2580 if( it != m_schematicChangeListeners.end() )
2581 m_schematicChangeListeners.erase( it );
2582}
2583
2584
2586{
2587 m_netNavigator = new wxTreeCtrl( this, wxID_ANY, wxPoint( 0, 0 ),
2588 FromDIP( wxSize( 160, 250 ) ),
2589 wxTR_DEFAULT_STYLE | wxNO_BORDER );
2590
2591 return m_netNavigator;
2592}
2593
2594
2595void SCH_EDIT_FRAME::SetHighlightedConnection( const wxString& aConnection,
2596 const NET_NAVIGATOR_ITEM_DATA* aSelection )
2597{
2598 bool refreshNetNavigator = aConnection != m_highlightedConn;
2599
2600 m_highlightedConn = aConnection;
2601
2602 if( refreshNetNavigator )
2603 RefreshNetNavigator( aSelection );
2604}
2605
2606
2608{
2609 if( m_netNavigator )
2610 {
2611 NET_NAVIGATOR_ITEM_DATA itemData;
2612 wxTreeItemId selection = m_netNavigator->GetSelection();
2613 bool refreshSelection = selection.IsOk() && ( selection != m_netNavigator->GetRootItem() );
2614
2615 if( refreshSelection )
2616 {
2618 dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( selection ) );
2619
2620 wxCHECK( tmp, /* void */ );
2621 itemData = *tmp;
2622 }
2623
2624 m_netNavigator->DeleteAllItems();
2625 RefreshNetNavigator( refreshSelection ? &itemData : nullptr );
2626 }
2627
2629}
2630
2631
2633{
2634 wxAuiPaneInfo& hierarchyPane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
2635 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
2636 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
2637 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
2638
2639 // Don't give the selection filter its own visibility controls; instead show it if
2640 // anything else is visible
2641 bool showFilter = ( hierarchyPane.IsShown() && hierarchyPane.IsDocked() )
2642 || ( netNavigatorPane.IsShown() && netNavigatorPane.IsDocked() )
2643 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
2644
2645 selectionFilterPane.Show( showFilter );
2646}
2647
2648#ifdef KICAD_IPC_API
2649void SCH_EDIT_FRAME::onPluginAvailabilityChanged( wxCommandEvent& aEvt )
2650{
2651 wxLogTrace( traceApi, "SCH frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" );
2653 aEvt.Skip();
2654}
2655#endif
const KICOMMON_API wxEventTypeTag< wxCommandEvent > EDA_EVT_PLUGIN_AVAILABILITY_CHANGED
Notifies other parts of KiCad when plugin availability changes.
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:110
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:104
@ icon_eeschema
@ icon_eeschema_16
@ icon_eeschema_32
BOX2< VECTOR2I > BOX2I
Definition: box2.h:922
static TOOL_ACTION toggleGrid
Definition: actions.h:178
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION cancelInteractive
Definition: actions.h:65
static TOOL_ACTION millimetersUnits
Definition: actions.h:186
static TOOL_ACTION unselectAll
Definition: actions.h:76
static TOOL_ACTION copy
Definition: actions.h:71
static TOOL_ACTION updateFind
Definition: actions.h:109
static TOOL_ACTION pasteSpecial
Definition: actions.h:74
static TOOL_ACTION milsUnits
Definition: actions.h:185
static TOOL_ACTION toggleBoundingBoxes
Definition: actions.h:138
static TOOL_ACTION showSearch
Definition: actions.h:101
static TOOL_ACTION undo
Definition: actions.h:68
static TOOL_ACTION duplicate
Definition: actions.h:77
static TOOL_ACTION inchesUnits
Definition: actions.h:184
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:135
static TOOL_ACTION doDelete
Definition: actions.h:78
static TOOL_ACTION selectionTool
Definition: actions.h:193
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION zoomFitScreen
Definition: actions.h:127
static TOOL_ACTION redo
Definition: actions.h:69
static TOOL_ACTION deleteTool
Definition: actions.h:79
static TOOL_ACTION zoomTool
Definition: actions.h:130
static TOOL_ACTION showProperties
Definition: actions.h:207
static TOOL_ACTION cut
Definition: actions.h:70
static TOOL_ACTION copyAsText
Definition: actions.h:72
static TOOL_ACTION toggleGridOverrides
Definition: actions.h:179
static TOOL_ACTION selectAll
Definition: actions.h:75
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
WINDOW_SETTINGS m_Window
Definition: app_settings.h:172
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:41
void SetPageNumber(const wxString &aPageNumber)
Definition: base_screen.h:79
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition: box2.h:658
COLOR4D GetColor(int aLayer) const
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
Definition: commit.h:105
bool Empty() const
Returns status of an item.
Definition: commit.h:144
Handle actions that are shared between different applications.
Handles action that are shared between different applications.
Definition: common_tools.h:38
Calculate the connectivity of a schematic and generates netlists.
const NET_MAP & GetNetMap() const
CONNECTION_SUBGRAPH * FindFirstSubgraphByName(const wxString &aNetName)
Retrieve a subgraph for the given net name, if one exists.
std::set< std::pair< SCH_SHEET_PATH, SCH_ITEM * > > ExtractAffectedItems(const std::set< SCH_ITEM * > &aItems)
For a set of items, this will remove the connected items and their associated data including subgraph...
void SetLastCodes(const CONNECTION_GRAPH *aOther)
void Merge(CONNECTION_GRAPH &aGraph)
Combine the input graph contents into the current graph.
void Recalculate(const SCH_SHEET_LIST &aSheetList, bool aUnconditional=false, std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr)
Update the connection graph for the given list of sheets.
A subgraph is a set of items that are electrically connected on a single sheet.
wxArrayString GetFindEntries() const
wxArrayString GetReplaceEntries() const
void SetReplaceEntries(const wxArrayString &aEntries)
void SetFindEntries(const wxArrayString &aEntries, const wxString &aFindString)
bool Show(bool show) override
virtual APP_SETTINGS_BASE * config() const
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
UNDO_REDO_CONTAINER m_undoList
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
SETTINGS_MANAGER * GetSettingsManager() const
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
WX_INFOBAR * m_infoBar
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
wxAuiManager m_auimgr
void ClearFileHistory(FILE_HISTORY *aFileHistory=nullptr)
Removes all files from the file history.
virtual void OnSize(wxSizeEvent &aEvent)
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handles event fired when a file is dropped to the window.
wxString GetFileFromHistory(int cmdId, const wxString &type, FILE_HISTORY *aFileHistory=nullptr)
Fetches the file name from the file history list.
virtual int GetUndoCommandCount() const
wxString m_mruPath
wxArrayString m_replaceStringHistoryList
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
virtual void OnSize(wxSizeEvent &event) override
Recalculate the size of toolbars and display panel when the frame size changes.
GAL_DISPLAY_OPTIONS_IMPL & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
static const wxString PropertiesPaneName()
void FocusOnLocation(const VECTOR2I &aPos)
Useful to focus on a particular location, in find functions.
virtual void SetScreen(BASE_SCREEN *aScreen)
void RecreateToolbars()
Rebuild all toolbars, and update the checked state of check tools.
virtual void UpdateMsgPanel()
Redraw the message panel.
void PrintDrawingSheet(const RENDER_SETTINGS *aSettings, BASE_SCREEN *aScreen, const std::map< wxString, wxString > *aProperties, double aMils2Iu, const wxString &aFilename, const wxString &aSheetLayer=wxEmptyString)
Prints the drawing-sheet (frame and title block).
wxArrayString m_findStringHistoryList
static const wxString DesignBlocksPaneName()
std::unique_ptr< EDA_SEARCH_DATA > m_findReplaceData
PROPERTIES_PANEL * m_propertiesPanel
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:89
virtual const VECTOR2I GetFocusPosition() const
Similar to GetPosition, but allows items to return their visual center rather than their anchor.
Definition: eda_item.h:250
const KIID m_Uuid
Definition: eda_item.h:489
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
void ClearBrightened()
Definition: eda_item.h:123
void SetBrightened()
Definition: eda_item.h:120
bool IsBrightened() const
Definition: eda_item.h:112
Specialization of the wxAuiPaneInfo class for KiCad panels.
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:279
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:79
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:94
virtual void ClearBoundingBoxCache()
Definition: eda_text.cpp:535
SELECTION_CONDITION NoActiveTool()
Create a functor testing if there are no tools active in the frame.
SELECTION_CONDITION BoundingBoxes()
SELECTION_CONDITION RedoAvailable()
Create a functor that tests if there are any items in the redo queue.
SELECTION_CONDITION CurrentTool(const TOOL_ACTION &aTool)
Create a functor testing if the specified tool is the current active tool in the frame.
SELECTION_CONDITION ScriptingConsoleVisible()
Create a functor testing if the python scripting console window is visible.
SELECTION_CONDITION Units(EDA_UNITS aUnit)
Create a functor that tests if the frame has the specified units.
SELECTION_CONDITION GridVisible()
Create a functor testing if the grid is visible in a frame.
SELECTION_CONDITION GridOverrides()
Create a functor testing if the grid overrides wires is enabled in a frame.
SELECTION_CONDITION FullscreenCursor()
Create a functor testing if the cursor is full screen in a frame.
PANEL_ANNOTATE m_AnnotatePanel
Gather all the actions that are shared by tools.
Definition: ee_actions.h:38
static TOOL_ACTION drawSheetFromFile
Definition: ee_actions.h:92
static TOOL_ACTION mirrorV
Definition: ee_actions.h:130
static TOOL_ACTION drawSheetFromDesignBlock
Definition: ee_actions.h:93
static TOOL_ACTION remapSymbols
Definition: ee_actions.h:174
static TOOL_ACTION selectionActivate
Activation of the selection tool.
Definition: ee_actions.h:45
static TOOL_ACTION toggleAnnotateAuto
Definition: ee_actions.h:282
static TOOL_ACTION placeDesignBlock
Definition: ee_actions.h:80
static TOOL_ACTION lineMode90
Definition: ee_actions.h:277
static TOOL_ACTION toggleHiddenPins
Definition: ee_actions.h:245
static TOOL_ACTION drawTable
Definition: ee_actions.h:102
static TOOL_ACTION placeSymbol
Definition: ee_actions.h:78
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:55
static TOOL_ACTION showPythonConsole
Definition: ee_actions.h:270
static TOOL_ACTION toggleERCWarnings
Definition: ee_actions.h:250
static TOOL_ACTION drawRuleArea
Definition: ee_actions.h:111
static TOOL_ACTION toggleERCExclusions
Definition: ee_actions.h:252
static TOOL_ACTION placeClassLabel
Definition: ee_actions.h:88
static TOOL_ACTION drawWire
Definition: ee_actions.h:81
static TOOL_ACTION drawCircle
Definition: ee_actions.h:104
static TOOL_ACTION rotateCCW
Definition: ee_actions.h:129
static TOOL_ACTION lineModeFree
Definition: ee_actions.h:276
static TOOL_ACTION drawBus
Definition: ee_actions.h:82
static TOOL_ACTION toggleERCErrors
Definition: ee_actions.h:251
static TOOL_ACTION placePower
Definition: ee_actions.h:79
static TOOL_ACTION placeSheetPin
Definition: ee_actions.h:94
static TOOL_ACTION drawLines
Definition: ee_actions.h:107
static TOOL_ACTION toggleOPCurrents
Definition: ee_actions.h:255
static TOOL_ACTION mirrorH
Definition: ee_actions.h:131
static TOOL_ACTION highlightNetTool
Definition: ee_actions.h:309
static TOOL_ACTION updateNetHighlighting
Definition: ee_actions.h:308
static TOOL_ACTION syncSheetPins
Definition: ee_actions.h:97
static TOOL_ACTION rotateCW
Definition: ee_actions.h:128
static TOOL_ACTION togglePinAltIcons
Definition: ee_actions.h:256
static TOOL_ACTION leaveSheet
Definition: ee_actions.h:231
static TOOL_ACTION toggleHiddenFields
Definition: ee_actions.h:246
static TOOL_ACTION placeGlobalLabel
Definition: ee_actions.h:89
static TOOL_ACTION ddAppendFile
Definition: ee_actions.h:313
static TOOL_ACTION placeHierLabel
Definition: ee_actions.h:90
static TOOL_ACTION drawTextBox
Definition: ee_actions.h:101
static TOOL_ACTION showNetNavigator
Definition: ee_actions.h:310
static TOOL_ACTION drawRectangle
Definition: ee_actions.h:103
static TOOL_ACTION placeImage
Definition: ee_actions.h:108
static TOOL_ACTION toggleDirectiveLabels
Definition: ee_actions.h:249
static TOOL_ACTION showHierarchy
Definition: ee_actions.h:237
static TOOL_ACTION placeSchematicText
Definition: ee_actions.h:100
static TOOL_ACTION toggleOPVoltages
Definition: ee_actions.h:254
static TOOL_ACTION showDesignBlockPanel
Definition: ee_actions.h:204
static TOOL_ACTION drawArc
Definition: ee_actions.h:105
static TOOL_ACTION lineMode45
Definition: ee_actions.h:278
static TOOL_ACTION drawSheet
Definition: ee_actions.h:91
static TOOL_ACTION drawBezier
Definition: ee_actions.h:106
static TOOL_ACTION markSimExclusions
Definition: ee_actions.h:253
static TOOL_ACTION placeLabel
Definition: ee_actions.h:87
static TOOL_ACTION saveSheetAsDesignBlock
Definition: ee_actions.h:205
static TOOL_ACTION placeBusWireEntry
Definition: ee_actions.h:86
static TOOL_ACTION placeJunction
Definition: ee_actions.h:85
static TOOL_ACTION saveSelectionAsDesignBlock
Definition: ee_actions.h:206
static TOOL_ACTION placeNoConnect
Definition: ee_actions.h:84
Tool that displays edit points allowing to modify items by dragging the points.
bool empty() const
Definition: sch_rtree.h:176
EE_TYPE Overlapping(const BOX2I &aRect) const
Definition: sch_rtree.h:243
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:238
SEVERITY GetSeverity(int aErrorCode) const
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
void UpdateLabelsHierarchyTree()
Update the labels of the hierarchical tree of the schematic.
void UpdateHierarchySelection()
Updates the tree's selection to match current page.
void UpdateHierarchyTree()
Update the hierarchical tree of the schematic.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:77
APP_SETTINGS_BASE * KifaceSettings() const
Definition: kiface_base.h:95
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
wxColour ToColour() const
Definition: color4d.cpp:220
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
void SetDefaultFont(const wxString &aFont)
wxDC * GetPrintDC() const
Contains methods for drawing schematic-specific items.
Definition: sch_painter.h:68
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
Definition: sch_view.h:103
void SetScale(double aScale, VECTOR2D aAnchor={ 0, 0 }) override
Set the scaling factor, zooming around a given anchor point.
Definition: sch_view.cpp:75
An abstract base class for deriving all objects that can be added to a VIEW.
Definition: view_item.h:84
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
double GetScale() const
Definition: view.h:277
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition: view.cpp:1687
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:401
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:221
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
Definition: view.cpp:613
void UpdateAllItemsConditionally(int aUpdateFlags, std::function< bool(VIEW_ITEM *)> aCondition)
Update items in the view according to the given flags and condition.
Definition: view.cpp:1573
Definition: kiid.h:49
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:65
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
virtual bool OpenProjectFiles(const std::vector< wxString > &aFileList, int aCtl=0)
Open a project or set of files given by aFileList.
Definition: kiway_player.h:113
void OnSockRequestServer(wxSocketEvent &evt)
Definition: eda_dde.cpp:99
void OnSockRequest(wxSocketEvent &evt)
Definition: eda_dde.cpp:69
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:284
void OnKiCadExit()
Definition: kiway.cpp:725
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:406
virtual bool PlayerClose(FRAME_T aFrameType, bool doForce)
Call the KIWAY_PLAYER::Close( bool force ) function on the window and if not vetoed,...
Definition: kiway.cpp:470
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
Definition: kiway.cpp:527
Define a library symbol object.
Definition: lib_symbol.h:78
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:304
Tree view item data for the net navigator.
A singleton reporter that reports to nowhere.
Definition: reporter.h:203
int GetHeightIU(double aIUScale) const
Gets the page height in IU.
Definition: page_info.h:162
int GetWidthIU(double aIUScale) const
Gets the page width in IU.
Definition: page_info.h:153
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
A holder to handle information on schematic or board items.
UNDO_REDO GetPickedItemStatus(unsigned int aIdx) const
EDA_ITEM * GetPickedItemLink(unsigned int aIdx) const
unsigned GetCount() const
BASE_SCREEN * GetScreenForItem(unsigned int aIdx) const
EDA_ITEM * GetPickedItem(unsigned int aIdx) const
A small class to help profiling.
Definition: profile.h:49
void Stop()
Save the time when this function was called, and set the counter stane to stop.
Definition: profile.h:88
double msecs(bool aSinceLast=false)
Definition: profile.h:149
std::shared_ptr< NET_SETTINGS > & NetSettings()
Definition: project_file.h:103
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
Definition: project.cpp:129
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:135
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:200
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
Definition: project.cpp:359
Action handler for the Properties panel.
These are loaded from Eeschema settings but then overwritten by the project settings.
Holds all the data relating to one schematic.
Definition: schematic.h:77
void Reset()
Initialize this schematic to a blank one, unloading anything existing.
Definition: schematic.cpp:138
CONNECTION_GRAPH * m_connectionGraph
Holds and calculates connectivity information of this schematic.
Definition: schematic.h:368
SCH_SHEET_PATH & CurrentSheet() const override
Definition: schematic.h:152
void OnSchSheetChanged()
Notify the schematic and its listeners that the current sheet has been changed.
Definition: schematic.cpp:786
wxString GetOperatingPoint(const wxString &aNetName, int aPrecision, const wxString &aRange)
Definition: schematic.cpp:720
wxString GetFileName() const override
Helper to retrieve the filename from the root sheet screen.
Definition: schematic.cpp:308
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:314
CONNECTION_GRAPH * ConnectionGraph() const override
Definition: schematic.h:162
void SetCurrentSheet(const SCH_SHEET_PATH &aPath) override
Definition: schematic.h:157
SCH_SHEET_LIST Hierarchy() const override
Return the full schematic flattened hierarchical sheet list.
Definition: schematic.cpp:214
SCH_ITEM * GetItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr) const
Definition: schematic.h:116
void SetRoot(SCH_SHEET *aRootSheet)
Initialize the schematic with a new root sheet.
Definition: schematic.cpp:194
void SetProject(PROJECT *aPrj)
Definition: schematic.cpp:164
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
Definition: schematic.cpp:208
void RecomputeIntersheetRefs(const std::function< void(SCH_GLOBALLABEL *)> &aItemCallback)
Update the schematic's page reference map for all global labels, and refresh the labels so that they ...
Definition: schematic.cpp:675
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
Definition: schematic.h:137
void RemoveAllListeners()
Remove all listeners.
Definition: schematic.cpp:811
SCH_SHEET & Root() const
Definition: schematic.h:121
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
Definition: schematic.cpp:646
ERC_SETTINGS & ErcSettings() const
Definition: schematic.cpp:321
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
SCH_RENDER_SETTINGS * GetRenderSettings()
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
EESCHEMA_SETTINGS * eeconfig() const
PANEL_SCH_SELECTION_FILTER * m_selectionFilterPanel
virtual void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false)
Mark an item for refresh.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Returns a pointer to the active color theme settings.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
Definition: sch_commit.cpp:432
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
bool HasDriverChanged() const
wxString Name(bool aIgnoreSheet=false) const
Handle schematic design block actions in the schematic editor.
Tool responsible for drawing/placing items (symbols, wires, buses, labels, etc.).
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void DisplaySheet(SCH_SCREEN *aScreen)
Group generic conditions for PCB editor states.
SELECTION_CONDITION LineMode(LINE_MODE aMode)
Create a functor that tests if the frame is in the specified line drawing mode.
Handle actions specific to the schematic editor.
int UpdateNetHighlighting(const TOOL_EVENT &aEvent)
Launch a tool to highlight nets.
Schematic editor (Eeschema) main window.
bool IsContentModified() const override
Get if the current schematic has been modified but not saved.
void RefreshOperatingPointDisplay()
Refresh the display of any operaintg points.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
EDA_ITEM * GetItem(const KIID &aId) const override
Fetch an item by KIID.
const wxString & getAutoSaveFileName() const
wxTreeCtrl * m_netNavigator
std::vector< std::unique_ptr< SCH_ITEM > > m_items_to_repeat
For the repeat-last-item cmd.
void onResizeNetNavigator(wxSizeEvent &aEvent)
void updateSelectionFilterVisbility() override
Selection filter panel doesn't have a dedicated visibility control, so show it if any other AUI panel...
bool m_highlightedConnChanged
void onNetNavigatorSelChanging(wxTreeEvent &aEvent)
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
void ShowAllIntersheetRefs(bool aShow)
void SaveProjectLocalSettings() override
Save changes to the project settings to the project (.pro) file.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl=0) override
Open a project or set of files given by aFileList.
void doCloseWindow() override
DIALOG_BOOK_REPORTER * m_diffSymbolDialog
void SetHighlightedConnection(const wxString &aConnection, const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
bool ReadyToNetlist(const wxString &aAnnotateMessage)
Check if we are ready to write a netlist file for the current schematic.
void onCloseErcDialog(wxCommandEvent &aEvent)
void ShowFindReplaceDialog(bool aReplace)
Run the Find or Find & Replace dialog.
void UpdateHierarchySelection()
Update the hierarchy navigation tree selection (cross-probe from schematic to hierarchy pane).
void SetScreen(BASE_SCREEN *aScreen) override
void OnFindDialogClose()
Notification that the Find dialog has closed.
void SaveSymbolToSchematic(const LIB_SYMBOL &aSymbol, const KIID &aSchematicSymbolUUID)
Update a schematic symbol from a LIB_SYMBOL.
void SchematicCleanUp(SCH_COMMIT *aCommit, SCH_SCREEN *aScreen=nullptr)
Perform routine schematic cleaning including breaking wire and buses and deleting identical objects s...
void UpdateHierarchyNavigator(bool aRefreshNetNavigator=true)
Update the hierarchy navigation tree and history.
void onSize(wxSizeEvent &aEvent)
void ShowChangedLanguage() override
std::vector< wxEvtHandler * > m_schematicChangeListeners
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Called after the preferences dialog is run.
void HardRedraw() override
Rebuild the GAL and redraw the screen.
void OnClearFileHistory(wxCommandEvent &aEvent)
bool GetShowAllPins() const override
Allow edit frame to show/hide hidden pins.
SCHEMATIC * m_schematic
The currently loaded schematic.
void onCloseSymbolFieldsTableDialog(wxCommandEvent &aEvent)
void ClearFindReplaceStatus()
SCH_SHEET_PATH & GetCurrentSheet() const
void OnLoadFile(wxCommandEvent &event)
SCHEMATIC & Schematic() const
void updateTitle()
Set the main window title bar text.
void RefreshNetNavigator(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
wxString GetFullScreenDesc() const override
static const wxString SearchPaneName()
DIALOG_BOOK_REPORTER * GetSymbolDiffDialog()
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
void RecomputeIntersheetRefs()
Update the schematic's page reference map for all global labels, and refresh the labels so that they ...
DIALOG_ERC * GetErcDialog()
void sendNetlistToCvpcb()
Send the KiCad netlist over to CVPCB.
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
void OnPageSettingsChange() override
Called when modifying the page settings.
void ClearRepeatItemsList()
Clear the list of items which are to be repeated with the insert key.
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Returns bbox of document with option to not include some items.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags)
Generate the connection data for the entire schematic hierarchy.
void CaptureHierarchyPaneSize()
void initScreenZoom()
Initialize the zoom value of the current screen and mark the screen as zoom-initialized.
void UpdateLabelsHierarchyNavigator()
Update the hierarchy navigation tree labels.
void OnImportProject(wxCommandEvent &event)
static const wxString SchematicHierarchyPaneName()
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
void RemoveSchematicChangeListener(wxEvtHandler *aListener)
Remove aListener to from the schematic changed listener list.
void ShowFindReplaceStatus(const wxString &aMsg, int aStatusTime)
void SetCurrentSheet(const SCH_SHEET_PATH &aSheet)
virtual void PrintPage(const RENDER_SETTINGS *aSettings) override
Plot or print the current sheet to the clipboard.
int GetSchematicJunctionSize()
void DisplayCurrentSheet()
Draw the current sheet on the display.
~SCH_EDIT_FRAME() override
const wxString & GetHighlightedConnection() const
DIALOG_ERC * m_ercDialog
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
void UpdateNetHighlightStatus()
wxString GetScreenDesc() const override
Return a human-readable description of the current screen.
DIALOG_SCH_FIND * m_findReplaceDialog
void AddCopyForRepeatItem(const SCH_ITEM *aItem)
DIALOG_SYMBOL_FIELDS_TABLE * GetSymbolFieldsTableDialog()
void OnResizeHierarchyNavigator(wxSizeEvent &aEvent)
wxString GetCurrentFileName() const override
Get the full filename + path of the currently opened file in the frame.
wxString m_highlightedConn
The highlighted net or bus or empty string.
static const wxString NetNavigatorPaneName()
void onCloseSymbolDiffDialog(wxCommandEvent &aEvent)
wxTreeCtrl * createHighlightedNetNavigator()
void OnExit(wxCommandEvent &event)
void AutoRotateItem(SCH_SCREEN *aScreen, SCH_ITEM *aItem)
Automatically set the rotation of an item (if the item supports it)
void AddSchematicChangeListener(wxEvtHandler *aListener)
Add aListener to post #EDA_EVT_SCHEMATIC_CHANGED command events to.
HIERARCHY_PANE * m_hierarchy
DIALOG_SYMBOL_FIELDS_TABLE * m_symbolFieldsTableDialog
std::unique_ptr< GRID_HELPER > MakeGridHelper() override
SEVERITY GetSeverity(int aErrorCode) const override
void onNetNavigatorSelection(wxTreeEvent &aEvent)
void ReCreateHToolbar() override
void FocusOnItem(SCH_ITEM *aItem)
void SaveCopyForRepeatItem(const SCH_ITEM *aItem)
Clone aItem and owns that clone in this container.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:51
Handle actions specific to the schematic editor.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:166
virtual bool IsConnectable() const
Definition: sch_item.h:449
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction)
Definition: sch_item.h:568
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
Definition: sch_item.cpp:221
SCH_ITEM * Duplicate(bool doClone=false) const
Routine to create a new copy of given item.
Definition: sch_item.cpp:131
bool AutoRotateOnPlacement() const
autoRotateOnPlacement
Definition: sch_label.cpp:1455
SPIN_STYLE GetSpinStyle() const
Definition: sch_label.cpp:383
void AutoplaceFields(SCH_SCREEN *aScreen, bool aManual) override
Definition: sch_label.cpp:614
std::vector< SCH_FIELD > & GetFields()
Definition: sch_label.h:201
virtual void SetSpinStyle(SPIN_STYLE aSpinStyle)
Definition: sch_label.cpp:348
Tool responsible for drawing/placing items (symbols, wires, buses, labels, etc.)
static bool IsDrawingLineWireOrBus(const SELECTION &aSelection)
Segment description base class to describe items which have 2 end points (track, wire,...
Definition: sch_line.h:41
void SetOperatingPoint(const wxString &aText)
Definition: sch_line.h:310
bool IsWire() const
Return true if the line is a wire.
Definition: sch_line.cpp:977
double GetLength() const
Definition: sch_line.cpp:243
const wxString & GetOperatingPoint() const
Definition: sch_line.h:309
Handle actions specific to the schematic editor.
void SetOperatingPoint(const wxString &aText)
Definition: sch_pin.h:294
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const override
Make a set of SHAPE objects representing the EDA_SHAPE.
void ResetDirectivesAndItems(KIGFX::SCH_VIEW *view)
Clears and resets items and directives attached to this rule area.
std::unordered_set< SCH_ITEM * > GetPastAndPresentContainedItems() const
Fetches all items which were, or are, within the rule area.
static std::vector< std::pair< SCH_RULE_AREA *, SCH_SCREEN * > > UpdateRuleAreasInScreens(std::unordered_set< SCH_SCREEN * > &screens, KIGFX::SCH_VIEW *view)
Updates all rule area connectvity / caches in the given sheet paths.
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
Definition: sch_screen.h:712
SCH_SCREEN * GetNext()
SCH_SCREEN * GetFirst()
bool HasNoFullyDefinedLibIds()
Test all of the schematic symbols to see if all LIB_ID objects library nickname is not set.
const PAGE_INFO & GetPageSettings() const
Definition: sch_screen.h:130
void Clear(bool aFree=true)
Delete all draw items and clears the project settings.
Definition: sch_screen.cpp:278
void TestDanglingEnds(const SCH_SHEET_PATH *aPath=nullptr, std::function< void(SCH_ITEM *)> *aChangedHandler=nullptr) const
Test all of the connectable objects in the schematic for unused connection points.
const std::map< wxString, LIB_SYMBOL * > & GetLibSymbols() const
Fetch a list of unique LIB_SYMBOL object pointers required to properly render each SCH_SYMBOL in this...
Definition: sch_screen.h:480
double m_LastZoomLevel
last value for the zoom level, useful in Eeschema when changing the current displayed sheet to reuse ...
Definition: sch_screen.h:636
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:108
const wxString & GetFileName() const
Definition: sch_screen.h:143
const KIID & GetUuid() const
Definition: sch_screen.h:531
void Print(const SCH_RENDER_SETTINGS *aSettings)
Print all the items in the screen to aDC.
Definition: sch_screen.cpp:854
bool IsReadOnly() const
Definition: sch_screen.h:146
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
Definition: sch_screen.cpp:118
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
Definition: sch_screen.cpp:316
bool m_zoomInitialized
Definition: sch_screen.h:661
bool FileExists() const
Definition: sch_screen.h:149
SPIN_STYLE GetLabelOrientationForPoint(const VECTOR2I &aPosition, SPIN_STYLE aDefaultOrientation, const SCH_SHEET_PATH *aSheet) const
Definition: sch_screen.cpp:515
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
SCH_ITEM * GetItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr) const
Fetch a SCH_ITEM by ID.
bool IsModified() const
Check the entire hierarchy for any modifications.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false) const
Return the sheet path in a human readable form made from the sheet names.
void UpdateAllScreenReferences() const
Update all the symbol references for this sheet path.
SCH_SCREEN * LastScreen()
bool GetExcludedFromSim() const
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
void clear()
Forwarded method from std::vector.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:57
wxString GetName() const
Definition: sch_sheet.h:107
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
Definition: sch_sheet.cpp:173
std::vector< SCH_SHEET_PIN * > & GetPins()
Definition: sch_sheet.h:181
Schematic symbol object.
Definition: sch_symbol.h:104
bool IsAnnotated(const SCH_SHEET_PATH *aSheet) const
Check if the symbol has a valid annotation (reference) for the given sheet path.
Definition: sch_symbol.cpp:811
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
Definition: sch_symbol.cpp:935
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve a list of the SCH_PINs for the given sheet path.
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
Definition: sch_symbol.cpp:736
VECTOR2I GetPosition() const override
Definition: sch_text.h:141
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
static bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
void BrightenItem(EDA_ITEM *aItem)
void UnbrightenItem(EDA_ITEM *aItem)
EDA_ITEM * Front() const
Definition: selection.h:172
int Size() const
Returns the number of selected parts.
Definition: selection.h:116
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Saves, unloads and unregisters the given PROJECT.
bool CollideEdge(const VECTOR2I &aPoint, VERTEX_INDEX *aClosestVertex=nullptr, int aClearance=0) const
Check whether aPoint collides with any edge of any of the contours of the polygon.
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
const SPICE_GENERATOR & SpiceGenerator() const
Definition: sim_model.h:435
std::vector< std::reference_wrapper< const SIM_MODEL_PIN > > GetPins() const
Definition: sim_model.cpp:748
virtual std::string ItemName(const SPICE_ITEM &aItem) const
Symbol library viewer main window.
The symbol library editor main window.
Symbol library viewer main window.
bool GetExcludedFromSim() const override
Definition: symbol.h:136
void AddTemplateFieldNames(const wxString &aSerializedFieldNames)
Add a serialized list of template field names.
void DeleteAllFieldNameTemplates(bool aGlobal)
Delete the entire contents.
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:167
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:169
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
ACTIONS * m_actions
Definition: tools_holder.h:168
@ REDRAW
Full drawing refresh.
Definition: tool_base.h:83
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition: tool_base.h:80
Generic, UI-independent tool event.
Definition: tool_event.h:167
Master controller class:
Definition: tool_manager.h:62
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:150
ACTION_MANAGER * GetActionManager() const
Definition: tool_manager.h:302
bool PostAction(const std::string &aActionName, T aParam)
Run the specified action after the current action (coroutine) ends.
Definition: tool_manager.h:235
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
void RegisterTool(TOOL_BASE *aTool)
Add a tool to the manager set and sets it up.
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).
void InitTools()
Initializes all registered tools.
void ShutdownAllTools()
Shutdown all tools with a currently registered event loop in this tool manager by waking them up with...
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
Definition: wx_infobar.cpp:304
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
Definition: wx_infobar.cpp:140
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
Definition: wx_infobar.cpp:190
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
Definition: wx_infobar.cpp:294
wxString EnsureFileExtension(const wxString &aFilename, const wxString &aExtension)
It's annoying to throw up nag dialogs when the extension isn't right.
Definition: common.cpp:417
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:170
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
Definition: confirm.cpp:130
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define _HKI(x)
#define _(s)
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define SCH_EDIT_FRAME_NAME
@ ID_IMPORT_NON_KICAD_SCH
Definition: eeschema_id.h:57
const wxAuiPaneInfo & defaultSchSelectionFilterPaneInfo(wxWindow *aWindow)
const wxAuiPaneInfo & defaultPropertiesPaneInfo(wxWindow *aWindow)
const wxAuiPaneInfo & defaultNetNavigatorPaneInfo()
const wxAuiPaneInfo & defaultDesignBlocksPaneInfo(wxWindow *aWindow)
EVT_MENU_RANGE(ID_GERBVIEW_DRILL_FILE1, ID_GERBVIEW_DRILL_FILEMAX, GERBVIEW_FRAME::OnDrlFileHistory) EVT_MENU_RANGE(ID_GERBVIEW_ZIP_FILE1
KiCad executable names.
const wxString PCBNEW_EXE
@ FRAME_PCB_EDITOR
Definition: frame_type.h:42
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ FRAME_SCH_VIEWER
Definition: frame_type.h:36
@ FRAME_SCH
Definition: frame_type.h:34
@ FRAME_SIMULATOR
Definition: frame_type.h:38
@ FRAME_CVPCB
Definition: frame_type.h:52
@ FRAME_SYMBOL_CHOOSER
Definition: frame_type.h:37
int ExecuteFile(const wxString &aEditorName, const wxString &aFileName, wxProcess *aCallback, bool aFileForKicad)
Call the executable file aEditorName with the parameter aFileName.
Definition: gestfich.cpp:143
static const std::string NetlistFileExtension
static const std::string LegacyPcbFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string AutoSaveFilePrefix
static wxString LegacySchematicFileWildcard()
static wxString AllSchematicFilesWildcard()
static wxString KiCadSchematicFileWildcard()
const wxChar *const traceApi
Flag to enable debug output related to the API plugin system.
@ ID_FILE_LIST_CLEAR
Definition: id.h:86
@ ID_EDA_SOCKET_EVENT
Definition: id.h:163
@ ID_EDA_SOCKET_EVENT_SERV
Definition: id.h:162
@ ID_FILEMAX
Definition: id.h:84
@ ID_FILE1
Definition: id.h:83
PROJECT & Prj()
Definition: kicad.cpp:595
KIID niluuid(0)
#define KICTL_CREATE
caller thinks requested project files may not exist.
Definition: kiway_player.h:76
@ LAYER_ERC_WARN
Definition: layer_ids.h:384
@ LAYER_ERC_EXCLUSION
Definition: layer_ids.h:386
@ LAYER_ERC_ERR
Definition: layer_ids.h:385
@ LAYER_OP_CURRENTS
Definition: layer_ids.h:405
@ LAYER_SCHEMATIC_BACKGROUND
Definition: layer_ids.h:392
@ LAYER_INTERSHEET_REFS
Definition: layer_ids.h:368
@ LAYER_OP_VOLTAGES
Definition: layer_ids.h:404
@ MAIL_PCB_UPDATE
Definition: mail_type.h:46
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:57
@ GEOMETRY
Position or shape has changed.
Definition: view_item.h:54
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: unix/app.cpp:90
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: unix/app.cpp:79
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
see class PGM_BASE
SEVERITY
#define DIFF_SYMBOLS_DIALOG_NAME
wxDEFINE_EVENT(EDA_EVT_SCHEMATIC_CHANGING, wxCommandEvent)
#define CURRENT_TOOL(action)
SCH_CLEANUP_FLAGS
@ LOCAL_CLEANUP
@ GLOBAL_CLEANUP
KIWAY Kiway(KFCTL_STANDALONE)
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
const double IU_PER_MILS
Definition: base_units.h:77
The EE_TYPE struct provides a type-specific auto-range iterator to the RTree.
Definition: sch_rtree.h:192
std::string refName
Definition for symbol library class.
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ SCH_LINE_T
Definition: typeinfo.h:163
@ SCH_SYMBOL_T
Definition: typeinfo.h:172
@ SCH_FIELD_T
Definition: typeinfo.h:150
@ SCH_DIRECTIVE_LABEL_T
Definition: typeinfo.h:171
@ SCH_LABEL_T
Definition: typeinfo.h:167
@ SCH_SHEET_T
Definition: typeinfo.h:174
@ SCH_RULE_AREA_T
Definition: typeinfo.h:170
@ SCH_HIER_LABEL_T
Definition: typeinfo.h:169
@ SCH_SHEET_PIN_T
Definition: typeinfo.h:173
@ SCH_TEXT_T
Definition: typeinfo.h:151
@ SCH_GLOBAL_LABEL_T
Definition: typeinfo.h:168
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:691
Definition of file extensions used in Kicad.
void SetAuiPaneSize(wxAuiManager &aManager, wxAuiPaneInfo &aPane, int aWidth, int aHeight)
Sets the size of an AUI pane, working around http://trac.wxwidgets.org/ticket/13180.