KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_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) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright (C) 2013 Wayne Stambaugh <[email protected]>
7 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
8 *
9 * This program is free software: you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation, either version 3 of the License, or (at your
12 * option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
23#include <algorithm>
24#include <type_traits>
25#include <unordered_map>
26#include <unordered_set>
27#include <vector>
28
29#include <wx/log.h>
30#include <wx/filename.h>
31#include <wx/filedlg.h>
32#include <wx/hyperlink.h>
33#include <wx/socket.h>
34#include <wx/wupdlock.h>
35
36#include <advanced_config.h>
38#include <kiface_base.h>
39#include <kiway.h>
42#include <pgm_base.h>
43#include <pcb_edit_frame.h>
47#include <api/api_handler_pcb.h>
49#include <api/api_server.h>
50#include <api/api_utils.h>
52#include <bitmaps.h>
53#include <confirm.h>
54#include <footprint.h>
55#include <footprint_utils.h>
57#include <project_pcb.h>
58#include <lset.h>
59#include <trace_helpers.h>
60#include <pcbnew_id.h>
61#include <pcbnew_settings.h>
64#include <dialog_find.h>
70#include <dialog_board_setup.h>
72#include <pcb_drill_chart.h>
73#include <pcb_drill_map.h>
77#include <pad.h>
78#include <pcb_target.h>
79#include <pcb_point.h>
80#include <pcb_track.h>
81#include <layer_pairs.h>
84#include <text_var_dependency.h>
85#include <view/view.h>
87#include <functional>
88#include <pcb_barcode.h>
89#include <pcb_grid_item.h>
90#include <pcb_painter.h>
95#include <local_history.h>
96#include <tool/tool_manager.h>
98#include <tool/action_toolbar.h>
99#include <tool/common_control.h>
100#include <tool/common_tools.h>
101#include <tool/embed_tool.h>
102#include <tool/properties_tool.h>
103#include <tool/selection.h>
104#include <tool/zoom_tool.h>
105#include <tools/array_tool.h>
110#include <tools/edit_tool.h>
112#include <tools/pcb_group_tool.h>
113#include <tools/generator_tool.h>
116#include <tools/drc_tool.h>
119#include <tools/convert_tool.h>
121#include <tools/drawing_tool.h>
122#include <tools/pcb_control.h>
130#include <tools/pad_tool.h>
132#include <properties/property.h>
139#include <router/router_tool.h>
142#include <dialog_drc.h> // for DIALOG_DRC_WINDOW_NAME definition
148#include <widgets/wx_infobar.h>
152#include <widgets/wx_aui_utils.h>
153#include <kiplatform/app.h>
154#include <kiplatform/ui.h>
155#include <core/profile.h>
156#include <math/box2_minmax.h>
160#include <toolbars_pcb_editor.h>
162
163#include <richio.h>
164
165using namespace std::placeholders;
166
167wxDEFINE_EVENT( EDA_EVT_PCB_LAST_SCH_SHEET_CHANGED, wxCommandEvent );
168
169
170#define INSPECT_DRC_ERROR_DIALOG_NAME wxT( "InspectDrcErrorDialog" )
171#define INSPECT_CLEARANCE_DIALOG_NAME wxT( "InspectClearanceDialog" )
172#define INSPECT_CONSTRAINTS_DIALOG_NAME wxT( "InspectConstraintsDialog" )
173#define FOOTPRINT_DIFF_DIALOG_NAME wxT( "FootprintDiffDialog" )
174
175
176BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME )
179
182
183 EVT_SIZE( PCB_EDIT_FRAME::OnSize )
184
185 // Menu Files:
188
189 EVT_MENU( wxID_EXIT, PCB_EDIT_FRAME::OnQuit )
190 EVT_MENU( wxID_CLOSE, PCB_EDIT_FRAME::OnQuit )
191
192 // Horizontal toolbar
197
198 // Tracks and vias sizes general options
200 PCB_EDIT_FRAME::Tracks_and_Vias_Size_Event )
201
202 // User interface update event handlers.
203 EVT_UPDATE_UI( ID_AUX_TOOLBAR_PCB_TRACK_WIDTH, PCB_EDIT_FRAME::OnUpdateSelectTrackWidth )
204 EVT_UPDATE_UI( ID_AUX_TOOLBAR_PCB_VIA_SIZE, PCB_EDIT_FRAME::OnUpdateSelectViaSize )
206 PCB_EDIT_FRAME::OnUpdateSelectTrackWidth )
208 PCB_EDIT_FRAME::OnUpdateSelectViaSize )
209 // Drop files event
210 EVT_DROP_FILES( PCB_EDIT_FRAME::OnDropFiles )
211END_EVENT_TABLE()
212
213
214PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
215 PCB_BASE_EDIT_FRAME( aKiway, aParent, FRAME_PCB_EDITOR, _( "PCB Editor" ), wxDefaultPosition, wxDefaultSize,
217 m_exportNetlistAction( nullptr ),
218 m_findDialog( nullptr ),
219 m_findByPropertiesDialog( nullptr ),
220 m_inspectDrcErrorDlg( nullptr ),
221 m_inspectClearanceDlg( nullptr ),
222 m_inspectConstraintsDlg( nullptr ),
223 m_footprintDiffDlg( nullptr ),
224 m_boardSetupDlg( nullptr ),
225 m_footprintFieldsTableDialog( nullptr ),
226 m_designBlocksPane( nullptr ),
227 m_importProperties( nullptr ),
228 m_eventCounterTimer( nullptr )
229{
230 m_maximizeByDefault = true;
231 m_showBorderAndTitleBlock = true; // true to display sheet references
232 m_SelTrackWidthBox = nullptr;
233 m_SelViaSizeBox = nullptr;
234 m_SelViaStackBox = nullptr;
235 m_CurrentVariantCtrl = nullptr;
236 m_ShowLayerManagerTools = true;
237 m_supportsAutoSave = true;
238 m_ProbingSchToPcb = false;
239 m_ShowSearch = false;
240 m_ShowNetInspector = false;
241 // Ensure timer has an owner before binding so it generates events.
242 m_crossProbeFlashTimer.SetOwner( this );
243 Bind( wxEVT_TIMER, &PCB_EDIT_FRAME::OnCrossProbeFlashTimer, this, m_crossProbeFlashTimer.GetId() );
244
245 // We don't know what state board was in when it was last saved, so we have to
246 // assume dirty
247 m_ZoneFillsDirty = true;
248
249 m_aboutTitle = _HKI( "KiCad PCB Editor" );
250
251 // Must be created before the menus are created.
252 if( ADVANCED_CFG::GetCfg().m_ShowPcbnewExportNetlist )
253 {
254 m_exportNetlistAction = new TOOL_ACTION( "pcbnew.EditorControl.exportNetlist",
255 AS_GLOBAL, 0, "", _( "Netlist..." ),
256 _( "Export netlist used to update schematics" ) );
257 }
258
259 // Create GAL canvas
260 PCB_DRAW_PANEL_GAL* canvas = new PCB_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
261 GetGalDisplayOptions(),
263
264 SetCanvas( canvas );
265 SetBoard( new BOARD() );
266
267 wxIcon icon;
268 wxIconBundle icon_bundle;
269
270 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 48 ) );
271 icon_bundle.AddIcon( icon );
272 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 128 ) );
273 icon_bundle.AddIcon( icon );
274 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 256 ) );
275 icon_bundle.AddIcon( icon );
276 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew_32 ) );
277 icon_bundle.AddIcon( icon );
278 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew_16 ) );
279 icon_bundle.AddIcon( icon );
280
281 SetIcons( icon_bundle );
282
283 // LoadSettings() *after* creating m_LayersManager, because LoadSettings()
284 // initialize parameters in m_LayersManager
285 LoadSettings( config() );
286
287 SetScreen( new PCB_SCREEN( GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS ) ) );
288
289 // PCB drawings start in the upper left corner.
290 GetScreen()->m_Center = false;
291
292 setupTools();
293 setupUIConditions();
294
295 m_toolbarSettings = GetToolbarSettings<PCB_EDIT_TOOLBAR_SETTINGS>( "pcbnew-toolbars" );
296 configureToolbars();
297 RecreateToolbars();
298 PrepareLayerIndicator( true );
299
300 ReCreateMenuBar();
301
304
305 // Fetch a COPY of the config as a lot of these initializations are going to overwrite our
306 // data.
307 PCBNEW_SETTINGS::AUI_PANELS aui_cfg = GetPcbNewSettings()->m_AuiPanels;
308
309 m_propertiesPanel = new PCB_PROPERTIES_PANEL( this, this );
310 m_propertiesPanel->SetSplitterProportion( aui_cfg.properties_splitter );
311
312 m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this );
313
314 m_appearancePanel = new APPEARANCE_CONTROLS( this, GetCanvas() );
315 m_searchPane = new PCB_SEARCH_PANE( this );
316 m_netInspectorPanel = new PCB_NET_INSPECTOR_PANEL( this, this );
317 m_designBlocksPane = new PCB_DESIGN_BLOCK_PANE( this, nullptr, m_designBlockHistoryList );
318 m_constraintsPanel = new PANEL_CONSTRAINTS( this );
319
320 m_auimgr.SetManagedWindow( this );
321
322 CreateInfoBar();
323
324 // Secondary infobar stacked above the main one. Load-time notices (such as
325 // the WRL -> STEP migration prompt) belong here so they aren't clobbered by
326 // the main infobar's read-only warnings, DRC rule errors, etc.
327 m_loadNoticeInfoBar = new WX_INFOBAR( GetToolCanvas(), wxID_ANY, true );
328
329 unsigned int auiFlags = wxAUI_MGR_DEFAULT;
330#if !defined( _WIN32 )
331 // Windows cannot redraw the UI fast enough during a live resize and may lead to all kinds
332 // of graphical glitches.
333 auiFlags |= wxAUI_MGR_LIVE_RESIZE;
334#endif
335 m_auimgr.SetFlags( auiFlags );
336
337 // Rows; layers 4 - 6
338 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) )
339 .Top().Layer( 6 ) );
340 m_auimgr.AddPane( m_tbTopAux, EDA_PANE().HToolbar().Name( wxS( "TopAuxToolbar" ) )
341 .Top().Layer( 5 ) );
342 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) )
343 .Bottom().Layer( 6 ) );
344
345 // Columns; layers 1 - 3
346 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( wxS( "LeftToolbar" ) )
347 .Left().Layer( 3 ) );
348
349 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( wxS( "RightToolbar" ) )
350 .Right().Layer( 3 ) );
351
352 m_auimgr.AddPane( m_appearancePanel, EDA_PANE().Name( wxS( "LayersManager" ) )
353 .Right().Layer( 4 )
354 .Caption( _( "Appearance" ) ).PaneBorder( false )
355 // Don't use -1 for don't-change-height on a growable panel; it has side-effects.
356 .MinSize( m_appearancePanel->GetMinSize().x, FromDIP( 60 ) )
357#ifdef __WXMAC__
358 // Best size for this pane is calculated larger than necessary on wxMac
359 .BestSize( m_appearancePanel->GetMinSize().x, -1 )
360#else
361 .BestSize( m_appearancePanel->GetBestSize().x, -1 )
362#endif
363 .FloatingSize( m_appearancePanel->GetBestSize() )
364 .CloseButton( false ) );
365
366 m_auimgr.AddPane( m_selectionFilterPanel, EDA_PANE().Name( wxS( "SelectionFilter" ) )
367 .Right().Layer( 4 ).Position( 2 )
368 .Caption( _( "Selection Filter" ) ).PaneBorder( false )
369 // Fixed-size pane; -1 for MinSize height is required
370 .MinSize( m_selectionFilterPanel->GetMinSize().x, -1 )
371 .BestSize( m_selectionFilterPanel->GetBestSize().x, -1 )
372 .FloatingSize( m_selectionFilterPanel->GetBestSize() )
373 .CloseButton( false ) );
374
375 m_auimgr.AddPane( m_designBlocksPane, EDA_PANE().Name( DesignBlocksPaneName() )
376 .Right().Layer( 5 )
377 .Caption( _( "Design Blocks" ) )
378 .CaptionVisible( true )
379 .PaneBorder( true )
380 .TopDockable( false )
381 .BottomDockable( false )
382 .CloseButton( true )
383 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
384 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
385 .FloatingSize( FromDIP( wxSize( 800, 600 ) ) )
386 .FloatingPosition( FromDIP( wxPoint( 50, 200 ) ) )
387 .Show( true ) );
388
389 m_auimgr.AddPane( m_propertiesPanel, EDA_PANE().Name( PropertiesPaneName() )
390 .Left().Layer( 5 )
391 .Caption( _( "Properties" ) ).PaneBorder( false )
392 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
393 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
394 .FloatingSize( wxSize( 300, 200 ) )
395 .CloseButton( true ) );
396
397 // Center
398 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
399 .Center() );
400
401 m_auimgr.AddPane( m_netInspectorPanel, EDA_PANE().Name( NetInspectorPanelName() )
402 .Bottom()
403 .Caption( _( "Net Inspector" ) )
404 .PaneBorder( false )
405 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
406 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
407 .FloatingSize( wxSize( 300, 200 ) )
408 .CloseButton( true ) );
409
410 m_auimgr.AddPane( m_searchPane, EDA_PANE().Name( SearchPaneName() )
411 .Bottom()
412 .Caption( _( "Search" ) ).PaneBorder( false )
413 .MinSize( FromDIP( wxSize ( 180, 60 ) ) )
414 .BestSize( FromDIP( wxSize ( 180, 100 ) ) )
415 .FloatingSize( FromDIP( wxSize( 480, 200 ) ) )
416 .DestroyOnClose( false )
417 .CloseButton( true ) );
418
419 m_auimgr.AddPane( m_constraintsPanel, EDA_PANE().Name( ConstraintsPaneName() )
420 .Bottom().Layer( 1 )
421 .Caption( _( "Geometric Constraints" ) ).PaneBorder( false )
422 .MinSize( FromDIP( wxSize( 360, 120 ) ) )
423 .BestSize( FromDIP( wxSize( 600, 200 ) ) )
424 .FloatingSize( FromDIP( wxSize( 600, 240 ) ) )
425 .DestroyOnClose( false )
426 .CloseButton( true )
427 .Hide() );
428
429 RestoreAuiLayout();
430
431 m_auimgr.GetPane( "LayersManager" ).Show( m_ShowLayerManagerTools );
432 m_auimgr.GetPane( "SelectionFilter" ).Show( m_ShowLayerManagerTools );
433 m_auimgr.GetPane( PropertiesPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.show_properties );
434 m_auimgr.GetPane( NetInspectorPanelName() ).Show( m_ShowNetInspector );
435 m_auimgr.GetPane( SearchPaneName() ).Show( m_ShowSearch );
436 m_auimgr.GetPane( DesignBlocksPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.design_blocks_show );
437
438 // The selection filter doesn't need to grow in the vertical direction when docked
439 m_auimgr.GetPane( "SelectionFilter" ).dock_proportion = 0;
440 FinishAUIInitialization();
441
442 if( aui_cfg.right_panel_width > 0 )
443 {
444 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( wxS( "LayersManager" ) );
445 SetAuiPaneSize( m_auimgr, layersManager, aui_cfg.right_panel_width, -1 );
446
447 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
448 SetAuiPaneSize( m_auimgr, designBlocksPane, aui_cfg.design_blocks_panel_docked_width, -1 );
449 }
450
451 if( aui_cfg.properties_panel_width > 0 && m_propertiesPanel )
452 {
453 wxAuiPaneInfo& propertiesPanel = m_auimgr.GetPane( PropertiesPaneName() );
454 SetAuiPaneSize( m_auimgr, propertiesPanel, aui_cfg.properties_panel_width, -1 );
455 }
456
457 if( aui_cfg.search_panel_height > 0
458 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_TOP
459 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) )
460 {
461 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
462 searchPane.Direction( aui_cfg.search_panel_dock_direction );
463 SetAuiPaneSize( m_auimgr, searchPane, -1, aui_cfg.search_panel_height );
464 }
465 else if( aui_cfg.search_panel_width > 0
466 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_LEFT
467 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) )
468 {
469 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
470 searchPane.Direction( aui_cfg.search_panel_dock_direction );
471 SetAuiPaneSize( m_auimgr, searchPane, aui_cfg.search_panel_width, -1 );
472 }
473
474 m_appearancePanel->SetTabIndex( aui_cfg.appearance_panel_tab );
475
476 m_layerPairSettings = std::make_unique<LAYER_PAIR_SETTINGS>();
477
478 m_layerPairSettings->Bind( PCB_LAYER_PAIR_PRESETS_CHANGED,
479 [&]( wxCommandEvent& aEvt )
480 {
481 // Update the project file list
482 std::span<const LAYER_PAIR_INFO> newPairInfos = m_layerPairSettings->GetLayerPairs();
483 Prj().GetProjectFile().m_LayerPairInfos = std::vector<LAYER_PAIR_INFO>{ newPairInfos.begin(),
484 newPairInfos.end() };
485 } );
486
487 m_layerPairSettings->Bind( PCB_CURRENT_LAYER_PAIR_CHANGED,
488 [&]( wxCommandEvent& aEvt )
489 {
490 const LAYER_PAIR& layerPair = m_layerPairSettings->GetCurrentLayerPair();
491 PCB_SCREEN& screen = *GetScreen();
492
493 screen.m_Route_Layer_TOP = layerPair.GetLayerA();
494 screen.m_Route_Layer_BOTTOM = layerPair.GetLayerB();
495
496 // Update the toolbar icon
497 PrepareLayerIndicator();
498 } );
499
500 GetToolManager()->PostAction( ACTIONS::zoomFitScreen );
501
502 // This is used temporarily to fix a client size issue on GTK that causes zoom to fit
503 // to calculate the wrong zoom size. See PCB_EDIT_FRAME::onSize().
504 Bind( wxEVT_SIZE, &PCB_EDIT_FRAME::onSize, this );
505
506 Bind( wxEVT_IDLE,
507 [this]( wxIdleEvent& aEvent )
508 {
509 BOX2D viewport = GetCanvas()->GetView()->GetViewport();
510
511 if( viewport != m_lastNetnamesViewport )
512 {
513 redrawNetnames();
514 m_lastNetnamesViewport = viewport;
515 }
516
517 // Do not forget to pass the Idle event to other clients:
518 aEvent.Skip();
519 } );
520
521 setupUnits( config() );
522
523 // Ensure the DRC engine is initialized so that constraints can be resolved even before a
524 // board is loaded or saved
525 try
526 {
527 m_toolManager->GetTool<DRC_TOOL>()->GetDRCEngine()->InitEngine( wxFileName() );
528 }
529 catch( PARSE_ERROR& )
530 {
531 }
532
533 // Sync action plugins in case they changed since the last time the frame opened
534 GetToolManager()->RunAction( ACTIONS::pluginsReload );
535
536 m_apiHandler = std::make_unique<API_HANDLER_PCB>( this );
537 Pgm().GetApiServer().RegisterHandler( m_apiHandler.get() );
538
539 if( Kiface().IsSingle() )
540 {
541 m_apiHandlerCommon = std::make_unique<API_HANDLER_COMMON>();
542 Pgm().GetApiServer().RegisterHandler( m_apiHandlerCommon.get() );
543 m_apiLibrariesHandler = std::make_unique<API_HANDLER_LIBRARIES>( LIBRARY_TABLE_TYPE::DESIGN_BLOCK );
544 Pgm().GetApiServer().RegisterHandler( m_apiLibrariesHandler.get() );
545 }
546
547 resolveCanvasType();
548 ActivateGalCanvas();
549
550 // Default shutdown reason until a file is loaded
551 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New PCB file is unsaved" ) );
552
553 // disable Export STEP item if kicad2step does not exist
554 wxString strK2S = Pgm().GetExecutablePath();
555
556#ifdef __WXMAC__
557 if( strK2S.Find( wxT( "pcbnew.app" ) ) != wxNOT_FOUND )
558 {
559 // On macOS, we have standalone applications inside the main bundle, so we handle that here:
560 strK2S += wxT( "../../" );
561 }
562
563 strK2S += wxT( "Contents/MacOS/" );
564#endif
565
566 wxFileName appK2S( strK2S, wxT( "kicad2step" ) );
567
568#ifdef _WIN32
569 appK2S.SetExt( wxT( "exe" ) );
570#endif
571
572 // Ensure the window is on top
573 Raise();
574
575// if( !appK2S.FileExists() )
576 // GetMenuBar()->FindItem( ID_GEN_EXPORT_FILE_STEP )->Enable( false );
577
578 // AUI doesn't refresh properly on wxMac after changes in eb7dc6dd, so force it to
579#ifdef __WXMAC__
580 if( Kiface().IsSingle() )
581 {
582 CallAfter( [this]()
583 {
584 m_appearancePanel->OnBoardChanged();
585 } );
586 }
587#endif
588
589 // Register a call to update the toolbar sizes. It can't be done immediately because
590 // it seems to require some sizes calculated that aren't yet (at least on GTK).
591 CallAfter( [this]()
592 {
593 // Ensure the controls on the toolbars all are correctly sized
594 UpdateToolbarControlSizes();
595
596 // Update the angle snap mode toolbar button to reflect the current preference
597 GetToolManager()->RunAction( PCB_ACTIONS::angleSnapModeChanged );
598 } );
599
600 if( ADVANCED_CFG::GetCfg().m_ShowEventCounters )
601 {
602 m_eventCounterTimer = new wxTimer( this );
603
604 Bind( wxEVT_TIMER,
605 [&]( wxTimerEvent& aEvent )
606 {
607 GetCanvas()->m_PaintEventCounter->Show();
608 GetCanvas()->m_PaintEventCounter->Reset();
609
611 static_cast<KIGFX::WX_VIEW_CONTROLS*>( GetCanvas()->GetViewControls() );
614
615 },
616 m_eventCounterTimer->GetId() );
617
618 m_eventCounterTimer->Start( 1000 );
619 }
620
623 m_acceptedExts.emplace( wxS( "dxf" ), &PCB_ACTIONS::ddImportGraphics );
625 DragAcceptFiles( true );
626
627 Bind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs, this );
628 Bind( EDA_EVT_CLOSE_DIALOG_FOOTPRINT_FIELDS_TABLE, &PCB_EDIT_FRAME::onCloseFootprintFieldsTableDialog, this );
629}
630
631
632void PCB_EDIT_FRAME::StartCrossProbeFlash( const std::vector<BOARD_ITEM*>& aItems )
633{
634 if( !GetPcbNewSettings()->m_CrossProbing.flash_selection )
635 {
636 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): aborted (setting disabled) items=%zu",
637 aItems.size() );
638 return;
639 }
640
641 if( aItems.empty() )
642 {
643 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): aborted (no items)" );
644 return;
645 }
646
647 // Don't start flashing if any of the items are being moved. The flash timer toggles
648 // selection hide/show which corrupts the VIEW overlay state during an active move.
649 for( const BOARD_ITEM* item : aItems )
650 {
651 if( item->IsMoving() )
652 {
653 wxLogTrace( traceCrossProbeFlash,
654 "StartCrossProbeFlash(PCB): aborted (items are moving)" );
655 return;
656 }
657 }
658
660 {
661 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): restarting existing flash (phase=%d)",
664 }
665
666 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): starting with %zu items", aItems.size() );
667
668 // Store uuids
670 for( BOARD_ITEM* it : aItems )
671 m_crossProbeFlashItems.push_back( it->m_Uuid );
672
675
676 if( !m_crossProbeFlashTimer.GetOwner() )
677 m_crossProbeFlashTimer.SetOwner( this );
678
679 bool started = m_crossProbeFlashTimer.Start( 500, wxTIMER_CONTINUOUS ); // 0.5s intervals -> 3s total for 6 phases
680 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): timer start=%d id=%d",
681 (int) started, m_crossProbeFlashTimer.GetId() );
682}
683
684
685void PCB_EDIT_FRAME::OnCrossProbeFlashTimer( wxTimerEvent& aEvent )
686{
687 wxLogTrace( traceCrossProbeFlash, "Timer(PCB) fired: phase=%d running=%d items=%zu",
689
691 {
692 wxLogTrace( traceCrossProbeFlash, "Timer(PCB) fired but not flashing (ignored)" );
693 return;
694 }
695
697
698 if( !selTool )
699 return;
700
701 // Don't manipulate the selection while items are being moved. The move tool holds a
702 // live reference to the selection and toggling hide/show on selected items corrupts
703 // the VIEW overlay state, causing crashes.
704 for( const KIID& id : m_crossProbeFlashItems )
705 {
706 if( EDA_ITEM* item = GetBoard()->ResolveItem( id, true ) )
707 {
708 if( item->IsMoving() )
709 {
710 wxLogTrace( traceCrossProbeFlash, "Timer(PCB) phase=%d: items are moving, stopping flash",
712 m_crossProbeFlashing = false;
714 return;
715 }
716 }
717 }
718
719 // Prevent recursion / IPC during flashing
720 bool prevGuard = m_ProbingSchToPcb;
721 m_ProbingSchToPcb = true;
722
723 if( m_crossProbeFlashPhase % 2 == 0 )
724 {
725 // Hide selection
726 selTool->ClearSelection( true );
727 wxLogTrace( traceCrossProbeFlash, "Phase %d (PCB): cleared selection", m_crossProbeFlashPhase );
728 }
729 else
730 {
731 // Restore selection
732 for( const KIID& id : m_crossProbeFlashItems )
733 {
734 if( EDA_ITEM* item = GetBoard()->ResolveItem( id, true ) )
735 selTool->AddItemToSel( item, true );
736 }
737
738 wxLogTrace( traceCrossProbeFlash, "Phase %d (PCB): restored %zu items",
740 }
741
742 // Force a redraw even if the canvas / frame does not currently have focus (mouse elsewhere)
743 if( GetCanvas() )
744 {
746 wxLogTrace( traceCrossProbeFlash, "Phase %d (PCB): forced canvas refresh", m_crossProbeFlashPhase );
747 }
748
749 m_ProbingSchToPcb = prevGuard;
750
752
753 if( m_crossProbeFlashPhase > 6 )
754 {
755 // Ensure final state (selected)
756 for( const KIID& id : m_crossProbeFlashItems )
757 {
758 if( EDA_ITEM* item = GetBoard()->ResolveItem( id, true ) )
759 selTool->AddItemToSel( item, true );
760 }
761
762 m_crossProbeFlashing = false;
764
765 wxLogTrace( traceCrossProbeFlash, "Flashing complete (PCB). Final selection size=%zu",
766 m_crossProbeFlashItems.size() );
767 }
768}
769
770
772{
773 // Always ensure that we are unregistered even in a close without graceful doCloseWindow()
774 if( GetBoard() )
776
777 // PCB_BASE_FRAME's dtor deletes m_pcb; canvas children outlive it. Drop
778 // every cached TEXT_VAR_TRACKER* before the tracker is freed.
780
781 if( ADVANCED_CFG::GetCfg().m_ShowEventCounters )
782 {
783 // Stop the timer during destruction early to avoid potential event race conditions (that
784 // do happen on windows)
785 m_eventCounterTimer->Stop();
786 delete m_eventCounterTimer;
787 }
788
789 // Close modeless dialogs
790 wxWindow* drcDlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
791
792 if( drcDlg )
793 drcDlg->Close( true );
794
795 wxWindow* ruleEditorDlg = wxWindow::FindWindowByName( DIALOG_DRC_RULE_EDITOR_WINDOW_NAME );
796
797 if( ruleEditorDlg )
798 ruleEditorDlg->Close( true );
799
800 // Shutdown all running tools
801 if( m_toolManager )
802 m_toolManager->ShutdownAllTools();
803
804 if( GetBoard() )
806
807 // We passed ownership of these to wxAuiManager.
808 // delete m_selectionFilterPanel;
809 // delete m_appearancePanel;
810 // delete m_propertiesPanel;
811 // delete m_netInspectorPanel;
812
814}
815
816
818{
819 wxAuiPaneInfo& pane = m_auimgr.GetPane( ConstraintsPaneName() );
820
821 if( !pane.IsOk() )
822 return;
823
824 bool show = !pane.IsShown();
825 pane.Show( show );
826
827 if( show && m_constraintsPanel )
828 m_constraintsPanel->RefreshList();
829
830 m_auimgr.Update();
831}
832
833
835{
836 if( GetCanvas() )
837 {
838 if( DS_PROXY_VIEW_ITEM* sheet = GetCanvas()->GetDrawingSheet() )
839 sheet->AttachToTracker( nullptr );
840 }
841
843 {
844 m_textVarListenerTracker->RemoveInvalidateListener( m_textVarListenerHandle );
846 m_textVarListenerTracker = nullptr;
847 }
848}
849
850
851void PCB_EDIT_FRAME::SetBoard( BOARD* aBoard, bool aBuildConnectivity, PROGRESS_REPORTER* aReporter )
852{
853 // PCB_BASE_FRAME::SetBoard() deletes m_pcb; detach tracker consumers first.
854 if( m_pcb )
855 {
857 m_pcb->ClearProject();
859 }
860
861 PCB_BASE_EDIT_FRAME::SetBoard( aBoard, aReporter );
862
863 aBoard->SetProject( &Prj() );
864
865 if( aBuildConnectivity )
866 aBoard->BuildConnectivity();
867
868 // reload the drawing-sheet
869 SetPageSettings( aBoard->GetPageSettings() );
870
872}
873
874
879
880
881std::unique_ptr<GRID_HELPER> PCB_EDIT_FRAME::MakeGridHelper()
882{
883 return std::make_unique<PCB_GRID_HELPER>( m_toolManager, GetMagneticItemsSettings() );
884}
885
886
888{
889 /*
890 * While new items being scrolled into the view will get painted, they will only get
891 * annotated with netname instances currently within the view. Subsequent panning will not
892 * draw newly-visible netname instances because the item has already been drawn.
893 *
894 * This routine, fired on idle if the viewport has changed, looks for visible items that
895 * might have multiple netname instances and redraws them. (It does not need to handle pads
896 * and vias because they only ever have a single netname instance drawn on them.)
897 */
898 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() );
899
900 if( !cfg || cfg->m_Display.m_NetNames < 2 )
901 return;
902
903 KIGFX::VIEW* view = GetCanvas()->GetView();
904 BOX2D viewport = view->GetViewport();
905
906 view->SyncLayerVisibilityCache(); // Required for ViewGetLOD() calls.
907
908 // Inflate to catch most of the track width
909 BOX2I_MINMAX clipbox( BOX2ISafe( viewport.Inflate( pcbIUScale.mmToIU( 2.0 ) ) ) );
910
911 for( PCB_TRACK* track : GetBoard()->Tracks() )
912 {
913 // Don't need to update vias
914 if( track->Type() == PCB_VIA_T )
915 continue;
916
917 // Don't update invisible tracks
918 if( !clipbox.Intersects( BOX2I_MINMAX( track->GetStart(), track->GetEnd() ) ) )
919 continue;
920
921 if( track->ViewGetLOD( GetNetnameLayer( track->GetLayer() ), view ) < view->GetScale() )
922 view->Update( track, KIGFX::REPAINT );
923 }
924}
925
926
927void PCB_EDIT_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
928{
929 PCB_BASE_FRAME::SetPageSettings( aPageSettings );
930
931 // Prepare drawing-sheet template
933 &m_pcb->GetPageSettings(),
934 m_pcb->GetProject(),
935 &m_pcb->GetTitleBlock(),
936 &m_pcb->GetProperties() );
937
938 drawingSheet->SetSheetName( std::string( GetScreenDesc().mb_str() ) );
939 drawingSheet->SetSheetPath( std::string( GetFullScreenDesc().mb_str() ) );
940
941 // A board is not like a schematic having a main page and sub sheets.
942 // So for the drawing sheet, use only the first page option to display items
943 drawingSheet->SetIsFirstPage( true );
944
945 BASE_SCREEN* screen = GetScreen();
946
947 if( screen != nullptr )
948 {
949 drawingSheet->SetPageNumber(TO_UTF8( screen->GetPageNumber() ) );
950 drawingSheet->SetSheetCount( screen->GetPageCount() );
951 }
952
953 if( BOARD* board = GetBoard() )
954 {
955 drawingSheet->SetFileName( TO_UTF8( board->GetFileName() ) );
956 wxString currentVariant = board->GetCurrentVariant();
957 wxString variantDesc = board->GetVariantDescription( currentVariant );
958 drawingSheet->SetVariantName( TO_UTF8( currentVariant ) );
959 drawingSheet->SetVariantDesc( TO_UTF8( variantDesc ) );
960 }
961
962 // PCB_DRAW_PANEL_GAL takes ownership of the drawing-sheet
963 GetCanvas()->SetDrawingSheet( drawingSheet );
964
965 // Reactive title-block repaint: register the proxy with the BOARD's
966 // text-var tracker so source changes fan out to a repaint. The one-time
967 // listener installation is idempotent; calling AddInvalidateListener
968 // here each time would accumulate stale listeners across SetPageSettings
969 // calls, which is why the listener check below is guarded.
970 if( BOARD* board = GetBoard() )
971 {
972 if( BOARD_TEXT_VAR_ADAPTER* adapter = board->GetTextVarAdapter() )
973 {
974 TEXT_VAR_TRACKER* tracker = &adapter->Tracker();
975
976 drawingSheet->AttachToTracker( tracker );
977
978 // Project reload / board swap can point GetBoard() at a new
979 // tracker; detach from the previous one first so we don't leak
980 // a stale lambda that still captures `this`.
981 if( m_textVarListenerTracker != tracker
983 {
984 m_textVarListenerTracker->RemoveInvalidateListener( m_textVarListenerHandle );
986 m_textVarListenerTracker = nullptr;
987 }
988
990 {
991 KIGFX::VIEW* view = GetCanvas()->GetView();
992 m_textVarListenerTracker = tracker;
994 [this, view]( EDA_ITEM* aDep, const TEXT_VAR_REF_KEY& )
995 {
996 if( !aDep )
997 return;
998
1000
1001 if( aDep == current )
1002 {
1003 view->Update( current, KIGFX::REPAINT );
1004 return;
1005 }
1006
1007 if( aDep->IsBOARD_ITEM() )
1008 view->Update( aDep, KIGFX::REPAINT );
1009 } );
1010 }
1011 }
1012 }
1013}
1014
1015
1017{
1018 return GetScreen() && GetScreen()->IsContentModified();
1019}
1020
1021
1023{
1024 return m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
1025}
1026
1027
1029{
1030 // Create the manager and dispatcher & route draw panel events to the dispatcher
1032 m_toolManager->SetEnvironment( m_pcb, GetCanvas()->GetView(),
1033 GetCanvas()->GetViewControls(), config(), this );
1034 m_actions = new PCB_ACTIONS();
1036
1037 // Register tools
1038 m_toolManager->RegisterTool( new COMMON_CONTROL );
1039 m_toolManager->RegisterTool( new COMMON_TOOLS );
1040 m_toolManager->RegisterTool( new PCB_SELECTION_TOOL );
1041 m_toolManager->RegisterTool( new ZOOM_TOOL );
1042 m_toolManager->RegisterTool( new PCB_PICKER_TOOL );
1043 m_toolManager->RegisterTool( new ROUTER_TOOL );
1044 m_toolManager->RegisterTool( new EDIT_TOOL );
1045 m_toolManager->RegisterTool( new PCB_EDIT_TABLE_TOOL );
1046 m_toolManager->RegisterTool( new GLOBAL_EDIT_TOOL );
1047 m_toolManager->RegisterTool( new PAD_TOOL );
1048 m_toolManager->RegisterTool( new DRAWING_TOOL );
1049 m_toolManager->RegisterTool( new PCB_POINT_EDITOR );
1050 m_toolManager->RegisterTool( new PCB_CONTROL );
1051 m_toolManager->RegisterTool( new PCB_DESIGN_BLOCK_CONTROL );
1052 m_toolManager->RegisterTool( new BOARD_EDITOR_CONTROL );
1053 m_toolManager->RegisterTool( new BOARD_INSPECTION_TOOL );
1054 m_toolManager->RegisterTool( new BOARD_REANNOTATE_TOOL );
1055 m_toolManager->RegisterTool( new ALIGN_DISTRIBUTE_TOOL );
1056 m_toolManager->RegisterTool( new MICROWAVE_TOOL );
1057 m_toolManager->RegisterTool( new POSITION_RELATIVE_TOOL );
1058 m_toolManager->RegisterTool( new ARRAY_TOOL );
1059 m_toolManager->RegisterTool( new ZONE_FILLER_TOOL );
1060 m_toolManager->RegisterTool( new AUTOPLACE_TOOL );
1061 m_toolManager->RegisterTool( new DRC_TOOL );
1062 m_toolManager->RegisterTool( new PCB_VIEWER_TOOLS );
1063 m_toolManager->RegisterTool( new CONVERT_TOOL );
1064 m_toolManager->RegisterTool( new PCB_GROUP_TOOL );
1065 m_toolManager->RegisterTool( new CONSTRAINT_EDIT_TOOL );
1066 m_toolManager->RegisterTool( new GENERATOR_TOOL );
1067 m_toolManager->RegisterTool( new VIA_STITCH_TOOL );
1068 m_toolManager->RegisterTool( new PROPERTIES_TOOL );
1069 m_toolManager->RegisterTool( new MULTICHANNEL_TOOL );
1070 m_toolManager->RegisterTool( new MATCH_PROPERTIES_TOOL );
1071 m_toolManager->RegisterTool( new GRAPHIC_EDIT_TOOL );
1072 m_toolManager->RegisterTool( new EMBED_TOOL );
1073 m_toolManager->RegisterTool( new DRC_RULE_EDITOR_TOOL );
1074 m_toolManager->RegisterTool( new DIFF_PHASE_SKEW_TOOL );
1075 m_toolManager->InitTools();
1076
1077 for( TOOL_BASE* tool : m_toolManager->Tools() )
1078 {
1079 if( PCB_TOOL_BASE* pcbTool = dynamic_cast<PCB_TOOL_BASE*>( tool ) )
1080 pcbTool->SetIsBoardEditor( true );
1081 }
1082
1083 // Run the selection tool, it is supposed to be always active
1084 m_toolManager->InvokeTool( "common.InteractiveSelection" );
1085}
1086
1087
1089{
1091
1092 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
1093 PCB_EDITOR_CONDITIONS cond( this );
1094
1095 auto undoCond =
1096 [ this ] (const SELECTION& aSel )
1097 {
1098 DRAWING_TOOL* drawingTool = m_toolManager->GetTool<DRAWING_TOOL>();
1099
1100 if( drawingTool && drawingTool->GetDrawingMode() != DRAWING_TOOL::MODE::NONE )
1101 return true;
1102
1103 ROUTER_TOOL* routerTool = m_toolManager->GetTool<ROUTER_TOOL>();
1104
1105 if( routerTool && routerTool->RoutingInProgress() )
1106 return true;
1107
1108 return GetUndoCommandCount() > 0;
1109 };
1110
1111 auto groupWithDesignBlockLink =
1112 [] ( const SELECTION& aSel )
1113 {
1114 if( aSel.Size() != 1 )
1115 return false;
1116
1117 if( aSel[0]->Type() != PCB_GROUP_T )
1118 return false;
1119
1120 PCB_GROUP* group = static_cast<PCB_GROUP*>( aSel.GetItem( 0 ) );
1121
1122 return group->HasDesignBlockLink();
1123 };
1124
1125 wxASSERT( mgr );
1126
1127#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
1128#define CHECK( x ) ACTION_CONDITIONS().Check( x )
1129// clang-format off
1130
1132 mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) );
1134
1138
1139 mgr->SetConditions( ACTIONS::cut, ENABLE( cond.HasItems() ) );
1140 mgr->SetConditions( ACTIONS::copy, ENABLE( cond.HasItems() ) );
1147
1148 // Keep immediate-mode dispatch alive while a tool is mid-edit on an empty board, where
1149 // HasItems() is still false but an item is under construction under the cursor.
1150 auto hasElements =
1151 [ this ] ( const SELECTION& aSel )
1152 {
1153 return GetBoard() &&
1154 ( !GetBoard()->IsEmpty() || !SELECTION_CONDITIONS::Idle( aSel ) );
1155 };
1156
1158 ENABLE( SELECTION_CONDITIONS::NotEmpty ).HotkeyEnable( hasElements ) );
1160 ENABLE( SELECTION_CONDITIONS::NotEmpty ).HotkeyEnable( hasElements ) );
1162 ENABLE( SELECTION_CONDITIONS::NotEmpty ).HotkeyEnable( hasElements ) );
1164 ENABLE( SELECTION_CONDITIONS::NotEmpty ).HotkeyEnable( hasElements ) );
1165
1166 static const std::vector<KICAD_T> groupTypes = { PCB_GROUP_T, PCB_GENERATOR_T };
1167
1172
1173 mgr->SetConditions( PCB_ACTIONS::placeLinkedDesignBlock, ENABLE( groupWithDesignBlockLink) );
1174 mgr->SetConditions( PCB_ACTIONS::saveToLinkedDesignBlock, ENABLE( groupWithDesignBlockLink) );
1175
1181
1182 auto enableZoneControlCondition =
1183 [this] ( const SELECTION& )
1184 {
1187 };
1188
1190 ENABLE( enableZoneControlCondition )
1193 ENABLE( enableZoneControlCondition )
1196 ENABLE( enableZoneControlCondition )
1199 ENABLE( enableZoneControlCondition )
1201
1203
1204 auto autoConstraintsCond =
1205 []( const SELECTION& )
1206 {
1208 return cfg && cfg->m_AutoConstraints;
1209 };
1210
1211 mgr->SetConditions( PCB_ACTIONS::toggleAutoConstraints, CHECK( autoConstraintsCond ) );
1212
1213 auto boardFlippedCond =
1214 [this]( const SELECTION& )
1215 {
1217 };
1218
1219 auto layerManagerCond =
1220 [this] ( const SELECTION& )
1221 {
1222 return LayerManagerShown();
1223 };
1224
1225 auto propertiesCond =
1226 [this] ( const SELECTION& )
1227 {
1228 return PropertiesShown();
1229 };
1230
1231 auto netInspectorCond =
1232 [this] ( const SELECTION& )
1233 {
1234 return NetInspectorShown();
1235 };
1236
1237 auto searchPaneCond =
1238 [this] ( const SELECTION& )
1239 {
1240 return m_auimgr.GetPane( SearchPaneName() ).IsShown();
1241 };
1242
1243 auto constraintsPaneCond =
1244 [this] ( const SELECTION& )
1245 {
1246 return m_auimgr.GetPane( ConstraintsPaneName() ).IsShown();
1247 };
1248
1249 auto designBlockCond =
1250 [ this ] (const SELECTION& aSel )
1251 {
1252 return m_auimgr.GetPane( DesignBlocksPaneName() ).IsShown();
1253 };
1254
1255 auto highContrastCond =
1256 [this] ( const SELECTION& )
1257 {
1259 };
1260
1261 auto globalRatsnestCond =
1262 [this] (const SELECTION& )
1263 {
1265 return cfg && cfg->m_Display.m_ShowGlobalRatsnest;
1266 };
1267
1268 auto curvedRatsnestCond =
1269 [this] (const SELECTION& )
1270 {
1272 return cfg && cfg->m_Display.m_DisplayRatsnestLinesCurved;
1273 };
1274
1275 auto netHighlightCond =
1276 [this]( const SELECTION& )
1277 {
1278 if( PCB_DRAW_PANEL_GAL* canvas = GetCanvas() )
1279 {
1280 if( KIGFX::PCB_VIEW* view = canvas->GetView() )
1281 {
1282 if( KIGFX::PAINTER* painter = view->GetPainter() )
1283 {
1284 if( RENDER_SETTINGS* settings = painter->GetSettings() )
1285 return !settings->GetHighlightNetCodes().empty();
1286 }
1287 }
1288 }
1289
1290 return false;
1291 };
1292
1293 auto enableNetHighlightCond =
1294 [this]( const SELECTION& )
1295 {
1297 return tool && tool->IsNetHighlightSet();
1298 };
1299
1300 mgr->SetConditions( ACTIONS::highContrastMode, CHECK( highContrastCond ) );
1301 mgr->SetConditions( PCB_ACTIONS::flipBoard, CHECK( boardFlippedCond ) );
1302 mgr->SetConditions( PCB_ACTIONS::showLayersManager, CHECK( layerManagerCond ) );
1303 mgr->SetConditions( PCB_ACTIONS::showRatsnest, CHECK( globalRatsnestCond ) );
1304 mgr->SetConditions( PCB_ACTIONS::ratsnestLineMode, CHECK( curvedRatsnestCond ) );
1305 mgr->SetConditions( PCB_ACTIONS::toggleNetHighlight, CHECK( netHighlightCond )
1306 .Enable( enableNetHighlightCond ) );
1307 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
1308 mgr->SetConditions( PCB_ACTIONS::showNetInspector, CHECK( netInspectorCond ) );
1309 mgr->SetConditions( PCB_ACTIONS::showSearch, CHECK( searchPaneCond ) );
1310 mgr->SetConditions( PCB_ACTIONS::showConstraintsPanel, CHECK( constraintsPaneCond ) );
1311 mgr->SetConditions( PCB_ACTIONS::showDesignBlockPanel, CHECK( designBlockCond ) );
1312
1315
1316 const auto isArcKeepCenterMode =
1317 [this]( const SELECTION& )
1318 {
1321 };
1322
1323 const auto isArcKeepEndpointMode =
1324 [this]( const SELECTION& )
1325 {
1328 };
1329
1330 const auto isArcKeepRadiusMode =
1331 [this]( const SELECTION& )
1332 {
1335 };
1336
1337 mgr->SetConditions( ACTIONS::pointEditorArcKeepCenter, CHECK( isArcKeepCenterMode ) );
1338 mgr->SetConditions( ACTIONS::pointEditorArcKeepEndpoint, CHECK( isArcKeepEndpointMode ) );
1339 mgr->SetConditions( ACTIONS::pointEditorArcKeepRadius, CHECK( isArcKeepRadiusMode ) );
1340
1341 auto isHighlightMode =
1342 [this]( const SELECTION& )
1343 {
1344 ROUTER_TOOL* tool = m_toolManager->GetTool<ROUTER_TOOL>();
1345 return tool && tool->GetRouterMode() == PNS::RM_MarkObstacles;
1346 };
1347
1348 auto isShoveMode =
1349 [this]( const SELECTION& )
1350 {
1351 ROUTER_TOOL* tool = m_toolManager->GetTool<ROUTER_TOOL>();
1352 return tool && tool->GetRouterMode() == PNS::RM_Shove;
1353 };
1354
1355 auto isWalkaroundMode =
1356 [this]( const SELECTION& )
1357 {
1358 ROUTER_TOOL* tool = m_toolManager->GetTool<ROUTER_TOOL>();
1359 return tool && tool->GetRouterMode() == PNS::RM_Walkaround;
1360 };
1361
1362 mgr->SetConditions( PCB_ACTIONS::routerHighlightMode, CHECK( isHighlightMode ) );
1363 mgr->SetConditions( PCB_ACTIONS::routerShoveMode, CHECK( isShoveMode ) );
1364 mgr->SetConditions( PCB_ACTIONS::routerWalkaroundMode, CHECK( isWalkaroundMode ) );
1365
1366 auto isAutoTrackWidth =
1367 [this]( const SELECTION& )
1368 {
1370 };
1371
1372 mgr->SetConditions( PCB_ACTIONS::autoTrackWidth, CHECK( isAutoTrackWidth ) );
1373
1374 auto haveNetCond =
1375 [] ( const SELECTION& aSel )
1376 {
1377 for( EDA_ITEM* item : aSel )
1378 {
1379 if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
1380 {
1381 if( bci->GetNetCode() > 0 )
1382 return true;
1383 }
1384 }
1385
1386 return false;
1387 };
1388
1389 auto connectedOrFootprintCond =
1390 [] ( const SELECTION& aSel )
1391 {
1392 if( aSel.Empty() )
1393 return false;
1394
1395 for( EDA_ITEM* item : aSel )
1396 {
1397 if( item->Type() == PCB_FOOTPRINT_T )
1398 continue;
1399
1400 if( !dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
1401 return false;
1402 }
1403
1404 return true;
1405 };
1406
1407 mgr->SetConditions( PCB_ACTIONS::showNetInRatsnest, ENABLE( haveNetCond ) );
1408 mgr->SetConditions( PCB_ACTIONS::hideNetInRatsnest, ENABLE( haveNetCond ) );
1411
1412 static const std::vector<KICAD_T> trackTypes = { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T };
1413 static const std::vector<KICAD_T> padOwnerTypes = { PCB_FOOTPRINT_T, PCB_PAD_T };
1414 static const std::vector<KICAD_T> footprintTypes = { PCB_FOOTPRINT_T };
1415 static const std::vector<KICAD_T> crossProbeTypes = { PCB_PAD_T, PCB_FOOTPRINT_T, PCB_GROUP_T };
1416 static const std::vector<KICAD_T> zoneTypes = { PCB_ZONE_T };
1417
1421 mgr->SetConditions( PCB_ACTIONS::grabUnconnected, ENABLE( connectedOrFootprintCond ) );
1424
1425
1427 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1428
1430 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1431
1432 mgr->SetConditions( PCB_ACTIONS::zoneDuplicate, ENABLE( singleZoneCond ) );
1433 mgr->SetConditions( PCB_ACTIONS::drawZoneCutout, ENABLE( singleZoneCond ) );
1434 mgr->SetConditions( PCB_ACTIONS::drawSimilarZone, ENABLE( singleZoneCond ) );
1435 mgr->SetConditions( PCB_ACTIONS::zoneMerge, ENABLE( zoneMergeCond ) );
1436
1439
1440#define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
1441
1442 // These tools can be used at any time to inspect the board
1447
1448 auto isDRCIdle =
1449 [this] ( const SELECTION& )
1450 {
1451 DRC_TOOL* tool = m_toolManager->GetTool<DRC_TOOL>();
1452 return !( tool && tool->IsDRCRunning() );
1453 };
1454
1455#define CURRENT_EDIT_TOOL( action ) \
1456 mgr->SetConditions( action, ACTION_CONDITIONS().Check( cond.CurrentTool( action ) ) \
1457 .Enable( isDRCIdle ) )
1458
1459 // These tools edit the board, so they must be disabled during some operations
1496
1515
1521
1522#undef CURRENT_TOOL
1523#undef CURRENT_EDIT_TOOL
1524#undef ENABLE
1525#undef CHECK
1526// clang-format on
1527}
1528
1529
1530void PCB_EDIT_FRAME::OnQuit( wxCommandEvent& event )
1531{
1532 if( event.GetId() == wxID_EXIT )
1533 Kiway().OnKiCadExit();
1534
1535 if( event.GetId() == wxID_CLOSE || Kiface().IsSingle() )
1536 Close( false );
1537}
1538
1539
1540void PCB_EDIT_FRAME::ResolveDRCExclusions( bool aCreateMarkers )
1541{
1542 BOARD_COMMIT commit( this );
1543
1544 for( PCB_MARKER* marker : GetBoard()->ResolveDRCExclusions( aCreateMarkers ) )
1545 {
1546 if( marker->GetMarkerType() == MARKER_BASE::MARKER_DRAWING_SHEET )
1547 marker->GetRCItem()->SetItems( GetCanvas()->GetDrawingSheet() );
1548
1549 commit.Add( marker );
1550 }
1551
1552 commit.Push( wxEmptyString, SKIP_UNDO | SKIP_SET_DIRTY );
1553
1554 for( PCB_MARKER* marker : GetBoard()->Markers() )
1555 {
1556 if( marker->GetSeverity() == RPT_SEVERITY_EXCLUSION )
1557 GetCanvas()->GetView()->Update( marker );
1558 }
1559
1561}
1562
1563
1564bool PCB_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
1565{
1566 // Shutdown blocks must be determined and vetoed as early as possible
1567 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
1568 && IsContentModified() )
1569 {
1570 return false;
1571 }
1572
1573 ZONE_FILLER_TOOL* zoneFillerTool = m_toolManager->GetTool<ZONE_FILLER_TOOL>();
1574
1575 if( zoneFillerTool->IsBusy() )
1576 {
1577 wxBell();
1578
1579 if( wxWindow* reporter = dynamic_cast<wxWindow*>( zoneFillerTool->GetProgressReporter() ) )
1580 reporter->ShowWithEffect( wxSHOW_EFFECT_EXPAND );
1581
1582 return false;
1583 }
1584
1585 // Don't allow closing while the modal footprint chooser is open
1586 // Use C-style cast due to Mac's inability to dynamic cast between compile modules
1588
1589 if( chooser && chooser->IsModal() ) // Can close footprint chooser?
1590 return false;
1591
1592 if( Kiface().IsSingle() )
1593 {
1594 // Use C-style cast due to Mac's inability to dynamic cast between compile modules
1596
1597 if( fpEditor )
1598 {
1599 bool cancel = !fpEditor->Close(); // Can close footprint editor?
1600
1601 // If fp editor had unsaved changes it will have been fronted. Bring board editor back to front.
1602 Raise();
1603
1604 if( cancel )
1605 return false;
1606 }
1607
1608 // Use C-style cast due to Mac's inability to dynamic cast between compile modules
1610
1611 if( fpViewer && !fpViewer->Close() ) // Can close footprint viewer?
1612 return false;
1613 }
1614 else
1615 {
1616 // Use C-style cast due to Mac's inability to dynamic cast between compile modules
1618
1619 if( fpEditor )
1620 {
1621 bool cancel = !fpEditor->HandleUnsavedChanges( true );
1622
1623 // If fp editor had unsaved changes it will have been fronted. Bring board editor back to front.
1624 Raise();
1625
1626 if( cancel )
1627 return false;
1628 }
1629 }
1630
1632 return false;
1633
1634 if( IsContentModified() )
1635 {
1636 wxFileName fileName = GetBoard()->GetFileName();
1637 wxString msg = _( "Save changes to '%s' before closing?" );
1638
1639 wxSafeYield( this, true ); // Allow frame to come to front before showing "Save Changes?"
1640
1641 if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
1642 [&]() -> bool
1643 {
1644 return SaveBoard();
1645 } ) )
1646 {
1647 return false;
1648 }
1649
1650 // If user discarded changes, create a duplicate commit of last saved PCB state and
1651 // advance Last_Save_pcb tag for explicit history event.
1652 if( GetLastUnsavedChangesResponse() == wxID_NO )
1653 {
1654 wxString projPath = Prj().GetProjectPath();
1655
1656 if( !projPath.IsEmpty() && Kiway().LocalHistory().HistoryExists( projPath ) )
1657 {
1658 Kiway().LocalHistory().CommitDuplicateOfLastSave( projPath, wxS( "pcb" ),
1659 wxS( "Discard unsaved pcb changes" ) );
1660 }
1661 }
1662 }
1663
1664 return PCB_BASE_EDIT_FRAME::canCloseWindow( aEvent );
1665}
1666
1667
1669{
1670 // Unregister the autosave saver before any cleanup that might invalidate the board
1671 if( GetBoard() )
1673
1674 // On Windows 7 / 32 bits, on OpenGL mode only, Pcbnew crashes
1675 // when closing this frame if a footprint was selected, and the footprint editor called
1676 // to edit this footprint, and when closing pcbnew if this footprint is still selected
1677 // See https://bugs.launchpad.net/kicad/+bug/1655858
1678 // I think this is certainly a OpenGL event fired after frame deletion, so this workaround
1679 // avoid the crash (JPC)
1680 GetCanvas()->SetEvtHandlerEnabled( false );
1681
1683
1686
1687 // Clean up mode-less dialogs.
1688 Unbind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs, this );
1689 Unbind( EDA_EVT_CLOSE_DIALOG_FOOTPRINT_FIELDS_TABLE, &PCB_EDIT_FRAME::onCloseFootprintFieldsTableDialog, this );
1690
1691 wxWindow* drcDlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
1692
1693 if( drcDlg )
1694 drcDlg->Close( true );
1695
1696 wxWindow* ruleEditorDlg = wxWindow::FindWindowByName( DIALOG_DRC_RULE_EDITOR_WINDOW_NAME );
1697
1698 if( ruleEditorDlg )
1699 ruleEditorDlg->Close( true );
1700
1701 if( m_findDialog )
1702 {
1703 m_findDialog->Destroy();
1704 m_findDialog = nullptr;
1705 }
1706
1708 {
1709 m_findByPropertiesDialog->Destroy();
1710 m_findByPropertiesDialog = nullptr;
1711 }
1712
1714 {
1715 m_inspectDrcErrorDlg->Destroy();
1716 m_inspectDrcErrorDlg = nullptr;
1717 }
1718
1720 {
1721 m_inspectClearanceDlg->Destroy();
1722 m_inspectClearanceDlg = nullptr;
1723 }
1724
1726 {
1727 m_inspectConstraintsDlg->Destroy();
1728 m_inspectConstraintsDlg = nullptr;
1729 }
1730
1731 if( m_footprintDiffDlg )
1732 {
1733 m_footprintDiffDlg->Destroy();
1734 m_footprintDiffDlg = nullptr;
1735 }
1736
1738 {
1741 }
1742
1743 // Delete the auto save file if it exists. Only sweep when the board was actually dirtied in this session;
1744 // otherwise an existing autosave is a previous-session leftover the user explicitly deferred in the recovery
1745 // dialog.
1746 if( !Prj().IsNullProject() && GetBoard() && IsContentModified() )
1747 {
1748 Kiway().LocalHistory().RemoveAutosaveFiles( Prj().GetProjectPath(), { GetBoard()->GetFileName() } );
1749 }
1750
1751 // Make sure local settings are persisted
1752 if( Prj().GetLocalSettings().ShouldAutoSave() )
1753 {
1754 m_netInspectorPanel->SaveSettings();
1756 }
1757 else
1758 {
1759 wxLogTrace( traceAutoSave, wxT( "Skipping auto-save of migrated local settings" ) );
1760 }
1761
1762 // Do not show the layer manager during closing to avoid flicker on some platforms (Windows) that
1763 // generate useless redraw of items in the Layer Manager
1765 {
1766 m_auimgr.GetPane( wxS( "LayersManager" ) ).Show( false );
1767 m_auimgr.GetPane( wxS( "TabbedPanel" ) ).Show( false );
1768 }
1769
1770 // Unlink the old project if needed
1772
1773 // Delete board structs and undo/redo lists, to avoid crash on exit when deleting some structs
1774 // (mainly in undo/redo lists) too late
1775 Clear_Pcb( false, true );
1776
1777 // do not show the window because ScreenPcb will be deleted and we do not want any paint event
1778 Show( false );
1779
1781}
1782
1783
1790
1791
1793{
1794 BOARD* board = GetBoard();
1795 KIGFX::VIEW* view = GetCanvas()->GetView();
1796
1797 board->RefreshDrillSymbolLayers();
1798
1799 for( PCB_TRACK* track : board->Tracks() )
1800 {
1801 if( track->Type() == PCB_VIA_T )
1802 view->Update( track, aUpdateFlags );
1803 }
1804
1805 for( FOOTPRINT* footprint : board->Footprints() )
1806 {
1807 for( PAD* pad : footprint->Pads() )
1808 {
1809 if( pad->HasHole() )
1810 view->Update( pad, aUpdateFlags );
1811 }
1812 }
1813
1814 GetCanvas()->Refresh();
1815}
1816
1817
1818void PCB_EDIT_FRAME::ShowBoardSetupDialog( const wxString& aInitialPage, wxWindow* aParent )
1819{
1820 static std::mutex dialogMutex; // Local static mutex
1821
1822 std::unique_lock<std::mutex> dialogLock( dialogMutex, std::try_to_lock );
1823
1824 // One dialog at a time.
1825 if( !dialogLock.owns_lock() )
1826 {
1827 if( m_boardSetupDlg && m_boardSetupDlg->IsShown() )
1828 {
1829 m_boardSetupDlg->Raise(); // Brings the existing dialog to the front
1830 }
1831
1832 return;
1833 }
1834
1835 // Make sure everything's up-to-date
1837
1838 DIALOG_BOARD_SETUP dlg( this, aParent );
1839
1840 if( !aInitialPage.IsEmpty() )
1841 dlg.SetInitialPage( aInitialPage, wxEmptyString );
1842
1843 // Assign dlg to the m_boardSetupDlg pointer to track its status.
1844 m_boardSetupDlg = &dlg;
1845
1846 // QuasiModal required for Scintilla auto-complete
1847 if( dlg.ShowQuasiModal() == wxID_OK )
1848 {
1849 // Note: We must synchronise time domain properties before nets and classes, otherwise the updates
1850 // called by the board listener events are using stale data
1853
1854 if( !GetBoard()->SynchronizeComponentClasses( std::unordered_set<wxString>() ) )
1855 {
1856 m_infoBar->RemoveAllButtons();
1857 m_infoBar->AddCloseButton();
1858 m_infoBar->ShowMessage( _( "Could not load component class assignment rules" ), wxICON_WARNING,
1859 WX_INFOBAR::MESSAGE_TYPE::GENERIC );
1860 }
1861
1862 // We don't know if anything was modified, so err on the side of requiring a save
1863 OnModify();
1864
1866
1869
1870 // CROSS_REF keys deliberately excluded — those are driven by per-item
1871 // BOARD_COMMIT changes.
1872 if( BOARD_TEXT_VAR_ADAPTER* adapter = GetBoard()->GetTextVarAdapter() )
1873 adapter->Tracker().InvalidateProjectScoped();
1874
1875 PCBNEW_SETTINGS* settings = GetPcbNewSettings();
1876 static LSET maskAndPasteLayers = LSET( { F_Mask, F_Paste, B_Mask, B_Paste } );
1877
1879 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1880 {
1881 int flags = 0;
1882
1883 if( !aItem->IsBOARD_ITEM() )
1884 return flags;
1885
1886 BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
1887
1888 if( item->Type() == PCB_VIA_T || item->Type() == PCB_PAD_T )
1889 {
1890 // Note: KIGFX::REPAINT isn't enough for things that go from invisible
1891 // to visible as they won't be found in the view layer's itemset for
1892 // re-painting.
1893 if( ( GetBoard()->GetVisibleLayers() & maskAndPasteLayers ).any() )
1894 flags |= KIGFX::ALL;
1895 }
1896
1897 if( item->Type() == PCB_TRACE_T || item->Type() == PCB_ARC_T || item->Type() == PCB_VIA_T )
1898 {
1900 flags |= KIGFX::REPAINT;
1901 }
1902
1903 if( item->Type() == PCB_PAD_T )
1904 {
1905 if( settings->m_Display.m_PadClearance )
1906 flags |= KIGFX::REPAINT;
1907 }
1908
1909 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1910 {
1911 if( text->HasTextVars() )
1912 {
1913 text->ClearRenderCache();
1914 text->ClearBoundingBoxCache();
1916 }
1917 }
1918
1919 return flags;
1920 } );
1921
1922 GetCanvas()->Refresh();
1923
1927
1928 //this event causes the routing tool to reload its design rules information
1930 toolEvent.SetHasPosition( false );
1931 m_toolManager->ProcessEvent( toolEvent );
1932 }
1933
1934 GetCanvas()->SetFocus();
1935
1936 // Reset m_boardSetupDlg after the dialog is closed
1937 m_boardSetupDlg = nullptr;
1938}
1939
1940
1942{
1943 m_searchPane->FocusSearch();
1944}
1945
1946
1948{
1950
1951 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
1952 wxASSERT( cfg );
1953
1954 if( cfg )
1955 {
1959 }
1960}
1961
1962
1964{
1966
1967 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
1968 wxASSERT( cfg );
1969
1970 if( cfg )
1971 {
1972 wxAuiPaneInfo& apperancePane = m_auimgr.GetPane( AppearancePanelName() );
1973 cfg->m_AuiPanels.show_layer_manager = apperancePane.IsShown();
1974
1975 if( m_propertiesPanel )
1976 {
1977 cfg->m_AuiPanels.show_properties = m_propertiesPanel->IsShownOnScreen();
1979 cfg->m_AuiPanels.properties_splitter = m_propertiesPanel->SplitterProportion();
1980 }
1981
1982 // ensure m_ShowSearch is up to date (the pane can be closed)
1983 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
1984 m_ShowSearch = searchPaneInfo.IsShown();
1986 cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
1987 cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
1988 cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
1989
1991 {
1992 wxAuiPaneInfo& netInspectorhPaneInfo = m_auimgr.GetPane( NetInspectorPanelName() );
1993 m_ShowNetInspector = netInspectorhPaneInfo.IsShown();
1995 }
1996
1997 if( m_appearancePanel )
1998 {
2001 cfg->m_AuiPanels.appearance_expand_layer_display = m_appearancePanel->IsLayerOptionsExpanded();
2002 cfg->m_AuiPanels.appearance_expand_net_display = m_appearancePanel->IsNetOptionsExpanded();
2003 }
2004
2005 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
2006 cfg->m_AuiPanels.design_blocks_show = designBlocksPane.IsShown();
2007
2008 if( designBlocksPane.IsDocked() )
2009 {
2011 }
2012 else
2013 {
2014 cfg->m_AuiPanels.design_blocks_panel_float_height = designBlocksPane.floating_size.y;
2015 cfg->m_AuiPanels.design_blocks_panel_float_width = designBlocksPane.floating_size.x;
2016 }
2017
2018 m_designBlocksPane->SaveSettings();
2019 }
2020}
2021
2022
2024{
2025 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( config() );
2026
2027 return cfg ? cfg->m_RotationAngle : ANGLE_90;
2028}
2029
2030
2035
2036
2038{
2039
2040 GetColorSettings()->SetColor( LAYER_GRID, aColor );
2041 GetCanvas()->GetGAL()->SetGridColor( aColor );
2042}
2043
2044
2045void PCB_EDIT_FRAME::SetActiveLayer( PCB_LAYER_ID aLayer, bool aForceRedraw )
2046{
2047 const PCB_LAYER_ID oldLayer = GetActiveLayer();
2048
2049 if( oldLayer == aLayer && !aForceRedraw )
2050 return;
2051
2053
2054 m_appearancePanel->OnLayerChanged();
2055
2056 m_toolManager->PostAction( PCB_ACTIONS::layerChanged ); // notify other tools
2057 GetCanvas()->SetFocus(); // allow capture of hotkeys
2058 GetCanvas()->SetHighContrastLayer( aLayer );
2059
2060 /*
2061 * Only show pad, via and track clearances when a copper layer is active
2062 * and then only show the clearance layer for that copper layer. For
2063 * front/back non-copper layers, show the clearance layer for the outer
2064 * layer on that side.
2065 *
2066 * For pads/vias, this is to avoid clutter when there are pad/via layers
2067 * that vary in flash (i.e. clearance from the hole or pad edge), padstack
2068 * shape on each layer or clearances on each layer.
2069 *
2070 * For tracks, this follows the same logic as pads/vias, but in theory could
2071 * have their own set of independent clearance layers to allow track clearance
2072 * to be shown for more layers.
2073 */
2074 const auto getClearanceLayerForActive =
2075 []( PCB_LAYER_ID aActiveLayer ) -> std::optional<int>
2076 {
2077 if( IsCopperLayer( aActiveLayer ) )
2078 return CLEARANCE_LAYER_FOR( aActiveLayer );
2079
2080 return std::nullopt;
2081 };
2082
2083 if( std::optional<int> oldClearanceLayer = getClearanceLayerForActive( oldLayer ) )
2084 GetCanvas()->GetView()->SetLayerVisible( *oldClearanceLayer, false );
2085
2086 if( std::optional<int> newClearanceLayer = getClearanceLayerForActive( aLayer ) )
2087 GetCanvas()->GetView()->SetLayerVisible( *newClearanceLayer, true );
2088
2089 // per-layer view groups already hold each layer geometry so an active-layer change needs no
2090 // re-tessellation just clearance visibility above and the recolour in SetHighContrastLayer
2091
2092 // idle refresh coalesces mashed hotkeys into one repaint forced redraws stay immediate
2093 if( aForceRedraw )
2094 GetCanvas()->Refresh();
2095 else
2097}
2098
2099
2101{
2102 wxFileName fn( GetBoard()->GetFileName() );
2103
2105
2106 layerEnum.Choices().Clear();
2107 layerEnum.Undefined( UNDEFINED_LAYER );
2108
2109 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
2110 {
2111 // Canonical name
2112 layerEnum.Map( layer, LSET::Name( layer ) );
2113
2114 // User name
2115 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
2116 }
2117
2118 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
2119
2120 try
2121 {
2122 drcTool->GetDRCEngine()->InitEngine( GetBoard()->GetDesignRulesPath() );
2123 }
2124 catch( PARSE_ERROR& )
2125 {
2126 // Not sure this is the best place to tell the user their rules are buggy, so
2127 // we'll stay quiet for now. Feel free to revisit this decision....
2128 }
2129
2131
2132 // Migrate obsolete WRL 3D model references to current STEP models. Only
2133 // runs in the GUI: CLI and scripting load paths must not mutate board
2134 // state on load. The STEP exporter does its own WRL->STEP substitution at
2135 // export time via the --subst-models flag, and the 3D cache quietly falls
2136 // back to sibling STEP files for missing WRLs in headless contexts.
2137 if( Pgm().IsGUI() )
2138 {
2139 // Silently replace references whose filename uniquely identifies a
2140 // STEP sibling. Leaves ambiguous cases for the infobar below.
2142
2143 if( int unresolved = DIALOG_MIGRATE_3D_MODELS::CountUnresolvedWrlReferences( this ) )
2144 {
2145 wxString msg = _( "WRL 3D model could not be matched to equivalent STEP model." );
2146
2147 if( unresolved > 1 )
2148 {
2149 msg = wxString::Format( _( "%d WRL 3D models could not be matched to equivalent STEP models." ),
2150 unresolved );
2151 }
2152
2153 m_loadNoticeInfoBar->RemoveAllButtons();
2154 m_loadNoticeInfoBar->AddLink( _( "Show options" ),
2155 [this]( wxHyperlinkEvent& )
2156 {
2157 DIALOG_MIGRATE_3D_MODELS dlg( this );
2158 dlg.ShowModal();
2159
2160 // Dismiss the infobar if nothing remains to resolve;
2161 // otherwise leave it so the user can try again.
2163 m_loadNoticeInfoBar->Dismiss();
2164 } );
2165 m_loadNoticeInfoBar->AddCloseButton();
2166 m_loadNoticeInfoBar->ShowMessageFor( msg, 10000, wxICON_INFORMATION );
2167 }
2168 }
2169
2170 UpdateTitle();
2171
2172 // Display a warning that the file is read only
2173 if( fn.FileExists() && !fn.IsFileWritable() )
2174 {
2175 m_infoBar->RemoveAllButtons();
2176 m_infoBar->AddCloseButton();
2177 m_infoBar->ShowMessage( _( "Board file is read only." ), wxICON_WARNING,
2178 WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE );
2179 }
2180
2182
2183 // Sync layer and item visibility
2185
2186 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
2187
2188 m_appearancePanel->OnBoardChanged();
2189
2190 // Apply saved display state to the appearance panel after it has been set up
2191 PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings();
2192
2193 m_appearancePanel->ApplyLayerPreset( localSettings.m_ActiveLayerPreset );
2194
2195 if( GetBoard()->GetDesignSettings().IsLayerEnabled( localSettings.m_ActiveLayer ) )
2196 SetActiveLayer( localSettings.m_ActiveLayer, true );
2197 else
2198 SetActiveLayer( GetActiveLayer(), true ); // Make sure to repaint even if not switching
2199
2200 PROJECT_FILE& projectFile = Prj().GetProjectFile();
2201
2202 m_layerPairSettings->SetLayerPairs( projectFile.m_LayerPairInfos );
2203 m_layerPairSettings->SetCurrentLayerPair( LAYER_PAIR{ F_Cu, B_Cu } );
2204
2205 // Updates any auto dimensions and the auxiliary toolbar tracks/via sizes
2207
2208 // Sync the net inspector now we have connectivity calculated
2210 m_netInspectorPanel->OnBoardChanged();
2211
2212 // Display the loaded board:
2213 Zoom_Automatique( false );
2214
2215 // Invalidate painting as loading the DRC engine will cause clearances to become valid
2217
2218 Refresh();
2219
2220 SetMsgPanel( GetBoard() );
2221 SetStatusText( wxEmptyString );
2222
2223 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "PCB file changes are unsaved" ) );
2224}
2225
2226
2228{
2229 m_appearancePanel->UpdateDisplayOptions();
2230}
2231
2232
2234{
2235 return GetBoard()->IsElementVisible( aElement );
2236}
2237
2238
2240{
2241 // Force the RATSNEST visible
2242 if( aElement == LAYER_RATSNEST )
2243 GetCanvas()->GetView()->SetLayerVisible( aElement, true );
2244 else
2245 GetCanvas()->GetView()->SetLayerVisible( aElement , aNewState );
2246
2247 GetBoard()->SetElementVisibility( aElement, aNewState );
2248}
2249
2250
2252{
2253 // call my base class
2255
2256 m_auimgr.GetPane( m_appearancePanel ).Caption( _( "Appearance" ) );
2257 m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
2258 m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
2259 m_auimgr.GetPane( m_netInspectorPanel ).Caption( _( "Net Inspector" ) );
2260 m_auimgr.Update();
2261
2262 UpdateTitle();
2263}
2264
2265
2267{
2269
2270 if( project.m_PcbLastPath[ aType ].IsEmpty() )
2271 return wxEmptyString;
2272
2273 wxFileName absoluteFileName = project.m_PcbLastPath[ aType ];
2274 wxFileName pcbFileName = GetBoard()->GetFileName();
2275
2276 absoluteFileName.MakeAbsolute( pcbFileName.GetPath() );
2277 return absoluteFileName.GetFullPath();
2278}
2279
2280
2281void PCB_EDIT_FRAME::SetLastPath( LAST_PATH_TYPE aType, const wxString& aLastPath )
2282{
2284
2285 wxFileName relativeFileName = aLastPath;
2286 wxFileName pcbFileName = GetBoard()->GetFileName();
2287
2288 relativeFileName.MakeRelativeTo( pcbFileName.GetPath() );
2289
2290 if( relativeFileName.GetFullPath() != project.m_PcbLastPath[ aType ] )
2291 {
2292 project.m_PcbLastPath[ aType ] = relativeFileName.GetFullPath();
2293 OnModify();
2294 }
2295}
2296
2297
2299{
2301 Kiway().LocalHistory().NoteFileChange( GetBoard()->GetFileName() );
2302 m_ZoneFillsDirty = true;
2303
2304 if( m_isClosing )
2305 return;
2306
2307 // A chart reports the board, so an edit that moved a hole has already made it wrong.
2308 // Costs one integer comparison per chart when nothing drill related changed.
2310
2311 Update3DView( true, GetPcbNewSettings()->m_Display.m_Live3DRefresh );
2312
2313 if( !GetTitle().StartsWith( wxT( "*" ) ) )
2314 UpdateTitle();
2315}
2316
2317
2319{
2320 // The libraries were read once and then cached. A refresh is where they need to be refreshed
2322
2323 Update3DView( true, true );
2324
2325 std::shared_ptr<CONNECTIVITY_DATA> connectivity = GetBoard()->GetConnectivity();
2326 connectivity->RecalculateRatsnest( nullptr );
2328
2329 std::vector<MSG_PANEL_ITEM> msg_list;
2330 GetBoard()->GetMsgPanelInfo( this, msg_list );
2331 SetMsgPanel( msg_list );
2332}
2333
2334
2336{
2337 wxFileName fn = GetBoard()->GetFileName();
2338 bool readOnly = false;
2339 bool unsaved = false;
2340
2341 if( fn.IsOk() && fn.FileExists() )
2342 readOnly = !fn.IsFileWritable();
2343 else
2344 unsaved = true;
2345
2346 wxString title;
2347
2348 if( IsContentModified() )
2349 title = wxT( "*" );
2350
2351 title += fn.GetName();
2352
2353 if( readOnly )
2354 title += wxS( " " ) + _( "[Read Only]" );
2355
2356 if( unsaved )
2357 title += wxS( " " ) + _( "[Unsaved]" );
2358
2359 title += wxT( " \u2014 " ) + _( "PCB Editor" );
2360
2361 SetTitle( title );
2362}
2363
2364
2366{
2367 // Update the layer manager and other widgets from the board setup
2368 // (layer and items visibility, colors ...)
2369
2370 // Rebuild list of nets (full ratsnest rebuild)
2372
2373 // Update info shown by the horizontal toolbars
2375
2376 LSET activeLayers = GetBoard()->GetEnabledLayers();
2377
2378 if( !activeLayers.test( GetActiveLayer() ) )
2379 SetActiveLayer( activeLayers.Seq().front() );
2380
2381 // The layer selector lives on the top auxiliary toolbar. Users can remove every
2382 // entry from that toolbar via Preferences, in which case the control is destroyed
2383 // and m_SelLayerBox is null. Avoid dereferencing it here.
2384 if( m_SelLayerBox )
2385 m_SelLayerBox->SetLayerSelection( GetActiveLayer() );
2386
2388
2389 layerEnum.Choices().Clear();
2390 layerEnum.Undefined( UNDEFINED_LAYER );
2391
2392 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
2393 {
2394 // Canonical name
2395 layerEnum.Map( layer, LSET::Name( layer ) );
2396
2397 // User name
2398 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
2399 }
2400
2402
2403 // Sync visibility with canvas
2404 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
2405 GetCanvas()->GetView()->SetLayerVisible( layer, GetBoard()->IsLayerVisible( layer ) );
2406
2407 // Stackup and/or color theme may have changed
2408 m_appearancePanel->OnBoardChanged();
2409 m_netInspectorPanel->OnParentSetupChanged();
2410}
2411
2412
2414{
2415 // switches currently used canvas (Cairo / OpenGL).
2416 PCB_BASE_FRAME::SwitchCanvas( aCanvasType );
2417}
2418
2419
2421{
2422 if( !m_findDialog )
2423 {
2424 m_findDialog = new DIALOG_FIND( this );
2425 m_findDialog->SetCallback( std::bind( &PCB_SELECTION_TOOL::FindItem,
2426 m_toolManager->GetTool<PCB_SELECTION_TOOL>(), _1 ) );
2427 }
2428
2429 wxString findString;
2430
2431 PCB_SELECTION& selection = m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
2432
2433 if( selection.Size() == 1 && selection.Front() != m_findDialog->GetItem() )
2434 {
2435 EDA_ITEM* front = selection.Front();
2436
2437 switch( front->Type() )
2438 {
2439 case PCB_FOOTPRINT_T:
2440 findString = UnescapeString( static_cast<FOOTPRINT*>( front )->GetValue() );
2441 break;
2442
2443 case PCB_FIELD_T:
2444 case PCB_TEXT_T:
2445 findString = UnescapeString( static_cast<PCB_TEXT*>( front )->GetText() );
2446
2447 if( findString.Contains( wxT( "\n" ) ) )
2448 findString = findString.Before( '\n' );
2449
2450 break;
2451
2452 default:
2453 break;
2454 }
2455 }
2456
2457 m_findDialog->Preload( findString );
2458
2459 m_findDialog->Show( true );
2460}
2461
2462
2471
2472
2478
2479
2485
2486
2487void PCB_EDIT_FRAME::FindNext( bool reverse )
2488{
2489 if( !m_findDialog )
2491
2492 m_findDialog->FindNext( reverse );
2493}
2494
2495
2497{
2498 if( Kiface().IsSingle() )
2499 return 0;
2500
2501 // Update PCB requires a netlist. Therefore the schematic editor must be running
2502 // If this is not the case, open the schematic editor
2503 KIWAY_PLAYER* frame = Kiway().Player( FRAME_SCH, true );
2504
2505 // If Kiway() cannot create the eeschema frame, it shows a error message, and
2506 // frame is null
2507 if( !frame )
2508 return -1;
2509
2510 if( !frame->IsShownOnScreen() )
2511 {
2512 wxEventBlocker blocker( this );
2513 wxFileName fn( Prj().GetProjectPath(), Prj().GetProjectName(), FILEEXT::KiCadSchematicFileExtension );
2514
2515 // Maybe the file hasn't been converted to the new s-expression file format so
2516 // see if the legacy schematic file is still in play.
2517 if( !fn.FileExists() )
2518 {
2520
2521 if( !fn.FileExists() )
2522 {
2523 DisplayErrorMessage( this, _( "The schematic for this board cannot be found." ) );
2524 return -2;
2525 }
2526 }
2527
2528 frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
2529
2530 // we show the schematic editor frame, because do not show is seen as
2531 // a not yet opened schematic by Kicad manager, which is not the case
2532 frame->Show( true );
2533
2534 // bring ourselves back to the front
2535 Raise();
2536 }
2537
2538 return 1; //Success!
2539}
2540
2541
2542bool PCB_EDIT_FRAME::FetchNetlistFromSchematic( NETLIST& aNetlist, const wxString& aAnnotateMessage )
2543{
2544 int standalone = TestStandalone();
2545
2546 if( standalone == 0 )
2547 {
2548 DisplayErrorMessage( this, _( "Cannot update the PCB because PCB editor is opened in stand-alone mode. "
2549 "In order to create or update PCBs from schematics, you must launch the "
2550 "KiCad project manager and create a project." ) );
2551 return false; // Not in standalone mode
2552 }
2553
2554 if( standalone < 0 ) // Problem with Eeschema or the schematic
2555 return false;
2556
2557 Raise(); // Show
2558
2559 std::string payload( aAnnotateMessage );
2560
2561 Kiway().ExpressMail( FRAME_SCH, MAIL_SCH_GET_NETLIST, payload, this );
2562
2563 // Sentinel reply means the user explicitly aborted; silently cancel and return focus to
2564 // the schematic rather than re-showing the annotation error
2565 if( payload == MAIL_SCH_GET_NETLIST_CANCELLED )
2566 {
2567 if( KIWAY_PLAYER* schFrame = Kiway().Player( FRAME_SCH, false ) )
2568 {
2569 if( schFrame->IsIconized() )
2570 schFrame->Iconize( false );
2571
2572 schFrame->Raise();
2573
2574 // Raising the window does not set the focus on Linux. This should work on
2575 // any platform.
2576 if( wxWindow::FindFocus() != schFrame )
2577 schFrame->SetFocus();
2578 }
2579
2580 return false;
2581 }
2582
2583 if( payload == aAnnotateMessage )
2584 {
2585 Raise();
2586 DisplayErrorMessage( this, aAnnotateMessage );
2587 return false;
2588 }
2589
2590 try
2591 {
2592 STRING_LINE_READER* lineReader = new STRING_LINE_READER( payload, _( "Eeschema netlist" ) );
2593 KICAD_NETLIST_READER netlistReader( lineReader, &aNetlist );
2594 netlistReader.LoadNetlist();
2595 }
2596 catch( const IO_ERROR& e )
2597 {
2598 Raise();
2599
2600 // Do not translate extra_info strings. These are for developers
2601 wxString extra_info = e.Problem() + wxT( " : " ) + e.What() + wxT( " at " ) + e.Where();
2602
2603 DisplayErrorMessage( this, _( "Received an error while reading netlist. Please report this issue to "
2604 "the KiCad team using the menu Help->Report Bug." ),
2605 extra_info );
2606 return false;
2607 }
2608
2609 return true;
2610}
2611
2612
2614{
2615 if( aFootprint == nullptr )
2616 return;
2617
2619
2620 /*
2621 * Make sure dlg is destroyed before GetCanvas->Refresh is called
2622 * later or the refresh will try to modify its properties since
2623 * they share a GL context.
2624 */
2625 {
2626 DIALOG_FOOTPRINT_PROPERTIES dlg( this, aFootprint );
2627
2628 dlg.ShowQuasiModal();
2629 retvalue = dlg.GetReturnValue();
2630 }
2631
2632 /*
2633 * retvalue =
2634 * FP_PROPS_UPDATE_FP to show Update Footprints dialog
2635 * FP_PROPS_CHANGE_FP to show Change Footprints dialog
2636 * FP_PROPS_OK for normal edit
2637 * FP_PROPS_CANCEL if aborted
2638 * FP_PROPS_EDIT_BOARD_FP to load board footprint into Footprint Editor
2639 * FP_PROPS_EDIT_LIBRARY_FP to load library footprint into Footprint Editor
2640 */
2641
2643 {
2644 // If something edited, push a refresh request
2645 GetCanvas()->Refresh();
2646 }
2648 {
2649 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2650 {
2651 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2652
2653 fp_editor->LoadFootprintFromBoard( aFootprint );
2654 fp_editor->Show( true );
2655 fp_editor->Raise(); // Iconize( false );
2656 }
2657 }
2659 {
2660 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2661 {
2662 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2663
2664 fp_editor->LoadFootprintFromLibrary( aFootprint->GetFPID() );
2665 fp_editor->Show( true );
2666 fp_editor->Raise(); // Iconize( false );
2667 }
2668 }
2670 {
2671 ShowExchangeFootprintsDialog( aFootprint, true, true );
2672 }
2674 {
2675 ShowExchangeFootprintsDialog( aFootprint, false, true );
2676 }
2677}
2678
2679
2681 bool aSelectedMode )
2682{
2683 DIALOG_EXCHANGE_FOOTPRINTS dialog( this, aFootprint, aUpdateMode, aSelectedMode );
2684
2685 return dialog.ShowQuasiModal();
2686}
2687
2688
2690{
2692 m_appearancePanel->CommonSettingsChanged( aFlags );
2693
2695
2697
2698 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
2699
2701
2702 // Netclass definitions could have changed, either by us or by Eeschema, so we need to
2703 // recompile the implicit rules
2704 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
2705 WX_INFOBAR* infobar = GetInfoBar();
2706
2707 try
2708 {
2709 drcTool->GetDRCEngine()->InitEngine( GetBoard()->GetDesignRulesPath() );
2710
2711 if( infobar->GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::DRC_RULES_ERROR )
2712 infobar->Dismiss();
2713 }
2714 catch( PARSE_ERROR& )
2715 {
2716 infobar->RemoveAllButtons();
2717 infobar->AddLink( _( "Edit design rules" ),
2718 [&]( wxHyperlinkEvent& aEvent )
2719 {
2720 ShowBoardSetupDialog( _( "Custom Rules" ) );
2721 } );
2722 infobar->AddCloseButton();
2723 infobar->ShowMessage( _( "Could not compile custom design rules." ), wxICON_ERROR,
2724 WX_INFOBAR::MESSAGE_TYPE::DRC_RULES_ERROR );
2725 }
2726
2729
2730 Layout();
2731 SendSizeEvent();
2732}
2733
2734
2739
2740
2742{
2743 // Register autosave history saver for the board.
2744 // Saver serializes the in-memory BOARD into HISTORY_FILE_DATA. Prettify and
2745 // file I/O happen on a background thread to avoid blocking the UI.
2746 if( GetBoard() )
2747 {
2749 GetBoard(),
2750 [this]( const wxString& aProjectPath, std::vector<HISTORY_FILE_DATA>& aFileData )
2751 {
2752 // See SCHEMATIC::SaveToHistory: the dirty check is only valid in ZIP
2753 // mode. In INCREMENTAL mode the manual-save flow clears the dirty
2754 // flag before the saver runs, so filtering would drop the snapshot.
2755 bool filterClean = !Pgm().GetCommonSettings()->AutosaveUsesLocalHistory();
2756
2757 if( filterClean && !IsContentModified() )
2758 return;
2759
2760 GetBoard()->SaveToHistory( aProjectPath, aFileData );
2761 },
2763 }
2764}
2765
2766
2768{
2770
2771 if( !mgr )
2772 return false;
2773
2774 TOOL_BASE* currentTool = mgr->GetCurrentTool();
2775
2776 // When a single item that can be point-edited is selected, the point editor
2777 // tool will be active instead of the selection tool. It blocks undo/redo
2778 // while the user is actually dragging points around, though, so we can use
2779 // this as an initial check.
2780 if( UndoRedoBlocked() )
2781 return true;
2782
2783 // A tool other than passive selection or point editing is actively modifying
2784 // the model (drawing, dragging, routing, etc.).
2785 if( currentTool != mgr->GetTool<PCB_SELECTION_TOOL>()
2786 && currentTool != mgr->GetTool<PCB_POINT_EDITOR>() )
2787 {
2788 return true;
2789 }
2790
2791 if( ZONE_FILLER_TOOL* zoneFillerTool = mgr->GetTool<ZONE_FILLER_TOOL>();
2792 zoneFillerTool && zoneFillerTool->IsBusy() )
2793 {
2794 return true;
2795 }
2796
2797 if( ROUTER_TOOL* routerTool = mgr->GetTool<ROUTER_TOOL>();
2798 routerTool && routerTool->RoutingInProgress() )
2799 {
2800 return true;
2801 }
2802
2803 return false;
2804}
2805
2806
2808{
2810 return false;
2811
2813}
2814
2815
2817{
2818 // Serializing a large board on the UI thread freezes the editor; never do it while the
2819 // user is mid-operation or the deferred input gets misinterpreted (e.g. a routed track
2820 // ending where the cursor lands once the editor unfreezes).
2822}
2823
2824
2830
2831
2832bool PCB_EDIT_FRAME::GetPluginActionButtonVisible( const wxString& aPluginPath, bool aPluginDefault )
2833{
2834 if( PCBNEW_SETTINGS* cfg = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
2835 {
2836 for( const auto& [identifier, visible] : cfg->m_Plugins.actions )
2837 {
2838 if( identifier == aPluginPath )
2839 return visible;
2840 }
2841 }
2842
2843 // Plugin is not in settings, return default.
2844 return aPluginDefault;
2845}
2846
2847
2849{
2850 return GetBoard()->GetFileName();
2851}
2852
2853
2855{
2856 return m_auimgr.GetPane( wxS( "LayersManager" ) ).IsShown();
2857}
2858
2859
2861{
2862 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
2863}
2864
2865
2867{
2868 return m_auimgr.GetPane( NetInspectorPanelName() ).IsShown();
2869}
2870
2871
2872void PCB_EDIT_FRAME::onSize( wxSizeEvent& aEvent )
2873{
2874 if( IsShownOnScreen() )
2875 {
2876 // We only need this until the frame is done resizing and the final client size is
2877 // established.
2878 Unbind( wxEVT_SIZE, &PCB_EDIT_FRAME::onSize, this );
2880 }
2881
2882 // Skip() is called in the base class.
2883 EDA_DRAW_FRAME::OnSize( aEvent );
2884}
2885
2886
2897
2898
2909
2910
2921
2922
2924{
2925 if( !m_footprintDiffDlg )
2926 {
2928 _( "Compare Footprint with Library" ) );
2929
2930 m_footprintDiffDlg->m_sdbSizerApply->SetLabel( _( "Update Footprint from Library..." ) );
2931 m_footprintDiffDlg->m_sdbSizerApply->PostSizeEventToParent();
2932 m_footprintDiffDlg->m_sdbSizerApply->Show();
2933 }
2934
2935 return m_footprintDiffDlg;
2936}
2937
2938
2940{
2942 {
2943 auto* dlg = new DIALOG_FOOTPRINT_FIELDS_TABLE( this );
2944
2945 if( dlg->WasAborted() )
2946 {
2947 dlg->Destroy();
2948 return nullptr;
2949 }
2950
2952 }
2953
2955}
2956
2957
2959{
2960 if( m_inspectDrcErrorDlg && aEvent.GetString() == INSPECT_DRC_ERROR_DIALOG_NAME )
2961 {
2962 m_inspectDrcErrorDlg->Destroy();
2963 m_inspectDrcErrorDlg = nullptr;
2964 }
2965 else if( m_inspectClearanceDlg && aEvent.GetString() == INSPECT_CLEARANCE_DIALOG_NAME )
2966 {
2967 m_inspectClearanceDlg->Destroy();
2968 m_inspectClearanceDlg = nullptr;
2969 }
2970 else if( m_inspectConstraintsDlg && aEvent.GetString() == INSPECT_CONSTRAINTS_DIALOG_NAME )
2971 {
2972 m_inspectConstraintsDlg->Destroy();
2973 m_inspectConstraintsDlg = nullptr;
2974 }
2975 else if( m_footprintDiffDlg && aEvent.GetString() == FOOTPRINT_DIFF_DIALOG_NAME )
2976 {
2977 if( aEvent.GetId() == wxID_APPLY )
2978 {
2979 KIID fpUUID = m_footprintDiffDlg->GetUserItemID();
2980
2981 CallAfter(
2982 [this, fpUUID]()
2983 {
2984 BOARD_ITEM* item = m_pcb->ResolveItem( fpUUID );
2985
2986 if( FOOTPRINT* footprint = dynamic_cast<FOOTPRINT*>( item ) )
2987 {
2988 m_toolManager->RunAction<EDA_ITEM*>( ACTIONS::selectItem, footprint );
2989
2990 DIALOG_EXCHANGE_FOOTPRINTS dialog( this, footprint, true, true );
2991 dialog.ShowQuasiModal();
2992 }
2993 } );
2994 }
2995
2996 m_footprintDiffDlg->Destroy();
2997 m_footprintDiffDlg = nullptr;
2998 }
2999}
3000
3001
3003{
3005 return true;
3006
3008
3009 if( !dlg->Close( false ) )
3010 return false;
3011
3012 if( m_footprintFieldsTableDialog == dlg )
3013 {
3014 dlg->Destroy();
3016 }
3017
3018 return true;
3019}
3020
3021
3023{
3025 {
3028 }
3029}
3030
3031
3033{
3034 wxLogTrace( traceApi, "PCB frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" );
3036 aEvt.Skip();
3037}
3038
3039
3041{
3042 PCB_LAYER_ID curLayer = GetActiveLayer();
3043 const PCB_DISPLAY_OPTIONS& displ_opts = GetDisplayOptions();
3044
3045 // Check if the specified layer matches the present layer
3046 if( layer == curLayer )
3047 return;
3048
3049 // Copper layers cannot be selected unconditionally; how many of those layers are currently
3050 // enabled needs to be checked.
3051 if( IsCopperLayer( layer ) )
3052 {
3053 if( layer > GetBoard()->GetCopperLayerStackMaxId() )
3054 return;
3055 }
3056
3057 // Is yet more checking required? E.g. when the layer to be selected is a non-copper layer,
3058 // or when switching between a copper layer and a non-copper layer, or vice-versa?
3059
3060 SetActiveLayer( layer );
3061
3063 GetCanvas()->Refresh();
3064}
3065
3066
3068{
3069 switch( aItem->Type() )
3070 {
3073 break;
3074
3075 case PCB_BARCODE_T:
3076 ShowBarcodePropertiesDialog( static_cast<PCB_BARCODE*>( aItem ) );
3077 break;
3078
3079 case PCB_FIELD_T:
3080 case PCB_TEXT_T:
3081 ShowTextPropertiesDialog( static_cast<PCB_TEXT*>( aItem ) );
3082 break;
3083
3084 case PCB_TEXTBOX_T:
3085 ShowTextBoxPropertiesDialog( static_cast<PCB_TEXTBOX*>( aItem ) );
3086 break;
3087
3088 case PCB_TABLE_T:
3089 {
3090 DIALOG_TABLE_PROPERTIES dlg( this, static_cast<PCB_TABLE*>( aItem ) );
3091
3092 //QuasiModal required for Scintilla auto-complete
3093 dlg.ShowQuasiModal();
3094 break;
3095 }
3096
3097 case PCB_DRILL_CHART_T:
3098 {
3099 // Not the generic table dialog, which would offer copper layers and direct editing of
3100 // cells that the next rebuild discards
3101 DIALOG_DRILL_CHART_PROPERTIES dlg( this, static_cast<PCB_DRILL_CHART*>( aItem ) );
3102 dlg.ShowModal();
3103 break;
3104 }
3105
3106 case PCB_PAD_T:
3107 ShowPadPropertiesDialog( static_cast<PAD*>( aItem ) );
3108 break;
3109
3110 case PCB_FOOTPRINT_T:
3111 ShowFootprintPropertiesDialog( static_cast<FOOTPRINT*>( aItem ) );
3112 break;
3113
3114 case PCB_TARGET_T:
3115 ShowTargetOptionsDialog( static_cast<PCB_TARGET*>( aItem ) );
3116 break;
3117
3118 case PCB_DIM_ALIGNED_T:
3119 case PCB_DIM_CENTER_T:
3120 case PCB_DIM_RADIAL_T:
3122 case PCB_DIM_LEADER_T:
3123 {
3124 DIALOG_DIMENSION_PROPERTIES dlg( this, static_cast<PCB_DIMENSION_BASE*>( aItem ) );
3125
3126 dlg.ShowModal();
3127 break;
3128 }
3129
3130 case PCB_SHAPE_T:
3131 ShowGraphicItemPropertiesDialog( static_cast<PCB_SHAPE*>( aItem ) );
3132 break;
3133
3134 case PCB_GRID_ITEM_T:
3135 ShowGridItemPropertiesDialog( static_cast<PCB_GRID_ITEM*>( aItem ) );
3136 break;
3137
3138 case PCB_ZONE_T:
3139 Edit_Zone_Params( static_cast<ZONE*>( aItem ) );
3140 break;
3141
3142 case PCB_GROUP_T:
3144 static_cast<EDA_GROUP*>( static_cast<PCB_GROUP*>( aItem ) ) );
3145 break;
3146
3147 case PCB_GENERATOR_T:
3148 static_cast<PCB_GENERATOR*>( aItem )->ShowPropertiesDialog( this );
3149 break;
3150
3151 case PCB_MARKER_T:
3152 m_toolManager->GetTool<DRC_TOOL>()->CrossProbe( static_cast<PCB_MARKER*>( aItem ) );
3153 break;
3154
3155 case PCB_POINT_T:
3156 break;
3157
3158 default:
3159 break;
3160 }
3161}
3162
3163
3165{
3166 // For now we just delegate to the base implementation which commits any pending
3167 // local history snapshots. If PCB-specific preconditions are later needed (e.g.
3168 // flushing zone fills or router state) they can be added here before calling the
3169 // base class method.
3171}
const KICOMMON_API wxEventTypeTag< wxCommandEvent > EDA_EVT_PLUGIN_AVAILABILITY_CHANGED
Notifies other parts of KiCad when plugin availability changes.
@ KEEP_ENDPOINTS_OR_START_DIRECTION
Whe editing endpoints, the other end remains in place.
@ KEEP_CENTER_ENDS_ADJUST_ANGLE
When editing endpoints, only the angle is adjusted.
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
When editing endpoints, the angle and radius are adjusted.
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:121
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:100
@ NORMAL
Inactive layers are shown normally (no high-contrast mode)
constexpr BOX2I BOX2ISafe(const BOX2D &aInput)
Definition box2.h:934
BOX2< VECTOR2D > BOX2D
Definition box2.h:928
static TOOL_ACTION toggleGrid
Definition actions.h:194
static TOOL_ACTION paste
Definition actions.h:76
static TOOL_ACTION unselectAll
Definition actions.h:79
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
Definition actions.h:223
static TOOL_ACTION togglePolarCoords
Definition actions.h:205
static TOOL_ACTION copy
Definition actions.h:74
static TOOL_ACTION pluginsReload
Definition actions.h:292
static TOOL_ACTION selectSetLasso
Definition actions.h:217
static TOOL_ACTION selectSetRect
Set lasso selection mode.
Definition actions.h:216
static TOOL_ACTION group
Definition actions.h:235
static TOOL_ACTION pasteSpecial
Definition actions.h:77
static TOOL_ACTION groupProperties
Definition actions.h:243
static TOOL_ACTION pointEditorArcKeepCenter
Definition actions.h:271
static TOOL_ACTION ungroup
Definition actions.h:236
static TOOL_ACTION toggleBoundingBoxes
Definition actions.h:153
static TOOL_ACTION pointEditorArcKeepRadius
Definition actions.h:273
static TOOL_ACTION showSearch
Definition actions.h:112
static TOOL_ACTION undo
Definition actions.h:71
static TOOL_ACTION duplicate
Definition actions.h:80
static TOOL_ACTION highContrastMode
Definition actions.h:151
static TOOL_ACTION embeddedFiles
Definition actions.h:295
static TOOL_ACTION measureTool
Definition actions.h:248
static TOOL_ACTION doDelete
Definition actions.h:81
static TOOL_ACTION selectionTool
Definition actions.h:247
static TOOL_ACTION save
Definition actions.h:54
static TOOL_ACTION zoomFitScreen
Definition actions.h:138
static TOOL_ACTION redo
Definition actions.h:72
static TOOL_ACTION deleteTool
Definition actions.h:82
static TOOL_ACTION zoomTool
Definition actions.h:142
static TOOL_ACTION showProperties
Definition actions.h:262
static TOOL_ACTION cut
Definition actions.h:73
static TOOL_ACTION gridSetOrigin
Definition actions.h:191
static TOOL_ACTION toggleGridOverrides
Definition actions.h:195
static TOOL_ACTION selectAll
Definition actions.h:78
static TOOL_ACTION pointEditorArcKeepEndpoint
Definition actions.h:272
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.
void OnColorThemeChanged()
Respond to change in OS's DarkMode.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
The array tool.
Definition array_tool.h:44
Tool responsible for automagic placement of footprints.
Handles how to draw a screen (a board, a schematic ...)
Definition base_screen.h:37
int GetPageCount() const
Definition base_screen.h:68
bool IsContentModified() const
Definition base_screen.h:56
const wxString & GetPageNumber() const
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
Handle actions specific to the board editor in PcbNew.
Tool for pcb inspection.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
Bridges BOARD's listener stream into the generic TEXT_VAR_TRACKER.
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:409
void BuildListOfNets()
Definition board.h:1170
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition board.cpp:1250
void RemoveAllListeners()
Remove all listeners.
Definition board.cpp:3993
const PAGE_INFO & GetPageSettings() const
Definition board.h:1010
GAL_SET GetVisibleElements() const
Return a set of all the element categories that are visible.
Definition board.cpp:1244
void InitializeClearanceCache()
Initialize the clearance cache for all board items.
Definition board.cpp:1318
void SaveToHistory(const wxString &aProjectPath, std::vector< HISTORY_FILE_DATA > &aFileData)
Serialize board into HISTORY_FILE_DATA for non-blocking history commit.
Definition board.cpp:4510
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
Definition board.cpp:364
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
Definition board.cpp:3402
std::weak_ptr< void > GetHistoryLifetimeToken() const
Liveness token handed to LOCAL_HISTORY::RegisterSaver so a shared autosave timer skips this board's s...
Definition board.h:1687
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
Definition board.cpp:374
const wxString & GetFileName() const
Definition board.h:452
void SetElementVisibility(GAL_LAYER_ID aLayer, bool aNewState)
Change the visibility of an element category.
Definition board.cpp:1256
void ClearProject()
Definition board.cpp:415
bool IsEmpty() const
Definition board.cpp:802
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition board.cpp:2790
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition board.cpp:1183
void UpdateRatsnestExclusions()
Update the visibility flags on the current unconnected ratsnest lines.
Definition board.cpp:538
void SynchronizeTuningProfileProperties()
Ensure that all time domain properties providers are in sync with current settings.
Definition board.cpp:3356
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition board.h:751
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:553
void SetColor(int aLayer, const COLOR4D &aColor)
COLOR4D GetColor(int aLayer) const
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
Definition commit.h:74
Handle actions that are shared between different applications.
bool AutosaveUsesLocalHistory() const
The backup format is the single switch that selects the autosave mechanism: the incremental format re...
Handles action that are shared between different applications.
Interactive authoring of geometric constraints (issue #2329).
enum FP_PROPS_RETVALUE GetReturnValue()
Dialog that offers to migrate obsolete WRL 3D model references on a loaded board to current STEP mode...
static int AutoMigrateByFilename(PCB_EDIT_FRAME *aFrame)
Silently rewrite unresolvable .wrl/.wrz references to STEP files whose filename stem matches in the s...
static int CountUnresolvedWrlReferences(PCB_EDIT_FRAME *aFrame)
Count of unique unresolvable .wrl/.wrz references on the board (deduplicated by filename).
int ShowModal() override
Tool responsible for displaying an overlay of incremental phase difference between differential pair ...
Tool responsible for drawing graphical elements like lines, arcs, circles, etc.
MODE GetDrawingMode() const
Return the current drawing mode of the DRAWING_TOOL or MODE::NONE if not currently in any drawing mod...
void InitEngine(const wxFileName &aRulePath)
Initialize the DRC engine.
std::shared_ptr< DRC_ENGINE > GetDRCEngine()
Definition drc_tool.h:83
bool IsDRCRunning() const
Check to see if the DRC engine is running the tests.
Definition drc_tool.h:70
void SetSheetPath(const std::string &aSheetPath)
Set the sheet path displayed in the title block.
void SetSheetCount(int aSheetCount)
Change the sheet-count number displayed in the title block.
void SetVariantName(const std::string &aVariant)
Set the current variant name and description to be shown on the drawing sheet.
void SetVariantDesc(const std::string &aVariantDesc)
void SetPageNumber(const std::string &aPageNumber)
Change the page number displayed in the title block.
void SetSheetName(const std::string &aSheetName)
Set the sheet name displayed in the title block.
void SetIsFirstPage(bool aIsFirstPage)
Change if this is first page.
void AttachToTracker(TEXT_VAR_TRACKER *aTracker)
Register this proxy with aTracker as a dependent on every title-block source variable its current tem...
void SetFileName(const std::string &aFileName)
Set the file name displayed in the title block.
virtual bool doAutoSave()
This should be overridden by the derived class to handle the auto save feature.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
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 ThemeChanged()
Process light/dark theme change.
WX_INFOBAR * m_infoBar
wxAuiManager m_auimgr
virtual bool CanAcceptApiCommands()
Check if this frame is ready to accept API commands.
virtual void RecreateToolbars()
virtual void OnSize(wxSizeEvent &aEvent)
virtual bool canCloseWindow(wxCloseEvent &aCloseEvent)
virtual int GetUndoCommandCount() const
bool m_isClosing
Set by the close window event handler after frames are asked if they can close.
WX_INFOBAR * GetInfoBar()
static std::vector< const PLUGIN_ACTION * > GetOrderedPluginActions(PLUGIN_ACTION_SCOPE aScope, APP_SETTINGS_BASE *aCfg)
Return ordered list of plugin actions for display in the toolbar.
static const wxString AppearancePanelName()
virtual wxString GetFullScreenDesc() const
void OnSelectGrid(wxCommandEvent &event)
Command event handler for selecting grid sizes.
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
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 wxString GetScreenDesc() const
static const wxString PropertiesPaneName()
virtual void Zoom_Automatique(bool aWarpPointer)
Redraw the screen with best zoom level and the best centering that shows all the page or the board.
NET_INSPECTOR_PANEL * m_netInspectorPanel
static const wxString NetInspectorPanelName()
SEARCH_PANE * m_searchPane
static const wxString DesignBlocksPaneName()
PROPERTIES_PANEL * m_propertiesPanel
virtual void UpdateProperties()
static constexpr GAL_TYPE GAL_FALLBACK
void StopDrawing()
Prevent the GAL canvas from further drawing until it is recreated or StartDrawing() is called.
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
void SetFocus() override
void RequestRefresh()
Make sure a refresh gets done on the next idle event if it hasn't already.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:98
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
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:94
SELECTION_CONDITION NoActiveTool()
Create a functor testing if there are no tools active in the frame.
SELECTION_CONDITION BoundingBoxes()
SELECTION_CONDITION RedoAvailable()
Create a functor that tests if there are any items in the redo queue.
SELECTION_CONDITION CurrentTool(const TOOL_ACTION &aTool)
Create a functor testing if the specified tool is the current active tool in the frame.
SELECTION_CONDITION GridVisible()
Create a functor testing if the grid is visible in a frame.
SELECTION_CONDITION PolarCoordinates()
Create a functor testing if polar coordinates are current being used.
SELECTION_CONDITION GridOverrides()
Create a functor testing if the grid overrides wires is enabled in a frame.
The interactive edit tool.
Definition edit_tool.h:54
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition property.h:776
static ENUM_MAP< T > & Instance()
Definition property.h:770
ENUM_MAP & Undefined(T aValue)
Definition property.h:783
wxPGChoices & Choices()
Definition property.h:821
void LoadFootprintFromLibrary(LIB_ID aFPID)
bool HandleUnsavedChanges(bool aFromBoardOnly)
Prompt to save each dirty tab that meets the requirements.
bool LoadFootprintFromBoard(FOOTPRINT *aFootprint)
Load a footprint from the main board into the Footprint Editor.
Component library viewer main window.
const LIB_ID & GetFPID() const
Definition footprint.h:473
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
bool Contains(GAL_LAYER_ID aPos)
Definition layer_ids.h:459
Handle actions specific to filling copper zones.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
virtual const wxString Problem() const
what was the problem?
virtual const wxString Where() const
where did the Problem() occur?
void RegisterHandler(API_HANDLER *aHandler)
Adds a new request handler to the server.
void DeregisterHandler(API_HANDLER *aHandler)
Read the new s-expression based KiCad netlist format.
virtual void LoadNetlist() override
Load the contents of the netlist file into aNetlist.
APP_SETTINGS_BASE * KifaceSettings() const
Definition kiface_base.h:91
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
void SetGridColor(const COLOR4D &aGridColor)
Set the grid color.
Contains all the knowledge about how to draw graphical object onto any particular output device.
Definition painter.h:55
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition pcb_view.cpp:87
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
An abstract base class for deriving all objects that can be added to a VIEW.
Definition view_item.h:82
bool IsBOARD_ITEM() const
Definition view_item.h:98
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:63
double GetScale() const
Definition view.h:281
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition view.cpp:615
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition view.cpp:1852
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition view.h:405
void SyncLayerVisibilityCache()
Definition view.cpp:1917
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:1703
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition view.h:659
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:1719
An implementation of class VIEW_CONTROLS for wxWidgets library.
std::unique_ptr< PROF_COUNTER > m_MotionEventCounter
Definition kiid.h:46
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
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)
void OnSockRequest(wxSocketEvent &evt)
bool IsModal() const override
Return true if the frame is shown in our modal mode and false if the frame is shown as an usual frame...
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:340
void OnKiCadExit()
Definition kiway.cpp:790
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:388
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:486
LOCAL_HISTORY & LocalHistory()
Return the LOCAL_HISTORY associated with this KIWAY.
Definition kiway.h:451
virtual void CommonSettingsChanged(int aFlags=0)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition kiway.cpp:580
PCB_LAYER_ID GetLayerA() const
PCB_LAYER_ID GetLayerB() const
bool CommitDuplicateOfLastSave(const wxString &aProjectPath, const wxString &aFileType, const wxString &aMessage)
Create a new commit duplicating the tree pointed to by Last_Save_<fileType> and move the Last_Save_<f...
void NoteFileChange(const wxString &aFile)
Record that a file has been modified and should be included in the next snapshot.
void RegisterSaver(const void *aSaverObject, const std::function< void(const wxString &, std::vector< HISTORY_FILE_DATA > &)> &aSaver, const std::weak_ptr< void > &aLifetime={})
Register a saver callback invoked during autosave history commits.
void UnregisterSaver(const void *aSaverObject)
Unregister a previously registered saver callback.
void RemoveAutosaveFiles(const wxString &aProjectPath) const
Remove every autosave file under the project at aProjectPath regardless of which source it shadowed.
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition lset.cpp:309
static const LSET & AllLayersMask()
Definition lset.cpp:637
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition lset.cpp:184
@ MARKER_DRAWING_SHEET
Definition marker_base.h:52
Tool responsible for adding microwave features to PCBs.
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
Definition pad.h:61
void SetInitialPage(const wxString &aPage, const wxString &aParentPage=wxEmptyString)
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition page_info.h:75
Dockable panel listing the board's geometric constraints (issue #2329).
DISPLAY_OPTIONS m_Display
EDA_ANGLE m_RotationAngle
ARC_EDIT_MODE m_ArcEditMode
AUI_PANELS m_AuiPanels
Gather all the actions that are shared by tools.
Definition pcb_actions.h:50
static TOOL_ACTION showConstraintsPanel
Toggle the docked constraints pane (board editor).
static TOOL_ACTION drawRuleArea
static TOOL_ACTION microwaveCreateGap
static TOOL_ACTION drawBezier
static TOOL_ACTION placeText
static TOOL_ACTION drawOrthogonalDimension
static TOOL_ACTION drawRectangle
static TOOL_ACTION padDisplayMode
static TOOL_ACTION placeReferenceImage
static TOOL_ACTION showRatsnest
static TOOL_ACTION showLayersManager
static TOOL_ACTION toggleNetHighlight
static TOOL_ACTION addConstraintVertical
static TOOL_ACTION saveSelectionAsDesignBlock
static TOOL_ACTION drawCircle
static TOOL_ACTION mirrorH
Mirroring of selected items.
static TOOL_ACTION routeDiffPair
Activation of the Push and Shove router (differential pair mode)
static TOOL_ACTION tuneDiffPair
static TOOL_ACTION saveToLinkedDesignBlock
static TOOL_ACTION layerChanged
static TOOL_ACTION grabUnconnected
Select and move nearest unconnected footprint from ratsnest of selection.
Definition pcb_actions.h:93
static TOOL_ACTION ddAppendBoard
Drag and drop.
static TOOL_ACTION drawEllipseArc
static TOOL_ACTION highlightNet
static TOOL_ACTION autoTrackWidth
static TOOL_ACTION drawTable
static TOOL_ACTION drawTextBox
static TOOL_ACTION addConstraintPerpendicular
static TOOL_ACTION routerHighlightMode
Actions to enable switching modes via hotkey assignments.
static TOOL_ACTION routerWalkaroundMode
static TOOL_ACTION routerShoveMode
static TOOL_ACTION drawZoneCutout
static TOOL_ACTION drawPolygon
static TOOL_ACTION hideNetInRatsnest
static TOOL_ACTION zoneDisplayFilled
static TOOL_ACTION showNetInRatsnest
static TOOL_ACTION drawRadialDimension
static TOOL_ACTION tuneSingleTrack
static TOOL_ACTION viaDisplayMode
static TOOL_ACTION drawLeader
static TOOL_ACTION addConstraintAngular
static TOOL_ACTION addConstraintArcAngle
static TOOL_ACTION angleSnapModeChanged
Notification event when angle mode changes.
static TOOL_ACTION saveBoardAsDesignBlock
static TOOL_ACTION drillOrigin
static TOOL_ACTION tuneSkew
static TOOL_ACTION addConstraintHorizontal
static TOOL_ACTION trackDisplayMode
static TOOL_ACTION showNetInspector
static TOOL_ACTION microwaveCreateStubArc
static TOOL_ACTION drawEllipse
static TOOL_ACTION zoneDisplayTriangulated
static TOOL_ACTION placeDesignBlock
static TOOL_ACTION selectUnconnected
Select unconnected footprints from ratsnest of selection.
Definition pcb_actions.h:90
static TOOL_ACTION zoneDisplayFractured
static TOOL_ACTION addConstraintCollinear
static TOOL_ACTION drawVia
static TOOL_ACTION drawArc
static TOOL_ACTION zoneDuplicate
Duplicate zone onto another layer.
static TOOL_ACTION graphicsOutlines
Display footprint graphics as outlines.
static TOOL_ACTION addConstraintEqualRadius
static TOOL_ACTION addConstraintTangent
static TOOL_ACTION drawSimilarZone
static TOOL_ACTION showDesignBlockPanel
static TOOL_ACTION drawCenterDimension
static TOOL_ACTION selectSameSheet
Select all components on the same sheet as the selected footprint.
Definition pcb_actions.h:99
static TOOL_ACTION microwaveCreateStub
static TOOL_ACTION selectNet
Select all connections belonging to a single net.
Definition pcb_actions.h:81
static TOOL_ACTION ddImportGraphics
static TOOL_ACTION microwaveCreateLine
static TOOL_ACTION addConstraintFixedLength
static TOOL_ACTION flipBoard
static TOOL_ACTION placeGridItem
Grid Item.
static TOOL_ACTION zoneDisplayOutline
static TOOL_ACTION ratsnestLineMode
static TOOL_ACTION toggleAutoConstraints
Toggle authoring constraints automatically while drawing.
static TOOL_ACTION textOutlines
Display texts as lines.
static TOOL_ACTION highlightNetSelection
static TOOL_ACTION microwaveCreateFunctionShape
static TOOL_ACTION placePoint
static TOOL_ACTION zoneMerge
static TOOL_ACTION addConstraintSymmetric
static TOOL_ACTION addConstraintFixedPosition
Ground a point, and the cluster holding it.
static TOOL_ACTION mirrorV
static TOOL_ACTION unlock
static TOOL_ACTION addConstraintPointOnLine
static TOOL_ACTION placeFootprint
static TOOL_ACTION routeSingleTrack
Activation of the Push and Shove router.
static TOOL_ACTION createArray
Tool for creating an array of objects.
static TOOL_ACTION showDiffPhaseSkew
Display of phase skew between differential pair tracks.
static TOOL_ACTION deselectNet
Remove all connections belonging to a single net from the active selection.
Definition pcb_actions.h:84
static TOOL_ACTION addConstraintCoincident
static TOOL_ACTION drawLine
static TOOL_ACTION placeLinkedDesignBlock
static TOOL_ACTION localRatsnestTool
static TOOL_ACTION placeViaStack
static TOOL_ACTION rotateCw
Rotation of selected objects.
static TOOL_ACTION rotateCcw
static TOOL_ACTION addConstraintParallel
static TOOL_ACTION drawAlignedDimension
static TOOL_ACTION addConstraintFixedRadius
static TOOL_ACTION addConstraintEqualLength
static TOOL_ACTION drawZone
static TOOL_ACTION selectOnSchematic
Select symbols/pins on schematic corresponding to selected footprints/pads.
static TOOL_ACTION addConstraintMidpoint
static TOOL_ACTION lock
static TOOL_ACTION addConstraintConcentric
Common, abstract interface for edit frames.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
int ShowTextBoxPropertiesDialog(PCB_TEXTBOX *aTextBox)
void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
bool UndoRedoBlocked() const
Check if the undo and redo operations are currently blocked.
PCB_LAYER_BOX_SELECTOR * m_SelLayerBox
virtual void SetBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr) override
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
std::unique_ptr< LAYER_PAIR_SETTINGS > m_layerPairSettings
APPEARANCE_CONTROLS * GetAppearancePanel()
APPEARANCE_CONTROLS * m_appearancePanel
void ShowReferenceImagePropertiesDialog(BOARD_ITEM *aBitmap)
PANEL_SELECTION_FILTER * m_selectionFilterPanel
void ShowBarcodePropertiesDialog(PCB_BARCODE *aText)
void ShowGridItemPropertiesDialog(PCB_GRID_ITEM *aGridItem)
void ShowGraphicItemPropertiesDialog(PCB_SHAPE *aShape)
void ActivateGalCanvas() override
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
void ShowPadPropertiesDialog(PAD *aPad)
const PCB_DISPLAY_OPTIONS & GetDisplayOptions() const
Display options control the way tracks, vias, outlines and other things are shown (for instance solid...
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
PCBNEW_SETTINGS * GetPcbNewSettings() const
virtual void SetActiveLayer(PCB_LAYER_ID aLayer)
void OnModify() override
Must be called after a change in order to set the "modify" flag and update other data structures and ...
virtual MAGNETIC_SETTINGS * GetMagneticItemsSettings()
EDA_ITEM * ResolveItem(const KIID &aId, bool aAllowNullptrReturn=false) const override
Fetch an item by KIID.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual PCB_LAYER_ID GetActiveLayer() const
virtual void SetPageSettings(const PAGE_INFO &aPageSettings) override
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
BOARD * GetBoard() const
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Return the BOARD_DESIGN_SETTINGS for the open project.
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
Handle actions that are shared between different frames in PcbNew.
Definition pcb_control.h:45
Handle design block actions in the PCB editor.
bool m_FlipBoardView
true if the board is flipped to show the mirrored view
double m_ZoneOpacity
Opacity override for filled zone areas.
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
void UpdateColors()
Update the color settings in the painter and GAL.
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
void SetDrawingSheet(DS_PROXY_VIEW_ITEM *aDrawingSheet)
Sets (or updates) drawing-sheet used by the draw panel.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void SyncLayersVisibility(const BOARD *aBoard)
Update "visibility" property of each layer of a given BOARD.
virtual void SetHighContrastLayer(int aLayer) override
SetHighContrastLayer(), with some extra smarts for PCB.
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
Group generic conditions for PCB editor states.
SELECTION_CONDITION PadFillDisplay()
Create a functor that tests if the frame fills the pads.
SELECTION_CONDITION TrackFillDisplay()
Create a functor that tests if the frame fills tracks.
SELECTION_CONDITION HasItems()
Create a functor that tests if there are items in the board.
SELECTION_CONDITION GraphicsFillDisplay()
Create a functor that tests if the frame fills graphics items.
SELECTION_CONDITION ZoneDisplayMode(ZONE_DISPLAY_MODE aMode)
Create a functor that tests the current zone display mode in the frame.
SELECTION_CONDITION ViaFillDisplay()
Create a functor that tests if the frame fills vias.
SELECTION_CONDITION TextFillDisplay()
Create a functor that tests if the frame fills text items.
The main frame for Pcbnew.
void HardRedraw() override
Rebuild the GAL and redraws the screen.
void OnDisplayOptionsChanged() override
std::size_t m_textVarListenerHandle
Reactive text-var invalidation listener state.
static bool GetPluginActionButtonVisible(const wxString &aPluginPath, bool aPluginDefault)
Return true if button visibility action plugin setting was set to true or it is unset and plugin defa...
void OnEditItemRequest(BOARD_ITEM *aItem) override
Install the corresponding dialog editor for the given item.
Definition edit.cpp:95
void SelectViaStack_Event(wxCommandEvent &event)
Handle the via stack preset selector on the auxiliary toolbar.
void SetLastPath(LAST_PATH_TYPE aType, const wxString &aLastPath)
Set the path of the last file successfully read.
bool interactiveOperationInProgress() const
Return true when an interactive tool operation (routing, dragging, point editing, zone filling,...
int m_crossProbeFlashPhase
Phase counter.
void FindNext(bool reverse=false)
Find the next item using our existing search parameters.
void ResolveDRCExclusions(bool aCreateMarkers)
If aCreateMarkers then create DRC exclusion markers from the serialized data.
void SetBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr) override
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
void SetActiveLayer(PCB_LAYER_ID aLayer) override
Change the currently active layer to aLayer and also update the APPEARANCE_CONTROLS.
void OnModify() override
Must be called after a board change to set the modified flag.
void ThemeChanged() override
Called when light/dark theme is changed.
void SwitchLayer(PCB_LAYER_ID layer) override
Change the active layer in the editor.
Definition edit.cpp:68
wxTimer m_crossProbeFlashTimer
Timer to toggle selection visibility for flash.
void StartCrossProbeFlash(const std::vector< BOARD_ITEM * > &aItems)
void OnCrossProbeFlashTimer(wxTimerEvent &aEvent)
std::unique_ptr< API_HANDLER_PCB > m_apiHandler
bool CloseFootprintFieldsTableDialog()
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
DIALOG_FOOTPRINT_FIELDS_TABLE * m_footprintFieldsTableDialog
void UpdateVariantSelectionCtrl()
Update the variant selection dropdown with the current board's variant names.
bool DoAutoSave()
Perform auto save when the board has been modified and not saved within the auto save interval.
void SetElementVisibility(GAL_LAYER_ID aElement, bool aNewState)
Change the visibility of an element category.
DIALOG_BOOK_REPORTER * m_inspectDrcErrorDlg
void OnClearFileHistory(wxCommandEvent &aEvent)
std::unique_ptr< GRID_HELPER > MakeGridHelper() override
virtual ~PCB_EDIT_FRAME()
void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType) override
Switch currently used canvas (Cairo / OpenGL).
void CommonSettingsChanged(int aFlags) override
Called after the preferences dialog is run.
void ShowFindByPropertiesDialog()
Show the Find by Properties dialog.
BOARD_ITEM_CONTAINER * GetModel() const override
DIALOG_BOOK_REPORTER * GetInspectDrcErrorDialog()
void ShowTargetOptionsDialog(PCB_TARGET *aTarget)
void ShowBoardSetupDialog(const wxString &aInitialPage=wxEmptyString, wxWindow *aParent=nullptr)
DIALOG_FOOTPRINT_FIELDS_TABLE * GetFootprintFieldsTableDialog()
DIALOG_FIND * m_findDialog
DIALOG_BOOK_REPORTER * m_inspectConstraintsDlg
void SetPageSettings(const PAGE_INFO &aPageSettings) override
void onCloseFootprintFieldsTableDialog(wxCommandEvent &aEvent)
bool IsElementVisible(GAL_LAYER_ID aElement) const
Test whether a given element category is visible.
bool CanAcceptApiCommands() override
Check if this frame is ready to accept API commands.
void UpdateUserInterface()
Update the layer manager and other widgets from the board setup (layer and items visibility,...
void SetGridColor(const COLOR4D &aColor) override
void ProjectChanged() override
Notification event that the project has changed.
static const wxString ConstraintsPaneName()
wxString GetLastPath(LAST_PATH_TYPE aType)
Get the last path for a particular type.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
void doCloseWindow() override
WX_INFOBAR * m_loadNoticeInfoBar
Secondary infobar that stacks above the main one; reserved for load-time notices (currently the WRL -...
void ReCreateLayerBox(bool aForceResizeToolbar=true)
Recreate the layer box by clearing the old list and building a new one from the new layer names and c...
void SaveProjectLocalSettings() override
Save changes to the project local settings.
static std::vector< const PLUGIN_ACTION * > GetOrderedPluginActions()
Return ordered list of plugins in sequence in which they should appear on toolbar or in settings.
void detachTextVarTracker()
Drop every cached reference into the current BOARD's text-var tracker.
void onPluginAvailabilityChanged(wxCommandEvent &aEvt)
void PrepareLayerIndicator(bool aForceRebuild=false)
void ShowFindDialog()
Show the Find dialog.
void onSize(wxSizeEvent &aEvent)
int ShowExchangeFootprintsDialog(FOOTPRINT *aFootprint, bool aUpdateMode, bool aSelectedMode)
int TestStandalone()
Test if standalone mode.
void ShowFootprintPropertiesDialog(FOOTPRINT *aFootprint)
void UpdateProperties() override
bool canRunAutoSave() const override
Return true when it is safe to run an autosave snapshot right now.
PANEL_CONSTRAINTS * m_constraintsPanel
Dockable geometric-constraint list (#2329).
bool IsContentModified() const override
Get if the current board has been modified but not saved.
bool Clear_Pcb(bool doAskAboutUnsavedChanges, bool aFinal=false)
Delete all and reinitialize the current board.
Definition initpcb.cpp:38
bool m_crossProbeFlashing
Currently flashing guard.
TOOL_ACTION * m_exportNetlistAction
The export board netlist tool action object.
void OnBoardLoaded()
Update the state of the GUI after a new board is loaded or created.
void ReCreateAuxiliaryToolbar() override
void Edit_Zone_Params(ZONE *zone_container)
Edit params (layer, clearance, ...) for a zone outline.
bool FetchNetlistFromSchematic(NETLIST &aNetlist, const wxString &aAnnotateMessage)
wxString GetCurrentFileName() const override
Get the full filename + path of the currently opened file in the frame.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
DIALOG_BOOK_REPORTER * GetFootprintDiffDialog()
EDA_ANGLE GetRotationAngle() const override
Return the angle used for rotate operations.
void ToggleConstraintsPanel()
Show/hide the dockable geometric-constraint list pane, refreshing it when shown (#2329).
COLOR4D GetGridColor() override
std::vector< KIID > m_crossProbeFlashItems
Items to flash (by UUID)
void UpdateTitle()
Set the main window title bar text.
void RefreshDrillSymbols(int aUpdateFlags) override
Tell every hole to redraw its drill symbol.
DIALOG_BOOK_REPORTER * m_footprintDiffDlg
void ActivateGalCanvas() override
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
void onVariantSelected(wxCommandEvent &aEvent)
Event handler for variant selection changes in the toolbar.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
void OnQuit(wxCommandEvent &event)
void NotifyFindByPropertiesDialog()
Notify the Find by Properties dialog that the selection has changed.
void onCloseModelessBookReporterDialogs(wxCommandEvent &aEvent)
PCB_DESIGN_BLOCK_PANE * m_designBlocksPane
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
DIALOG_BOARD_SETUP * m_boardSetupDlg
DIALOG_BOOK_REPORTER * GetInspectClearanceDialog()
wxTimer * m_eventCounterTimer
void Tracks_and_Vias_Size_Event(wxCommandEvent &event)
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
static const wxString SearchPaneName()
DIALOG_FIND_BY_PROPERTIES * m_findByPropertiesDialog
DIALOG_BOOK_REPORTER * m_inspectClearanceDlg
void OnFileHistory(wxCommandEvent &event)
DIALOG_BOOK_REPORTER * GetInspectConstraintsDialog()
class TEXT_VAR_TRACKER * m_textVarListenerTracker
A set of BOARD_ITEMs (i.e., without duplicates).
Definition pcb_group.h:51
PCB net inspection panel.
Generic tool for picking an item.
Tool that displays edit points allowing to modify items by dragging the points.
PCB_LAYER_ID m_Route_Layer_TOP
Definition pcb_screen.h:39
PCB_LAYER_ID m_Route_Layer_BOTTOM
Definition pcb_screen.h:40
static bool HasUnlockedItems(const SELECTION &aSelection)
Test if any selected items are unlocked.
static bool HasLockedItems(const SELECTION &aSelection)
Test if any selected items are locked.
The selection tool: currently supports:
int ClearSelection(const TOOL_EVENT &aEvent)
void FindItem(BOARD_ITEM *aItem)
Take necessary actions to mark an item as found.
Tool useful for viewing footprints.
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:546
KICAD_API_SERVER & GetApiServer()
Definition pgm_base.h:141
virtual const wxString & GetExecutablePath() const
Definition pgm_base.cpp:872
The interactive edit tool.
void Show(std::ostream &aStream=std::cerr)
Definition profile.h:284
void Reset()
Definition profile.h:274
A progress reporter interface for use in multi-threaded environments.
The backing store for a PROJECT, in JSON format.
std::vector< LAYER_PAIR_INFO > m_LayerPairInfos
List of stored 3D viewports (view matrixes)
The project local settings are things that are attached to a particular project, but also might be pa...
wxString m_ActiveLayerPreset
The name of a LAYER_PRESET that is currently activated (or blank if none)
PCB_LAYER_ID m_ActiveLayer
The current (active) board layer for editing.
static FOOTPRINT_LIBRARY_ADAPTER * FootprintLibAdapter(PROJECT *aProject)
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition project.cpp:183
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
Definition project.h:207
void IncrementNetclassesTicker()
Definition project.h:115
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:201
void IncrementTextVarsTicker()
Definition project.h:112
Action handler for the Properties panel.
PNS::PNS_MODE GetRouterMode()
bool RoutingInProgress()
Returns whether routing is currently active.
static SELECTION_CONDITION HasTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if among the selected items there is at least one of a given types.
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 SELECTION_CONDITION Count(int aNumber)
Create a functor that tests if the number of selected items is equal to the value given as parameter.
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
static SELECTION_CONDITION OnlyTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if the selected items are only of given types.
int AddItemToSel(const TOOL_EVENT &aEvent)
EDA_ITEM * Front() const
Definition selection.h:176
int Size() const
Returns the number of selected parts.
Definition selection.h:120
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition richio.h:225
Coordinates the dependency index with change notifications.
ListenerHandle AddInvalidateListener(InvalidateCallback aCallback)
Register a listener that fires for every invalidation.
static constexpr ListenerHandle INVALID_LISTENER
TOOL_MANAGER * m_toolManager
TOOL_DISPATCHER * m_toolDispatcher
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
ACTIONS * m_actions
Represent a single user action.
Base abstract interface for all kinds of tools.
Definition tool_base.h:62
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition tool_base.h:76
Generic, UI-independent tool event.
Definition tool_event.h:167
void SetHasPosition(bool aHasPosition)
Definition tool_event.h:257
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.
TOOL_BASE * GetCurrentTool() const
Return the tool that is on the top of the active tools stack (was invoked the most recently).
Tool that owns actions specific to via-stitch generators.
A modified version of the wxInfoBar class that allows us to:
Definition wx_infobar.h:76
Handle actions specific to filling copper zones.
PROGRESS_REPORTER * GetProgressReporter()
A type-safe container of any type.
Definition ki_any.h:92
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:146
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:217
int GetLastUnsavedChangesResponse()
Return the result code from the last call to HandleUnsavedChanges(): wxID_YES, wxID_NO or wxID_CANCEL...
Definition confirm.cpp:159
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define DIALOG_DRC_WINDOW_NAME
Definition dialog_drc.h:40
#define DIALOG_DRC_RULE_EDITOR_WINDOW_NAME
#define _(s)
Declaration of the eda_3d_viewer class.
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:424
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define PCB_EDIT_FRAME_NAME
static const std::vector< KICAD_T > footprintTypes
static const std::vector< KICAD_T > groupTypes
static const std::vector< KICAD_T > trackTypes
EVT_MENU_RANGE(ID_GERBVIEW_DRILL_FILE1, ID_GERBVIEW_DRILL_FILEMAX, GERBVIEW_FRAME::OnDrlFileHistory) EVT_MENU_RANGE(ID_GERBVIEW_ZIP_FILE1
#define CURRENT_EDIT_TOOL(action)
Collection of reusable/testable functions for footprint manipulation.
@ FRAME_PCB_EDITOR
Definition frame_type.h:38
@ FRAME_FOOTPRINT_VIEWER
Definition frame_type.h:41
@ FRAME_SCH
Definition frame_type.h:30
@ FRAME_FOOTPRINT_CHOOSER
Definition frame_type.h:40
@ FRAME_FOOTPRINT_EDITOR
Definition frame_type.h:39
a few functions useful in geometry calculations.
static const std::string LegacySchematicFileExtension
static const std::string LegacyPcbFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string SVGFileExtension
static const std::string KiCadPcbFileExtension
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
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:33
@ ID_ON_GRID_SELECT
Definition id.h:113
@ ID_FILE_LIST_CLEAR
Definition id.h:58
@ 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:56
@ ID_FILE1
Definition id.h:55
PROJECT & Prj()
Definition kicad.cpp:727
EVT_MENU(ID_COMPARE_PROJECT_BRANCHES, KICAD_MANAGER_FRAME::OnCompareProjectBranches) KICAD_MANAGER_FRAME
int GetNetnameLayer(int aLayer)
Return a netname layer corresponding to the given layer.
Definition layer_ids.h:880
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition layer_ids.h:703
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
Definition layer_ids.h:224
@ LAYER_GRID
Definition layer_ids.h:250
@ LAYER_ZONES
Control for copper zone opacity/visibility (color ignored).
Definition layer_ids.h:291
@ LAYER_RATSNEST
Definition layer_ids.h:249
#define CLEARANCE_LAYER_FOR(boardLayer)
Definition layer_ids.h:390
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ F_Paste
Definition layer_ids.h:100
@ B_Mask
Definition layer_ids.h:94
@ B_Cu
Definition layer_ids.h:61
@ F_Mask
Definition layer_ids.h:93
@ B_Paste
Definition layer_ids.h:101
@ UNDEFINED_LAYER
Definition layer_ids.h:57
@ F_Cu
Definition layer_ids.h:60
@ MAIL_SCH_GET_NETLIST
Definition mail_type.h:45
#define MAIL_SCH_GET_NETLIST_CANCELLED
Reply payload for MAIL_SCH_GET_NETLIST when the user deliberately aborts netlist generation (for exam...
Definition mail_type.h:67
@ REPAINT
Item needs to be redrawn.
Definition view_item.h:54
@ GEOMETRY
Position or shape has changed.
Definition view_item.h:51
@ ALL
All except INITIAL_ADD.
Definition view_item.h:55
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
Definition definitions.h:34
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition unix/app.cpp:102
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition unix/app.cpp:91
@ RM_MarkObstacles
Ignore collisions, mark obstacles.
@ RM_Walkaround
Only walk around.
@ RM_Shove
Only shove.
#define _HKI(x)
Definition page_info.cpp:40
BARCODE class definition.
void RefreshDrillCharts(BOARD &aBoard)
Bring every chart on the board up to date.
wxDEFINE_EVENT(EDA_EVT_PCB_LAST_SCH_SHEET_CHANGED, wxCommandEvent)
#define FOOTPRINT_DIFF_DIALOG_NAME
EVT_MENU_RANGE(ID_POPUP_PCB_SELECT_WIDTH_START_RANGE, ID_POPUP_PCB_SELECT_WIDTH_END_RANGE, PCB_EDIT_FRAME::Tracks_and_Vias_Size_Event) EVT_UPDATE_UI_RANGE(ID_POPUP_PCB_SELECT_WIDTH1
ID_POPUP_PCB_SELECT_WIDTH8
#define INSPECT_CLEARANCE_DIALOG_NAME
PCB_EDIT_FRAME::OnUpdateSelectTrackWidth EVT_UPDATE_UI_RANGE(ID_POPUP_PCB_SELECT_VIASIZE1, ID_POPUP_PCB_SELECT_VIASIZE8, PCB_EDIT_FRAME::OnUpdateSelectViaSize) PCB_EDIT_FRAME
#define INSPECT_DRC_ERROR_DIALOG_NAME
#define INSPECT_CONSTRAINTS_DIALOG_NAME
@ ID_POPUP_PCB_SELECT_WIDTH_START_RANGE
Definition pcbnew_id.h:21
@ ID_POPUP_PCB_SELECT_WIDTH1
Definition pcbnew_id.h:25
@ ID_POPUP_PCB_SELECT_VIASIZE8
Definition pcbnew_id.h:48
@ ID_AUX_TOOLBAR_PCB_VARIANT_SELECT
Definition pcbnew_id.h:20
@ ID_AUX_TOOLBAR_PCB_VIA_SIZE
Definition pcbnew_id.h:17
@ ID_POPUP_PCB_SELECT_WIDTH_END_RANGE
Definition pcbnew_id.h:78
@ ID_POPUP_PCB_SELECT_VIASIZE1
Definition pcbnew_id.h:41
@ ID_AUX_TOOLBAR_PCB_VIA_STACK
Definition pcbnew_id.h:19
@ ID_AUX_TOOLBAR_PCB_TRACK_WIDTH
Definition pcbnew_id.h:18
@ SHOW_WITH_VIA_ALWAYS
PGM_BASE & Pgm()
The global program "get" accessor.
see class PGM_BASE
LAST_PATH_TYPE
For storing PcbNew MRU paths of various types.
@ RPT_SEVERITY_EXCLUSION
#define SKIP_SET_DIRTY
Definition sch_commit.h:40
#define SKIP_UNDO
Definition sch_commit.h:38
#define CURRENT_TOOL(action)
std::function< bool(const SELECTION &)> SELECTION_CONDITION
Functor type that checks a specific condition for selected items.
T * GetToolbarSettings(const wxString &aFilename)
T * GetAppSettings(const char *aFilename)
KIWAY Kiway(KFCTL_STANDALONE)
wxString UnescapeString(const wxString &aSource)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
A min-max version of BOX2 for fast intersection checking.
Definition box2_minmax.h:33
bool Intersects(const BOX2I_MINMAX &aOther) const
Definition box2_minmax.h:69
A filename or source description, a problem input line, a line number, a byte offset,...
TRACK_CLEARANCE_MODE m_TrackClearance
Identifies a single resolvable source that a text item's ${...} reference depends on.
else
IbisParser parser & reporter
@ AS_GLOBAL
Global action (toolbar/main menu event, global shortcut)
Definition tool_action.h:45
@ AS_ACTIVE
All active tools.
Definition tool_action.h:44
@ TA_MODEL_CHANGE
Model has changed (partial update).
Definition tool_event.h:117
@ TC_COMMAND
Definition tool_event.h:53
#define TEXTVARS_CHANGED
wxLogTrace helper definitions.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition typeinfo.h:80
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition typeinfo.h:98
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition typeinfo.h:95
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
Definition typeinfo.h:83
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition typeinfo.h:89
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition typeinfo.h:96
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition typeinfo.h:103
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition typeinfo.h:85
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition typeinfo.h:100
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition typeinfo.h:84
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
Definition typeinfo.h:81
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition typeinfo.h:82
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
Definition typeinfo.h:91
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
Definition typeinfo.h:93
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
Definition typeinfo.h:99
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:78
@ PCB_GRID_ITEM_T
a subgrid placed on a board
Definition typeinfo.h:238
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition typeinfo.h:94
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition typeinfo.h:79
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition typeinfo.h:90
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
Definition typeinfo.h:86
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
Definition typeinfo.h:105
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition typeinfo.h:88
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition typeinfo.h:97
@ PCB_DRILL_CHART_T
class PCB_DRILL_CHART, a live drill chart derived from PCB_TABLE
Definition typeinfo.h:239
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.
WX_VIEW_CONTROLS class definition.