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>
73#include <pcb_drill_chart.h>
74#include <pcb_drill_map.h>
79#include <pad.h>
80#include <pcb_target.h>
81#include <pcb_point.h>
82#include <pcb_track.h>
83#include <layer_pairs.h>
86#include <text_var_dependency.h>
87#include <view/view.h>
89#include <functional>
90#include <pcb_barcode.h>
91#include <pcb_grid_item.h>
92#include <pcb_painter.h>
97#include <local_history.h>
98#include <tool/tool_manager.h>
100#include <tool/action_toolbar.h>
101#include <tool/common_control.h>
102#include <tool/common_tools.h>
103#include <tool/embed_tool.h>
104#include <tool/properties_tool.h>
105#include <tool/selection.h>
106#include <tool/zoom_tool.h>
107#include <tools/array_tool.h>
112#include <tools/edit_tool.h>
114#include <tools/pcb_group_tool.h>
115#include <tools/generator_tool.h>
118#include <tools/drc_tool.h>
121#include <tools/convert_tool.h>
123#include <tools/drawing_tool.h>
124#include <tools/pcb_control.h>
132#include <tools/pad_tool.h>
134#include <properties/property.h>
141#include <router/router_tool.h>
144#include <dialog_drc.h> // for DIALOG_DRC_WINDOW_NAME definition
150#include <widgets/wx_infobar.h>
155#include <widgets/wx_aui_utils.h>
156#include <kiplatform/app.h>
157#include <kiplatform/ui.h>
158#include <core/profile.h>
159#include <math/box2_minmax.h>
163#include <toolbars_pcb_editor.h>
165
166#include <richio.h>
167
168using namespace std::placeholders;
169
170wxDEFINE_EVENT( EDA_EVT_PCB_LAST_SCH_SHEET_CHANGED, wxCommandEvent );
171
172
173#define INSPECT_DRC_ERROR_DIALOG_NAME wxT( "InspectDrcErrorDialog" )
174#define INSPECT_CLEARANCE_DIALOG_NAME wxT( "InspectClearanceDialog" )
175#define INSPECT_CONSTRAINTS_DIALOG_NAME wxT( "InspectConstraintsDialog" )
176#define FOOTPRINT_DIFF_DIALOG_NAME wxT( "FootprintDiffDialog" )
177
178
179BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME )
182
185
186 EVT_SIZE( PCB_EDIT_FRAME::OnSize )
187
188 // Menu Files:
191
192 EVT_MENU( wxID_EXIT, PCB_EDIT_FRAME::OnQuit )
193 EVT_MENU( wxID_CLOSE, PCB_EDIT_FRAME::OnQuit )
194
195 // Horizontal toolbar
200
201 // Tracks and vias sizes general options
203 PCB_EDIT_FRAME::Tracks_and_Vias_Size_Event )
204
205 // User interface update event handlers.
206 EVT_UPDATE_UI( ID_AUX_TOOLBAR_PCB_TRACK_WIDTH, PCB_EDIT_FRAME::OnUpdateSelectTrackWidth )
207 EVT_UPDATE_UI( ID_AUX_TOOLBAR_PCB_VIA_SIZE, PCB_EDIT_FRAME::OnUpdateSelectViaSize )
209 PCB_EDIT_FRAME::OnUpdateSelectTrackWidth )
211 PCB_EDIT_FRAME::OnUpdateSelectViaSize )
212 // Drop files event
213 EVT_DROP_FILES( PCB_EDIT_FRAME::OnDropFiles )
214END_EVENT_TABLE()
215
216
217PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
218 PCB_BASE_EDIT_FRAME( aKiway, aParent, FRAME_PCB_EDITOR, _( "PCB Editor" ), wxDefaultPosition, wxDefaultSize,
220 m_exportNetlistAction( nullptr ),
221 m_findDialog( nullptr ),
222 m_findByPropertiesDialog( nullptr ),
223 m_inspectDrcErrorDlg( nullptr ),
224 m_inspectClearanceDlg( nullptr ),
225 m_inspectConstraintsDlg( nullptr ),
226 m_footprintDiffDlg( nullptr ),
227 m_boardSetupDlg( nullptr ),
228 m_footprintFieldsTableDialog( nullptr ),
229 m_designBlocksPane( nullptr ),
230 m_importProperties( nullptr ),
231 m_eventCounterTimer( nullptr )
232{
233 m_maximizeByDefault = true;
234 m_showBorderAndTitleBlock = true; // true to display sheet references
235 m_SelTrackWidthBox = nullptr;
236 m_SelViaSizeBox = nullptr;
237 m_SelViaStackBox = nullptr;
238 m_CurrentVariantCtrl = nullptr;
239 m_ShowLayerManagerTools = true;
240 m_supportsAutoSave = true;
241 m_ProbingSchToPcb = false;
242 m_ShowSearch = false;
243 m_ShowNetInspector = false;
244 // Ensure timer has an owner before binding so it generates events.
245 m_crossProbeFlashTimer.SetOwner( this );
246 Bind( wxEVT_TIMER, &PCB_EDIT_FRAME::OnCrossProbeFlashTimer, this, m_crossProbeFlashTimer.GetId() );
247
248 // We don't know what state board was in when it was last saved, so we have to
249 // assume dirty
250 m_ZoneFillsDirty = true;
251
252 m_aboutTitle = _HKI( "KiCad PCB Editor" );
253
254 // Must be created before the menus are created.
255 if( ADVANCED_CFG::GetCfg().m_ShowPcbnewExportNetlist )
256 {
257 m_exportNetlistAction = new TOOL_ACTION( "pcbnew.EditorControl.exportNetlist",
258 AS_GLOBAL, 0, "", _( "Netlist..." ),
259 _( "Export netlist used to update schematics" ) );
260 }
261
262 // Create GAL canvas
263 PCB_DRAW_PANEL_GAL* canvas = new PCB_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
264 GetGalDisplayOptions(),
266
267 SetCanvas( canvas );
268 SetBoard( new BOARD() );
269
270 wxIcon icon;
271 wxIconBundle icon_bundle;
272
273 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 48 ) );
274 icon_bundle.AddIcon( icon );
275 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 128 ) );
276 icon_bundle.AddIcon( icon );
277 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 256 ) );
278 icon_bundle.AddIcon( icon );
279 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew_32 ) );
280 icon_bundle.AddIcon( icon );
281 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew_16 ) );
282 icon_bundle.AddIcon( icon );
283
284 SetIcons( icon_bundle );
285
286 // LoadSettings() *after* creating m_LayersManager, because LoadSettings()
287 // initialize parameters in m_LayersManager
288 LoadSettings( config() );
289
290 SetScreen( new PCB_SCREEN( GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS ) ) );
291
292 // PCB drawings start in the upper left corner.
293 GetScreen()->m_Center = false;
294
295 setupTools();
296 setupUIConditions();
297
298 m_toolbarSettings = GetToolbarSettings<PCB_EDIT_TOOLBAR_SETTINGS>( "pcbnew-toolbars" );
299 configureToolbars();
300 RecreateToolbars();
301 PrepareLayerIndicator( true );
302
303 ReCreateMenuBar();
304
307
308 // Fetch a COPY of the config as a lot of these initializations are going to overwrite our
309 // data.
310 PCBNEW_SETTINGS::AUI_PANELS aui_cfg = GetPcbNewSettings()->m_AuiPanels;
311
312 m_propertiesPanel = new PCB_PROPERTIES_PANEL( this, this );
313 m_propertiesPanel->SetSplitterProportion( aui_cfg.properties_splitter );
314
315 m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this );
316
317 m_appearancePanel = new APPEARANCE_CONTROLS( this, GetCanvas() );
318 m_searchPane = new PCB_SEARCH_PANE( this );
319 m_netInspectorPanel = new PCB_NET_INSPECTOR_PANEL( this, this );
320 m_designBlocksPane = new PCB_DESIGN_BLOCK_PANE( this, nullptr, m_designBlockHistoryList );
321 m_constraintsPanel = new PANEL_CONSTRAINTS( this );
322 m_gitCommitPane = new GIT_COMMIT_PANE( this );
323
324 m_auimgr.SetManagedWindow( this );
325
326 CreateInfoBar();
327
328 // Secondary infobar stacked above the main one. Load-time notices (such as
329 // the WRL -> STEP migration prompt) belong here so they aren't clobbered by
330 // the main infobar's read-only warnings, DRC rule errors, etc.
331 m_loadNoticeInfoBar = new WX_INFOBAR( GetToolCanvas(), wxID_ANY, true );
332
333 unsigned int auiFlags = wxAUI_MGR_DEFAULT;
334#if !defined( _WIN32 )
335 // Windows cannot redraw the UI fast enough during a live resize and may lead to all kinds
336 // of graphical glitches.
337 auiFlags |= wxAUI_MGR_LIVE_RESIZE;
338#endif
339 m_auimgr.SetFlags( auiFlags );
340
341 // Rows; layers 4 - 6
342 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) )
343 .Top().Layer( 6 ) );
344 m_auimgr.AddPane( m_tbTopAux, EDA_PANE().HToolbar().Name( wxS( "TopAuxToolbar" ) )
345 .Top().Layer( 5 ) );
346 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) )
347 .Bottom().Layer( 6 ) );
348
349 // Columns; layers 1 - 3
350 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( wxS( "LeftToolbar" ) )
351 .Left().Layer( 3 ) );
352
353 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( wxS( "RightToolbar" ) )
354 .Right().Layer( 3 ) );
355
356 m_auimgr.AddPane( m_appearancePanel, EDA_PANE().Name( wxS( "LayersManager" ) )
357 .Right().Layer( 4 )
358 .Caption( _( "Appearance" ) ).PaneBorder( false )
359 // Don't use -1 for don't-change-height on a growable panel; it has side-effects.
360 .MinSize( m_appearancePanel->GetMinSize().x, FromDIP( 60 ) )
361#ifdef __WXMAC__
362 // Best size for this pane is calculated larger than necessary on wxMac
363 .BestSize( m_appearancePanel->GetMinSize().x, -1 )
364#else
365 .BestSize( m_appearancePanel->GetBestSize().x, -1 )
366#endif
367 .FloatingSize( m_appearancePanel->GetBestSize() )
368 .CloseButton( false ) );
369
370 m_auimgr.AddPane( m_selectionFilterPanel, EDA_PANE().Name( wxS( "SelectionFilter" ) )
371 .Right().Layer( 4 ).Position( 2 )
372 .Caption( _( "Selection Filter" ) ).PaneBorder( false )
373 // Fixed-size pane; -1 for MinSize height is required
374 .MinSize( m_selectionFilterPanel->GetMinSize().x, -1 )
375 .BestSize( m_selectionFilterPanel->GetBestSize().x, -1 )
376 .FloatingSize( m_selectionFilterPanel->GetBestSize() )
377 .CloseButton( false ) );
378
379 m_auimgr.AddPane( m_designBlocksPane, EDA_PANE().Name( DesignBlocksPaneName() )
380 .Right().Layer( 5 )
381 .Caption( _( "Design Blocks" ) )
382 .CaptionVisible( true )
383 .PaneBorder( true )
384 .TopDockable( false )
385 .BottomDockable( false )
386 .CloseButton( true )
387 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
388 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
389 .FloatingSize( FromDIP( wxSize( 800, 600 ) ) )
390 .FloatingPosition( FromDIP( wxPoint( 50, 200 ) ) )
391 .Show( true ) );
392
393 m_auimgr.AddPane( m_propertiesPanel, EDA_PANE().Name( PropertiesPaneName() )
394 .Left().Layer( 5 )
395 .Caption( _( "Properties" ) ).PaneBorder( false )
396 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
397 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
398 .FloatingSize( wxSize( 300, 200 ) )
399 .CloseButton( true ) );
400
401 // Center
402 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
403 .Center() );
404
405 m_auimgr.AddPane( m_netInspectorPanel, EDA_PANE().Name( NetInspectorPanelName() )
406 .Bottom()
407 .Caption( _( "Net Inspector" ) )
408 .PaneBorder( false )
409 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
410 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
411 .FloatingSize( wxSize( 300, 200 ) )
412 .CloseButton( true ) );
413
414 m_auimgr.AddPane( m_searchPane, EDA_PANE().Name( SearchPaneName() )
415 .Bottom()
416 .Caption( _( "Search" ) ).PaneBorder( false )
417 .MinSize( FromDIP( wxSize ( 180, 60 ) ) )
418 .BestSize( FromDIP( wxSize ( 180, 100 ) ) )
419 .FloatingSize( FromDIP( wxSize( 480, 200 ) ) )
420 .DestroyOnClose( false )
421 .CloseButton( true ) );
422
423 m_auimgr.AddPane( m_constraintsPanel, EDA_PANE().Name( ConstraintsPaneName() )
424 .Bottom().Layer( 1 )
425 .Caption( _( "Geometric Constraints" ) ).PaneBorder( false )
426 .MinSize( FromDIP( wxSize( 360, 120 ) ) )
427 .BestSize( FromDIP( wxSize( 600, 200 ) ) )
428 .FloatingSize( FromDIP( wxSize( 600, 240 ) ) )
429 .DestroyOnClose( false )
430 .CloseButton( true )
431 .Hide() );
432
433 m_auimgr.AddPane( m_gitCommitPane,
434 EDA_PANE()
435 .Name( GitCommitPaneName() )
436 .Right()
437 .Layer( 5 )
438 .Caption( _( "Version Control" ) )
439 .PaneBorder( false )
440 .MinSize( wxSize( m_gitCommitPane->GetMinDockWidth(), FromDIP( 120 ) ) )
441 .BestSize( wxSize( std::max( m_gitCommitPane->GetMinDockWidth(), FromDIP( 300 ) ),
442 FromDIP( 300 ) ) )
443 .FloatingSize( FromDIP( wxSize( 300, 400 ) ) )
444 .DestroyOnClose( false )
445 .CloseButton( true )
446 .Hide() );
447
448 RestoreAuiLayout();
449
450 // A saved layout brings its own minimum, so the one the panel needs is set again.
451 m_auimgr.GetPane( GitCommitPaneName() ).min_size.x = m_gitCommitPane->GetMinDockWidth();
452
453 m_auimgr.GetPane( "LayersManager" ).Show( m_ShowLayerManagerTools );
454 m_auimgr.GetPane( "SelectionFilter" ).Show( m_ShowLayerManagerTools );
455 m_auimgr.GetPane( PropertiesPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.show_properties );
456 m_auimgr.GetPane( NetInspectorPanelName() ).Show( m_ShowNetInspector );
457 m_auimgr.GetPane( SearchPaneName() ).Show( m_ShowSearch );
458 m_auimgr.GetPane( DesignBlocksPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.design_blocks_show );
459 m_auimgr.GetPane( GitCommitPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.show_git_commit_pane );
460
461 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
462
463 // The selection filter doesn't need to grow in the vertical direction when docked
464 selectionFilterPane.dock_proportion = 0;
465
466 // wx 3.3.3 turns a -1 min height into 1, and a legacy perspective restores one
467 selectionFilterPane.min_size.y = m_selectionFilterPanel->GetBestSize().y;
468 FinishAUIInitialization();
469
470 if( aui_cfg.right_panel_width > 0 )
471 {
472 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( wxS( "LayersManager" ) );
473 SetAuiPaneSize( m_auimgr, layersManager, aui_cfg.right_panel_width, -1 );
474
475 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
476 SetAuiPaneSize( m_auimgr, designBlocksPane, aui_cfg.design_blocks_panel_docked_width, -1 );
477 }
478
479 if( aui_cfg.properties_panel_width > 0 && m_propertiesPanel )
480 {
481 wxAuiPaneInfo& propertiesPanel = m_auimgr.GetPane( PropertiesPaneName() );
482 SetAuiPaneSize( m_auimgr, propertiesPanel, aui_cfg.properties_panel_width, -1 );
483 }
484
485 if( aui_cfg.search_panel_height > 0
486 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_TOP
487 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) )
488 {
489 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
490 searchPane.Direction( aui_cfg.search_panel_dock_direction );
491 SetAuiPaneSize( m_auimgr, searchPane, -1, aui_cfg.search_panel_height );
492 }
493 else if( aui_cfg.search_panel_width > 0
494 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_LEFT
495 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) )
496 {
497 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
498 searchPane.Direction( aui_cfg.search_panel_dock_direction );
499 SetAuiPaneSize( m_auimgr, searchPane, aui_cfg.search_panel_width, -1 );
500 }
501
502 m_appearancePanel->SetTabIndex( aui_cfg.appearance_panel_tab );
503
504 m_layerPairSettings = std::make_unique<LAYER_PAIR_SETTINGS>();
505
506 m_layerPairSettings->Bind( PCB_LAYER_PAIR_PRESETS_CHANGED,
507 [&]( wxCommandEvent& aEvt )
508 {
509 // Update the project file list
510 std::span<const LAYER_PAIR_INFO> newPairInfos = m_layerPairSettings->GetLayerPairs();
511 Prj().GetProjectFile().m_LayerPairInfos = std::vector<LAYER_PAIR_INFO>{ newPairInfos.begin(),
512 newPairInfos.end() };
513 } );
514
515 m_layerPairSettings->Bind( PCB_CURRENT_LAYER_PAIR_CHANGED,
516 [&]( wxCommandEvent& aEvt )
517 {
518 const LAYER_PAIR& layerPair = m_layerPairSettings->GetCurrentLayerPair();
519 PCB_SCREEN& screen = *GetScreen();
520
521 screen.m_Route_Layer_TOP = layerPair.GetLayerA();
522 screen.m_Route_Layer_BOTTOM = layerPair.GetLayerB();
523
524 // Update the toolbar icon
525 PrepareLayerIndicator();
526 } );
527
528 GetToolManager()->PostAction( ACTIONS::zoomFitScreen );
529
530 Bind( wxEVT_IDLE,
531 [this]( wxIdleEvent& aEvent )
532 {
533 BOX2D viewport = GetCanvas()->GetView()->GetViewport();
534
535 if( viewport != m_lastNetnamesViewport )
536 {
537 redrawNetnames();
538 m_lastNetnamesViewport = viewport;
539 m_lastNetnamesScale = GetCanvas()->GetView()->GetScale();
540 }
541
542 // Do not forget to pass the Idle event to other clients:
543 aEvent.Skip();
544 } );
545
546 setupUnits( config() );
547
548 // Ensure the DRC engine is initialized so that constraints can be resolved even before a
549 // board is loaded or saved
550 try
551 {
552 m_toolManager->GetTool<DRC_TOOL>()->GetDRCEngine()->InitEngine( wxFileName() );
553 }
554 catch( PARSE_ERROR& )
555 {
556 }
557
558 // Sync action plugins in case they changed since the last time the frame opened
559 GetToolManager()->RunAction( ACTIONS::pluginsReload );
560
561 m_apiHandler = std::make_unique<API_HANDLER_PCB>( this );
562 Pgm().GetApiServer().RegisterHandler( m_apiHandler.get() );
563
564 if( Kiface().IsSingle() )
565 {
566 m_apiHandlerCommon = std::make_unique<API_HANDLER_COMMON>();
567 Pgm().GetApiServer().RegisterHandler( m_apiHandlerCommon.get() );
568 m_apiLibrariesHandler = std::make_unique<API_HANDLER_LIBRARIES>( LIBRARY_TABLE_TYPE::DESIGN_BLOCK );
569 Pgm().GetApiServer().RegisterHandler( m_apiLibrariesHandler.get() );
570 }
571
572 resolveCanvasType();
573 ActivateGalCanvas();
574
575 // Default shutdown reason until a file is loaded
576 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New PCB file is unsaved" ) );
577
578 // disable Export STEP item if kicad2step does not exist
579 wxString strK2S = Pgm().GetExecutablePath();
580
581#ifdef __WXMAC__
582 if( strK2S.Find( wxT( "pcbnew.app" ) ) != wxNOT_FOUND )
583 {
584 // On macOS, we have standalone applications inside the main bundle, so we handle that here:
585 strK2S += wxT( "../../" );
586 }
587
588 strK2S += wxT( "Contents/MacOS/" );
589#endif
590
591 wxFileName appK2S( strK2S, wxT( "kicad2step" ) );
592
593#ifdef _WIN32
594 appK2S.SetExt( wxT( "exe" ) );
595#endif
596
597 // Ensure the window is on top
598 Raise();
599
600// if( !appK2S.FileExists() )
601 // GetMenuBar()->FindItem( ID_GEN_EXPORT_FILE_STEP )->Enable( false );
602
603 // AUI doesn't refresh properly on wxMac after changes in eb7dc6dd, so force it to
604#ifdef __WXMAC__
605 if( Kiface().IsSingle() )
606 {
607 CallAfter( [this]()
608 {
609 m_appearancePanel->OnBoardChanged();
610 } );
611 }
612#endif
613
614 // Register a call to update the toolbar sizes. It can't be done immediately because
615 // it seems to require some sizes calculated that aren't yet (at least on GTK).
616 CallAfter( [this]()
617 {
618 // Ensure the controls on the toolbars all are correctly sized
619 UpdateToolbarControlSizes();
620
621 // Update the angle snap mode toolbar button to reflect the current preference
622 GetToolManager()->RunAction( PCB_ACTIONS::angleSnapModeChanged );
623 } );
624
625 if( ADVANCED_CFG::GetCfg().m_ShowEventCounters )
626 {
627 m_eventCounterTimer = new wxTimer( this );
628
629 Bind( wxEVT_TIMER,
630 [&]( wxTimerEvent& aEvent )
631 {
632 GetCanvas()->m_PaintEventCounter->Show();
633 GetCanvas()->m_PaintEventCounter->Reset();
634
636 static_cast<KIGFX::WX_VIEW_CONTROLS*>( GetCanvas()->GetViewControls() );
639
640 },
641 m_eventCounterTimer->GetId() );
642
643 m_eventCounterTimer->Start( 1000 );
644 }
645
648 m_acceptedExts.emplace( wxS( "dxf" ), &PCB_ACTIONS::ddImportGraphics );
652 m_acceptedExts.emplace( wxS( "jpeg" ), &PCB_ACTIONS::ddPlaceReferenceImage );
653 DragAcceptFiles( true );
654
655 Bind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs, this );
656 Bind( EDA_EVT_CLOSE_DIALOG_FOOTPRINT_FIELDS_TABLE, &PCB_EDIT_FRAME::onCloseFootprintFieldsTableDialog, this );
657}
658
659
660void PCB_EDIT_FRAME::StartCrossProbeFlash( const std::vector<BOARD_ITEM*>& aItems )
661{
662 if( !GetPcbNewSettings()->m_CrossProbing.flash_selection )
663 {
664 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): aborted (setting disabled) items=%zu",
665 aItems.size() );
666 return;
667 }
668
669 if( aItems.empty() )
670 {
671 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): aborted (no items)" );
672 return;
673 }
674
675 // Don't start flashing if any of the items are being moved. The flash timer toggles
676 // selection hide/show which corrupts the VIEW overlay state during an active move.
677 for( const BOARD_ITEM* item : aItems )
678 {
679 if( item->IsMoving() )
680 {
681 wxLogTrace( traceCrossProbeFlash,
682 "StartCrossProbeFlash(PCB): aborted (items are moving)" );
683 return;
684 }
685 }
686
688 {
689 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): restarting existing flash (phase=%d)",
692 }
693
694 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): starting with %zu items", aItems.size() );
695
696 // Store uuids
698 for( BOARD_ITEM* it : aItems )
699 m_crossProbeFlashItems.push_back( it->m_Uuid );
700
703
704 if( !m_crossProbeFlashTimer.GetOwner() )
705 m_crossProbeFlashTimer.SetOwner( this );
706
707 // 0.5s intervals -> 3s total for 6 phases
708 [[maybe_unused]] bool started = m_crossProbeFlashTimer.Start( 500, wxTIMER_CONTINUOUS );
709 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): timer start=%d id=%d",
710 (int) started, m_crossProbeFlashTimer.GetId() );
711}
712
713
714void PCB_EDIT_FRAME::OnCrossProbeFlashTimer( wxTimerEvent& aEvent )
715{
716 wxLogTrace( traceCrossProbeFlash, "Timer(PCB) fired: phase=%d running=%d items=%zu",
718
720 {
721 wxLogTrace( traceCrossProbeFlash, "Timer(PCB) fired but not flashing (ignored)" );
722 return;
723 }
724
726
727 if( !selTool )
728 return;
729
730 // Don't manipulate the selection while items are being moved. The move tool holds a
731 // live reference to the selection and toggling hide/show on selected items corrupts
732 // the VIEW overlay state, causing crashes.
733 for( const KIID& id : m_crossProbeFlashItems )
734 {
735 if( EDA_ITEM* item = GetBoard()->ResolveItem( id, true ) )
736 {
737 if( item->IsMoving() )
738 {
739 wxLogTrace( traceCrossProbeFlash, "Timer(PCB) phase=%d: items are moving, stopping flash",
741 m_crossProbeFlashing = false;
743 return;
744 }
745 }
746 }
747
748 // Prevent recursion / IPC during flashing
749 bool prevGuard = m_ProbingSchToPcb;
750 m_ProbingSchToPcb = true;
751
752 if( m_crossProbeFlashPhase % 2 == 0 )
753 {
754 // Hide selection
755 selTool->ClearSelection( true );
756 wxLogTrace( traceCrossProbeFlash, "Phase %d (PCB): cleared selection", m_crossProbeFlashPhase );
757 }
758 else
759 {
760 // Restore selection
761 for( const KIID& id : m_crossProbeFlashItems )
762 {
763 if( EDA_ITEM* item = GetBoard()->ResolveItem( id, true ) )
764 selTool->AddItemToSel( item, true );
765 }
766
767 wxLogTrace( traceCrossProbeFlash, "Phase %d (PCB): restored %zu items",
769 }
770
771 // Force a redraw even if the canvas / frame does not currently have focus (mouse elsewhere)
772 if( GetCanvas() )
773 {
775 wxLogTrace( traceCrossProbeFlash, "Phase %d (PCB): forced canvas refresh", m_crossProbeFlashPhase );
776 }
777
778 m_ProbingSchToPcb = prevGuard;
779
781
782 if( m_crossProbeFlashPhase > 6 )
783 {
784 // Ensure final state (selected)
785 for( const KIID& id : m_crossProbeFlashItems )
786 {
787 if( EDA_ITEM* item = GetBoard()->ResolveItem( id, true ) )
788 selTool->AddItemToSel( item, true );
789 }
790
791 m_crossProbeFlashing = false;
793
794 wxLogTrace( traceCrossProbeFlash, "Flashing complete (PCB). Final selection size=%zu",
795 m_crossProbeFlashItems.size() );
796 }
797}
798
799
801{
802 // Always ensure that we are unregistered even in a close without graceful doCloseWindow()
803 if( GetBoard() )
805
806 // PCB_BASE_FRAME's dtor deletes m_pcb; canvas children outlive it. Drop
807 // every cached TEXT_VAR_TRACKER* before the tracker is freed.
809
810 if( Kiface().IsSingle() )
811 {
814 }
815
816 if( ADVANCED_CFG::GetCfg().m_ShowEventCounters )
817 {
818 // Stop the timer during destruction early to avoid potential event race conditions (that
819 // do happen on windows)
820 m_eventCounterTimer->Stop();
821 delete m_eventCounterTimer;
822 }
823
824 // Close modeless dialogs
825 wxWindow* drcDlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
826
827 if( drcDlg )
828 drcDlg->Close( true );
829
830 wxWindow* ruleEditorDlg = wxWindow::FindWindowByName( DIALOG_DRC_RULE_EDITOR_WINDOW_NAME );
831
832 if( ruleEditorDlg )
833 ruleEditorDlg->Close( true );
834
835 // Shutdown all running tools
836 if( m_toolManager )
837 m_toolManager->ShutdownAllTools();
838
839 if( GetBoard() )
841
842 // We passed ownership of these to wxAuiManager.
843 // delete m_selectionFilterPanel;
844 // delete m_appearancePanel;
845 // delete m_propertiesPanel;
846 // delete m_netInspectorPanel;
847
849}
850
851
853{
854 wxAuiPaneInfo& pane = m_auimgr.GetPane( ConstraintsPaneName() );
855
856 if( !pane.IsOk() )
857 return;
858
859 bool show = !pane.IsShown();
860 pane.Show( show );
861
862 if( show && m_constraintsPanel )
863 m_constraintsPanel->RefreshList();
864
865 m_auimgr.Update();
866}
867
868
870{
871 if( GetCanvas() )
872 {
873 if( DS_PROXY_VIEW_ITEM* sheet = GetCanvas()->GetDrawingSheet() )
874 sheet->AttachToTracker( nullptr );
875 }
876
878 {
879 m_textVarListenerTracker->RemoveInvalidateListener( m_textVarListenerHandle );
881 m_textVarListenerTracker = nullptr;
882 }
883}
884
885
886void PCB_EDIT_FRAME::SetBoard( BOARD* aBoard, bool aBuildConnectivity, PROGRESS_REPORTER* aReporter )
887{
888 // PCB_BASE_FRAME::SetBoard() deletes m_pcb; detach tracker consumers first.
889 if( m_pcb )
890 {
892 m_pcb->ClearProject();
894 }
895
896 PCB_BASE_EDIT_FRAME::SetBoard( aBoard, aReporter );
897
898 aBoard->SetProject( &Prj() );
899
900 if( aBuildConnectivity )
901 aBoard->BuildConnectivity();
902
903 // reload the drawing-sheet
904 SetPageSettings( aBoard->GetPageSettings() );
905
907}
908
909
914
915
916std::unique_ptr<GRID_HELPER> PCB_EDIT_FRAME::MakeGridHelper()
917{
918 return std::make_unique<PCB_GRID_HELPER>( m_toolManager, GetMagneticItemsSettings() );
919}
920
921
923{
924 /*
925 * While new items being scrolled into the view will get painted, they will only get
926 * annotated with netname instances currently within the view. Subsequent panning will not
927 * draw newly-visible netname instances because the item has already been drawn.
928 *
929 * This routine, fired on idle if the viewport has changed, looks for visible items that
930 * might have multiple netname instances and redraws them. (It does not need to handle pads
931 * and vias because they only ever have a single netname instance drawn on them.)
932 */
933 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() );
934
935 if( !cfg || cfg->m_Display.m_NetNames < 2 )
936 return;
937
938 KIGFX::VIEW* view = GetCanvas()->GetView();
939 BOX2D viewport = view->GetViewport();
940
941 view->SyncLayerVisibilityCache(); // Required for ViewGetLOD() calls.
942
943 if( view->GetGAL()->HasRetainedScene() )
944 {
945 // Labels sit on the visible part of their track. A track wholly inside both the old and new
946 // view keeps its label, so only the others are repainted, and only on net name layers.
947 const BOX2I before = BOX2ISafe( m_lastNetnamesViewport );
948 const BOX2I now = BOX2ISafe( viewport );
949 BOX2D reach = viewport;
950
951 view->RepaintLayers(
952 BOX2ISafe( reach.Inflate( pcbIUScale.mmToIU( 2.0 ) ) ),
953 []( int aLayer )
954 {
955 return IsNetnameLayer( aLayer );
956 },
957 [&]( KIGFX::VIEW_ITEM* aItem, int aLayer )
958 {
959 PCB_TRACK* track = dynamic_cast<PCB_TRACK*>( aItem );
960
961 if( !track || track->Type() == PCB_VIA_T )
962 return false;
963
964 const double lod = track->ViewGetLOD( aLayer, view );
965
966 const BOX2I bbox = track->GetBoundingBox();
967
968 if( lod < m_lastNetnamesScale && before.Contains( bbox ) && now.Contains( bbox ) )
969 return false;
970
971 return lod < view->GetScale();
972 } );
973
974 // Labels are laid out on idle after a zoom's last paint and would otherwise wait for
975 // whatever paints next
976 GetCanvas()->Refresh();
977 return;
978 }
979
980 // Inflate to catch most of the track width
981 BOX2I_MINMAX clipbox( BOX2ISafe( viewport.Inflate( pcbIUScale.mmToIU( 2.0 ) ) ) );
982
983 for( PCB_TRACK* track : GetBoard()->Tracks() )
984 {
985 // Don't need to update vias
986 if( track->Type() == PCB_VIA_T )
987 continue;
988
989 // Don't update invisible tracks
990 if( !clipbox.Intersects( BOX2I_MINMAX( track->GetStart(), track->GetEnd() ) ) )
991 continue;
992
993 if( track->ViewGetLOD( GetNetnameLayer( track->GetLayer() ), view ) < view->GetScale() )
994 view->Update( track, KIGFX::REPAINT );
995 }
996}
997
998
999void PCB_EDIT_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
1000{
1001 PCB_BASE_FRAME::SetPageSettings( aPageSettings );
1002
1003 // Prepare drawing-sheet template
1005 &m_pcb->GetPageSettings(),
1006 m_pcb->GetProject(),
1007 &m_pcb->GetTitleBlock(),
1008 &m_pcb->GetProperties() );
1009
1010 drawingSheet->SetSheetName( std::string( GetScreenDesc().mb_str() ) );
1011 drawingSheet->SetSheetPath( std::string( GetFullScreenDesc().mb_str() ) );
1012
1013 // A board is not like a schematic having a main page and sub sheets.
1014 // So for the drawing sheet, use only the first page option to display items
1015 drawingSheet->SetIsFirstPage( true );
1016
1017 BASE_SCREEN* screen = GetScreen();
1018
1019 if( screen != nullptr )
1020 {
1021 drawingSheet->SetPageNumber(TO_UTF8( screen->GetPageNumber() ) );
1022 drawingSheet->SetSheetCount( screen->GetPageCount() );
1023 }
1024
1025 if( BOARD* board = GetBoard() )
1026 {
1027 drawingSheet->SetFileName( TO_UTF8( board->GetFileName() ) );
1028 wxString currentVariant = board->GetCurrentVariant();
1029 wxString variantDesc = board->GetVariantDescription( currentVariant );
1030 drawingSheet->SetVariantName( TO_UTF8( currentVariant ) );
1031 drawingSheet->SetVariantDesc( TO_UTF8( variantDesc ) );
1032 }
1033
1034 // PCB_DRAW_PANEL_GAL takes ownership of the drawing-sheet
1035 GetCanvas()->SetDrawingSheet( drawingSheet );
1036
1037 // Reactive title-block repaint: register the proxy with the BOARD's
1038 // text-var tracker so source changes fan out to a repaint. The one-time
1039 // listener installation is idempotent; calling AddInvalidateListener
1040 // here each time would accumulate stale listeners across SetPageSettings
1041 // calls, which is why the listener check below is guarded.
1042 if( BOARD* board = GetBoard() )
1043 {
1044 if( BOARD_TEXT_VAR_ADAPTER* adapter = board->GetTextVarAdapter() )
1045 {
1046 TEXT_VAR_TRACKER* tracker = &adapter->Tracker();
1047
1048 drawingSheet->AttachToTracker( tracker );
1049
1050 // Project reload / board swap can point GetBoard() at a new
1051 // tracker; detach from the previous one first so we don't leak
1052 // a stale lambda that still captures `this`.
1053 if( m_textVarListenerTracker != tracker
1055 {
1056 m_textVarListenerTracker->RemoveInvalidateListener( m_textVarListenerHandle );
1058 m_textVarListenerTracker = nullptr;
1059 }
1060
1062 {
1063 KIGFX::VIEW* view = GetCanvas()->GetView();
1064 m_textVarListenerTracker = tracker;
1066 [this, view]( EDA_ITEM* aDep, const TEXT_VAR_REF_KEY& )
1067 {
1068 if( !aDep )
1069 return;
1070
1072
1073 if( aDep == current )
1074 {
1075 view->Update( current, KIGFX::REPAINT );
1076 return;
1077 }
1078
1079 if( aDep->IsBOARD_ITEM() )
1080 {
1081 if( PCB_TEXT* text = dynamic_cast<PCB_TEXT*>( aDep ) )
1082 {
1083 text->ClearRenderCache();
1084 text->ClearBoundingBoxCache();
1085 }
1086
1087 view->Update( aDep, KIGFX::GEOMETRY | KIGFX::REPAINT );
1088 }
1089 } );
1090 }
1091 }
1092 }
1093}
1094
1095
1097{
1098 return GetScreen() && GetScreen()->IsContentModified();
1099}
1100
1101
1103{
1104 return m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
1105}
1106
1107
1109{
1110 // Create the manager and dispatcher & route draw panel events to the dispatcher
1112 m_toolManager->SetEnvironment( m_pcb, GetCanvas()->GetView(),
1113 GetCanvas()->GetViewControls(), config(), this );
1114 m_actions = new PCB_ACTIONS();
1116
1117 // Register tools
1118 m_toolManager->RegisterTool( new COMMON_CONTROL );
1119 m_toolManager->RegisterTool( new COMMON_TOOLS );
1120 m_toolManager->RegisterTool( new PCB_SELECTION_TOOL );
1121 m_toolManager->RegisterTool( new ZOOM_TOOL );
1122 m_toolManager->RegisterTool( new PCB_PICKER_TOOL );
1123 m_toolManager->RegisterTool( new ROUTER_TOOL );
1124 m_toolManager->RegisterTool( new EDIT_TOOL );
1125 m_toolManager->RegisterTool( new PCB_EDIT_TABLE_TOOL );
1126 m_toolManager->RegisterTool( new GLOBAL_EDIT_TOOL );
1127 m_toolManager->RegisterTool( new PAD_TOOL );
1128 m_toolManager->RegisterTool( new DRAWING_TOOL );
1129 m_toolManager->RegisterTool( new PCB_POINT_EDITOR );
1130 m_toolManager->RegisterTool( new PCB_CONTROL );
1131 m_toolManager->RegisterTool( new PCB_DESIGN_BLOCK_CONTROL );
1132 m_toolManager->RegisterTool( new BOARD_EDITOR_CONTROL );
1133 m_toolManager->RegisterTool( new BOARD_INSPECTION_TOOL );
1134 m_toolManager->RegisterTool( new BOARD_REANNOTATE_TOOL );
1135 m_toolManager->RegisterTool( new ALIGN_DISTRIBUTE_TOOL );
1136 m_toolManager->RegisterTool( new MICROWAVE_TOOL );
1137 m_toolManager->RegisterTool( new POSITION_RELATIVE_TOOL );
1138 m_toolManager->RegisterTool( new ARRAY_TOOL );
1139 m_toolManager->RegisterTool( new ZONE_FILLER_TOOL );
1140 m_toolManager->RegisterTool( new AUTOPLACE_TOOL );
1141 m_toolManager->RegisterTool( new DRC_TOOL );
1142 m_toolManager->RegisterTool( new PCB_VIEWER_TOOLS );
1143 m_toolManager->RegisterTool( new CONVERT_TOOL );
1144 m_toolManager->RegisterTool( new PCB_GROUP_TOOL );
1145 m_toolManager->RegisterTool( new CONSTRAINT_EDIT_TOOL );
1146 m_toolManager->RegisterTool( new GENERATOR_TOOL );
1147 m_toolManager->RegisterTool( new VIA_STITCH_TOOL );
1148 m_toolManager->RegisterTool( new PROPERTIES_TOOL );
1149 m_toolManager->RegisterTool( new MULTICHANNEL_TOOL );
1150 m_toolManager->RegisterTool( new MATCH_PROPERTIES_TOOL );
1151 m_toolManager->RegisterTool( new GRAPHIC_EDIT_TOOL );
1152 m_toolManager->RegisterTool( new EMBED_TOOL );
1153 m_toolManager->RegisterTool( new DRC_RULE_EDITOR_TOOL );
1154 m_toolManager->RegisterTool( new DIFF_PHASE_SKEW_TOOL );
1155 m_toolManager->InitTools();
1156
1157 for( TOOL_BASE* tool : m_toolManager->Tools() )
1158 {
1159 if( PCB_TOOL_BASE* pcbTool = dynamic_cast<PCB_TOOL_BASE*>( tool ) )
1160 pcbTool->SetIsBoardEditor( true );
1161 }
1162
1163 // Run the selection tool, it is supposed to be always active
1164 m_toolManager->InvokeTool( "common.InteractiveSelection" );
1165}
1166
1167
1169{
1171
1172 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
1173 PCB_EDITOR_CONDITIONS cond( this );
1174
1175 auto undoCond =
1176 [ this ] (const SELECTION& aSel )
1177 {
1178 DRAWING_TOOL* drawingTool = m_toolManager->GetTool<DRAWING_TOOL>();
1179
1180 if( drawingTool && drawingTool->GetDrawingMode() != DRAWING_TOOL::MODE::NONE )
1181 return true;
1182
1183 ROUTER_TOOL* routerTool = m_toolManager->GetTool<ROUTER_TOOL>();
1184
1185 if( routerTool && routerTool->RoutingInProgress() )
1186 return true;
1187
1188 return GetUndoCommandCount() > 0;
1189 };
1190
1191 auto groupWithDesignBlockLink =
1192 [] ( const SELECTION& aSel )
1193 {
1194 if( aSel.Size() != 1 )
1195 return false;
1196
1197 if( aSel[0]->Type() != PCB_GROUP_T )
1198 return false;
1199
1200 PCB_GROUP* group = static_cast<PCB_GROUP*>( aSel.GetItem( 0 ) );
1201
1202 return group->HasDesignBlockLink();
1203 };
1204
1205 wxASSERT( mgr );
1206
1207#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
1208#define CHECK( x ) ACTION_CONDITIONS().Check( x )
1209// clang-format off
1210
1212 mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) );
1214
1218
1219 mgr->SetConditions( ACTIONS::cut, ENABLE( cond.HasItems() ) );
1220 mgr->SetConditions( ACTIONS::copy, ENABLE( cond.HasItems() ) );
1227
1228 // Keep immediate-mode dispatch alive while a tool is mid-edit on an empty board, where
1229 // HasItems() is still false but an item is under construction under the cursor.
1230 auto hasElements =
1231 [ this ] ( const SELECTION& aSel )
1232 {
1233 return GetBoard() &&
1234 ( !GetBoard()->IsEmpty() || !SELECTION_CONDITIONS::Idle( aSel ) );
1235 };
1236
1238 ENABLE( SELECTION_CONDITIONS::NotEmpty ).HotkeyEnable( hasElements ) );
1240 ENABLE( SELECTION_CONDITIONS::NotEmpty ).HotkeyEnable( hasElements ) );
1242 ENABLE( SELECTION_CONDITIONS::NotEmpty ).HotkeyEnable( hasElements ) );
1244 ENABLE( SELECTION_CONDITIONS::NotEmpty ).HotkeyEnable( hasElements ) );
1245
1246 static const std::vector<KICAD_T> groupTypes = { PCB_GROUP_T, PCB_GENERATOR_T };
1247
1252
1253 mgr->SetConditions( PCB_ACTIONS::placeLinkedDesignBlock, ENABLE( groupWithDesignBlockLink) );
1254 mgr->SetConditions( PCB_ACTIONS::saveToLinkedDesignBlock, ENABLE( groupWithDesignBlockLink) );
1255
1261
1262 auto enableZoneControlCondition =
1263 [this] ( const SELECTION& )
1264 {
1267 };
1268
1270 ENABLE( enableZoneControlCondition )
1273 ENABLE( enableZoneControlCondition )
1276 ENABLE( enableZoneControlCondition )
1279 ENABLE( enableZoneControlCondition )
1281
1283
1284 auto autoConstraintsCond =
1285 []( const SELECTION& )
1286 {
1288 return cfg && cfg->m_AutoConstraints;
1289 };
1290
1291 mgr->SetConditions( PCB_ACTIONS::toggleAutoConstraints, CHECK( autoConstraintsCond ) );
1292
1293 auto boardFlippedCond =
1294 [this]( const SELECTION& )
1295 {
1297 };
1298
1299 auto layerManagerCond =
1300 [this] ( const SELECTION& )
1301 {
1302 return LayerManagerShown();
1303 };
1304
1305 auto propertiesCond =
1306 [this] ( const SELECTION& )
1307 {
1308 return PropertiesShown();
1309 };
1310
1311 auto netInspectorCond =
1312 [this] ( const SELECTION& )
1313 {
1314 return NetInspectorShown();
1315 };
1316
1317 auto searchPaneCond =
1318 [this] ( const SELECTION& )
1319 {
1320 return m_auimgr.GetPane( SearchPaneName() ).IsShown();
1321 };
1322
1323 auto constraintsPaneCond =
1324 [this] ( const SELECTION& )
1325 {
1326 return m_auimgr.GetPane( ConstraintsPaneName() ).IsShown();
1327 };
1328
1329 auto designBlockCond =
1330 [ this ] (const SELECTION& aSel )
1331 {
1332 return m_auimgr.GetPane( DesignBlocksPaneName() ).IsShown();
1333 };
1334
1335 auto gitCommitPaneCond =
1336 [this] ( const SELECTION& )
1337 {
1338 return IsGitCommitPaneShown();
1339 };
1340
1341 auto highContrastCond =
1342 [this] ( const SELECTION& )
1343 {
1345 };
1346
1347 auto globalRatsnestCond =
1348 [this] (const SELECTION& )
1349 {
1351 return cfg && cfg->m_Display.m_ShowGlobalRatsnest;
1352 };
1353
1354 auto curvedRatsnestCond =
1355 [this] (const SELECTION& )
1356 {
1358 return cfg && cfg->m_Display.m_DisplayRatsnestLinesCurved;
1359 };
1360
1361 auto netHighlightCond =
1362 [this]( const SELECTION& )
1363 {
1364 if( PCB_DRAW_PANEL_GAL* canvas = GetCanvas() )
1365 {
1366 if( KIGFX::PCB_VIEW* view = canvas->GetView() )
1367 {
1368 if( KIGFX::PAINTER* painter = view->GetPainter() )
1369 {
1370 if( RENDER_SETTINGS* settings = painter->GetSettings() )
1371 return !settings->GetHighlightNetCodes().empty();
1372 }
1373 }
1374 }
1375
1376 return false;
1377 };
1378
1379 auto enableNetHighlightCond =
1380 [this]( const SELECTION& )
1381 {
1383 return tool && tool->IsNetHighlightSet();
1384 };
1385
1386 mgr->SetConditions( ACTIONS::highContrastMode, CHECK( highContrastCond ) );
1387 mgr->SetConditions( PCB_ACTIONS::flipBoard, CHECK( boardFlippedCond ) );
1388 mgr->SetConditions( PCB_ACTIONS::showLayersManager, CHECK( layerManagerCond ) );
1389 mgr->SetConditions( PCB_ACTIONS::showRatsnest, CHECK( globalRatsnestCond ) );
1390 mgr->SetConditions( PCB_ACTIONS::ratsnestLineMode, CHECK( curvedRatsnestCond ) );
1391 mgr->SetConditions( PCB_ACTIONS::toggleNetHighlight, CHECK( netHighlightCond )
1392 .Enable( enableNetHighlightCond ) );
1393 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
1394 mgr->SetConditions( PCB_ACTIONS::showNetInspector, CHECK( netInspectorCond ) );
1395 mgr->SetConditions( PCB_ACTIONS::showSearch, CHECK( searchPaneCond ) );
1396 mgr->SetConditions( PCB_ACTIONS::showConstraintsPanel, CHECK( constraintsPaneCond ) );
1397 mgr->SetConditions( PCB_ACTIONS::showDesignBlockPanel, CHECK( designBlockCond ) );
1398 mgr->SetConditions( ACTIONS::showGitCommitPane, CHECK( gitCommitPaneCond ) );
1399
1402
1403 const auto isArcKeepCenterMode =
1404 [this]( const SELECTION& )
1405 {
1408 };
1409
1410 const auto isArcKeepEndpointMode =
1411 [this]( const SELECTION& )
1412 {
1415 };
1416
1417 const auto isArcKeepRadiusMode =
1418 [this]( const SELECTION& )
1419 {
1422 };
1423
1424 mgr->SetConditions( ACTIONS::pointEditorArcKeepCenter, CHECK( isArcKeepCenterMode ) );
1425 mgr->SetConditions( ACTIONS::pointEditorArcKeepEndpoint, CHECK( isArcKeepEndpointMode ) );
1426 mgr->SetConditions( ACTIONS::pointEditorArcKeepRadius, CHECK( isArcKeepRadiusMode ) );
1427
1428 auto isHighlightMode =
1429 [this]( const SELECTION& )
1430 {
1431 ROUTER_TOOL* tool = m_toolManager->GetTool<ROUTER_TOOL>();
1432 return tool && tool->GetRouterMode() == PNS::RM_MarkObstacles;
1433 };
1434
1435 auto isShoveMode =
1436 [this]( const SELECTION& )
1437 {
1438 ROUTER_TOOL* tool = m_toolManager->GetTool<ROUTER_TOOL>();
1439 return tool && tool->GetRouterMode() == PNS::RM_Shove;
1440 };
1441
1442 auto isWalkaroundMode =
1443 [this]( const SELECTION& )
1444 {
1445 ROUTER_TOOL* tool = m_toolManager->GetTool<ROUTER_TOOL>();
1446 return tool && tool->GetRouterMode() == PNS::RM_Walkaround;
1447 };
1448
1449 mgr->SetConditions( PCB_ACTIONS::routerHighlightMode, CHECK( isHighlightMode ) );
1450 mgr->SetConditions( PCB_ACTIONS::routerShoveMode, CHECK( isShoveMode ) );
1451 mgr->SetConditions( PCB_ACTIONS::routerWalkaroundMode, CHECK( isWalkaroundMode ) );
1452
1453 auto isAutoTrackWidth =
1454 [this]( const SELECTION& )
1455 {
1457 };
1458
1459 mgr->SetConditions( PCB_ACTIONS::autoTrackWidth, CHECK( isAutoTrackWidth ) );
1460
1461 auto haveNetCond =
1462 [] ( const SELECTION& aSel )
1463 {
1464 for( EDA_ITEM* item : aSel )
1465 {
1466 if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
1467 {
1468 if( bci->GetNetCode() > 0 )
1469 return true;
1470 }
1471 }
1472
1473 return false;
1474 };
1475
1476 auto connectedOrFootprintCond =
1477 [] ( const SELECTION& aSel )
1478 {
1479 if( aSel.Empty() )
1480 return false;
1481
1482 for( EDA_ITEM* item : aSel )
1483 {
1484 if( item->Type() == PCB_FOOTPRINT_T )
1485 continue;
1486
1487 if( !dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
1488 return false;
1489 }
1490
1491 return true;
1492 };
1493
1494 mgr->SetConditions( PCB_ACTIONS::showNetInRatsnest, ENABLE( haveNetCond ) );
1495 mgr->SetConditions( PCB_ACTIONS::hideNetInRatsnest, ENABLE( haveNetCond ) );
1498
1499 static const std::vector<KICAD_T> trackTypes = { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T };
1500 static const std::vector<KICAD_T> padOwnerTypes = { PCB_FOOTPRINT_T, PCB_PAD_T };
1501 static const std::vector<KICAD_T> footprintTypes = { PCB_FOOTPRINT_T };
1502 static const std::vector<KICAD_T> crossProbeTypes = { PCB_PAD_T, PCB_FOOTPRINT_T, PCB_GROUP_T };
1503 static const std::vector<KICAD_T> zoneTypes = { PCB_ZONE_T };
1504
1508 mgr->SetConditions( PCB_ACTIONS::grabUnconnected, ENABLE( connectedOrFootprintCond ) );
1511
1512
1514 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1515
1517 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1518
1519 mgr->SetConditions( PCB_ACTIONS::zoneDuplicate, ENABLE( singleZoneCond ) );
1520 mgr->SetConditions( PCB_ACTIONS::drawZoneCutout, ENABLE( singleZoneCond ) );
1521 mgr->SetConditions( PCB_ACTIONS::drawSimilarZone, ENABLE( singleZoneCond ) );
1522 mgr->SetConditions( PCB_ACTIONS::zoneMerge, ENABLE( zoneMergeCond ) );
1523
1526
1527#define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
1528
1529 // These tools can be used at any time to inspect the board
1534
1535 auto isDRCIdle =
1536 [this] ( const SELECTION& )
1537 {
1538 DRC_TOOL* tool = m_toolManager->GetTool<DRC_TOOL>();
1539 return !( tool && tool->IsDRCRunning() );
1540 };
1541
1542#define CURRENT_EDIT_TOOL( action ) \
1543 mgr->SetConditions( action, ACTION_CONDITIONS().Check( cond.CurrentTool( action ) ) \
1544 .Enable( isDRCIdle ) )
1545
1546 // These tools edit the board, so they must be disabled during some operations
1584
1603
1609
1610#undef CURRENT_TOOL
1611#undef CURRENT_EDIT_TOOL
1612#undef ENABLE
1613#undef CHECK
1614// clang-format on
1615}
1616
1617
1618void PCB_EDIT_FRAME::OnQuit( wxCommandEvent& event )
1619{
1620 if( event.GetId() == wxID_EXIT )
1621 Kiway().OnKiCadExit();
1622
1623 if( event.GetId() == wxID_CLOSE || Kiface().IsSingle() )
1624 Close( false );
1625}
1626
1627
1628void PCB_EDIT_FRAME::ResolveDRCExclusions( bool aCreateMarkers )
1629{
1630 BOARD_COMMIT commit( this );
1631
1632 for( PCB_MARKER* marker : GetBoard()->ResolveDRCExclusions( aCreateMarkers ) )
1633 {
1634 if( marker->GetMarkerType() == MARKER_BASE::MARKER_DRAWING_SHEET )
1635 marker->GetRCItem()->SetItems( GetCanvas()->GetDrawingSheet() );
1636
1637 commit.Add( marker );
1638 }
1639
1640 commit.Push( wxEmptyString, SKIP_UNDO | SKIP_SET_DIRTY );
1641
1642 for( PCB_MARKER* marker : GetBoard()->Markers() )
1643 {
1644 if( marker->GetSeverity() == RPT_SEVERITY_EXCLUSION )
1645 GetCanvas()->GetView()->Update( marker );
1646 }
1647
1649}
1650
1651
1652bool PCB_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
1653{
1654 // Shutdown blocks must be determined and vetoed as early as possible
1655 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
1656 && IsContentModified() )
1657 {
1658 return false;
1659 }
1660
1661 ZONE_FILLER_TOOL* zoneFillerTool = m_toolManager->GetTool<ZONE_FILLER_TOOL>();
1662
1663 if( zoneFillerTool->IsBusy() )
1664 {
1665 wxBell();
1666
1667 if( wxWindow* reporter = dynamic_cast<wxWindow*>( zoneFillerTool->GetProgressReporter() ) )
1668 reporter->ShowWithEffect( wxSHOW_EFFECT_EXPAND );
1669
1670 return false;
1671 }
1672
1673 // Don't allow closing while the modal footprint chooser is open
1674 // Use C-style cast due to Mac's inability to dynamic cast between compile modules
1676
1677 if( chooser && chooser->IsModal() ) // Can close footprint chooser?
1678 return false;
1679
1680 if( Kiface().IsSingle() )
1681 {
1682 // Use C-style cast due to Mac's inability to dynamic cast between compile modules
1684
1685 if( fpEditor )
1686 {
1687 bool cancel = !fpEditor->Close(); // Can close footprint editor?
1688
1689 // If fp editor had unsaved changes it will have been fronted. Bring board editor back to front.
1690 Raise();
1691
1692 if( cancel )
1693 return false;
1694 }
1695
1696 // Use C-style cast due to Mac's inability to dynamic cast between compile modules
1698
1699 if( fpViewer && !fpViewer->Close() ) // Can close footprint viewer?
1700 return false;
1701 }
1702 else
1703 {
1704 // Use C-style cast due to Mac's inability to dynamic cast between compile modules
1706
1707 if( fpEditor )
1708 {
1709 bool cancel = !fpEditor->HandleUnsavedChanges( true );
1710
1711 // If fp editor had unsaved changes it will have been fronted. Bring board editor back to front.
1712 Raise();
1713
1714 if( cancel )
1715 return false;
1716 }
1717 }
1718
1720 return false;
1721
1722 if( IsContentModified() )
1723 {
1724 wxFileName fileName = GetBoard()->GetFileName();
1725 wxString msg = _( "Save changes to '%s' before closing?" );
1726
1727 wxSafeYield( this, true ); // Allow frame to come to front before showing "Save Changes?"
1728
1729 if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
1730 [&]() -> bool
1731 {
1732 return SaveBoard();
1733 } ) )
1734 {
1735 return false;
1736 }
1737
1738 // If user discarded changes, create a duplicate commit of last saved PCB state and
1739 // advance Last_Save_pcb tag for explicit history event.
1740 if( GetLastUnsavedChangesResponse() == wxID_NO )
1741 {
1742 wxString projPath = Prj().GetProjectPath();
1743
1744 if( !projPath.IsEmpty() && Kiway().LocalHistory().HistoryExists( projPath ) )
1745 {
1746 Kiway().LocalHistory().CommitDuplicateOfLastSave( projPath, wxS( "pcb" ),
1747 wxS( "Discard unsaved pcb changes" ) );
1748 }
1749 }
1750 }
1751
1752 return PCB_BASE_EDIT_FRAME::canCloseWindow( aEvent );
1753}
1754
1755
1757{
1758 // Unregister the autosave saver before any cleanup that might invalidate the board
1759 if( GetBoard() )
1761
1762 // On Windows 7 / 32 bits, on OpenGL mode only, Pcbnew crashes
1763 // when closing this frame if a footprint was selected, and the footprint editor called
1764 // to edit this footprint, and when closing pcbnew if this footprint is still selected
1765 // See https://bugs.launchpad.net/kicad/+bug/1655858
1766 // I think this is certainly a OpenGL event fired after frame deletion, so this workaround
1767 // avoid the crash (JPC)
1768 GetCanvas()->SetEvtHandlerEnabled( false );
1769
1771
1774
1775 // Clean up mode-less dialogs.
1776 Unbind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs, this );
1777 Unbind( EDA_EVT_CLOSE_DIALOG_FOOTPRINT_FIELDS_TABLE, &PCB_EDIT_FRAME::onCloseFootprintFieldsTableDialog, this );
1778
1779 wxWindow* drcDlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
1780
1781 if( drcDlg )
1782 drcDlg->Close( true );
1783
1784 wxWindow* ruleEditorDlg = wxWindow::FindWindowByName( DIALOG_DRC_RULE_EDITOR_WINDOW_NAME );
1785
1786 if( ruleEditorDlg )
1787 ruleEditorDlg->Close( true );
1788
1789 if( m_findDialog )
1790 {
1791 m_findDialog->Destroy();
1792 m_findDialog = nullptr;
1793 }
1794
1796 {
1797 m_findByPropertiesDialog->Destroy();
1798 m_findByPropertiesDialog = nullptr;
1799 }
1800
1802 {
1803 m_inspectDrcErrorDlg->Destroy();
1804 m_inspectDrcErrorDlg = nullptr;
1805 }
1806
1808 {
1809 m_inspectClearanceDlg->Destroy();
1810 m_inspectClearanceDlg = nullptr;
1811 }
1812
1814 {
1815 m_inspectConstraintsDlg->Destroy();
1816 m_inspectConstraintsDlg = nullptr;
1817 }
1818
1819 if( m_footprintDiffDlg )
1820 {
1821 m_footprintDiffDlg->Destroy();
1822 m_footprintDiffDlg = nullptr;
1823 }
1824
1826 {
1829 }
1830
1831 // Delete the auto save file if it exists. Only sweep when the board was actually dirtied in this session;
1832 // otherwise an existing autosave is a previous-session leftover the user explicitly deferred in the recovery
1833 // dialog.
1834 if( !Prj().IsNullProject() && GetBoard() && IsContentModified() )
1835 {
1836 Kiway().LocalHistory().RemoveAutosaveFiles( Prj().GetProjectPath(), { GetBoard()->GetFileName() } );
1837 }
1838
1839 // Make sure local settings are persisted
1840 if( Prj().GetLocalSettings().ShouldAutoSave() )
1841 {
1842 m_netInspectorPanel->SaveSettings();
1844 }
1845 else
1846 {
1847 wxLogTrace( traceAutoSave, wxT( "Skipping auto-save of migrated local settings" ) );
1848 }
1849
1850 // Do not show the layer manager during closing to avoid flicker on some platforms (Windows) that
1851 // generate useless redraw of items in the Layer Manager
1853 {
1854 m_auimgr.GetPane( wxS( "LayersManager" ) ).Show( false );
1855 m_auimgr.GetPane( wxS( "TabbedPanel" ) ).Show( false );
1856 }
1857
1858 // Unlink the old project if needed
1860
1861 // Delete board structs and undo/redo lists, to avoid crash on exit when deleting some structs
1862 // (mainly in undo/redo lists) too late
1863 Clear_Pcb( false, true );
1864
1865 // do not show the window because ScreenPcb will be deleted and we do not want any paint event
1866 Show( false );
1867
1869}
1870
1871
1878
1879
1881{
1882 BOARD* board = GetBoard();
1883 KIGFX::VIEW* view = GetCanvas()->GetView();
1884
1885 board->RefreshDrillSymbolLayers();
1886
1887 for( PCB_TRACK* track : board->Tracks() )
1888 {
1889 if( track->Type() == PCB_VIA_T )
1890 view->Update( track, aUpdateFlags );
1891 }
1892
1893 for( FOOTPRINT* footprint : board->Footprints() )
1894 {
1895 for( PAD* pad : footprint->Pads() )
1896 {
1897 if( pad->HasHole() )
1898 view->Update( pad, aUpdateFlags );
1899 }
1900 }
1901
1902 GetCanvas()->Refresh();
1903}
1904
1905
1906void PCB_EDIT_FRAME::ShowBoardSetupDialog( const wxString& aInitialPage, wxWindow* aParent )
1907{
1908 static std::mutex dialogMutex; // Local static mutex
1909
1910 std::unique_lock<std::mutex> dialogLock( dialogMutex, std::try_to_lock );
1911
1912 // One dialog at a time.
1913 if( !dialogLock.owns_lock() )
1914 {
1915 if( m_boardSetupDlg && m_boardSetupDlg->IsShown() )
1916 {
1917 m_boardSetupDlg->Raise(); // Brings the existing dialog to the front
1918 }
1919
1920 return;
1921 }
1922
1923 // Make sure everything's up-to-date
1925
1926 DIALOG_BOARD_SETUP dlg( this, aParent );
1927
1928 if( !aInitialPage.IsEmpty() )
1929 dlg.SetInitialPage( aInitialPage, wxEmptyString );
1930
1931 // Assign dlg to the m_boardSetupDlg pointer to track its status.
1932 m_boardSetupDlg = &dlg;
1933
1934 // QuasiModal required for Scintilla auto-complete
1935 if( dlg.ShowQuasiModal() == wxID_OK )
1936 {
1937 // Note: We must synchronise time domain properties before nets and classes, otherwise the updates
1938 // called by the board listener events are using stale data
1941
1942 if( !GetBoard()->SynchronizeComponentClasses( std::unordered_set<wxString>() ) )
1943 {
1944 m_infoBar->RemoveAllButtons();
1945 m_infoBar->AddCloseButton();
1946 m_infoBar->ShowMessage( _( "Could not load component class assignment rules" ), wxICON_WARNING,
1947 WX_INFOBAR::MESSAGE_TYPE::GENERIC );
1948 }
1949
1950 // We don't know if anything was modified, so err on the side of requiring a save
1951 OnModify();
1952
1954
1957
1958 // CROSS_REF keys deliberately excluded — those are driven by per-item
1959 // BOARD_COMMIT changes.
1960 if( BOARD_TEXT_VAR_ADAPTER* adapter = GetBoard()->GetTextVarAdapter() )
1961 adapter->Tracker().InvalidateProjectScoped();
1962
1963 PCBNEW_SETTINGS* settings = GetPcbNewSettings();
1964 static LSET maskAndPasteLayers = LSET( { F_Mask, F_Paste, B_Mask, B_Paste } );
1965
1967 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1968 {
1969 int flags = 0;
1970
1971 if( !aItem->IsBOARD_ITEM() )
1972 return flags;
1973
1974 BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
1975
1976 if( item->Type() == PCB_VIA_T || item->Type() == PCB_PAD_T )
1977 {
1978 // Note: KIGFX::REPAINT isn't enough for things that go from invisible
1979 // to visible as they won't be found in the view layer's itemset for
1980 // re-painting.
1981 if( ( GetBoard()->GetVisibleLayers() & maskAndPasteLayers ).any() )
1982 flags |= KIGFX::ALL;
1983 }
1984
1985 if( item->Type() == PCB_TRACE_T || item->Type() == PCB_ARC_T || item->Type() == PCB_VIA_T )
1986 {
1988 flags |= KIGFX::REPAINT;
1989 }
1990
1991 if( item->Type() == PCB_PAD_T )
1992 {
1993 if( settings->m_Display.m_PadClearance )
1994 flags |= KIGFX::REPAINT;
1995 }
1996
1997 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1998 {
1999 if( text->HasTextVars() )
2000 {
2001 text->ClearRenderCache();
2002 text->ClearBoundingBoxCache();
2004 }
2005 }
2006
2007 return flags;
2008 } );
2009
2010 GetCanvas()->Refresh();
2011
2015
2016 //this event causes the routing tool to reload its design rules information
2018 toolEvent.SetHasPosition( false );
2019 m_toolManager->ProcessEvent( toolEvent );
2020 }
2021
2022 GetCanvas()->SetFocus();
2023
2024 // Reset m_boardSetupDlg after the dialog is closed
2025 m_boardSetupDlg = nullptr;
2026}
2027
2028
2030{
2031 m_searchPane->FocusSearch();
2032}
2033
2034
2036{
2038
2039 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
2040 wxASSERT( cfg );
2041
2042 if( cfg )
2043 {
2047 }
2048}
2049
2050
2052{
2054
2055 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
2056 wxASSERT( cfg );
2057
2058 if( cfg )
2059 {
2060 wxAuiPaneInfo& apperancePane = m_auimgr.GetPane( AppearancePanelName() );
2061 cfg->m_AuiPanels.show_layer_manager = apperancePane.IsShown();
2062
2063 if( m_propertiesPanel )
2064 {
2065 cfg->m_AuiPanels.show_properties = m_propertiesPanel->IsShownOnScreen();
2067 cfg->m_AuiPanels.properties_splitter = m_propertiesPanel->SplitterProportion();
2068 }
2069
2070 // ensure m_ShowSearch is up to date (the pane can be closed)
2071 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
2072 m_ShowSearch = searchPaneInfo.IsShown();
2074 cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
2075 cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
2076 cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
2077
2078 cfg->m_AuiPanels.show_git_commit_pane = m_auimgr.GetPane( GitCommitPaneName() ).IsShown();
2079
2081 {
2082 wxAuiPaneInfo& netInspectorhPaneInfo = m_auimgr.GetPane( NetInspectorPanelName() );
2083 m_ShowNetInspector = netInspectorhPaneInfo.IsShown();
2085 }
2086
2087 if( m_appearancePanel )
2088 {
2091 cfg->m_AuiPanels.appearance_expand_layer_display = m_appearancePanel->IsLayerOptionsExpanded();
2092 cfg->m_AuiPanels.appearance_expand_net_display = m_appearancePanel->IsNetOptionsExpanded();
2093 }
2094
2095 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
2096 cfg->m_AuiPanels.design_blocks_show = designBlocksPane.IsShown();
2097
2098 if( designBlocksPane.IsDocked() )
2099 {
2101 }
2102 else
2103 {
2104 cfg->m_AuiPanels.design_blocks_panel_float_height = designBlocksPane.floating_size.y;
2105 cfg->m_AuiPanels.design_blocks_panel_float_width = designBlocksPane.floating_size.x;
2106 }
2107
2108 m_designBlocksPane->SaveSettings();
2109 }
2110}
2111
2112
2114{
2115 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( config() );
2116
2117 return cfg ? cfg->m_RotationAngle : ANGLE_90;
2118}
2119
2120
2125
2126
2128{
2129
2130 GetColorSettings()->SetColor( LAYER_GRID, aColor );
2131 GetCanvas()->GetGAL()->SetGridColor( aColor );
2132}
2133
2134
2135void PCB_EDIT_FRAME::SetActiveLayer( PCB_LAYER_ID aLayer, bool aForceRedraw )
2136{
2137 const PCB_LAYER_ID oldLayer = GetActiveLayer();
2138
2139 if( oldLayer == aLayer && !aForceRedraw )
2140 return;
2141
2143
2144 m_appearancePanel->OnLayerChanged();
2145
2146 m_toolManager->PostAction( PCB_ACTIONS::layerChanged ); // notify other tools
2147 GetCanvas()->SetFocus(); // allow capture of hotkeys
2148
2149 if( aForceRedraw )
2150 GetCanvas()->SetHighContrastLayer( aLayer );
2151 else
2153
2154 /*
2155 * Only show pad, via and track clearances when a copper layer is active
2156 * and then only show the clearance layer for that copper layer. For
2157 * front/back non-copper layers, show the clearance layer for the outer
2158 * layer on that side.
2159 *
2160 * For pads/vias, this is to avoid clutter when there are pad/via layers
2161 * that vary in flash (i.e. clearance from the hole or pad edge), padstack
2162 * shape on each layer or clearances on each layer.
2163 *
2164 * For tracks, this follows the same logic as pads/vias, but in theory could
2165 * have their own set of independent clearance layers to allow track clearance
2166 * to be shown for more layers.
2167 */
2168 const auto getClearanceLayerForActive =
2169 []( PCB_LAYER_ID aActiveLayer ) -> std::optional<int>
2170 {
2171 if( IsCopperLayer( aActiveLayer ) )
2172 return CLEARANCE_LAYER_FOR( aActiveLayer );
2173
2174 return std::nullopt;
2175 };
2176
2177 if( std::optional<int> oldClearanceLayer = getClearanceLayerForActive( oldLayer ) )
2178 GetCanvas()->GetView()->SetLayerVisible( *oldClearanceLayer, false );
2179
2180 if( std::optional<int> newClearanceLayer = getClearanceLayerForActive( aLayer ) )
2181 GetCanvas()->GetView()->SetLayerVisible( *newClearanceLayer, true );
2182
2183 // per-layer view groups already hold each layer geometry so an active-layer change needs no
2184 // re-tessellation just clearance visibility above and the recolour in SetHighContrastLayer
2185
2186 // idle refresh coalesces mashed hotkeys into one repaint forced redraws stay immediate
2187 if( aForceRedraw )
2188 GetCanvas()->Refresh();
2189 else
2191}
2192
2193
2195{
2196 wxFileName fn( GetBoard()->GetFileName() );
2197
2199
2200 layerEnum.Choices().Clear();
2201 layerEnum.Undefined( UNDEFINED_LAYER );
2202
2203 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
2204 {
2205 // Canonical name
2206 layerEnum.Map( layer, LSET::Name( layer ) );
2207
2208 // User name
2209 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
2210 }
2211
2212 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
2213
2214 try
2215 {
2216 drcTool->GetDRCEngine()->InitEngine( GetBoard()->GetDesignRulesPath() );
2217 }
2218 catch( PARSE_ERROR& )
2219 {
2220 // Not sure this is the best place to tell the user their rules are buggy, so
2221 // we'll stay quiet for now. Feel free to revisit this decision....
2222 }
2223
2225
2226 // Migrate obsolete WRL 3D model references to current STEP models. Only
2227 // runs in the GUI: CLI and scripting load paths must not mutate board
2228 // state on load. The STEP exporter does its own WRL->STEP substitution at
2229 // export time via the --subst-models flag, and the 3D cache quietly falls
2230 // back to sibling STEP files for missing WRLs in headless contexts.
2231 if( Pgm().IsGUI() )
2232 {
2233 // Silently replace references whose filename uniquely identifies a
2234 // STEP sibling. Leaves ambiguous cases for the infobar below.
2236
2237 if( int unresolved = DIALOG_MIGRATE_3D_MODELS::CountUnresolvedWrlReferences( this ) )
2238 {
2239 wxString msg = _( "WRL 3D model could not be matched to equivalent STEP model." );
2240
2241 if( unresolved > 1 )
2242 {
2243 msg = wxString::Format( _( "%d WRL 3D models could not be matched to equivalent STEP models." ),
2244 unresolved );
2245 }
2246
2247 m_loadNoticeInfoBar->RemoveAllButtons();
2248 m_loadNoticeInfoBar->AddLink( _( "Show options" ),
2249 [this]( wxHyperlinkEvent& )
2250 {
2251 DIALOG_MIGRATE_3D_MODELS dlg( this );
2252 dlg.ShowModal();
2253
2254 // Dismiss the infobar if nothing remains to resolve;
2255 // otherwise leave it so the user can try again.
2257 m_loadNoticeInfoBar->Dismiss();
2258 } );
2259 m_loadNoticeInfoBar->AddCloseButton();
2260 m_loadNoticeInfoBar->ShowMessageFor( msg, 10000, wxICON_INFORMATION );
2261 }
2262 }
2263
2264 UpdateTitle();
2265
2266 // Display a warning that the file is read only
2267 if( fn.FileExists() && !fn.IsFileWritable() )
2268 {
2269 m_infoBar->RemoveAllButtons();
2270 m_infoBar->AddCloseButton();
2271 m_infoBar->ShowMessage( _( "Board file is read only." ), wxICON_WARNING,
2272 WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE );
2273 }
2274
2276
2277 // Sync layer and item visibility
2279
2280 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
2281
2282 m_appearancePanel->OnBoardChanged();
2283
2284 // Apply saved display state to the appearance panel after it has been set up
2285 PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings();
2286
2287 m_appearancePanel->ApplyLayerPreset( localSettings.m_ActiveLayerPreset );
2288
2289 if( GetBoard()->GetDesignSettings().IsLayerEnabled( localSettings.m_ActiveLayer ) )
2290 SetActiveLayer( localSettings.m_ActiveLayer, true );
2291 else
2292 SetActiveLayer( GetActiveLayer(), true ); // Make sure to repaint even if not switching
2293
2294 PROJECT_FILE& projectFile = Prj().GetProjectFile();
2295
2296 m_layerPairSettings->SetLayerPairs( projectFile.m_LayerPairInfos );
2297 m_layerPairSettings->SetCurrentLayerPair( LAYER_PAIR{ F_Cu, B_Cu } );
2298
2299 // Updates any auto dimensions and the auxiliary toolbar tracks/via sizes
2301
2302 // Sync the net inspector now we have connectivity calculated
2304 m_netInspectorPanel->OnBoardChanged();
2305
2306 // Display the loaded board:
2307 Zoom_Automatique( false );
2308
2309 // The DRC engine above makes clearances computable, so only the items that draw a
2310 // clearance outline are stale; marking every item re-tessellates the whole board
2311 {
2312 KIGFX::VIEW* view = GetCanvas()->GetView();
2313 const auto& opts = GetPcbNewSettings()->m_Display;
2314
2315 for( FOOTPRINT* footprint : GetBoard()->Footprints() )
2316 {
2317 for( PAD* pad : footprint->Pads() )
2318 view->Update( pad, KIGFX::REPAINT );
2319 }
2320
2321 if( opts.m_TrackClearance == SHOW_WITH_VIA_ALWAYS )
2322 {
2323 for( PCB_TRACK* track : GetBoard()->Tracks() )
2324 view->Update( track, KIGFX::REPAINT );
2325 }
2326 }
2327
2328 Refresh();
2329
2330 SetMsgPanel( GetBoard() );
2331 SetStatusText( wxEmptyString );
2332
2333 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "PCB file changes are unsaved" ) );
2334}
2335
2336
2338{
2339 m_appearancePanel->UpdateDisplayOptions();
2340}
2341
2342
2344{
2345 return GetBoard()->IsElementVisible( aElement );
2346}
2347
2348
2350{
2351 // Force the RATSNEST visible
2352 if( aElement == LAYER_RATSNEST )
2353 GetCanvas()->GetView()->SetLayerVisible( aElement, true );
2354 else
2355 GetCanvas()->GetView()->SetLayerVisible( aElement , aNewState );
2356
2357 GetBoard()->SetElementVisibility( aElement, aNewState );
2358}
2359
2360
2362{
2363 // call my base class
2365
2366 m_auimgr.GetPane( m_appearancePanel ).Caption( _( "Appearance" ) );
2367 m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
2368 m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
2369 m_auimgr.GetPane( m_netInspectorPanel ).Caption( _( "Net Inspector" ) );
2370 m_auimgr.Update();
2371
2372 UpdateTitle();
2373}
2374
2375
2377{
2379
2380 if( project.m_PcbLastPath[ aType ].IsEmpty() )
2381 return wxEmptyString;
2382
2383 wxFileName absoluteFileName = project.m_PcbLastPath[ aType ];
2384 wxFileName pcbFileName = GetBoard()->GetFileName();
2385
2386 absoluteFileName.MakeAbsolute( pcbFileName.GetPath() );
2387 return absoluteFileName.GetFullPath();
2388}
2389
2390
2391void PCB_EDIT_FRAME::SetLastPath( LAST_PATH_TYPE aType, const wxString& aLastPath )
2392{
2394
2395 wxFileName relativeFileName = aLastPath;
2396 wxFileName pcbFileName = GetBoard()->GetFileName();
2397
2398 relativeFileName.MakeRelativeTo( pcbFileName.GetPath() );
2399
2400 if( relativeFileName.GetFullPath() != project.m_PcbLastPath[ aType ] )
2401 {
2402 project.m_PcbLastPath[ aType ] = relativeFileName.GetFullPath();
2403 OnModify();
2404 }
2405}
2406
2407
2409{
2411 Kiway().LocalHistory().NoteFileChange( GetBoard()->GetFileName() );
2412 m_ZoneFillsDirty = true;
2413
2414 if( m_isClosing )
2415 return;
2416
2417 // A chart reports the board, so an edit that moved a hole has already made it wrong.
2418 // Costs one integer comparison per chart when nothing drill related changed.
2420
2421 Update3DView( true, GetPcbNewSettings()->m_Display.m_Live3DRefresh );
2422
2423 if( !GetTitle().StartsWith( wxT( "*" ) ) )
2424 UpdateTitle();
2425}
2426
2427
2429{
2430 // The libraries were read once and then cached. A refresh is where they need to be refreshed
2432
2433 Update3DView( true, true );
2434
2435 std::shared_ptr<CONNECTIVITY_DATA> connectivity = GetBoard()->GetConnectivity();
2436 connectivity->RecalculateRatsnest( nullptr );
2438
2439 std::vector<MSG_PANEL_ITEM> msg_list;
2440 GetBoard()->GetMsgPanelInfo( this, msg_list );
2441 SetMsgPanel( msg_list );
2442}
2443
2444
2446{
2447 wxFileName fn = GetBoard()->GetFileName();
2448 bool readOnly = false;
2449 bool unsaved = false;
2450
2451 if( fn.IsOk() && fn.FileExists() )
2452 readOnly = !fn.IsFileWritable();
2453 else
2454 unsaved = true;
2455
2456 wxString title;
2457
2458 if( IsContentModified() )
2459 title = wxT( "*" );
2460
2461 title += fn.GetName();
2462
2463 if( readOnly )
2464 title += wxS( " " ) + _( "[Read Only]" );
2465
2466 if( unsaved )
2467 title += wxS( " " ) + _( "[Unsaved]" );
2468
2469 title += wxT( " \u2014 " ) + _( "PCB Editor" );
2470
2471 SetTitle( title );
2472}
2473
2474
2476{
2477 // Update the layer manager and other widgets from the board setup
2478 // (layer and items visibility, colors ...)
2479
2480 // Rebuild list of nets (full ratsnest rebuild)
2482
2483 // Update info shown by the horizontal toolbars
2485
2486 LSET activeLayers = GetBoard()->GetEnabledLayers();
2487
2488 if( !activeLayers.test( GetActiveLayer() ) )
2489 SetActiveLayer( activeLayers.Seq().front() );
2490
2491 // The layer selector lives on the top auxiliary toolbar. Users can remove every
2492 // entry from that toolbar via Preferences, in which case the control is destroyed
2493 // and m_SelLayerBox is null. Avoid dereferencing it here.
2494 if( m_SelLayerBox )
2495 m_SelLayerBox->SetLayerSelection( GetActiveLayer() );
2496
2498
2499 layerEnum.Choices().Clear();
2500 layerEnum.Undefined( UNDEFINED_LAYER );
2501
2502 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
2503 {
2504 // Canonical name
2505 layerEnum.Map( layer, LSET::Name( layer ) );
2506
2507 // User name
2508 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
2509 }
2510
2512
2513 // Sync visibility with canvas
2514 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
2515 GetCanvas()->GetView()->SetLayerVisible( layer, GetBoard()->IsLayerVisible( layer ) );
2516
2517 // Stackup and/or color theme may have changed
2518 m_appearancePanel->OnBoardChanged();
2519 m_netInspectorPanel->OnParentSetupChanged();
2520}
2521
2522
2524{
2525 // switches currently used canvas (Cairo / OpenGL).
2526 PCB_BASE_FRAME::SwitchCanvas( aCanvasType );
2527}
2528
2529
2531{
2532 if( !m_findDialog )
2533 {
2534 m_findDialog = new DIALOG_FIND( this );
2535 m_findDialog->SetCallback( std::bind( &PCB_SELECTION_TOOL::FindItem,
2536 m_toolManager->GetTool<PCB_SELECTION_TOOL>(), _1 ) );
2537 }
2538
2539 wxString findString;
2540
2541 PCB_SELECTION& selection = m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
2542
2543 if( selection.Size() == 1 && selection.Front() != m_findDialog->GetItem() )
2544 {
2545 EDA_ITEM* front = selection.Front();
2546
2547 switch( front->Type() )
2548 {
2549 case PCB_FOOTPRINT_T:
2550 findString = UnescapeString( static_cast<FOOTPRINT*>( front )->GetValue() );
2551 break;
2552
2553 case PCB_FIELD_T:
2554 case PCB_TEXT_T:
2555 findString = UnescapeString( static_cast<PCB_TEXT*>( front )->GetText() );
2556
2557 if( findString.Contains( wxT( "\n" ) ) )
2558 findString = findString.Before( '\n' );
2559
2560 break;
2561
2562 default:
2563 break;
2564 }
2565 }
2566
2567 m_findDialog->Preload( findString );
2568
2569 m_findDialog->Show( true );
2570}
2571
2572
2581
2582
2588
2589
2595
2596
2597void PCB_EDIT_FRAME::FindNext( bool reverse )
2598{
2599 if( !m_findDialog )
2601
2602 m_findDialog->FindNext( reverse );
2603}
2604
2605
2607{
2608 if( Kiface().IsSingle() )
2609 return 0;
2610
2611 // Update PCB requires a netlist. Therefore the schematic editor must be running
2612 // If this is not the case, open the schematic editor
2613 KIWAY_PLAYER* frame = Kiway().Player( FRAME_SCH, true );
2614
2615 // If Kiway() cannot create the eeschema frame, it shows a error message, and
2616 // frame is null
2617 if( !frame )
2618 return -1;
2619
2620 if( !frame->IsShownOnScreen() )
2621 {
2622 wxEventBlocker blocker( this );
2623 wxFileName fn( Prj().GetProjectPath(), Prj().GetProjectName(), FILEEXT::KiCadSchematicFileExtension );
2624
2625 // Maybe the file hasn't been converted to the new s-expression file format so
2626 // see if the legacy schematic file is still in play.
2627 if( !fn.FileExists() )
2628 {
2630
2631 if( !fn.FileExists() )
2632 {
2633 DisplayErrorMessage( this, _( "The schematic for this board cannot be found." ) );
2634 return -2;
2635 }
2636 }
2637
2638 frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
2639
2640 // we show the schematic editor frame, because do not show is seen as
2641 // a not yet opened schematic by Kicad manager, which is not the case
2642 frame->Show( true );
2643
2644 // bring ourselves back to the front
2645 Raise();
2646 }
2647
2648 return 1; //Success!
2649}
2650
2651
2652bool PCB_EDIT_FRAME::FetchNetlistFromSchematic( NETLIST& aNetlist, const wxString& aAnnotateMessage )
2653{
2654 int standalone = TestStandalone();
2655
2656 if( standalone == 0 )
2657 {
2658 DisplayErrorMessage( this, _( "Cannot update the PCB because PCB editor is opened in stand-alone mode. "
2659 "In order to create or update PCBs from schematics, you must launch the "
2660 "KiCad project manager and create a project." ) );
2661 return false; // Not in standalone mode
2662 }
2663
2664 if( standalone < 0 ) // Problem with Eeschema or the schematic
2665 return false;
2666
2667 Raise(); // Show
2668
2669 std::string payload( aAnnotateMessage );
2670
2671 Kiway().ExpressMail( FRAME_SCH, MAIL_SCH_GET_NETLIST, payload, this );
2672
2673 // Sentinel reply means the user explicitly aborted; silently cancel and return focus to
2674 // the schematic rather than re-showing the annotation error
2675 if( payload == MAIL_SCH_GET_NETLIST_CANCELLED )
2676 {
2677 if( KIWAY_PLAYER* schFrame = Kiway().Player( FRAME_SCH, false ) )
2678 {
2679 if( schFrame->IsIconized() )
2680 schFrame->Iconize( false );
2681
2682 schFrame->Raise();
2683
2684 // Raising the window does not set the focus on Linux. This should work on
2685 // any platform.
2686 if( wxWindow::FindFocus() != schFrame )
2687 schFrame->SetFocus();
2688 }
2689
2690 return false;
2691 }
2692
2693 if( payload == aAnnotateMessage )
2694 {
2695 Raise();
2696 DisplayErrorMessage( this, aAnnotateMessage );
2697 return false;
2698 }
2699
2700 try
2701 {
2702 STRING_LINE_READER* lineReader = new STRING_LINE_READER( payload, _( "Eeschema netlist" ) );
2703 KICAD_NETLIST_READER netlistReader( lineReader, &aNetlist );
2704 netlistReader.LoadNetlist();
2705 }
2706 catch( const IO_ERROR& e )
2707 {
2708 Raise();
2709
2710 // Do not translate extra_info strings. These are for developers
2711 wxString extra_info = e.Problem() + wxT( " : " ) + e.What() + wxT( " at " ) + e.Where();
2712
2713 DisplayErrorMessage( this, _( "Received an error while reading netlist. Please report this issue to "
2714 "the KiCad team using the menu Help->Report Bug." ),
2715 extra_info );
2716 return false;
2717 }
2718
2719 return true;
2720}
2721
2722
2724{
2725 if( aFootprint == nullptr )
2726 return;
2727
2729
2730 /*
2731 * Make sure dlg is destroyed before GetCanvas->Refresh is called
2732 * later or the refresh will try to modify its properties since
2733 * they share a GL context.
2734 */
2735 {
2736 DIALOG_FOOTPRINT_PROPERTIES dlg( this, aFootprint );
2737
2738 dlg.ShowQuasiModal();
2739 retvalue = dlg.GetReturnValue();
2740 }
2741
2742 /*
2743 * retvalue =
2744 * FP_PROPS_UPDATE_FP to show Update Footprints dialog
2745 * FP_PROPS_CHANGE_FP to show Change Footprints dialog
2746 * FP_PROPS_OK for normal edit
2747 * FP_PROPS_CANCEL if aborted
2748 * FP_PROPS_EDIT_BOARD_FP to load board footprint into Footprint Editor
2749 * FP_PROPS_EDIT_LIBRARY_FP to load library footprint into Footprint Editor
2750 */
2751
2753 {
2754 // If something edited, push a refresh request
2755 GetCanvas()->Refresh();
2756 }
2758 {
2759 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2760 {
2761 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2762
2763 fp_editor->LoadFootprintFromBoard( aFootprint );
2764 fp_editor->Show( true );
2765 fp_editor->Raise(); // Iconize( false );
2766 }
2767 }
2769 {
2770 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2771 {
2772 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2773
2774 fp_editor->LoadFootprintFromLibrary( aFootprint->GetFPID() );
2775 fp_editor->Show( true );
2776 fp_editor->Raise(); // Iconize( false );
2777 }
2778 }
2780 {
2781 ShowExchangeFootprintsDialog( aFootprint, true, true );
2782 }
2784 {
2785 ShowExchangeFootprintsDialog( aFootprint, false, true );
2786 }
2787}
2788
2789
2791 bool aSelectedMode )
2792{
2793 DIALOG_EXCHANGE_FOOTPRINTS dialog( this, aFootprint, aUpdateMode, aSelectedMode );
2794
2795 return dialog.ShowQuasiModal();
2796}
2797
2798
2800{
2802 m_appearancePanel->CommonSettingsChanged( aFlags );
2803
2805
2807
2808 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
2809
2811
2812 // Netclass definitions could have changed, either by us or by Eeschema, so we need to
2813 // recompile the implicit rules
2814 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
2815 WX_INFOBAR* infobar = GetInfoBar();
2816
2817 try
2818 {
2819 drcTool->GetDRCEngine()->InitEngine( GetBoard()->GetDesignRulesPath() );
2820
2821 if( infobar->GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::DRC_RULES_ERROR )
2822 infobar->Dismiss();
2823 }
2824 catch( PARSE_ERROR& )
2825 {
2826 infobar->RemoveAllButtons();
2827 infobar->AddLink( _( "Edit design rules" ),
2828 [&]( wxHyperlinkEvent& aEvent )
2829 {
2830 ShowBoardSetupDialog( _( "Custom Rules" ) );
2831 } );
2832 infobar->AddCloseButton();
2833 infobar->ShowMessage( _( "Could not compile custom design rules." ), wxICON_ERROR,
2834 WX_INFOBAR::MESSAGE_TYPE::DRC_RULES_ERROR );
2835 }
2836
2839
2840 Layout();
2841 SendSizeEvent();
2842}
2843
2844
2849
2850
2852{
2853 // Register autosave history saver for the board.
2854 // Saver serializes the in-memory BOARD into HISTORY_FILE_DATA. Prettify and
2855 // file I/O happen on a background thread to avoid blocking the UI.
2856 if( GetBoard() )
2857 {
2859 GetBoard(),
2860 [this]( const wxString& aProjectPath, std::vector<HISTORY_FILE_DATA>& aFileData )
2861 {
2862 // See SCHEMATIC::SaveToHistory: the dirty check is only valid in ZIP
2863 // mode. In INCREMENTAL mode the manual-save flow clears the dirty
2864 // flag before the saver runs, so filtering would drop the snapshot.
2865 bool filterClean = !Pgm().GetCommonSettings()->AutosaveUsesLocalHistory();
2866
2867 if( filterClean && !IsContentModified() )
2868 return;
2869
2870 GetBoard()->SaveToHistory( aProjectPath, aFileData );
2871 },
2873 }
2874}
2875
2876
2878{
2880
2881 if( !mgr )
2882 return false;
2883
2884 TOOL_BASE* currentTool = mgr->GetCurrentTool();
2885
2886 // When a single item that can be point-edited is selected, the point editor
2887 // tool will be active instead of the selection tool. It blocks undo/redo
2888 // while the user is actually dragging points around, though, so we can use
2889 // this as an initial check.
2890 if( UndoRedoBlocked() )
2891 return true;
2892
2893 // A tool other than passive selection or point editing is actively modifying
2894 // the model (drawing, dragging, routing, etc.).
2895 if( currentTool != mgr->GetTool<PCB_SELECTION_TOOL>()
2896 && currentTool != mgr->GetTool<PCB_POINT_EDITOR>() )
2897 {
2898 return true;
2899 }
2900
2901 if( ZONE_FILLER_TOOL* zoneFillerTool = mgr->GetTool<ZONE_FILLER_TOOL>();
2902 zoneFillerTool && zoneFillerTool->IsBusy() )
2903 {
2904 return true;
2905 }
2906
2907 if( ROUTER_TOOL* routerTool = mgr->GetTool<ROUTER_TOOL>();
2908 routerTool && routerTool->RoutingInProgress() )
2909 {
2910 return true;
2911 }
2912
2913 return false;
2914}
2915
2916
2918{
2920 return false;
2921
2923}
2924
2925
2927{
2928 // Serializing a large board on the UI thread freezes the editor; never do it while the
2929 // user is mid-operation or the deferred input gets misinterpreted (e.g. a routed track
2930 // ending where the cursor lands once the editor unfreezes).
2932}
2933
2934
2940
2941
2942bool PCB_EDIT_FRAME::GetPluginActionButtonVisible( const wxString& aPluginPath, bool aPluginDefault )
2943{
2944 if( PCBNEW_SETTINGS* cfg = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
2945 {
2946 for( const auto& [identifier, visible] : cfg->m_Plugins.actions )
2947 {
2948 if( identifier == aPluginPath )
2949 return visible;
2950 }
2951 }
2952
2953 // Plugin is not in settings, return default.
2954 return aPluginDefault;
2955}
2956
2957
2959{
2960 return GetBoard()->GetFileName();
2961}
2962
2963
2965{
2966 return m_auimgr.GetPane( wxS( "LayersManager" ) ).IsShown();
2967}
2968
2969
2971{
2972 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
2973}
2974
2975
2977{
2978 return m_auimgr.GetPane( NetInspectorPanelName() ).IsShown();
2979}
2980
2981
2992
2993
3004
3005
3016
3017
3019{
3020 if( !m_footprintDiffDlg )
3021 {
3023 _( "Compare Footprint with Library" ) );
3024
3025 m_footprintDiffDlg->m_sdbSizerApply->SetLabel( _( "Update Footprint from Library..." ) );
3026 m_footprintDiffDlg->m_sdbSizerApply->PostSizeEventToParent();
3027 m_footprintDiffDlg->m_sdbSizerApply->Show();
3028 }
3029
3030 return m_footprintDiffDlg;
3031}
3032
3033
3035{
3037 {
3038 auto* dlg = new DIALOG_FOOTPRINT_FIELDS_TABLE( this );
3039
3040 if( dlg->WasAborted() )
3041 {
3042 dlg->Destroy();
3043 return nullptr;
3044 }
3045
3047 }
3048
3050}
3051
3052
3054{
3055 if( m_inspectDrcErrorDlg && aEvent.GetString() == INSPECT_DRC_ERROR_DIALOG_NAME )
3056 {
3057 m_inspectDrcErrorDlg->Destroy();
3058 m_inspectDrcErrorDlg = nullptr;
3059 }
3060 else if( m_inspectClearanceDlg && aEvent.GetString() == INSPECT_CLEARANCE_DIALOG_NAME )
3061 {
3062 m_inspectClearanceDlg->Destroy();
3063 m_inspectClearanceDlg = nullptr;
3064 }
3065 else if( m_inspectConstraintsDlg && aEvent.GetString() == INSPECT_CONSTRAINTS_DIALOG_NAME )
3066 {
3067 m_inspectConstraintsDlg->Destroy();
3068 m_inspectConstraintsDlg = nullptr;
3069 }
3070 else if( m_footprintDiffDlg && aEvent.GetString() == FOOTPRINT_DIFF_DIALOG_NAME )
3071 {
3072 if( aEvent.GetId() == wxID_APPLY )
3073 {
3074 KIID fpUUID = m_footprintDiffDlg->GetUserItemID();
3075
3076 CallAfter(
3077 [this, fpUUID]()
3078 {
3079 BOARD_ITEM* item = m_pcb->ResolveItem( fpUUID );
3080
3081 if( FOOTPRINT* footprint = dynamic_cast<FOOTPRINT*>( item ) )
3082 {
3083 m_toolManager->RunAction<EDA_ITEM*>( ACTIONS::selectItem, footprint );
3084
3085 DIALOG_EXCHANGE_FOOTPRINTS dialog( this, footprint, true, true );
3086 dialog.ShowQuasiModal();
3087 }
3088 } );
3089 }
3090
3091 m_footprintDiffDlg->Destroy();
3092 m_footprintDiffDlg = nullptr;
3093 }
3094}
3095
3096
3098{
3100 return true;
3101
3103
3104 if( !dlg->Close( false ) )
3105 return false;
3106
3107 if( m_footprintFieldsTableDialog == dlg )
3108 {
3109 dlg->Destroy();
3111 }
3112
3113 return true;
3114}
3115
3116
3118{
3120 {
3123 }
3124}
3125
3126
3128{
3129 wxLogTrace( traceApi, "PCB frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" );
3132 aEvt.Skip();
3133}
3134
3135
3137{
3138 PCB_LAYER_ID curLayer = GetActiveLayer();
3139 const PCB_DISPLAY_OPTIONS& displ_opts = GetDisplayOptions();
3140
3141 // Check if the specified layer matches the present layer
3142 if( layer == curLayer )
3143 return;
3144
3145 // Copper layers cannot be selected unconditionally; how many of those layers are currently
3146 // enabled needs to be checked.
3147 if( IsCopperLayer( layer ) )
3148 {
3149 if( layer > GetBoard()->GetCopperLayerStackMaxId() )
3150 return;
3151 }
3152
3153 // Is yet more checking required? E.g. when the layer to be selected is a non-copper layer,
3154 // or when switching between a copper layer and a non-copper layer, or vice-versa?
3155
3156 SetActiveLayer( layer );
3157
3159 GetCanvas()->Refresh();
3160}
3161
3162
3164{
3165 switch( aItem->Type() )
3166 {
3169 break;
3170
3171 case PCB_BARCODE_T:
3172 ShowBarcodePropertiesDialog( static_cast<PCB_BARCODE*>( aItem ) );
3173 break;
3174
3175 case PCB_FIELD_T:
3176 case PCB_TEXT_T:
3177 ShowTextPropertiesDialog( static_cast<PCB_TEXT*>( aItem ) );
3178 break;
3179
3180 case PCB_TEXTBOX_T:
3181 ShowTextBoxPropertiesDialog( static_cast<PCB_TEXTBOX*>( aItem ) );
3182 break;
3183
3184 case PCB_TABLE_T:
3185 {
3186 DIALOG_TABLE_PROPERTIES dlg( this, static_cast<PCB_TABLE*>( aItem ) );
3187
3188 //QuasiModal required for Scintilla auto-complete
3189 dlg.ShowQuasiModal();
3190 break;
3191 }
3192
3193 case PCB_DRILL_CHART_T:
3194 {
3195 // Not the generic table dialog, which would offer copper layers and direct editing of
3196 // cells that the next rebuild discards
3197 DIALOG_GENERATED_TABLE_PROPERTIES dlg( this, static_cast<PCB_DRILL_CHART*>( aItem ),
3198 []( wxWindow* aParent )
3199 {
3200 return new PANEL_DRILL_CHART_OPTIONS( aParent );
3201 } );
3202 dlg.ShowModal();
3203 break;
3204 }
3205
3206 case PCB_PAD_T:
3207 ShowPadPropertiesDialog( static_cast<PAD&>( *aItem ) );
3208 break;
3209
3210 case PCB_FOOTPRINT_T:
3211 ShowFootprintPropertiesDialog( static_cast<FOOTPRINT*>( aItem ) );
3212 break;
3213
3214 case PCB_TARGET_T:
3215 ShowTargetOptionsDialog( static_cast<PCB_TARGET*>( aItem ) );
3216 break;
3217
3218 case PCB_DIM_ALIGNED_T:
3219 case PCB_DIM_CENTER_T:
3220 case PCB_DIM_RADIAL_T:
3222 case PCB_DIM_LEADER_T:
3223 {
3224 DIALOG_DIMENSION_PROPERTIES dlg( this, static_cast<PCB_DIMENSION_BASE*>( aItem ) );
3225
3226 dlg.ShowModal();
3227 break;
3228 }
3229
3230 case PCB_SHAPE_T:
3231 ShowGraphicItemPropertiesDialog( static_cast<PCB_SHAPE*>( aItem ) );
3232 break;
3233
3234 case PCB_GRID_ITEM_T:
3235 ShowGridItemPropertiesDialog( static_cast<PCB_GRID_ITEM*>( aItem ) );
3236 break;
3237
3238 case PCB_ZONE_T:
3239 Edit_Zone_Params( static_cast<ZONE*>( aItem ) );
3240 break;
3241
3242 case PCB_GROUP_T:
3244 static_cast<EDA_GROUP*>( static_cast<PCB_GROUP*>( aItem ) ) );
3245 break;
3246
3247 case PCB_GENERATOR_T:
3248 static_cast<PCB_GENERATOR*>( aItem )->ShowPropertiesDialog( this );
3249 break;
3250
3251 case PCB_MARKER_T:
3252 m_toolManager->GetTool<DRC_TOOL>()->CrossProbe( static_cast<PCB_MARKER*>( aItem ) );
3253 break;
3254
3255 case PCB_POINT_T:
3256 break;
3257
3258 default:
3259 break;
3260 }
3261}
3262
3263
3265{
3266 // For now we just delegate to the base implementation which commits any pending
3267 // local history snapshots. If PCB-specific preconditions are later needed (e.g.
3268 // flushing zone fills or router state) they can be added here before calling the
3269 // base class method.
3271}
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:128
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:921
BOX2< VECTOR2I > BOX2I
Definition box2.h:914
BOX2< VECTOR2D > BOX2D
Definition box2.h:915
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:294
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:273
static TOOL_ACTION ungroup
Definition actions.h:236
static TOOL_ACTION toggleBoundingBoxes
Definition actions.h:153
static TOOL_ACTION pointEditorArcKeepRadius
Definition actions.h:275
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 showGitCommitPane
Definition actions.h:263
static TOOL_ACTION highContrastMode
Definition actions.h:151
static TOOL_ACTION embeddedFiles
Definition actions.h:298
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:274
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()
Update the colors on all the widgets from the new chosen color theme.
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
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:85
Bridges BOARD's listener stream into the generic TEXT_VAR_TRACKER.
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:411
void BuildListOfNets()
Definition board.h:1180
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition board.cpp:1241
void RemoveAllListeners()
Remove all listeners.
Definition board.cpp:3830
const PAGE_INFO & GetPageSettings() const
Definition board.h:1020
GAL_SET GetVisibleElements() const
Return a set of all the element categories that are visible.
Definition board.cpp:1235
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:4347
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:369
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
Definition board.cpp:3221
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:1703
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
Definition board.cpp:379
const wxString & GetFileName() const
Definition board.h:454
void SetElementVisibility(GAL_LAYER_ID aLayer, bool aNewState)
Change the visibility of an element category.
Definition board.cpp:1247
void ClearProject()
Definition board.cpp:420
bool IsEmpty() const
Definition board.cpp:798
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:2607
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition board.cpp:1174
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:3175
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition board.h:758
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 NONE if not currently in any drawing mode.
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.
static const wxString GitCommitPaneName()
Named here rather than beside the editors' other panes, because the project manager docks this one to...
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.
void ReCreateMenuBar()
Recreate the menu bar.
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.
void setArcModeConditions(const TOOL_ACTION &aDrawArc, const std::function< bool(const SELECTION &)> &aEnable)
Check each arc mode's tool action while the arc tool runs in that mode.
virtual void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Change the current rendering backend.
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()
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
@ GAL_TYPE_MODERN
RHI implementation, Vulkan or Metal on macOS.
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:798
static ENUM_MAP< T > & Instance()
Definition property.h:792
ENUM_MAP & Undefined(T aValue)
Definition property.h:805
wxPGChoices & Choices()
Definition property.h:843
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:417
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
bool Contains(GAL_LAYER_ID aPos)
Definition layer_ids.h:465
Handle actions specific to filling copper zones.
Docked panel for committing: the branch to commit to, a summary and description, the commit options,...
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:92
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
void SetGridColor(const COLOR4D &aGridColor)
Set the grid color.
virtual bool HasRetainedScene() const
Return true if the backend keeps cached groups in a persistent scene that it patches in place,...
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:68
double GetScale() const
Definition view.h:298
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition view.cpp:861
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:2631
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition view.h:431
GAL * GetGAL() const
Return the GAL this view is using to draw graphical primitives.
Definition view.h:224
void SyncLayerVisibilityCache()
Definition view.cpp:2761
void RepaintLayers(const BOX2I &aRect, const std::function< bool(int)> &aLayerFilter, const std::function< bool(VIEW_ITEM *, int)> &aItemFilter)
Re-cache only some layers of the items in aRect.
Definition view.cpp:2656
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition view.h:729
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:2492
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:348
void OnKiCadExit()
Definition kiway.cpp:803
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:401
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:499
LOCAL_HISTORY & LocalHistory()
Return the LOCAL_HISTORY associated with this KIWAY.
Definition kiway.h:457
virtual void CommonSettingsChanged(int aFlags=0)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition kiway.cpp:593
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:51
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:94
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 placeSubGrid
Grid Item.
static TOOL_ACTION zoneDisplayTriangulated
static TOOL_ACTION placeDesignBlock
static TOOL_ACTION selectUnconnected
Select unconnected footprints from ratsnest of selection.
Definition pcb_actions.h:91
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.
static TOOL_ACTION microwaveCreateStub
static TOOL_ACTION selectNet
Select all connections belonging to a single net.
Definition pcb_actions.h:82
static TOOL_ACTION ddImportGraphics
static TOOL_ACTION microwaveCreateLine
static TOOL_ACTION addConstraintFixedLength
static TOOL_ACTION flipBoard
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 ddPlaceReferenceImage
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:85
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
Use to start up the GAL drawing canvas.
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:47
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 ChangeHighContrastLayer(PCB_LAYER_ID aLayer)
Follow an active layer change when nothing else that colours items has changed.
void UpdateColors()
Update the color settings in the painter and GAL.
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
void SetDrawingSheet(DS_PROXY_VIEW_ITEM *aDrawingSheet)
Set or update drawing-sheet used by the draw panel.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the KIGFX::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
Take care of display settings for the given layer to be displayed in high contrast mode.
void RedrawRatsnest()
Force refresh of the ratsnest visual representation.
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)
std::unique_ptr< API_HANDLER_COMMON > m_apiHandlerCommon
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.
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
std::unique_ptr< API_HANDLER_LIBRARIES > m_apiLibrariesHandler
bool m_crossProbeFlashing
Currently flashing guard.
TOOL_ACTION * m_exportNetlistAction
The export board netlist tool action object.
BOX2D m_lastNetnamesViewport
Keep track of viewport so that track net labels can be adjusted when it changes.
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
Use to start up the GAL drawing canvas.
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)
Clear current selection event handler.
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:562
KICAD_API_SERVER & GetApiServer()
Definition pgm_base.h:141
virtual const wxString & GetExecutablePath() const
Definition pgm_base.cpp:888
The interactive edit tool.
void Show(std::ostream &aStream=std::cerr)
Definition profile.h:291
void Reset()
Definition profile.h:281
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:276
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:
T * GetTool()
Return the tool of given type or nullptr if there is no such tool registered.
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.
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
Definition cvpcb.cpp:165
#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:450
#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 and validation.
@ 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
int RefreshGeneratedTables(BOARD &aBoard)
Bring every generated table on the board up to date and return how many were rebuilt.
a few functions useful in geometry calculations.
static const std::string LegacySchematicFileExtension
static const std::string JpegFileExtension
static const std::string PngFileExtension
static const std::string LegacyPcbFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string SVGFileExtension
static 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
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition idf_helpers.h:37
PROJECT & Prj()
Definition kicad.cpp:737
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:918
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition layer_ids.h:741
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:396
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:76
@ 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:108
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition unix/app.cpp:97
@ 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.
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)
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.