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 The 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>
107
108#ifdef KICAD_IPC_API
110#include <api/api_utils.h>
111#endif
112
113
114#define DIFF_SYMBOLS_DIALOG_NAME wxT( "DiffSymbolsDialog" )
115
116
117BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, SCH_BASE_FRAME )
120
121 EVT_SIZE( SCH_EDIT_FRAME::OnSize )
122
125
127
128 EVT_MENU( wxID_EXIT, SCH_EDIT_FRAME::OnExit )
129 EVT_MENU( wxID_CLOSE, SCH_EDIT_FRAME::OnExit )
130
131 // Drop files event
132 EVT_DROP_FILES( SCH_EDIT_FRAME::OnDropFiles )
133END_EVENT_TABLE()
134
135
136wxDEFINE_EVENT( EDA_EVT_SCHEMATIC_CHANGING, wxCommandEvent );
137wxDEFINE_EVENT( EDA_EVT_SCHEMATIC_CHANGED, wxCommandEvent );
138
139
140SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
141 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH, wxT( "Eeschema" ), wxDefaultPosition,
143 m_ercDialog( nullptr ),
144 m_diffSymbolDialog( nullptr ),
145 m_symbolFieldsTableDialog( nullptr ),
146 m_netNavigator( nullptr ),
147 m_highlightedConnChanged( false ),
148 m_designBlocksPane( nullptr )
149{
150 m_maximizeByDefault = true;
151 m_schematic = new SCHEMATIC( nullptr );
152
153 m_showBorderAndTitleBlock = true; // true to show sheet references
154 m_supportsAutoSave = true;
155 m_syncingPcbToSchSelection = false;
156 m_aboutTitle = _HKI( "KiCad Schematic Editor" );
157 m_show_search = false;
158
159 m_findReplaceDialog = nullptr;
160
161 m_findReplaceData = std::make_unique<SCH_SEARCH_DATA>();
162
163 // Give an icon
164 wxIcon icon;
165 wxIconBundle icon_bundle;
166
167 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 48 ) );
168 icon_bundle.AddIcon( icon );
169 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 128 ) );
170 icon_bundle.AddIcon( icon );
171 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 256 ) );
172 icon_bundle.AddIcon( icon );
173 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema_32 ) );
174 icon_bundle.AddIcon( icon );
175 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema_16 ) );
176 icon_bundle.AddIcon( icon );
177
178 SetIcons( icon_bundle );
179
180 LoadSettings( eeconfig() );
181
182 // NB: also links the schematic to the loaded project
183 CreateScreens();
184
185 SCH_SHEET_PATH root;
186 root.push_back( &Schematic().Root() );
187 SetCurrentSheet( root );
188
189 setupTools();
190 setupUIConditions();
191 ReCreateMenuBar();
192 ReCreateHToolbar();
193 ReCreateVToolbar();
194 ReCreateOptToolbar();
195
196#ifdef KICAD_IPC_API
198 &SCH_EDIT_FRAME::onPluginAvailabilityChanged, this );
199#endif
200
201 m_hierarchy = new HIERARCHY_PANE( this );
202
203 // Initialize common print setup dialog settings.
204 m_pageSetupData.GetPrintData().SetPrintMode( wxPRINT_MODE_PRINTER );
205 m_pageSetupData.GetPrintData().SetQuality( wxPRINT_QUALITY_MEDIUM );
206 m_pageSetupData.GetPrintData().SetBin( wxPRINTBIN_AUTO );
207 m_pageSetupData.GetPrintData().SetNoCopies( 1 );
208
209 m_searchPane = new SCH_SEARCH_PANE( this );
210 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
211
212 m_propertiesPanel->SetSplitterProportion( eeconfig()->m_AuiPanels.properties_splitter );
213
214 m_selectionFilterPanel = new PANEL_SCH_SELECTION_FILTER( this );
215 m_designBlocksPane = new DESIGN_BLOCK_PANE( this, nullptr, m_designBlockHistoryList );
216
217 m_auimgr.SetManagedWindow( this );
218
219 CreateInfoBar();
220
221 // Rows; layers 4 - 6
222 m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( wxS( "MainToolbar" ) )
223 .Top().Layer( 6 ) );
224
225 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) )
226 .Bottom().Layer( 6 ) );
227
228 // Columns; layers 1 - 3
229 m_auimgr.AddPane( m_hierarchy, EDA_PANE().Palette().Name( SchematicHierarchyPaneName() )
230 .Caption( _( "Schematic Hierarchy" ) )
231 .Left().Layer( 3 ).Position( 1 )
232 .TopDockable( false )
233 .BottomDockable( false )
234 .CloseButton( true )
235 .MinSize( FromDIP( wxSize( 120, 60 ) ) )
236 .BestSize( FromDIP( wxSize( 200, 200 ) ) )
237 .FloatingSize( FromDIP( wxSize( 200, 200 ) ) )
238 .FloatingPosition( FromDIP( wxPoint( 50, 50 ) ) )
239 .Show( false ) );
240
241 m_auimgr.AddPane( m_propertiesPanel, defaultPropertiesPaneInfo( this ) );
242 m_auimgr.AddPane( m_selectionFilterPanel, defaultSchSelectionFilterPaneInfo( this ) );
243
244 m_auimgr.AddPane( m_designBlocksPane, defaultDesignBlocksPaneInfo( this ) );
245
246 m_auimgr.AddPane( createHighlightedNetNavigator(), defaultNetNavigatorPaneInfo() );
247
248 m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( wxS( "OptToolbar" ) )
249 .Left().Layer( 2 ) );
250
251 m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( wxS( "ToolsToolbar" ) )
252 .Right().Layer( 2 ) );
253
254 // Center
255 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
256 .Center() );
257
258 m_auimgr.AddPane( m_searchPane, EDA_PANE()
259 .Name( SearchPaneName() )
260 .Bottom()
261 .Caption( _( "Search" ) )
262 .PaneBorder( false )
263 .MinSize( FromDIP( wxSize( 180, 60 ) ) )
264 .BestSize( FromDIP( wxSize( 180, 100 ) ) )
265 .FloatingSize( FromDIP( wxSize( 480, 200 ) ) )
266 .CloseButton( true )
267 .DestroyOnClose( false )
268 .Show( m_show_search ) );
269
270 FinishAUIInitialization();
271
272 resolveCanvasType();
273 SwitchCanvas( m_canvasType );
274
275 GetCanvas()->GetGAL()->SetAxesEnabled( false );
276
277 KIGFX::SCH_VIEW* view = GetCanvas()->GetView();
278 static_cast<KIGFX::SCH_PAINTER*>( view->GetPainter() )->SetSchematic( m_schematic );
279
280 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
281 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
282 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
283 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
284 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
285 EESCHEMA_SETTINGS* cfg = eeconfig();
286
287 hierarchy_pane.Show( cfg->m_AuiPanels.show_schematic_hierarchy );
288 netNavigatorPane.Show( cfg->m_AuiPanels.show_net_nav_panel );
289 propertiesPane.Show( cfg->m_AuiPanels.show_properties );
290 designBlocksPane.Show( cfg->m_AuiPanels.design_blocks_show );
291 updateSelectionFilterVisbility();
292
293 // The selection filter doesn't need to grow in the vertical direction when docked
294 selectionFilterPane.dock_proportion = 0;
295
298 {
299 // Show at end, after positioning
300 hierarchy_pane.FloatingSize( cfg->m_AuiPanels.hierarchy_panel_float_width,
302 }
303
304 if( cfg->m_AuiPanels.net_nav_panel_float_size.GetWidth() > 0
305 && cfg->m_AuiPanels.net_nav_panel_float_size.GetHeight() > 0 )
306 {
307 netNavigatorPane.FloatingSize( cfg->m_AuiPanels.net_nav_panel_float_size );
308 netNavigatorPane.FloatingPosition( cfg->m_AuiPanels.net_nav_panel_float_pos );
309 }
310
312 SetAuiPaneSize( m_auimgr, propertiesPane, cfg->m_AuiPanels.properties_panel_width, -1 );
313
315 hierarchy_pane.Float();
316
318 && ( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_TOP
319 || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) )
320 {
321 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
322 searchPane.Direction( cfg->m_AuiPanels.search_panel_dock_direction );
323 SetAuiPaneSize( m_auimgr, searchPane, -1, cfg->m_AuiPanels.search_panel_height );
324 }
325
326 else if( cfg->m_AuiPanels.search_panel_width > 0
327 && ( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_LEFT
328 || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) )
329 {
330 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
331 searchPane.Direction( cfg->m_AuiPanels.search_panel_dock_direction );
332 SetAuiPaneSize( m_auimgr, searchPane, cfg->m_AuiPanels.search_panel_width, -1 );
333 }
334
336 netNavigatorPane.Float();
337
339 SetAuiPaneSize( m_auimgr, designBlocksPane,
341
343 {
344 // If the net navigator is not show, let the hierarchy navigator take all of the vertical
345 // space.
347 {
348 SetAuiPaneSize( m_auimgr, hierarchy_pane,
350 }
351 else
352 {
353 SetAuiPaneSize( m_auimgr, hierarchy_pane,
356
357 SetAuiPaneSize( m_auimgr, netNavigatorPane,
359 cfg->m_AuiPanels.net_nav_panel_docked_size.GetHeight() );
360 }
361
362 // wxAUI hack: force width by setting MinSize() and then Fixed()
363 // thanks to ZenJu https://github.com/wxWidgets/wxWidgets/issues/13180
364 hierarchy_pane.MinSize( cfg->m_AuiPanels.hierarchy_panel_docked_width, 60 );
365 hierarchy_pane.Fixed();
366 netNavigatorPane.MinSize( cfg->m_AuiPanels.net_nav_panel_docked_size.GetWidth(), 60 );
367 netNavigatorPane.Fixed();
368 m_auimgr.Update();
369
370 // now make it resizable again
371 hierarchy_pane.Resizable();
372 netNavigatorPane.Resizable();
373 m_auimgr.Update();
374
375 // Note: DO NOT call m_auimgr.Update() anywhere after this; it will nuke the size
376 // back to minimum.
377 hierarchy_pane.MinSize( FromDIP( wxSize( 120, 60 ) ) );
378 netNavigatorPane.MinSize( FromDIP( wxSize( 120, 60 ) ) );
379 }
380 else
381 {
382 m_auimgr.Update();
383 }
384
385 LoadProjectSettings();
386 LoadDrawingSheet();
387
393
394 initScreenZoom();
395
396 m_hierarchy->Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::OnResizeHierarchyNavigator, this );
397 m_netNavigator->Bind( wxEVT_TREE_SEL_CHANGING, &SCH_EDIT_FRAME::onNetNavigatorSelChanging,
398 this );
399 m_netNavigator->Bind( wxEVT_TREE_SEL_CHANGED, &SCH_EDIT_FRAME::onNetNavigatorSelection, this );
400 m_netNavigator->Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::onResizeNetNavigator, this );
401
402 // This is used temporarily to fix a client size issue on GTK that causes zoom to fit
403 // to calculate the wrong zoom size. See SCH_EDIT_FRAME::onSize().
404 Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::onSize, this );
405
406 setupUnits( eeconfig() );
407
408 // Net list generator
409 DefaultExecFlags();
410
411 updateTitle();
412 m_toolManager->GetTool<SCH_NAVIGATE_TOOL>()->ResetHistory();
413
414#ifdef KICAD_IPC_API
415 m_apiHandler = std::make_unique<API_HANDLER_SCH>( this );
416 Pgm().GetApiServer().RegisterHandler( m_apiHandler.get() );
417#endif
418
419 // Default shutdown reason until a file is loaded
420 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New schematic file is unsaved" ) );
421
422 // Init for dropping files
424 DragAcceptFiles( true );
425
426 // Ensure the window is on top
427 Raise();
428
429 // Now that all sizes are fixed, set the initial hierarchy_pane floating position to the
430 // top-left corner of the canvas
431 wxPoint canvas_pos = GetCanvas()->GetScreenPosition();
432 hierarchy_pane.FloatingPosition( canvas_pos.x + 10, canvas_pos.y + 10 );
433
434 Bind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &SCH_EDIT_FRAME::onCloseSymbolDiffDialog, this );
435 Bind( EDA_EVT_CLOSE_ERC_DIALOG, &SCH_EDIT_FRAME::onCloseErcDialog, this );
436 Bind( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, &SCH_EDIT_FRAME::onCloseSymbolFieldsTableDialog,
437 this );
438}
439
440
442{
443 m_hierarchy->Unbind( wxEVT_SIZE, &SCH_EDIT_FRAME::OnResizeHierarchyNavigator, this );
444
445 // Ensure m_canvasType is up to date, to save it in config
447
448 SetScreen( nullptr );
449
450 if( m_schematic )
452
453 // Delete all items not in draw list before deleting schematic
454 // to avoid dangling pointers stored in these items
457
458 delete m_schematic;
459 m_schematic = nullptr;
460
461 // Close the project if we are standalone, so it gets cleaned up properly
462 if( Kiface().IsSingle() )
463 {
464 try
465 {
466 GetSettingsManager()->UnloadProject( &Prj(), false );
467 }
468 catch( const nlohmann::detail::type_error& e )
469 {
470 wxFAIL_MSG( wxString::Format( wxT( "Settings exception occurred: %s" ), e.what() ) );
471 }
472 }
473
474 delete m_hierarchy;
476}
477
478
480{
481 aEvent.Skip();
482
483 // 1st Call: Handle the size update during the first resize event.
485
486 // Defer the second size capture
487 CallAfter([this]() {
489 });
490}
491
492
494{
495 // Called when resizing the Hierarchy Navigator panel
496 // Store the current pane size
497 // It allows to retrieve the last defined pane size when switching between
498 // docked and floating pane state
499 // Note: *DO NOT* call m_auimgr.Update() here: it crashes KiCad at least on Windows
500
501 EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
502 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
503
504 if( cfg && m_hierarchy->IsShownOnScreen() )
505 {
506 cfg->m_AuiPanels.hierarchy_panel_float_width = hierarchy_pane.floating_size.x;
507 cfg->m_AuiPanels.hierarchy_panel_float_height = hierarchy_pane.floating_size.y;
508
509 // initialize hierarchy_panel_docked_width and best size only if the hierarchy_pane
510 // width is > 0 (i.e. if its size is already set and has meaning)
511 // if it is floating, its size is not initialized (only floating_size is initialized)
512 // initializing hierarchy_pane.best_size is useful when switching to float pane and
513 // after switching to the docked pane, to retrieve the last docked pane width
514 if( hierarchy_pane.rect.width > 50 ) // 50 is a good margin
515 {
516 cfg->m_AuiPanels.hierarchy_panel_docked_width = hierarchy_pane.rect.width;
517 hierarchy_pane.best_size.x = hierarchy_pane.rect.width;
518 }
519 }
520}
521
522
524{
525 // Create the manager and dispatcher & route draw panel events to the dispatcher
528 GetCanvas()->GetViewControls(), config(), this );
529 m_actions = new EE_ACTIONS();
531
532 // Register tools
552
553 // Run the selection tool, it is supposed to be always active
555
557}
558
559
561{
563
565 SCH_EDITOR_CONDITIONS cond( this );
566
567 wxASSERT( mgr );
568
569 auto hasElements =
570 [ this ] ( const SELECTION& aSel )
571 {
572 return GetScreen() &&
573 ( !GetScreen()->Items().empty() || !SELECTION_CONDITIONS::Idle( aSel ) );
574 };
575
576 auto searchPaneCond =
577 [this] ( const SELECTION& )
578 {
579 return m_auimgr.GetPane( SearchPaneName() ).IsShown();
580 };
581
582 auto propertiesCond =
583 [this] ( const SELECTION& )
584 {
585 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
586 };
587
588 auto hierarchyNavigatorCond =
589 [ this ] ( const SELECTION& aSel )
590 {
591 return m_auimgr.GetPane( SchematicHierarchyPaneName() ).IsShown();
592 };
593
594 auto netNavigatorCond =
595 [ this ] (const SELECTION& aSel )
596 {
597 return m_auimgr.GetPane( NetNavigatorPaneName() ).IsShown();
598 };
599
600 auto designBlockCond =
601 [ this ] (const SELECTION& aSel )
602 {
603 return m_auimgr.GetPane( DesignBlocksPaneName() ).IsShown();
604 };
605
606 auto undoCond =
607 [ this ] (const SELECTION& aSel )
608 {
610 return true;
611
612 return GetUndoCommandCount() > 0;
613 };
614
615#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
616#define CHECK( x ) ACTION_CONDITIONS().Check( x )
617
619 mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) );
621
622 mgr->SetConditions( EE_ACTIONS::showSearch, CHECK( searchPaneCond ) );
623 mgr->SetConditions( EE_ACTIONS::showHierarchy, CHECK( hierarchyNavigatorCond ) );
624 mgr->SetConditions( EE_ACTIONS::showNetNavigator, CHECK( netNavigatorCond ) );
625 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
626 mgr->SetConditions( EE_ACTIONS::showDesignBlockPanel, CHECK( designBlockCond ) );
631 CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) );
632 mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) );
633 mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
634
636 CHECK( cond.LineMode( LINE_MODE::LINE_MODE_FREE ) ) );
638 CHECK( cond.LineMode( LINE_MODE::LINE_MODE_90 ) ) );
640 CHECK( cond.LineMode( LINE_MODE::LINE_MODE_45 ) ) );
641
642 mgr->SetConditions( ACTIONS::cut, ENABLE( hasElements ) );
643 mgr->SetConditions( ACTIONS::copy, ENABLE( hasElements ) );
644 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( hasElements ) );
647 mgr->SetConditions( ACTIONS::doDelete, ENABLE( hasElements ) );
648 mgr->SetConditions( ACTIONS::duplicate, ENABLE( hasElements ) );
649 mgr->SetConditions( ACTIONS::selectAll, ENABLE( hasElements ) );
650 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( hasElements ) );
651
652 mgr->SetConditions( EE_ACTIONS::rotateCW, ENABLE( hasElements ) );
653 mgr->SetConditions( EE_ACTIONS::rotateCCW, ENABLE( hasElements ) );
654 mgr->SetConditions( EE_ACTIONS::mirrorH, ENABLE( hasElements ) );
655 mgr->SetConditions( EE_ACTIONS::mirrorV, ENABLE( hasElements ) );
656
661
662 auto showHiddenPinsCond =
663 [this]( const SELECTION& )
664 {
665 return GetShowAllPins();
666 };
667
668 auto showHiddenFieldsCond =
669 [this]( const SELECTION& )
670 {
672 return cfg && cfg->m_Appearance.show_hidden_fields;
673 };
674
675 auto showDirectiveLabelsCond =
676 [this]( const SELECTION& )
677 {
679 return cfg && cfg->m_Appearance.show_directive_labels;
680 };
681
682 auto showERCErrorsCond =
683 [this]( const SELECTION& )
684 {
686 return cfg && cfg->m_Appearance.show_erc_errors;
687 };
688
689 auto showERCWarningsCond =
690 [this]( const SELECTION& )
691 {
693 return cfg && cfg->m_Appearance.show_erc_warnings;
694 };
695
696 auto showERCExclusionsCond =
697 [this]( const SELECTION& )
698 {
700 return cfg && cfg->m_Appearance.show_erc_exclusions;
701 };
702
703 auto markSimExclusionsCond =
704 [this]( const SELECTION& )
705 {
707 return cfg && cfg->m_Appearance.mark_sim_exclusions;
708 };
709
710 auto showOPVoltagesCond =
711 [this]( const SELECTION& )
712 {
714 return cfg && cfg->m_Appearance.show_op_voltages;
715 };
716
717 auto showOPCurrentsCond =
718 [this]( const SELECTION& )
719 {
721 return cfg && cfg->m_Appearance.show_op_currents;
722 };
723
724 auto showPinAltModeIconsCond =
725 [this]( const SELECTION& )
726 {
728 return cfg && cfg->m_Appearance.show_pin_alt_icons;
729 };
730
731 auto showAnnotateAutomaticallyCond =
732 [this]( const SELECTION& )
733 {
735 return cfg && cfg->m_AnnotatePanel.automatic;
736 };
737
738 auto remapSymbolsCondition =
739 [&]( const SELECTION& aSel )
740 {
741 SCH_SCREENS schematic( Schematic().Root() );
742
743 // The remapping can only be performed on legacy projects.
744 return schematic.HasNoFullyDefinedLibIds();
745 };
746
747 auto belowRootSheetCondition =
748 [this]( const SELECTION& aSel )
749 {
751 return navigateTool && navigateTool->CanGoUp();
752 };
753
754 mgr->SetConditions( EE_ACTIONS::leaveSheet, ENABLE( belowRootSheetCondition ) );
755
756 /* Some of these are bound by default to arrow keys which will get a different action if we
757 * disable the buttons. So always leave them enabled so the action is consistent.
758 * https://gitlab.com/kicad/code/kicad/-/issues/14783
759 mgr->SetConditions( EE_ACTIONS::navigateUp, ENABLE( belowRootSheetCondition ) );
760 mgr->SetConditions( EE_ACTIONS::navigateForward, ENABLE( navHistoryHasForward ) );
761 mgr->SetConditions( EE_ACTIONS::navigateBack, ENABLE( navHistoryHsBackward ) );
762 */
763
764 mgr->SetConditions( EE_ACTIONS::remapSymbols, ENABLE( remapSymbolsCondition ) );
765 mgr->SetConditions( EE_ACTIONS::toggleHiddenPins, CHECK( showHiddenPinsCond ) );
766 mgr->SetConditions( EE_ACTIONS::toggleHiddenFields, CHECK( showHiddenFieldsCond ) );
767 mgr->SetConditions( EE_ACTIONS::toggleDirectiveLabels, CHECK( showDirectiveLabelsCond ) );
768 mgr->SetConditions( EE_ACTIONS::toggleERCErrors, CHECK( showERCErrorsCond ) );
769 mgr->SetConditions( EE_ACTIONS::toggleERCWarnings, CHECK( showERCWarningsCond ) );
770 mgr->SetConditions( EE_ACTIONS::toggleERCExclusions, CHECK( showERCExclusionsCond ) );
771 mgr->SetConditions( EE_ACTIONS::markSimExclusions, CHECK( markSimExclusionsCond ) );
772 mgr->SetConditions( EE_ACTIONS::toggleOPVoltages, CHECK( showOPVoltagesCond ) );
773 mgr->SetConditions( EE_ACTIONS::toggleOPCurrents, CHECK( showOPCurrentsCond ) );
774 mgr->SetConditions( EE_ACTIONS::togglePinAltIcons, CHECK( showPinAltModeIconsCond ) );
775 mgr->SetConditions( EE_ACTIONS::toggleAnnotateAuto, CHECK( showAnnotateAutomaticallyCond ) );
777
780
781#define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
782
812
813#undef CURRENT_TOOL
814#undef CHECK
815#undef ENABLE
816}
817
818
820{
821 // we cannot store a pointer to an item in the display list here since
822 // that item may be deleted, such as part of a line concatenation or other.
823 // So simply always keep a copy of the object which is to be repeated.
824
825 if( aItem )
826 {
827 m_items_to_repeat.clear();
828
829 AddCopyForRepeatItem( aItem );
830 }
831}
832
833
835{
836 // we cannot store a pointer to an item in the display list here since
837 // that item may be deleted, such as part of a line concatenation or other.
838 // So simply always keep a copy of the object which is to be repeated.
839
840 if( aItem )
841 {
842 std::unique_ptr<SCH_ITEM> repeatItem( static_cast<SCH_ITEM*>( aItem->Duplicate() ) );
843
844 // Clone() preserves the flags & parent, we want 'em cleared.
845 repeatItem->ClearFlags();
846 repeatItem->SetParent( nullptr );
847
848 m_items_to_repeat.emplace_back( std::move( repeatItem ) );
849 }
850}
851
852
854{
855 return Schematic().GetItem( aId );
856}
857
858
860{
862}
863
864
866{
867 return GetCurrentSheet().LastScreen();
868}
869
870
872{
873 return *m_schematic;
874}
875
876
878{
879 return GetCurrentSheet().Last()->GetName();
880}
881
882
884{
886}
887
888
890{
893
894 SCH_SHEET* rootSheet = new SCH_SHEET( m_schematic );
895 m_schematic->SetRoot( rootSheet );
896
897 SCH_SCREEN* rootScreen = new SCH_SCREEN( m_schematic );
898 const_cast<KIID&>( rootSheet->m_Uuid ) = rootScreen->GetUuid();
899 m_schematic->Root().SetScreen( rootScreen );
900 SetScreen( Schematic().RootScreen() );
901
902
903 m_schematic->RootScreen()->SetFileName( wxEmptyString );
904
905 // Don't leave root page number empty
906 SCH_SHEET_PATH rootSheetPath;
907
908 rootSheetPath.push_back( rootSheet );
909 m_schematic->RootScreen()->SetPageNumber( wxT( "1" ) );
910 rootSheetPath.SetPageNumber( wxT( "1" ) );
911
912 // Rehash sheetpaths in heirarchy since we changed the uuid.
914
915 if( GetScreen() == nullptr )
916 {
917 SCH_SCREEN* screen = new SCH_SCREEN( m_schematic );
918 SetScreen( screen );
919 }
920}
921
922
924{
925 return m_schematic->CurrentSheet();
926}
927
928
930{
931 if( aSheet != GetCurrentSheet() )
932 {
933 FocusOnItem( nullptr );
934
935 Schematic().SetCurrentSheet( aSheet );
936 GetCanvas()->DisplaySheet( aSheet.LastScreen() );
937 }
938}
939
940
942{
944
945 for( SCH_ITEM* item : screen->Items() )
946 item->ClearCaches();
947
948 for( const std::pair<const wxString, LIB_SYMBOL*>& libSymbol : screen->GetLibSymbols() )
949 {
950 wxCHECK2( libSymbol.second, continue );
951 libSymbol.second->ClearCaches();
952 }
953
954 if( Schematic().Settings().m_IntersheetRefsShow )
956
957 FocusOnItem( nullptr );
958
959 GetCanvas()->DisplaySheet( GetCurrentSheet().LastScreen() );
960
962 selectionTool->Reset( TOOL_BASE::REDRAW );
963
965}
966
967
968bool SCH_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
969{
970 // Exit interactive editing
971 // Note this this will commit *some* pending changes. For instance, the EE_POINT_EDITOR
972 // will cancel any drag currently in progress, but commit all changes from previous drags.
973 if( m_toolManager )
975
976 // Shutdown blocks must be determined and vetoed as early as possible
977 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
978 && IsContentModified() )
979 {
980 return false;
981 }
982
983 if( Kiface().IsSingle() )
984 {
985 auto* symbolEditor = (SYMBOL_EDIT_FRAME*) Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
986
987 if( symbolEditor && !symbolEditor->Close() ) // Can close symbol editor?
988 return false;
989
990 auto* symbolViewer = (SYMBOL_VIEWER_FRAME*) Kiway().Player( FRAME_SCH_VIEWER, false );
991
992 if( symbolViewer && !symbolViewer->Close() ) // Can close symbol viewer?
993 return false;
994
995 // SYMBOL_CHOOSER_FRAME is always modal so this shouldn't come up, but better safe than
996 // sorry.
997 auto* chooser = (SYMBOL_CHOOSER_FRAME*) Kiway().Player( FRAME_SYMBOL_CHOOSER, false );
998
999 if( chooser && !chooser->Close() ) // Can close symbol chooser?
1000 return false;
1001 }
1002 else
1003 {
1004 auto* symbolEditor = (SYMBOL_EDIT_FRAME*) Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
1005
1006 if( symbolEditor && symbolEditor->IsSymbolFromSchematic() )
1007 {
1008 if( !symbolEditor->CanCloseSymbolFromSchematic( true ) )
1009 return false;
1010 }
1011 }
1012
1013 if( !Kiway().PlayerClose( FRAME_SIMULATOR, false ) ) // Can close the simulator?
1014 return false;
1015
1017 && !m_symbolFieldsTableDialog->Close( false ) ) // Can close the symbol fields table?
1018 {
1019 return false;
1020 }
1021
1022 // We may have gotten multiple events; don't clean up twice
1023 if( !Schematic().IsValid() )
1024 return false;
1025
1026 if( IsContentModified() )
1027 {
1028 wxFileName fileName = Schematic().RootScreen()->GetFileName();
1029 wxString msg = _( "Save changes to '%s' before closing?" );
1030
1031 if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
1032 [&]() -> bool
1033 {
1034 return SaveProject();
1035 } ) )
1036 {
1037 return false;
1038 }
1039 }
1040
1041 return true;
1042}
1043
1044
1046{
1047 SCH_SHEET_LIST sheetlist = Schematic().Hierarchy();
1048
1049#ifdef KICAD_IPC_API
1050 Pgm().GetApiServer().DeregisterHandler( m_apiHandler.get() );
1051 wxTheApp->Unbind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED,
1052 &SCH_EDIT_FRAME::onPluginAvailabilityChanged, this );
1053#endif
1054
1055 // Shutdown all running tools
1056 if( m_toolManager )
1058
1059 // Close modeless dialogs. They're trouble when they get destroyed after the frame.
1060 Unbind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &SCH_EDIT_FRAME::onCloseSymbolDiffDialog, this );
1061 Unbind( EDA_EVT_CLOSE_ERC_DIALOG, &SCH_EDIT_FRAME::onCloseErcDialog, this );
1062 Unbind( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE,
1064 m_netNavigator->Unbind( wxEVT_TREE_SEL_CHANGING, &SCH_EDIT_FRAME::onNetNavigatorSelChanging,
1065 this );
1066 m_netNavigator->Unbind( wxEVT_TREE_SEL_CHANGED, &SCH_EDIT_FRAME::onNetNavigatorSelection,
1067 this );
1068
1069 // Close the find dialog and preserve its setting if it is displayed.
1071 {
1074
1075 m_findReplaceDialog->Destroy();
1076 m_findReplaceDialog = nullptr;
1077 }
1078
1079 if( m_diffSymbolDialog )
1080 {
1081 m_diffSymbolDialog->Destroy();
1082 m_diffSymbolDialog = nullptr;
1083 }
1084
1085 if( m_ercDialog )
1086 {
1087 m_ercDialog->Destroy();
1088 m_ercDialog = nullptr;
1089 }
1090
1092 {
1093 m_symbolFieldsTableDialog->Destroy();
1094 m_symbolFieldsTableDialog = nullptr;
1095 }
1096
1097 // Make sure local settings are persisted
1098 if( !Prj().GetLocalSettings().WasMigrated() )
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 wxEventBlocker blocker( this );
1198
1199 if( !frame )
1200 {
1201 wxFileName fn = Prj().GetProjectFullName();
1202 fn.SetExt( FILEEXT::PcbFileExtension );
1203
1204 frame = Kiway().Player( FRAME_PCB_EDITOR, true );
1205
1206 // If Kiway() cannot create the Pcbnew frame, it shows a error message, and
1207 // frame is null
1208 if( !frame )
1209 return;
1210
1211 frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
1212 }
1213
1214 if( !frame->IsVisible() )
1215 frame->Show( true );
1216
1217 // On Windows, Raise() does not bring the window on screen, when iconized
1218 if( frame->IsIconized() )
1219 frame->Iconize( false );
1220
1221 frame->Raise();
1222
1223 std::string payload;
1225}
1226
1227
1228void SCH_EDIT_FRAME::UpdateHierarchyNavigator( bool aRefreshNetNavigator )
1229{
1230 m_toolManager->GetTool<SCH_NAVIGATE_TOOL>()->CleanHistory();
1232
1233 if( aRefreshNetNavigator )
1235}
1236
1237
1239{
1240 // Update only the hierarchy navigation tree labels.
1241 // The tree list is expectyed to be up to date
1243}
1244
1245
1247{
1249}
1250
1251
1253{
1254 wxString findString;
1255
1256 EE_SELECTION& selection = m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
1257
1258 if( selection.Size() == 1 )
1259 {
1260 EDA_ITEM* front = selection.Front();
1261
1262 switch( front->Type() )
1263 {
1264 case SCH_SYMBOL_T:
1265 {
1266 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( front );
1267 findString = UnescapeString( symbol->GetField( VALUE_FIELD )->GetText() );
1268 break;
1269 }
1270
1271 case SCH_FIELD_T:
1272 findString = UnescapeString( static_cast<SCH_FIELD*>( front )->GetText() );
1273 break;
1274
1275 case SCH_LABEL_T:
1276 case SCH_GLOBAL_LABEL_T:
1277 case SCH_HIER_LABEL_T:
1278 case SCH_SHEET_PIN_T:
1279 findString = UnescapeString( static_cast<SCH_LABEL_BASE*>( front )->GetText() );
1280 break;
1281
1282 case SCH_TEXT_T:
1283 findString = UnescapeString( static_cast<SCH_TEXT*>( front )->GetText() );
1284
1285 if( findString.Contains( wxT( "\n" ) ) )
1286 findString = findString.Before( '\n' );
1287
1288 break;
1289
1290 default:
1291 break;
1292 }
1293 }
1294
1296 m_findReplaceDialog->Destroy();
1297
1299 static_cast<SCH_SEARCH_DATA*>( m_findReplaceData.get() ),
1300 wxDefaultPosition, wxDefaultSize,
1301 aReplace ? wxFR_REPLACEDIALOG : 0 );
1302
1305 m_findReplaceDialog->Show( true );
1306}
1307
1308
1309void SCH_EDIT_FRAME::ShowFindReplaceStatus( const wxString& aMsg, int aStatusTime )
1310{
1311 // Prepare the infobar, since we don't know its state
1314
1315 m_infoBar->ShowMessageFor( aMsg, aStatusTime, wxICON_INFORMATION );
1316}
1317
1318
1320{
1321 m_infoBar->Dismiss();
1322}
1323
1324
1326{
1329
1330 m_findReplaceDialog->Destroy();
1331 m_findReplaceDialog = nullptr;
1332
1334}
1335
1336
1337void SCH_EDIT_FRAME::OnLoadFile( wxCommandEvent& event )
1338{
1339 wxString fn = GetFileFromHistory( event.GetId(), _( "Schematic" ) );
1340
1341 if( fn.size() )
1342 OpenProjectFiles( std::vector<wxString>( 1, fn ) );
1343}
1344
1345
1346void SCH_EDIT_FRAME::OnClearFileHistory( wxCommandEvent& aEvent )
1347{
1349}
1350
1351
1353{
1354 // Only standalone mode can directly load a new document
1355 if( !Kiface().IsSingle() )
1356 return;
1357
1358 wxString pro_dir = m_mruPath;
1359
1360 wxFileDialog dlg( this, _( "New Schematic" ), pro_dir, wxEmptyString,
1362
1363 if( dlg.ShowModal() != wxID_CANCEL )
1364 {
1365 // Enforce the extension, wxFileDialog is inept.
1366 wxFileName create_me =
1368
1369 if( create_me.FileExists() )
1370 {
1371 wxString msg;
1372 msg.Printf( _( "Schematic file '%s' already exists." ), create_me.GetFullName() );
1373 DisplayError( this, msg );
1374 return ;
1375 }
1376
1377 // OpenProjectFiles() requires absolute
1378 wxASSERT_MSG( create_me.IsAbsolute(), wxS( "wxFileDialog returned non-absolute path" ) );
1379
1380 OpenProjectFiles( std::vector<wxString>( 1, create_me.GetFullPath() ), KICTL_CREATE );
1381 m_mruPath = create_me.GetPath();
1382 }
1383}
1384
1385
1387{
1388 // Only standalone mode can directly load a new document
1389 if( !Kiface().IsSingle() )
1390 return;
1391
1392 wxString pro_dir = m_mruPath;
1393 wxString wildcards = FILEEXT::AllSchematicFilesWildcard()
1395 + wxS( "|" ) + FILEEXT::LegacySchematicFileWildcard();
1396
1397 wxFileDialog dlg( this, _( "Open Schematic" ), pro_dir, wxEmptyString,
1398 wildcards, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
1399
1400 if( dlg.ShowModal() != wxID_CANCEL )
1401 {
1402 OpenProjectFiles( std::vector<wxString>( 1, dlg.GetPath() ) );
1404 }
1405}
1406
1407
1409{
1410 wxFileName kicad_board = Prj().AbsolutePath( Schematic().GetFileName() );
1411
1412 if( kicad_board.IsOk() && !Schematic().GetFileName().IsEmpty() )
1413 {
1414 kicad_board.SetExt( FILEEXT::PcbFileExtension );
1415 wxFileName legacy_board( kicad_board );
1416 legacy_board.SetExt( FILEEXT::LegacyPcbFileExtension );
1417 wxFileName& boardfn = legacy_board;
1418
1419 if( !legacy_board.FileExists() || kicad_board.FileExists() )
1420 boardfn = kicad_board;
1421
1422 if( Kiface().IsSingle() )
1423 {
1424 ExecuteFile( PCBNEW_EXE, boardfn.GetFullPath() );
1425 }
1426 else
1427 {
1428 wxEventBlocker blocker(this);
1429 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PCB_EDITOR, false );
1430
1431 if( !frame )
1432 {
1433 frame = Kiway().Player( FRAME_PCB_EDITOR, true );
1434
1435 // frame can be null if Cvpcb cannot be run. No need to show a warning
1436 // Kiway() generates the error messages
1437 if( !frame )
1438 return;
1439
1440 frame->OpenProjectFiles( std::vector<wxString>( 1, boardfn.GetFullPath() ) );
1441 }
1442
1443 if( !frame->IsVisible() )
1444 frame->Show( true );
1445
1446 // On Windows, Raise() does not bring the window on screen, when iconized
1447 if( frame->IsIconized() )
1448 frame->Iconize( false );
1449
1450 frame->Raise();
1451 }
1452 }
1453 else
1454 {
1455 // If we are running inside a project, it should be impossible for this case to happen
1456 wxASSERT( Kiface().IsSingle() );
1458 }
1459}
1460
1461
1463{
1464 wxFileName fn = Prj().AbsolutePath( Schematic().GetFileName() );
1465 fn.SetExt( FILEEXT::NetlistFileExtension );
1466
1467 if( !ReadyToNetlist( _( "Assigning footprints requires a fully annotated schematic." ) ) )
1468 return;
1469
1470 try
1471 {
1472 KIWAY_PLAYER* player = Kiway().Player( FRAME_CVPCB, false ); // test open already.
1473
1474 if( !player )
1475 {
1476 player = Kiway().Player( FRAME_CVPCB, true );
1477
1478 // player can be null if Cvpcb cannot be run. No need to show a warning
1479 // Kiway() generates the error messages
1480 if( !player )
1481 return;
1482
1483 player->Show( true );
1484 }
1485
1486 // Ensure the netlist (mainly info about symbols) is up to date
1489
1490 player->Raise();
1491 }
1492 catch( const IO_ERROR& )
1493 {
1494 DisplayError( this, _( "Could not open CvPcb" ) );
1495 }
1496}
1497
1498
1499void SCH_EDIT_FRAME::OnExit( wxCommandEvent& event )
1500{
1501 if( event.GetId() == wxID_EXIT )
1502 Kiway().OnKiCadExit();
1503
1504 if( event.GetId() == wxID_CLOSE || Kiface().IsSingle() )
1505 Close( false );
1506}
1507
1508
1510{
1511 wxString fileName = Prj().AbsolutePath( GetScreen()->GetFileName() );
1512 const SCH_RENDER_SETTINGS* cfg = static_cast<const SCH_RENDER_SETTINGS*>( aSettings );
1514
1515 cfg->GetPrintDC()->SetBackground( wxBrush( bg.ToColour() ) );
1516 cfg->GetPrintDC()->Clear();
1517
1518 cfg->GetPrintDC()->SetLogicalFunction( wxCOPY );
1519 GetScreen()->Print( cfg );
1520 PrintDrawingSheet( cfg, GetScreen(), Schematic().GetProperties(), schIUScale.IU_PER_MILS, fileName );
1521}
1522
1523
1525{
1527 SIM_LIB_MGR simLibMgr( &Prj() );
1528 NULL_REPORTER devnull;
1529
1530 // Patch for bug early in V7.99 dev
1531 if( settings.m_OPO_VRange.EndsWith( 'A' ) )
1532 settings.m_OPO_VRange[ settings.m_OPO_VRange.Length() - 1 ] = 'V';
1533
1534 // Update items which may have ${OP} text variables
1535 //
1537 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1538 {
1539 int flags = 0;
1540
1541 auto invalidateTextVars =
1542 [&flags]( EDA_TEXT* text )
1543 {
1544 if( text->HasTextVars() )
1545 {
1546 text->ClearRenderCache();
1547 text->ClearBoundingBoxCache();
1549 }
1550 };
1551
1552 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
1553 {
1554 item->RunOnChildren(
1555 [&invalidateTextVars]( SCH_ITEM* aChild )
1556 {
1557 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
1558 invalidateTextVars( text );
1559 } );
1560 }
1561
1562 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1563 invalidateTextVars( text );
1564
1565 return flags;
1566 } );
1567
1568 // Update OP overlay items
1569 //
1570 for( SCH_ITEM* item : GetScreen()->Items() )
1571 {
1573 continue;
1574
1575 if( item->Type() == SCH_LINE_T )
1576 {
1577 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1578
1579 if( !line->GetOperatingPoint().IsEmpty() )
1580 GetCanvas()->GetView()->Update( line );
1581
1582 line->SetOperatingPoint( wxEmptyString );
1583 // update value from netlist, below
1584 }
1585 else if( item->Type() == SCH_SYMBOL_T )
1586 {
1587 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1588 wxString ref = symbol->GetRef( &GetCurrentSheet() );
1589 std::vector<SCH_PIN*> pins = symbol->GetPins( &GetCurrentSheet() );
1590
1591 // Power symbols and other symbols which have the reference starting with "#" are
1592 // not included in simulation
1593 if( ref.StartsWith( '#' ) || symbol->GetExcludedFromSim() )
1594 continue;
1595
1596 for( SCH_PIN* pin : pins )
1597 {
1598 if( !pin->GetOperatingPoint().IsEmpty() )
1599 GetCanvas()->GetView()->Update( pin );
1600
1601 pin->SetOperatingPoint( wxEmptyString );
1602 }
1603
1604 if( pins.size() == 2 )
1605 {
1606 wxString op = m_schematic->GetOperatingPoint( ref, settings.m_OPO_IPrecision,
1607 settings.m_OPO_IRange );
1608
1609 if( !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1610 {
1611 pins[0]->SetOperatingPoint( op );
1612 GetCanvas()->GetView()->Update( symbol );
1613 }
1614 }
1615 else
1616 {
1617 SIM_MODEL& model = simLibMgr.CreateModel( &GetCurrentSheet(), *symbol,
1618 devnull ).model;
1619
1620 SPICE_ITEM spiceItem;
1621 spiceItem.refName = ref;
1622 ref = model.SpiceGenerator().ItemName( spiceItem );
1623
1624 for( const auto& modelPin : model.GetPins() )
1625 {
1626 SCH_PIN* symbolPin = symbol->GetPin( modelPin.get().symbolPinNumber );
1627 wxString signalName = ref + wxS( ":" ) + modelPin.get().modelPinName;
1628 wxString op = m_schematic->GetOperatingPoint( signalName,
1629 settings.m_OPO_IPrecision,
1630 settings.m_OPO_IRange );
1631
1632 if( symbolPin && !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1633 {
1634 symbolPin->SetOperatingPoint( op );
1635 GetCanvas()->GetView()->Update( symbol );
1636 }
1637 }
1638 }
1639 }
1640 }
1641
1642 for( const auto& [ key, subgraphList ] : m_schematic->m_connectionGraph->GetNetMap() )
1643 {
1644 wxString op = m_schematic->GetOperatingPoint( key.Name, settings.m_OPO_VPrecision,
1645 settings.m_OPO_VRange );
1646
1647 if( !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1648 {
1649 for( CONNECTION_SUBGRAPH* subgraph : subgraphList )
1650 {
1651 SCH_LINE* longestWire = nullptr;
1652 double length = 0.0;
1653
1654 if( subgraph->GetSheet().GetExcludedFromSim() )
1655 continue;
1656
1657 for( SCH_ITEM* item : subgraph->GetItems() )
1658 {
1659 if( item->Type() == SCH_LINE_T )
1660 {
1661 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1662
1663 if( line->IsWire() && line->GetLength() > length )
1664 {
1665 longestWire = line;
1666 length = line->GetLength();
1667 }
1668 }
1669 }
1670
1671 if( longestWire )
1672 {
1673 longestWire->SetOperatingPoint( op );
1674 GetCanvas()->GetView()->Update( longestWire );
1675 }
1676 }
1677 }
1678 }
1679}
1680
1681
1683{
1684 if( aItem->Type() == SCH_GLOBAL_LABEL_T || aItem->Type() == SCH_HIER_LABEL_T )
1685 {
1686 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( aItem );
1687
1688 if( label->AutoRotateOnPlacement() )
1689 {
1690 SPIN_STYLE spin = aScreen->GetLabelOrientationForPoint( label->GetPosition(),
1691 label->GetSpinStyle(),
1692 &GetCurrentSheet() );
1693
1694 if( spin != label->GetSpinStyle() )
1695 {
1696 label->SetSpinStyle( spin );
1697
1698 for( SCH_ITEM* item : aScreen->Items().OfType( SCH_GLOBAL_LABEL_T ) )
1699 {
1700 SCH_LABEL_BASE* otherLabel = static_cast<SCH_LABEL_BASE*>( item );
1701
1702 if( otherLabel != label && otherLabel->GetText() == label->GetText() )
1703 otherLabel->AutoplaceFields( aScreen, AUTOPLACE_AUTO );
1704 }
1705 }
1706 }
1707 }
1708}
1709
1710
1712{
1713 SCH_SCREEN* screen = GetScreen();
1714
1715 wxCHECK( screen, /* void */ );
1716
1717 wxString title;
1718
1719 if( !screen->GetFileName().IsEmpty() )
1720 {
1721 wxFileName fn( Prj().AbsolutePath( screen->GetFileName() ) );
1722 bool readOnly = false;
1723 bool unsaved = false;
1724
1725 if( fn.IsOk() && screen->FileExists() )
1726 readOnly = screen->IsReadOnly();
1727 else
1728 unsaved = true;
1729
1730 if( IsContentModified() )
1731 title = wxT( "*" );
1732
1733 title += fn.GetName();
1734
1735 wxString sheetPath = GetCurrentSheet().PathHumanReadable( false, true );
1736
1737 if( sheetPath != title )
1738 title += wxString::Format( wxT( " [%s]" ), sheetPath );
1739
1740 if( readOnly )
1741 title += wxS( " " ) + _( "[Read Only]" );
1742
1743 if( unsaved )
1744 title += wxS( " " ) + _( "[Unsaved]" );
1745 }
1746 else
1747 {
1748 title = _( "[no schematic loaded]" );
1749 }
1750
1751 title += wxT( " \u2014 " ) + _( "Schematic Editor" );
1752
1753 SetTitle( title );
1754}
1755
1756
1758{
1760 GetScreen()->m_zoomInitialized = true;
1761}
1762
1763
1765{
1766 wxString highlightedConn = GetHighlightedConnection();
1767 bool hasHighlightedConn = !highlightedConn.IsEmpty();
1768 SCHEMATIC_SETTINGS& settings = Schematic().Settings();
1770 SCH_COMMIT localCommit( m_toolManager );
1771
1772 if( !aCommit )
1773 aCommit = &localCommit;
1774
1775 PROF_TIMER timer;
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 timer.Stop();
1789 wxLogTrace( "CONN_PROFILE", "SchematicCleanUp() %0.4f ms", timer.msecs() );
1790
1791 if( settings.m_IntersheetRefsShow )
1793
1794 std::function<void( SCH_ITEM* )> changeHandler =
1795 [&]( SCH_ITEM* aChangedItem ) -> void
1796 {
1797 GetCanvas()->GetView()->Update( aChangedItem, KIGFX::REPAINT );
1798
1799 SCH_CONNECTION* connection = aChangedItem->Connection();
1800
1802 return;
1803
1804 if( !hasHighlightedConn )
1805 {
1806 // No highlighted connection, but connectivity has changed, so refresh
1807 // the list of all nets
1809 }
1810 else if( connection
1811 && ( connection->Name() == highlightedConn
1812 || connection->HasDriverChanged() ) )
1813 {
1815 }
1816 };
1817
1818 if( !ADVANCED_CFG::GetCfg().m_IncrementalConnectivity || aCleanupFlags == GLOBAL_CLEANUP
1819 || m_undoList.m_CommandsList.empty()|| Schematic().ConnectionGraph()->IsMinor() )
1820 {
1821 // Clear all resolved netclass caches in case labels have changed
1822 Prj().GetProjectFile().NetSettings()->ClearAllCaches();
1823
1824 // Update all rule areas so we can cascade implied connectivity changes
1825 std::unordered_set<SCH_SCREEN*> all_screens;
1826
1827 for( const SCH_SHEET_PATH& path : list )
1828 all_screens.insert( path.LastScreen() );
1829
1830 SCH_RULE_AREA::UpdateRuleAreasInScreens( all_screens, GetCanvas()->GetView() );
1831
1832 // Recalculate all connectivity
1833 Schematic().ConnectionGraph()->Recalculate( list, true, &changeHandler );
1834 }
1835 else
1836 {
1837 struct CHANGED_ITEM
1838 {
1839 SCH_ITEM* item;
1840 SCH_ITEM* linked_item;
1841 SCH_SCREEN* screen;
1842 };
1843
1844 PICKED_ITEMS_LIST* changed_list = m_undoList.m_CommandsList.back();
1845
1846 // Final change sets
1847 std::set<SCH_ITEM*> changed_items;
1848 std::set<VECTOR2I> pts;
1849 std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> item_paths;
1850
1851 // Working change sets
1852 std::unordered_set<SCH_SCREEN*> changed_screens;
1853 std::set<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> changed_rule_areas;
1854 std::vector<CHANGED_ITEM> changed_connectable_items;
1855
1856 // Lambda to add an item to the connectivity update sets
1857 auto addItemToChangeSet = [&changed_items, &pts, &item_paths]( CHANGED_ITEM itemData )
1858 {
1859 std::vector<SCH_SHEET_PATH>& paths = itemData.screen->GetClientSheetPaths();
1860
1861 std::vector<VECTOR2I> tmp_pts = itemData.item->GetConnectionPoints();
1862 pts.insert( tmp_pts.begin(), tmp_pts.end() );
1863 changed_items.insert( itemData.item );
1864
1865 for( SCH_SHEET_PATH& path : paths )
1866 item_paths.insert( std::make_pair( path, itemData.item ) );
1867
1868 if( !itemData.linked_item || !itemData.linked_item->IsConnectable() )
1869 return;
1870
1871 tmp_pts = itemData.linked_item->GetConnectionPoints();
1872 pts.insert( tmp_pts.begin(), tmp_pts.end() );
1873 changed_items.insert( itemData.linked_item );
1874
1875 // We have to directly add the pins here because the link may not exist on the schematic
1876 // anymore and so won't be picked up by GetScreen()->Items().Overlapping() below.
1877 if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( itemData.linked_item ) )
1878 {
1879 std::vector<SCH_PIN*> pins = symbol->GetPins();
1880 changed_items.insert( pins.begin(), pins.end() );
1881 }
1882
1883 for( SCH_SHEET_PATH& path : paths )
1884 item_paths.insert( std::make_pair( path, itemData.linked_item ) );
1885 };
1886
1887 // Get all changed connectable items and determine all changed screens
1888 for( unsigned ii = 0; ii < changed_list->GetCount(); ++ii )
1889 {
1890 switch( changed_list->GetPickedItemStatus( ii ) )
1891 {
1892 // Only care about changed, new, and deleted items, the other
1893 // cases are not connectivity-related
1894 case UNDO_REDO::CHANGED:
1895 case UNDO_REDO::NEWITEM:
1896 case UNDO_REDO::DELETED:
1897 break;
1898
1899 default:
1900 continue;
1901 }
1902
1903 SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( changed_list->GetPickedItem( ii ) );
1904
1905 if( item )
1906 {
1907 SCH_SCREEN* screen =
1908 static_cast<SCH_SCREEN*>( changed_list->GetScreenForItem( ii ) );
1909 changed_screens.insert( screen );
1910
1911 if( item->Type() == SCH_RULE_AREA_T )
1912 {
1913 SCH_RULE_AREA* ruleArea = static_cast<SCH_RULE_AREA*>( item );
1914
1915 // Clear item and directive associations for this rule area
1916 ruleArea->ResetDirectivesAndItems( GetCanvas()->GetView() );
1917
1918 changed_rule_areas.insert( { ruleArea, screen } );
1919 }
1920 else if( item->IsConnectable() )
1921 {
1922 SCH_ITEM* linked_item =
1923 dynamic_cast<SCH_ITEM*>( changed_list->GetPickedItemLink( ii ) );
1924 changed_connectable_items.push_back( { item, linked_item, screen } );
1925 }
1926 }
1927 }
1928
1929 // Update rule areas in changed screens to propagate any directive connectivity changes
1930 std::vector<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> forceUpdateRuleAreas =
1931 SCH_RULE_AREA::UpdateRuleAreasInScreens( changed_screens, GetCanvas()->GetView() );
1932
1933 std::for_each( forceUpdateRuleAreas.begin(), forceUpdateRuleAreas.end(),
1934 [&]( std::pair<SCH_RULE_AREA*, SCH_SCREEN*>& updatedRuleArea )
1935 {
1936 changed_rule_areas.insert( updatedRuleArea );
1937 } );
1938
1939 // If a SCH_RULE_AREA was changed, we need to add all past and present contained items to
1940 // update their connectivity
1941 for( const std::pair<SCH_RULE_AREA*, SCH_SCREEN*>& changedRuleArea : changed_rule_areas )
1942 {
1943 for( SCH_ITEM* containedItem :
1944 changedRuleArea.first->GetPastAndPresentContainedItems() )
1945 {
1946 addItemToChangeSet( { containedItem, nullptr, changedRuleArea.second } );
1947 }
1948 }
1949
1950 // Add all changed items, and associated items, to the change set
1951 for( CHANGED_ITEM& changed_item_data : changed_connectable_items )
1952 {
1953 addItemToChangeSet( changed_item_data );
1954
1955 // If a SCH_DIRECTIVE_LABEL was changed which is attached to a SCH_RULE_AREA, we need
1956 // to add the contained items to the change set to force update of their connectivity
1957 if( changed_item_data.item->Type() == SCH_DIRECTIVE_LABEL_T )
1958 {
1959 const std::vector<VECTOR2I> labelConnectionPoints =
1960 changed_item_data.item->GetConnectionPoints();
1961
1962 EE_RTREE::EE_TYPE candidateRuleAreas =
1963 changed_item_data.screen->Items().Overlapping(
1964 SCH_RULE_AREA_T, changed_item_data.item->GetBoundingBox() );
1965
1966 for( SCH_ITEM* candidateRuleArea : candidateRuleAreas )
1967 {
1968 SCH_RULE_AREA* ruleArea = static_cast<SCH_RULE_AREA*>( candidateRuleArea );
1969 std::vector<SHAPE*> borderShapes = ruleArea->MakeEffectiveShapes( true );
1970
1971 if( ruleArea->GetPolyShape().CollideEdge( labelConnectionPoints[0], nullptr,
1972 5 ) )
1973 {
1974 for( SCH_ITEM* containedItem : ruleArea->GetPastAndPresentContainedItems() )
1975 addItemToChangeSet(
1976 { containedItem, nullptr, changed_item_data.screen } );
1977 }
1978 }
1979 }
1980 }
1981
1982 for( const VECTOR2I& pt: pts )
1983 {
1984 for( SCH_ITEM* item : GetScreen()->Items().Overlapping( pt ) )
1985 {
1986 // Leave this check in place. Overlapping items are not necessarily connectable.
1987 if( !item->IsConnectable() )
1988 continue;
1989
1990 if( item->Type() == SCH_LINE_T )
1991 {
1992 if( item->HitTest( pt ) )
1993 changed_items.insert( item );
1994 }
1995 else if( item->Type() == SCH_SYMBOL_T && item->IsConnected( pt ) )
1996 {
1997 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1998 std::vector<SCH_PIN*> pins = symbol->GetPins();
1999
2000 changed_items.insert( pins.begin(), pins.end() );
2001 }
2002 else if( item->Type() == SCH_SHEET_T )
2003 {
2004 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
2005
2006 wxCHECK2( sheet, continue );
2007
2008 std::vector<SCH_SHEET_PIN*> sheetPins = sheet->GetPins();
2009 changed_items.insert( sheetPins.begin(), sheetPins.end() );
2010 }
2011 else
2012 {
2013 if( item->IsConnected( pt ) )
2014 changed_items.insert( item );
2015 }
2016 }
2017 }
2018
2019 std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> all_items =
2020 Schematic().ConnectionGraph()->ExtractAffectedItems( changed_items );
2021
2022 all_items.insert( item_paths.begin(), item_paths.end() );
2023
2024 CONNECTION_GRAPH new_graph( &Schematic() );
2025
2026 new_graph.SetLastCodes( Schematic().ConnectionGraph() );
2027
2028 std::shared_ptr<NET_SETTINGS> netSettings = Prj().GetProjectFile().NetSettings();
2029
2030 std::set<wxString> affectedNets;
2031
2032 for( auto&[ path, item ] : all_items )
2033 {
2034 wxCHECK2( item, continue );
2035 item->SetConnectivityDirty();
2036 SCH_CONNECTION* conn = item->Connection();
2037
2038 if( conn )
2039 {
2040 affectedNets.insert( conn->Name() );
2041 }
2042 }
2043
2044 // Reset resolved netclass cache for this connection
2045 for( const wxString& netName : affectedNets )
2046 netSettings->ClearCacheForNet( netName );
2047
2048 new_graph.Recalculate( list, false, &changeHandler );
2049 Schematic().ConnectionGraph()->Merge( new_graph );
2050 }
2051
2053 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
2054 {
2055 int flags = 0;
2056 SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem );
2057 SCH_CONNECTION* connection = item ? item->Connection() : nullptr;
2058
2059 auto invalidateTextVars =
2060 [&flags]( EDA_TEXT* text )
2061 {
2062 if( text->HasTextVars() )
2063 {
2064 text->ClearRenderCache();
2065 text->ClearBoundingBoxCache();
2067 }
2068 };
2069
2070 if( connection && connection->HasDriverChanged() )
2071 {
2072 connection->ClearDriverChanged();
2073 flags |= KIGFX::REPAINT;
2074 }
2075
2076 if( item )
2077 {
2078 item->RunOnChildren(
2079 [&invalidateTextVars]( SCH_ITEM* aChild )
2080 {
2081 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
2082 invalidateTextVars( text );
2083 } );
2084
2085 if( flags & KIGFX::GEOMETRY )
2086 GetScreen()->Update( item, false ); // Refresh RTree
2087 }
2088
2089 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
2090 invalidateTextVars( text );
2091
2092 return flags;
2093 } );
2094
2096 || !Schematic().ConnectionGraph()->FindFirstSubgraphByName( highlightedConn ) )
2097 {
2101 }
2102
2103 if( !localCommit.Empty() )
2104 localCommit.Push( _( "Schematic Cleanup" ) );
2105}
2106
2107
2109{
2111 {
2112 for( SCH_FIELD& field : label->GetFields() )
2113 field.ClearBoundingBoxCache();
2114
2115 label->ClearBoundingBoxCache();
2116 GetCanvas()->GetView()->Update( label );
2117 } );
2118}
2119
2120
2122{
2124
2126}
2127
2128
2129std::unique_ptr<GRID_HELPER> SCH_EDIT_FRAME::MakeGridHelper()
2130{
2131 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
2132}
2133
2134
2135void SCH_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
2136{
2137 SCH_BASE_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
2138
2139 SCHEMATIC_SETTINGS& settings = Schematic().Settings();
2140
2142
2144
2146 EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
2149
2150 KIGFX::VIEW* view = GetCanvas()->GetView();
2156
2158
2159 settings.m_TemplateFieldNames.DeleteAllFieldNameTemplates( true /* global */ );
2160
2161 if( !cfg->m_Drawing.field_names.IsEmpty() )
2163
2165
2166 for( SCH_ITEM* item : screen->Items() )
2167 item->ClearCaches();
2168
2169 for( const auto& [ libItemName, libSymbol ] : screen->GetLibSymbols() )
2170 libSymbol->ClearCaches();
2171
2173
2175 Layout();
2176 SendSizeEvent();
2177}
2178
2179
2181{
2182 // Store the current zoom level into the current screen before calling
2183 // DisplayCurrentSheet() that set the zoom to GetScreen()->m_LastZoomLevel
2185
2186 // Rebuild the sheet view (draw area and any other items):
2188}
2189
2190
2192{
2193 // call my base class
2195
2196 // tooltips in toolbars
2198
2199 m_auimgr.GetPane( m_hierarchy ).Caption( _( "Schematic Hierarchy" ) );
2200 m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
2201 m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
2202 m_auimgr.Update();
2204
2205 // status bar
2207
2208 updateTitle();
2209
2210 // This ugly hack is to fix an option(left) toolbar update bug that seems to only affect
2211 // windows. See https://bugs.launchpad.net/kicad/+bug/1816492. For some reason, calling
2212 // wxWindow::Refresh() does not resolve the issue. Only a resize event seems to force the
2213 // toolbar to update correctly.
2214#if defined( __WXMSW__ )
2215 PostSizeEvent();
2216#endif
2217}
2218
2219
2221{
2222 if( !GetHighlightedConnection().IsEmpty() )
2223 {
2224 SetStatusText( wxString::Format( _( "Highlighted net: %s" ),
2226 }
2227 else
2228 {
2229 SetStatusText( wxT( "" ) );
2230 }
2231}
2232
2233
2235{
2236 if( m_toolManager )
2238
2239 SCH_BASE_FRAME::SetScreen( aScreen );
2240 GetCanvas()->DisplaySheet( static_cast<SCH_SCREEN*>( aScreen ) );
2241
2242 if( m_toolManager )
2244}
2245
2246
2247const BOX2I SCH_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
2248{
2249 BOX2I bBoxDoc;
2250
2251 if( aIncludeAllVisible )
2252 {
2253 // Get the whole page size and return that
2256 bBoxDoc = BOX2I( VECTOR2I( 0, 0 ), VECTOR2I( sizeX, sizeY ) );
2257 }
2258 else
2259 {
2260 // Get current drawing-sheet in a form we can compare to an EDA_ITEM
2262 EDA_ITEM* dsAsItem = static_cast<EDA_ITEM*>( ds );
2263
2264 // Calc the bounding box of all items on screen except the page border
2265 for( EDA_ITEM* item : GetScreen()->Items() )
2266 {
2267 if( item != dsAsItem ) // Ignore the drawing-sheet itself
2268 bBoxDoc.Merge( item->GetBoundingBox() );
2269 }
2270 }
2271
2272 return bBoxDoc;
2273}
2274
2275
2277{
2278 return Schematic().Hierarchy().IsModified();
2279}
2280
2281
2283{
2284 EESCHEMA_SETTINGS* cfg = eeconfig();
2285 return cfg && cfg->m_Appearance.show_hidden_pins;
2286}
2287
2288
2290{
2291 static KIID lastBrightenedItemID( niluuid );
2292
2294 SCH_ITEM* lastItem = Schematic().GetItem( lastBrightenedItemID, &dummy );
2295
2296 if( lastItem && lastItem != aItem )
2297 {
2298 lastItem->ClearBrightened();
2299
2300 UpdateItem( lastItem );
2301 lastBrightenedItemID = niluuid;
2302 }
2303
2304 if( aItem )
2305 {
2306 if( !aItem->IsBrightened() )
2307 {
2308 aItem->SetBrightened();
2309
2310 UpdateItem( aItem );
2311 lastBrightenedItemID = aItem->m_Uuid;
2312 }
2313
2315 }
2316}
2317
2318
2320{
2321 return Schematic().GetFileName();
2322}
2323
2324
2326{
2327 return m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
2328}
2329
2330
2331void SCH_EDIT_FRAME::onSize( wxSizeEvent& aEvent )
2332{
2333 if( IsShown() )
2334 {
2335 // We only need this until the frame is done resizing and the final client size is
2336 // established.
2337 Unbind( wxEVT_SIZE, &SCH_EDIT_FRAME::onSize, this );
2339 }
2340
2341 // Skip() is called in the base class.
2342 EDA_DRAW_FRAME::OnSize( aEvent );
2343}
2344
2345
2347 const KIID& aSchematicSymbolUUID )
2348{
2349 SCH_SHEET_PATH principalPath;
2350 SCH_SHEET_LIST sheets = Schematic().Hierarchy();
2351 SCH_ITEM* item = sheets.GetItem( aSchematicSymbolUUID, &principalPath );
2352 SCH_SYMBOL* principalSymbol = dynamic_cast<SCH_SYMBOL*>( item );
2353 SCH_COMMIT commit( m_toolManager );
2354
2355 if( !principalSymbol )
2356 return;
2357
2358 wxString principalRef;
2359
2360 if( principalSymbol->IsAnnotated( &principalPath ) )
2361 principalRef = principalSymbol->GetRef( &principalPath, false );
2362
2363 std::vector< std::pair<SCH_SYMBOL*, SCH_SHEET_PATH> > allUnits;
2364
2365 for( const SCH_SHEET_PATH& path : sheets )
2366 {
2367 for( SCH_ITEM* candidate : path.LastScreen()->Items().OfType( SCH_SYMBOL_T ) )
2368 {
2369 SCH_SYMBOL* candidateSymbol = static_cast<SCH_SYMBOL*>( candidate );
2370
2371 if( candidateSymbol == principalSymbol
2372 || ( candidateSymbol->IsAnnotated( &path )
2373 && candidateSymbol->GetRef( &path, false ) == principalRef ) )
2374 {
2375 allUnits.emplace_back( candidateSymbol, path );
2376 }
2377 }
2378 }
2379
2380 for( auto& [ unit, path ] : allUnits )
2381 {
2382 // This needs to be done before the LIB_SYMBOL is changed to prevent stale
2383 // library symbols in the schematic file.
2384 path.LastScreen()->Remove( unit );
2385
2386 if( !unit->IsNew() )
2387 commit.Modify( unit, path.LastScreen() );
2388
2389 unit->SetLibSymbol( aSymbol.Flatten().release() );
2390 unit->UpdateFields( &GetCurrentSheet(),
2391 true, /* update style */
2392 true, /* update ref */
2393 true, /* update other fields */
2394 false, /* reset ref */
2395 false /* reset other fields */ );
2396
2397 path.LastScreen()->Append( unit );
2398 GetCanvas()->GetView()->Update( unit );
2399 }
2400
2401 if( !commit.Empty() )
2402 commit.Push( _( "Save Symbol to Schematic" ) );
2403}
2404
2405
2406void SCH_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
2407{
2408 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
2409
2410 if( SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( aItem ) )
2411 sch_item->ClearCaches();
2412}
2413
2414
2416{
2417 wxCHECK( m_toolManager, /* void */ );
2418
2422
2423 wxCHECK( screen, /* void */ );
2424
2426
2427 SCH_BASE_FRAME::SetScreen( screen );
2428
2429 SetSheetNumberAndCount(); // will also update CurrentScreen()'s sheet number info
2430
2432
2433 // update the references, units, and intersheet-refs
2435
2436 // dangling state can also have changed if different units with different pin locations are
2437 // used
2440
2442
2443 wxCHECK( selectionTool, /* void */ );
2444
2445 auto visit =
2446 [&]( EDA_ITEM* item )
2447 {
2449 && !m_findReplaceData->findString.IsEmpty()
2450 && item->Matches( *m_findReplaceData, &GetCurrentSheet() ) )
2451 {
2452 item->SetForceVisible( true );
2453 selectionTool->BrightenItem( item );
2454 }
2455 else if( item->IsBrightened() )
2456 {
2457 item->SetForceVisible( false );
2458 selectionTool->UnbrightenItem( item );
2459 }
2460 };
2461
2462 for( SCH_ITEM* item : screen->Items() )
2463 {
2464 visit( item );
2465
2466 item->RunOnChildren(
2467 [&]( SCH_ITEM* aChild )
2468 {
2469 visit( aChild );
2470 } );
2471 }
2472
2473 if( !screen->m_zoomInitialized )
2474 {
2476 }
2477 else
2478 {
2479 // Set zoom to last used in this screen
2480 GetCanvas()->GetView()->SetScale( GetScreen()->m_LastZoomLevel );
2481 GetCanvas()->GetView()->SetCenter( GetScreen()->m_ScrollCenter );
2482 }
2483
2484 updateTitle();
2485
2486 HardRedraw(); // Ensure all items are redrawn (especially the drawing-sheet items)
2487
2488 // Allow tools to re-add their VIEW_ITEMs after the last call to Clear in HardRedraw
2490
2492
2493 wxCHECK( editTool, /* void */ );
2494
2496 editTool->UpdateNetHighlighting( dummy );
2497
2499
2501}
2502
2503
2505{
2506 if( !m_diffSymbolDialog )
2508 _( "Compare Symbol with Library" ) );
2509
2510 return m_diffSymbolDialog;
2511}
2512
2513
2514void SCH_EDIT_FRAME::onCloseSymbolDiffDialog( wxCommandEvent& aEvent )
2515{
2516 if( m_diffSymbolDialog && aEvent.GetString() == DIFF_SYMBOLS_DIALOG_NAME )
2517 {
2518 m_diffSymbolDialog->Destroy();
2519 m_diffSymbolDialog = nullptr;
2520 }
2521}
2522
2523
2525{
2526 if( !m_ercDialog )
2527 m_ercDialog = new DIALOG_ERC( this );
2528
2529 return m_ercDialog;
2530}
2531
2532
2533void SCH_EDIT_FRAME::onCloseErcDialog( wxCommandEvent& aEvent )
2534{
2535 if( m_ercDialog )
2536 {
2537 m_ercDialog->Destroy();
2538 m_ercDialog = nullptr;
2539 }
2540}
2541
2542
2544{
2547
2549}
2550
2551
2553{
2555 {
2556 m_symbolFieldsTableDialog->Destroy();
2557 m_symbolFieldsTableDialog = nullptr;
2558 }
2559}
2560
2561
2562void SCH_EDIT_FRAME::AddSchematicChangeListener( wxEvtHandler* aListener )
2563{
2564 auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(),
2565 aListener );
2566
2567 // Don't add duplicate listeners.
2568 if( it == m_schematicChangeListeners.end() )
2569 m_schematicChangeListeners.push_back( aListener );
2570}
2571
2572
2574{
2575 auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(),
2576 aListener );
2577
2578 // Don't add duplicate listeners.
2579 if( it != m_schematicChangeListeners.end() )
2580 m_schematicChangeListeners.erase( it );
2581}
2582
2583
2585{
2586 m_netNavigator = new wxTreeCtrl( this, wxID_ANY, wxPoint( 0, 0 ),
2587 FromDIP( wxSize( 160, 250 ) ),
2588 wxTR_DEFAULT_STYLE | wxNO_BORDER );
2589
2590 return m_netNavigator;
2591}
2592
2593
2594void SCH_EDIT_FRAME::SetHighlightedConnection( const wxString& aConnection,
2595 const NET_NAVIGATOR_ITEM_DATA* aSelection )
2596{
2597 bool refreshNetNavigator = aConnection != m_highlightedConn;
2598
2599 m_highlightedConn = aConnection;
2600
2601 if( refreshNetNavigator )
2602 RefreshNetNavigator( aSelection );
2603}
2604
2605
2607{
2608 if( m_netNavigator )
2609 {
2610 NET_NAVIGATOR_ITEM_DATA itemData;
2611 wxTreeItemId selection = m_netNavigator->GetSelection();
2612 bool refreshSelection = selection.IsOk() && ( selection != m_netNavigator->GetRootItem() );
2613
2614 if( refreshSelection )
2615 {
2617 dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( selection ) );
2618
2619 wxCHECK( tmp, /* void */ );
2620 itemData = *tmp;
2621 }
2622
2623 m_netNavigator->DeleteAllItems();
2624 RefreshNetNavigator( refreshSelection ? &itemData : nullptr );
2625 }
2626
2628}
2629
2630
2632{
2633 wxAuiPaneInfo& hierarchyPane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
2634 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
2635 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
2636 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
2637
2638 // Don't give the selection filter its own visibility controls; instead show it if
2639 // anything else is visible
2640 bool showFilter = ( hierarchyPane.IsShown() && hierarchyPane.IsDocked() )
2641 || ( netNavigatorPane.IsShown() && netNavigatorPane.IsDocked() )
2642 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
2643
2644 selectionFilterPane.Show( showFilter );
2645}
2646
2647#ifdef KICAD_IPC_API
2648void SCH_EDIT_FRAME::onPluginAvailabilityChanged( wxCommandEvent& aEvt )
2649{
2650 wxLogTrace( traceApi, "SCH frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" );
2652 aEvt.Skip();
2653}
2654#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:187
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION cancelInteractive
Definition: actions.h:65
static TOOL_ACTION millimetersUnits
Definition: actions.h:195
static TOOL_ACTION unselectAll
Definition: actions.h:76
static TOOL_ACTION copy
Definition: actions.h:71
static TOOL_ACTION updateFind
Definition: actions.h:116
static TOOL_ACTION pasteSpecial
Definition: actions.h:74
static TOOL_ACTION milsUnits
Definition: actions.h:194
static TOOL_ACTION toggleBoundingBoxes
Definition: actions.h:147
static TOOL_ACTION showSearch
Definition: actions.h:108
static TOOL_ACTION undo
Definition: actions.h:68
static TOOL_ACTION duplicate
Definition: actions.h:77
static TOOL_ACTION inchesUnits
Definition: actions.h:193
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:144
static TOOL_ACTION doDelete
Definition: actions.h:78
static TOOL_ACTION selectionTool
Definition: actions.h:202
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION zoomFitScreen
Definition: actions.h:134
static TOOL_ACTION redo
Definition: actions.h:69
static TOOL_ACTION deleteTool
Definition: actions.h:79
static TOOL_ACTION zoomTool
Definition: actions.h:138
static TOOL_ACTION showProperties
Definition: actions.h:216
static TOOL_ACTION cut
Definition: actions.h:70
static TOOL_ACTION copyAsText
Definition: actions.h:72
static TOOL_ACTION toggleGridOverrides
Definition: actions.h:188
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:196
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)
Modify a given item in the model.
Definition: commit.h:108
bool Empty() const
Definition: commit.h:150
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
Return 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)
Remove all files from the file history.
virtual void OnSize(wxSizeEvent &aEvent)
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handle event fired when a file is dropped to the window.
wxString GetFileFromHistory(int cmdId, const wxString &type, FILE_HISTORY *aFileHistory=nullptr)
Fetch 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
The current canvas type.
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)
Print 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:251
const KIID m_Uuid
Definition: eda_item.h:490
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:291
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:80
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:98
virtual void ClearBoundingBoxCache()
Definition: eda_text.cpp:655
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 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:39
static TOOL_ACTION drawSheetFromFile
Definition: ee_actions.h:94
static TOOL_ACTION mirrorV
Definition: ee_actions.h:132
static TOOL_ACTION drawSheetFromDesignBlock
Definition: ee_actions.h:95
static TOOL_ACTION remapSymbols
Definition: ee_actions.h:176
static TOOL_ACTION selectionActivate
Activation of the selection tool.
Definition: ee_actions.h:46
static TOOL_ACTION toggleAnnotateAuto
Definition: ee_actions.h:284
static TOOL_ACTION placeDesignBlock
Definition: ee_actions.h:82
static TOOL_ACTION lineMode90
Definition: ee_actions.h:279
static TOOL_ACTION toggleHiddenPins
Definition: ee_actions.h:247
static TOOL_ACTION drawTable
Definition: ee_actions.h:104
static TOOL_ACTION placeSymbol
Definition: ee_actions.h:79
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:56
static TOOL_ACTION toggleERCWarnings
Definition: ee_actions.h:252
static TOOL_ACTION drawRuleArea
Definition: ee_actions.h:113
static TOOL_ACTION toggleERCExclusions
Definition: ee_actions.h:254
static TOOL_ACTION placeClassLabel
Definition: ee_actions.h:90
static TOOL_ACTION drawWire
Definition: ee_actions.h:83
static TOOL_ACTION drawCircle
Definition: ee_actions.h:106
static TOOL_ACTION rotateCCW
Definition: ee_actions.h:131
static TOOL_ACTION lineModeFree
Definition: ee_actions.h:278
static TOOL_ACTION drawBus
Definition: ee_actions.h:84
static TOOL_ACTION toggleERCErrors
Definition: ee_actions.h:253
static TOOL_ACTION placePower
Definition: ee_actions.h:81
static TOOL_ACTION placeSheetPin
Definition: ee_actions.h:96
static TOOL_ACTION drawLines
Definition: ee_actions.h:109
static TOOL_ACTION toggleOPCurrents
Definition: ee_actions.h:257
static TOOL_ACTION mirrorH
Definition: ee_actions.h:133
static TOOL_ACTION highlightNetTool
Definition: ee_actions.h:311
static TOOL_ACTION updateNetHighlighting
Definition: ee_actions.h:310
static TOOL_ACTION syncSheetPins
Definition: ee_actions.h:99
static TOOL_ACTION rotateCW
Definition: ee_actions.h:130
static TOOL_ACTION togglePinAltIcons
Definition: ee_actions.h:258
static TOOL_ACTION leaveSheet
Definition: ee_actions.h:233
static TOOL_ACTION toggleHiddenFields
Definition: ee_actions.h:248
static TOOL_ACTION placeGlobalLabel
Definition: ee_actions.h:91
static TOOL_ACTION ddAppendFile
Definition: ee_actions.h:315
static TOOL_ACTION placeHierLabel
Definition: ee_actions.h:92
static TOOL_ACTION drawTextBox
Definition: ee_actions.h:103
static TOOL_ACTION showNetNavigator
Definition: ee_actions.h:312
static TOOL_ACTION drawRectangle
Definition: ee_actions.h:105
static TOOL_ACTION placeImage
Definition: ee_actions.h:110
static TOOL_ACTION toggleDirectiveLabels
Definition: ee_actions.h:251
static TOOL_ACTION showHierarchy
Definition: ee_actions.h:239
static TOOL_ACTION placeSchematicText
Definition: ee_actions.h:102
static TOOL_ACTION toggleOPVoltages
Definition: ee_actions.h:256
static TOOL_ACTION showDesignBlockPanel
Definition: ee_actions.h:206
static TOOL_ACTION drawArc
Definition: ee_actions.h:107
static TOOL_ACTION lineMode45
Definition: ee_actions.h:280
static TOOL_ACTION drawSheet
Definition: ee_actions.h:93
static TOOL_ACTION drawBezier
Definition: ee_actions.h:108
static TOOL_ACTION markSimExclusions
Definition: ee_actions.h:255
static TOOL_ACTION placeLabel
Definition: ee_actions.h:89
static TOOL_ACTION saveSheetAsDesignBlock
Definition: ee_actions.h:207
static TOOL_ACTION placeBusWireEntry
Definition: ee_actions.h:88
static TOOL_ACTION placeJunction
Definition: ee_actions.h:87
static TOOL_ACTION saveSelectionAsDesignBlock
Definition: ee_actions.h:208
static TOOL_ACTION placeNoConnect
Definition: ee_actions.h:86
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:120
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:86
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:67
double GetScale() const
Definition: view.h:272
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:1673
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:396
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:216
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
Definition: view.cpp:586
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:1559
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:285
void OnKiCadExit()
Definition: kiway.cpp:727
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:84
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:333
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:125
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:140
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:146
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:370
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:82
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:382
SCH_SHEET_PATH & CurrentSheet() const override
Definition: schematic.h:161
void OnSchSheetChanged()
Notify the schematic and its listeners that the current sheet has been changed.
Definition: schematic.cpp:802
wxString GetOperatingPoint(const wxString &aNetName, int aPrecision, const wxString &aRange)
Definition: schematic.cpp:736
wxString GetFileName() const override
Helper to retrieve the filename from the root sheet screen.
Definition: schematic.cpp:306
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:312
CONNECTION_GRAPH * ConnectionGraph() const override
Definition: schematic.h:171
void SetCurrentSheet(const SCH_SHEET_PATH &aPath) override
Definition: schematic.h:166
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:125
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:691
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
Definition: schematic.h:146
void RemoveAllListeners()
Remove all listeners.
Definition: schematic.cpp:827
SCH_SHEET & Root() const
Definition: schematic.h:130
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
Definition: schematic.cpp:662
ERC_SETTINGS & ErcSettings() const
Definition: schematic.cpp:319
void RefreshHierarchy()
Definition: schematic.cpp:222
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
Execute the changes.
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
Return bounding box 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:167
virtual bool IsConnectable() const
Definition: sch_item.h:450
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction)
Definition: sch_item.h:554
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:218
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:1400
SPIN_STYLE GetSpinStyle() const
Definition: sch_label.cpp:331
void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo) override
Definition: sch_label.cpp:560
std::vector< SCH_FIELD > & GetFields()
Definition: sch_label.h:201
virtual void SetSpinStyle(SPIN_STYLE aSpinStyle)
Definition: sch_label.cpp:296
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:318
bool IsWire() const
Return true if the line is a wire.
Definition: sch_line.cpp:956
double GetLength() const
Definition: sch_line.cpp:237
const wxString & GetOperatingPoint() const
Definition: sch_line.h:317
Handle actions specific to the schematic editor.
void SetOperatingPoint(const wxString &aText)
Definition: sch_pin.h:284
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:106
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
Definition: sch_sheet.cpp:172
std::vector< SCH_SHEET_PIN * > & GetPins()
Definition: sch_sheet.h:180
Schematic symbol object.
Definition: sch_symbol.h:77
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:781
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
Definition: sch_symbol.cpp:905
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) 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:703
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(const wxString &aFilename)
Return a handle to the a given settings by type.
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Save, unload and unregister 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:754
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:169
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:168
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()
Initialize 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:320
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:139
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
Definition: wx_infobar.cpp:189
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
Definition: wx_infobar.cpp:310
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:425
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 IPC API and its plugin system.
Definition: api_utils.cpp:26
@ ID_FILE_LIST_CLEAR
Definition: id.h:84
@ ID_EDA_SOCKET_EVENT
Definition: id.h:161
@ ID_EDA_SOCKET_EVENT_SERV
Definition: id.h:160
@ ID_FILEMAX
Definition: id.h:82
@ ID_FILE1
Definition: id.h:81
PROJECT & Prj()
Definition: kicad.cpp:597
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:431
@ LAYER_ERC_EXCLUSION
Definition: layer_ids.h:433
@ LAYER_ERC_ERR
Definition: layer_ids.h:432
@ LAYER_OP_CURRENTS
Definition: layer_ids.h:453
@ LAYER_SCHEMATIC_BACKGROUND
Definition: layer_ids.h:440
@ LAYER_INTERSHEET_REFS
Definition: layer_ids.h:415
@ LAYER_OP_VOLTAGES
Definition: layer_ids.h:452
@ MAIL_PCB_UPDATE
Definition: mail_type.h:46
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:58
@ GEOMETRY
Position or shape has changed.
Definition: view_item.h:55
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:1073
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
@ AUTOPLACE_AUTO
Definition: sch_item.h:70
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:695
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.