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
151
152 // Drop files event
153 EVT_DROP_FILES( SCH_EDIT_FRAME::OnDropFiles )
154END_EVENT_TABLE()
155
156
157wxDEFINE_EVENT( EDA_EVT_SCHEMATIC_CHANGING, wxCommandEvent );
158wxDEFINE_EVENT( EDA_EVT_SCHEMATIC_CHANGED, wxCommandEvent );
159
160
161SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
162 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH, wxT( "Eeschema" ), wxDefaultPosition,
164 m_ercDialog( nullptr ),
165 m_diffSymbolDialog( nullptr ),
166 m_symbolFieldsTableDialog( nullptr ),
167 m_netNavigator( nullptr ),
168 m_netNavigatorFilter( nullptr ),
172 m_designBlocksPane( nullptr ),
173 m_remoteSymbolPane( nullptr ),
174 m_currentVariantCtrl( nullptr )
175{
176 m_maximizeByDefault = true;
177 m_schematic = new SCHEMATIC( &Prj() );
178 m_schematic->SetSchematicHolder( this );
180
181 m_showBorderAndTitleBlock = true; // true to show sheet references
182 m_supportsAutoSave = true;
184 m_aboutTitle = _HKI( "KiCad Schematic Editor" );
185 m_show_search = false;
186 // Ensure timer has an owner before binding so it generates events.
187 m_crossProbeFlashTimer.SetOwner( this );
188 Bind( wxEVT_TIMER, &SCH_EDIT_FRAME::OnCrossProbeFlashTimer, this, m_crossProbeFlashTimer.GetId() );
189
190 // Give an icon
191 wxIcon icon;
192 wxIconBundle icon_bundle;
193
194 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 48 ) );
195 icon_bundle.AddIcon( icon );
196 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 128 ) );
197 icon_bundle.AddIcon( icon );
198 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema, 256 ) );
199 icon_bundle.AddIcon( icon );
200 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema_32 ) );
201 icon_bundle.AddIcon( icon );
202 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_eeschema_16 ) );
203 icon_bundle.AddIcon( icon );
204
205 SetIcons( icon_bundle );
206
208
209 setupTools();
212
216
217 // Ensure the "Line modes" toolbar group shows the current angle mode on startup
218 if( GetToolManager() )
220
221#ifdef KICAD_IPC_API
222 wxTheApp->Bind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED, &SCH_EDIT_FRAME::onPluginAvailabilityChanged, this );
223#endif
224
225 m_hierarchy = new HIERARCHY_PANE( this );
226
227 // Initialize common print setup dialog settings.
228 m_pageSetupData.GetPrintData().SetPrintMode( wxPRINT_MODE_PRINTER );
229 m_pageSetupData.GetPrintData().SetQuality( wxPRINT_QUALITY_MEDIUM );
230 m_pageSetupData.GetPrintData().SetBin( wxPRINTBIN_AUTO );
231 m_pageSetupData.GetPrintData().SetNoCopies( 1 );
232
233 m_searchPane = new SCH_SEARCH_PANE( this );
234 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
236
237 m_propertiesPanel->SetSplitterProportion( eeconfig()->m_AuiPanels.properties_splitter );
238
241
242 m_auimgr.SetManagedWindow( this );
243
245
246 // Fetch a COPY of the config as a lot of these initializations are going to overwrite our
247 // data.
248 EESCHEMA_SETTINGS::AUI_PANELS aui_cfg = eeconfig()->m_AuiPanels;
249 EESCHEMA_SETTINGS::APPEARANCE appearance_cfg = eeconfig()->m_Appearance;
250
251 // Rows; layers 4 - 6
252 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) )
253 .Top().Layer( 6 ) );
254
255 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) )
256 .Bottom().Layer( 6 ) );
257
258 // Columns; layers 1 - 3
259 m_auimgr.AddPane( m_hierarchy, EDA_PANE().Palette().Name( SchematicHierarchyPaneName() )
260 .Caption( _( "Schematic Hierarchy" ) )
261 .Left().Layer( 3 ).Position( 1 )
262 .TopDockable( false )
263 .BottomDockable( false )
264 .CloseButton( true )
265 .MinSize( FromDIP( wxSize( 120, 60 ) ) )
266 .BestSize( FromDIP( wxSize( 200, 200 ) ) )
267 .FloatingSize( FromDIP( wxSize( 200, 200 ) ) )
268 .FloatingPosition( FromDIP( wxPoint( 50, 50 ) ) )
269 .Show( false ) );
270
273
276
278
279 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( wxS( "LeftToolbar" ) )
280 .Left().Layer( 2 ) );
281
282 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( wxS( "RightToolbar" ) )
283 .Right().Layer( 2 ) );
284
285 // Center
286 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
287 .Center() );
288
289 m_auimgr.AddPane( m_searchPane, EDA_PANE()
290 .Name( SearchPaneName() )
291 .Bottom()
292 .Caption( _( "Search" ) )
293 .PaneBorder( false )
294 .MinSize( FromDIP( wxSize( 180, 60 ) ) )
295 .BestSize( FromDIP( wxSize( 180, 100 ) ) )
296 .FloatingSize( FromDIP( wxSize( 480, 200 ) ) )
297 .CloseButton( true )
298 .DestroyOnClose( false )
299 .Show( m_show_search ) );
300
303
304 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
305 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
306 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
307 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
308 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
309 wxAuiPaneInfo& remoteSymbolPane = m_auimgr.GetPane( RemoteSymbolPaneName() );
310
311 hierarchy_pane.Show( aui_cfg.show_schematic_hierarchy );
312 netNavigatorPane.Show( aui_cfg.show_net_nav_panel );
313 propertiesPane.Show( aui_cfg.show_properties );
314 designBlocksPane.Show( aui_cfg.design_blocks_show );
315
316 if( m_remoteSymbolPane && !m_remoteSymbolPane->HasDataSources() )
317 remoteSymbolPane.Show( false );
318 else
319 remoteSymbolPane.Show( aui_cfg.remote_symbol_show );
320
322
323 // The selection filter doesn't need to grow in the vertical direction when docked
324 selectionFilterPane.dock_proportion = 0;
325
326 if( aui_cfg.hierarchy_panel_float_width > 0 && aui_cfg.hierarchy_panel_float_height > 0 )
327 {
328 // Show at end, after positioning
329 hierarchy_pane.FloatingSize( aui_cfg.hierarchy_panel_float_width,
331 }
332
333 if( aui_cfg.net_nav_panel_float_size.GetWidth() > 0
334 && aui_cfg.net_nav_panel_float_size.GetHeight() > 0 )
335 {
336 netNavigatorPane.FloatingSize( aui_cfg.net_nav_panel_float_size );
337 netNavigatorPane.FloatingPosition( aui_cfg.net_nav_panel_float_pos );
338 }
339
340 if( aui_cfg.properties_panel_width > 0 )
341 SetAuiPaneSize( m_auimgr, propertiesPane, aui_cfg.properties_panel_width, -1 );
342
343 if( aui_cfg.schematic_hierarchy_float )
344 hierarchy_pane.Float();
345
346 if( aui_cfg.search_panel_height > 0
347 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_TOP
348 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) )
349 {
350 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
351 searchPane.Direction( aui_cfg.search_panel_dock_direction );
352 SetAuiPaneSize( m_auimgr, searchPane, -1, aui_cfg.search_panel_height );
353 }
354
355 else if( aui_cfg.search_panel_width > 0
356 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_LEFT
357 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) )
358 {
359 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
360 searchPane.Direction( aui_cfg.search_panel_dock_direction );
361 SetAuiPaneSize( m_auimgr, searchPane, aui_cfg.search_panel_width, -1 );
362 }
363
364 if( aui_cfg.float_net_nav_panel )
365 netNavigatorPane.Float();
366
367 if( aui_cfg.design_blocks_show )
368 SetAuiPaneSize( m_auimgr, designBlocksPane, aui_cfg.design_blocks_panel_docked_width, -1 );
369
370 if( aui_cfg.remote_symbol_show )
371 SetAuiPaneSize( m_auimgr, remoteSymbolPane, aui_cfg.remote_symbol_panel_docked_width, -1 );
372
373 if( aui_cfg.hierarchy_panel_docked_width > 0 )
374 {
375 // If the net navigator is not show, let the hierarchy navigator take all of the vertical
376 // space.
377 if( !aui_cfg.show_net_nav_panel )
378 {
379 SetAuiPaneSize( m_auimgr, hierarchy_pane, aui_cfg.hierarchy_panel_docked_width, -1 );
380 }
381 else
382 {
383 SetAuiPaneSize( m_auimgr, hierarchy_pane,
386
387 SetAuiPaneSize( m_auimgr, netNavigatorPane,
388 aui_cfg.net_nav_panel_docked_size.GetWidth(),
389 aui_cfg.net_nav_panel_docked_size.GetHeight() );
390 }
391
392 // wxAUI hack: force width by setting MinSize() and then Fixed()
393 // thanks to ZenJu https://github.com/wxWidgets/wxWidgets/issues/13180
394 hierarchy_pane.MinSize( aui_cfg.hierarchy_panel_docked_width, 60 );
395 hierarchy_pane.Fixed();
396 netNavigatorPane.MinSize( aui_cfg.net_nav_panel_docked_size.GetWidth(), 60 );
397 netNavigatorPane.Fixed();
398 m_auimgr.Update();
399
400 // now make it resizable again
401 hierarchy_pane.Resizable();
402 netNavigatorPane.Resizable();
403 m_auimgr.Update();
404
405 // Note: DO NOT call m_auimgr.Update() anywhere after this; it will nuke the size
406 // back to minimum.
407 hierarchy_pane.MinSize( FromDIP( wxSize( 120, 60 ) ) );
408 netNavigatorPane.MinSize( FromDIP( wxSize( 120, 60 ) ) );
409 }
410 else
411 {
412 m_auimgr.Update();
413 }
414
417
418 GetCanvas()->GetGAL()->SetAxesEnabled( false );
419
420 KIGFX::SCH_VIEW* view = GetCanvas()->GetView();
421 static_cast<KIGFX::SCH_PAINTER*>( view->GetPainter() )->SetSchematic( m_schematic );
422
425
426 view->SetLayerVisible( LAYER_ERC_ERR, appearance_cfg.show_erc_errors );
427 view->SetLayerVisible( LAYER_ERC_WARN, appearance_cfg.show_erc_warnings );
429 view->SetLayerVisible( LAYER_OP_VOLTAGES, appearance_cfg.show_op_voltages );
430 view->SetLayerVisible( LAYER_OP_CURRENTS, appearance_cfg.show_op_currents );
431
433
435 m_netNavigator->Bind( wxEVT_TREE_SEL_CHANGING, &SCH_EDIT_FRAME::onNetNavigatorSelChanging, this );
436 m_netNavigator->Bind( wxEVT_TREE_SEL_CHANGED, &SCH_EDIT_FRAME::onNetNavigatorSelection, this );
437 m_netNavigator->Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::onResizeNetNavigator, this );
438
439 // This is used temporarily to fix a client size issue on GTK that causes zoom to fit
440 // to calculate the wrong zoom size. See SCH_EDIT_FRAME::onSize().
441 Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::onSize, this );
442
443 setupUnits( eeconfig() );
444
445 // Net list generator
447
448 updateTitle();
449 m_toolManager->GetTool<SCH_NAVIGATE_TOOL>()->ResetHistory();
450
451#ifdef KICAD_IPC_API
452 m_apiHandler = std::make_unique<API_HANDLER_SCH>( this );
453 Pgm().GetApiServer().RegisterHandler( m_apiHandler.get() );
454#endif
455
456 // Default shutdown reason until a file is loaded
457 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New schematic file is unsaved" ) );
458
459 // Init for dropping files
463 m_acceptedExts.emplace( wxS( "jpeg" ), &SCH_ACTIONS::ddAddImage );
464 m_acceptedExts.emplace( wxS( "dxf" ), &SCH_ACTIONS::ddImportGraphics );
466 DragAcceptFiles( true );
467
468 // Ensure the window is on top
469 Raise();
470
471 // Now that all sizes are fixed, set the initial hierarchy_pane floating position to the
472 // top-left corner of the canvas
473 wxPoint canvas_pos = GetCanvas()->GetScreenPosition();
474 hierarchy_pane.FloatingPosition( canvas_pos.x + 10, canvas_pos.y + 10 );
475
476 if( ADVANCED_CFG::GetCfg().m_EnableVariantsUI )
477 Bind( wxEVT_CHOICE, &SCH_EDIT_FRAME::onVariantSelected, this );
478
479 Bind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &SCH_EDIT_FRAME::onCloseSymbolDiffDialog, this );
480 Bind( EDA_EVT_CLOSE_ERC_DIALOG, &SCH_EDIT_FRAME::onCloseErcDialog, this );
481 Bind( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, &SCH_EDIT_FRAME::onCloseSymbolFieldsTableDialog, this );
482}
483
484void SCH_EDIT_FRAME::StartCrossProbeFlash( const std::vector<SCH_ITEM*>& aItems )
485{
486 if( !eeconfig()->m_CrossProbing.flash_selection )
487 {
488 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: aborted (setting disabled) items=%zu", aItems.size() );
489 return;
490 }
491 if( aItems.empty() )
492 {
493 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: aborted (no items)" );
494 return;
495 }
496
498 {
499 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: restarting existing flash (phase=%d)",
502 }
503
504 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: starting with %zu items", aItems.size() );
506
507 for( SCH_ITEM* it : aItems )
508 m_crossProbeFlashItems.push_back( it->m_Uuid );
509
512
513 if( !m_crossProbeFlashTimer.GetOwner() )
514 m_crossProbeFlashTimer.SetOwner( this );
515
516 bool started = m_crossProbeFlashTimer.Start( 500, wxTIMER_CONTINUOUS );
517 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash: timer start=%d id=%d", (int) started,
518 m_crossProbeFlashTimer.GetId() );
519}
520
521
522void SCH_EDIT_FRAME::OnCrossProbeFlashTimer( wxTimerEvent& aEvent )
523{
524 wxLogTrace( traceCrossProbeFlash, "Timer(SCH) fired: phase=%d running=%d items=%zu", m_crossProbeFlashPhase,
526
528 {
529 wxLogTrace( traceCrossProbeFlash, "Timer fired but not flashing (ignored)" );
530 return;
531 }
532
534
535 if( !selTool )
536 return;
537
538 bool prevGuard = m_syncingPcbToSchSelection;
540
541 if( m_crossProbeFlashPhase % 2 == 0 )
542 {
543 selTool->ClearSelection( true );
544 wxLogTrace( traceCrossProbeFlash, "Phase %d: cleared selection", m_crossProbeFlashPhase );
545 }
546 else
547 {
548 for( const KIID& id : m_crossProbeFlashItems )
549 {
550 if( SCH_ITEM* item = Schematic().ResolveItem( id, nullptr, true ) )
551 selTool->AddItemToSel( item, true );
552 }
553
554 wxLogTrace( traceCrossProbeFlash, "Phase %d: restored %zu items", m_crossProbeFlashPhase,
555 m_crossProbeFlashItems.size() );
556 }
557
558 if( GetCanvas() )
559 {
561 wxLogTrace( traceCrossProbeFlash, "Phase %d: forced canvas refresh", m_crossProbeFlashPhase );
562 }
563
564 m_syncingPcbToSchSelection = prevGuard;
566
567 if( m_crossProbeFlashPhase > 6 )
568 {
569 for( const KIID& id : m_crossProbeFlashItems )
570 {
571 if( SCH_ITEM* item = Schematic().ResolveItem( id, nullptr, true ) )
572 selTool->AddItemToSel( item, true );
573 }
574
575 m_crossProbeFlashing = false;
577 wxLogTrace( traceCrossProbeFlash, "Flashing complete. Final selection size=%zu",
578 m_crossProbeFlashItems.size() );
579 }
580}
581
582
584{
585 m_hierarchy->Unbind( wxEVT_SIZE, &SCH_EDIT_FRAME::OnResizeHierarchyNavigator, this );
586
587 // Ensure m_canvasType is up to date, to save it in config
589
590 SetScreen( nullptr );
591
592 if( m_schematic )
593 m_schematic->RemoveAllListeners();
594
595 // Delete all items not in draw list before deleting schematic
596 // to avoid dangling pointers stored in these items
599
600 delete m_schematic;
601 m_schematic = nullptr;
602
603 // Close the project if we are standalone, so it gets cleaned up properly
604 if( Kiface().IsSingle() )
605 {
606 try
607 {
608 GetSettingsManager()->UnloadProject( &Prj(), false );
609 }
610 catch( const std::runtime_error& e )
611 {
612 wxFAIL_MSG( wxString::Format( wxT( "Settings exception occurred: %s" ), e.what() ) );
613 }
614 }
615
616 // We passed ownership of these to wxAuiManager.
617 // delete m_hierarchy;
618 // delete m_selectionFilterPanel;
619}
620
621
623{
624 aEvent.Skip();
625
626 // 1st Call: Handle the size update during the first resize event.
628
629 // Defer the second size capture
630 CallAfter( [this]()
631 {
633 } );
634}
635
636
638{
639 // Called when resizing the Hierarchy Navigator panel
640 // Store the current pane size
641 // It allows to retrieve the last defined pane size when switching between
642 // docked and floating pane state
643 // Note: *DO NOT* call m_auimgr.Update() here: it crashes KiCad at least on Windows
644
645 EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
646 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
647
648 if( cfg && m_hierarchy->IsShownOnScreen() )
649 {
650 cfg->m_AuiPanels.hierarchy_panel_float_width = hierarchy_pane.floating_size.x;
651 cfg->m_AuiPanels.hierarchy_panel_float_height = hierarchy_pane.floating_size.y;
652
653 // initialize hierarchy_panel_docked_width and best size only if the hierarchy_pane
654 // width is > 0 (i.e. if its size is already set and has meaning)
655 // if it is floating, its size is not initialized (only floating_size is initialized)
656 // initializing hierarchy_pane.best_size is useful when switching to float pane and
657 // after switching to the docked pane, to retrieve the last docked pane width
658 if( hierarchy_pane.rect.width > 50 ) // 50 is a good margin
659 {
660 cfg->m_AuiPanels.hierarchy_panel_docked_width = hierarchy_pane.rect.width;
661 hierarchy_pane.best_size.x = hierarchy_pane.rect.width;
662 }
663 }
664}
665
666
668{
669 // Create the manager and dispatcher & route draw panel events to the dispatcher
671 m_toolManager->SetEnvironment( &Schematic(), GetCanvas()->GetView(),
672 GetCanvas()->GetViewControls(), config(), this );
673 m_actions = new SCH_ACTIONS();
675
676 // Register tools
677 m_toolManager->RegisterTool( new COMMON_CONTROL );
678 m_toolManager->RegisterTool( new COMMON_TOOLS );
679 m_toolManager->RegisterTool( new ZOOM_TOOL );
680 m_toolManager->RegisterTool( new SCH_SELECTION_TOOL );
681 m_toolManager->RegisterTool( new PICKER_TOOL );
682 m_toolManager->RegisterTool( new SCH_DRAWING_TOOLS );
683 m_toolManager->RegisterTool( new SCH_LINE_WIRE_BUS_TOOL );
684 m_toolManager->RegisterTool( new SCH_MOVE_TOOL );
685 m_toolManager->RegisterTool( new SCH_ALIGN_TOOL );
686 m_toolManager->RegisterTool( new SCH_EDIT_TOOL );
687 m_toolManager->RegisterTool( new SCH_EDIT_TABLE_TOOL );
688 m_toolManager->RegisterTool( new SCH_GROUP_TOOL );
689 m_toolManager->RegisterTool( new SCH_INSPECTION_TOOL );
690 m_toolManager->RegisterTool( new SCH_DESIGN_BLOCK_CONTROL );
691 m_toolManager->RegisterTool( new SCH_EDITOR_CONTROL );
692 m_toolManager->RegisterTool( new SCH_FIND_REPLACE_TOOL );
693 m_toolManager->RegisterTool( new SCH_POINT_EDITOR );
694 m_toolManager->RegisterTool( new SCH_NAVIGATE_TOOL );
695 m_toolManager->RegisterTool( new PROPERTIES_TOOL );
696 m_toolManager->RegisterTool( new EMBED_TOOL );
697 m_toolManager->InitTools();
698
699 // Run the selection tool, it is supposed to be always active
701
703}
704
705
707{
709
710 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
711 SCH_EDITOR_CONDITIONS cond( this );
712
713 wxASSERT( mgr );
714
715 auto hasElements =
716 [ this ] ( const SELECTION& aSel )
717 {
718 return GetScreen() &&
719 ( !GetScreen()->Items().empty() || !SELECTION_CONDITIONS::Idle( aSel ) );
720 };
721
722 auto searchPaneCond =
723 [this] ( const SELECTION& )
724 {
725 return m_auimgr.GetPane( SearchPaneName() ).IsShown();
726 };
727
728 auto propertiesCond =
729 [this] ( const SELECTION& )
730 {
731 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
732 };
733
734 auto hierarchyNavigatorCond =
735 [ this ] ( const SELECTION& aSel )
736 {
737 return m_auimgr.GetPane( SchematicHierarchyPaneName() ).IsShown();
738 };
739
740 auto netNavigatorCond =
741 [ this ] (const SELECTION& aSel )
742 {
743 return m_auimgr.GetPane( NetNavigatorPaneName() ).IsShown();
744 };
745
746 auto designBlockCond =
747 [ this ] (const SELECTION& aSel )
748 {
749 return m_auimgr.GetPane( DesignBlocksPaneName() ).IsShown();
750 };
751
752 auto remoteSymbolCond =
753 [ this ] (const SELECTION& aSel )
754 {
755 return m_auimgr.GetPane( RemoteSymbolPaneName() ).IsShown();
756 };
757
758 auto undoCond =
759 [ this ] (const SELECTION& aSel )
760 {
762 return true;
763
764 return GetUndoCommandCount() > 0;
765 };
766
767 auto groupWithDesignBlockLink =
768 [] ( const SELECTION& aSel )
769 {
770 if( aSel.Size() != 1 )
771 return false;
772
773 if( aSel[0]->Type() != SCH_GROUP_T )
774 return false;
775
776 SCH_GROUP* group = static_cast<SCH_GROUP*>( aSel.GetItem( 0 ) );
777
778 return group->HasDesignBlockLink();
779 };
780
781#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
782#define CHECK( x ) ACTION_CONDITIONS().Check( x )
783
785 mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) );
787
788 mgr->SetConditions( SCH_ACTIONS::showSearch, CHECK( searchPaneCond ) );
789 mgr->SetConditions( SCH_ACTIONS::showHierarchy, CHECK( hierarchyNavigatorCond ) );
790 mgr->SetConditions( SCH_ACTIONS::showNetNavigator, CHECK( netNavigatorCond ) );
791 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
792 mgr->SetConditions( SCH_ACTIONS::showDesignBlockPanel, CHECK( designBlockCond ) );
793 mgr->SetConditions( SCH_ACTIONS::showRemoteSymbolPanel, CHECK( remoteSymbolCond ) );
796
797 mgr->SetConditions( ACTIONS::cut, ENABLE( hasElements ) );
798 mgr->SetConditions( ACTIONS::copy, ENABLE( hasElements ) );
799 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( hasElements ) );
802 mgr->SetConditions( ACTIONS::doDelete, ENABLE( hasElements ) );
803 mgr->SetConditions( ACTIONS::duplicate, ENABLE( hasElements ) );
810 mgr->SetConditions( ACTIONS::selectAll, ENABLE( hasElements ) );
811 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( hasElements ) );
812
813 mgr->SetConditions( SCH_ACTIONS::rotateCW, ENABLE( hasElements ) );
814 mgr->SetConditions( SCH_ACTIONS::rotateCCW, ENABLE( hasElements ) );
815 mgr->SetConditions( SCH_ACTIONS::mirrorH, ENABLE( hasElements ) );
816 mgr->SetConditions( SCH_ACTIONS::mirrorV, ENABLE( hasElements ) );
819
820 mgr->SetConditions( SCH_ACTIONS::placeLinkedDesignBlock, ENABLE( groupWithDesignBlockLink ) );
821 mgr->SetConditions( SCH_ACTIONS::saveToLinkedDesignBlock, ENABLE( groupWithDesignBlockLink ) );
822
825
826 auto showHiddenPinsCond =
827 [this]( const SELECTION& )
828 {
829 return GetShowAllPins();
830 };
831
832 auto showHiddenFieldsCond =
833 [this]( const SELECTION& )
834 {
836 return cfg && cfg->m_Appearance.show_hidden_fields;
837 };
838
839 auto showDirectiveLabelsCond =
840 [this]( const SELECTION& )
841 {
843 return cfg && cfg->m_Appearance.show_directive_labels;
844 };
845
846 auto showERCErrorsCond =
847 [this]( const SELECTION& )
848 {
850 return cfg && cfg->m_Appearance.show_erc_errors;
851 };
852
853 auto showERCWarningsCond =
854 [this]( const SELECTION& )
855 {
857 return cfg && cfg->m_Appearance.show_erc_warnings;
858 };
859
860 auto showERCExclusionsCond =
861 [this]( const SELECTION& )
862 {
864 return cfg && cfg->m_Appearance.show_erc_exclusions;
865 };
866
867 auto markSimExclusionsCond =
868 [this]( const SELECTION& )
869 {
871 return cfg && cfg->m_Appearance.mark_sim_exclusions;
872 };
873
874 auto showOPVoltagesCond =
875 [this]( const SELECTION& )
876 {
878 return cfg && cfg->m_Appearance.show_op_voltages;
879 };
880
881 auto showOPCurrentsCond =
882 [this]( const SELECTION& )
883 {
885 return cfg && cfg->m_Appearance.show_op_currents;
886 };
887
888 auto showPinAltModeIconsCond =
889 [this]( const SELECTION& )
890 {
892 return cfg && cfg->m_Appearance.show_pin_alt_icons;
893 };
894
895 auto showAnnotateAutomaticallyCond =
896 [this]( const SELECTION& )
897 {
899 };
900
901 auto remapSymbolsCondition =
902 [&]( const SELECTION& aSel )
903 {
904 SCH_SCREENS schematic( Schematic().Root() );
905
906 // The remapping can only be performed on legacy projects.
907 return schematic.HasNoFullyDefinedLibIds();
908 };
909
910 auto belowRootSheetCondition =
911 [this]( const SELECTION& aSel )
912 {
913 SCH_NAVIGATE_TOOL* navigateTool = m_toolManager->GetTool<SCH_NAVIGATE_TOOL>();
914 return navigateTool && navigateTool->CanGoUp();
915 };
916
917 mgr->SetConditions( SCH_ACTIONS::leaveSheet, ENABLE( belowRootSheetCondition ) );
918
919 /* Some of these are bound by default to arrow keys which will get a different action if we
920 * disable the buttons. So always leave them enabled so the action is consistent.
921 * https://gitlab.com/kicad/code/kicad/-/issues/14783
922 mgr->SetConditions( SCH_ACTIONS::navigateUp, ENABLE( belowRootSheetCondition ) );
923 mgr->SetConditions( SCH_ACTIONS::navigateForward, ENABLE( navHistoryHasForward ) );
924 mgr->SetConditions( SCH_ACTIONS::navigateBack, ENABLE( navHistoryHsBackward ) );
925 */
926
927 mgr->SetConditions( SCH_ACTIONS::remapSymbols, ENABLE( remapSymbolsCondition ) );
928 mgr->SetConditions( SCH_ACTIONS::toggleHiddenPins, CHECK( showHiddenPinsCond ) );
929 mgr->SetConditions( SCH_ACTIONS::toggleHiddenFields, CHECK( showHiddenFieldsCond ) );
930 mgr->SetConditions( SCH_ACTIONS::toggleDirectiveLabels, CHECK( showDirectiveLabelsCond ) );
931 mgr->SetConditions( SCH_ACTIONS::toggleERCErrors, CHECK( showERCErrorsCond ) );
932 mgr->SetConditions( SCH_ACTIONS::toggleERCWarnings, CHECK( showERCWarningsCond ) );
933 mgr->SetConditions( SCH_ACTIONS::toggleERCExclusions, CHECK( showERCExclusionsCond ) );
934 mgr->SetConditions( SCH_ACTIONS::markSimExclusions, CHECK( markSimExclusionsCond ) );
935 mgr->SetConditions( SCH_ACTIONS::toggleOPVoltages, CHECK( showOPVoltagesCond ) );
936 mgr->SetConditions( SCH_ACTIONS::toggleOPCurrents, CHECK( showOPCurrentsCond ) );
937 mgr->SetConditions( SCH_ACTIONS::togglePinAltIcons, CHECK( showPinAltModeIconsCond ) );
938 mgr->SetConditions( SCH_ACTIONS::toggleAnnotateAuto, CHECK( showAnnotateAutomaticallyCond ) );
940
943
944#define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
945
975
976#undef CURRENT_TOOL
977#undef CHECK
978#undef ENABLE
979}
980
981
983{
984 // we cannot store a pointer to an item in the display list here since
985 // that item may be deleted, such as part of a line concatenation or other.
986 // So simply always keep a copy of the object which is to be repeated.
987
988 if( aItem )
989 {
990 m_items_to_repeat.clear();
991
992 AddCopyForRepeatItem( aItem );
993 }
994}
995
996
998{
999 // we cannot store a pointer to an item in the display list here since
1000 // that item may be deleted, such as part of a line concatenation or other.
1001 // So simply always keep a copy of the object which is to be repeated.
1002
1003 if( aItem )
1004 {
1005 std::unique_ptr<SCH_ITEM> repeatItem( static_cast<SCH_ITEM*>( aItem->Duplicate( IGNORE_PARENT_GROUP ) ) );
1006
1007 // Clone() preserves the flags & parent, we want 'em cleared.
1008 repeatItem->ClearFlags();
1009 repeatItem->SetParent( nullptr );
1010
1011 m_items_to_repeat.emplace_back( std::move( repeatItem ) );
1012 }
1013}
1014
1015
1016EDA_ITEM* SCH_EDIT_FRAME::ResolveItem( const KIID& aId, bool aAllowNullptrReturn ) const
1017{
1018 return Schematic().ResolveItem( aId, nullptr, aAllowNullptrReturn );
1019}
1020
1021
1026
1027
1032
1033
1035{
1036 return *m_schematic;
1037}
1038
1039
1041{
1042 return GetCurrentSheet().Last()->GetName();
1043}
1044
1045
1047{
1049}
1050
1051
1053{
1054 m_schematic->CreateDefaultScreens();
1055 SetScreen( Schematic().RootScreen() );
1056
1057 if( GetScreen() == nullptr )
1058 {
1059 SCH_SCREEN* screen = new SCH_SCREEN( m_schematic );
1060 SetScreen( screen );
1061 }
1062}
1063
1064
1066{
1067 return m_schematic->CurrentSheet();
1068}
1069
1070
1072{
1073 if( aSheet != GetCurrentSheet() )
1074 {
1075 ClearFocus();
1076
1077 wxLogTrace( traceSchCurrentSheet,
1078 "SCH_EDIT_FRAME::SetCurrentSheet: Changing from path='%s' (size=%zu) to path='%s' (size=%zu)",
1079 GetCurrentSheet().Path().AsString(),
1080 GetCurrentSheet().size(),
1081 aSheet.Path().AsString(),
1082 aSheet.size() );
1083
1084 Schematic().SetCurrentSheet( aSheet );
1085 GetCanvas()->DisplaySheet( aSheet.LastScreen() );
1086 }
1087}
1088
1089
1091{
1093
1094 for( SCH_ITEM* item : screen->Items() )
1095 item->ClearCaches();
1096
1097 for( const std::pair<const wxString, LIB_SYMBOL*>& libSymbol : screen->GetLibSymbols() )
1098 {
1099 wxCHECK2( libSymbol.second, continue );
1100 libSymbol.second->ClearCaches();
1101 }
1102
1103 if( Schematic().Settings().m_IntersheetRefsShow )
1105
1106 ClearFocus();
1107
1108 GetCanvas()->DisplaySheet( GetCurrentSheet().LastScreen() );
1109
1110 if( SCH_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<SCH_SELECTION_TOOL>() )
1111 selectionTool->Reset( TOOL_BASE::REDRAW );
1112
1114}
1115
1116
1117bool SCH_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
1118{
1119 // Exit interactive editing
1120 // Note this this will commit *some* pending changes. For instance, the SCH_POINT_EDITOR
1121 // will cancel any drag currently in progress, but commit all changes from previous drags.
1122 if( m_toolManager )
1124
1125 // Shutdown blocks must be determined and vetoed as early as possible
1126 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
1127 && IsContentModified() )
1128 {
1129 return false;
1130 }
1131
1132 if( Kiface().IsSingle() )
1133 {
1134 auto* symbolEditor = (SYMBOL_EDIT_FRAME*) Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
1135
1136 if( symbolEditor && !symbolEditor->Close() ) // Can close symbol editor?
1137 return false;
1138
1139 auto* symbolViewer = (SYMBOL_VIEWER_FRAME*) Kiway().Player( FRAME_SCH_VIEWER, false );
1140
1141 if( symbolViewer && !symbolViewer->Close() ) // Can close symbol viewer?
1142 return false;
1143
1144 // SYMBOL_CHOOSER_FRAME is always modal so this shouldn't come up, but better safe than
1145 // sorry.
1146 auto* chooser = (SYMBOL_CHOOSER_FRAME*) Kiway().Player( FRAME_SYMBOL_CHOOSER, false );
1147
1148 if( chooser && !chooser->Close() ) // Can close symbol chooser?
1149 return false;
1150 }
1151 else
1152 {
1153 auto* symbolEditor = (SYMBOL_EDIT_FRAME*) Kiway().Player( FRAME_SCH_SYMBOL_EDITOR, false );
1154
1155 if( symbolEditor && symbolEditor->IsSymbolFromSchematic() )
1156 {
1157 if( !symbolEditor->CanCloseSymbolFromSchematic( true ) )
1158 return false;
1159 }
1160 }
1161
1162 if( !Kiway().PlayerClose( FRAME_SIMULATOR, false ) ) // Can close the simulator?
1163 return false;
1164
1166 && !m_symbolFieldsTableDialog->Close( false ) ) // Can close the symbol fields table?
1167 {
1168 return false;
1169 }
1170
1171 // We may have gotten multiple events; don't clean up twice
1172 if( !Schematic().IsValid() )
1173 return false;
1174
1175 if( IsContentModified() )
1176 {
1177 wxFileName fileName = Schematic().RootScreen()->GetFileName();
1178 wxString msg = _( "Save changes to '%s' before closing?" );
1179
1180 if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
1181 [&]() -> bool
1182 {
1183 return SaveProject();
1184 } ) )
1185 {
1186 return false;
1187 }
1188
1189 // If user selected 'No' (discard), create duplicate commit of last saved state and
1190 // move Last_Save tag forward so history shows an explicit discard event.
1191 if( GetLastUnsavedChangesResponse() == wxID_NO )
1192 {
1193 wxString projPath = Prj().GetProjectPath();
1194 if( !projPath.IsEmpty() && Kiway().LocalHistory().HistoryExists( projPath ) )
1195 {
1196 Kiway().LocalHistory().CommitDuplicateOfLastSave( projPath, wxS("Schematic"),
1197 wxS("Discard unsaved schematic changes") );
1198 }
1199 }
1200 }
1201
1202 return true;
1203}
1204
1205
1207{
1208 // Unregister the autosave saver before any cleanup that might invalidate m_schematic
1209 if( m_schematic )
1211
1213
1214 SCH_SHEET_LIST sheetlist = Schematic().Hierarchy();
1215
1216#ifdef KICAD_IPC_API
1217 Pgm().GetApiServer().DeregisterHandler( m_apiHandler.get() );
1218 wxTheApp->Unbind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED, &SCH_EDIT_FRAME::onPluginAvailabilityChanged, this );
1219#endif
1220
1221 // Close modeless dialogs. They're trouble when they get destroyed after the frame.
1222 Unbind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &SCH_EDIT_FRAME::onCloseSymbolDiffDialog, this );
1223 Unbind( EDA_EVT_CLOSE_ERC_DIALOG, &SCH_EDIT_FRAME::onCloseErcDialog, this );
1224 Unbind( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, &SCH_EDIT_FRAME::onCloseSymbolFieldsTableDialog, this );
1225 m_netNavigator->Unbind( wxEVT_TREE_SEL_CHANGING, &SCH_EDIT_FRAME::onNetNavigatorSelChanging, this );
1226 m_netNavigator->Unbind( wxEVT_TREE_SEL_CHANGED, &SCH_EDIT_FRAME::onNetNavigatorSelection, this );
1227
1228 if( m_diffSymbolDialog )
1229 {
1230 m_diffSymbolDialog->Destroy();
1231 m_diffSymbolDialog = nullptr;
1232 }
1233
1234 if( m_ercDialog )
1235 {
1236 m_ercDialog->Destroy();
1237 m_ercDialog = nullptr;
1238 }
1239
1241 {
1242 m_symbolFieldsTableDialog->Destroy();
1243 m_symbolFieldsTableDialog = nullptr;
1244 }
1245
1246 // Make sure local settings are persisted
1247 if( Prj().GetLocalSettings().ShouldAutoSave() )
1249
1250 delete m_toolManager;
1251 m_toolManager = nullptr;
1252
1253 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
1254
1255 if( hierarchy_pane.IsShown() && hierarchy_pane.IsFloating() )
1256 {
1257 hierarchy_pane.Show( false );
1258 m_auimgr.Update();
1259 }
1260
1261 sheetlist.ClearModifyStatus();
1262
1263 wxString fileName = Prj().AbsolutePath( Schematic().RootScreen()->GetFileName() );
1264
1265 if( !Schematic().GetFileName().IsEmpty() && !Schematic().RootScreen()->IsEmpty() )
1266 UpdateFileHistory( fileName );
1267
1268 Schematic().RootScreen()->Clear( true );
1269
1270 // all sub sheets are deleted, only the main sheet is usable
1272
1273 // Clear view before destroying schematic as repaints depend on schematic being valid
1274 SetScreen( nullptr );
1275
1276 Schematic().Reset();
1277
1278 // Prevents any rogue events from continuing (i.e. search panel tries to redraw)
1279 Show( false );
1280
1281 Destroy();
1282}
1283
1284
1286{
1287 m_searchPane->FocusSearch();
1288}
1289
1290
1292{
1293 return Schematic().ErcSettings().GetSeverity( aErrorCode );
1294}
1295
1296
1298{
1300
1301 if( GetScreen() )
1302 {
1304 Kiway().LocalHistory().NoteFileChange( GetScreen()->GetFileName() );
1305 }
1306
1307 if( m_isClosing )
1308 return;
1309
1310 if( GetCanvas() )
1311 GetCanvas()->Refresh();
1312
1313 if( !GetTitle().StartsWith( wxS( "*" ) ) )
1314 updateTitle();
1315}
1316
1317
1319{
1320 if( Kiface().IsSingle() )
1321 {
1322 DisplayError( this, _( "Cannot update the PCB, because the Schematic Editor is opened"
1323 " in stand-alone mode. In order to create/update PCBs from"
1324 " schematics, launch the KiCad shell and create a project." ) );
1325 return;
1326 }
1327
1328 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PCB_EDITOR, false );
1329 wxEventBlocker blocker( this );
1330
1331 if( !frame )
1332 {
1333 wxFileName fn = Prj().GetProjectFullName();
1334 fn.SetExt( FILEEXT::PcbFileExtension );
1335
1336 frame = Kiway().Player( FRAME_PCB_EDITOR, true );
1337
1338 // If Kiway() cannot create the Pcbnew frame, it shows a error message, and
1339 // frame is null
1340 if( !frame )
1341 return;
1342
1343 frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
1344 }
1345
1346 if( !frame->IsVisible() )
1347 frame->Show( true );
1348
1349 // On Windows, Raise() does not bring the window on screen, when iconized
1350 if( frame->IsIconized() )
1351 frame->Iconize( false );
1352
1353 frame->Raise();
1354
1355 std::string payload;
1357}
1358
1359
1360void SCH_EDIT_FRAME::UpdateHierarchyNavigator( bool aRefreshNetNavigator, bool aClear )
1361{
1362 m_toolManager->GetTool<SCH_NAVIGATE_TOOL>()->CleanHistory();
1363 m_hierarchy->UpdateHierarchyTree( aClear );
1364
1365 if( aRefreshNetNavigator )
1367}
1368
1369
1371{
1372 // Update only the hierarchy navigation tree labels.
1373 // The tree list is expected to be up to date
1374 m_hierarchy->UpdateLabelsHierarchyTree();
1375}
1376
1377
1379{
1380 m_hierarchy->UpdateHierarchySelection();
1381}
1382
1383
1384void SCH_EDIT_FRAME::OnLoadFile( wxCommandEvent& event )
1385{
1386 wxString filename = GetFileFromHistory( event.GetId(), _( "Schematic" ) );
1387
1388 if( !filename.IsEmpty() )
1389 OpenProjectFiles( std::vector<wxString>( 1, filename ) );
1390}
1391
1392
1393void SCH_EDIT_FRAME::OnClearFileHistory( wxCommandEvent& aEvent )
1394{
1396}
1397
1398
1400{
1401 // Only standalone mode can directly load a new document
1402 if( !Kiface().IsSingle() )
1403 return;
1404
1405 wxString pro_dir = m_mruPath;
1406
1407 wxFileDialog dlg( this, _( "New Schematic" ), pro_dir, wxEmptyString,
1409
1410 if( dlg.ShowModal() != wxID_CANCEL )
1411 {
1412 // Enforce the extension, wxFileDialog is inept.
1413 wxFileName create_me =
1415
1416 if( create_me.FileExists() )
1417 {
1418 wxString msg;
1419 msg.Printf( _( "Schematic file '%s' already exists." ), create_me.GetFullName() );
1420 DisplayError( this, msg );
1421 return ;
1422 }
1423
1424 // OpenProjectFiles() requires absolute
1425 wxASSERT_MSG( create_me.IsAbsolute(), wxS( "wxFileDialog returned non-absolute path" ) );
1426
1427 OpenProjectFiles( std::vector<wxString>( 1, create_me.GetFullPath() ), KICTL_CREATE );
1428 m_mruPath = create_me.GetPath();
1429 }
1430}
1431
1432
1434{
1435 // Only standalone mode can directly load a new document
1436 if( !Kiface().IsSingle() )
1437 return;
1438
1439 wxString pro_dir = m_mruPath;
1440 wxString wildcards = FILEEXT::AllSchematicFilesWildcard()
1442 + wxS( "|" ) + FILEEXT::LegacySchematicFileWildcard();
1443
1444 wxFileDialog dlg( this, _( "Open Schematic" ), pro_dir, wxEmptyString,
1445 wildcards, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
1446
1447 if( dlg.ShowModal() != wxID_CANCEL )
1448 {
1449 OpenProjectFiles( std::vector<wxString>( 1, dlg.GetPath() ) );
1451 }
1452
1453 // Since we know we're single-top here: trigger library reload
1454 CallAfter( [&]()
1455 {
1456 KIFACE *schface = Kiway().KiFACE( KIWAY::FACE_SCH );
1457 schface->PreloadLibraries( &Kiway() );
1458
1460 } );
1461}
1462
1463
1465{
1467
1468 // Register schematic saver for autosave history
1470 [this]( const wxString& aProjectPath, std::vector<wxString>& aFiles )
1471 {
1472 m_schematic->SaveToHistory( aProjectPath, aFiles );
1473 } );
1474
1475 m_designBlocksPane->ProjectChanged();
1476}
1477
1478
1480{
1481 wxFileName kicad_board = Prj().AbsolutePath( Schematic().GetFileName() );
1482
1483 if( kicad_board.IsOk() && !Schematic().GetFileName().IsEmpty() )
1484 {
1485 kicad_board.SetExt( FILEEXT::PcbFileExtension );
1486 wxFileName legacy_board( kicad_board );
1487 legacy_board.SetExt( FILEEXT::LegacyPcbFileExtension );
1488 wxFileName& boardfn = legacy_board;
1489
1490 if( !legacy_board.FileExists() || kicad_board.FileExists() )
1491 boardfn = kicad_board;
1492
1493 if( Kiface().IsSingle() )
1494 {
1495 ExecuteFile( PCBNEW_EXE, boardfn.GetFullPath() );
1496 }
1497 else
1498 {
1499 wxEventBlocker blocker(this);
1500 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PCB_EDITOR, false );
1501
1502 if( !frame )
1503 {
1504 frame = Kiway().Player( FRAME_PCB_EDITOR, true );
1505
1506 // frame can be null if Cvpcb cannot be run. No need to show a warning
1507 // Kiway() generates the error messages
1508 if( !frame )
1509 return;
1510
1511 frame->OpenProjectFiles( std::vector<wxString>( 1, boardfn.GetFullPath() ) );
1512 }
1513
1514 if( !frame->IsVisible() )
1515 frame->Show( true );
1516
1517 // On Windows, Raise() does not bring the window on screen, when iconized
1518 if( frame->IsIconized() )
1519 frame->Iconize( false );
1520
1521 frame->Raise();
1522 }
1523 }
1524 else
1525 {
1527 }
1528}
1529
1530
1532{
1533 wxFileName fn = Prj().AbsolutePath( Schematic().GetFileName() );
1534 fn.SetExt( FILEEXT::NetlistFileExtension );
1535
1536 if( !ReadyToNetlist( _( "Assigning footprints requires a fully annotated schematic." ) ) )
1537 return;
1538
1539 try
1540 {
1541 KIWAY_PLAYER* player = Kiway().Player( FRAME_CVPCB, false ); // test open already.
1542
1543 if( !player )
1544 {
1545 player = Kiway().Player( FRAME_CVPCB, true );
1546
1547 // player can be null if Cvpcb cannot be run. No need to show a warning
1548 // Kiway() generates the error messages
1549 if( !player )
1550 return;
1551
1552 player->Show( true );
1553 }
1554
1555 // Ensure the netlist (mainly info about symbols) is up to date
1558
1559 player->Raise();
1560 }
1561 catch( const IO_ERROR& )
1562 {
1563 DisplayError( this, _( "Could not open CvPcb" ) );
1564 }
1565}
1566
1567
1568void SCH_EDIT_FRAME::OnExit( wxCommandEvent& event )
1569{
1570 if( event.GetId() == wxID_EXIT )
1571 Kiway().OnKiCadExit();
1572
1573 if( event.GetId() == wxID_CLOSE || Kiface().IsSingle() )
1574 Close( false );
1575}
1576
1577
1579{
1580 SCHEMATIC_SETTINGS& settings = m_schematic->Settings();
1581 SIM_LIB_MGR simLibMgr( &Prj() );
1582 NULL_REPORTER devnull;
1583
1584 // Patch for bug early in V7.99 dev
1585 if( settings.m_OPO_VRange.EndsWith( 'A' ) )
1586 settings.m_OPO_VRange[ settings.m_OPO_VRange.Length() - 1 ] = 'V';
1587
1588 // Update items which may have ${OP} text variables
1589 //
1591 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1592 {
1593 int flags = 0;
1594
1595 auto invalidateTextVars =
1596 [&flags]( EDA_TEXT* text )
1597 {
1598 if( text->HasTextVars() )
1599 {
1600 text->ClearRenderCache();
1601 text->ClearBoundingBoxCache();
1603 }
1604 };
1605
1606 if( SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem ) )
1607 {
1608 item->RunOnChildren(
1609 [&invalidateTextVars]( SCH_ITEM* aChild )
1610 {
1611 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
1612 invalidateTextVars( text );
1613 },
1615 }
1616
1617 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1618 invalidateTextVars( text );
1619
1620 return flags;
1621 } );
1622
1623 // Update OP overlay items
1624 //
1625 for( SCH_ITEM* item : GetScreen()->Items() )
1626 {
1627 if( GetCurrentSheet().GetExcludedFromSim() )
1628 continue;
1629
1630 if( item->Type() == SCH_LINE_T )
1631 {
1632 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1633
1634 if( !line->GetOperatingPoint().IsEmpty() )
1635 GetCanvas()->GetView()->Update( line );
1636
1637 line->SetOperatingPoint( wxEmptyString );
1638
1639 // update value from netlist, below
1640 }
1641 else if( item->Type() == SCH_SYMBOL_T )
1642 {
1643 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
1644 wxString ref = symbol->GetRef( &GetCurrentSheet() );
1645 std::vector<SCH_PIN*> pins = symbol->GetPins( &GetCurrentSheet() );
1646
1647 // Power symbols and other symbols which have the reference starting with "#" are
1648 // not included in simulation
1649 if( ref.StartsWith( '#' ) || symbol->ResolveExcludedFromSim() )
1650 continue;
1651
1652 for( SCH_PIN* pin : pins )
1653 {
1654 if( !pin->GetOperatingPoint().IsEmpty() )
1655 GetCanvas()->GetView()->Update( pin );
1656
1657 pin->SetOperatingPoint( wxEmptyString );
1658 }
1659
1660 if( pins.size() == 2 )
1661 {
1662 wxString op = m_schematic->GetOperatingPoint( ref, settings.m_OPO_IPrecision,
1663 settings.m_OPO_IRange );
1664
1665 if( !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1666 {
1667 pins[0]->SetOperatingPoint( op );
1668 GetCanvas()->GetView()->Update( symbol );
1669 }
1670 }
1671 else
1672 {
1673 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
1674 embeddedFilesStack.push_back( m_schematic->GetEmbeddedFiles() );
1675
1676 if( EMBEDDED_FILES* symbolEmbeddedFiles = symbol->GetEmbeddedFiles() )
1677 {
1678 embeddedFilesStack.push_back( symbolEmbeddedFiles );
1679 symbol->GetLibSymbolRef()->AppendParentEmbeddedFiles( embeddedFilesStack );
1680 }
1681
1682 simLibMgr.SetFilesStack( std::move( embeddedFilesStack ) );
1683
1684 SIM_MODEL& model = simLibMgr.CreateModel( &GetCurrentSheet(), *symbol, true, 0, devnull ).model;
1685
1686 SPICE_ITEM spiceItem;
1687 spiceItem.refName = ref;
1688 ref = model.SpiceGenerator().ItemName( spiceItem );
1689
1690 for( const auto& modelPin : model.GetPins() )
1691 {
1692 SCH_PIN* symbolPin = symbol->GetPin( modelPin.get().symbolPinNumber );
1693 wxString signalName = ref + wxS( ":" ) + modelPin.get().modelPinName;
1694 wxString op = m_schematic->GetOperatingPoint( signalName,
1695 settings.m_OPO_IPrecision,
1696 settings.m_OPO_IRange );
1697
1698 if( symbolPin && !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1699 {
1700 symbolPin->SetOperatingPoint( op );
1701 GetCanvas()->GetView()->Update( symbol );
1702 }
1703 }
1704 }
1705 }
1706 }
1707
1708 for( const auto& [ key, subgraphList ] : m_schematic->m_connectionGraph->GetNetMap() )
1709 {
1710 wxString op = m_schematic->GetOperatingPoint( key.Name, settings.m_OPO_VPrecision,
1711 settings.m_OPO_VRange );
1712
1713 if( !op.IsEmpty() && op != wxS( "--" ) && op != wxS( "?" ) )
1714 {
1715 for( CONNECTION_SUBGRAPH* subgraph : subgraphList )
1716 {
1717 SCH_LINE* longestWire = nullptr;
1718 double length = 0.0;
1719
1720 if( subgraph->GetSheet().GetExcludedFromSim() )
1721 continue;
1722
1723 for( SCH_ITEM* item : subgraph->GetItems() )
1724 {
1725 if( item->Type() == SCH_LINE_T )
1726 {
1727 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1728
1729 if( line->IsWire() && line->GetLength() > length )
1730 {
1731 longestWire = line;
1732 length = line->GetLength();
1733 }
1734 }
1735 }
1736
1737 if( longestWire )
1738 {
1739 longestWire->SetOperatingPoint( op );
1740 GetCanvas()->GetView()->Update( longestWire );
1741 }
1742 }
1743 }
1744 }
1745}
1746
1747
1749{
1750 if( aItem->Type() == SCH_GLOBAL_LABEL_T || aItem->Type() == SCH_HIER_LABEL_T )
1751 {
1752 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( aItem );
1753
1754 if( label->AutoRotateOnPlacement() )
1755 {
1756 SPIN_STYLE spin = aScreen->GetLabelOrientationForPoint( label->GetPosition(),
1757 label->GetSpinStyle(),
1758 &GetCurrentSheet() );
1759
1760 if( spin != label->GetSpinStyle() )
1761 {
1762 label->SetSpinStyle( spin );
1763
1764 for( SCH_ITEM* item : aScreen->Items().OfType( SCH_GLOBAL_LABEL_T ) )
1765 {
1766 SCH_LABEL_BASE* otherLabel = static_cast<SCH_LABEL_BASE*>( item );
1767
1768 if( otherLabel != label && otherLabel->GetText() == label->GetText() )
1769 otherLabel->AutoplaceFields( aScreen, AUTOPLACE_AUTO );
1770 }
1771 }
1772 }
1773 }
1774}
1775
1776
1778{
1779 SCH_SCREEN* screen = GetScreen();
1780
1781 wxCHECK( screen, /* void */ );
1782
1783 wxString title;
1784
1785 if( !screen->GetFileName().IsEmpty() )
1786 {
1787 wxFileName fn( Prj().AbsolutePath( screen->GetFileName() ) );
1788 bool readOnly = false;
1789 bool unsaved = false;
1790
1791 if( fn.IsOk() && screen->FileExists() )
1792 readOnly = screen->IsReadOnly();
1793 else
1794 unsaved = true;
1795
1796 if( IsContentModified() )
1797 title = wxT( "*" );
1798
1799 title += fn.GetName();
1800
1801 wxString sheetPath = GetCurrentSheet().PathHumanReadable( false, true );
1802
1803 if( sheetPath != title )
1804 title += wxString::Format( wxT( " [%s]" ), sheetPath );
1805
1806 if( readOnly )
1807 title += wxS( " " ) + _( "[Read Only]" );
1808
1809 if( unsaved )
1810 title += wxS( " " ) + _( "[Unsaved]" );
1811 }
1812 else
1813 {
1814 title = _( "[no schematic loaded]" );
1815 }
1816
1817 title += wxT( " \u2014 " ) + _( "Schematic Editor" );
1818
1819 SetTitle( title );
1820}
1821
1822
1824{
1826
1827 if( GetScreen() )
1828 GetScreen()->m_zoomInitialized = true;
1829}
1830
1831
1833 PROGRESS_REPORTER* aProgressReporter )
1834{
1835 wxString highlightedConn = GetHighlightedConnection();
1836 bool hasHighlightedConn = !highlightedConn.IsEmpty();
1837
1838 std::function<void( SCH_ITEM* )> changeHandler =
1839 [&]( SCH_ITEM* aChangedItem ) -> void
1840 {
1841 GetCanvas()->GetView()->Update( aChangedItem, KIGFX::REPAINT );
1842
1843 SCH_CONNECTION* connection = aChangedItem->Connection();
1844
1846 return;
1847
1848 if( !hasHighlightedConn )
1849 {
1850 // No highlighted connection, but connectivity has changed, so refresh
1851 // the list of all nets
1853 }
1854 else if( connection
1855 && ( connection->Name() == highlightedConn
1856 || connection->HasDriverChanged() ) )
1857 {
1859 }
1860 };
1861
1862 Schematic().RecalculateConnections( aCommit, aCleanupFlags,
1864 aProgressReporter,
1865 GetCanvas()->GetView(),
1866 &changeHandler,
1867 m_undoList.m_CommandsList.empty() ? nullptr
1868 : m_undoList.m_CommandsList.back() );
1869
1871 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1872 {
1873 int flags = 0;
1874 SCH_ITEM* item = dynamic_cast<SCH_ITEM*>( aItem );
1875 SCH_CONNECTION* connection = item ? item->Connection() : nullptr;
1876
1877 auto invalidateTextVars =
1878 [&flags]( EDA_TEXT* text )
1879 {
1880 if( text->HasTextVars() )
1881 {
1882 text->ClearRenderCache();
1883 text->ClearBoundingBoxCache();
1885 }
1886 };
1887
1888 if( connection && connection->HasDriverChanged() )
1889 {
1890 connection->ClearDriverChanged();
1891 flags |= KIGFX::REPAINT;
1892 }
1893
1894 if( item )
1895 {
1896 item->RunOnChildren(
1897 [&invalidateTextVars]( SCH_ITEM* aChild )
1898 {
1899 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aChild ) )
1900 invalidateTextVars( text );
1901 },
1903
1904 if( flags & KIGFX::GEOMETRY )
1905 GetScreen()->Update( item, false ); // Refresh RTree
1906 }
1907
1908 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1909 invalidateTextVars( text );
1910
1911 return flags;
1912 } );
1913
1915 || !Schematic().ConnectionGraph()->FindFirstSubgraphByName( highlightedConn ) )
1916 {
1920 }
1921}
1922
1923
1928
1929
1931{
1932 GetCanvas()->GetView()->Update( aItem );
1933}
1934
1935
1942
1943
1944std::unique_ptr<GRID_HELPER> SCH_EDIT_FRAME::MakeGridHelper()
1945{
1946 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
1947}
1948
1949
1951{
1953
1954 SCHEMATIC_SETTINGS& settings = Schematic().Settings();
1955
1958
1960
1961 if( EESCHEMA_SETTINGS* cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" ) )
1962 {
1963 GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
1964 GetRenderSettings()->SetDefaultFont( cfg->m_Appearance.default_font );
1965
1966 KIGFX::VIEW* view = GetCanvas()->GetView();
1967 view->SetLayerVisible( LAYER_ERC_ERR, cfg->m_Appearance.show_erc_errors );
1968 view->SetLayerVisible( LAYER_ERC_WARN, cfg->m_Appearance.show_erc_warnings );
1969 view->SetLayerVisible( LAYER_ERC_EXCLUSION, cfg->m_Appearance.show_erc_exclusions );
1970 view->SetLayerVisible( LAYER_OP_VOLTAGES, cfg->m_Appearance.show_op_voltages );
1971 view->SetLayerVisible( LAYER_OP_CURRENTS, cfg->m_Appearance.show_op_currents );
1972
1973 GetRenderSettings()->m_ShowPinAltIcons = cfg->m_Appearance.show_pin_alt_icons;
1974
1976
1977 settings.m_TemplateFieldNames.DeleteAllFieldNameTemplates( true /* global */ );
1978
1979 if( !cfg->m_Drawing.field_names.IsEmpty() )
1980 settings.m_TemplateFieldNames.AddTemplateFieldNames( cfg->m_Drawing.field_names );
1981 }
1982
1984
1985 for( SCH_ITEM* item : screen->Items() )
1986 {
1987 item->ClearCaches();
1988
1989 if( item->Type() == SCH_LINE_T )
1990 {
1991 SCH_LINE* line = static_cast<SCH_LINE*>( item );
1992
1993 if( line->IsWire() )
1994 UpdateHopOveredWires( line );
1995 }
1996 }
1997
1998 for( const auto& [ libItemName, libSymbol ] : screen->GetLibSymbols() )
1999 libSymbol->ClearCaches();
2000
2002
2004 Layout();
2005 SendSizeEvent();
2006}
2007
2008
2010{
2011 // Store the current zoom level into the current screen before calling
2012 // DisplayCurrentSheet() that set the zoom to GetScreen()->m_LastZoomLevel
2014
2015 // Rebuild the sheet view (draw area and any other items):
2017}
2018
2019
2021{
2022 // call my base class
2024
2025 // tooltips in toolbars
2027
2028 // For some obscure reason, the AUI manager hides the first modified pane.
2029 // So force show panes
2030 wxAuiPaneInfo& design_blocks_pane_info = m_auimgr.GetPane( m_designBlocksPane );
2031 bool panel_shown = design_blocks_pane_info.IsShown();
2032 design_blocks_pane_info.Caption( _( "Design Blocks" ) );
2033 design_blocks_pane_info.Show( panel_shown );
2034
2035 m_auimgr.GetPane( m_hierarchy ).Caption( _( "Schematic Hierarchy" ) );
2036 m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
2037 m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
2038 m_auimgr.GetPane( m_designBlocksPane ).Caption( _( "Design Blocks" ) );
2039 m_auimgr.GetPane( RemoteSymbolPaneName() ).Caption( _( "Remote Symbols" ) );
2040 m_auimgr.Update();
2041 m_hierarchy->UpdateHierarchyTree();
2042
2043 // status bar
2045
2046 updateTitle();
2047
2048 // This ugly hack is to fix an option(left) toolbar update bug that seems to only affect
2049 // windows. See https://bugs.launchpad.net/kicad/+bug/1816492. For some reason, calling
2050 // wxWindow::Refresh() does not resolve the issue. Only a resize event seems to force the
2051 // toolbar to update correctly.
2052#if defined( __WXMSW__ )
2053 PostSizeEvent();
2054#endif
2055}
2056
2057
2059{
2060 if( !GetHighlightedConnection().IsEmpty() )
2061 {
2062 SetStatusText( wxString::Format( _( "Highlighted net: %s" ),
2064 }
2065 else
2066 {
2067 SetStatusText( wxT( "" ) );
2068 }
2069}
2070
2071
2073{
2074 if( m_toolManager )
2076
2077 SCH_BASE_FRAME::SetScreen( aScreen );
2078 GetCanvas()->DisplaySheet( static_cast<SCH_SCREEN*>( aScreen ) );
2079
2080 if( m_toolManager )
2082}
2083
2084
2085const BOX2I SCH_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
2086{
2087 BOX2I bBoxDoc;
2088
2089 if( !GetScreen() )
2090 return bBoxDoc;
2091
2092 if( aIncludeAllVisible )
2093 {
2094 // Get the whole page size and return that
2095 int sizeX = GetScreen()->GetPageSettings().GetWidthIU( schIUScale.IU_PER_MILS );
2096 int sizeY = GetScreen()->GetPageSettings().GetHeightIU( schIUScale.IU_PER_MILS );
2097 bBoxDoc = BOX2I( VECTOR2I( 0, 0 ), VECTOR2I( sizeX, sizeY ) );
2098 }
2099 else
2100 {
2101 // Get current drawing-sheet in a form we can compare to an EDA_ITEM
2103 EDA_ITEM* dsAsItem = static_cast<EDA_ITEM*>( ds );
2104
2105 // Calc the bounding box of all items on screen except the page border
2106 for( EDA_ITEM* item : GetScreen()->Items() )
2107 {
2108 if( item != dsAsItem ) // Ignore the drawing-sheet itself
2109 bBoxDoc.Merge( item->GetBoundingBox() );
2110 }
2111 }
2112
2113 return bBoxDoc;
2114}
2115
2116
2118{
2119 if( !Schematic().HasHierarchy() )
2120 return false;
2121
2122 return Schematic().Hierarchy().IsModified();
2123}
2124
2125
2127{
2128 EESCHEMA_SETTINGS* cfg = eeconfig();
2129 return cfg && cfg->m_Appearance.show_hidden_pins;
2130}
2131
2132
2133void SCH_EDIT_FRAME::FocusOnItem( EDA_ITEM* aItem, bool aAllowScroll )
2134{
2135 // nullptr will clear the current focus
2136 if( aItem != nullptr && !aItem->IsSCH_ITEM() )
2137 return;
2138
2139 static KIID lastBrightenedItemID( niluuid );
2140
2141 SCH_ITEM* lastItem = Schematic().ResolveItem( lastBrightenedItemID, nullptr, true );
2142
2143 if( lastItem && lastItem != aItem )
2144 {
2145 lastItem->ClearBrightened();
2146
2147 UpdateItem( lastItem );
2148 lastBrightenedItemID = niluuid;
2149 }
2150
2151 if( aItem )
2152 {
2153 if( !aItem->IsBrightened() )
2154 {
2155 aItem->SetBrightened();
2156
2157 UpdateItem( aItem );
2158 lastBrightenedItemID = aItem->m_Uuid;
2159 }
2160
2161 FocusOnLocation( aItem->GetFocusPosition(), aAllowScroll );
2162 }
2163}
2164
2165
2167{
2168 return Schematic().GetFileName();
2169}
2170
2171
2173{
2174 return m_toolManager->GetTool<SCH_SELECTION_TOOL>()->GetSelection();
2175}
2176
2177void SCH_EDIT_FRAME::onSize( wxSizeEvent& aEvent )
2178{
2179 if( IsShown() )
2180 {
2181 // We only need this until the frame is done resizing and the final client size is
2182 // established.
2183 Unbind( wxEVT_SIZE, &SCH_EDIT_FRAME::onSize, this );
2185 }
2186
2187 // Skip() is called in the base class.
2188 EDA_DRAW_FRAME::OnSize( aEvent );
2189}
2190
2191
2193 const KIID& aSchematicSymbolUUID )
2194{
2195 SCH_SHEET_PATH principalPath;
2196 SCH_SHEET_LIST sheets = Schematic().Hierarchy();
2197 SCH_ITEM* item = sheets.ResolveItem( aSchematicSymbolUUID, &principalPath, true );
2198 SCH_SYMBOL* principalSymbol = dynamic_cast<SCH_SYMBOL*>( item );
2199 SCH_COMMIT commit( m_toolManager );
2200
2201 if( !principalSymbol )
2202 return;
2203
2204 wxString principalRef;
2205
2206 if( principalSymbol->IsAnnotated( &principalPath ) )
2207 principalRef = principalSymbol->GetRef( &principalPath, false );
2208
2209 std::vector< std::pair<SCH_SYMBOL*, SCH_SHEET_PATH> > allUnits;
2210
2211 for( const SCH_SHEET_PATH& path : sheets )
2212 {
2213 for( SCH_ITEM* candidate : path.LastScreen()->Items().OfType( SCH_SYMBOL_T ) )
2214 {
2215 SCH_SYMBOL* candidateSymbol = static_cast<SCH_SYMBOL*>( candidate );
2216
2217 if( candidateSymbol == principalSymbol
2218 || ( candidateSymbol->IsAnnotated( &path )
2219 && candidateSymbol->GetRef( &path, false ) == principalRef ) )
2220 {
2221 allUnits.emplace_back( candidateSymbol, path );
2222 }
2223 }
2224 }
2225
2226 for( auto& [ unit, path ] : allUnits )
2227 {
2228 // This needs to be done before the LIB_SYMBOL is changed to prevent stale
2229 // library symbols in the schematic file.
2230 path.LastScreen()->Remove( unit );
2231
2232 if( !unit->IsNew() )
2233 commit.Modify( unit, path.LastScreen() );
2234
2235 unit->SetLibSymbol( aSymbol.Flatten().release() );
2236 unit->UpdateFields( &GetCurrentSheet(),
2237 true, /* update style */
2238 true, /* update ref */
2239 true, /* update other fields */
2240 false, /* reset ref */
2241 false /* reset other fields */ );
2242
2243 path.LastScreen()->Append( unit );
2244 GetCanvas()->GetView()->Update( unit );
2245 }
2246
2247 // Clear any orphaned alternate pins.
2248 for( SCH_PIN* pin : principalSymbol->GetPins() )
2249 {
2250 wxString altName = pin->GetAlt();
2251
2252 if( altName.IsEmpty() )
2253 continue;
2254
2255 if( pin->GetAlternates().count( altName ) == 0 )
2256 pin->SetAlt( wxEmptyString );
2257 }
2258
2259 if( !commit.Empty() )
2260 commit.Push( _( "Save Symbol to Schematic" ) );
2261}
2262
2263
2264void SCH_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
2265{
2266 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
2267
2268 if( SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( aItem ) )
2269 sch_item->ClearCaches();
2270}
2271
2272
2274{
2275 wxCHECK( m_toolManager, /* void */ );
2276
2280
2281 wxCHECK( screen, /* void */ );
2282
2284
2285 SCH_BASE_FRAME::SetScreen( screen );
2286
2287 SetSheetNumberAndCount(); // will also update CurrentScreen()'s sheet number info
2288
2290
2291 // update the references, units, and intersheet-refs
2293
2294 // dangling state can also have changed if different units with different pin locations are
2295 // used
2298
2299 SCH_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<SCH_SELECTION_TOOL>();
2300
2301 wxCHECK( selectionTool, /* void */ );
2302
2303 auto visit =
2304 [&]( EDA_ITEM* item )
2305 {
2307 && !m_findReplaceData->findString.IsEmpty()
2308 && item->Matches( *m_findReplaceData, &GetCurrentSheet() ) )
2309 {
2310 item->SetForceVisible( true );
2311 selectionTool->BrightenItem( item );
2312 }
2313 else if( item->IsBrightened() )
2314 {
2315 item->SetForceVisible( false );
2316 selectionTool->UnbrightenItem( item );
2317 }
2318 };
2319
2320 for( SCH_ITEM* item : screen->Items() )
2321 {
2322 visit( item );
2323
2324 item->RunOnChildren(
2325 [&]( SCH_ITEM* aChild )
2326 {
2327 visit( aChild );
2328 },
2330 }
2331
2332 if( !screen->m_zoomInitialized )
2333 {
2335 }
2336 else
2337 {
2338 // Set zoom to last used in this screen
2339 GetCanvas()->GetView()->SetScale( GetScreen()->m_LastZoomLevel );
2340 GetCanvas()->GetView()->SetCenter( GetScreen()->m_ScrollCenter );
2341 }
2342
2343 updateTitle();
2344
2345 HardRedraw(); // Ensure all items are redrawn (especially the drawing-sheet items)
2346
2347 // Allow tools to re-add their VIEW_ITEMs after the last call to Clear in HardRedraw
2349
2350 SCH_EDITOR_CONTROL* editTool = m_toolManager->GetTool<SCH_EDITOR_CONTROL>();
2351
2352 wxCHECK( editTool, /* void */ );
2353
2355 editTool->UpdateNetHighlighting( dummy );
2356
2357 m_hierarchy->UpdateHierarchySelection();
2358
2359 m_schematic->OnSchSheetChanged();
2360}
2361
2362
2364{
2365 if( !m_diffSymbolDialog )
2366 {
2368 _( "Compare Symbol with Library" ) );
2369
2370 m_diffSymbolDialog->m_sdbSizerApply->SetLabel( _( "Update Symbol from Library..." ) );
2371 m_diffSymbolDialog->m_sdbSizerApply->Show();
2372 }
2373
2374 return m_diffSymbolDialog;
2375}
2376
2377
2378void SCH_EDIT_FRAME::onCloseSymbolDiffDialog( wxCommandEvent& aEvent )
2379{
2380 if( m_diffSymbolDialog && aEvent.GetString() == DIFF_SYMBOLS_DIALOG_NAME )
2381 {
2382 if( aEvent.GetId() == wxID_APPLY )
2383 {
2384 KIID symbolUUID = m_diffSymbolDialog->GetUserItemID();
2385
2386 CallAfter(
2387 [this, symbolUUID]()
2388 {
2389 EDA_ITEM* item = ResolveItem( symbolUUID );
2390
2391 if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( item ) )
2392 {
2393 m_toolManager->RunAction<EDA_ITEM*>( ACTIONS::selectItem, symbol );
2394
2396 dlg.ShowQuasiModal();
2397 }
2398 } );
2399 }
2400
2401 m_diffSymbolDialog->Destroy();
2402 m_diffSymbolDialog = nullptr;
2403 }
2404}
2405
2406
2408{
2409 if( !m_ercDialog )
2410 m_ercDialog = new DIALOG_ERC( this );
2411
2412 return m_ercDialog;
2413}
2414
2415
2416void SCH_EDIT_FRAME::onCloseErcDialog( wxCommandEvent& aEvent )
2417{
2418 if( m_ercDialog )
2419 {
2420 m_ercDialog->Destroy();
2421 m_ercDialog = nullptr;
2422 }
2423}
2424
2425
2433
2434
2436{
2438 {
2439 m_symbolFieldsTableDialog->Destroy();
2440 m_symbolFieldsTableDialog = nullptr;
2441 }
2442}
2443
2444
2445void SCH_EDIT_FRAME::AddSchematicChangeListener( wxEvtHandler* aListener )
2446{
2447 auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(), aListener );
2448
2449 // Don't add duplicate listeners.
2450 if( it == m_schematicChangeListeners.end() )
2451 m_schematicChangeListeners.push_back( aListener );
2452}
2453
2454
2456{
2457 auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(), aListener );
2458
2459 // Don't add duplicate listeners.
2460 if( it != m_schematicChangeListeners.end() )
2461 m_schematicChangeListeners.erase( it );
2462}
2463
2464
2466{
2467 wxPanel* panel = new wxPanel( this );
2468
2469 wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL );
2470
2471 // Create horizontal sizer for search control and gear button
2472 wxBoxSizer* searchSizer = new wxBoxSizer( wxHORIZONTAL );
2473
2474 m_netNavigatorFilter = new wxSearchCtrl( panel, wxID_ANY );
2475 m_netNavigatorFilter->SetDescriptiveText( _( "Filter nets" ) );
2476 m_netNavigatorFilter->ShowCancelButton( false );
2477 searchSizer->Add( m_netNavigatorFilter, 1, wxEXPAND | wxRIGHT, FromDIP( 2 ) );
2478
2479 m_netNavigatorMenuButton = new BITMAP_BUTTON( panel, wxID_ANY );
2481 m_netNavigatorMenuButton->SetPadding( FromDIP( 2 ) );
2482 searchSizer->Add( m_netNavigatorMenuButton, 0, wxALIGN_CENTER_VERTICAL );
2483
2484 sizer->Add( searchSizer, 0, wxEXPAND | wxALL, FromDIP( 2 ) );
2485
2486 m_netNavigator = new wxTreeCtrl( panel, wxID_ANY, wxPoint( 0, 0 ), FromDIP( wxSize( 160, 250 ) ),
2487 wxTR_DEFAULT_STYLE | wxNO_BORDER );
2488 sizer->Add( m_netNavigator, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP( 2 ) );
2489
2490 panel->SetSizer( sizer );
2491
2492 m_netNavigatorFilter->Bind( wxEVT_COMMAND_TEXT_UPDATED,
2494 m_netNavigatorFilter->Bind( wxEVT_KEY_DOWN, &SCH_EDIT_FRAME::onNetNavigatorKey, this );
2495 m_netNavigator->Bind( wxEVT_KEY_DOWN, &SCH_EDIT_FRAME::onNetNavigatorKey, this );
2496 m_netNavigator->Bind( wxEVT_TREE_ITEM_MENU, &SCH_EDIT_FRAME::onNetNavigatorItemMenu, this );
2497 m_netNavigator->Bind( wxEVT_CONTEXT_MENU, &SCH_EDIT_FRAME::onNetNavigatorContextMenu, this );
2498
2499 m_netNavigatorMenuButton->Bind( wxEVT_LEFT_DOWN,
2500 [this]( wxMouseEvent& event )
2501 {
2502 wxMenu menu;
2503 wxMenuItem* wildcardItem = menu.AppendRadioItem( ID_NET_NAVIGATOR_SEARCH_WILDCARD,
2504 _( "Wildcard Search" ) );
2505 wxMenuItem* regexItem = menu.AppendRadioItem( ID_NET_NAVIGATOR_SEARCH_REGEX,
2506 _( "Regex Search" ) );
2507
2508 EESCHEMA_SETTINGS* cfg = eeconfig();
2509
2511 wildcardItem->Check();
2512 else
2513 regexItem->Check();
2514
2515 PopupMenu( &menu );
2516 } );
2517
2523
2524 return panel;
2525}
2526
2527
2528void SCH_EDIT_FRAME::SetHighlightedConnection( const wxString& aConnection,
2529 const NET_NAVIGATOR_ITEM_DATA* aSelection )
2530{
2531 bool refreshNetNavigator = aConnection != m_highlightedConn;
2532
2533 m_highlightedConn = aConnection;
2534
2535 if( refreshNetNavigator )
2536 RefreshNetNavigator( aSelection );
2537}
2538
2539
2541{
2542 if( m_netNavigator )
2543 {
2544 NET_NAVIGATOR_ITEM_DATA itemData;
2545 wxTreeItemId selection = m_netNavigator->GetSelection();
2546 bool refreshSelection = selection.IsOk() && ( selection != m_netNavigator->GetRootItem() );
2547
2548 if( refreshSelection )
2549 {
2551 dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( selection ) );
2552
2553 wxCHECK( tmp, /* void */ );
2554 itemData = *tmp;
2555 }
2556
2557 m_netNavigator->DeleteAllItems();
2558 RefreshNetNavigator( refreshSelection ? &itemData : nullptr );
2559 }
2560
2562}
2563
2564
2566{
2567 if( !m_netNavigator )
2568 return;
2569
2570 wxString newFilter = m_netNavigatorFilter ? m_netNavigatorFilter->GetValue() : wxString();
2571
2572 if( newFilter == m_netNavigatorFilterValue )
2573 return;
2574
2575 m_netNavigatorFilterValue = newFilter;
2576
2577 NET_NAVIGATOR_ITEM_DATA selectionData;
2578 NET_NAVIGATOR_ITEM_DATA* selectionPtr = nullptr;
2579
2580 wxTreeItemId selection = m_netNavigator->GetSelection();
2581
2582 if( selection.IsOk() )
2583 {
2584 if( NET_NAVIGATOR_ITEM_DATA* tmp =
2585 dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( selection ) ) )
2586 {
2587 selectionData = *tmp;
2588 selectionPtr = &selectionData;
2589 }
2590 }
2591
2592 RefreshNetNavigator( selectionPtr );
2593
2594 aEvent.Skip();
2595}
2596
2597
2598void SCH_EDIT_FRAME::onNetNavigatorKey( wxKeyEvent& aEvent )
2599{
2600 if( aEvent.GetKeyCode() == WXK_ESCAPE )
2601 {
2602 // Clear the search string and refresh
2604 m_netNavigatorFilter->SetValue( wxEmptyString );
2605
2606 m_netNavigatorFilterValue = wxEmptyString;
2607
2609
2610 // Don't skip the event - we handled it
2611 return;
2612 }
2613
2614 aEvent.Skip();
2615}
2616
2617
2618
2620{
2621 showNetNavigatorMenu( aEvent.GetItem() );
2622}
2623
2624
2625void SCH_EDIT_FRAME::onNetNavigatorContextMenu( wxContextMenuEvent& aEvent )
2626{
2627 if( !m_netNavigator )
2628 return;
2629
2630 wxPoint screenPos = aEvent.GetPosition();
2631
2632 if( screenPos == wxDefaultPosition )
2633 screenPos = wxGetMousePosition();
2634
2635 wxPoint clientPos = m_netNavigator->ScreenToClient( screenPos );
2636 int flags = 0;
2637 wxTreeItemId item = m_netNavigator->HitTest( clientPos, flags );
2638
2639 showNetNavigatorMenu( item );
2640}
2641
2642
2643void SCH_EDIT_FRAME::showNetNavigatorMenu( const wxTreeItemId& aItem )
2644{
2645 if( !m_netNavigator )
2646 return;
2647
2648 wxMenu menu;
2649
2650 menu.Append( ID_NET_NAVIGATOR_EXPAND_ALL, _( "Expand All" ) );
2651 menu.Append( ID_NET_NAVIGATOR_COLLAPSE_ALL, _( "Collapse All" ) );
2652
2653 wxMenuItem* findInInspector = new wxMenuItem( &menu, ID_NET_NAVIGATOR_FIND_IN_INSPECTOR,
2654 _( "Find in Net Inspector" ) );
2655 menu.Append( findInInspector );
2656
2657 wxString netName;
2658
2659 if( aItem.IsOk() )
2660 {
2661 wxTreeItemId netItem = aItem;
2662
2663 if( m_netNavigator->GetItemParent( netItem ) != m_netNavigator->GetRootItem() )
2664 {
2665 wxTreeItemId parent = m_netNavigator->GetItemParent( netItem );
2666
2667 while( parent.IsOk() && parent != m_netNavigator->GetRootItem() )
2668 {
2669 netItem = parent;
2670 parent = m_netNavigator->GetItemParent( netItem );
2671 }
2672
2673 if( parent == m_netNavigator->GetRootItem() )
2674 {
2675 if( wxStringClientData* data =
2676 dynamic_cast<wxStringClientData*>( m_netNavigator->GetItemData( netItem ) ) )
2677 {
2678 netName = data->GetData();
2679 }
2680 }
2681 }
2682 else if( m_netNavigator->GetItemParent( netItem ) == m_netNavigator->GetRootItem() )
2683 {
2684 if( wxStringClientData* data =
2685 dynamic_cast<wxStringClientData*>( m_netNavigator->GetItemData( netItem ) ) )
2686 {
2687 netName = data->GetData();
2688 }
2689 }
2690 else if( !m_highlightedConn.IsEmpty() && netItem == m_netNavigator->GetRootItem() )
2691 {
2692 netName = m_highlightedConn;
2693 }
2694 }
2695 else if( !m_highlightedConn.IsEmpty() && m_netNavigator->GetRootItem().IsOk() )
2696 {
2697 netName = m_highlightedConn;
2698 }
2699
2700 if( netName.IsEmpty() )
2701 {
2702 findInInspector->Enable( false );
2704 }
2705 else
2706 {
2707 m_netNavigatorMenuNetName = netName;
2708 }
2709
2710 PopupMenu( &menu );
2711}
2712
2713
2714void SCH_EDIT_FRAME::onNetNavigatorMenuCommand( wxCommandEvent& aEvent )
2715{
2716 if( !m_netNavigator )
2717 return;
2718
2719 switch( aEvent.GetId() )
2720 {
2722 m_netNavigator->ExpandAll();
2723 break;
2724
2726 m_netNavigator->CollapseAll();
2727
2728 if( m_netNavigator->GetRootItem().IsOk() )
2729 m_netNavigator->Expand( m_netNavigator->GetRootItem() );
2730 break;
2731
2733 if( !m_netNavigatorMenuNetName.IsEmpty() )
2735 break;
2736
2739 if( EESCHEMA_SETTINGS* cfg = eeconfig() )
2740 {
2741 cfg->m_AuiPanels.net_nav_search_mode_wildcard = ( aEvent.GetId() == ID_NET_NAVIGATOR_SEARCH_WILDCARD );
2742
2743 // Refresh the navigator with current filter
2745 }
2746
2747 break;
2748
2749 default:
2750 aEvent.Skip();
2751 return;
2752 }
2753
2755
2756 aEvent.Skip( false );
2757}
2758
2759
2761{
2762 wxAuiPaneInfo& hierarchyPane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
2763 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
2764 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
2765 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
2766
2767 // Don't give the selection filter its own visibility controls; instead show it if
2768 // anything else is visible
2769 bool showFilter = ( hierarchyPane.IsShown() && hierarchyPane.IsDocked() )
2770 || ( netNavigatorPane.IsShown() && netNavigatorPane.IsDocked() )
2771 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
2772
2773 selectionFilterPane.Show( showFilter );
2774}
2775
2776
2777#ifdef KICAD_IPC_API
2778void SCH_EDIT_FRAME::onPluginAvailabilityChanged( wxCommandEvent& aEvt )
2779{
2780 wxLogTrace( traceApi, "SCH frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" );
2782 aEvt.Skip();
2783}
2784#endif
2785
2786
2788{
2789 EESCHEMA_SETTINGS* cfg = eeconfig();
2790
2791 // Ensure m_show_search is up to date (the pane can be closed outside the menu)
2792 m_show_search = m_auimgr.GetPane( SearchPaneName() ).IsShown();
2793
2795
2796 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
2797 searchPaneInfo.Show( m_show_search );
2798
2799 if( m_show_search )
2800 {
2801 searchPaneInfo.Direction( cfg->m_AuiPanels.search_panel_dock_direction );
2802
2803 if( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_TOP
2804 || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_BOTTOM )
2805 {
2806 SetAuiPaneSize( m_auimgr, searchPaneInfo, -1, cfg->m_AuiPanels.search_panel_height );
2807 }
2808 else if( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_LEFT
2809 || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_RIGHT )
2810 {
2811 SetAuiPaneSize( m_auimgr, searchPaneInfo, cfg->m_AuiPanels.search_panel_width, -1 );
2812 }
2813
2814 m_searchPane->FocusSearch();
2815 m_searchPane->RefreshSearch();
2816 }
2817 else
2818 {
2819 cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
2820 cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
2821 cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
2822 m_auimgr.Update();
2823 }
2824}
2825
2826
2828{
2829 if( !m_propertiesPanel )
2830 return;
2831
2832 bool show = !m_propertiesPanel->IsShownOnScreen();
2833
2834 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
2835 propertiesPaneInfo.Show( show );
2836
2838
2839 EESCHEMA_SETTINGS* settings = eeconfig();
2840
2841 if( show )
2842 {
2843 SetAuiPaneSize( m_auimgr, propertiesPaneInfo,
2844 settings->m_AuiPanels.properties_panel_width, -1 );
2845 }
2846 else
2847 {
2848 settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x;
2849 m_auimgr.Update();
2850 }
2851}
2852
2853
2855{
2856 EESCHEMA_SETTINGS* cfg = eeconfig();
2857
2858 wxCHECK( cfg, /* void */ );
2859
2860 wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
2861
2862 hierarchy_pane.Show( !hierarchy_pane.IsShown() );
2863
2865
2866 if( hierarchy_pane.IsShown() )
2867 {
2868 if( hierarchy_pane.IsFloating() )
2869 {
2870 hierarchy_pane.FloatingSize( cfg->m_AuiPanels.hierarchy_panel_float_width,
2872 m_auimgr.Update();
2873 }
2874 else if( cfg->m_AuiPanels.hierarchy_panel_docked_width > 0 )
2875 {
2876 // SetAuiPaneSize also updates m_auimgr
2877 SetAuiPaneSize( m_auimgr, hierarchy_pane,
2879 }
2880 }
2881 else
2882 {
2883 if( hierarchy_pane.IsFloating() )
2884 {
2885 cfg->m_AuiPanels.hierarchy_panel_float_width = hierarchy_pane.floating_size.x;
2886 cfg->m_AuiPanels.hierarchy_panel_float_height = hierarchy_pane.floating_size.y;
2887 }
2888 else
2889 {
2891 }
2892
2893 m_auimgr.Update();
2894 }
2895}
2896
2897
2899{
2900 EESCHEMA_SETTINGS* cfg = eeconfig();
2901
2902 wxCHECK( cfg, /* void */ );
2903
2904 wxAuiPaneInfo& db_library_pane = m_auimgr.GetPane( DesignBlocksPaneName() );
2905
2906 db_library_pane.Show( !db_library_pane.IsShown() );
2907
2908 if( db_library_pane.IsShown() )
2909 {
2910 if( db_library_pane.IsFloating() )
2911 {
2912 db_library_pane.FloatingSize( cfg->m_AuiPanels.design_blocks_panel_float_width,
2914 m_auimgr.Update();
2915 }
2917 {
2918 // SetAuiPaneSize also updates m_auimgr
2919 SetAuiPaneSize( m_auimgr, db_library_pane,
2921 }
2922 }
2923 else
2924 {
2925 if( db_library_pane.IsFloating() )
2926 {
2927 cfg->m_AuiPanels.design_blocks_panel_float_width = db_library_pane.floating_size.x;
2928 cfg->m_AuiPanels.design_blocks_panel_float_height = db_library_pane.floating_size.y;
2929 }
2930 else
2931 {
2933 }
2934
2935 m_auimgr.Update();
2936 }
2937}
2938
2939
2941{
2942 EESCHEMA_SETTINGS* cfg = eeconfig();
2943
2944 wxCHECK( cfg, /* void */ );
2945
2946 wxAuiPaneInfo& remotePane = m_auimgr.GetPane( RemoteSymbolPaneName() );
2947
2948 remotePane.Show( !remotePane.IsShown() );
2949
2950 if( remotePane.IsShown() )
2951 {
2952 if( remotePane.IsFloating() )
2953 {
2954 remotePane.FloatingSize( cfg->m_AuiPanels.remote_symbol_panel_float_width,
2956 m_auimgr.Update();
2957 }
2959 {
2960 SetAuiPaneSize( m_auimgr, remotePane,
2962 }
2963 }
2964 else
2965 {
2966 if( remotePane.IsFloating() )
2967 {
2968 cfg->m_AuiPanels.remote_symbol_panel_float_width = remotePane.floating_size.x;
2969 cfg->m_AuiPanels.remote_symbol_panel_float_height = remotePane.floating_size.y;
2970 }
2971 else if( m_remoteSymbolPane )
2972 {
2974 }
2975
2976 m_auimgr.Update();
2977 }
2978}
2979
2980
2982{
2983 wxCHECK( aSchematic, /* void */ );
2984
2985 if( m_schematic )
2986 m_schematic->SetProject( nullptr );
2987
2988 aSchematic->SetProject( &Prj() );
2989 delete m_schematic;
2990
2991 m_schematic = aSchematic;
2992 m_schematic->SetSchematicHolder( this );
2993
2994 KIGFX::SCH_VIEW* view = GetCanvas()->GetView();
2995 static_cast<KIGFX::SCH_PAINTER*>( view->GetPainter() )->SetSchematic( m_schematic );
2996 m_toolManager->SetEnvironment( m_schematic, GetCanvas()->GetView(), GetCanvas()->GetViewControls(), config(),
2997 this );
2998}
2999
3000
3002{
3004 return;
3005
3006 wxTextEntryDialog dlg( this, _( "Enter new variant name" ), _( "Variant Name" ) );
3007
3008 if( dlg.ShowModal() == wxID_CANCEL )
3009 return;
3010
3011 wxString variantName = dlg.GetValue();
3012
3013 if( variantName.IsEmpty() || ( m_currentVariantCtrl->FindString( variantName ) != wxNOT_FOUND ) )
3014 return;
3015
3016 Schematic().AddVariant( variantName );
3017
3018 int selected = m_currentVariantCtrl->GetSelection();
3019 wxString tmp;
3020
3021 if( selected != wxNOT_FOUND )
3022 tmp = m_currentVariantCtrl->GetString( selected );
3023
3024 m_currentVariantCtrl->Set( Schematic().GetVariantNamesForUI() );
3025
3026 if( selected != wxNOT_FOUND )
3027 {
3028 selected = m_currentVariantCtrl->FindString( tmp );
3029 m_currentVariantCtrl->SetSelection( selected );
3030 }
3031}
3032
3033
3035{
3037 return;
3038
3039 wxArrayString choices = Schematic().GetVariantNamesForUI();
3040
3041 // Default variant cannot be removed.
3042 choices.RemoveAt( 0 );
3043
3044 wxSingleChoiceDialog dlg( this, _( "Select variant name to remove" ), _( "Variant Name" ), choices );
3045
3046 if( dlg.ShowModal() == wxID_CANCEL )
3047 return;
3048
3049 wxString variantName = dlg.GetStringSelection();
3050
3051 if( variantName.IsEmpty() )
3052 return;
3053
3054 SCH_COMMIT commit( this );
3055 Schematic().DeleteVariant( variantName, &commit );
3056
3057 if( !commit.Empty() )
3058 {
3059 commit.Push( wxString::Format( wxS( "Delete variant '%s'" ), variantName ) );
3060 OnModify();
3061 }
3062
3063 int selected = m_currentVariantCtrl->GetSelection();
3064 wxString tmp;
3065
3066 if( selected != wxNOT_FOUND )
3067 tmp = m_currentVariantCtrl->GetString( selected );
3068
3069 m_currentVariantCtrl->Set( Schematic().GetVariantNamesForUI() );
3070
3071 if( selected != wxNOT_FOUND )
3072 {
3073 if( tmp != variantName )
3074 {
3075 selected = m_currentVariantCtrl->FindString( tmp );
3076 m_currentVariantCtrl->SetSelection( selected );
3077 }
3078 else
3079 {
3080 m_currentVariantCtrl->SetSelection( 0 );
3081 SetCurrentVariant( wxEmptyString );
3082 }
3083 }
3084
3085 GetCanvas()->Refresh();
3086}
3087
3088
3090{
3091 // Delegate to base auto-save behavior (commits pending local history) for now.
3093}
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...
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
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 OnSelectGrid(wxCommandEvent &event)
Command event handler for selecting grid sizes.
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.
virtual void OnSelectZoom(wxCommandEvent &event)
Set the zoom factor when selected by the zoom list box in the main tool bar.
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:285
const KIID m_Uuid
Definition eda_item.h:522
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
void ClearBrightened()
Definition eda_item.h:144
void SetBrightened()
Definition eda_item.h:141
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:294
void OnKiCadExit()
Definition kiway.cpp:761
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:301
LOCAL_HISTORY & LocalHistory()
Return the LOCAL_HISTORY associated with this KIWAY.
Definition kiway.h:406
Define a library symbol object.
Definition lib_symbol.h:83
void AppendParentEmbeddedFiles(std::vector< EMBEDDED_FILES * > &aStack) const
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 UnregisterSaver(const void *aSaverObject)
Unregister a previously registered saver callback.
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:893
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:192
void Reset()
Initialize this schematic to a blank one, unloading anything existing.
void DeleteVariant(const wxString &aVariantName, SCH_COMMIT *aCommit=nullptr)
Delete all information for aVariantName.
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)
SCHEMATIC_SETTINGS & Settings() const
SCH_ITEM * ResolveItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr, bool aAllowNullptrReturn=false) const
Definition schematic.h:126
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
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
void onVariantSelected(wxCommandEvent &aEvent)
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:140
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode)
Definition sch_item.h:630
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:466
bool ResolveExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
Definition sch_item.cpp:277
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:991
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:747
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:140
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:496
double m_LastZoomLevel
last value for the zoom level, useful in Eeschema when changing the current displayed sheet to reuse ...
Definition sch_screen.h:674
EE_RTREE & Items()
Get the full RTree, usually for iterating.
Definition sch_screen.h:118
const wxString & GetFileName() const
Definition sch_screen.h:153
bool IsReadOnly() const
Definition sch_screen.h:156
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
bool m_zoomInitialized
Definition sch_screen.h:699
bool FileExists() const
Definition sch_screen.h:159
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:142
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.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition sch_symbol.h:184
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
VECTOR2I GetPosition() const override
Definition sch_text.h:147
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:628
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_ON_GRID_SELECT
Definition id.h:113
@ ID_FILE_LIST_CLEAR
Definition id.h:62
@ ID_EDA_SOCKET_EVENT
Definition id.h:133
@ ID_EDA_SOCKET_EVENT_SERV
Definition id.h:132
@ ID_ON_ZOOM_SELECT
Definition id.h:112
@ ID_FILEMAX
Definition id.h:60
@ ID_FILE1
Definition id.h:59
PROJECT & Prj()
Definition kicad.cpp:637
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.
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.