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