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 <confirm.h>
31#include <connection_graph.h>
32#include <dialogs/dialog_erc.h>
37#include <wx/srchctrl.h>
38#include <mail_type.h>
39#include <wx/clntdata.h>
40#include <wx/panel.h>
41#include <wx/sizer.h>
42#include <wx/menu.h>
43#include <local_history.h>
44#include <eeschema_id.h>
45#include <executable_names.h>
48#include <gestfich.h>
50#include <string_utils.h>
51#include <kiface_base.h>
52#include <kiplatform/app.h>
53#include <kiway.h>
54#include <symbol_edit_frame.h>
55#include <symbol_viewer_frame.h>
56#include <pgm_base.h>
57#include <core/profile.h>
60#include <python_scripting.h>
61#include <sch_edit_frame.h>
63#include <sch_painter.h>
64#include <sch_marker.h>
65#include <sch_sheet_pin.h>
66#include <sch_commit.h>
67#include <sch_rule_area.h>
69#include <advanced_config.h>
70#include <sim/simulator_frame.h>
71#include <tool/action_manager.h>
72#include <tool/action_toolbar.h>
73#include <tool/common_control.h>
74#include <tool/common_tools.h>
75#include <tool/embed_tool.h>
76#include <tool/picker_tool.h>
78#include <tool/selection.h>
80#include <tool/tool_manager.h>
81#include <tool/zoom_tool.h>
82#include <tools/sch_actions.h>
88#include <sch_io/sch_io_mgr.h>
89#include <sch_io/sch_io.h>
91#include <tools/sch_edit_tool.h>
97#include <tools/sch_move_tool.h>
100#include <trace_helpers.h>
101#include <unordered_set>
102#include <view/view_controls.h>
103#include <widgets/wx_infobar.h>
109#include <wx/cmdline.h>
110#include <wx/app.h>
111#include <wx/filedlg.h>
112#include <wx/socket.h>
113#include <wx/debug.h>
115#include <widgets/wx_aui_utils.h>
118#include <toolbars_sch_editor.h>
119#include <wx/log.h>
120#include <wx/choicdlg.h>
121#include <wx/textdlg.h>
122
123
124#ifdef KICAD_IPC_API
126#include <api/api_utils.h>
127#endif
128
130
131
132#define DIFF_SYMBOLS_DIALOG_NAME wxT( "DiffSymbolsDialog" )
133
134
135BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, SCH_BASE_FRAME )
138
139 EVT_SIZE( SCH_EDIT_FRAME::OnSize )
140
143
145
146 EVT_MENU( wxID_EXIT, SCH_EDIT_FRAME::OnExit )
147 EVT_MENU( wxID_CLOSE, SCH_EDIT_FRAME::OnExit )
148
149 // Drop files event
150 EVT_DROP_FILES( SCH_EDIT_FRAME::OnDropFiles )
151END_EVENT_TABLE()
152
153
154wxDEFINE_EVENT( EDA_EVT_SCHEMATIC_CHANGING, wxCommandEvent );
155wxDEFINE_EVENT( EDA_EVT_SCHEMATIC_CHANGED, wxCommandEvent );
156
157
158SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
159 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH, wxT( "Eeschema" ), wxDefaultPosition,
161 m_ercDialog( nullptr ),
162 m_diffSymbolDialog( nullptr ),
163 m_symbolFieldsTableDialog( nullptr ),
164 m_netNavigator( nullptr ),
165 m_netNavigatorFilter( nullptr ),
169 m_designBlocksPane( nullptr ),
170 m_remoteSymbolPane( nullptr )
171{
172 m_maximizeByDefault = true;
173 m_schematic = new SCHEMATIC( &Prj() );
174 m_schematic->SetSchematicHolder( this );
176
177 m_showBorderAndTitleBlock = true; // true to show sheet references
178 m_supportsAutoSave = true;
180 m_aboutTitle = _HKI( "KiCad Schematic Editor" );
181 m_show_search = false;
182 // Ensure timer has an owner before binding so it generates events.
183 m_crossProbeFlashTimer.SetOwner( this );
184 Bind( wxEVT_TIMER, &SCH_EDIT_FRAME::OnCrossProbeFlashTimer, this, m_crossProbeFlashTimer.GetId() );
185
186 // Give an icon
187 wxIcon icon;
188 wxIconBundle icon_bundle;
189
190 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 48 ) );
191 icon_bundle.AddIcon( icon );
192 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 128 ) );
193 icon_bundle.AddIcon( icon );
194 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 256 ) );
195 icon_bundle.AddIcon( icon );
196 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema_32 ) );
197 icon_bundle.AddIcon( icon );
198 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema_16 ) );
199 icon_bundle.AddIcon( icon );
200
201 SetIcons( icon_bundle );
202
204
205 setupTools();
208
212
213 // Ensure the "Line modes" toolbar group shows the current angle mode on startup
214 if( GetToolManager() )
216
217#ifdef KICAD_IPC_API
218 wxTheApp->Bind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED, &SCH_EDIT_FRAME::onPluginAvailabilityChanged, this );
219#endif
220
221 m_hierarchy = new HIERARCHY_PANE( this );
222
223 // Initialize common print setup dialog settings.
224 m_pageSetupData.GetPrintData().SetPrintMode( wxPRINT_MODE_PRINTER );
225 m_pageSetupData.GetPrintData().SetQuality( wxPRINT_QUALITY_MEDIUM );
226 m_pageSetupData.GetPrintData().SetBin( wxPRINTBIN_AUTO );
227 m_pageSetupData.GetPrintData().SetNoCopies( 1 );
228
229 m_searchPane = new SCH_SEARCH_PANE( this );
230 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
232
233 m_propertiesPanel->SetSplitterProportion( eeconfig()->m_AuiPanels.properties_splitter );
234
237
238 m_auimgr.SetManagedWindow( this );
239
241
242 // Fetch a COPY of the config as a lot of these initializations are going to overwrite our
243 // data.
244 EESCHEMA_SETTINGS::AUI_PANELS aui_cfg = eeconfig()->m_AuiPanels;
245 EESCHEMA_SETTINGS::APPEARANCE appearance_cfg = eeconfig()->m_Appearance;
246
247 // Rows; layers 4 - 6
248 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) )
249 .Top().Layer( 6 ) );
250
251 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) )
252 .Bottom().Layer( 6 ) );
253
254 // Columns; layers 1 - 3
255 m_auimgr.AddPane( m_hierarchy, EDA_PANE().Palette().Name( SchematicHierarchyPaneName() )
256 .Caption( _( "Schematic Hierarchy" ) )
257 .Left().Layer( 3 ).Position( 1 )
258 .TopDockable( false )
259 .BottomDockable( false )
260 .CloseButton( true )
261 .MinSize( FromDIP( wxSize( 120, 60 ) ) )
262 .BestSize( FromDIP( wxSize( 200, 200 ) ) )
263 .FloatingSize( FromDIP( wxSize( 200, 200 ) ) )
264 .FloatingPosition( FromDIP( wxPoint( 50, 50 ) ) )
265 .Show( false ) );
266
269
272
274
275 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( wxS( "LeftToolbar" ) )
276 .Left().Layer( 2 ) );
277
278 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( wxS( "RightToolbar" ) )
279 .Right().Layer( 2 ) );
280
281 // Center
282 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
283 .Center() );
284
285 m_auimgr.AddPane( m_searchPane, EDA_PANE()
286 .Name( SearchPaneName() )
287 .Bottom()
288 .Caption( _( "Search" ) )
289 .PaneBorder( false )
290 .MinSize( FromDIP( wxSize( 180, 60 ) ) )
291 .BestSize( FromDIP( wxSize( 180, 100 ) ) )
292 .FloatingSize( FromDIP( wxSize( 480, 200 ) ) )
293 .CloseButton( true )
294 .DestroyOnClose( false )
295 .Show( m_show_search ) );
296
299
300 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
301 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
302 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
303 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
304 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
305 wxAuiPaneInfo& remoteSymbolPane = m_auimgr.GetPane( RemoteSymbolPaneName() );
306
307 hierarchy_pane.Show( aui_cfg.show_schematic_hierarchy );
308 netNavigatorPane.Show( aui_cfg.show_net_nav_panel );
309 propertiesPane.Show( aui_cfg.show_properties );
310 designBlocksPane.Show( aui_cfg.design_blocks_show );
311
312 if( m_remoteSymbolPane && !m_remoteSymbolPane->HasDataSources() )
313 remoteSymbolPane.Show( false );
314 else
315 remoteSymbolPane.Show( aui_cfg.remote_symbol_show );
316
318
319 // The selection filter doesn't need to grow in the vertical direction when docked
320 selectionFilterPane.dock_proportion = 0;
321
322 if( aui_cfg.hierarchy_panel_float_width > 0 && aui_cfg.hierarchy_panel_float_height > 0 )
323 {
324 // Show at end, after positioning
325 hierarchy_pane.FloatingSize( aui_cfg.hierarchy_panel_float_width,
327 }
328
329 if( aui_cfg.net_nav_panel_float_size.GetWidth() > 0
330 && aui_cfg.net_nav_panel_float_size.GetHeight() > 0 )
331 {
332 netNavigatorPane.FloatingSize( aui_cfg.net_nav_panel_float_size );
333 netNavigatorPane.FloatingPosition( aui_cfg.net_nav_panel_float_pos );
334 }
335
336 if( aui_cfg.properties_panel_width > 0 )
337 SetAuiPaneSize( m_auimgr, propertiesPane, aui_cfg.properties_panel_width, -1 );
338
339 if( aui_cfg.schematic_hierarchy_float )
340 hierarchy_pane.Float();
341
342 if( aui_cfg.search_panel_height > 0
343 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_TOP
344 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) )
345 {
346 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
347 searchPane.Direction( aui_cfg.search_panel_dock_direction );
348 SetAuiPaneSize( m_auimgr, searchPane, -1, aui_cfg.search_panel_height );
349 }
350
351 else if( aui_cfg.search_panel_width > 0
352 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_LEFT
353 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) )
354 {
355 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
356 searchPane.Direction( aui_cfg.search_panel_dock_direction );
357 SetAuiPaneSize( m_auimgr, searchPane, aui_cfg.search_panel_width, -1 );
358 }
359
360 if( aui_cfg.float_net_nav_panel )
361 netNavigatorPane.Float();
362
363 if( aui_cfg.design_blocks_show )
364 SetAuiPaneSize( m_auimgr, designBlocksPane, aui_cfg.design_blocks_panel_docked_width, -1 );
365
366 if( aui_cfg.remote_symbol_show )
367 SetAuiPaneSize( m_auimgr, remoteSymbolPane, aui_cfg.remote_symbol_panel_docked_width, -1 );
368
369 if( aui_cfg.hierarchy_panel_docked_width > 0 )
370 {
371 // If the net navigator is not show, let the hierarchy navigator take all of the vertical
372 // space.
373 if( !aui_cfg.show_net_nav_panel )
374 {
375 SetAuiPaneSize( m_auimgr, hierarchy_pane, aui_cfg.hierarchy_panel_docked_width, -1 );
376 }
377 else
378 {
379 SetAuiPaneSize( m_auimgr, hierarchy_pane,
382
383 SetAuiPaneSize( m_auimgr, netNavigatorPane,
384 aui_cfg.net_nav_panel_docked_size.GetWidth(),
385 aui_cfg.net_nav_panel_docked_size.GetHeight() );
386 }
387
388 // wxAUI hack: force width by setting MinSize() and then Fixed()
389 // thanks to ZenJu https://github.com/wxWidgets/wxWidgets/issues/13180
390 hierarchy_pane.MinSize( aui_cfg.hierarchy_panel_docked_width, 60 );
391 hierarchy_pane.Fixed();
392 netNavigatorPane.MinSize( aui_cfg.net_nav_panel_docked_size.GetWidth(), 60 );
393 netNavigatorPane.Fixed();
394 m_auimgr.Update();
395
396 // now make it resizable again
397 hierarchy_pane.Resizable();
398 netNavigatorPane.Resizable();
399 m_auimgr.Update();
400
401 // Note: DO NOT call m_auimgr.Update() anywhere after this; it will nuke the size
402 // back to minimum.
403 hierarchy_pane.MinSize( FromDIP( wxSize( 120, 60 ) ) );
404 netNavigatorPane.MinSize( FromDIP( wxSize( 120, 60 ) ) );
405 }
406 else
407 {
408 m_auimgr.Update();
409 }
410
413
414 GetCanvas()->GetGAL()->SetAxesEnabled( false );
415
416 KIGFX::SCH_VIEW* view = GetCanvas()->GetView();
417 static_cast<KIGFX::SCH_PAINTER*>( view->GetPainter() )->SetSchematic( m_schematic );
418
421
422 view->SetLayerVisible( LAYER_ERC_ERR, appearance_cfg.show_erc_errors );
423 view->SetLayerVisible( LAYER_ERC_WARN, appearance_cfg.show_erc_warnings );
425 view->SetLayerVisible( LAYER_OP_VOLTAGES, appearance_cfg.show_op_voltages );
426 view->SetLayerVisible( LAYER_OP_CURRENTS, appearance_cfg.show_op_currents );
427
429
431 m_netNavigator->Bind( wxEVT_TREE_SEL_CHANGING, &SCH_EDIT_FRAME::onNetNavigatorSelChanging, this );
432 m_netNavigator->Bind( wxEVT_TREE_SEL_CHANGED, &SCH_EDIT_FRAME::onNetNavigatorSelection, this );
433 m_netNavigator->Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::onResizeNetNavigator, this );
434
435 // This is used temporarily to fix a client size issue on GTK that causes zoom to fit
436 // to calculate the wrong zoom size. See SCH_EDIT_FRAME::onSize().
437 Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::onSize, this );
438
439 setupUnits( eeconfig() );
440
441 // Net list generator
443
444 updateTitle();
445 m_toolManager->GetTool<SCH_NAVIGATE_TOOL>()->ResetHistory();
446
447#ifdef KICAD_IPC_API
448 m_apiHandler = std::make_unique<API_HANDLER_SCH>( this );
449 Pgm().GetApiServer().RegisterHandler( m_apiHandler.get() );
450#endif
451
452 // Default shutdown reason until a file is loaded
453 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New schematic file is unsaved" ) );
454
455 // Init for dropping files
459 m_acceptedExts.emplace( wxS( "jpeg" ), &SCH_ACTIONS::ddAddImage );
460 m_acceptedExts.emplace( wxS( "dxf" ), &SCH_ACTIONS::ddImportGraphics );
462 DragAcceptFiles( true );
463
464 // Ensure the window is on top
465 Raise();
466
467 // Now that all sizes are fixed, set the initial hierarchy_pane floating position to the
468 // top-left corner of the canvas
469 wxPoint canvas_pos = GetCanvas()->GetScreenPosition();
470 hierarchy_pane.FloatingPosition( canvas_pos.x + 10, canvas_pos.y + 10 );
471
472 Bind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &SCH_EDIT_FRAME::onCloseSymbolDiffDialog, this );
473 Bind( EDA_EVT_CLOSE_ERC_DIALOG, &SCH_EDIT_FRAME::onCloseErcDialog, this );
474 Bind( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, &SCH_EDIT_FRAME::onCloseSymbolFieldsTableDialog, this );
475}
476
477void SCH_EDIT_FRAME::StartCrossProbeFlash( const std::vector<SCH_ITEM*>& aItems )
478{
479 if( !eeconfig()->m_CrossProbing.flash_selection )
480 {
481 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: aborted (setting disabled) items=%zu", aItems.size() );
482 return;
483 }
484 if( aItems.empty() )
485 {
486 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: aborted (no items)" );
487 return;
488 }
489
491 {
492 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: restarting existing flash (phase=%d)",
495 }
496
497 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: starting with %zu items", aItems.size() );
499
500 for( SCH_ITEM* it : aItems )
501 m_crossProbeFlashItems.push_back( it->m_Uuid );
502
505
506 if( !m_crossProbeFlashTimer.GetOwner() )
507 m_crossProbeFlashTimer.SetOwner( this );
508
509 bool started = m_crossProbeFlashTimer.Start( 500, wxTIMER_CONTINUOUS );
510 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: timer start=%d id=%d", (int) started,
511 m_crossProbeFlashTimer.GetId() );
512}
513
514
515void SCH_EDIT_FRAME::OnCrossProbeFlashTimer( wxTimerEvent& aEvent )
516{
517 wxLogTrace( traceCrossProbeFlash, "Timer(SCH) fired: phase=%d running=%d items=%zu", m_crossProbeFlashPhase,
519
521 {
522 wxLogTrace( traceCrossProbeFlash, "Timer fired but not flashing (ignored)" );
523 return;
524 }
525
527
528 if( !selTool )
529 return;
530
531 bool prevGuard = m_syncingPcbToSchSelection;
533
534 if( m_crossProbeFlashPhase % 2 == 0 )
535 {
536 selTool->ClearSelection( true );
537 wxLogTrace( traceCrossProbeFlash, "Phase %d: cleared selection", m_crossProbeFlashPhase );
538 }
539 else
540 {
541 for( const KIID& id : m_crossProbeFlashItems )
542 {
543 if( SCH_ITEM* item = Schematic().ResolveItem( id, nullptr, true ) )
544 selTool->AddItemToSel( item, true );
545 }
546
547 wxLogTrace( traceCrossProbeFlash, "Phase %d: restored %zu items", m_crossProbeFlashPhase,
548 m_crossProbeFlashItems.size() );
549 }
550
551 if( GetCanvas() )
552 {
554 wxLogTrace( traceCrossProbeFlash, "Phase %d: forced canvas refresh", m_crossProbeFlashPhase );
555 }
556
557 m_syncingPcbToSchSelection = prevGuard;
559
560 if( m_crossProbeFlashPhase > 6 )
561 {
562 for( const KIID& id : m_crossProbeFlashItems )
563 {
564 if( SCH_ITEM* item = Schematic().ResolveItem( id, nullptr, true ) )
565 selTool->AddItemToSel( item, true );
566 }
567
568 m_crossProbeFlashing = false;
570 wxLogTrace( traceCrossProbeFlash, "Flashing complete. Final selection size=%zu",
571 m_crossProbeFlashItems.size() );
572 }
573}
574
575
577{
578 m_hierarchy->Unbind( wxEVT_SIZE, &SCH_EDIT_FRAME::OnResizeHierarchyNavigator, this );
579
580 // Ensure m_canvasType is up to date, to save it in config
582
583 SetScreen( nullptr );
584
585 if( m_schematic )
586 m_schematic->RemoveAllListeners();
587
588 // Delete all items not in draw list before deleting schematic
589 // to avoid dangling pointers stored in these items
592
593 delete m_schematic;
594 m_schematic = nullptr;
595
596 // Close the project if we are standalone, so it gets cleaned up properly
597 if( Kiface().IsSingle() )
598 {
599 try
600 {
601 GetSettingsManager()->UnloadProject( &Prj(), false );
602 }
603 catch( const std::runtime_error& e )
604 {
605 wxFAIL_MSG( wxString::Format( wxT( "Settings exception occurred: %s" ), e.what() ) );
606 }
607 }
608
609 // We passed ownership of these to wxAuiManager.
610 // delete m_hierarchy;
611 // delete m_selectionFilterPanel;
612}
613
614
616{
617 aEvent.Skip();
618
619 // 1st Call: Handle the size update during the first resize event.
621
622 // Defer the second size capture
623 CallAfter( [this]()
624 {
626 } );
627}
628
629
631{
632 // Called when resizing the Hierarchy Navigator panel
633 // Store the current pane size
634 // It allows to retrieve the last defined pane size when switching between
635 // docked and floating pane state
636 // Note: *DO NOT* call m_auimgr.Update() here: it crashes KiCad at least on Windows
637
638 EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
639 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
640
641 if( cfg && m_hierarchy->IsShownOnScreen() )
642 {
643 cfg->m_AuiPanels.hierarchy_panel_float_width = hierarchy_pane.floating_size.x;
644 cfg->m_AuiPanels.hierarchy_panel_float_height = hierarchy_pane.floating_size.y;
645
646 // initialize hierarchy_panel_docked_width and best size only if the hierarchy_pane
647 // width is > 0 (i.e. if its size is already set and has meaning)
648 // if it is floating, its size is not initialized (only floating_size is initialized)
649 // initializing hierarchy_pane.best_size is useful when switching to float pane and
650 // after switching to the docked pane, to retrieve the last docked pane width
651 if( hierarchy_pane.rect.width > 50 ) // 50 is a good margin
652 {
653 cfg->m_AuiPanels.hierarchy_panel_docked_width = hierarchy_pane.rect.width;
654 hierarchy_pane.best_size.x = hierarchy_pane.rect.width;
655 }
656 }
657}
658
659
661{
662 // Create the manager and dispatcher & route draw panel events to the dispatcher
664 m_toolManager->SetEnvironment( &Schematic(), GetCanvas()->GetView(),
665 GetCanvas()->GetViewControls(), config(), this );
666 m_actions = new SCH_ACTIONS();
668
669 // Register tools
670 m_toolManager->RegisterTool( new COMMON_CONTROL );
671 m_toolManager->RegisterTool( new COMMON_TOOLS );
672 m_toolManager->RegisterTool( new ZOOM_TOOL );
673 m_toolManager->RegisterTool( new SCH_SELECTION_TOOL );
674 m_toolManager->RegisterTool( new PICKER_TOOL );
675 m_toolManager->RegisterTool( new SCH_DRAWING_TOOLS );
676 m_toolManager->RegisterTool( new SCH_LINE_WIRE_BUS_TOOL );
677 m_toolManager->RegisterTool( new SCH_MOVE_TOOL );
678 m_toolManager->RegisterTool( new SCH_ALIGN_TOOL );
679 m_toolManager->RegisterTool( new SCH_EDIT_TOOL );
680 m_toolManager->RegisterTool( new SCH_EDIT_TABLE_TOOL );
681 m_toolManager->RegisterTool( new SCH_GROUP_TOOL );
682 m_toolManager->RegisterTool( new SCH_INSPECTION_TOOL );
683 m_toolManager->RegisterTool( new SCH_DESIGN_BLOCK_CONTROL );
684 m_toolManager->RegisterTool( new SCH_EDITOR_CONTROL );
685 m_toolManager->RegisterTool( new SCH_FIND_REPLACE_TOOL );
686 m_toolManager->RegisterTool( new SCH_POINT_EDITOR );
687 m_toolManager->RegisterTool( new SCH_NAVIGATE_TOOL );
688 m_toolManager->RegisterTool( new PROPERTIES_TOOL );
689 m_toolManager->RegisterTool( new EMBED_TOOL );
690 m_toolManager->InitTools();
691
692 // Run the selection tool, it is supposed to be always active
694
696}
697
698
700{
702
703 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
704 SCH_EDITOR_CONDITIONS cond( this );
705
706 wxASSERT( mgr );
707
708 auto hasElements =
709 [ this ] ( const SELECTION& aSel )
710 {
711 return GetScreen() &&
712 ( !GetScreen()->Items().empty() || !SELECTION_CONDITIONS::Idle( aSel ) );
713 };
714
715 auto searchPaneCond =
716 [this] ( const SELECTION& )
717 {
718 return m_auimgr.GetPane( SearchPaneName() ).IsShown();
719 };
720
721 auto propertiesCond =
722 [this] ( const SELECTION& )
723 {
724 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
725 };
726
727 auto hierarchyNavigatorCond =
728 [ this ] ( const SELECTION& aSel )
729 {
730 return m_auimgr.GetPane( SchematicHierarchyPaneName() ).IsShown();
731 };
732
733 auto netNavigatorCond =
734 [ this ] (const SELECTION& aSel )
735 {
736 return m_auimgr.GetPane( NetNavigatorPaneName() ).IsShown();
737 };
738
739 auto designBlockCond =
740 [ this ] (const SELECTION& aSel )
741 {
742 return m_auimgr.GetPane( DesignBlocksPaneName() ).IsShown();
743 };
744
745 auto remoteSymbolCond =
746 [ this ] (const SELECTION& aSel )
747 {
748 return m_auimgr.GetPane( RemoteSymbolPaneName() ).IsShown();
749 };
750
751 auto undoCond =
752 [ this ] (const SELECTION& aSel )
753 {
755 return true;
756
757 return GetUndoCommandCount() > 0;
758 };
759
760 auto groupWithDesignBlockLink =
761 [] ( const SELECTION& aSel )
762 {
763 if( aSel.Size() != 1 )
764 return false;
765
766 if( aSel[0]->Type() != SCH_GROUP_T )
767 return false;
768
769 SCH_GROUP* group = static_cast<SCH_GROUP*>( aSel.GetItem( 0 ) );
770
771 return group->HasDesignBlockLink();
772 };
773
774#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
775#define CHECK( x ) ACTION_CONDITIONS().Check( x )
776
778 mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) );
780
781 mgr->SetConditions( SCH_ACTIONS::showSearch, CHECK( searchPaneCond ) );
782 mgr->SetConditions( SCH_ACTIONS::showHierarchy, CHECK( hierarchyNavigatorCond ) );
783 mgr->SetConditions( SCH_ACTIONS::showNetNavigator, CHECK( netNavigatorCond ) );
784 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
785 mgr->SetConditions( SCH_ACTIONS::showDesignBlockPanel, CHECK( designBlockCond ) );
786 mgr->SetConditions( SCH_ACTIONS::showRemoteSymbolPanel, CHECK( remoteSymbolCond ) );
789
790 mgr->SetConditions( ACTIONS::cut, ENABLE( hasElements ) );
791 mgr->SetConditions( ACTIONS::copy, ENABLE( hasElements ) );
792 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( hasElements ) );
795 mgr->SetConditions( ACTIONS::doDelete, ENABLE( hasElements ) );
796 mgr->SetConditions( ACTIONS::duplicate, ENABLE( hasElements ) );
803 mgr->SetConditions( ACTIONS::selectAll, ENABLE( hasElements ) );
804 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( hasElements ) );
805
806 mgr->SetConditions( SCH_ACTIONS::rotateCW, ENABLE( hasElements ) );
807 mgr->SetConditions( SCH_ACTIONS::rotateCCW, ENABLE( hasElements ) );
808 mgr->SetConditions( SCH_ACTIONS::mirrorH, ENABLE( hasElements ) );
809 mgr->SetConditions( SCH_ACTIONS::mirrorV, ENABLE( hasElements ) );
812
813 mgr->SetConditions( SCH_ACTIONS::placeLinkedDesignBlock, ENABLE( groupWithDesignBlockLink ) );
814 mgr->SetConditions( SCH_ACTIONS::saveToLinkedDesignBlock, ENABLE( groupWithDesignBlockLink ) );
815
818
819 auto showHiddenPinsCond =
820 [this]( const SELECTION& )
821 {
822 return GetShowAllPins();
823 };
824
825 auto showHiddenFieldsCond =
826 [this]( const SELECTION& )
827 {
829 return cfg && cfg->m_Appearance.show_hidden_fields;
830 };
831
832 auto showDirectiveLabelsCond =
833 [this]( const SELECTION& )
834 {
836 return cfg && cfg->m_Appearance.show_directive_labels;
837 };
838
839 auto showERCErrorsCond =
840 [this]( const SELECTION& )
841 {
843 return cfg && cfg->m_Appearance.show_erc_errors;
844 };
845
846 auto showERCWarningsCond =
847 [this]( const SELECTION& )
848 {
850 return cfg && cfg->m_Appearance.show_erc_warnings;
851 };
852
853 auto showERCExclusionsCond =
854 [this]( const SELECTION& )
855 {
857 return cfg && cfg->m_Appearance.show_erc_exclusions;
858 };
859
860 auto markSimExclusionsCond =
861 [this]( const SELECTION& )
862 {
864 return cfg && cfg->m_Appearance.mark_sim_exclusions;
865 };
866
867 auto showOPVoltagesCond =
868 [this]( const SELECTION& )
869 {
871 return cfg && cfg->m_Appearance.show_op_voltages;
872 };
873
874 auto showOPCurrentsCond =
875 [this]( const SELECTION& )
876 {
878 return cfg && cfg->m_Appearance.show_op_currents;
879 };
880
881 auto showPinAltModeIconsCond =
882 [this]( const SELECTION& )
883 {
885 return cfg && cfg->m_Appearance.show_pin_alt_icons;
886 };
887
888 auto showAnnotateAutomaticallyCond =
889 [this]( const SELECTION& )
890 {
892 };
893
894 auto remapSymbolsCondition =
895 [&]( const SELECTION& aSel )
896 {
897 SCH_SCREENS schematic( Schematic().Root() );
898
899 // The remapping can only be performed on legacy projects.
900 return schematic.HasNoFullyDefinedLibIds();
901 };
902
903 auto belowRootSheetCondition =
904 [this]( const SELECTION& aSel )
905 {
906 SCH_NAVIGATE_TOOL* navigateTool = m_toolManager->GetTool<SCH_NAVIGATE_TOOL>();
907 return navigateTool && navigateTool->CanGoUp();
908 };
909
910 mgr->SetConditions( SCH_ACTIONS::leaveSheet, ENABLE( belowRootSheetCondition ) );
911
912 /* Some of these are bound by default to arrow keys which will get a different action if we
913 * disable the buttons. So always leave them enabled so the action is consistent.
914 * https://gitlab.com/kicad/code/kicad/-/issues/14783
915 mgr->SetConditions( SCH_ACTIONS::navigateUp, ENABLE( belowRootSheetCondition ) );
916 mgr->SetConditions( SCH_ACTIONS::navigateForward, ENABLE( navHistoryHasForward ) );
917 mgr->SetConditions( SCH_ACTIONS::navigateBack, ENABLE( navHistoryHsBackward ) );
918 */
919
920 mgr->SetConditions( SCH_ACTIONS::remapSymbols, ENABLE( remapSymbolsCondition ) );
921 mgr->SetConditions( SCH_ACTIONS::toggleHiddenPins, CHECK( showHiddenPinsCond ) );
922 mgr->SetConditions( SCH_ACTIONS::toggleHiddenFields, CHECK( showHiddenFieldsCond ) );
923 mgr->SetConditions( SCH_ACTIONS::toggleDirectiveLabels, CHECK( showDirectiveLabelsCond ) );
924 mgr->SetConditions( SCH_ACTIONS::toggleERCErrors, CHECK( showERCErrorsCond ) );
925 mgr->SetConditions( SCH_ACTIONS::toggleERCWarnings, CHECK( showERCWarningsCond ) );
926 mgr->SetConditions( SCH_ACTIONS::toggleERCExclusions, CHECK( showERCExclusionsCond ) );
927 mgr->SetConditions( SCH_ACTIONS::markSimExclusions, CHECK( markSimExclusionsCond ) );
928 mgr->SetConditions( SCH_ACTIONS::toggleOPVoltages, CHECK( showOPVoltagesCond ) );
929 mgr->SetConditions( SCH_ACTIONS::toggleOPCurrents, CHECK( showOPCurrentsCond ) );
930 mgr->SetConditions( SCH_ACTIONS::togglePinAltIcons, CHECK( showPinAltModeIconsCond ) );
931 mgr->SetConditions( SCH_ACTIONS::toggleAnnotateAuto, CHECK( showAnnotateAutomaticallyCond ) );
933
936
937#define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
938
968
969#undef CURRENT_TOOL
970#undef CHECK
971#undef ENABLE
972}
973
974
976{
977 // we cannot store a pointer to an item in the display list here since
978 // that item may be deleted, such as part of a line concatenation or other.
979 // So simply always keep a copy of the object which is to be repeated.
980
981 if( aItem )
982 {
983 m_items_to_repeat.clear();
984
985 AddCopyForRepeatItem( aItem );
986 }
987}
988
989
991{
992 // we cannot store a pointer to an item in the display list here since
993 // that item may be deleted, such as part of a line concatenation or other.
994 // So simply always keep a copy of the object which is to be repeated.
995
996 if( aItem )
997 {
998 std::unique_ptr<SCH_ITEM> repeatItem( static_cast<SCH_ITEM*>( aItem->Duplicate( IGNORE_PARENT_GROUP ) ) );
999
1000 // Clone() preserves the flags & parent, we want 'em cleared.
1001 repeatItem->ClearFlags();
1002 repeatItem->SetParent( nullptr );
1003
1004 m_items_to_repeat.emplace_back( std::move( repeatItem ) );
1005 }
1006}
1007
1008
1009EDA_ITEM* SCH_EDIT_FRAME::ResolveItem( const KIID& aId, bool aAllowNullptrReturn ) const
1010{
1011 return Schematic().ResolveItem( aId, nullptr, aAllowNullptrReturn );
1012}
1013
1014
1019
1020
1025
1026
1028{
1029 return *m_schematic;
1030}
1031
1032
1034{
1035 return GetCurrentSheet().Last()->GetName();
1036}
1037
1038
1040{
1042}
1043
1044
1046{
1047 m_schematic->CreateDefaultScreens();
1048 SetScreen( Schematic().RootScreen() );
1049
1050 if( GetScreen() == nullptr )
1051 {
1052 SCH_SCREEN* screen = new SCH_SCREEN( m_schematic );
1053 SetScreen( screen );
1054 }
1055}
1056
1057
1059{
1060 return m_schematic->CurrentSheet();
1061}
1062
1063
1065{
1066 if( aSheet != GetCurrentSheet() )
1067 {
1068 ClearFocus();
1069
1070 wxLogTrace( traceSchCurrentSheet,
1071 "SCH_EDIT_FRAME::SetCurrentSheet: Changing from path='%s' (size=%zu) to path='%s' (size=%zu)",
1072 GetCurrentSheet().Path().AsString(),
1073 GetCurrentSheet().size(),
1074 aSheet.Path().AsString(),
1075 aSheet.size() );
1076
1077 Schematic().SetCurrentSheet( aSheet );
1078 GetCanvas()->DisplaySheet( aSheet.LastScreen() );
1079 }
1080}
1081
1082
1084{
1086
1087 for( SCH_ITEM* item : screen->Items() )
1088 item->ClearCaches();
1089
1090 for( const std::pair<const wxString, LIB_SYMBOL*>& libSymbol : screen->GetLibSymbols() )
1091 {
1092 wxCHECK2( libSymbol.second, continue );
1093 libSymbol.second->ClearCaches();
1094 }
1095
1096 if( Schematic().Settings().m_IntersheetRefsShow )
1098
1099 ClearFocus();
1100
1101 GetCanvas()->DisplaySheet( GetCurrentSheet().LastScreen() );
1102
1103 if( SCH_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<SCH_SELECTION_TOOL>() )
1104 selectionTool->Reset( TOOL_BASE::REDRAW );
1105
1107}
1108
1109
1110bool SCH_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
1111{
1112 // Exit interactive editing
1113 // Note this this will commit *some* pending changes. For instance, the SCH_POINT_EDITOR
1114 // will cancel any drag currently in progress, but commit all changes from previous drags.
1115 if( m_toolManager )
1117
1118 // Shutdown blocks must be determined and vetoed as early as possible
1119 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
1120 && IsContentModified() )
1121 {
1122 return false;
1123 }
1124
1125 if( Kiface().IsSingle() )
1126 {
1127 auto* symbolEditor = (SYMBOL_EDIT_FRAME*) Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
1128
1129 if( symbolEditor && !symbolEditor->Close() ) // Can close symbol editor?
1130 return false;
1131
1132 auto* symbolViewer = (SYMBOL_VIEWER_FRAME*) Kiway().Player( FRAME_SCH_VIEWER, false );
1133
1134 if( symbolViewer && !symbolViewer->Close() ) // Can close symbol viewer?
1135 return false;
1136
1137 // SYMBOL_CHOOSER_FRAME is always modal so this shouldn't come up, but better safe than
1138 // sorry.
1139 auto* chooser = (SYMBOL_CHOOSER_FRAME*) Kiway().Player( FRAME_SYMBOL_CHOOSER, false );
1140
1141 if( chooser && !chooser->Close() ) // Can close symbol chooser?
1142 return false;
1143 }
1144 else
1145 {
1146 auto* symbolEditor = (SYMBOL_EDIT_FRAME*) Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
1147
1148 if( symbolEditor && symbolEditor->IsSymbolFromSchematic() )
1149 {
1150 if( !symbolEditor->CanCloseSymbolFromSchematic( true ) )
1151 return false;
1152 }
1153 }
1154
1155 if( !Kiway().PlayerClose( FRAME_SIMULATOR, false ) ) // Can close the simulator?
1156 return false;
1157
1159 && !m_symbolFieldsTableDialog->Close( false ) ) // Can close the symbol fields table?
1160 {
1161 return false;
1162 }
1163
1164 // We may have gotten multiple events; don't clean up twice
1165 if( !Schematic().IsValid() )
1166 return false;
1167
1168 if( IsContentModified() )
1169 {
1170 wxFileName fileName = Schematic().RootScreen()->GetFileName();
1171 wxString msg = _( "Save changes to '%s' before closing?" );
1172
1173 if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
1174 [&]() -> bool
1175 {
1176 return SaveProject();
1177 } ) )
1178 {
1179 return false;
1180 }
1181
1182 // If user selected 'No' (discard), create duplicate commit of last saved state and
1183 // move Last_Save tag forward so history shows an explicit discard event.
1184 if( GetLastUnsavedChangesResponse() == wxID_NO )
1185 {
1186 wxString projPath = Prj().GetProjectPath();
1187 if( !projPath.IsEmpty() && Kiway().LocalHistory().HistoryExists( projPath ) )
1188 {
1189 Kiway().LocalHistory().CommitDuplicateOfLastSave( projPath, wxS("Schematic"),
1190 wxS("Discard unsaved schematic changes") );
1191 }
1192 }
1193 }
1194
1195 return true;
1196}
1197
1198
1200{
1202
1203 SCH_SHEET_LIST sheetlist = Schematic().Hierarchy();
1204
1205#ifdef KICAD_IPC_API
1206 Pgm().GetApiServer().DeregisterHandler( m_apiHandler.get() );
1207 wxTheApp->Unbind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED, &SCH_EDIT_FRAME::onPluginAvailabilityChanged, this );
1208#endif
1209
1210 // Close modeless dialogs. They're trouble when they get destroyed after the frame.
1211 Unbind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &SCH_EDIT_FRAME::onCloseSymbolDiffDialog, this );
1212 Unbind( EDA_EVT_CLOSE_ERC_DIALOG, &SCH_EDIT_FRAME::onCloseErcDialog, this );
1213 Unbind( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, &SCH_EDIT_FRAME::onCloseSymbolFieldsTableDialog, this );
1214 m_netNavigator->Unbind( wxEVT_TREE_SEL_CHANGING, &SCH_EDIT_FRAME::onNetNavigatorSelChanging, this );
1215 m_netNavigator->Unbind( wxEVT_TREE_SEL_CHANGED, &SCH_EDIT_FRAME::onNetNavigatorSelection, this );
1216
1217 if( m_diffSymbolDialog )
1218 {
1219 m_diffSymbolDialog->Destroy();
1220 m_diffSymbolDialog = nullptr;
1221 }
1222
1223 if( m_ercDialog )
1224 {
1225 m_ercDialog->Destroy();
1226 m_ercDialog = nullptr;
1227 }
1228
1230 {
1231 m_symbolFieldsTableDialog->Destroy();
1232 m_symbolFieldsTableDialog = nullptr;
1233 }
1234
1235 // Make sure local settings are persisted
1236 if( Prj().GetLocalSettings().ShouldAutoSave() )
1238
1239 delete m_toolManager;
1240 m_toolManager = nullptr;
1241
1242 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
1243
1244 if( hierarchy_pane.IsShown() && hierarchy_pane.IsFloating() )
1245 {
1246 hierarchy_pane.Show( false );
1247 m_auimgr.Update();
1248 }
1249
1250 sheetlist.ClearModifyStatus();
1251
1252 wxString fileName = Prj().AbsolutePath( Schematic().RootScreen()->GetFileName() );
1253
1254 if( !Schematic().GetFileName().IsEmpty() && !Schematic().RootScreen()->IsEmpty() )
1255 UpdateFileHistory( fileName );
1256
1257 Schematic().RootScreen()->Clear( true );
1258
1259 // all sub sheets are deleted, only the main sheet is usable
1261
1262 // Clear view before destroying schematic as repaints depend on schematic being valid
1263 SetScreen( nullptr );
1264
1265 Schematic().Reset();
1266
1267 // Prevents any rogue events from continuing (i.e. search panel tries to redraw)
1268 Show( false );
1269
1270 Destroy();
1271}
1272
1273
1275{
1276 m_searchPane->FocusSearch();
1277}
1278
1279
1281{
1282 return Schematic().ErcSettings().GetSeverity( aErrorCode );
1283}
1284
1285
1287{
1289
1290 if( GetScreen() )
1291 {
1293 Kiway().LocalHistory().NoteFileChange( GetScreen()->GetFileName() );
1294 }
1295
1296 if( m_isClosing )
1297 return;
1298
1299 if( GetCanvas() )
1300 GetCanvas()->Refresh();
1301
1302 if( !GetTitle().StartsWith( wxS( "*" ) ) )
1303 updateTitle();
1304}
1305
1306
1308{
1309 if( Kiface().IsSingle() )
1310 {
1311 DisplayError( this, _( "Cannot update the PCB, because the Schematic Editor is opened"
1312 " in stand-alone mode. In order to create/update PCBs from"
1313 " schematics, launch the KiCad shell and create a project." ) );
1314 return;
1315 }
1316
1317 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PCB_EDITOR, false );
1318 wxEventBlocker blocker( this );
1319
1320 if( !frame )
1321 {
1322 wxFileName fn = Prj().GetProjectFullName();
1323 fn.SetExt( FILEEXT::PcbFileExtension );
1324
1325 frame = Kiway().Player( FRAME_PCB_EDITOR, true );
1326
1327 // If Kiway() cannot create the Pcbnew frame, it shows a error message, and
1328 // frame is null
1329 if( !frame )
1330 return;
1331
1332 frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
1333 }
1334
1335 if( !frame->IsVisible() )
1336 frame->Show( true );
1337
1338 // On Windows, Raise() does not bring the window on screen, when iconized
1339 if( frame->IsIconized() )
1340 frame->Iconize( false );
1341
1342 frame->Raise();
1343
1344 std::string payload;
1346}
1347
1348
1349void SCH_EDIT_FRAME::UpdateHierarchyNavigator( bool aRefreshNetNavigator, bool aClear )
1350{
1351 m_toolManager->GetTool<SCH_NAVIGATE_TOOL>()->CleanHistory();
1352 m_hierarchy->UpdateHierarchyTree( aClear );
1353
1354 if( aRefreshNetNavigator )
1356}
1357
1358
1360{
1361 // Update only the hierarchy navigation tree labels.
1362 // The tree list is expected to be up to date
1363 m_hierarchy->UpdateLabelsHierarchyTree();
1364}
1365
1366
1368{
1369 m_hierarchy->UpdateHierarchySelection();
1370}
1371
1372
1373void SCH_EDIT_FRAME::OnLoadFile( wxCommandEvent& event )
1374{
1375 wxString fn = GetFileFromHistory( event.GetId(), _( "Schematic" ) );
1376
1377 if( fn.size() )
1378 OpenProjectFiles( std::vector<wxString>( 1, fn ) );
1379}
1380
1381
1382void SCH_EDIT_FRAME::OnClearFileHistory( wxCommandEvent& aEvent )
1383{
1385}
1386
1387
1389{
1390 // Only standalone mode can directly load a new document
1391 if( !Kiface().IsSingle() )
1392 return;
1393
1394 wxString pro_dir = m_mruPath;
1395
1396 wxFileDialog dlg( this, _( "New Schematic" ), pro_dir, wxEmptyString,
1398
1399 if( dlg.ShowModal() != wxID_CANCEL )
1400 {
1401 // Enforce the extension, wxFileDialog is inept.
1402 wxFileName create_me =
1404
1405 if( create_me.FileExists() )
1406 {
1407 wxString msg;
1408 msg.Printf( _( "Schematic file '%s' already exists." ), create_me.GetFullName() );
1409 DisplayError( this, msg );
1410 return ;
1411 }
1412
1413 // OpenProjectFiles() requires absolute
1414 wxASSERT_MSG( create_me.IsAbsolute(), wxS( "wxFileDialog returned non-absolute path" ) );
1415
1416 OpenProjectFiles( std::vector<wxString>( 1, create_me.GetFullPath() ), KICTL_CREATE );
1417 m_mruPath = create_me.GetPath();
1418 }
1419}
1420
1421
1423{
1424 // Only standalone mode can directly load a new document
1425 if( !Kiface().IsSingle() )
1426 return;
1427
1428 wxString pro_dir = m_mruPath;
1429 wxString wildcards = FILEEXT::AllSchematicFilesWildcard()
1431 + wxS( "|" ) + FILEEXT::LegacySchematicFileWildcard();
1432
1433 wxFileDialog dlg( this, _( "Open Schematic" ), pro_dir, wxEmptyString,
1434 wildcards, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
1435
1436 if( dlg.ShowModal() != wxID_CANCEL )
1437 {
1438 OpenProjectFiles( std::vector<wxString>( 1, dlg.GetPath() ) );
1440 }
1441
1442 // Since we know we're single-top here: trigger library reload
1443 CallAfter( [&]()
1444 {
1445 KIFACE *schface = Kiway().KiFACE( KIWAY::FACE_SCH );
1446 schface->PreloadLibraries( &Kiway() );
1447
1449 } );
1450}
1451
1452
1454{
1456
1457 // Register schematic saver for autosave history
1459 [this]( const wxString& aProjectPath, std::vector<wxString>& aFiles )
1460 {
1461 m_schematic->SaveToHistory( aProjectPath, aFiles );
1462 } );
1463
1464 m_designBlocksPane->ProjectChanged();
1465}
1466
1467
1469{
1470 wxFileName kicad_board = Prj().AbsolutePath( Schematic().GetFileName() );
1471
1472 if( kicad_board.IsOk() && !Schematic().GetFileName().IsEmpty() )
1473 {
1474 kicad_board.SetExt( FILEEXT::PcbFileExtension );
1475 wxFileName legacy_board( kicad_board );
1476 legacy_board.SetExt( FILEEXT::LegacyPcbFileExtension );
1477 wxFileName& boardfn = legacy_board;
1478
1479 if( !legacy_board.FileExists() || kicad_board.FileExists() )
1480 boardfn = kicad_board;
1481
1482 if( Kiface().IsSingle() )
1483 {
1484 ExecuteFile( PCBNEW_EXE, boardfn.GetFullPath() );
1485 }
1486 else
1487 {
1488 wxEventBlocker blocker(this);
1489 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PCB_EDITOR, false );
1490
1491 if( !frame )
1492 {
1493 frame = Kiway().Player( FRAME_PCB_EDITOR, true );
1494
1495 // frame can be null if Cvpcb cannot be run. No need to show a warning
1496 // Kiway() generates the error messages
1497 if( !frame )
1498 return;
1499
1500 frame->OpenProjectFiles( std::vector<wxString>( 1, boardfn.GetFullPath() ) );
1501 }
1502
1503 if( !frame->IsVisible() )
1504 frame->Show( true );
1505
1506 // On Windows, Raise() does not bring the window on screen, when iconized
1507 if( frame->IsIconized() )
1508 frame->Iconize( false );
1509
1510 frame->Raise();
1511 }
1512 }
1513 else
1514 {
1516 }
1517}
1518
1519
1521{
1522 wxFileName fn = Prj().AbsolutePath( Schematic().GetFileName() );
1523 fn.SetExt( FILEEXT::NetlistFileExtension );
1524
1525 if( !ReadyToNetlist( _( "Assigning footprints requires a fully annotated schematic." ) ) )
1526 return;
1527
1528 try
1529 {
1530 KIWAY_PLAYER* player = Kiway().Player( FRAME_CVPCB, false ); // test open already.
1531
1532 if( !player )
1533 {
1534 player = Kiway().Player( FRAME_CVPCB, true );
1535
1536 // player can be null if Cvpcb cannot be run. No need to show a warning
1537 // Kiway() generates the error messages
1538 if( !player )
1539 return;
1540
1541 player->Show( true );
1542 }
1543
1544 // Ensure the netlist (mainly info about symbols) is up to date
1547
1548 player->Raise();
1549 }
1550 catch( const IO_ERROR& )
1551 {
1552 DisplayError( this, _( "Could not open CvPcb" ) );
1553 }
1554}
1555
1556
1557void SCH_EDIT_FRAME::OnExit( wxCommandEvent& event )
1558{
1559 if( event.GetId() == wxID_EXIT )
1560 Kiway().OnKiCadExit();
1561
1562 if( event.GetId() == wxID_CLOSE || Kiface().IsSingle() )
1563 Close( false );
1564}
1565
1566
1568{
1569 SCHEMATIC_SETTINGS& settings = m_schematic->Settings();
1570 SIM_LIB_MGR simLibMgr( &Prj() );
1571 NULL_REPORTER devnull;
1572
1573 // Patch for bug early in V7.99 dev
1574 if( settings.m_OPO_VRange.EndsWith( 'A' ) )
1575 settings.m_OPO_VRange[ settings.m_OPO_VRange.Length() - 1 ] = 'V';
1576
1577 // Update items which may have ${OP} text variables
1578 //
1580 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1581 {
1582 int flags = 0;
1583
1584 auto invalidateTextVars =
1585 [&flags]( EDA_TEXT* text )
1586 {
1587 if( text->HasTextVars() )
1588 {
1589 text->ClearRenderCache();
1590 text->ClearBoundingBoxCache();
1592 }
1593 };
1594
1595 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
1596 {
1597 item->RunOnChildren(
1598 [&invalidateTextVars]( SCH_ITEM* aChild )
1599 {
1600 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
1601 invalidateTextVars( text );
1602 },
1604 }
1605
1606 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1607 invalidateTextVars( text );
1608
1609 return flags;
1610 } );
1611
1612 // Update OP overlay items
1613 //
1614 for( SCH_ITEM* item : GetScreen()->Items() )
1615 {
1616 if( GetCurrentSheet().GetExcludedFromSim() )
1617 continue;
1618
1619 if( item->Type() == SCH_LINE_T )
1620 {
1621 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1622
1623 if( !line->GetOperatingPoint().IsEmpty() )
1624 GetCanvas()->GetView()->Update( line );
1625
1626 line->SetOperatingPoint( wxEmptyString );
1627
1628 // update value from netlist, below
1629 }
1630 else if( item->Type() == SCH_SYMBOL_T )
1631 {
1632 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1633 wxString ref = symbol->GetRef( &GetCurrentSheet() );
1634 std::vector<SCH_PIN*> pins = symbol->GetPins( &GetCurrentSheet() );
1635
1636 // Power symbols and other symbols which have the reference starting with "#" are
1637 // not included in simulation
1638 if( ref.StartsWith( '#' ) || symbol->ResolveExcludedFromSim() )
1639 continue;
1640
1641 for( SCH_PIN* pin : pins )
1642 {
1643 if( !pin->GetOperatingPoint().IsEmpty() )
1644 GetCanvas()->GetView()->Update( pin );
1645
1646 pin->SetOperatingPoint( wxEmptyString );
1647 }
1648
1649 if( pins.size() == 2 )
1650 {
1651 wxString op = m_schematic->GetOperatingPoint( ref, settings.m_OPO_IPrecision,
1652 settings.m_OPO_IRange );
1653
1654 if( !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1655 {
1656 pins[0]->SetOperatingPoint( op );
1657 GetCanvas()->GetView()->Update( symbol );
1658 }
1659 }
1660 else
1661 {
1662 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
1663 embeddedFilesStack.push_back( m_schematic->GetEmbeddedFiles() );
1664
1665 if( EMBEDDED_FILES* symbolEmbeddedFiles = symbol->GetEmbeddedFiles() )
1666 embeddedFilesStack.push_back( symbolEmbeddedFiles );
1667
1668 simLibMgr.SetFilesStack( std::move( embeddedFilesStack ) );
1669
1670 SIM_MODEL& model = simLibMgr.CreateModel( &GetCurrentSheet(), *symbol, true, 0, devnull ).model;
1671
1672 SPICE_ITEM spiceItem;
1673 spiceItem.refName = ref;
1674 ref = model.SpiceGenerator().ItemName( spiceItem );
1675
1676 for( const auto& modelPin : model.GetPins() )
1677 {
1678 SCH_PIN* symbolPin = symbol->GetPin( modelPin.get().symbolPinNumber );
1679 wxString signalName = ref + wxS( ":" ) + modelPin.get().modelPinName;
1680 wxString op = m_schematic->GetOperatingPoint( signalName,
1681 settings.m_OPO_IPrecision,
1682 settings.m_OPO_IRange );
1683
1684 if( symbolPin && !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1685 {
1686 symbolPin->SetOperatingPoint( op );
1687 GetCanvas()->GetView()->Update( symbol );
1688 }
1689 }
1690 }
1691 }
1692 }
1693
1694 for( const auto& [ key, subgraphList ] : m_schematic->m_connectionGraph->GetNetMap() )
1695 {
1696 wxString op = m_schematic->GetOperatingPoint( key.Name, settings.m_OPO_VPrecision,
1697 settings.m_OPO_VRange );
1698
1699 if( !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1700 {
1701 for( CONNECTION_SUBGRAPH* subgraph : subgraphList )
1702 {
1703 SCH_LINE* longestWire = nullptr;
1704 double length = 0.0;
1705
1706 if( subgraph->GetSheet().GetExcludedFromSim() )
1707 continue;
1708
1709 for( SCH_ITEM* item : subgraph->GetItems() )
1710 {
1711 if( item->Type() == SCH_LINE_T )
1712 {
1713 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1714
1715 if( line->IsWire() && line->GetLength() > length )
1716 {
1717 longestWire = line;
1718 length = line->GetLength();
1719 }
1720 }
1721 }
1722
1723 if( longestWire )
1724 {
1725 longestWire->SetOperatingPoint( op );
1726 GetCanvas()->GetView()->Update( longestWire );
1727 }
1728 }
1729 }
1730 }
1731}
1732
1733
1735{
1736 if( aItem->Type() == SCH_GLOBAL_LABEL_T || aItem->Type() == SCH_HIER_LABEL_T )
1737 {
1738 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( aItem );
1739
1740 if( label->AutoRotateOnPlacement() )
1741 {
1742 SPIN_STYLE spin = aScreen->GetLabelOrientationForPoint( label->GetPosition(),
1743 label->GetSpinStyle(),
1744 &GetCurrentSheet() );
1745
1746 if( spin != label->GetSpinStyle() )
1747 {
1748 label->SetSpinStyle( spin );
1749
1750 for( SCH_ITEM* item : aScreen->Items().OfType( SCH_GLOBAL_LABEL_T ) )
1751 {
1752 SCH_LABEL_BASE* otherLabel = static_cast<SCH_LABEL_BASE*>( item );
1753
1754 if( otherLabel != label && otherLabel->GetText() == label->GetText() )
1755 otherLabel->AutoplaceFields( aScreen, AUTOPLACE_AUTO );
1756 }
1757 }
1758 }
1759 }
1760}
1761
1762
1764{
1765 SCH_SCREEN* screen = GetScreen();
1766
1767 wxCHECK( screen, /* void */ );
1768
1769 wxString title;
1770
1771 if( !screen->GetFileName().IsEmpty() )
1772 {
1773 wxFileName fn( Prj().AbsolutePath( screen->GetFileName() ) );
1774 bool readOnly = false;
1775 bool unsaved = false;
1776
1777 if( fn.IsOk() && screen->FileExists() )
1778 readOnly = screen->IsReadOnly();
1779 else
1780 unsaved = true;
1781
1782 if( IsContentModified() )
1783 title = wxT( "*" );
1784
1785 title += fn.GetName();
1786
1787 wxString sheetPath = GetCurrentSheet().PathHumanReadable( false, true );
1788
1789 if( sheetPath != title )
1790 title += wxString::Format( wxT( " [%s]" ), sheetPath );
1791
1792 if( readOnly )
1793 title += wxS( " " ) + _( "[Read Only]" );
1794
1795 if( unsaved )
1796 title += wxS( " " ) + _( "[Unsaved]" );
1797 }
1798 else
1799 {
1800 title = _( "[no schematic loaded]" );
1801 }
1802
1803 title += wxT( " \u2014 " ) + _( "Schematic Editor" );
1804
1805 SetTitle( title );
1806}
1807
1808
1810{
1812
1813 if( GetScreen() )
1814 GetScreen()->m_zoomInitialized = true;
1815}
1816
1817
1819 PROGRESS_REPORTER* aProgressReporter )
1820{
1821 wxString highlightedConn = GetHighlightedConnection();
1822 bool hasHighlightedConn = !highlightedConn.IsEmpty();
1823
1824 std::function<void( SCH_ITEM* )> changeHandler =
1825 [&]( SCH_ITEM* aChangedItem ) -> void
1826 {
1827 GetCanvas()->GetView()->Update( aChangedItem, KIGFX::REPAINT );
1828
1829 SCH_CONNECTION* connection = aChangedItem->Connection();
1830
1832 return;
1833
1834 if( !hasHighlightedConn )
1835 {
1836 // No highlighted connection, but connectivity has changed, so refresh
1837 // the list of all nets
1839 }
1840 else if( connection
1841 && ( connection->Name() == highlightedConn
1842 || connection->HasDriverChanged() ) )
1843 {
1845 }
1846 };
1847
1848 Schematic().RecalculateConnections( aCommit, aCleanupFlags,
1850 aProgressReporter,
1851 GetCanvas()->GetView(),
1852 &changeHandler,
1853 m_undoList.m_CommandsList.empty() ? nullptr
1854 : m_undoList.m_CommandsList.back() );
1855
1857 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1858 {
1859 int flags = 0;
1860 SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem );
1861 SCH_CONNECTION* connection = item ? item->Connection() : nullptr;
1862
1863 auto invalidateTextVars =
1864 [&flags]( EDA_TEXT* text )
1865 {
1866 if( text->HasTextVars() )
1867 {
1868 text->ClearRenderCache();
1869 text->ClearBoundingBoxCache();
1871 }
1872 };
1873
1874 if( connection && connection->HasDriverChanged() )
1875 {
1876 connection->ClearDriverChanged();
1877 flags |= KIGFX::REPAINT;
1878 }
1879
1880 if( item )
1881 {
1882 item->RunOnChildren(
1883 [&invalidateTextVars]( SCH_ITEM* aChild )
1884 {
1885 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
1886 invalidateTextVars( text );
1887 },
1889
1890 if( flags & KIGFX::GEOMETRY )
1891 GetScreen()->Update( item, false ); // Refresh RTree
1892 }
1893
1894 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1895 invalidateTextVars( text );
1896
1897 return flags;
1898 } );
1899
1901 || !Schematic().ConnectionGraph()->FindFirstSubgraphByName( highlightedConn ) )
1902 {
1906 }
1907}
1908
1909
1914
1915
1917{
1918 GetCanvas()->GetView()->Update( aItem );
1919}
1920
1921
1928
1929
1930std::unique_ptr<GRID_HELPER> SCH_EDIT_FRAME::MakeGridHelper()
1931{
1932 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
1933}
1934
1935
1937{
1939
1940 SCHEMATIC_SETTINGS& settings = Schematic().Settings();
1941
1944
1946
1947 if( EESCHEMA_SETTINGS* cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" ) )
1948 {
1949 GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
1950 GetRenderSettings()->SetDefaultFont( cfg->m_Appearance.default_font );
1951
1952 KIGFX::VIEW* view = GetCanvas()->GetView();
1953 view->SetLayerVisible( LAYER_ERC_ERR, cfg->m_Appearance.show_erc_errors );
1954 view->SetLayerVisible( LAYER_ERC_WARN, cfg->m_Appearance.show_erc_warnings );
1955 view->SetLayerVisible( LAYER_ERC_EXCLUSION, cfg->m_Appearance.show_erc_exclusions );
1956 view->SetLayerVisible( LAYER_OP_VOLTAGES, cfg->m_Appearance.show_op_voltages );
1957 view->SetLayerVisible( LAYER_OP_CURRENTS, cfg->m_Appearance.show_op_currents );
1958
1959 GetRenderSettings()->m_ShowPinAltIcons = cfg->m_Appearance.show_pin_alt_icons;
1960
1962
1963 settings.m_TemplateFieldNames.DeleteAllFieldNameTemplates( true /* global */ );
1964
1965 if( !cfg->m_Drawing.field_names.IsEmpty() )
1966 settings.m_TemplateFieldNames.AddTemplateFieldNames( cfg->m_Drawing.field_names );
1967 }
1968
1970
1971 for( SCH_ITEM* item : screen->Items() )
1972 {
1973 item->ClearCaches();
1974
1975 if( item->Type() == SCH_LINE_T )
1976 {
1977 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1978
1979 if( line->IsWire() )
1980 UpdateHopOveredWires( line );
1981 }
1982 }
1983
1984 for( const auto& [ libItemName, libSymbol ] : screen->GetLibSymbols() )
1985 libSymbol->ClearCaches();
1986
1988
1990 Layout();
1991 SendSizeEvent();
1992}
1993
1994
1996{
1997 // Store the current zoom level into the current screen before calling
1998 // DisplayCurrentSheet() that set the zoom to GetScreen()->m_LastZoomLevel
2000
2001 // Rebuild the sheet view (draw area and any other items):
2003}
2004
2005
2007{
2008 // call my base class
2010
2011 // tooltips in toolbars
2013
2014 // For some obscure reason, the AUI manager hides the first modified pane.
2015 // So force show panes
2016 wxAuiPaneInfo& design_blocks_pane_info = m_auimgr.GetPane( m_designBlocksPane );
2017 bool panel_shown = design_blocks_pane_info.IsShown();
2018 design_blocks_pane_info.Caption( _( "Design Blocks" ) );
2019 design_blocks_pane_info.Show( panel_shown );
2020
2021 m_auimgr.GetPane( m_hierarchy ).Caption( _( "Schematic Hierarchy" ) );
2022 m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
2023 m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
2024 m_auimgr.GetPane( m_designBlocksPane ).Caption( _( "Design Blocks" ) );
2025 m_auimgr.GetPane( RemoteSymbolPaneName() ).Caption( _( "Remote Symbols" ) );
2026 m_auimgr.Update();
2027 m_hierarchy->UpdateHierarchyTree();
2028
2029 // status bar
2031
2032 updateTitle();
2033
2034 // This ugly hack is to fix an option(left) toolbar update bug that seems to only affect
2035 // windows. See https://bugs.launchpad.net/kicad/+bug/1816492. For some reason, calling
2036 // wxWindow::Refresh() does not resolve the issue. Only a resize event seems to force the
2037 // toolbar to update correctly.
2038#if defined( __WXMSW__ )
2039 PostSizeEvent();
2040#endif
2041}
2042
2043
2045{
2046 if( !GetHighlightedConnection().IsEmpty() )
2047 {
2048 SetStatusText( wxString::Format( _( "Highlighted net: %s" ),
2050 }
2051 else
2052 {
2053 SetStatusText( wxT( "" ) );
2054 }
2055}
2056
2057
2059{
2060 if( m_toolManager )
2062
2063 SCH_BASE_FRAME::SetScreen( aScreen );
2064 GetCanvas()->DisplaySheet( static_cast<SCH_SCREEN*>( aScreen ) );
2065
2066 if( m_toolManager )
2068}
2069
2070
2071const BOX2I SCH_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
2072{
2073 BOX2I bBoxDoc;
2074
2075 if( !GetScreen() )
2076 return bBoxDoc;
2077
2078 if( aIncludeAllVisible )
2079 {
2080 // Get the whole page size and return that
2081 int sizeX = GetScreen()->GetPageSettings().GetWidthIU( schIUScale.IU_PER_MILS );
2082 int sizeY = GetScreen()->GetPageSettings().GetHeightIU( schIUScale.IU_PER_MILS );
2083 bBoxDoc = BOX2I( VECTOR2I( 0, 0 ), VECTOR2I( sizeX, sizeY ) );
2084 }
2085 else
2086 {
2087 // Get current drawing-sheet in a form we can compare to an EDA_ITEM
2089 EDA_ITEM* dsAsItem = static_cast<EDA_ITEM*>( ds );
2090
2091 // Calc the bounding box of all items on screen except the page border
2092 for( EDA_ITEM* item : GetScreen()->Items() )
2093 {
2094 if( item != dsAsItem ) // Ignore the drawing-sheet itself
2095 bBoxDoc.Merge( item->GetBoundingBox() );
2096 }
2097 }
2098
2099 return bBoxDoc;
2100}
2101
2102
2104{
2105 return Schematic().Hierarchy().IsModified();
2106}
2107
2108
2110{
2111 EESCHEMA_SETTINGS* cfg = eeconfig();
2112 return cfg && cfg->m_Appearance.show_hidden_pins;
2113}
2114
2115
2116void SCH_EDIT_FRAME::FocusOnItem( EDA_ITEM* aItem, bool aAllowScroll )
2117{
2118 // nullptr will clear the current focus
2119 if( aItem != nullptr && !aItem->IsSCH_ITEM() )
2120 return;
2121
2122 static KIID lastBrightenedItemID( niluuid );
2123
2124 SCH_ITEM* lastItem = Schematic().ResolveItem( lastBrightenedItemID, nullptr, true );
2125
2126 if( lastItem && lastItem != aItem )
2127 {
2128 lastItem->ClearBrightened();
2129
2130 UpdateItem( lastItem );
2131 lastBrightenedItemID = niluuid;
2132 }
2133
2134 if( aItem )
2135 {
2136 if( !aItem->IsBrightened() )
2137 {
2138 aItem->SetBrightened();
2139
2140 UpdateItem( aItem );
2141 lastBrightenedItemID = aItem->m_Uuid;
2142 }
2143
2144 FocusOnLocation( aItem->GetFocusPosition(), aAllowScroll );
2145 }
2146}
2147
2148
2150{
2151 return Schematic().GetFileName();
2152}
2153
2154
2156{
2157 return m_toolManager->GetTool<SCH_SELECTION_TOOL>()->GetSelection();
2158}
2159
2160void SCH_EDIT_FRAME::onSize( wxSizeEvent& aEvent )
2161{
2162 if( IsShown() )
2163 {
2164 // We only need this until the frame is done resizing and the final client size is
2165 // established.
2166 Unbind( wxEVT_SIZE, &SCH_EDIT_FRAME::onSize, this );
2168 }
2169
2170 // Skip() is called in the base class.
2171 EDA_DRAW_FRAME::OnSize( aEvent );
2172}
2173
2174
2176 const KIID& aSchematicSymbolUUID )
2177{
2178 SCH_SHEET_PATH principalPath;
2179 SCH_SHEET_LIST sheets = Schematic().Hierarchy();
2180 SCH_ITEM* item = sheets.ResolveItem( aSchematicSymbolUUID, &principalPath, true );
2181 SCH_SYMBOL* principalSymbol = dynamic_cast<SCH_SYMBOL*>( item );
2182 SCH_COMMIT commit( m_toolManager );
2183
2184 if( !principalSymbol )
2185 return;
2186
2187 wxString principalRef;
2188
2189 if( principalSymbol->IsAnnotated( &principalPath ) )
2190 principalRef = principalSymbol->GetRef( &principalPath, false );
2191
2192 std::vector< std::pair<SCH_SYMBOL*, SCH_SHEET_PATH> > allUnits;
2193
2194 for( const SCH_SHEET_PATH& path : sheets )
2195 {
2196 for( SCH_ITEM* candidate : path.LastScreen()->Items().OfType( SCH_SYMBOL_T ) )
2197 {
2198 SCH_SYMBOL* candidateSymbol = static_cast<SCH_SYMBOL*>( candidate );
2199
2200 if( candidateSymbol == principalSymbol
2201 || ( candidateSymbol->IsAnnotated( &path )
2202 && candidateSymbol->GetRef( &path, false ) == principalRef ) )
2203 {
2204 allUnits.emplace_back( candidateSymbol, path );
2205 }
2206 }
2207 }
2208
2209 for( auto& [ unit, path ] : allUnits )
2210 {
2211 // This needs to be done before the LIB_SYMBOL is changed to prevent stale
2212 // library symbols in the schematic file.
2213 path.LastScreen()->Remove( unit );
2214
2215 if( !unit->IsNew() )
2216 commit.Modify( unit, path.LastScreen() );
2217
2218 unit->SetLibSymbol( aSymbol.Flatten().release() );
2219 unit->UpdateFields( &GetCurrentSheet(),
2220 true, /* update style */
2221 true, /* update ref */
2222 true, /* update other fields */
2223 false, /* reset ref */
2224 false /* reset other fields */ );
2225
2226 path.LastScreen()->Append( unit );
2227 GetCanvas()->GetView()->Update( unit );
2228 }
2229
2230 // Clear any orphaned alternate pins.
2231 for( SCH_PIN* pin : principalSymbol->GetPins() )
2232 {
2233 wxString altName = pin->GetAlt();
2234
2235 if( altName.IsEmpty() )
2236 continue;
2237
2238 if( pin->GetAlternates().count( altName ) == 0 )
2239 pin->SetAlt( wxEmptyString );
2240 }
2241
2242 if( !commit.Empty() )
2243 commit.Push( _( "Save Symbol to Schematic" ) );
2244}
2245
2246
2247void SCH_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
2248{
2249 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
2250
2251 if( SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( aItem ) )
2252 sch_item->ClearCaches();
2253}
2254
2255
2257{
2258 wxCHECK( m_toolManager, /* void */ );
2259
2263
2264 wxCHECK( screen, /* void */ );
2265
2267
2268 SCH_BASE_FRAME::SetScreen( screen );
2269
2270 SetSheetNumberAndCount(); // will also update CurrentScreen()'s sheet number info
2271
2273
2274 // update the references, units, and intersheet-refs
2276
2277 // dangling state can also have changed if different units with different pin locations are
2278 // used
2281
2282 SCH_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<SCH_SELECTION_TOOL>();
2283
2284 wxCHECK( selectionTool, /* void */ );
2285
2286 auto visit =
2287 [&]( EDA_ITEM* item )
2288 {
2290 && !m_findReplaceData->findString.IsEmpty()
2291 && item->Matches( *m_findReplaceData, &GetCurrentSheet() ) )
2292 {
2293 item->SetForceVisible( true );
2294 selectionTool->BrightenItem( item );
2295 }
2296 else if( item->IsBrightened() )
2297 {
2298 item->SetForceVisible( false );
2299 selectionTool->UnbrightenItem( item );
2300 }
2301 };
2302
2303 for( SCH_ITEM* item : screen->Items() )
2304 {
2305 visit( item );
2306
2307 item->RunOnChildren(
2308 [&]( SCH_ITEM* aChild )
2309 {
2310 visit( aChild );
2311 },
2313 }
2314
2315 if( !screen->m_zoomInitialized )
2316 {
2318 }
2319 else
2320 {
2321 // Set zoom to last used in this screen
2322 GetCanvas()->GetView()->SetScale( GetScreen()->m_LastZoomLevel );
2323 GetCanvas()->GetView()->SetCenter( GetScreen()->m_ScrollCenter );
2324 }
2325
2326 updateTitle();
2327
2328 HardRedraw(); // Ensure all items are redrawn (especially the drawing-sheet items)
2329
2330 // Allow tools to re-add their VIEW_ITEMs after the last call to Clear in HardRedraw
2332
2333 SCH_EDITOR_CONTROL* editTool = m_toolManager->GetTool<SCH_EDITOR_CONTROL>();
2334
2335 wxCHECK( editTool, /* void */ );
2336
2338 editTool->UpdateNetHighlighting( dummy );
2339
2340 m_hierarchy->UpdateHierarchySelection();
2341
2342 m_schematic->OnSchSheetChanged();
2343}
2344
2345
2347{
2348 if( !m_diffSymbolDialog )
2349 {
2351 _( "Compare Symbol with Library" ) );
2352
2353 m_diffSymbolDialog->m_sdbSizerApply->SetLabel( _( "Update Symbol from Library..." ) );
2354 m_diffSymbolDialog->m_sdbSizerApply->Show();
2355 }
2356
2357 return m_diffSymbolDialog;
2358}
2359
2360
2361void SCH_EDIT_FRAME::onCloseSymbolDiffDialog( wxCommandEvent& aEvent )
2362{
2363 if( m_diffSymbolDialog && aEvent.GetString() == DIFF_SYMBOLS_DIALOG_NAME )
2364 {
2365 if( aEvent.GetId() == wxID_APPLY )
2366 {
2367 KIID symbolUUID = m_diffSymbolDialog->GetUserItemID();
2368
2369 CallAfter(
2370 [this, symbolUUID]()
2371 {
2372 EDA_ITEM* item = ResolveItem( symbolUUID );
2373
2374 if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( item ) )
2375 {
2376 m_toolManager->RunAction<EDA_ITEM*>( ACTIONS::selectItem, symbol );
2377
2379 dlg.ShowQuasiModal();
2380 }
2381 } );
2382 }
2383
2384 m_diffSymbolDialog->Destroy();
2385 m_diffSymbolDialog = nullptr;
2386 }
2387}
2388
2389
2391{
2392 if( !m_ercDialog )
2393 m_ercDialog = new DIALOG_ERC( this );
2394
2395 return m_ercDialog;
2396}
2397
2398
2399void SCH_EDIT_FRAME::onCloseErcDialog( wxCommandEvent& aEvent )
2400{
2401 if( m_ercDialog )
2402 {
2403 m_ercDialog->Destroy();
2404 m_ercDialog = nullptr;
2405 }
2406}
2407
2408
2416
2417
2419{
2421 {
2422 m_symbolFieldsTableDialog->Destroy();
2423 m_symbolFieldsTableDialog = nullptr;
2424 }
2425}
2426
2427
2428void SCH_EDIT_FRAME::AddSchematicChangeListener( wxEvtHandler* aListener )
2429{
2430 auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(), aListener );
2431
2432 // Don't add duplicate listeners.
2433 if( it == m_schematicChangeListeners.end() )
2434 m_schematicChangeListeners.push_back( aListener );
2435}
2436
2437
2439{
2440 auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(), aListener );
2441
2442 // Don't add duplicate listeners.
2443 if( it != m_schematicChangeListeners.end() )
2444 m_schematicChangeListeners.erase( it );
2445}
2446
2447
2449{
2450 wxPanel* panel = new wxPanel( this );
2451
2452 wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL );
2453
2454 // Create horizontal sizer for search control and gear button
2455 wxBoxSizer* searchSizer = new wxBoxSizer( wxHORIZONTAL );
2456
2457 m_netNavigatorFilter = new wxSearchCtrl( panel, wxID_ANY );
2458 m_netNavigatorFilter->SetDescriptiveText( _( "Filter nets" ) );
2459 m_netNavigatorFilter->ShowCancelButton( false );
2460 searchSizer->Add( m_netNavigatorFilter, 1, wxEXPAND | wxRIGHT, FromDIP( 2 ) );
2461
2462 m_netNavigatorMenuButton = new BITMAP_BUTTON( panel, wxID_ANY );
2464 m_netNavigatorMenuButton->SetPadding( FromDIP( 2 ) );
2465 searchSizer->Add( m_netNavigatorMenuButton, 0, wxALIGN_CENTER_VERTICAL );
2466
2467 sizer->Add( searchSizer, 0, wxEXPAND | wxALL, FromDIP( 2 ) );
2468
2469 m_netNavigator = new wxTreeCtrl( panel, wxID_ANY, wxPoint( 0, 0 ), FromDIP( wxSize( 160, 250 ) ),
2470 wxTR_DEFAULT_STYLE | wxNO_BORDER );
2471 sizer->Add( m_netNavigator, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP( 2 ) );
2472
2473 panel->SetSizer( sizer );
2474
2475 m_netNavigatorFilter->Bind( wxEVT_COMMAND_TEXT_UPDATED,
2477 m_netNavigatorFilter->Bind( wxEVT_KEY_DOWN, &SCH_EDIT_FRAME::onNetNavigatorKey, this );
2478 m_netNavigator->Bind( wxEVT_KEY_DOWN, &SCH_EDIT_FRAME::onNetNavigatorKey, this );
2479 m_netNavigator->Bind( wxEVT_TREE_ITEM_MENU, &SCH_EDIT_FRAME::onNetNavigatorItemMenu, this );
2480 m_netNavigator->Bind( wxEVT_CONTEXT_MENU, &SCH_EDIT_FRAME::onNetNavigatorContextMenu, this );
2481
2482 m_netNavigatorMenuButton->Bind( wxEVT_LEFT_DOWN,
2483 [this]( wxMouseEvent& event )
2484 {
2485 wxMenu menu;
2486 wxMenuItem* wildcardItem = menu.AppendRadioItem( ID_NET_NAVIGATOR_SEARCH_WILDCARD,
2487 _( "Wildcard Search" ) );
2488 wxMenuItem* regexItem = menu.AppendRadioItem( ID_NET_NAVIGATOR_SEARCH_REGEX,
2489 _( "Regex Search" ) );
2490
2491 EESCHEMA_SETTINGS* cfg = eeconfig();
2492
2494 wildcardItem->Check();
2495 else
2496 regexItem->Check();
2497
2498 PopupMenu( &menu );
2499 } );
2500
2506
2507 return panel;
2508}
2509
2510
2511void SCH_EDIT_FRAME::SetHighlightedConnection( const wxString& aConnection,
2512 const NET_NAVIGATOR_ITEM_DATA* aSelection )
2513{
2514 bool refreshNetNavigator = aConnection != m_highlightedConn;
2515
2516 m_highlightedConn = aConnection;
2517
2518 if( refreshNetNavigator )
2519 RefreshNetNavigator( aSelection );
2520}
2521
2522
2524{
2525 if( m_netNavigator )
2526 {
2527 NET_NAVIGATOR_ITEM_DATA itemData;
2528 wxTreeItemId selection = m_netNavigator->GetSelection();
2529 bool refreshSelection = selection.IsOk() && ( selection != m_netNavigator->GetRootItem() );
2530
2531 if( refreshSelection )
2532 {
2534 dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( selection ) );
2535
2536 wxCHECK( tmp, /* void */ );
2537 itemData = *tmp;
2538 }
2539
2540 m_netNavigator->DeleteAllItems();
2541 RefreshNetNavigator( refreshSelection ? &itemData : nullptr );
2542 }
2543
2545}
2546
2547
2549{
2550 if( !m_netNavigator )
2551 return;
2552
2553 wxString newFilter = m_netNavigatorFilter ? m_netNavigatorFilter->GetValue() : wxString();
2554
2555 if( newFilter == m_netNavigatorFilterValue )
2556 return;
2557
2558 m_netNavigatorFilterValue = newFilter;
2559
2560 NET_NAVIGATOR_ITEM_DATA selectionData;
2561 NET_NAVIGATOR_ITEM_DATA* selectionPtr = nullptr;
2562
2563 wxTreeItemId selection = m_netNavigator->GetSelection();
2564
2565 if( selection.IsOk() )
2566 {
2567 if( NET_NAVIGATOR_ITEM_DATA* tmp =
2568 dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( selection ) ) )
2569 {
2570 selectionData = *tmp;
2571 selectionPtr = &selectionData;
2572 }
2573 }
2574
2575 RefreshNetNavigator( selectionPtr );
2576
2577 aEvent.Skip();
2578}
2579
2580
2581void SCH_EDIT_FRAME::onNetNavigatorKey( wxKeyEvent& aEvent )
2582{
2583 if( aEvent.GetKeyCode() == WXK_ESCAPE )
2584 {
2585 // Clear the search string and refresh
2587 m_netNavigatorFilter->SetValue( wxEmptyString );
2588
2589 m_netNavigatorFilterValue = wxEmptyString;
2590
2592
2593 // Don't skip the event - we handled it
2594 return;
2595 }
2596
2597 aEvent.Skip();
2598}
2599
2600
2601
2603{
2604 showNetNavigatorMenu( aEvent.GetItem() );
2605}
2606
2607
2608void SCH_EDIT_FRAME::onNetNavigatorContextMenu( wxContextMenuEvent& aEvent )
2609{
2610 if( !m_netNavigator )
2611 return;
2612
2613 wxPoint screenPos = aEvent.GetPosition();
2614
2615 if( screenPos == wxDefaultPosition )
2616 screenPos = wxGetMousePosition();
2617
2618 wxPoint clientPos = m_netNavigator->ScreenToClient( screenPos );
2619 int flags = 0;
2620 wxTreeItemId item = m_netNavigator->HitTest( clientPos, flags );
2621
2622 showNetNavigatorMenu( item );
2623}
2624
2625
2626void SCH_EDIT_FRAME::showNetNavigatorMenu( const wxTreeItemId& aItem )
2627{
2628 if( !m_netNavigator )
2629 return;
2630
2631 wxMenu menu;
2632
2633 menu.Append( ID_NET_NAVIGATOR_EXPAND_ALL, _( "Expand All" ) );
2634 menu.Append( ID_NET_NAVIGATOR_COLLAPSE_ALL, _( "Collapse All" ) );
2635
2636 wxMenuItem* findInInspector = new wxMenuItem( &menu, ID_NET_NAVIGATOR_FIND_IN_INSPECTOR,
2637 _( "Find in Net Inspector" ) );
2638 menu.Append( findInInspector );
2639
2640 wxString netName;
2641
2642 if( aItem.IsOk() )
2643 {
2644 wxTreeItemId netItem = aItem;
2645
2646 if( m_netNavigator->GetItemParent( netItem ) != m_netNavigator->GetRootItem() )
2647 {
2648 wxTreeItemId parent = m_netNavigator->GetItemParent( netItem );
2649
2650 while( parent.IsOk() && parent != m_netNavigator->GetRootItem() )
2651 {
2652 netItem = parent;
2653 parent = m_netNavigator->GetItemParent( netItem );
2654 }
2655
2656 if( parent == m_netNavigator->GetRootItem() )
2657 {
2658 if( wxStringClientData* data =
2659 dynamic_cast<wxStringClientData*>( m_netNavigator->GetItemData( netItem ) ) )
2660 {
2661 netName = data->GetData();
2662 }
2663 }
2664 }
2665 else if( m_netNavigator->GetItemParent( netItem ) == m_netNavigator->GetRootItem() )
2666 {
2667 if( wxStringClientData* data =
2668 dynamic_cast<wxStringClientData*>( m_netNavigator->GetItemData( netItem ) ) )
2669 {
2670 netName = data->GetData();
2671 }
2672 }
2673 else if( !m_highlightedConn.IsEmpty() && netItem == m_netNavigator->GetRootItem() )
2674 {
2675 netName = m_highlightedConn;
2676 }
2677 }
2678 else if( !m_highlightedConn.IsEmpty() && m_netNavigator->GetRootItem().IsOk() )
2679 {
2680 netName = m_highlightedConn;
2681 }
2682
2683 if( netName.IsEmpty() )
2684 {
2685 findInInspector->Enable( false );
2687 }
2688 else
2689 {
2690 m_netNavigatorMenuNetName = netName;
2691 }
2692
2693 PopupMenu( &menu );
2694}
2695
2696
2697void SCH_EDIT_FRAME::onNetNavigatorMenuCommand( wxCommandEvent& aEvent )
2698{
2699 if( !m_netNavigator )
2700 return;
2701
2702 switch( aEvent.GetId() )
2703 {
2705 m_netNavigator->ExpandAll();
2706 break;
2707
2709 m_netNavigator->CollapseAll();
2710
2711 if( m_netNavigator->GetRootItem().IsOk() )
2712 m_netNavigator->Expand( m_netNavigator->GetRootItem() );
2713 break;
2714
2716 if( !m_netNavigatorMenuNetName.IsEmpty() )
2718 break;
2719
2722 {
2723 EESCHEMA_SETTINGS* cfg = eeconfig();
2724 if( cfg )
2725 {
2727 ( aEvent.GetId() == ID_NET_NAVIGATOR_SEARCH_WILDCARD );
2728
2729 // Refresh the navigator with current filter
2731 }
2732 break;
2733 }
2734
2735 default:
2736 aEvent.Skip();
2737 return;
2738 }
2739
2741
2742 aEvent.Skip( false );
2743}
2744
2745
2747{
2748 wxAuiPaneInfo& hierarchyPane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
2749 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
2750 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
2751 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
2752
2753 // Don't give the selection filter its own visibility controls; instead show it if
2754 // anything else is visible
2755 bool showFilter = ( hierarchyPane.IsShown() && hierarchyPane.IsDocked() )
2756 || ( netNavigatorPane.IsShown() && netNavigatorPane.IsDocked() )
2757 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
2758
2759 selectionFilterPane.Show( showFilter );
2760}
2761
2762
2763#ifdef KICAD_IPC_API
2764void SCH_EDIT_FRAME::onPluginAvailabilityChanged( wxCommandEvent& aEvt )
2765{
2766 wxLogTrace( traceApi, "SCH frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" );
2768 aEvt.Skip();
2769}
2770#endif
2771
2772
2774{
2775 EESCHEMA_SETTINGS* cfg = eeconfig();
2776
2777 // Ensure m_show_search is up to date (the pane can be closed outside the menu)
2778 m_show_search = m_auimgr.GetPane( SearchPaneName() ).IsShown();
2779
2781
2782 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
2783 searchPaneInfo.Show( m_show_search );
2784
2785 if( m_show_search )
2786 {
2787 searchPaneInfo.Direction( cfg->m_AuiPanels.search_panel_dock_direction );
2788
2789 if( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_TOP
2790 || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_BOTTOM )
2791 {
2792 SetAuiPaneSize( m_auimgr, searchPaneInfo, -1, cfg->m_AuiPanels.search_panel_height );
2793 }
2794 else if( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_LEFT
2795 || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_RIGHT )
2796 {
2797 SetAuiPaneSize( m_auimgr, searchPaneInfo, cfg->m_AuiPanels.search_panel_width, -1 );
2798 }
2799
2800 m_searchPane->FocusSearch();
2801 m_searchPane->RefreshSearch();
2802 }
2803 else
2804 {
2805 cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
2806 cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
2807 cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
2808 m_auimgr.Update();
2809 }
2810}
2811
2812
2814{
2815 if( !m_propertiesPanel )
2816 return;
2817
2818 bool show = !m_propertiesPanel->IsShownOnScreen();
2819
2820 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
2821 propertiesPaneInfo.Show( show );
2822
2824
2825 EESCHEMA_SETTINGS* settings = eeconfig();
2826
2827 if( show )
2828 {
2829 SetAuiPaneSize( m_auimgr, propertiesPaneInfo,
2830 settings->m_AuiPanels.properties_panel_width, -1 );
2831 }
2832 else
2833 {
2834 settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x;
2835 m_auimgr.Update();
2836 }
2837}
2838
2839
2841{
2842 EESCHEMA_SETTINGS* cfg = eeconfig();
2843
2844 wxCHECK( cfg, /* void */ );
2845
2846 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
2847
2848 hierarchy_pane.Show( !hierarchy_pane.IsShown() );
2849
2851
2852 if( hierarchy_pane.IsShown() )
2853 {
2854 if( hierarchy_pane.IsFloating() )
2855 {
2856 hierarchy_pane.FloatingSize( cfg->m_AuiPanels.hierarchy_panel_float_width,
2858 m_auimgr.Update();
2859 }
2860 else if( cfg->m_AuiPanels.hierarchy_panel_docked_width > 0 )
2861 {
2862 // SetAuiPaneSize also updates m_auimgr
2863 SetAuiPaneSize( m_auimgr, hierarchy_pane,
2865 }
2866 }
2867 else
2868 {
2869 if( hierarchy_pane.IsFloating() )
2870 {
2871 cfg->m_AuiPanels.hierarchy_panel_float_width = hierarchy_pane.floating_size.x;
2872 cfg->m_AuiPanels.hierarchy_panel_float_height = hierarchy_pane.floating_size.y;
2873 }
2874 else
2875 {
2877 }
2878
2879 m_auimgr.Update();
2880 }
2881}
2882
2883
2885{
2886 EESCHEMA_SETTINGS* cfg = eeconfig();
2887
2888 wxCHECK( cfg, /* void */ );
2889
2890 wxAuiPaneInfo& db_library_pane = m_auimgr.GetPane( DesignBlocksPaneName() );
2891
2892 db_library_pane.Show( !db_library_pane.IsShown() );
2893
2894 if( db_library_pane.IsShown() )
2895 {
2896 if( db_library_pane.IsFloating() )
2897 {
2898 db_library_pane.FloatingSize( cfg->m_AuiPanels.design_blocks_panel_float_width,
2900 m_auimgr.Update();
2901 }
2903 {
2904 // SetAuiPaneSize also updates m_auimgr
2905 SetAuiPaneSize( m_auimgr, db_library_pane,
2907 }
2908 }
2909 else
2910 {
2911 if( db_library_pane.IsFloating() )
2912 {
2913 cfg->m_AuiPanels.design_blocks_panel_float_width = db_library_pane.floating_size.x;
2914 cfg->m_AuiPanels.design_blocks_panel_float_height = db_library_pane.floating_size.y;
2915 }
2916 else
2917 {
2919 }
2920
2921 m_auimgr.Update();
2922 }
2923}
2924
2925
2927{
2928 EESCHEMA_SETTINGS* cfg = eeconfig();
2929
2930 wxCHECK( cfg, /* void */ );
2931
2932 wxAuiPaneInfo& remotePane = m_auimgr.GetPane( RemoteSymbolPaneName() );
2933
2934 remotePane.Show( !remotePane.IsShown() );
2935
2936 if( remotePane.IsShown() )
2937 {
2938 if( remotePane.IsFloating() )
2939 {
2940 remotePane.FloatingSize( cfg->m_AuiPanels.remote_symbol_panel_float_width,
2942 m_auimgr.Update();
2943 }
2945 {
2946 SetAuiPaneSize( m_auimgr, remotePane,
2948 }
2949 }
2950 else
2951 {
2952 if( remotePane.IsFloating() )
2953 {
2954 cfg->m_AuiPanels.remote_symbol_panel_float_width = remotePane.floating_size.x;
2955 cfg->m_AuiPanels.remote_symbol_panel_float_height = remotePane.floating_size.y;
2956 }
2957 else if( m_remoteSymbolPane )
2958 {
2960 }
2961
2962 m_auimgr.Update();
2963 }
2964}
2965
2966
2968{
2969 wxCHECK( aSchematic, /* void */ );
2970
2971 if( m_schematic )
2972 m_schematic->SetProject( nullptr );
2973
2974 aSchematic->SetProject( &Prj() );
2975 delete m_schematic;
2976
2977 m_schematic = aSchematic;
2978 m_schematic->SetSchematicHolder( this );
2979
2980 KIGFX::SCH_VIEW* view = GetCanvas()->GetView();
2981 static_cast<KIGFX::SCH_PAINTER*>( view->GetPainter() )->SetSchematic( m_schematic );
2982 m_toolManager->SetEnvironment( m_schematic, GetCanvas()->GetView(), GetCanvas()->GetViewControls(), config(),
2983 this );
2984}
2985
2986
2988{
2990 return;
2991
2992 wxTextEntryDialog dlg( this, _( "Enter new variant name" ), _( "Variant Name" ) );
2993
2994 if( dlg.ShowModal() == wxID_CANCEL )
2995 return;
2996
2997 wxString variantName = dlg.GetValue();
2998
2999 if( variantName.IsEmpty() || ( m_currentVariantCtrl->FindString( variantName ) != wxNOT_FOUND ) )
3000 return;
3001
3002 Schematic().AddVariant( variantName );
3003
3004 int selected = m_currentVariantCtrl->GetSelection();
3005 wxString tmp;
3006
3007 if( selected != wxNOT_FOUND )
3008 tmp = m_currentVariantCtrl->GetString( selected );
3009
3010 m_currentVariantCtrl->Set( Schematic().GetVariantNamesForUI() );
3011
3012 if( selected != wxNOT_FOUND )
3013 {
3014 selected = m_currentVariantCtrl->FindString( tmp );
3015 m_currentVariantCtrl->SetSelection( selected );
3016 }
3017}
3018
3019
3021{
3023 return;
3024
3025 wxArrayString choices = Schematic().GetVariantNamesForUI();
3026
3027 // Default variant cannot be removed.
3028 choices.RemoveAt( 0 );
3029
3030 wxSingleChoiceDialog dlg( this, _( "Select variant name to remove" ), _( "Variant Name" ), choices );
3031
3032 if( dlg.ShowModal() == wxID_CANCEL )
3033 return;
3034
3035 wxString variantName = dlg.GetStringSelection();
3036
3037 if( variantName.IsEmpty() || ( m_currentVariantCtrl->FindString( variantName ) != wxNOT_FOUND ) )
3038 return;
3039
3040 Schematic().DeleteVariant( variantName );
3041
3042 int selected = m_currentVariantCtrl->GetSelection();
3043 wxString tmp;
3044
3045 if( selected != wxNOT_FOUND )
3046 tmp = m_currentVariantCtrl->GetString( selected );
3047
3048 m_currentVariantCtrl->Set( Schematic().GetVariantNamesForUI() );
3049
3050 if( selected != wxNOT_FOUND )
3051 {
3052 if( tmp != variantName )
3053 {
3054 selected = m_currentVariantCtrl->FindString( tmp );
3055 m_currentVariantCtrl->SetSelection( selected );
3056 }
3057 else
3058 {
3059 m_currentVariantCtrl->SetSelection( 0 );
3060 SetCurrentVariant( wxEmptyString );
3061 }
3062 }
3063}
3064
3065
3067{
3068 // Delegate to base auto-save behavior (commits pending local history) for now.
3070}
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:114
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
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition bitmap.cpp:110
@ icon_eeschema_16
@ icon_eeschema_32
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
static TOOL_ACTION toggleGrid
Definition actions.h:198
static TOOL_ACTION paste
Definition actions.h:80
static TOOL_ACTION cancelInteractive
Definition actions.h:72
static TOOL_ACTION unselectAll
Definition actions.h:83
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
Definition actions.h:227
static TOOL_ACTION copy
Definition actions.h:78
static TOOL_ACTION group
Definition actions.h:239
static TOOL_ACTION pasteSpecial
Definition actions.h:81
static TOOL_ACTION ungroup
Definition actions.h:240
static TOOL_ACTION toggleBoundingBoxes
Definition actions.h:157
static TOOL_ACTION showSearch
Definition actions.h:116
static TOOL_ACTION undo
Definition actions.h:75
static TOOL_ACTION selectionActivate
Activation of the selection tool.
Definition actions.h:214
static TOOL_ACTION duplicate
Definition actions.h:84
static TOOL_ACTION doDelete
Definition actions.h:85
static TOOL_ACTION selectionTool
Definition actions.h:251
static TOOL_ACTION save
Definition actions.h:58
static TOOL_ACTION zoomFitScreen
Definition actions.h:142
static TOOL_ACTION redo
Definition actions.h:76
static TOOL_ACTION deleteTool
Definition actions.h:86
static TOOL_ACTION zoomTool
Definition actions.h:146
static TOOL_ACTION selectionClear
Clear the current selection.
Definition actions.h:224
static TOOL_ACTION showProperties
Definition actions.h:266
static TOOL_ACTION cut
Definition actions.h:77
static TOOL_ACTION copyAsText
Definition actions.h:79
static TOOL_ACTION toggleGridOverrides
Definition actions.h:199
static TOOL_ACTION selectAll
Definition actions.h:82
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...
Handles how to draw a screen (a board, a schematic ...)
Definition base_screen.h:41
void SetContentModified(bool aModified=true)
Definition base_screen.h:59
A bitmap button widget that behaves like an AUI toolbar item's button when it is drawn.
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
bool Empty() const
Definition commit.h:137
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
Definition commit.h:106
Handle actions that are shared between different applications.
Handles action that are shared between different applications.
A subgraph is a set of items that are electrically connected on a single sheet.
Dialog to update or change schematic library symbols.
virtual bool doAutoSave()
This should be overridden by the derived class to handle the auto save feature.
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual void ProjectChanged()
Notification event that the project has changed.
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...
ACTION_TOOLBAR * m_tbRight
TOOLBAR_SETTINGS * m_toolbarSettings
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
wxAuiManager m_auimgr
virtual void RecreateToolbars()
ACTION_TOOLBAR * m_tbLeft
virtual void OnSize(wxSizeEvent &aEvent)
virtual void ClearFileHistory()
Remove all files from the file history.
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handle event fired when a file is dropped to the window.
std::map< const wxString, TOOL_ACTION * > m_acceptedExts
Associate file extensions with action to execute.
wxString GetFileFromHistory(int cmdId, const wxString &type, FILE_HISTORY *aFileHistory=nullptr)
Fetch the file name from the file history list.
virtual int GetUndoCommandCount() const
ACTION_TOOLBAR * m_tbTopMain
wxString m_aboutTitle
bool m_isClosing
Set by the close window event handler after frames are asked if they can close.
void ReCreateMenuBar()
Recreate the menu bar.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
The current canvas type.
void setupUnits(APP_SETTINGS_BASE *aCfg)
virtual void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Change the current rendering backend.
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.
virtual void resolveCanvasType()
Determine the canvas type to load (with prompt if required) and initializes m_canvasType.
static const wxString PropertiesPaneName()
EDA_MSG_PANEL * m_messagePanel
virtual void SetScreen(BASE_SCREEN *aScreen)
static const wxString RemoteSymbolPaneName()
virtual void UpdateMsgPanel()
Redraw the message panel.
void FocusOnLocation(const VECTOR2I &aPos, bool aAllowScroll=true)
Useful to focus on a particular location, in find functions.
virtual void ClearFocus()
SEARCH_PANE * m_searchPane
static const wxString DesignBlocksPaneName()
std::unique_ptr< EDA_SEARCH_DATA > m_findReplaceData
PROPERTIES_PANEL * m_propertiesPanel
bool m_showBorderAndTitleBlock
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:98
virtual const VECTOR2I GetFocusPosition() const
Similar to GetPosition() but allows items to return their visual center rather than their anchor.
Definition eda_item.h:279
const KIID m_Uuid
Definition eda_item.h:516
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
void ClearBrightened()
Definition eda_item.h:138
void SetBrightened()
Definition eda_item.h:135
bool IsBrightened() const
Definition eda_item.h:129
Specialization of the wxAuiPaneInfo class for KiCad panels.
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
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 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.
PANEL_ANNOTATE m_AnnotatePanel
bool empty() const
Definition sch_rtree.h:179
EE_TYPE OfType(KICAD_T aType) const
Definition sch_rtree.h:241
SEVERITY GetSeverity(int aErrorCode) const
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
APP_SETTINGS_BASE * KifaceSettings() const
Definition kiface_base.h:95
void SetDefaultFont(const wxString &aFont)
Contains methods for drawing schematic-specific items.
Definition sch_painter.h:69
void SetSchematic(SCHEMATIC *aSchematic)
Definition sch_painter.h:79
void Update(const KIGFX::VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition sch_view.cpp:60
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:102
An abstract base class for deriving all objects that can be added to a VIEW.
Definition view_item.h:86
bool IsSCH_ITEM() const
Definition view_item.h:101
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:66
double GetScale() const
Definition view.h:276
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition view.h:400
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition view.h:220
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
Definition view.cpp:596
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:1571
wxString AsString() const
Definition kiid.cpp:356
Definition kiid.h:49
KIWAY_PLAYER(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, const EDA_IU_SCALE &aIuScale)
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.
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:292
void OnKiCadExit()
Definition kiway.cpp:756
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:403
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr, bool aFromOtherThread=false)
Send aPayload to aDestination from aSource.
Definition kiway.cpp:507
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
Definition kiway.cpp:206
@ FACE_SCH
eeschema DSO
Definition kiway.h:299
LOCAL_HISTORY & LocalHistory()
Return the LOCAL_HISTORY associated with this KIWAY.
Definition kiway.h:404
Define a library symbol object.
Definition lib_symbol.h:83
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
bool CommitDuplicateOfLastSave(const wxString &aProjectPath, const wxString &aFileType, const wxString &aMessage)
Create a new commit duplicating the tree pointed to by Last_Save_<fileType> and move the Last_Save_<f...
void NoteFileChange(const wxString &aFile)
Record that a file has been modified and should be included in the next snapshot.
void RegisterSaver(const void *aSaverObject, const std::function< void(const wxString &, std::vector< wxString > &)> &aSaver)
Register a saver callback invoked during autosave history commits.
Tree view item data for the net navigator.
A singleton reporter that reports to nowhere.
Definition reporter.h:216
int GetHeightIU(double aIUScale) const
Gets the page height in IU.
Definition page_info.h:168
int GetWidthIU(double aIUScale) const
Gets the page width in IU.
Definition page_info.h:159
void PreloadDesignBlockLibraries(KIWAY *aKiway)
Starts a background job to preload the global and project design block libraries.
Definition pgm_base.cpp:871
A progress reporter interface for use in multi-threaded environments.
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
Definition project.cpp:161
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition project.cpp:167
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:391
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:88
void SetCurrentSheet(const SCH_SHEET_PATH &aPath)
Definition schematic.h:191
void Reset()
Initialize this schematic to a blank one, unloading anything existing.
void RecomputeIntersheetRefs()
Update the schematic's page reference map for all global labels, and refresh the labels so that they ...
wxString GetFileName() const
Helper to retrieve the filename from the root sheet screen.
void AddVariant(const wxString &aVariantName)
Definition schematic.h:467
SCHEMATIC_SETTINGS & Settings() const
SCH_ITEM * ResolveItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr, bool aAllowNullptrReturn=false) const
Definition schematic.h:119
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
void DeleteVariant(const wxString &aVariantName)
Delete all information for aVariantName.
void SetProject(PROJECT *aPrj)
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
wxArrayString GetVariantNamesForUI() const
Return an array of variant names for using in wxWidgets UI controls.
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, TOOL_MANAGER *aToolManager, PROGRESS_REPORTER *aProgressReporter=nullptr, KIGFX::SCH_VIEW *aSchView=nullptr, std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr, PICKED_ITEMS_LIST *aLastChangeList=nullptr)
Generate the connection data for the entire schematic hierarchy.
ERC_SETTINGS & ErcSettings() const
Gather all the actions that are shared by tools.
Definition sch_actions.h:40
static TOOL_ACTION rotateCCW
static TOOL_ACTION placeClassLabel
Definition sch_actions.h:79
static TOOL_ACTION placeSheetPin
Definition sch_actions.h:85
static TOOL_ACTION saveSheetAsDesignBlock
static TOOL_ACTION mirrorV
static TOOL_ACTION drawSheetFromFile
Definition sch_actions.h:83
static TOOL_ACTION toggleOPCurrents
static TOOL_ACTION saveToLinkedDesignBlock
Definition sch_actions.h:71
static TOOL_ACTION saveSelectionAsDesignBlock
static TOOL_ACTION placeGlobalLabel
Definition sch_actions.h:80
static TOOL_ACTION drawTextBox
Definition sch_actions.h:93
static TOOL_ACTION toggleAnnotateAuto
static TOOL_ACTION ddAddImage
static TOOL_ACTION drawArc
Definition sch_actions.h:97
static TOOL_ACTION drawSheet
Definition sch_actions.h:82
static TOOL_ACTION toggleERCWarnings
static TOOL_ACTION toggleDirectiveLabels
static TOOL_ACTION highlightNetTool
static TOOL_ACTION leaveSheet
static TOOL_ACTION ddImportGraphics
static TOOL_ACTION toggleHiddenFields
static TOOL_ACTION drawRectangle
Definition sch_actions.h:95
static TOOL_ACTION drawLines
Definition sch_actions.h:99
static TOOL_ACTION placeHierLabel
Definition sch_actions.h:81
static TOOL_ACTION alignTop
static TOOL_ACTION alignRight
static TOOL_ACTION placeLabel
Definition sch_actions.h:78
static TOOL_ACTION drawCircle
Definition sch_actions.h:96
static TOOL_ACTION placeBusWireEntry
Definition sch_actions.h:77
static TOOL_ACTION showRemoteSymbolPanel
static TOOL_ACTION drawBezier
Definition sch_actions.h:98
static TOOL_ACTION drawWire
Definition sch_actions.h:72
static TOOL_ACTION remapSymbols
static TOOL_ACTION rotateCW
static TOOL_ACTION alignBottom
static TOOL_ACTION showHierarchy
static TOOL_ACTION showNetNavigator
static TOOL_ACTION placeJunction
Definition sch_actions.h:76
static TOOL_ACTION markSimExclusions
static TOOL_ACTION drawRuleArea
static TOOL_ACTION placeSymbol
Definition sch_actions.h:66
static TOOL_ACTION placeImage
static TOOL_ACTION alignLeft
static TOOL_ACTION toggleERCErrors
static TOOL_ACTION alignCenterX
static TOOL_ACTION angleSnapModeChanged
static TOOL_ACTION placeLinkedDesignBlock
Definition sch_actions.h:70
static TOOL_ACTION drawSheetFromDesignBlock
Definition sch_actions.h:84
static TOOL_ACTION mirrorH
static TOOL_ACTION placeDesignBlock
Definition sch_actions.h:69
static TOOL_ACTION toggleOPVoltages
static TOOL_ACTION drawBus
Definition sch_actions.h:73
static TOOL_ACTION drawTable
Definition sch_actions.h:94
static TOOL_ACTION ddAppendFile
static TOOL_ACTION placeSchematicText
Definition sch_actions.h:92
static TOOL_ACTION showDesignBlockPanel
static TOOL_ACTION togglePinAltIcons
static TOOL_ACTION toggleERCExclusions
static TOOL_ACTION updateNetHighlighting
static TOOL_ACTION alignCenterY
static TOOL_ACTION placeNoConnect
Definition sch_actions.h:75
static TOOL_ACTION toggleHiddenPins
static TOOL_ACTION syncSheetPins
Definition sch_actions.h:89
static TOOL_ACTION placePower
Definition sch_actions.h:68
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
SCH_BASE_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aWindowType, const wxString &aTitle, const wxPoint &aPosition, const wxSize &aSize, long aStyle, const wxString &aFrameName)
SCH_RENDER_SETTINGS * GetRenderSettings()
void doCloseWindow() override
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
DIALOG_SCH_FIND * m_findReplaceDialog
void CommonSettingsChanged(int aFlags) 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.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
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 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.
int UpdateNetHighlighting(const TOOL_EVENT &aEvent)
Launch a tool to highlight nets.
Schematic editor (Eeschema) main window.
void DefaultExecFlags()
Reset the execution flags to defaults for external netlist and bom generators.
void OnCrossProbeFlashTimer(wxTimerEvent &aEvent)
void ToggleProperties() override
bool IsContentModified() const override
Get if the current schematic has been modified but not saved.
void RefreshOperatingPointDisplay()
Refresh the display of any operating points.
wxPageSetupDialogData m_pageSetupData
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
wxTreeCtrl * m_netNavigator
std::vector< std::unique_ptr< SCH_ITEM > > m_items_to_repeat
For the repeat-last-item cmd.
void FocusOnItem(EDA_ITEM *aItem, bool aAllowScroll=true) override
Focus on a particular canvas item.
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...
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 showNetNavigatorMenu(const wxTreeItemId &aItem)
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 ToggleLibraryTree() override
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.
wxWindow * createHighlightedNetNavigator()
void onCloseErcDialog(wxCommandEvent &aEvent)
void UpdateHierarchySelection()
Update the hierarchy navigation tree selection (cross-probe from schematic to hierarchy pane).
bool m_syncingPcbToSchSelection
void SetScreen(BASE_SCREEN *aScreen) override
friend class SCH_EDITOR_CONTROL
bool doAutoSave() override
Save the schematic files that have been modified and not yet saved.
wxChoice * m_currentVariantCtrl
void SaveSymbolToSchematic(const LIB_SYMBOL &aSymbol, const KIID &aSchematicSymbolUUID)
Update a schematic symbol from a LIB_SYMBOL.
void SetCurrentVariant(const wxString &aVariantName)
void onSize(wxSizeEvent &aEvent)
void CommonSettingsChanged(int aFlags) override
Called after the preferences dialog is run.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
BITMAP_BUTTON * m_netNavigatorMenuButton
void onNetNavigatorKey(wxKeyEvent &aEvent)
void configureToolbars() override
std::vector< wxEvtHandler * > m_schematicChangeListeners
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.
PANEL_REMOTE_SYMBOL * m_remoteSymbolPane
SCHEMATIC * m_schematic
The currently loaded schematic.
void onNetNavigatorFilterChanged(wxCommandEvent &aEvent)
void onCloseSymbolFieldsTableDialog(wxCommandEvent &aEvent)
SCH_SHEET_PATH & GetCurrentSheet() const
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, PROGRESS_REPORTER *aProgressReporter=nullptr)
Generate the connection data for the entire schematic hierarchy.
wxString m_netNavigatorFilterValue
void ProjectChanged() override
Notification event that the project has changed.
void OnLoadFile(wxCommandEvent &event)
SCHEMATIC & Schematic() const
void updateTitle()
Set the main window title bar text.
void SetSchematic(SCHEMATIC *aSchematic)
void ToggleSearch()
Toggle the show/hide state of Search pane.
bool LoadProjectSettings()
Load the KiCad project file (*.pro) settings specific to Eeschema.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void RefreshNetNavigator(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
wxSearchCtrl * m_netNavigatorFilter
wxString GetFullScreenDesc() const override
static const wxString SearchPaneName()
DIALOG_BOOK_REPORTER * GetSymbolDiffDialog()
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
void onNetNavigatorContextMenu(wxContextMenuEvent &aEvent)
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.
SCH_DESIGN_BLOCK_PANE * m_designBlocksPane
void UpdateHierarchyNavigator(bool aRefreshNetNavigator=true, bool aClear=false)
Update the hierarchy navigation tree and history.
SCH_EDIT_FRAME(KIWAY *aKiway, wxWindow *aParent)
void ToggleSchematicHierarchy()
Toggle the show/hide state of the left side schematic navigation panel.
std::vector< KIID > m_crossProbeFlashItems
Items to flash.
void LoadDrawingSheet()
Load the drawing sheet file.
void onNetNavigatorMenuCommand(wxCommandEvent &aEvent)
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
std::vector< LIB_ID > m_designBlockHistoryList
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 CaptureHierarchyPaneSize()
void StartCrossProbeFlash(const std::vector< SCH_ITEM * > &aItems)
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)
double GetSchematicHopOverScale()
static const wxString SchematicHierarchyPaneName()
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
EDA_ITEM * ResolveItem(const KIID &aId, bool aAllowNullptrReturn=false) const override
Fetch an item by KIID.
wxString m_netNavigatorMenuNetName
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 SetCurrentSheet(const SCH_SHEET_PATH &aSheet)
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.
void onNetNavigatorItemMenu(wxTreeEvent &aEvent)
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)
void IntersheetRefUpdate(SCH_GLOBALLABEL *aItem) override
Callback from schematic ref update.
void OnExit(wxCommandEvent &event)
void AutoRotateItem(SCH_SCREEN *aScreen, SCH_ITEM *aItem)
Automatically set the rotation of an item (if the item supports it).
wxTimer m_crossProbeFlashTimer
Timer to toggle selection visibility.
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
void UpdateHopOveredWires(SCH_ITEM *aItem)
SEVERITY GetSeverity(int aErrorCode) const override
void onNetNavigatorSelection(wxTreeEvent &aEvent)
void FindNetInInspector(const wxString &aNetName)
void SaveCopyForRepeatItem(const SCH_ITEM *aItem)
Clone aItem and owns that clone in this container.
Handle actions specific to the schematic editor.
A set of SCH_ITEMs (i.e., without duplicates).
Definition sch_group.h:52
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:167
SCH_ITEM * Duplicate(bool addToParentGroup, SCH_COMMIT *aCommit=nullptr, bool doClone=false) const
Routine to create a new copy of given item.
Definition sch_item.cpp:137
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode)
Definition sch_item.h:611
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:352
bool ResolveExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.cpp:274
bool AutoRotateOnPlacement() const
autoRotateOnPlacement
SPIN_STYLE GetSpinStyle() const
void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo) override
virtual void SetSpinStyle(SPIN_STYLE aSpinStyle)
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:42
void SetOperatingPoint(const wxString &aText)
Definition sch_line.h:348
bool IsWire() const
Return true if the line is a wire.
Definition sch_line.cpp:988
double GetLength() const
Definition sch_line.cpp:249
const wxString & GetOperatingPoint() const
Definition sch_line.h:347
Handle actions specific to the schematic editor.
void SetOperatingPoint(const wxString &aText)
Definition sch_pin.h:338
Tool that displays edit points allowing to modify items by dragging the points.
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
Definition sch_screen.h:728
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:139
void Clear(bool aFree=true)
Delete all draw items and clears the project settings.
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:485
double m_LastZoomLevel
last value for the zoom level, useful in Eeschema when changing the current displayed sheet to reuse ...
Definition sch_screen.h:655
EE_RTREE & Items()
Get the full RTree, usually for iterating.
Definition sch_screen.h:117
const wxString & GetFileName() const
Definition sch_screen.h:152
bool IsReadOnly() const
Definition sch_screen.h:155
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
bool m_zoomInitialized
Definition sch_screen.h:680
bool FileExists() const
Definition sch_screen.h:158
SPIN_STYLE GetLabelOrientationForPoint(const VECTOR2I &aPosition, SPIN_STYLE aDefaultOrientation, const SCH_SHEET_PATH *aSheet) const
int ClearSelection(const TOOL_EVENT &aEvent)
Select all visible items in sheet.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
SCH_ITEM * ResolveItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr, bool aAllowNullptrReturn=false) 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.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
void UpdateAllScreenReferences() const
Update all the symbol references for this sheet path.
SCH_SCREEN * LastScreen()
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
void clear()
Forwarded method from std::vector.
size_t size() const
Forwarded method from std::vector.
wxString GetName() const
Definition sch_sheet.h:113
Schematic symbol object.
Definition sch_symbol.h:76
EMBEDDED_FILES * GetEmbeddedFiles() override
SCH_SYMBOLs don't currently support embedded files, but their LIB_SYMBOL counterparts do.
bool IsAnnotated(const SCH_SHEET_PATH *aSheet) const
Check if the symbol has a valid annotation (reference) for the given sheet path.
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
VECTOR2I GetPosition() const override
Definition sch_text.h:150
static SELECTION_CONDITION HasType(KICAD_T aType)
Create a functor that tests if among the selected items there is at least one of a given type.
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
static SELECTION_CONDITION MoreThan(int aNumber)
Create a functor that tests if the number of selected items is greater than the value given as parame...
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)
int AddItemToSel(const TOOL_EVENT &aEvent)
void UnbrightenItem(EDA_ITEM *aItem)
bool UnloadProject(PROJECT *aProject, bool aSave=true)
Save, unload and unregister the given PROJECT.
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
void SetFilesStack(std::vector< EMBEDDED_FILES * > aFilesStack)
Definition sim_lib_mgr.h:48
Symbol library viewer main window.
The symbol library editor main window.
Symbol library viewer main window.
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
TOOL_DISPATCHER * m_toolDispatcher
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
ACTIONS * m_actions
@ 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:171
Master controller class:
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
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:580
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:131
int GetLastUnsavedChangesResponse()
Return the result code from the last call to HandleUnsavedChanges(): wxID_YES, wxID_NO or wxID_CANCEL...
Definition confirm.cpp:144
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:177
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define _(s)
wxDEFINE_EVENT(wxEVT_REFRESH_CUSTOM_COMMAND, wxEvent)
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define SCH_EDIT_FRAME_NAME
@ NO_RECURSE
Definition eda_item.h:52
#define IGNORE_PARENT_GROUP
Definition eda_item.h:55
@ ID_IMPORT_NON_KICAD_SCH
Definition eeschema_id.h:62
const wxAuiPaneInfo & defaultSchSelectionFilterPaneInfo(wxWindow *aWindow)
const wxAuiPaneInfo & defaultPropertiesPaneInfo(wxWindow *aWindow)
const wxAuiPaneInfo & defaultNetNavigatorPaneInfo()
const wxAuiPaneInfo & defaultDesignBlocksPaneInfo(wxWindow *aWindow)
const wxAuiPaneInfo & defaultRemoteSymbolPaneInfo(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:145
static const std::string NetlistFileExtension
static const std::string JpegFileExtension
static const std::string PngFileExtension
static const std::string LegacyPcbFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string SVGFileExtension
static wxString LegacySchematicFileWildcard()
static wxString AllSchematicFilesWildcard()
static wxString KiCadSchematicFileWildcard()
const wxChar *const traceSchCurrentSheet
Flag to enable debug output of current sheet tracking in the schematic editor.
const wxChar *const traceCrossProbeFlash
Flag to enable debug output for cross-probe flash operations.
const wxChar *const traceApi
Flag to enable debug output related to the IPC API and its plugin system.
Definition api_utils.cpp:27
@ ID_FILE_LIST_CLEAR
Definition id.h:62
@ ID_EDA_SOCKET_EVENT
Definition id.h:132
@ ID_EDA_SOCKET_EVENT_SERV
Definition id.h:131
@ ID_FILEMAX
Definition id.h:60
@ ID_FILE1
Definition id.h:59
PROJECT & Prj()
Definition kicad.cpp:629
KIID niluuid(0)
#define KICTL_CREATE
caller thinks requested project files may not exist.
@ LAYER_ERC_WARN
Definition layer_ids.h:479
@ LAYER_ERC_EXCLUSION
Definition layer_ids.h:481
@ LAYER_ERC_ERR
Definition layer_ids.h:480
@ LAYER_OP_CURRENTS
Definition layer_ids.h:502
@ LAYER_INTERSHEET_REFS
Definition layer_ids.h:463
@ LAYER_OP_VOLTAGES
Definition layer_ids.h:501
@ 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
#define _HKI(x)
Definition page_info.cpp:44
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:946
see class PGM_BASE
SEVERITY
#define DIFF_SYMBOLS_DIALOG_NAME
#define CURRENT_TOOL(action)
@ AUTOPLACE_AUTO
Definition sch_item.h:70
SCH_CLEANUP_FLAGS
Definition schematic.h:74
@ GLOBAL_CLEANUP
Definition schematic.h:77
T * GetToolbarSettings(const wxString &aFilename)
T * GetAppSettings(const char *aFilename)
KIWAY Kiway(KFCTL_STANDALONE)
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
Implement a participant in the KIWAY alchemy.
Definition kiway.h:155
virtual void PreloadLibraries(KIWAY *aKiway)
Definition kiway.h:258
std::string refName
std::string path
KIBIS_MODEL * model
KIBIS_PIN * pin
wxLogTrace helper definitions.
@ SCH_GROUP_T
Definition typeinfo.h:177
@ SCH_LINE_T
Definition typeinfo.h:167
@ SCH_SYMBOL_T
Definition typeinfo.h:176
@ SCH_HIER_LABEL_T
Definition typeinfo.h:173
@ SCH_GLOBAL_LABEL_T
Definition typeinfo.h:172
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.