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 along
20 * with this program. If not, see <http://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/socket.h>
33#include <wx/wupdlock.h>
34
35#include <advanced_config.h>
37#include <kiface_base.h>
38#include <kiway.h>
41#include <pgm_base.h>
42#include <pcb_edit_frame.h>
46#include <bitmaps.h>
47#include <confirm.h>
48#include <footprint.h>
49#include <footprint_utils.h>
50#include <lset.h>
51#include <trace_helpers.h>
52#include <pcbnew_id.h>
53#include <pcbnew_settings.h>
56#include <dialog_find.h>
61#include <dialog_board_setup.h>
65#include <pad.h>
66#include <pcb_target.h>
67#include <pcb_point.h>
68#include <pcb_track.h>
69#include <layer_pairs.h>
72#include <functional>
73#include <pcb_barcode.h>
74#include <pcb_painter.h>
79#include <local_history.h>
80#include <tool/tool_manager.h>
82#include <tool/action_toolbar.h>
83#include <tool/common_control.h>
84#include <tool/common_tools.h>
85#include <tool/embed_tool.h>
87#include <tool/selection.h>
88#include <tool/zoom_tool.h>
89#include <tools/array_tool.h>
94#include <tools/edit_tool.h>
98#include <tools/drc_tool.h>
101#include <tools/convert_tool.h>
102#include <tools/drawing_tool.h>
103#include <tools/pcb_control.h>
111#include <tools/pad_tool.h>
113#include <properties/property.h>
118#include <router/router_tool.h>
121#include <dialog_drc.h> // for DIALOG_DRC_WINDOW_NAME definition
126#include <widgets/wx_infobar.h>
130#include <widgets/wx_aui_utils.h>
131#include <kiplatform/app.h>
132#include <kiplatform/ui.h>
133#include <core/profile.h>
134#include <math/box2_minmax.h>
138#include <toolbars_pcb_editor.h>
140
141#ifdef KICAD_IPC_API
142#include <api/api_server.h>
143#include <api/api_handler_pcb.h>
145#include <api/api_utils.h>
146#endif
147
148#include <richio.h>
149
150using namespace std::placeholders;
151
152
153#define INSPECT_DRC_ERROR_DIALOG_NAME wxT( "InspectDrcErrorDialog" )
154#define INSPECT_CLEARANCE_DIALOG_NAME wxT( "InspectClearanceDialog" )
155#define INSPECT_CONSTRAINTS_DIALOG_NAME wxT( "InspectConstraintsDialog" )
156#define FOOTPRINT_DIFF_DIALOG_NAME wxT( "FootprintDiffDialog" )
157
158
159BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME )
162
165
166 EVT_SIZE( PCB_EDIT_FRAME::OnSize )
167
168 // Menu Files:
171
172 EVT_MENU( wxID_EXIT, PCB_EDIT_FRAME::OnQuit )
173 EVT_MENU( wxID_CLOSE, PCB_EDIT_FRAME::OnQuit )
174
175 // Horizontal toolbar
179
180 // Tracks and vias sizes general options
182 PCB_EDIT_FRAME::Tracks_and_Vias_Size_Event )
183
184 // User interface update event handlers.
185 EVT_UPDATE_UI( ID_AUX_TOOLBAR_PCB_TRACK_WIDTH, PCB_EDIT_FRAME::OnUpdateSelectTrackWidth )
186 EVT_UPDATE_UI( ID_AUX_TOOLBAR_PCB_VIA_SIZE, PCB_EDIT_FRAME::OnUpdateSelectViaSize )
188 PCB_EDIT_FRAME::OnUpdateSelectTrackWidth )
190 PCB_EDIT_FRAME::OnUpdateSelectViaSize )
191 // Drop files event
192 EVT_DROP_FILES( PCB_EDIT_FRAME::OnDropFiles )
193END_EVENT_TABLE()
194
195
196PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
197 PCB_BASE_EDIT_FRAME( aKiway, aParent, FRAME_PCB_EDITOR, _( "PCB Editor" ), wxDefaultPosition, wxDefaultSize,
199 m_exportNetlistAction( nullptr ),
200 m_findDialog( nullptr ),
201 m_findByPropertiesDialog( nullptr ),
202 m_inspectDrcErrorDlg( nullptr ),
203 m_inspectClearanceDlg( nullptr ),
204 m_inspectConstraintsDlg( nullptr ),
205 m_footprintDiffDlg( nullptr ),
206 m_boardSetupDlg( nullptr ),
207 m_designBlocksPane( nullptr ),
208 m_importProperties( nullptr ),
209 m_eventCounterTimer( nullptr )
210{
211 m_maximizeByDefault = true;
212 m_showBorderAndTitleBlock = true; // true to display sheet references
213 m_SelTrackWidthBox = nullptr;
214 m_SelViaSizeBox = nullptr;
215 m_CurrentVariantCtrl = nullptr;
216 m_ShowLayerManagerTools = true;
217 m_supportsAutoSave = true;
218 m_ProbingSchToPcb = false;
219 m_ShowSearch = false;
220 m_ShowNetInspector = false;
221 // Ensure timer has an owner before binding so it generates events.
222 m_crossProbeFlashTimer.SetOwner( this );
223 Bind( wxEVT_TIMER, &PCB_EDIT_FRAME::OnCrossProbeFlashTimer, this, m_crossProbeFlashTimer.GetId() );
224
225 // We don't know what state board was in when it was last saved, so we have to
226 // assume dirty
227 m_ZoneFillsDirty = true;
228
229 m_aboutTitle = _HKI( "KiCad PCB Editor" );
230
231 // Must be created before the menus are created.
232 if( ADVANCED_CFG::GetCfg().m_ShowPcbnewExportNetlist )
233 {
234 m_exportNetlistAction = new TOOL_ACTION( "pcbnew.EditorControl.exportNetlist",
235 AS_GLOBAL, 0, "", _( "Netlist..." ),
236 _( "Export netlist used to update schematics" ) );
237 }
238
239 // Create GAL canvas
240 auto canvas = new PCB_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
241 GetGalDisplayOptions(),
243
244 SetCanvas( canvas );
245 SetBoard( new BOARD() );
246
247 wxIcon icon;
248 wxIconBundle icon_bundle;
249
250 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 48 ) );
251 icon_bundle.AddIcon( icon );
252 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 128 ) );
253 icon_bundle.AddIcon( icon );
254 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 256 ) );
255 icon_bundle.AddIcon( icon );
256 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew_32 ) );
257 icon_bundle.AddIcon( icon );
258 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew_16 ) );
259 icon_bundle.AddIcon( icon );
260
261 SetIcons( icon_bundle );
262
263 // LoadSettings() *after* creating m_LayersManager, because LoadSettings()
264 // initialize parameters in m_LayersManager
265 LoadSettings( config() );
266
267 SetScreen( new PCB_SCREEN( GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS ) ) );
268
269 // PCB drawings start in the upper left corner.
270 GetScreen()->m_Center = false;
271
272 setupTools();
273 setupUIConditions();
274
275 m_toolbarSettings = GetToolbarSettings<PCB_EDIT_TOOLBAR_SETTINGS>( "pcbnew-toolbars" );
276 configureToolbars();
277 RecreateToolbars();
278 PrepareLayerIndicator( true );
279
280 ReCreateMenuBar();
281
282#ifdef KICAD_IPC_API
284 &PCB_EDIT_FRAME::onPluginAvailabilityChanged, this );
285#endif
286
287 // Fetch a COPY of the config as a lot of these initializations are going to overwrite our
288 // data.
289 PCBNEW_SETTINGS::AUI_PANELS aui_cfg = GetPcbNewSettings()->m_AuiPanels;
290
291 m_propertiesPanel = new PCB_PROPERTIES_PANEL( this, this );
292 m_propertiesPanel->SetSplitterProportion( aui_cfg.properties_splitter );
293
294 m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this );
295
296 m_appearancePanel = new APPEARANCE_CONTROLS( this, GetCanvas() );
297 m_searchPane = new PCB_SEARCH_PANE( this );
298 m_netInspectorPanel = new PCB_NET_INSPECTOR_PANEL( this, this );
299 m_designBlocksPane = new PCB_DESIGN_BLOCK_PANE( this, nullptr, m_designBlockHistoryList );
300
301 m_auimgr.SetManagedWindow( this );
302
303 CreateInfoBar();
304
305 unsigned int auiFlags = wxAUI_MGR_DEFAULT;
306#if !defined( _WIN32 )
307 // Windows cannot redraw the UI fast enough during a live resize and may lead to all kinds
308 // of graphical glitches.
309 auiFlags |= wxAUI_MGR_LIVE_RESIZE;
310#endif
311 m_auimgr.SetFlags( auiFlags );
312
313 // Rows; layers 4 - 6
314 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) )
315 .Top().Layer( 6 ) );
316 m_auimgr.AddPane( m_tbTopAux, EDA_PANE().HToolbar().Name( wxS( "TopAuxToolbar" ) )
317 .Top().Layer( 5 ) );
318 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) )
319 .Bottom().Layer( 6 ) );
320
321 // Columns; layers 1 - 3
322 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( wxS( "LeftToolbar" ) )
323 .Left().Layer( 3 ) );
324
325 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( wxS( "RightToolbar" ) )
326 .Right().Layer( 3 ) );
327
328 m_auimgr.AddPane( m_appearancePanel, EDA_PANE().Name( wxS( "LayersManager" ) )
329 .Right().Layer( 4 )
330 .Caption( _( "Appearance" ) ).PaneBorder( false )
331 // Don't use -1 for don't-change-height on a growable panel; it has side-effects.
332 .MinSize( m_appearancePanel->GetMinSize().x, FromDIP( 60 ) )
333#ifdef __WXMAC__
334 // Best size for this pane is calculated larger than necessary on wxMac
335 .BestSize( m_appearancePanel->GetMinSize().x, -1 )
336#else
337 .BestSize( m_appearancePanel->GetBestSize().x, -1 )
338#endif
339 .FloatingSize( m_appearancePanel->GetBestSize() )
340 .CloseButton( false ) );
341
342 m_auimgr.AddPane( m_selectionFilterPanel, EDA_PANE().Name( wxS( "SelectionFilter" ) )
343 .Right().Layer( 4 ).Position( 2 )
344 .Caption( _( "Selection Filter" ) ).PaneBorder( false )
345 // Fixed-size pane; -1 for MinSize height is required
346 .MinSize( m_selectionFilterPanel->GetMinSize().x, -1 )
347 .BestSize( m_selectionFilterPanel->GetBestSize().x, -1 )
348 .FloatingSize( m_selectionFilterPanel->GetBestSize() )
349 .CloseButton( false ) );
350
351 m_auimgr.AddPane( m_designBlocksPane, EDA_PANE().Name( DesignBlocksPaneName() )
352 .Right().Layer( 5 )
353 .Caption( _( "Design Blocks" ) )
354 .CaptionVisible( true )
355 .PaneBorder( true )
356 .TopDockable( false )
357 .BottomDockable( false )
358 .CloseButton( true )
359 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
360 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
361 .FloatingSize( FromDIP( wxSize( 800, 600 ) ) )
362 .FloatingPosition( FromDIP( wxPoint( 50, 200 ) ) )
363 .Show( true ) );
364
365 m_auimgr.AddPane( m_propertiesPanel, EDA_PANE().Name( PropertiesPaneName() )
366 .Left().Layer( 5 )
367 .Caption( _( "Properties" ) ).PaneBorder( false )
368 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
369 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
370 .FloatingSize( wxSize( 300, 200 ) )
371 .CloseButton( true ) );
372
373 // Center
374 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
375 .Center() );
376
377 m_auimgr.AddPane( m_netInspectorPanel, EDA_PANE().Name( NetInspectorPanelName() )
378 .Bottom()
379 .Caption( _( "Net Inspector" ) )
380 .PaneBorder( false )
381 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
382 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
383 .FloatingSize( wxSize( 300, 200 ) )
384 .CloseButton( true ) );
385
386 m_auimgr.AddPane( m_searchPane, EDA_PANE().Name( SearchPaneName() )
387 .Bottom()
388 .Caption( _( "Search" ) ).PaneBorder( false )
389 .MinSize( FromDIP( wxSize ( 180, 60 ) ) )
390 .BestSize( FromDIP( wxSize ( 180, 100 ) ) )
391 .FloatingSize( FromDIP( wxSize( 480, 200 ) ) )
392 .DestroyOnClose( false )
393 .CloseButton( true ) );
394
395 RestoreAuiLayout();
396
397 m_auimgr.GetPane( "LayersManager" ).Show( m_ShowLayerManagerTools );
398 m_auimgr.GetPane( "SelectionFilter" ).Show( m_ShowLayerManagerTools );
399 m_auimgr.GetPane( PropertiesPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.show_properties );
400 m_auimgr.GetPane( NetInspectorPanelName() ).Show( m_ShowNetInspector );
401 m_auimgr.GetPane( SearchPaneName() ).Show( m_ShowSearch );
402 m_auimgr.GetPane( DesignBlocksPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.design_blocks_show );
403
404 // The selection filter doesn't need to grow in the vertical direction when docked
405 m_auimgr.GetPane( "SelectionFilter" ).dock_proportion = 0;
406 FinishAUIInitialization();
407
408 if( aui_cfg.right_panel_width > 0 )
409 {
410 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( wxS( "LayersManager" ) );
411 SetAuiPaneSize( m_auimgr, layersManager, aui_cfg.right_panel_width, -1 );
412
413 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
414 SetAuiPaneSize( m_auimgr, designBlocksPane, aui_cfg.design_blocks_panel_docked_width, -1 );
415 }
416
417 if( aui_cfg.properties_panel_width > 0 && m_propertiesPanel )
418 {
419 wxAuiPaneInfo& propertiesPanel = m_auimgr.GetPane( PropertiesPaneName() );
420 SetAuiPaneSize( m_auimgr, propertiesPanel, aui_cfg.properties_panel_width, -1 );
421 }
422
423 if( aui_cfg.search_panel_height > 0
424 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_TOP
425 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) )
426 {
427 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
428 searchPane.Direction( aui_cfg.search_panel_dock_direction );
429 SetAuiPaneSize( m_auimgr, searchPane, -1, aui_cfg.search_panel_height );
430 }
431 else if( aui_cfg.search_panel_width > 0
432 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_LEFT
433 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) )
434 {
435 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
436 searchPane.Direction( aui_cfg.search_panel_dock_direction );
437 SetAuiPaneSize( m_auimgr, searchPane, aui_cfg.search_panel_width, -1 );
438 }
439
440 m_appearancePanel->SetTabIndex( aui_cfg.appearance_panel_tab );
441
442 {
443 m_layerPairSettings = std::make_unique<LAYER_PAIR_SETTINGS>();
444
445 m_layerPairSettings->Bind( PCB_LAYER_PAIR_PRESETS_CHANGED, [&]( wxCommandEvent& aEvt )
446 {
447 // Update the project file list
448 std::span<const LAYER_PAIR_INFO> newPairInfos = m_layerPairSettings->GetLayerPairs();
450 std::vector<LAYER_PAIR_INFO>{ newPairInfos.begin(), newPairInfos.end() };
451 });
452
453 m_layerPairSettings->Bind( PCB_CURRENT_LAYER_PAIR_CHANGED, [&]( wxCommandEvent& aEvt )
454 {
455 const LAYER_PAIR& layerPair = m_layerPairSettings->GetCurrentLayerPair();
456 PCB_SCREEN& screen = *GetScreen();
457
458 screen.m_Route_Layer_TOP = layerPair.GetLayerA();
459 screen.m_Route_Layer_BOTTOM = layerPair.GetLayerB();
460
461 // Update the toolbar icon
462 PrepareLayerIndicator();
463 });
464 }
465
466 GetToolManager()->PostAction( ACTIONS::zoomFitScreen );
467
468 // This is used temporarily to fix a client size issue on GTK that causes zoom to fit
469 // to calculate the wrong zoom size. See PCB_EDIT_FRAME::onSize().
470 Bind( wxEVT_SIZE, &PCB_EDIT_FRAME::onSize, this );
471
472 Bind( wxEVT_IDLE,
473 [this]( wxIdleEvent& aEvent )
474 {
475 BOX2D viewport = GetCanvas()->GetView()->GetViewport();
476
477 if( viewport != m_lastNetnamesViewport )
478 {
479 redrawNetnames();
480 m_lastNetnamesViewport = viewport;
481 }
482
483 // Do not forget to pass the Idle event to other clients:
484 aEvent.Skip();
485 } );
486
487 resolveCanvasType();
488
489 setupUnits( config() );
490
491 // Ensure the DRC engine is initialized so that constraints can be resolved even before a
492 // board is loaded or saved
493 try
494 {
495 m_toolManager->GetTool<DRC_TOOL>()->GetDRCEngine()->InitEngine( wxFileName() );
496 }
497 catch( PARSE_ERROR& )
498 {
499 }
500
501 // Sync action plugins in case they changed since the last time the frame opened
502 GetToolManager()->RunAction( ACTIONS::pluginsReload );
503
504#ifdef KICAD_IPC_API
505 m_apiHandler = std::make_unique<API_HANDLER_PCB>( this );
506 Pgm().GetApiServer().RegisterHandler( m_apiHandler.get() );
507
508 if( Kiface().IsSingle() )
509 {
510 m_apiHandlerCommon = std::make_unique<API_HANDLER_COMMON>();
511 Pgm().GetApiServer().RegisterHandler( m_apiHandlerCommon.get() );
512 }
513#endif
514
515 GetCanvas()->SwitchBackend( m_canvasType );
516 ActivateGalCanvas();
517
518 // Default shutdown reason until a file is loaded
519 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New PCB file is unsaved" ) );
520
521 // disable Export STEP item if kicad2step does not exist
522 wxString strK2S = Pgm().GetExecutablePath();
523
524#ifdef __WXMAC__
525 if( strK2S.Find( wxT( "pcbnew.app" ) ) != wxNOT_FOUND )
526 {
527 // On macOS, we have standalone applications inside the main bundle, so we handle that here:
528 strK2S += wxT( "../../" );
529 }
530
531 strK2S += wxT( "Contents/MacOS/" );
532#endif
533
534 wxFileName appK2S( strK2S, wxT( "kicad2step" ) );
535
536#ifdef _WIN32
537 appK2S.SetExt( wxT( "exe" ) );
538#endif
539
540 // Ensure the window is on top
541 Raise();
542
543// if( !appK2S.FileExists() )
544 // GetMenuBar()->FindItem( ID_GEN_EXPORT_FILE_STEP )->Enable( false );
545
546 // AUI doesn't refresh properly on wxMac after changes in eb7dc6dd, so force it to
547#ifdef __WXMAC__
548 if( Kiface().IsSingle() )
549 {
550 CallAfter( [this]()
551 {
552 m_appearancePanel->OnBoardChanged();
553 } );
554 }
555#endif
556
557 // Register a call to update the toolbar sizes. It can't be done immediately because
558 // it seems to require some sizes calculated that aren't yet (at least on GTK).
559 CallAfter( [this]()
560 {
561 // Ensure the controls on the toolbars all are correctly sized
562 UpdateToolbarControlSizes();
563
564 // Update the angle snap mode toolbar button to reflect the current preference
565 GetToolManager()->RunAction( PCB_ACTIONS::angleSnapModeChanged );
566 } );
567
568 if( ADVANCED_CFG::GetCfg().m_ShowEventCounters )
569 {
570 m_eventCounterTimer = new wxTimer( this );
571
572 Bind( wxEVT_TIMER,
573 [&]( wxTimerEvent& aEvent )
574 {
575 GetCanvas()->m_PaintEventCounter->Show();
576 GetCanvas()->m_PaintEventCounter->Reset();
577
579 static_cast<KIGFX::WX_VIEW_CONTROLS*>( GetCanvas()->GetViewControls() );
582
583 },
584 m_eventCounterTimer->GetId() );
585
586 m_eventCounterTimer->Start( 1000 );
587 }
588
591 m_acceptedExts.emplace( wxS( "dxf" ), &PCB_ACTIONS::ddImportGraphics );
593 DragAcceptFiles( true );
594
595 Bind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs, this );
596}
597
598
599void PCB_EDIT_FRAME::StartCrossProbeFlash( const std::vector<BOARD_ITEM*>& aItems )
600{
601 if( !GetPcbNewSettings()->m_CrossProbing.flash_selection )
602 {
603 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): aborted (setting disabled) items=%zu",
604 aItems.size() );
605 return;
606 }
607
608 if( aItems.empty() )
609 {
610 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): aborted (no items)" );
611 return;
612 }
613
614 // Don't start flashing if any of the items are being moved. The flash timer toggles
615 // selection hide/show which corrupts the VIEW overlay state during an active move.
616 for( const BOARD_ITEM* item : aItems )
617 {
618 if( item->IsMoving() )
619 {
620 wxLogTrace( traceCrossProbeFlash,
621 "StartCrossProbeFlash(PCB): aborted (items are moving)" );
622 return;
623 }
624 }
625
627 {
628 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): restarting existing flash (phase=%d)",
631 }
632
633 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): starting with %zu items", aItems.size() );
634
635 // Store uuids
637 for( BOARD_ITEM* it : aItems )
638 m_crossProbeFlashItems.push_back( it->m_Uuid );
639
642
643 if( !m_crossProbeFlashTimer.GetOwner() )
644 m_crossProbeFlashTimer.SetOwner( this );
645
646 bool started = m_crossProbeFlashTimer.Start( 500, wxTIMER_CONTINUOUS ); // 0.5s intervals -> 3s total for 6 phases
647 wxLogTrace( traceCrossProbeFlash, "StartCrossProbeFlash(PCB): timer start=%d id=%d",
648 (int) started, m_crossProbeFlashTimer.GetId() );
649}
650
651
652void PCB_EDIT_FRAME::OnCrossProbeFlashTimer( wxTimerEvent& aEvent )
653{
654 wxLogTrace( traceCrossProbeFlash, "Timer(PCB) fired: phase=%d running=%d items=%zu",
656
658 {
659 wxLogTrace( traceCrossProbeFlash, "Timer(PCB) fired but not flashing (ignored)" );
660 return;
661 }
662
664
665 if( !selTool )
666 return;
667
668 // Don't manipulate the selection while items are being moved. The move tool holds a
669 // live reference to the selection and toggling hide/show on selected items corrupts
670 // the VIEW overlay state, causing crashes.
671 for( const KIID& id : m_crossProbeFlashItems )
672 {
673 if( EDA_ITEM* item = GetBoard()->ResolveItem( id, true ) )
674 {
675 if( item->IsMoving() )
676 {
677 wxLogTrace( traceCrossProbeFlash,
678 "Timer(PCB) phase=%d: items are moving, stopping flash",
680 m_crossProbeFlashing = false;
682 return;
683 }
684 }
685 }
686
687 // Prevent recursion / IPC during flashing
688 bool prevGuard = m_ProbingSchToPcb;
689 m_ProbingSchToPcb = true;
690
691 if( m_crossProbeFlashPhase % 2 == 0 )
692 {
693 // Hide selection
694 selTool->ClearSelection( true );
695 wxLogTrace( traceCrossProbeFlash, "Phase %d (PCB): cleared selection", m_crossProbeFlashPhase );
696 }
697 else
698 {
699 // Restore selection
700 for( const KIID& id : m_crossProbeFlashItems )
701 {
702 if( EDA_ITEM* item = GetBoard()->ResolveItem( id, true ) )
703 selTool->AddItemToSel( item, true );
704 }
705
706 wxLogTrace( traceCrossProbeFlash, "Phase %d (PCB): restored %zu items",
708 }
709
710 // Force a redraw even if the canvas / frame does not currently have focus (mouse elsewhere)
711 if( GetCanvas() )
712 {
714 wxLogTrace( traceCrossProbeFlash, "Phase %d (PCB): forced canvas refresh",
716 }
717
718 m_ProbingSchToPcb = prevGuard;
719
721
722 if( m_crossProbeFlashPhase > 6 )
723 {
724 // Ensure final state (selected)
725 for( const KIID& id : m_crossProbeFlashItems )
726 {
727 if( EDA_ITEM* item = GetBoard()->ResolveItem( id, true ) )
728 selTool->AddItemToSel( item, true );
729 }
730
731 m_crossProbeFlashing = false;
733
734 wxLogTrace( traceCrossProbeFlash, "Flashing complete (PCB). Final selection size=%zu",
735 m_crossProbeFlashItems.size() );
736 }
737}
738
739
741{
742 if( ADVANCED_CFG::GetCfg().m_ShowEventCounters )
743 {
744 // Stop the timer during destruction early to avoid potential event race conditions (that
745 // do happen on windows)
746 m_eventCounterTimer->Stop();
747 delete m_eventCounterTimer;
748 }
749
750 // Close modeless dialogs
751 wxWindow* drcDlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
752
753 if( drcDlg )
754 drcDlg->Close( true );
755
756 wxWindow* ruleEditorDlg = wxWindow::FindWindowByName( DIALOG_DRC_RULE_EDITOR_WINDOW_NAME );
757
758 if( ruleEditorDlg )
759 ruleEditorDlg->Close( true );
760
761 // Shutdown all running tools
762 if( m_toolManager )
763 m_toolManager->ShutdownAllTools();
764
765 if( GetBoard() )
767
768 // We passed ownership of these to wxAuiManager.
769 // delete m_selectionFilterPanel;
770 // delete m_appearancePanel;
771 // delete m_propertiesPanel;
772 // delete m_netInspectorPanel;
773
775}
776
777
778void PCB_EDIT_FRAME::SetBoard( BOARD* aBoard, bool aBuildConnectivity,
779 PROGRESS_REPORTER* aReporter )
780{
781 if( m_pcb )
782 m_pcb->ClearProject();
783
784 PCB_BASE_EDIT_FRAME::SetBoard( aBoard, aReporter );
785
786 aBoard->SetProject( &Prj() );
787
788 if( aBuildConnectivity )
789 aBoard->BuildConnectivity();
790
791 // reload the drawing-sheet
792 SetPageSettings( aBoard->GetPageSettings() );
793
795}
796
797
802
803
804std::unique_ptr<GRID_HELPER> PCB_EDIT_FRAME::MakeGridHelper()
805{
806 return std::make_unique<PCB_GRID_HELPER>( m_toolManager, GetMagneticItemsSettings() );
807}
808
809
811{
812 /*
813 * While new items being scrolled into the view will get painted, they will only get
814 * annotated with netname instances currently within the view. Subsequent panning will not
815 * draw newly-visible netname instances because the item has already been drawn.
816 *
817 * This routine, fired on idle if the viewport has changed, looks for visible items that
818 * might have multiple netname instances and redraws them. (It does not need to handle pads
819 * and vias because they only ever have a single netname instance drawn on them.)
820 */
821 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() );
822
823 if( !cfg || cfg->m_Display.m_NetNames < 2 )
824 return;
825
826 KIGFX::VIEW* view = GetCanvas()->GetView();
827 BOX2D viewport = view->GetViewport();
828
829 // Inflate to catch most of the track width
830 BOX2I_MINMAX clipbox( BOX2ISafe( viewport.Inflate( pcbIUScale.mmToIU( 2.0 ) ) ) );
831
832 for( PCB_TRACK* track : GetBoard()->Tracks() )
833 {
834 // Don't need to update vias
835 if( track->Type() == PCB_VIA_T )
836 continue;
837
838 // Don't update invisible tracks
839 if( !clipbox.Intersects( BOX2I_MINMAX( track->GetStart(), track->GetEnd() ) ) )
840 continue;
841
842 if( track->ViewGetLOD( GetNetnameLayer( track->GetLayer() ), view ) < view->GetScale() )
843 view->Update( track, KIGFX::REPAINT );
844 }
845}
846
847
848void PCB_EDIT_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
849{
850 PCB_BASE_FRAME::SetPageSettings( aPageSettings );
851
852 // Prepare drawing-sheet template
854 &m_pcb->GetPageSettings(),
855 m_pcb->GetProject(),
856 &m_pcb->GetTitleBlock(),
857 &m_pcb->GetProperties() );
858
859 drawingSheet->SetSheetName( std::string( GetScreenDesc().mb_str() ) );
860 drawingSheet->SetSheetPath( std::string( GetFullScreenDesc().mb_str() ) );
861
862 // A board is not like a schematic having a main page and sub sheets.
863 // So for the drawing sheet, use only the first page option to display items
864 drawingSheet->SetIsFirstPage( true );
865
866 BASE_SCREEN* screen = GetScreen();
867
868 if( screen != nullptr )
869 {
870 drawingSheet->SetPageNumber(TO_UTF8( screen->GetPageNumber() ) );
871 drawingSheet->SetSheetCount( screen->GetPageCount() );
872 }
873
874 if( BOARD* board = GetBoard() )
875 {
876 drawingSheet->SetFileName( TO_UTF8( board->GetFileName() ) );
877 wxString currentVariant = board->GetCurrentVariant();
878 wxString variantDesc = board->GetVariantDescription( currentVariant );
879 drawingSheet->SetVariantName( TO_UTF8( currentVariant ) );
880 drawingSheet->SetVariantDesc( TO_UTF8( variantDesc ) );
881 }
882
883 // PCB_DRAW_PANEL_GAL takes ownership of the drawing-sheet
884 GetCanvas()->SetDrawingSheet( drawingSheet );
885}
886
887
889{
890 return GetScreen() && GetScreen()->IsContentModified();
891}
892
893
895{
896 return m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
897}
898
899
901{
902 // Create the manager and dispatcher & route draw panel events to the dispatcher
904 m_toolManager->SetEnvironment( m_pcb, GetCanvas()->GetView(),
905 GetCanvas()->GetViewControls(), config(), this );
906 m_actions = new PCB_ACTIONS();
908
909 // Register tools
910 m_toolManager->RegisterTool( new COMMON_CONTROL );
911 m_toolManager->RegisterTool( new COMMON_TOOLS );
912 m_toolManager->RegisterTool( new PCB_SELECTION_TOOL );
913 m_toolManager->RegisterTool( new ZOOM_TOOL );
914 m_toolManager->RegisterTool( new PCB_PICKER_TOOL );
915 m_toolManager->RegisterTool( new ROUTER_TOOL );
916 m_toolManager->RegisterTool( new EDIT_TOOL );
917 m_toolManager->RegisterTool( new PCB_EDIT_TABLE_TOOL );
918 m_toolManager->RegisterTool( new GLOBAL_EDIT_TOOL );
919 m_toolManager->RegisterTool( new PAD_TOOL );
920 m_toolManager->RegisterTool( new DRAWING_TOOL );
921 m_toolManager->RegisterTool( new PCB_POINT_EDITOR );
922 m_toolManager->RegisterTool( new PCB_CONTROL );
923 m_toolManager->RegisterTool( new PCB_DESIGN_BLOCK_CONTROL );
924 m_toolManager->RegisterTool( new BOARD_EDITOR_CONTROL );
925 m_toolManager->RegisterTool( new BOARD_INSPECTION_TOOL );
926 m_toolManager->RegisterTool( new BOARD_REANNOTATE_TOOL );
927 m_toolManager->RegisterTool( new ALIGN_DISTRIBUTE_TOOL );
928 m_toolManager->RegisterTool( new MICROWAVE_TOOL );
929 m_toolManager->RegisterTool( new POSITION_RELATIVE_TOOL );
930 m_toolManager->RegisterTool( new ARRAY_TOOL );
931 m_toolManager->RegisterTool( new ZONE_FILLER_TOOL );
932 m_toolManager->RegisterTool( new AUTOPLACE_TOOL );
933 m_toolManager->RegisterTool( new DRC_TOOL );
934 m_toolManager->RegisterTool( new PCB_VIEWER_TOOLS );
935 m_toolManager->RegisterTool( new CONVERT_TOOL );
936 m_toolManager->RegisterTool( new PCB_GROUP_TOOL );
937 m_toolManager->RegisterTool( new GENERATOR_TOOL );
938 m_toolManager->RegisterTool( new PROPERTIES_TOOL );
939 m_toolManager->RegisterTool( new MULTICHANNEL_TOOL );
940 m_toolManager->RegisterTool( new EMBED_TOOL );
941 m_toolManager->RegisterTool( new DRC_RULE_EDITOR_TOOL );
942 m_toolManager->InitTools();
943
944 for( TOOL_BASE* tool : m_toolManager->Tools() )
945 {
946 if( PCB_TOOL_BASE* pcbTool = dynamic_cast<PCB_TOOL_BASE*>( tool ) )
947 pcbTool->SetIsBoardEditor( true );
948 }
949
950 // Run the selection tool, it is supposed to be always active
951 m_toolManager->InvokeTool( "common.InteractiveSelection" );
952}
953
954
956{
958
959 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
960 PCB_EDITOR_CONDITIONS cond( this );
961
962 auto undoCond =
963 [ this ] (const SELECTION& aSel )
964 {
965 DRAWING_TOOL* drawingTool = m_toolManager->GetTool<DRAWING_TOOL>();
966
967 if( drawingTool && drawingTool->GetDrawingMode() != DRAWING_TOOL::MODE::NONE )
968 return true;
969
970 ROUTER_TOOL* routerTool = m_toolManager->GetTool<ROUTER_TOOL>();
971
972 if( routerTool && routerTool->RoutingInProgress() )
973 return true;
974
975 return GetUndoCommandCount() > 0;
976 };
977
978 auto groupWithDesignBlockLink =
979 [] ( const SELECTION& aSel )
980 {
981 if( aSel.Size() != 1 )
982 return false;
983
984 if( aSel[0]->Type() != PCB_GROUP_T )
985 return false;
986
987 PCB_GROUP* group = static_cast<PCB_GROUP*>( aSel.GetItem( 0 ) );
988
989 return group->HasDesignBlockLink();
990 };
991
992 wxASSERT( mgr );
993
994#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
995#define CHECK( x ) ACTION_CONDITIONS().Check( x )
996// clang-format off
997
999 mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) );
1001
1005
1006 mgr->SetConditions( ACTIONS::cut, ENABLE( cond.HasItems() ) );
1007 mgr->SetConditions( ACTIONS::copy, ENABLE( cond.HasItems() ) );
1014
1015 static const std::vector<KICAD_T> groupTypes = { PCB_GROUP_T, PCB_GENERATOR_T };
1016
1021
1022 mgr->SetConditions( PCB_ACTIONS::placeLinkedDesignBlock, ENABLE( groupWithDesignBlockLink) );
1023 mgr->SetConditions( PCB_ACTIONS::saveToLinkedDesignBlock, ENABLE( groupWithDesignBlockLink) );
1024
1030
1031 auto enableZoneControlCondition =
1032 [this] ( const SELECTION& )
1033 {
1036 };
1037
1039 ENABLE( enableZoneControlCondition )
1042 ENABLE( enableZoneControlCondition )
1045 ENABLE( enableZoneControlCondition )
1048 ENABLE( enableZoneControlCondition )
1050
1052
1053 auto hasElements =
1054 [ this ] ( const SELECTION& aSel )
1055 {
1056 return GetBoard() &&
1057 ( !GetBoard()->IsEmpty() || !SELECTION_CONDITIONS::Idle( aSel ) );
1058 };
1059
1060 auto boardFlippedCond =
1061 [this]( const SELECTION& )
1062 {
1064 };
1065
1066 auto layerManagerCond =
1067 [this] ( const SELECTION& )
1068 {
1069 return LayerManagerShown();
1070 };
1071
1072 auto propertiesCond =
1073 [this] ( const SELECTION& )
1074 {
1075 return PropertiesShown();
1076 };
1077
1078 auto netInspectorCond =
1079 [this] ( const SELECTION& )
1080 {
1081 return NetInspectorShown();
1082 };
1083
1084 auto searchPaneCond =
1085 [this] ( const SELECTION& )
1086 {
1087 return m_auimgr.GetPane( SearchPaneName() ).IsShown();
1088 };
1089
1090 auto designBlockCond =
1091 [ this ] (const SELECTION& aSel )
1092 {
1093 return m_auimgr.GetPane( DesignBlocksPaneName() ).IsShown();
1094 };
1095
1096 auto highContrastCond =
1097 [this] ( const SELECTION& )
1098 {
1100 };
1101
1102 auto globalRatsnestCond =
1103 [this] (const SELECTION& )
1104 {
1106 return cfg && cfg->m_Display.m_ShowGlobalRatsnest;
1107 };
1108
1109 auto curvedRatsnestCond =
1110 [this] (const SELECTION& )
1111 {
1113 return cfg && cfg->m_Display.m_DisplayRatsnestLinesCurved;
1114 };
1115
1116 auto netHighlightCond =
1117 [this]( const SELECTION& )
1118 {
1119 if( auto* canvas = GetCanvas() )
1120 {
1121 if( auto* view = canvas->GetView() )
1122 {
1123 if( auto* painter = view->GetPainter() )
1124 {
1125 if( auto* settings = painter->GetSettings() )
1126 return !settings->GetHighlightNetCodes().empty();
1127 }
1128 }
1129 }
1130
1131 return false;
1132 };
1133
1134 auto enableNetHighlightCond =
1135 [this]( const SELECTION& )
1136 {
1138 return tool && tool->IsNetHighlightSet();
1139 };
1140
1141 mgr->SetConditions( ACTIONS::highContrastMode, CHECK( highContrastCond ) );
1142 mgr->SetConditions( PCB_ACTIONS::flipBoard, CHECK( boardFlippedCond ) );
1143 mgr->SetConditions( PCB_ACTIONS::showLayersManager, CHECK( layerManagerCond ) );
1144 mgr->SetConditions( PCB_ACTIONS::showRatsnest, CHECK( globalRatsnestCond ) );
1145 mgr->SetConditions( PCB_ACTIONS::ratsnestLineMode, CHECK( curvedRatsnestCond ) );
1146 mgr->SetConditions( PCB_ACTIONS::toggleNetHighlight, CHECK( netHighlightCond )
1147 .Enable( enableNetHighlightCond ) );
1148 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
1149 mgr->SetConditions( PCB_ACTIONS::showNetInspector, CHECK( netInspectorCond ) );
1150 mgr->SetConditions( PCB_ACTIONS::showSearch, CHECK( searchPaneCond ) );
1151 mgr->SetConditions( PCB_ACTIONS::showDesignBlockPanel, CHECK( designBlockCond ) );
1152
1155
1156 const auto isArcKeepCenterMode =
1157 [this]( const SELECTION& )
1158 {
1161 };
1162
1163 const auto isArcKeepEndpointMode =
1164 [this]( const SELECTION& )
1165 {
1168 };
1169
1170 const auto isArcKeepRadiusMode =
1171 [this]( const SELECTION& )
1172 {
1175 };
1176
1177 mgr->SetConditions( ACTIONS::pointEditorArcKeepCenter, CHECK( isArcKeepCenterMode ) );
1178 mgr->SetConditions( ACTIONS::pointEditorArcKeepEndpoint, CHECK( isArcKeepEndpointMode ) );
1179 mgr->SetConditions( ACTIONS::pointEditorArcKeepRadius, CHECK( isArcKeepRadiusMode ) );
1180
1181 auto isHighlightMode =
1182 [this]( const SELECTION& )
1183 {
1184 ROUTER_TOOL* tool = m_toolManager->GetTool<ROUTER_TOOL>();
1185 return tool && tool->GetRouterMode() == PNS::RM_MarkObstacles;
1186 };
1187
1188 auto isShoveMode =
1189 [this]( const SELECTION& )
1190 {
1191 ROUTER_TOOL* tool = m_toolManager->GetTool<ROUTER_TOOL>();
1192 return tool && tool->GetRouterMode() == PNS::RM_Shove;
1193 };
1194
1195 auto isWalkaroundMode =
1196 [this]( const SELECTION& )
1197 {
1198 ROUTER_TOOL* tool = m_toolManager->GetTool<ROUTER_TOOL>();
1199 return tool && tool->GetRouterMode() == PNS::RM_Walkaround;
1200 };
1201
1202 mgr->SetConditions( PCB_ACTIONS::routerHighlightMode, CHECK( isHighlightMode ) );
1203 mgr->SetConditions( PCB_ACTIONS::routerShoveMode, CHECK( isShoveMode ) );
1204 mgr->SetConditions( PCB_ACTIONS::routerWalkaroundMode, CHECK( isWalkaroundMode ) );
1205
1206 auto isAutoTrackWidth =
1207 [this]( const SELECTION& )
1208 {
1210 };
1211
1212 mgr->SetConditions( PCB_ACTIONS::autoTrackWidth, CHECK( isAutoTrackWidth ) );
1213
1214 auto haveNetCond =
1215 [] ( const SELECTION& aSel )
1216 {
1217 for( EDA_ITEM* item : aSel )
1218 {
1219 if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
1220 {
1221 if( bci->GetNetCode() > 0 )
1222 return true;
1223 }
1224 }
1225
1226 return false;
1227 };
1228
1229 mgr->SetConditions( PCB_ACTIONS::showNetInRatsnest, ENABLE( haveNetCond ) );
1230 mgr->SetConditions( PCB_ACTIONS::hideNetInRatsnest, ENABLE( haveNetCond ) );
1233
1234 static const std::vector<KICAD_T> trackTypes = { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T };
1235 static const std::vector<KICAD_T> padOwnerTypes = { PCB_FOOTPRINT_T, PCB_PAD_T };
1236 static const std::vector<KICAD_T> footprintTypes = { PCB_FOOTPRINT_T };
1237 static const std::vector<KICAD_T> crossProbeTypes = { PCB_PAD_T, PCB_FOOTPRINT_T, PCB_GROUP_T };
1238 static const std::vector<KICAD_T> zoneTypes = { PCB_ZONE_T };
1239
1245
1246
1248 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1249
1251 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1252
1253 mgr->SetConditions( PCB_ACTIONS::zoneDuplicate, ENABLE( singleZoneCond ) );
1254 mgr->SetConditions( PCB_ACTIONS::drawZoneCutout, ENABLE( singleZoneCond ) );
1255 mgr->SetConditions( PCB_ACTIONS::drawSimilarZone, ENABLE( singleZoneCond ) );
1256 mgr->SetConditions( PCB_ACTIONS::zoneMerge, ENABLE( zoneMergeCond ) );
1257
1260
1261#define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
1262
1263 // These tools can be used at any time to inspect the board
1268
1269 auto isDRCIdle =
1270 [this] ( const SELECTION& )
1271 {
1272 DRC_TOOL* tool = m_toolManager->GetTool<DRC_TOOL>();
1273 return !( tool && tool->IsDRCRunning() );
1274 };
1275
1276#define CURRENT_EDIT_TOOL( action ) \
1277 mgr->SetConditions( action, ACTION_CONDITIONS().Check( cond.CurrentTool( action ) ) \
1278 .Enable( isDRCIdle ) )
1279
1280 // These tools edit the board, so they must be disabled during some operations
1312
1318
1319#undef CURRENT_TOOL
1320#undef CURRENT_EDIT_TOOL
1321#undef ENABLE
1322#undef CHECK
1323// clang-format on
1324}
1325
1326
1327void PCB_EDIT_FRAME::OnQuit( wxCommandEvent& event )
1328{
1329 if( event.GetId() == wxID_EXIT )
1330 Kiway().OnKiCadExit();
1331
1332 if( event.GetId() == wxID_CLOSE || Kiface().IsSingle() )
1333 Close( false );
1334}
1335
1336
1337void PCB_EDIT_FRAME::ResolveDRCExclusions( bool aCreateMarkers )
1338{
1339 BOARD_COMMIT commit( this );
1340
1341 for( PCB_MARKER* marker : GetBoard()->ResolveDRCExclusions( aCreateMarkers ) )
1342 {
1343 if( marker->GetMarkerType() == MARKER_BASE::MARKER_DRAWING_SHEET )
1344 marker->GetRCItem()->SetItems( GetCanvas()->GetDrawingSheet() );
1345
1346 commit.Add( marker );
1347 }
1348
1349 commit.Push( wxEmptyString, SKIP_UNDO | SKIP_SET_DIRTY );
1350
1351 for( PCB_MARKER* marker : GetBoard()->Markers() )
1352 {
1353 if( marker->GetSeverity() == RPT_SEVERITY_EXCLUSION )
1354 GetCanvas()->GetView()->Update( marker );
1355 }
1356
1358}
1359
1360
1361bool PCB_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
1362{
1363 // Shutdown blocks must be determined and vetoed as early as possible
1364 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
1365 && IsContentModified() )
1366 {
1367 return false;
1368 }
1369
1370 ZONE_FILLER_TOOL* zoneFillerTool = m_toolManager->GetTool<ZONE_FILLER_TOOL>();
1371
1372 if( zoneFillerTool->IsBusy() )
1373 {
1374 wxBell();
1375
1376 if( wxWindow* reporter = dynamic_cast<wxWindow*>( zoneFillerTool->GetProgressReporter() ) )
1377 reporter->ShowWithEffect( wxSHOW_EFFECT_EXPAND );
1378
1379 return false;
1380 }
1381
1382 // Don't allow closing while the modal footprint chooser is open
1383 auto* chooser = (FOOTPRINT_CHOOSER_FRAME*) Kiway().Player( FRAME_FOOTPRINT_CHOOSER, false );
1384
1385 if( chooser && chooser->IsModal() ) // Can close footprint chooser?
1386 return false;
1387
1388 if( Kiface().IsSingle() )
1389 {
1390 auto* fpEditor = (FOOTPRINT_EDIT_FRAME*) Kiway().Player( FRAME_FOOTPRINT_EDITOR, false );
1391
1392 if( fpEditor && !fpEditor->Close() ) // Can close footprint editor?
1393 return false;
1394
1395 auto* fpViewer = (FOOTPRINT_VIEWER_FRAME*) Kiway().Player( FRAME_FOOTPRINT_VIEWER, false );
1396
1397 if( fpViewer && !fpViewer->Close() ) // Can close footprint viewer?
1398 return false;
1399 }
1400 else
1401 {
1402 auto* fpEditor = (FOOTPRINT_EDIT_FRAME*) Kiway().Player( FRAME_FOOTPRINT_EDITOR, false );
1403
1404 if( fpEditor && fpEditor->IsCurrentFPFromBoard() )
1405 {
1406 if( !fpEditor->CanCloseFPFromBoard( true ) )
1407 return false;
1408 }
1409 }
1410
1411 if( IsContentModified() )
1412 {
1413 wxFileName fileName = GetBoard()->GetFileName();
1414 wxString msg = _( "Save changes to '%s' before closing?" );
1415
1416 if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
1417 [&]() -> bool
1418 {
1419 return SaveBoard();
1420 } ) )
1421 {
1422 return false;
1423 }
1424
1425 // If user discarded changes, create a duplicate commit of last saved PCB state and
1426 // advance Last_Save_pcb tag for explicit history event.
1427 if( GetLastUnsavedChangesResponse() == wxID_NO )
1428 {
1429 wxString projPath = Prj().GetProjectPath();
1430
1431 if( !projPath.IsEmpty() && Kiway().LocalHistory().HistoryExists( projPath ) )
1432 {
1433 Kiway().LocalHistory().CommitDuplicateOfLastSave( projPath, wxS("pcb"),
1434 wxS("Discard unsaved pcb changes") );
1435 }
1436 }
1437 }
1438
1439 return PCB_BASE_EDIT_FRAME::canCloseWindow( aEvent );
1440}
1441
1442
1444{
1445 // Unregister the autosave saver before any cleanup that might invalidate the board
1446 if( GetBoard() )
1448
1449 // On Windows 7 / 32 bits, on OpenGL mode only, Pcbnew crashes
1450 // when closing this frame if a footprint was selected, and the footprint editor called
1451 // to edit this footprint, and when closing pcbnew if this footprint is still selected
1452 // See https://bugs.launchpad.net/kicad/+bug/1655858
1453 // I think this is certainly a OpenGL event fired after frame deletion, so this workaround
1454 // avoid the crash (JPC)
1455 GetCanvas()->SetEvtHandlerEnabled( false );
1456
1458
1459#ifdef KICAD_IPC_API
1460 Pgm().GetApiServer().DeregisterHandler( m_apiHandler.get() );
1461 wxTheApp->Unbind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED,
1462 &PCB_EDIT_FRAME::onPluginAvailabilityChanged, this );
1463#endif
1464
1465 // Clean up mode-less dialogs.
1466 Unbind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs,
1467 this );
1468
1469 wxWindow* drcDlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
1470
1471 if( drcDlg )
1472 drcDlg->Close( true );
1473
1474 wxWindow* ruleEditorDlg = wxWindow::FindWindowByName( DIALOG_DRC_RULE_EDITOR_WINDOW_NAME );
1475
1476 if( ruleEditorDlg )
1477 ruleEditorDlg->Close( true );
1478
1479
1480 if( m_findDialog )
1481 {
1482 m_findDialog->Destroy();
1483 m_findDialog = nullptr;
1484 }
1485
1487 {
1488 m_findByPropertiesDialog->Destroy();
1489 m_findByPropertiesDialog = nullptr;
1490 }
1491
1493 {
1494 m_inspectDrcErrorDlg->Destroy();
1495 m_inspectDrcErrorDlg = nullptr;
1496 }
1497
1499 {
1500 m_inspectClearanceDlg->Destroy();
1501 m_inspectClearanceDlg = nullptr;
1502 }
1503
1505 {
1506 m_inspectConstraintsDlg->Destroy();
1507 m_inspectConstraintsDlg = nullptr;
1508 }
1509
1510 if( m_footprintDiffDlg )
1511 {
1512 m_footprintDiffDlg->Destroy();
1513 m_footprintDiffDlg = nullptr;
1514 }
1515
1516 // Delete the auto save file if it exists.
1517 wxFileName fn = GetBoard()->GetFileName();
1518
1519 // Make sure local settings are persisted
1520 if( Prj().GetLocalSettings().ShouldAutoSave() )
1521 {
1522 m_netInspectorPanel->SaveSettings();
1524 }
1525 else
1526 {
1527 wxLogTrace( traceAutoSave, wxT( "Skipping auto-save of migrated local settings" ) );
1528 }
1529
1530 // Do not show the layer manager during closing to avoid flicker
1531 // on some platforms (Windows) that generate useless redraw of items in
1532 // the Layer Manager
1534 {
1535 m_auimgr.GetPane( wxS( "LayersManager" ) ).Show( false );
1536 m_auimgr.GetPane( wxS( "TabbedPanel" ) ).Show( false );
1537 }
1538
1539 // Unlink the old project if needed
1541
1542 // Delete board structs and undo/redo lists, to avoid crash on exit
1543 // when deleting some structs (mainly in undo/redo lists) too late
1544 Clear_Pcb( false, true );
1545
1546 // do not show the window because ScreenPcb will be deleted and we do not
1547 // want any paint event
1548 Show( false );
1549
1551}
1552
1553
1560
1561
1562void PCB_EDIT_FRAME::ShowBoardSetupDialog( const wxString& aInitialPage, wxWindow* aParent )
1563{
1564 static std::mutex dialogMutex; // Local static mutex
1565
1566 std::unique_lock<std::mutex> dialogLock( dialogMutex, std::try_to_lock );
1567
1568 // One dialog at a time.
1569 if( !dialogLock.owns_lock() )
1570 {
1571 if( m_boardSetupDlg && m_boardSetupDlg->IsShown() )
1572 {
1573 m_boardSetupDlg->Raise(); // Brings the existing dialog to the front
1574 }
1575
1576 return;
1577 }
1578
1579 // Make sure everything's up-to-date
1581
1582 DIALOG_BOARD_SETUP dlg( this, aParent );
1583
1584 if( !aInitialPage.IsEmpty() )
1585 dlg.SetInitialPage( aInitialPage, wxEmptyString );
1586
1587 // Assign dlg to the m_boardSetupDlg pointer to track its status.
1588 m_boardSetupDlg = &dlg;
1589
1590 // QuasiModal required for Scintilla auto-complete
1591 if( dlg.ShowQuasiModal() == wxID_OK )
1592 {
1593 // Note: We must synchronise time domain properties before nets and classes, otherwise the updates
1594 // called by the board listener events are using stale data
1597
1598 if( !GetBoard()->SynchronizeComponentClasses( std::unordered_set<wxString>() ) )
1599 {
1600 m_infoBar->RemoveAllButtons();
1601 m_infoBar->AddCloseButton();
1602 m_infoBar->ShowMessage( _( "Could not load component class assignment rules" ),
1603 wxICON_WARNING, WX_INFOBAR::MESSAGE_TYPE::GENERIC );
1604 }
1605
1606 // We don't know if anything was modified, so err on the side of requiring a save
1607 OnModify();
1608
1610
1613
1614 PCBNEW_SETTINGS* settings = GetPcbNewSettings();
1615 static LSET maskAndPasteLayers = LSET( { F_Mask, F_Paste, B_Mask, B_Paste } );
1616
1618 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1619 {
1620 int flags = 0;
1621
1622 if( !aItem->IsBOARD_ITEM() )
1623 return flags;
1624
1625 BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
1626
1627 if( item->Type() == PCB_VIA_T || item->Type() == PCB_PAD_T )
1628 {
1629 // Note: KIGFX::REPAINT isn't enough for things that go from invisible
1630 // to visible as they won't be found in the view layer's itemset for
1631 // re-painting.
1632 if( ( GetBoard()->GetVisibleLayers() & maskAndPasteLayers ).any() )
1633 flags |= KIGFX::ALL;
1634 }
1635
1636 if( item->Type() == PCB_TRACE_T || item->Type() == PCB_ARC_T || item->Type() == PCB_VIA_T )
1637 {
1639 flags |= KIGFX::REPAINT;
1640 }
1641
1642 if( item->Type() == PCB_PAD_T )
1643 {
1644 if( settings->m_Display.m_PadClearance )
1645 flags |= KIGFX::REPAINT;
1646 }
1647
1648 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1649 {
1650 if( text->HasTextVars() )
1651 {
1652 text->ClearRenderCache();
1653 text->ClearBoundingBoxCache();
1655 }
1656 }
1657
1658 return flags;
1659 } );
1660
1661 GetCanvas()->Refresh();
1662
1666
1667 //this event causes the routing tool to reload its design rules information
1669 toolEvent.SetHasPosition( false );
1670 m_toolManager->ProcessEvent( toolEvent );
1671 }
1672
1673 GetCanvas()->SetFocus();
1674
1675 // Reset m_boardSetupDlg after the dialog is closed
1676 m_boardSetupDlg = nullptr;
1677}
1678
1679
1681{
1682 m_searchPane->FocusSearch();
1683}
1684
1685
1687{
1689
1690 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
1691 wxASSERT( cfg );
1692
1693 if( cfg )
1694 {
1698 }
1699}
1700
1701
1703{
1705
1706 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
1707 wxASSERT( cfg );
1708
1709 if( cfg )
1710 {
1711 wxAuiPaneInfo& apperancePane = m_auimgr.GetPane( AppearancePanelName() );
1712 cfg->m_AuiPanels.show_layer_manager = apperancePane.IsShown();
1713
1714 if( m_propertiesPanel )
1715 {
1716 cfg->m_AuiPanels.show_properties = m_propertiesPanel->IsShownOnScreen();
1718 cfg->m_AuiPanels.properties_splitter = m_propertiesPanel->SplitterProportion();
1719 }
1720
1721 // ensure m_ShowSearch is up to date (the pane can be closed)
1722 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
1723 m_ShowSearch = searchPaneInfo.IsShown();
1725 cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
1726 cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
1727 cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
1728
1730 {
1731 wxAuiPaneInfo& netInspectorhPaneInfo = m_auimgr.GetPane( NetInspectorPanelName() );
1732 m_ShowNetInspector = netInspectorhPaneInfo.IsShown();
1734 }
1735
1736 if( m_appearancePanel )
1737 {
1740 cfg->m_AuiPanels.appearance_expand_layer_display = m_appearancePanel->IsLayerOptionsExpanded();
1741 cfg->m_AuiPanels.appearance_expand_net_display = m_appearancePanel->IsNetOptionsExpanded();
1742 }
1743
1744 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
1745 cfg->m_AuiPanels.design_blocks_show = designBlocksPane.IsShown();
1746
1747 if( designBlocksPane.IsDocked() )
1749 else
1750 {
1751 cfg->m_AuiPanels.design_blocks_panel_float_height = designBlocksPane.floating_size.y;
1752 cfg->m_AuiPanels.design_blocks_panel_float_width = designBlocksPane.floating_size.x;
1753 }
1754
1755 m_designBlocksPane->SaveSettings();
1756 }
1757}
1758
1759
1761{
1762 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( config() );
1763
1764 return cfg ? cfg->m_RotationAngle : ANGLE_90;
1765}
1766
1767
1772
1773
1775{
1776
1777 GetColorSettings()->SetColor( LAYER_GRID, aColor );
1778 GetCanvas()->GetGAL()->SetGridColor( aColor );
1779}
1780
1781
1782void PCB_EDIT_FRAME::SetActiveLayer( PCB_LAYER_ID aLayer, bool aForceRedraw )
1783{
1784 const PCB_LAYER_ID oldLayer = GetActiveLayer();
1785
1786 if( oldLayer == aLayer && !aForceRedraw )
1787 return;
1788
1790
1791 m_appearancePanel->OnLayerChanged();
1792
1793 m_toolManager->PostAction( PCB_ACTIONS::layerChanged ); // notify other tools
1794 GetCanvas()->SetFocus(); // allow capture of hotkeys
1795 GetCanvas()->SetHighContrastLayer( aLayer );
1796
1797 /*
1798 * Only show pad, via and track clearances when a copper layer is active
1799 * and then only show the clearance layer for that copper layer. For
1800 * front/back non-copper layers, show the clearance layer for the outer
1801 * layer on that side.
1802 *
1803 * For pads/vias, this is to avoid clutter when there are pad/via layers
1804 * that vary in flash (i.e. clearance from the hole or pad edge), padstack
1805 * shape on each layer or clearances on each layer.
1806 *
1807 * For tracks, this follows the same logic as pads/vias, but in theory could
1808 * have their own set of independent clearance layers to allow track clearance
1809 * to be shown for more layers.
1810 */
1811 const auto getClearanceLayerForActive = []( PCB_LAYER_ID aActiveLayer ) -> std::optional<int>
1812 {
1813 if( IsCopperLayer( aActiveLayer ) )
1814 return CLEARANCE_LAYER_FOR( aActiveLayer );
1815
1816 return std::nullopt;
1817 };
1818
1819 if( std::optional<int> oldClearanceLayer = getClearanceLayerForActive( oldLayer ) )
1820 GetCanvas()->GetView()->SetLayerVisible( *oldClearanceLayer, false );
1821
1822 if( std::optional<int> newClearanceLayer = getClearanceLayerForActive( aLayer ) )
1823 GetCanvas()->GetView()->SetLayerVisible( *newClearanceLayer, true );
1824
1826 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1827 {
1828 if( !aItem->IsBOARD_ITEM() )
1829 return 0;
1830
1831 BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
1832
1833 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible
1834 // as they won't be found in the view layer's itemset for re-painting.
1835 if( GetDisplayOptions().m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN )
1836 {
1837 if( item->IsOnLayer( oldLayer ) || item->IsOnLayer( aLayer ) )
1838 return KIGFX::ALL;
1839 }
1840
1841 if( item->Type() == PCB_VIA_T )
1842 {
1843 PCB_VIA* via = static_cast<PCB_VIA*>( item );
1844
1845 // Vias on a restricted layer set must be redrawn when the active layer
1846 // is changed
1847 if( via->GetViaType() == VIATYPE::BLIND
1848 || via->GetViaType() == VIATYPE::BURIED
1849 || via->GetViaType() == VIATYPE::MICROVIA )
1850 {
1851 return KIGFX::REPAINT;
1852 }
1853
1854 if( via->GetRemoveUnconnected() )
1855 return KIGFX::ALL;
1856 }
1857 else if( item->Type() == PCB_PAD_T )
1858 {
1859 PAD* pad = static_cast<PAD*>( item );
1860
1861 if( pad->GetRemoveUnconnected() )
1862 return KIGFX::ALL;
1863 }
1864
1865 return 0;
1866 } );
1867
1868 GetCanvas()->Refresh();
1869}
1870
1871
1873{
1874 wxFileName fn( GetBoard()->GetFileName() );
1875 Kiway().LocalHistory().Init( fn.GetPath() );
1877
1878 layerEnum.Choices().Clear();
1879 layerEnum.Undefined( UNDEFINED_LAYER );
1880
1881 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
1882 {
1883 // Canonical name
1884 layerEnum.Map( layer, LSET::Name( layer ) );
1885
1886 // User name
1887 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
1888 }
1889
1890 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
1891
1892 try
1893 {
1895 }
1896 catch( PARSE_ERROR& )
1897 {
1898 // Not sure this is the best place to tell the user their rules are buggy, so
1899 // we'll stay quiet for now. Feel free to revisit this decision....
1900 }
1901
1903
1904 // Offer to migrate obsolete WRL 3D model references to current STEP models.
1905 // Shown only when unresolvable WRL paths are present and the user hasn't
1906 // opted out of the prompt; the Tools menu exposes the dialog on demand.
1907 if( COMMON_SETTINGS* commonSettings = Pgm().GetCommonSettings();
1908 commonSettings && !commonSettings->m_DoNotShowAgain.migrate_wrl_prompt
1910 {
1911 DIALOG_MIGRATE_3D_MODELS dlg( this );
1912 dlg.ShowModal();
1913 }
1914
1915 UpdateTitle();
1916
1917 // Display a warning that the file is read only
1918 if( fn.FileExists() && !fn.IsFileWritable() )
1919 {
1920 m_infoBar->RemoveAllButtons();
1921 m_infoBar->AddCloseButton();
1922 m_infoBar->ShowMessage( _( "Board file is read only." ),
1923 wxICON_WARNING, WX_INFOBAR::MESSAGE_TYPE::OUTDATED_SAVE );
1924 }
1925
1927
1928 // Sync layer and item visibility
1930
1931 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
1932
1933 m_appearancePanel->OnBoardChanged();
1934
1935 // Apply saved display state to the appearance panel after it has been set up
1936 PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings();
1937
1938 m_appearancePanel->ApplyLayerPreset( localSettings.m_ActiveLayerPreset );
1939
1940 if( GetBoard()->GetDesignSettings().IsLayerEnabled( localSettings.m_ActiveLayer ) )
1941 SetActiveLayer( localSettings.m_ActiveLayer, true );
1942 else
1943 SetActiveLayer( GetActiveLayer(), true ); // Make sure to repaint even if not switching
1944
1945 PROJECT_FILE& projectFile = Prj().GetProjectFile();
1946
1947 m_layerPairSettings->SetLayerPairs( projectFile.m_LayerPairInfos );
1948 m_layerPairSettings->SetCurrentLayerPair( LAYER_PAIR{ F_Cu, B_Cu } );
1949
1950 // Updates any auto dimensions and the auxiliary toolbar tracks/via sizes
1952
1953 // Sync the net inspector now we have connectivity calculated
1955 m_netInspectorPanel->OnBoardChanged();
1956
1957 // Display the loaded board:
1958 Zoom_Automatique( false );
1959
1960 // Invalidate painting as loading the DRC engine will cause clearances to become valid
1962
1963 Refresh();
1964
1965 SetMsgPanel( GetBoard() );
1966 SetStatusText( wxEmptyString );
1967
1968 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "PCB file changes are unsaved" ) );
1969}
1970
1971
1973{
1974 m_appearancePanel->UpdateDisplayOptions();
1975}
1976
1977
1979{
1980 return GetBoard()->IsElementVisible( aElement );
1981}
1982
1983
1985{
1986 // Force the RATSNEST visible
1987 if( aElement == LAYER_RATSNEST )
1988 GetCanvas()->GetView()->SetLayerVisible( aElement, true );
1989 else
1990 GetCanvas()->GetView()->SetLayerVisible( aElement , aNewState );
1991
1992 GetBoard()->SetElementVisibility( aElement, aNewState );
1993}
1994
1995
1997{
1998 // call my base class
2000
2001 m_auimgr.GetPane( m_appearancePanel ).Caption( _( "Appearance" ) );
2002 m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
2003 m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
2004 m_auimgr.GetPane( m_netInspectorPanel ).Caption( _( "Net Inspector" ) );
2005 m_auimgr.Update();
2006
2007 UpdateTitle();
2008}
2009
2010
2012{
2014
2015 if( project.m_PcbLastPath[ aType ].IsEmpty() )
2016 return wxEmptyString;
2017
2018 wxFileName absoluteFileName = project.m_PcbLastPath[ aType ];
2019 wxFileName pcbFileName = GetBoard()->GetFileName();
2020
2021 absoluteFileName.MakeAbsolute( pcbFileName.GetPath() );
2022 return absoluteFileName.GetFullPath();
2023}
2024
2025
2026void PCB_EDIT_FRAME::SetLastPath( LAST_PATH_TYPE aType, const wxString& aLastPath )
2027{
2029
2030 wxFileName relativeFileName = aLastPath;
2031 wxFileName pcbFileName = GetBoard()->GetFileName();
2032
2033 relativeFileName.MakeRelativeTo( pcbFileName.GetPath() );
2034
2035 if( relativeFileName.GetFullPath() != project.m_PcbLastPath[ aType ] )
2036 {
2037 project.m_PcbLastPath[ aType ] = relativeFileName.GetFullPath();
2038 OnModify();
2039 }
2040}
2041
2042
2044{
2046 Kiway().LocalHistory().NoteFileChange( GetBoard()->GetFileName() );
2047 m_ZoneFillsDirty = true;
2048
2049 if( m_isClosing )
2050 return;
2051
2052 Update3DView( true, GetPcbNewSettings()->m_Display.m_Live3DRefresh );
2053
2054 if( !GetTitle().StartsWith( wxT( "*" ) ) )
2055 UpdateTitle();
2056
2057}
2058
2059
2061{
2062 Update3DView( true, true );
2063
2064 std::shared_ptr<CONNECTIVITY_DATA> connectivity = GetBoard()->GetConnectivity();
2065 connectivity->RecalculateRatsnest( nullptr );
2067
2068 std::vector<MSG_PANEL_ITEM> msg_list;
2069 GetBoard()->GetMsgPanelInfo( this, msg_list );
2070 SetMsgPanel( msg_list );
2071}
2072
2073
2075{
2076 wxFileName fn = GetBoard()->GetFileName();
2077 bool readOnly = false;
2078 bool unsaved = false;
2079
2080 if( fn.IsOk() && fn.FileExists() )
2081 readOnly = !fn.IsFileWritable();
2082 else
2083 unsaved = true;
2084
2085 wxString title;
2086
2087 if( IsContentModified() )
2088 title = wxT( "*" );
2089
2090 title += fn.GetName();
2091
2092 if( readOnly )
2093 title += wxS( " " ) + _( "[Read Only]" );
2094
2095 if( unsaved )
2096 title += wxS( " " ) + _( "[Unsaved]" );
2097
2098 title += wxT( " \u2014 " ) + _( "PCB Editor" );
2099
2100 SetTitle( title );
2101}
2102
2103
2105{
2106 // Update the layer manager and other widgets from the board setup
2107 // (layer and items visibility, colors ...)
2108
2109 // Rebuild list of nets (full ratsnest rebuild)
2111
2112 // Update info shown by the horizontal toolbars
2114
2115 LSET activeLayers = GetBoard()->GetEnabledLayers();
2116
2117 if( !activeLayers.test( GetActiveLayer() ) )
2118 SetActiveLayer( activeLayers.Seq().front() );
2119
2120 m_SelLayerBox->SetLayerSelection( GetActiveLayer() );
2121
2123
2124 layerEnum.Choices().Clear();
2125 layerEnum.Undefined( UNDEFINED_LAYER );
2126
2127 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
2128 {
2129 // Canonical name
2130 layerEnum.Map( layer, LSET::Name( layer ) );
2131
2132 // User name
2133 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
2134 }
2135
2137
2138 // Sync visibility with canvas
2139 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
2140 GetCanvas()->GetView()->SetLayerVisible( layer, GetBoard()->IsLayerVisible( layer ) );
2141
2142 // Stackup and/or color theme may have changed
2143 m_appearancePanel->OnBoardChanged();
2144 m_netInspectorPanel->OnParentSetupChanged();
2145}
2146
2147
2149{
2150 // switches currently used canvas (Cairo / OpenGL).
2151 PCB_BASE_FRAME::SwitchCanvas( aCanvasType );
2152}
2153
2154
2156{
2157 if( !m_findDialog )
2158 {
2159 m_findDialog = new DIALOG_FIND( this );
2160 m_findDialog->SetCallback( std::bind( &PCB_SELECTION_TOOL::FindItem,
2161 m_toolManager->GetTool<PCB_SELECTION_TOOL>(), _1 ) );
2162 }
2163
2164 wxString findString;
2165
2166 PCB_SELECTION& selection = m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
2167
2168 if( selection.Size() == 1 )
2169 {
2170 EDA_ITEM* front = selection.Front();
2171
2172 switch( front->Type() )
2173 {
2174 case PCB_FOOTPRINT_T:
2175 findString = UnescapeString( static_cast<FOOTPRINT*>( front )->GetValue() );
2176 break;
2177
2178 case PCB_FIELD_T:
2179 case PCB_TEXT_T:
2180 findString = UnescapeString( static_cast<PCB_TEXT*>( front )->GetText() );
2181
2182 if( findString.Contains( wxT( "\n" ) ) )
2183 findString = findString.Before( '\n' );
2184
2185 break;
2186
2187 default:
2188 break;
2189 }
2190 }
2191
2192 m_findDialog->Preload( findString );
2193
2194 m_findDialog->Show( true );
2195}
2196
2197
2206
2207
2213
2214
2220
2221
2222void PCB_EDIT_FRAME::FindNext( bool reverse )
2223{
2224 if( !m_findDialog )
2226
2227 m_findDialog->FindNext( reverse );
2228}
2229
2230
2232{
2233 if( Kiface().IsSingle() )
2234 return 0;
2235
2236 // Update PCB requires a netlist. Therefore the schematic editor must be running
2237 // If this is not the case, open the schematic editor
2238 KIWAY_PLAYER* frame = Kiway().Player( FRAME_SCH, true );
2239
2240 // If Kiway() cannot create the eeschema frame, it shows a error message, and
2241 // frame is null
2242 if( !frame )
2243 return -1;
2244
2245 if( !frame->IsShownOnScreen() )
2246 {
2247 wxEventBlocker blocker( this );
2248 wxFileName fn( Prj().GetProjectPath(), Prj().GetProjectName(),
2250
2251 // Maybe the file hasn't been converted to the new s-expression file format so
2252 // see if the legacy schematic file is still in play.
2253 if( !fn.FileExists() )
2254 {
2256
2257 if( !fn.FileExists() )
2258 {
2259 DisplayErrorMessage( this, _( "The schematic for this board cannot be found." ) );
2260 return -2;
2261 }
2262 }
2263
2264 frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
2265
2266 // we show the schematic editor frame, because do not show is seen as
2267 // a not yet opened schematic by Kicad manager, which is not the case
2268 frame->Show( true );
2269
2270 // bring ourselves back to the front
2271 Raise();
2272 }
2273
2274 return 1; //Success!
2275}
2276
2277
2279 const wxString& aAnnotateMessage )
2280{
2281 int standalone = TestStandalone();
2282
2283 if( standalone == 0 )
2284 {
2285 DisplayErrorMessage( this, _( "Cannot update the PCB because PCB editor is opened in "
2286 "stand-alone mode. In order to create or update PCBs from "
2287 "schematics, you must launch the KiCad project manager and "
2288 "create a project." ) );
2289 return false; // Not in standalone mode
2290 }
2291
2292 if( standalone < 0 ) // Problem with Eeschema or the schematic
2293 return false;
2294
2295 Raise(); // Show
2296
2297 std::string payload( aAnnotateMessage );
2298
2299 Kiway().ExpressMail( FRAME_SCH, MAIL_SCH_GET_NETLIST, payload, this );
2300
2301 if( payload == aAnnotateMessage )
2302 {
2303 Raise();
2304 DisplayErrorMessage( this, aAnnotateMessage );
2305 return false;
2306 }
2307
2308 try
2309 {
2310 auto lineReader = new STRING_LINE_READER( payload, _( "Eeschema netlist" ) );
2311 KICAD_NETLIST_READER netlistReader( lineReader, &aNetlist );
2312 netlistReader.LoadNetlist();
2313 }
2314 catch( const IO_ERROR& e )
2315 {
2316 Raise();
2317
2318 // Do not translate extra_info strings. These are for developers
2319 wxString extra_info = e.Problem() + wxT( " : " ) + e.What() + wxT( " at " ) + e.Where();
2320
2321 DisplayErrorMessage( this, _( "Received an error while reading netlist. Please "
2322 "report this issue to the KiCad team using the menu "
2323 "Help->Report Bug."), extra_info );
2324 return false;
2325 }
2326
2327 return true;
2328}
2329
2330
2332{
2333 if( aFootprint == nullptr )
2334 return;
2335
2337
2338 /*
2339 * Make sure dlg is destroyed before GetCanvas->Refresh is called
2340 * later or the refresh will try to modify its properties since
2341 * they share a GL context.
2342 */
2343 {
2344 DIALOG_FOOTPRINT_PROPERTIES dlg( this, aFootprint );
2345
2346 dlg.ShowQuasiModal();
2347 retvalue = dlg.GetReturnValue();
2348 }
2349
2350 /*
2351 * retvalue =
2352 * FP_PROPS_UPDATE_FP to show Update Footprints dialog
2353 * FP_PROPS_CHANGE_FP to show Change Footprints dialog
2354 * FP_PROPS_OK for normal edit
2355 * FP_PROPS_CANCEL if aborted
2356 * FP_PROPS_EDIT_BOARD_FP to load board footprint into Footprint Editor
2357 * FP_PROPS_EDIT_LIBRARY_FP to load library footprint into Footprint Editor
2358 */
2359
2361 {
2362 // If something edited, push a refresh request
2363 GetCanvas()->Refresh();
2364 }
2366 {
2367 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2368 {
2369 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2370
2371 fp_editor->LoadFootprintFromBoard( aFootprint );
2372 fp_editor->Show( true );
2373 fp_editor->Raise(); // Iconize( false );
2374 }
2375 }
2377 {
2378 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2379 {
2380 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2381
2382 fp_editor->LoadFootprintFromLibrary( aFootprint->GetFPID() );
2383 fp_editor->Show( true );
2384 fp_editor->Raise(); // Iconize( false );
2385 }
2386 }
2388 {
2389 ShowExchangeFootprintsDialog( aFootprint, true, true );
2390 }
2392 {
2393 ShowExchangeFootprintsDialog( aFootprint, false, true );
2394 }
2395}
2396
2397
2399 bool aSelectedMode )
2400{
2401 DIALOG_EXCHANGE_FOOTPRINTS dialog( this, aFootprint, aUpdateMode, aSelectedMode );
2402
2403 return dialog.ShowQuasiModal();
2404}
2405
2406
2420static void processTextItem( const PCB_TEXT& aSrc, PCB_TEXT& aDest, const VECTOR2I& aPosShift,
2421 const EDA_ANGLE& aAngleShift, bool aResetText, bool aResetTextLayers,
2422 bool aResetTextEffects, bool aResetTextPositions, bool* aUpdated )
2423{
2424 if( aResetText )
2425 *aUpdated |= aSrc.GetText() != aDest.GetText();
2426 else
2427 aDest.SetText( aSrc.GetText() );
2428
2429 if( aResetTextLayers )
2430 {
2431 *aUpdated |= aSrc.GetLayer() != aDest.GetLayer();
2432 *aUpdated |= aSrc.IsVisible() != aDest.IsVisible();
2433 }
2434 else
2435 {
2436 aDest.SetLayer( aSrc.GetLayer() );
2437 aDest.SetVisible( aSrc.IsVisible() );
2438 }
2439
2440 VECTOR2I origPos = aDest.GetFPRelativePosition();
2441
2442 if( aResetTextEffects )
2443 {
2444 *aUpdated |= aSrc.GetHorizJustify() != aDest.GetHorizJustify();
2445 *aUpdated |= aSrc.GetVertJustify() != aDest.GetVertJustify();
2446 *aUpdated |= aSrc.GetTextSize() != aDest.GetTextSize();
2447 *aUpdated |= aSrc.GetTextThickness() != aDest.GetTextThickness();
2448 }
2449 else
2450 {
2451 EDA_ANGLE origAngle = aDest.GetTextAngle();
2452 aDest.SetAttributes( aSrc );
2453 aDest.SetTextAngle( origAngle ); // apply rotation as part of position shift
2454 }
2455
2456 if( aResetTextPositions )
2457 {
2458 *aUpdated |= aSrc.GetFPRelativePosition() != origPos;
2459 *aUpdated |= aSrc.GetTextAngle() != aDest.GetTextAngle();
2460
2461 aDest.SetFPRelativePosition( origPos );
2462 }
2463 else
2464 {
2465 VECTOR2I rotatedShift = GetRotated( aSrc.GetFPRelativePosition() - aPosShift, -aAngleShift );
2466
2467 aDest.SetFPRelativePosition( rotatedShift );
2468 aDest.SetTextAngle( aSrc.GetTextAngle() );
2469 }
2470
2471 aDest.SetLocked( aSrc.IsLocked() );
2472 aDest.SetUuid( aSrc.m_Uuid );
2473}
2474
2475
2476template<typename T>
2477static std::vector<std::pair<T*, T*>> matchItemsBySimilarity( const std::vector<T*>& aExisting,
2478 const std::vector<T*>& aNew )
2479{
2480 struct MATCH_CANDIDATE
2481 {
2482 T* existing;
2483 T* updated;
2484 double score;
2485 };
2486
2487 std::vector<MATCH_CANDIDATE> candidates;
2488
2489 for( T* existing : aExisting )
2490 {
2491 for( T* updated : aNew )
2492 {
2493 if( existing->Type() != updated->Type() )
2494 continue;
2495
2496 double similarity = existing->Similarity( *updated );
2497
2498 if constexpr( std::is_same_v<T, PAD> )
2499 {
2500 if( existing->GetNumber() == updated->GetNumber() )
2501 similarity += 2.0;
2502 }
2503
2504 if( similarity <= 0.0 )
2505 continue;
2506
2507 candidates.push_back( { existing, updated, similarity } );
2508 }
2509 }
2510
2511 std::sort( candidates.begin(), candidates.end(),
2512 []( const MATCH_CANDIDATE& a, const MATCH_CANDIDATE& b )
2513 {
2514 if( a.score != b.score )
2515 return a.score > b.score;
2516
2517 if( a.existing != b.existing )
2518 return a.existing < b.existing;
2519
2520 return a.updated < b.updated;
2521 } );
2522
2523 std::vector<std::pair<T*, T*>> matches;
2524 matches.reserve( candidates.size() );
2525
2526 std::unordered_set<T*> matchedExisting;
2527 std::unordered_set<T*> matchedNew;
2528
2529 for( const MATCH_CANDIDATE& candidate : candidates )
2530 {
2531 if( matchedExisting.find( candidate.existing ) != matchedExisting.end() )
2532 continue;
2533
2534 if( matchedNew.find( candidate.updated ) != matchedNew.end() )
2535 continue;
2536
2537 matchedExisting.insert( candidate.existing );
2538 matchedNew.insert( candidate.updated );
2539 matches.emplace_back( candidate.existing, candidate.updated );
2540 }
2541
2542 return matches;
2543}
2544
2545
2547 BOARD_COMMIT& aCommit,
2548 bool matchPadPositions,
2549 bool deleteExtraTexts,
2550 bool resetTextLayers,
2551 bool resetTextEffects,
2552 bool resetTextPositions,
2553 bool resetTextContent,
2554 bool resetFabricationAttrs,
2555 bool resetClearanceOverrides,
2556 bool reset3DModels,
2557 bool* aUpdated )
2558{
2559 EDA_GROUP* parentGroup = aExisting->GetParentGroup();
2560 bool dummyBool = false;
2561
2562 if( !aUpdated )
2563 aUpdated = &dummyBool;
2564
2565 if( parentGroup )
2566 {
2567 aCommit.Modify( parentGroup->AsEdaItem(), nullptr, RECURSE_MODE::NO_RECURSE );
2568 parentGroup->RemoveItem( aExisting );
2569 parentGroup->AddItem( aNew );
2570 }
2571
2572 aNew->SetParent( GetBoard() );
2573
2574 // This is the position and angle shift to apply to the new footprint if the footprint
2575 // has a change anchor point or rotation compared to the existing footprint.
2576 VECTOR2I posShift( 0, 0 );
2577 EDA_ANGLE angleShift = ANGLE_0;
2578
2579 VECTOR2I position = aExisting->GetPosition();
2580 EDA_ANGLE orientation = aExisting->GetOrientation();
2581
2582 if( matchPadPositions )
2583 {
2584 if( ComputeFootprintShift( *aExisting, *aNew, posShift, angleShift ) )
2585 {
2586 position += posShift;
2587 orientation += angleShift;
2588 }
2589 }
2590
2591 PlaceFootprint( aNew, false, position );
2592
2593 if( aNew->GetLayer() != aExisting->GetLayer() )
2594 aNew->Flip( aNew->GetPosition(), GetPcbNewSettings()->m_FlipDirection );
2595
2596 if( aNew->GetOrientation() != orientation )
2597 aNew->SetOrientation( orientation );
2598
2599 aNew->SetLocked( aExisting->IsLocked() );
2600
2601 aNew->SetUuid( aExisting->m_Uuid );
2602 aNew->Reference().SetUuid( aExisting->Reference().m_Uuid );
2603 aNew->Value().SetUuid( aExisting->Value().m_Uuid );
2604
2605 std::vector<PAD*> oldPads;
2606 oldPads.reserve( aExisting->Pads().size() );
2607
2608 for( PAD* pad : aExisting->Pads() )
2609 oldPads.push_back( pad );
2610
2611 std::vector<PAD*> newPads;
2612 newPads.reserve( aNew->Pads().size() );
2613
2614 for( PAD* pad : aNew->Pads() )
2615 newPads.push_back( pad );
2616
2617 auto padMatches = matchItemsBySimilarity<PAD>( oldPads, newPads );
2618 std::unordered_set<PAD*> matchedNewPads;
2619
2620 for( const auto& match : padMatches )
2621 {
2622 PAD* oldPad = match.first;
2623 PAD* newPad = match.second;
2624
2625 matchedNewPads.insert( newPad );
2626 newPad->SetUuid( oldPad->m_Uuid );
2628 newPad->SetPinFunction( oldPad->GetPinFunction() );
2629 newPad->SetPinType( oldPad->GetPinType() );
2630
2631 if( newPad->IsOnCopperLayer() )
2632 newPad->SetNetCode( oldPad->GetNetCode() );
2633 else
2635 }
2636
2637 for( PAD* newPad : aNew->Pads() )
2638 {
2639 if( matchedNewPads.find( newPad ) != matchedNewPads.end() )
2640 continue;
2641
2642 newPad->ResetUuid();
2643 newPad->SetNetCode( NETINFO_LIST::UNCONNECTED );
2644 }
2645
2646 std::vector<BOARD_ITEM*> oldDrawings;
2647 oldDrawings.reserve( aExisting->GraphicalItems().size() );
2648
2649 for( BOARD_ITEM* item : aExisting->GraphicalItems() )
2650 oldDrawings.push_back( item );
2651
2652 std::vector<BOARD_ITEM*> newDrawings;
2653 newDrawings.reserve( aNew->GraphicalItems().size() );
2654
2655 for( BOARD_ITEM* item : aNew->GraphicalItems() )
2656 newDrawings.push_back( item );
2657
2658 auto drawingMatches = matchItemsBySimilarity<BOARD_ITEM>( oldDrawings, newDrawings );
2659 std::unordered_map<BOARD_ITEM*, BOARD_ITEM*> oldToNewDrawings;
2660 std::unordered_set<BOARD_ITEM*> matchedNewDrawings;
2661
2662 for( const auto& match : drawingMatches )
2663 {
2664 BOARD_ITEM* oldItem = match.first;
2665 BOARD_ITEM* newItem = match.second;
2666
2667 oldToNewDrawings[ oldItem ] = newItem;
2668 matchedNewDrawings.insert( newItem );
2669 newItem->SetUuid( oldItem->m_Uuid );
2670 }
2671
2672 for( BOARD_ITEM* newItem : newDrawings )
2673 {
2674 if( matchedNewDrawings.find( newItem ) == matchedNewDrawings.end() )
2675 newItem->ResetUuid();
2676 }
2677
2678 std::vector<ZONE*> oldZones;
2679 oldZones.reserve( aExisting->Zones().size() );
2680
2681 for( ZONE* zone : aExisting->Zones() )
2682 oldZones.push_back( zone );
2683
2684 std::vector<ZONE*> newZones;
2685 newZones.reserve( aNew->Zones().size() );
2686
2687 for( ZONE* zone : aNew->Zones() )
2688 newZones.push_back( zone );
2689
2690 auto zoneMatches = matchItemsBySimilarity<ZONE>( oldZones, newZones );
2691 std::unordered_set<ZONE*> matchedNewZones;
2692
2693 for( const auto& match : zoneMatches )
2694 {
2695 ZONE* oldZone = match.first;
2696 ZONE* newZone = match.second;
2697
2698 matchedNewZones.insert( newZone );
2699 newZone->SetUuid( oldZone->m_Uuid );
2700 }
2701
2702 for( ZONE* newZone : newZones )
2703 {
2704 if( matchedNewZones.find( newZone ) == matchedNewZones.end() )
2705 newZone->ResetUuid();
2706 }
2707
2708 std::vector<PCB_POINT*> oldPoints;
2709 oldPoints.reserve( aExisting->Points().size() );
2710
2711 for( PCB_POINT* point : aExisting->Points() )
2712 oldPoints.push_back( point );
2713
2714 std::vector<PCB_POINT*> newPoints;
2715 newPoints.reserve( aNew->Points().size() );
2716
2717 for( PCB_POINT* point : aNew->Points() )
2718 newPoints.push_back( point );
2719
2720 auto pointMatches = matchItemsBySimilarity<PCB_POINT>( oldPoints, newPoints );
2721 std::unordered_set<PCB_POINT*> matchedNewPoints;
2722
2723 for( const auto& match : pointMatches )
2724 {
2725 PCB_POINT* oldPoint = match.first;
2726 PCB_POINT* newPoint = match.second;
2727
2728 matchedNewPoints.insert( newPoint );
2729 newPoint->SetUuid( oldPoint->m_Uuid );
2730 }
2731
2732 for( PCB_POINT* newPoint : newPoints )
2733 {
2734 if( matchedNewPoints.find( newPoint ) == matchedNewPoints.end() )
2735 newPoint->ResetUuid();
2736 }
2737
2738 std::vector<PCB_GROUP*> oldGroups;
2739 oldGroups.reserve( aExisting->Groups().size() );
2740
2741 for( PCB_GROUP* group : aExisting->Groups() )
2742 oldGroups.push_back( group );
2743
2744 std::vector<PCB_GROUP*> newGroups;
2745 newGroups.reserve( aNew->Groups().size() );
2746
2747 for( PCB_GROUP* group : aNew->Groups() )
2748 newGroups.push_back( group );
2749
2750 auto groupMatches = matchItemsBySimilarity<PCB_GROUP>( oldGroups, newGroups );
2751 std::unordered_set<PCB_GROUP*> matchedNewGroups;
2752
2753 for( const auto& match : groupMatches )
2754 {
2755 PCB_GROUP* oldGroup = match.first;
2756 PCB_GROUP* newGroup = match.second;
2757
2758 matchedNewGroups.insert( newGroup );
2759 newGroup->SetUuid( oldGroup->m_Uuid );
2760 }
2761
2762 for( PCB_GROUP* newGroup : newGroups )
2763 {
2764 if( matchedNewGroups.find( newGroup ) == matchedNewGroups.end() )
2765 newGroup->ResetUuid();
2766 }
2767
2768 std::vector<PCB_FIELD*> oldFieldsVec;
2769 std::vector<PCB_FIELD*> newFieldsVec;
2770
2771 oldFieldsVec.reserve( aExisting->GetFields().size() );
2772
2773 for( PCB_FIELD* field : aExisting->GetFields() )
2774 {
2775 wxCHECK2( field, continue );
2776
2777 if( field->IsReference() || field->IsValue() )
2778 continue;
2779
2780 oldFieldsVec.push_back( field );
2781 }
2782
2783 newFieldsVec.reserve( aNew->GetFields().size() );
2784
2785 for( PCB_FIELD* field : aNew->GetFields() )
2786 {
2787 wxCHECK2( field, continue );
2788
2789 if( field->IsReference() || field->IsValue() )
2790 continue;
2791
2792 newFieldsVec.push_back( field );
2793 }
2794
2795 auto fieldMatches = matchItemsBySimilarity<PCB_FIELD>( oldFieldsVec, newFieldsVec );
2796 std::unordered_map<PCB_FIELD*, PCB_FIELD*> oldToNewFields;
2797 std::unordered_set<PCB_FIELD*> matchedNewFields;
2798
2799 for( const auto& match : fieldMatches )
2800 {
2801 PCB_FIELD* oldField = match.first;
2802 PCB_FIELD* newField = match.second;
2803
2804 oldToNewFields[ oldField ] = newField;
2805 matchedNewFields.insert( newField );
2806 newField->SetUuid( oldField->m_Uuid );
2807 }
2808
2809 for( PCB_FIELD* newField : newFieldsVec )
2810 {
2811 if( matchedNewFields.find( newField ) == matchedNewFields.end() )
2812 newField->ResetUuid();
2813 }
2814
2815 std::unordered_map<PCB_TEXT*, PCB_TEXT*> oldToNewTexts;
2816
2817 for( const auto& match : drawingMatches )
2818 {
2819 PCB_TEXT* oldText = dynamic_cast<PCB_TEXT*>( match.first );
2820 PCB_TEXT* newText = dynamic_cast<PCB_TEXT*>( match.second );
2821
2822 if( oldText && newText )
2823 oldToNewTexts[ oldText ] = newText;
2824 }
2825
2826 std::set<PCB_TEXT*> handledTextItems;
2827
2828 for( BOARD_ITEM* oldItem : aExisting->GraphicalItems() )
2829 {
2830 PCB_TEXT* oldTextItem = dynamic_cast<PCB_TEXT*>( oldItem );
2831
2832 if( oldTextItem )
2833 {
2834 // Dimensions have PCB_TEXT base but are not treated like texts in the updater
2835 if( dynamic_cast<PCB_DIMENSION_BASE*>( oldTextItem ) )
2836 continue;
2837
2838 PCB_TEXT* newTextItem = nullptr;
2839
2840 auto textMatchIt = oldToNewTexts.find( oldTextItem );
2841
2842 if( textMatchIt != oldToNewTexts.end() )
2843 newTextItem = textMatchIt->second;
2844
2845 if( newTextItem )
2846 {
2847 handledTextItems.insert( newTextItem );
2848 processTextItem( *oldTextItem, *newTextItem, posShift, angleShift, resetTextContent, resetTextLayers,
2849 resetTextEffects, resetTextPositions, aUpdated );
2850 }
2851 else if( deleteExtraTexts )
2852 {
2853 *aUpdated = true;
2854 }
2855 else
2856 {
2857 newTextItem = static_cast<PCB_TEXT*>( oldTextItem->Clone() );
2858 handledTextItems.insert( newTextItem );
2859 aNew->Add( newTextItem );
2860 }
2861 }
2862 }
2863
2864 // Check for any newly-added text items and set the update flag as appropriate
2865 for( BOARD_ITEM* newItem : aNew->GraphicalItems() )
2866 {
2867 PCB_TEXT* newTextItem = dynamic_cast<PCB_TEXT*>( newItem );
2868
2869 if( newTextItem )
2870 {
2871 // Dimensions have PCB_TEXT base but are not treated like texts in the updater
2872 if( dynamic_cast<PCB_DIMENSION_BASE*>( newTextItem ) )
2873 continue;
2874
2875 if( !handledTextItems.contains( newTextItem ) )
2876 {
2877 *aUpdated = true;
2878 break;
2879 }
2880 }
2881 }
2882
2883 // Copy reference. The initial text is always used, never resetted
2884 processTextItem( aExisting->Reference(), aNew->Reference(), posShift, angleShift, false, resetTextLayers,
2885 resetTextEffects, resetTextPositions, aUpdated );
2886
2887 // Copy value
2888 processTextItem( aExisting->Value(), aNew->Value(), posShift, angleShift,
2889 // reset value text only when it is a proxy for the footprint ID
2890 // (cf replacing value "MountingHole-2.5mm" with "MountingHole-4.0mm")
2891 aExisting->GetValue() == aExisting->GetFPID().GetLibItemName().wx_str(),
2892 resetTextLayers, resetTextEffects, resetTextPositions, aUpdated );
2893
2894 std::set<PCB_FIELD*> handledFields;
2895
2896 // Copy fields in accordance with the reset* flags
2897 for( PCB_FIELD* oldField : aExisting->GetFields() )
2898 {
2899 wxCHECK2( oldField, continue );
2900
2901 // Reference and value are already handled
2902 if( oldField->IsReference() || oldField->IsValue() )
2903 continue;
2904
2905 PCB_FIELD* newField = nullptr;
2906
2907 auto fieldMatchIt = oldToNewFields.find( oldField );
2908
2909 if( fieldMatchIt != oldToNewFields.end() )
2910 newField = fieldMatchIt->second;
2911
2912 if( newField )
2913 {
2914 handledFields.insert( newField );
2915 processTextItem( *oldField, *newField, posShift, angleShift, resetTextContent, resetTextLayers,
2916 resetTextEffects, resetTextPositions, aUpdated );
2917 }
2918 else if( deleteExtraTexts )
2919 {
2920 *aUpdated = true;
2921 }
2922 else
2923 {
2924 newField = new PCB_FIELD( *oldField );
2925 handledFields.insert( newField );
2926 aNew->Add( newField );
2927 }
2928 }
2929
2930 // Check for any newly-added fields and set the update flag as appropriate
2931 for( PCB_FIELD* newField : aNew->GetFields() )
2932 {
2933 wxCHECK2( newField, continue );
2934
2935 // Reference and value are already handled
2936 if( newField->IsReference() || newField->IsValue() )
2937 continue;
2938
2939 if( !handledFields.contains( newField ) )
2940 {
2941 *aUpdated = true;
2942 break;
2943 }
2944 }
2945
2946 if( resetFabricationAttrs )
2947 {
2948 // We've replaced the existing footprint with the library one, so the fabrication attrs
2949 // are already reset. Just set the aUpdated flag if appropriate.
2950 if( aNew->GetAttributes() != aExisting->GetAttributes() )
2951 *aUpdated = true;
2952 }
2953 else
2954 {
2955 aNew->SetAttributes( aExisting->GetAttributes() );
2956 }
2957
2958 if( resetClearanceOverrides )
2959 {
2960 if( aExisting->AllowSolderMaskBridges() != aNew->AllowSolderMaskBridges() )
2961 *aUpdated = true;
2962
2963 if( ( aExisting->GetLocalClearance() != aNew->GetLocalClearance() )
2964 || ( aExisting->GetLocalSolderMaskMargin() != aNew->GetLocalSolderMaskMargin() )
2965 || ( aExisting->GetLocalSolderPasteMargin() != aNew->GetLocalSolderPasteMargin() )
2967 || ( aExisting->GetLocalZoneConnection() != aNew->GetLocalZoneConnection() ) )
2968 {
2969 *aUpdated = true;
2970 }
2971 }
2972 else
2973 {
2974 aNew->SetLocalClearance( aExisting->GetLocalClearance() );
2978 aNew->SetLocalZoneConnection( aExisting->GetLocalZoneConnection() );
2980 }
2981
2982 if( reset3DModels )
2983 {
2984 // We've replaced the existing footprint with the library one, so the 3D models are
2985 // already reset. Just set the aUpdated flag if appropriate.
2986 if( aNew->Models().size() != aExisting->Models().size() )
2987 {
2988 *aUpdated = true;
2989 }
2990 else
2991 {
2992 for( size_t ii = 0; ii < aNew->Models().size(); ++ii )
2993 {
2994 if( aNew->Models()[ii] != aExisting->Models()[ii] )
2995 {
2996 *aUpdated = true;
2997 break;
2998 }
2999 }
3000 }
3001 }
3002 else
3003 {
3004 // Preserve model references and all embedded model data.
3005 aNew->Models() = aExisting->Models();
3006
3007 // Preserve extruded 3D body settings.
3008 if( aExisting->HasExtrudedBody() )
3009 aNew->SetExtrudedBody( std::make_unique<EXTRUDED_3D_BODY>( *aExisting->GetExtrudedBody() ) );
3010 else
3011 aNew->ClearExtrudedBody();
3012
3013 for( const auto& [name, file] : aExisting->GetEmbeddedFiles()->EmbeddedFileMap() )
3014 {
3016 continue;
3017
3018 aNew->GetEmbeddedFiles()->RemoveFile( name, true );
3020 }
3021 }
3022
3023 // Updating other parameters
3024 aNew->SetPath( aExisting->GetPath() );
3025 aNew->SetSheetfile( aExisting->GetSheetfile() );
3026 aNew->SetSheetname( aExisting->GetSheetname() );
3027 aNew->SetFilters( aExisting->GetFilters() );
3028 aNew->SetStaticComponentClass( aExisting->GetComponentClass() );
3029
3030 if( *aUpdated == false )
3031 {
3032 // Check pad shapes, graphics, zones, etc. for changes
3034 *aUpdated = true;
3035 }
3036
3037 aCommit.Remove( aExisting );
3038 aCommit.Add( aNew );
3039
3040 aNew->ClearFlags();
3041}
3042
3043
3045{
3047 m_appearancePanel->CommonSettingsChanged( aFlags );
3048
3050
3052
3053 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
3054
3056
3057 // Netclass definitions could have changed, either by us or by Eeschema, so we need to
3058 // recompile the implicit rules
3059 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
3060 WX_INFOBAR* infobar = GetInfoBar();
3061
3062 try
3063 {
3065
3066 if( infobar->GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::DRC_RULES_ERROR )
3067 infobar->Dismiss();
3068 }
3069 catch( PARSE_ERROR& )
3070 {
3071 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( infobar, wxID_ANY, _( "Edit design rules" ),
3072 wxEmptyString );
3073
3074 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
3075 [&]( wxHyperlinkEvent& aEvent )
3076 {
3077 ShowBoardSetupDialog( _( "Custom Rules" ) );
3078 } ) );
3079
3080 infobar->RemoveAllButtons();
3081 infobar->AddButton( button );
3082 infobar->AddCloseButton();
3083 infobar->ShowMessage( _( "Could not compile custom design rules." ), wxICON_ERROR,
3084 WX_INFOBAR::MESSAGE_TYPE::DRC_RULES_ERROR );
3085 }
3086
3089
3090 Layout();
3091 SendSizeEvent();
3092}
3093
3094
3099
3100
3102{
3103 // Register autosave history saver for the board.
3104 // Saver serializes the in-memory BOARD into HISTORY_FILE_DATA. Prettify and
3105 // file I/O happen on a background thread to avoid blocking the UI.
3106 if( GetBoard() )
3107 {
3109 [this]( const wxString& aProjectPath, std::vector<HISTORY_FILE_DATA>& aFileData )
3110 {
3111 GetBoard()->SaveToHistory( aProjectPath, aFileData );
3112 } );
3113 }
3114}
3115
3116
3118{
3119 TOOL_BASE* currentTool = GetToolManager()->GetCurrentTool();
3120
3121 // When a single item that can be point-edited is selected, the point editor
3122 // tool will be active instead of the selection tool. It blocks undo/redo
3123 // while the user is actually dragging points around, though, so we can use
3124 // this as an initial check to prevent API actions when points are being edited.
3125 if( UndoRedoBlocked() )
3126 return false;
3127
3128 // Don't allow any API use while the user is using a tool that could
3129 // modify the model in the middle of the message stream
3130 if( currentTool != GetToolManager()->GetTool<PCB_SELECTION_TOOL>() &&
3131 currentTool != GetToolManager()->GetTool<PCB_POINT_EDITOR>() )
3132 {
3133 return false;
3134 }
3135
3136 ZONE_FILLER_TOOL* zoneFillerTool = m_toolManager->GetTool<ZONE_FILLER_TOOL>();
3137
3138 if( zoneFillerTool->IsBusy() )
3139 return false;
3140
3141 ROUTER_TOOL* routerTool = m_toolManager->GetTool<ROUTER_TOOL>();
3142
3143 if( routerTool && routerTool->RoutingInProgress() )
3144 return false;
3145
3147}
3148
3149
3155
3156
3157bool PCB_EDIT_FRAME::GetPluginActionButtonVisible( const wxString& aPluginPath, bool aPluginDefault )
3158{
3159 if( PCBNEW_SETTINGS* cfg = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
3160 {
3161 for( const auto& [identifier, visible] : cfg->m_Plugins.actions )
3162 {
3163 if( identifier == aPluginPath )
3164 return visible;
3165 }
3166 }
3167
3168 // Plugin is not in settings, return default.
3169 return aPluginDefault;
3170}
3171
3172
3174{
3175 return GetBoard()->GetFileName();
3176}
3177
3178
3180{
3181 return m_auimgr.GetPane( wxS( "LayersManager" ) ).IsShown();
3182}
3183
3184
3186{
3187 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
3188}
3189
3190
3192{
3193 return m_auimgr.GetPane( NetInspectorPanelName() ).IsShown();
3194}
3195
3196
3197void PCB_EDIT_FRAME::onSize( wxSizeEvent& aEvent )
3198{
3199 if( IsShownOnScreen() )
3200 {
3201 // We only need this until the frame is done resizing and the final client size is
3202 // established.
3203 Unbind( wxEVT_SIZE, &PCB_EDIT_FRAME::onSize, this );
3205 }
3206
3207 // Skip() is called in the base class.
3208 EDA_DRAW_FRAME::OnSize( aEvent );
3209}
3210
3211
3222
3223
3234
3235
3246
3247
3249{
3250 if( !m_footprintDiffDlg )
3251 {
3253 _( "Compare Footprint with Library" ) );
3254
3255 m_footprintDiffDlg->m_sdbSizerApply->SetLabel( _( "Update Footprint from Library..." ) );
3256 m_footprintDiffDlg->m_sdbSizerApply->PostSizeEventToParent();
3257 m_footprintDiffDlg->m_sdbSizerApply->Show();
3258 }
3259
3260 return m_footprintDiffDlg;
3261}
3262
3263
3265{
3266 if( m_inspectDrcErrorDlg && aEvent.GetString() == INSPECT_DRC_ERROR_DIALOG_NAME )
3267 {
3268 m_inspectDrcErrorDlg->Destroy();
3269 m_inspectDrcErrorDlg = nullptr;
3270 }
3271 else if( m_inspectClearanceDlg && aEvent.GetString() == INSPECT_CLEARANCE_DIALOG_NAME )
3272 {
3273 m_inspectClearanceDlg->Destroy();
3274 m_inspectClearanceDlg = nullptr;
3275 }
3276 else if( m_inspectConstraintsDlg && aEvent.GetString() == INSPECT_CONSTRAINTS_DIALOG_NAME )
3277 {
3278 m_inspectConstraintsDlg->Destroy();
3279 m_inspectConstraintsDlg = nullptr;
3280 }
3281 else if( m_footprintDiffDlg && aEvent.GetString() == FOOTPRINT_DIFF_DIALOG_NAME )
3282 {
3283 if( aEvent.GetId() == wxID_APPLY )
3284 {
3285 KIID fpUUID = m_footprintDiffDlg->GetUserItemID();
3286
3287 CallAfter(
3288 [this, fpUUID]()
3289 {
3290 BOARD_ITEM* item = m_pcb->ResolveItem( fpUUID );
3291
3292 if( FOOTPRINT* footprint = dynamic_cast<FOOTPRINT*>( item ) )
3293 {
3294 m_toolManager->RunAction<EDA_ITEM*>( ACTIONS::selectItem, footprint );
3295
3296 DIALOG_EXCHANGE_FOOTPRINTS dialog( this, footprint, true, true );
3297 dialog.ShowQuasiModal();
3298 }
3299 } );
3300 }
3301
3302 m_footprintDiffDlg->Destroy();
3303 m_footprintDiffDlg = nullptr;
3304 }
3305}
3306
3307
3308#ifdef KICAD_IPC_API
3309void PCB_EDIT_FRAME::onPluginAvailabilityChanged( wxCommandEvent& aEvt )
3310{
3311 wxLogTrace( traceApi, "PCB frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" );
3313 aEvt.Skip();
3314}
3315#endif
3316
3317
3319{
3320 PCB_LAYER_ID curLayer = GetActiveLayer();
3321 const PCB_DISPLAY_OPTIONS& displ_opts = GetDisplayOptions();
3322
3323 // Check if the specified layer matches the present layer
3324 if( layer == curLayer )
3325 return;
3326
3327 // Copper layers cannot be selected unconditionally; how many of those layers are currently
3328 // enabled needs to be checked.
3329 if( IsCopperLayer( layer ) )
3330 {
3331 if( layer > GetBoard()->GetCopperLayerStackMaxId() )
3332 return;
3333 }
3334
3335 // Is yet more checking required? E.g. when the layer to be selected is a non-copper layer,
3336 // or when switching between a copper layer and a non-copper layer, or vice-versa?
3337
3338 SetActiveLayer( layer );
3339
3341 GetCanvas()->Refresh();
3342}
3343
3344
3346{
3347 switch( aItem->Type() )
3348 {
3351 break;
3352
3353 case PCB_BARCODE_T:
3354 ShowBarcodePropertiesDialog( static_cast<PCB_BARCODE*>( aItem ) );
3355 break;
3356
3357 case PCB_FIELD_T:
3358 case PCB_TEXT_T:
3359 ShowTextPropertiesDialog( static_cast<PCB_TEXT*>( aItem ) );
3360 break;
3361
3362 case PCB_TEXTBOX_T:
3363 ShowTextBoxPropertiesDialog( static_cast<PCB_TEXTBOX*>( aItem ) );
3364 break;
3365
3366 case PCB_TABLE_T:
3367 {
3368 DIALOG_TABLE_PROPERTIES dlg( this, static_cast<PCB_TABLE*>( aItem ) );
3369
3370 //QuasiModal required for Scintilla auto-complete
3371 dlg.ShowQuasiModal();
3372 break;
3373 }
3374
3375 case PCB_PAD_T:
3376 ShowPadPropertiesDialog( static_cast<PAD*>( aItem ) );
3377 break;
3378
3379 case PCB_FOOTPRINT_T:
3380 ShowFootprintPropertiesDialog( static_cast<FOOTPRINT*>( aItem ) );
3381 break;
3382
3383 case PCB_TARGET_T:
3384 ShowTargetOptionsDialog( static_cast<PCB_TARGET*>( aItem ) );
3385 break;
3386
3387 case PCB_DIM_ALIGNED_T:
3388 case PCB_DIM_CENTER_T:
3389 case PCB_DIM_RADIAL_T:
3391 case PCB_DIM_LEADER_T:
3392 {
3393 DIALOG_DIMENSION_PROPERTIES dlg( this, static_cast<PCB_DIMENSION_BASE*>( aItem ) );
3394
3395 dlg.ShowModal();
3396 break;
3397 }
3398
3399 case PCB_SHAPE_T:
3400 ShowGraphicItemPropertiesDialog( static_cast<PCB_SHAPE*>( aItem ) );
3401 break;
3402
3403 case PCB_ZONE_T:
3404 Edit_Zone_Params( static_cast<ZONE*>( aItem ) );
3405 break;
3406
3407 case PCB_GROUP_T:
3409 static_cast<EDA_GROUP*>( static_cast<PCB_GROUP*>( aItem ) ) );
3410 break;
3411
3412 case PCB_GENERATOR_T:
3413 static_cast<PCB_GENERATOR*>( aItem )->ShowPropertiesDialog( this );
3414 break;
3415
3416 case PCB_MARKER_T:
3417 m_toolManager->GetTool<DRC_TOOL>()->CrossProbe( static_cast<PCB_MARKER*>( aItem ) );
3418 break;
3419
3420 case PCB_POINT_T:
3421 break;
3422
3423 default:
3424 break;
3425 }
3426}
3427
3428
3430{
3431 // For now we just delegate to the base implementation which commits any pending
3432 // local history snapshots. If PCB-specific preconditions are later needed (e.g.
3433 // flushing zone fills or router state) they can be added here before calling the
3434 // base class method.
3436}
const char * name
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:125
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition bitmap.cpp:104
@ NORMAL
Inactive layers are shown normally (no high-contrast mode)
@ HIDDEN
Inactive layers are hidden.
constexpr BOX2I BOX2ISafe(const BOX2D &aInput)
Definition box2.h:929
BOX2< VECTOR2D > BOX2D
Definition box2.h:923
static TOOL_ACTION toggleGrid
Definition actions.h:198
static TOOL_ACTION paste
Definition actions.h:80
static TOOL_ACTION unselectAll
Definition actions.h:83
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
Definition actions.h:227
static TOOL_ACTION togglePolarCoords
Definition actions.h:209
static TOOL_ACTION copy
Definition actions.h:78
static TOOL_ACTION pluginsReload
Definition actions.h:294
static TOOL_ACTION selectSetLasso
Definition actions.h:221
static TOOL_ACTION selectSetRect
Set lasso selection mode.
Definition actions.h:220
static TOOL_ACTION group
Definition actions.h:239
static TOOL_ACTION pasteSpecial
Definition actions.h:81
static TOOL_ACTION groupProperties
Definition actions.h:247
static TOOL_ACTION pointEditorArcKeepCenter
Definition actions.h:273
static TOOL_ACTION ungroup
Definition actions.h:240
static TOOL_ACTION toggleBoundingBoxes
Definition actions.h:157
static TOOL_ACTION pointEditorArcKeepRadius
Definition actions.h:275
static TOOL_ACTION showSearch
Definition actions.h:116
static TOOL_ACTION undo
Definition actions.h:75
static TOOL_ACTION duplicate
Definition actions.h:84
static TOOL_ACTION highContrastMode
Definition actions.h:155
static TOOL_ACTION embeddedFiles
Definition actions.h:297
static TOOL_ACTION measureTool
Definition actions.h:252
static TOOL_ACTION doDelete
Definition actions.h:85
static TOOL_ACTION selectionTool
Definition actions.h:251
static TOOL_ACTION save
Definition actions.h:58
static TOOL_ACTION zoomFitScreen
Definition actions.h:142
static TOOL_ACTION redo
Definition actions.h:76
static TOOL_ACTION deleteTool
Definition actions.h:86
static TOOL_ACTION zoomTool
Definition actions.h:146
static TOOL_ACTION showProperties
Definition actions.h:266
static TOOL_ACTION cut
Definition actions.h:77
static TOOL_ACTION gridSetOrigin
Definition actions.h:195
static TOOL_ACTION toggleGridOverrides
Definition actions.h:199
static TOOL_ACTION selectAll
Definition actions.h:82
static TOOL_ACTION pointEditorArcKeepEndpoint
Definition actions.h:274
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
void OnColorThemeChanged()
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:48
Tool responsible for automagic placement of components.
Handles how to draw a screen (a board, a schematic ...)
Definition base_screen.h:41
int GetPageCount() const
Definition base_screen.h:72
bool IsContentModified() const
Definition base_screen.h:60
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,...
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
void SetLocalRatsnestVisible(bool aVisible)
Handle actions specific to the board editor in PcbNew.
Tool for pcb inspection.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition board_item.h:268
void SetLocked(bool aLocked) override
Definition board_item.h:359
void SetUuid(const KIID &aUuid)
bool IsLocked() const override
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Test to see if this object is on the given layer.
Definition board_item.h:350
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition board_item.h:316
VECTOR2I GetFPRelativePosition() const
@ INSTANCE_TO_INSTANCE
Definition board_item.h:478
void SetFPRelativePosition(const VECTOR2I &aPos)
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:323
void BuildListOfNets()
Definition board.h:967
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition board.cpp:1044
void RemoveAllListeners()
Remove all listeners.
Definition board.cpp:3449
const PAGE_INFO & GetPageSettings() const
Definition board.h:807
GAL_SET GetVisibleElements() const
Return a set of all the element categories that are visible.
Definition board.cpp:1038
void InitializeClearanceCache()
Initialize the clearance cache for all board items.
Definition board.cpp:1112
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:3901
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:195
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
Definition board.cpp:2889
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
Definition board.cpp:205
const wxString & GetFileName() const
Definition board.h:360
void SetElementVisibility(GAL_LAYER_ID aLayer, bool aNewState)
Change the visibility of an element category.
Definition board.cpp:1050
void ClearProject()
Definition board.cpp:246
bool IsEmpty() const
Definition board.cpp:606
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:2394
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition board.cpp:978
void UpdateRatsnestExclusions()
Update the visibility flags on the current unconnected ratsnest lines.
Definition board.cpp:307
void SynchronizeTuningProfileProperties()
Ensure that all time domain properties providers are in sync with current settings.
Definition board.cpp:2883
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition board.h:571
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:558
void SetColor(int aLayer, const COLOR4D &aColor)
COLOR4D GetColor(int aLayer) const
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
Definition commit.h:90
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
Definition commit.h:106
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
Definition commit.h:78
Handle actions that are shared between different applications.
Handles action that are shared between different applications.
enum FP_PROPS_RETVALUE GetReturnValue()
Dialog that offers to migrate obsolete WRL 3D model references on a loaded board to current STEP mode...
static bool BoardHasUnresolvedWrlReferences(PCB_EDIT_FRAME *aFrame)
Cheap precheck that avoids constructing the dialog (and its embedded 3D canvas) when the board has no...
int ShowModal() override
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:87
bool IsDRCRunning() const
Check to see if the DRC engine is running the tests.
Definition drc_tool.h:74
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 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 ReCreateAuxiliaryToolbar()
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
A set of EDA_ITEMs (i.e., without duplicates).
Definition eda_group.h:46
void RemoveItem(EDA_ITEM *aItem)
Remove item from group.
Definition eda_group.cpp:40
void AddItem(EDA_ITEM *aItem)
Add item to group.
Definition eda_group.cpp:27
virtual EDA_ITEM * AsEdaItem()=0
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:100
const KIID m_Uuid
Definition eda_item.h:528
virtual EDA_GROUP * GetParentGroup() const
Definition eda_item.h:118
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:112
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition eda_item.h:151
virtual void SetParent(EDA_ITEM *aParent)
Definition eda_item.cpp:93
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:92
const EDA_ANGLE & GetTextAngle() const
Definition eda_text.h:162
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:113
virtual bool IsVisible() const
Definition eda_text.h:202
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition eda_text.cpp:438
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:215
virtual void SetVisible(bool aVisible)
Definition eda_text.cpp:391
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:218
virtual void SetText(const wxString &aText)
Definition eda_text.cpp:275
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:304
int GetTextThickness() const
Definition eda_text.h:143
VECTOR2I GetTextSize() const
Definition eda_text.h:276
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:56
void RemoveFile(const wxString &name, bool aErase=true)
Remove a file from the collection and frees the memory.
EMBEDDED_FILE * AddFile(const wxFileName &aName, bool aOverwrite)
Load a file from disk and adds it to the collection.
const std::map< wxString, EMBEDDED_FILE * > & EmbeddedFileMap() const
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:770
void LoadFootprintFromLibrary(LIB_ID aFPID)
bool LoadFootprintFromBoard(FOOTPRINT *aFootprint)
Load a footprint from the main board into the Footprint Editor.
Component library viewer main window.
bool AllowSolderMaskBridges() const
Definition footprint.h:501
ZONE_CONNECTION GetLocalZoneConnection() const
Definition footprint.h:477
void SetLocked(bool isLocked) override
Set the #MODULE_is_LOCKED bit in the m_ModuleStatus.
Definition footprint.h:632
EDA_ANGLE GetOrientation() const
Definition footprint.h:408
ZONES & Zones()
Definition footprint.h:383
PCB_POINTS & Points()
Definition footprint.h:389
void SetOrientation(const EDA_ANGLE &aNewAngle)
void SetAllowSolderMaskBridges(bool aAllow)
Definition footprint.h:502
void SetLocalSolderPasteMarginRatio(std::optional< double > aRatio)
Definition footprint.h:474
wxString GetSheetname() const
Definition footprint.h:455
void SetPath(const KIID_PATH &aPath)
Definition footprint.h:453
void SetFilters(const wxString &aFilters)
Definition footprint.h:462
void SetStaticComponentClass(const COMPONENT_CLASS *aClass) const
Sets the component class object pointer for this footprint.
bool FootprintNeedsUpdate(const FOOTPRINT *aLibFP, int aCompareFlags=0, REPORTER *aReporter=nullptr)
Return true if a board footprint differs from the library version.
const EXTRUDED_3D_BODY * GetExtrudedBody() const
Definition footprint.h:398
void SetAttributes(int aAttributes)
Definition footprint.h:496
void SetSheetfile(const wxString &aSheetfile)
Definition footprint.h:459
std::optional< int > GetLocalSolderPasteMargin() const
Definition footprint.h:470
PCB_FIELD & Value()
read/write accessors:
Definition footprint.h:865
bool HasExtrudedBody() const
Definition footprint.h:397
std::optional< int > GetLocalClearance() const
Definition footprint.h:464
void ClearExtrudedBody()
Definition footprint.h:402
std::deque< PAD * > & Pads()
Definition footprint.h:377
int GetAttributes() const
Definition footprint.h:495
const COMPONENT_CLASS * GetComponentClass() const
Returns the component class for this footprint.
void SetLocalZoneConnection(ZONE_CONNECTION aType)
Definition footprint.h:476
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition footprint.h:417
void SetExtrudedBody(std::unique_ptr< EXTRUDED_3D_BODY > aBody)
wxString GetSheetfile() const
Definition footprint.h:458
const LIB_ID & GetFPID() const
Definition footprint.h:429
bool IsLocked() const override
Definition footprint.h:622
PCB_FIELD & Reference()
Definition footprint.h:866
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
std::optional< double > GetLocalSolderPasteMarginRatio() const
Definition footprint.h:473
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
GROUPS & Groups()
Definition footprint.h:386
wxString GetFilters() const
Definition footprint.h:461
void SetSheetname(const wxString &aSheetname)
Definition footprint.h:456
void GetFields(std::vector< PCB_FIELD * > &aVector, bool aVisibleOnly) const
Populate a std::vector with PCB_TEXTs.
std::vector< FP_3DMODEL > & Models()
Definition footprint.h:394
const wxString & GetValue() const
Definition footprint.h:851
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
Definition footprint.h:468
void SetLocalClearance(std::optional< int > aClearance)
Definition footprint.h:465
const KIID_PATH & GetPath() const
Definition footprint.h:452
std::optional< int > GetLocalSolderMaskMargin() const
Definition footprint.h:467
void SetLocalSolderPasteMargin(std::optional< int > aMargin)
Definition footprint.h:471
EMBEDDED_FILES * GetEmbeddedFiles() override
Definition footprint.h:1281
VECTOR2I GetPosition() const override
Definition footprint.h:405
DRAWINGS & GraphicalItems()
Definition footprint.h:380
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
bool Contains(GAL_LAYER_ID aPos)
Definition layer_ids.h:439
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?
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:95
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
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:91
An abstract base class for deriving all objects that can be added to a VIEW.
Definition view_item.h:86
bool IsBOARD_ITEM() const
Definition view_item.h:102
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:67
double GetScale() const
Definition view.h:285
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition view.cpp:598
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:1809
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition view.h:409
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:1666
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition view.h:656
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:1682
An implementation of class VIEW_CONTROLS for wxWidgets library.
std::unique_ptr< PROF_COUNTER > m_MotionEventCounter
Definition kiid.h:48
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)
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:315
void OnKiCadExit()
Definition kiway.cpp:800
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:402
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:500
LOCAL_HISTORY & LocalHistory()
Return the LOCAL_HISTORY associated with this KIWAY.
Definition kiway.h:426
virtual void CommonSettingsChanged(int aFlags=0)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition kiway.cpp:594
PCB_LAYER_ID GetLayerA() const
PCB_LAYER_ID GetLayerB() const
const UTF8 & GetLibItemName() const
Definition lib_id.h:102
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 RegisterSaver(const void *aSaverObject, const std::function< void(const wxString &, std::vector< HISTORY_FILE_DATA > &)> &aSaver)
Register a saver callback invoked during autosave history commits.
bool Init(const wxString &aProjectPath)
Initialize the local history repository for the given project path.
void NoteFileChange(const wxString &aFile)
Record that a file has been modified and should be included in the next snapshot.
void UnregisterSaver(const void *aSaverObject)
Unregister a previously registered saver callback.
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:313
static const LSET & AllLayersMask()
Definition lset.cpp:641
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition lset.cpp:188
@ MARKER_DRAWING_SHEET
Definition marker_base.h:56
Tool responsible for adding microwave features to PCBs.
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
Definition netinfo.h:228
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
Definition pad.h:55
void SetPinType(const wxString &aType)
Set the pad electrical type.
Definition pad.h:153
const wxString & GetPinType() const
Definition pad.h:154
const wxString & GetPinFunction() const
Definition pad.h:148
bool IsOnCopperLayer() const override
Definition pad.cpp:1573
void SetPinFunction(const wxString &aName)
Set the pad function (pin name in schematic)
Definition pad.h:147
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:79
DISPLAY_OPTIONS m_Display
EDA_ANGLE m_RotationAngle
ARC_EDIT_MODE m_ArcEditMode
AUI_PANELS m_AuiPanels
Gather all the actions that are shared by tools.
Definition pcb_actions.h:51
static TOOL_ACTION 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 saveSelectionAsDesignBlock
static TOOL_ACTION drawCircle
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 ddAppendBoard
Drag and drop.
static TOOL_ACTION highlightNet
static TOOL_ACTION autoTrackWidth
static TOOL_ACTION drawTable
static TOOL_ACTION drawTextBox
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 angleSnapModeChanged
Notification event when angle mode changes.
static TOOL_ACTION saveBoardAsDesignBlock
static TOOL_ACTION drillOrigin
static TOOL_ACTION tuneSkew
static TOOL_ACTION trackDisplayMode
static TOOL_ACTION showNetInspector
static TOOL_ACTION microwaveCreateStubArc
static TOOL_ACTION zoneDisplayTriangulated
static TOOL_ACTION placeDesignBlock
static TOOL_ACTION selectUnconnected
Select unconnected footprints from ratsnest of selection.
Definition pcb_actions.h:88
static TOOL_ACTION zoneDisplayFractured
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 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:97
static TOOL_ACTION microwaveCreateStub
static TOOL_ACTION selectNet
Select all connections belonging to a single net.
Definition pcb_actions.h:82
static TOOL_ACTION ddImportGraphics
static TOOL_ACTION microwaveCreateLine
static TOOL_ACTION flipBoard
static TOOL_ACTION zoneDisplayOutline
static TOOL_ACTION ratsnestLineMode
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 unlock
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 deselectNet
Remove all connections belonging to a single net from the active selection.
Definition pcb_actions.h:85
static TOOL_ACTION drawLine
static TOOL_ACTION placeLinkedDesignBlock
static TOOL_ACTION localRatsnestTool
static TOOL_ACTION drawAlignedDimension
static TOOL_ACTION drawZone
static TOOL_ACTION selectOnSchematic
Select symbols/pins on schematic corresponding to selected footprints/pads.
static TOOL_ACTION lock
Common, abstract interface for edit frames.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
wxString GetDesignRulesPath()
Return the absolute path to the design rules file for the currently-loaded board.
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.
void PlaceFootprint(FOOTPRINT *aFootprint, bool aRecreateRatsnest=true, std::optional< VECTOR2I > aPosition=std::nullopt)
Place aFootprint at the current cursor position (or provided one) and updates footprint coordinates w...
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
Handle actions that are shared between different frames in PcbNew.
Definition pcb_control.h:47
Handle design block actions in the PCB editor.
Abstract dimension API.
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.
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
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:99
void SetLastPath(LAST_PATH_TYPE aType, const wxString &aLastPath)
Set the path of the last file successfully read.
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:72
wxTimer m_crossProbeFlashTimer
Timer to toggle selection visibility for flash.
void StartCrossProbeFlash(const std::vector< BOARD_ITEM * > &aItems)
void OnCrossProbeFlashTimer(wxTimerEvent &aEvent)
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.
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
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 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 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:42
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 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.
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()
void ExchangeFootprint(FOOTPRINT *aExisting, FOOTPRINT *aNew, BOARD_COMMIT &aCommit, bool matchPadPositions, bool deleteExtraTexts=true, bool resetTextLayers=true, bool resetTextEffects=true, bool resetTextPositions=true, bool resetTextContent=true, bool resetFabricationAttrs=true, bool resetClearanceOverrides=true, bool reset3DModels=true, bool *aUpdated=nullptr)
Replace aExisting footprint by aNew footprint using the Existing footprint settings (position,...
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()
A set of BOARD_ITEMs (i.e., without duplicates).
Definition pcb_group.h:53
PCB net inspection panel.
Generic tool for picking an item.
Tool that displays edit points allowing to modify items by dragging the points.
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
Definition pcb_point.h:43
PCB_LAYER_ID m_Route_Layer_TOP
Definition pcb_screen.h:43
PCB_LAYER_ID m_Route_Layer_BOTTOM
Definition pcb_screen.h:44
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.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition pcb_text.cpp:519
Tool useful for viewing footprints.
virtual const wxString & GetExecutablePath() const
Definition pgm_base.cpp:867
The interactive edit tool.
void Show(std::ostream &aStream=std::cerr)
Definition profile.h:277
void Reset()
Definition profile.h:267
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:187
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
Definition project.h:210
void IncrementNetclassesTicker()
Definition project.h:118
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:204
void IncrementTextVarsTicker()
Definition project.h:115
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:177
int Size() const
Returns the number of selected parts.
Definition selection.h:121
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition richio.h:226
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:66
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition tool_base.h:80
Generic, UI-independent tool event.
Definition tool_event.h:171
void SetHasPosition(bool aHasPosition)
Definition tool_event.h:261
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).
wxString wx_str() const
Definition utf8.cpp:45
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()
Handle a list of polygons defining a copper zone.
Definition zone.h:74
A type-safe container of any type.
Definition ki_any.h:93
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:150
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:221
int GetLastUnsavedChangesResponse()
Return the result code from the last call to HandleUnsavedChanges(): wxID_YES, wxID_NO or wxID_CANCEL...
Definition confirm.cpp:163
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define DIALOG_DRC_WINDOW_NAME
Definition dialog_drc.h:41
#define DIALOG_DRC_RULE_EDITOR_WINDOW_NAME
#define _(s)
Declaration of the eda_3d_viewer class.
static constexpr EDA_ANGLE ANGLE_0
Definition eda_angle.h:411
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:413
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define PCB_EDIT_FRAME_NAME
@ NO_RECURSE
Definition eda_item.h:54
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)
bool ComputeFootprintShift(const FOOTPRINT &aExisting, const FOOTPRINT &aNew, VECTOR2I &aShift, EDA_ANGLE &aAngleShift)
Compute position and angle shift between two footprints.
Collection of reusable/testable functions for footprint manipulation.
@ FRAME_PCB_EDITOR
Definition frame_type.h:42
@ FRAME_FOOTPRINT_VIEWER
Definition frame_type.h:45
@ FRAME_SCH
Definition frame_type.h:34
@ FRAME_FOOTPRINT_CHOOSER
Definition frame_type.h:44
@ FRAME_FOOTPRINT_EDITOR
Definition frame_type.h:43
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:116
@ ID_FILE_LIST_CLEAR
Definition id.h:62
@ ID_EDA_SOCKET_EVENT
Definition id.h:136
@ ID_EDA_SOCKET_EVENT_SERV
Definition id.h:135
@ ID_ON_ZOOM_SELECT
Definition id.h:115
@ ID_FILEMAX
Definition id.h:60
@ ID_FILE1
Definition id.h:59
PROJECT & Prj()
Definition kicad.cpp:644
int GetNetnameLayer(int aLayer)
Return a netname layer corresponding to the given layer.
Definition layer_ids.h:856
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition layer_ids.h:679
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
Definition layer_ids.h:228
@ LAYER_GRID
Definition layer_ids.h:254
@ LAYER_ZONES
Control for copper zone opacity/visibility (color ignored).
Definition layer_ids.h:295
@ LAYER_RATSNEST
Definition layer_ids.h:253
#define CLEARANCE_LAYER_FOR(boardLayer)
Definition layer_ids.h:373
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
@ F_Paste
Definition layer_ids.h:104
@ B_Mask
Definition layer_ids.h:98
@ B_Cu
Definition layer_ids.h:65
@ F_Mask
Definition layer_ids.h:97
@ B_Paste
Definition layer_ids.h:105
@ UNDEFINED_LAYER
Definition layer_ids.h:61
@ F_Cu
Definition layer_ids.h:64
@ MAIL_SCH_GET_NETLIST
Definition mail_type.h:49
@ REPAINT
Item needs to be redrawn.
Definition view_item.h:58
@ GEOMETRY
Position or shape has changed.
Definition view_item.h:55
@ ALL
All except INITIAL_ADD.
Definition view_item.h:59
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
Definition definitions.h:38
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:44
BARCODE class definition.
static std::vector< std::pair< T *, T * > > matchItemsBySimilarity(const std::vector< T * > &aExisting, const std::vector< T * > &aNew)
static void processTextItem(const PCB_TEXT &aSrc, PCB_TEXT &aDest, const VECTOR2I &aPosShift, const EDA_ANGLE &aAngleShift, bool aResetText, bool aResetTextLayers, bool aResetTextEffects, bool aResetTextPositions, bool *aUpdated)
copy text settings from aSrc to aDest
#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:42
#define SKIP_UNDO
Definition sch_commit.h:40
#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:37
bool Intersects(const BOX2I_MINMAX &aOther) const
Definition box2_minmax.h:73
A filename or source description, a problem input line, a line number, a byte offset,...
TRACK_CLEARANCE_MODE m_TrackClearance
@ AS_GLOBAL
Global action (toolbar/main menu event, global shortcut)
Definition tool_action.h:49
@ AS_ACTIVE
All active tools.
Definition tool_action.h:48
@ TA_MODEL_CHANGE
Model has changed (partial update).
Definition tool_event.h:121
@ TC_COMMAND
Definition tool_event.h:57
#define TEXTVARS_CHANGED
wxLogTrace helper definitions.
VECTOR2I GetRotated(const VECTOR2I &aVector, const EDA_ANGLE &aAngle)
Return a new VECTOR2I that is the result of rotating aVector by aAngle.
Definition trigo.h:77
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition typeinfo.h:85
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition typeinfo.h:103
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition typeinfo.h:100
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
Definition typeinfo.h:88
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition typeinfo.h:94
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition typeinfo.h:101
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition typeinfo.h:108
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition typeinfo.h:90
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition typeinfo.h:105
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition typeinfo.h:89
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
Definition typeinfo.h:86
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition typeinfo.h:87
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
Definition typeinfo.h:96
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
Definition typeinfo.h:98
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
Definition typeinfo.h:104
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:83
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition typeinfo.h:99
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition typeinfo.h:84
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition typeinfo.h:95
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
Definition typeinfo.h:91
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
Definition typeinfo.h:110
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition typeinfo.h:93
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition typeinfo.h:102
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:687
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.