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