KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
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 <dick@softplc.com>
6 * Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>
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 <advanced_config.h>
24#include <kiface_base.h>
25#include <kiway.h>
26#include <pgm_base.h>
27#include <pcb_edit_frame.h>
30#include <fp_lib_table.h>
31#include <bitmaps.h>
32#include <confirm.h>
33#include <lset.h>
34#include <trace_helpers.h>
35#include <pcbnew_id.h>
36#include <pcbnew_settings.h>
39#include <dialog_plot.h>
40#include <dialog_find.h>
43#include <dialog_board_setup.h>
44#include <invoke_pcb_dialog.h>
46#include <board.h>
48#include <footprint.h>
49#include <layer_pairs.h>
53#include <pcb_draw_panel_gal.h>
54#include <functional>
55#include <pcb_painter.h>
58#include <python_scripting.h>
61#include <tool/tool_manager.h>
63#include <tool/action_toolbar.h>
64#include <tool/common_control.h>
65#include <tool/common_tools.h>
66#include <tool/embed_tool.h>
68#include <tool/selection.h>
69#include <tool/zoom_tool.h>
70#include <tools/array_tool.h>
75#include <tools/edit_tool.h>
77#include <tools/group_tool.h>
79#include <tools/drc_tool.h>
81#include <tools/convert_tool.h>
82#include <tools/drawing_tool.h>
83#include <tools/pcb_control.h>
91#include <tools/pad_tool.h>
95#include <tools/pcb_actions.h>
97#include <router/router_tool.h>
100#include <gestfich.h>
101#include <executable_names.h>
103#include <wx/socket.h>
104#include <wx/wupdlock.h>
105#include <dialog_drc.h> // for DIALOG_DRC_WINDOW_NAME definition
110#include <widgets/wx_infobar.h>
114#include <widgets/wx_aui_utils.h>
115#include <kiplatform/app.h>
116#include <core/profile.h>
117#include <math/box2_minmax.h>
121#include <toolbars_pcb_editor.h>
122
123#ifdef KICAD_IPC_API
124#include <api/api_server.h>
125#include <api/api_handler_pcb.h>
127#include <api/api_utils.h>
128#endif
129
130#include <action_plugin.h>
132#include "../scripting/python_scripting.h"
133
134#include <wx/filedlg.h>
135
136using namespace std::placeholders;
137
138
139#define INSPECT_DRC_ERROR_DIALOG_NAME wxT( "InspectDrcErrorDialog" )
140#define INSPECT_CLEARANCE_DIALOG_NAME wxT( "InspectClearanceDialog" )
141#define INSPECT_CONSTRAINTS_DIALOG_NAME wxT( "InspectConstraintsDialog" )
142#define FOOTPRINT_DIFF_DIALOG_NAME wxT( "FootprintDiffDialog" )
143
144
145BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME )
148
149
152
153 EVT_SIZE( PCB_EDIT_FRAME::OnSize )
154
156
157 // Menu Files:
159
163
169
172
173 EVT_MENU( wxID_EXIT, PCB_EDIT_FRAME::OnQuit )
174 EVT_MENU( wxID_CLOSE, PCB_EDIT_FRAME::OnQuit )
175
176 // menu Postprocess
178
179 // 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_show_layer_manager_tools = true;
219 m_supportsAutoSave = true;
220 m_probingSchToPcb = false;
221 m_show_search = false;
222 m_show_net_inspector = false;
223
224 // We don't know what state board was in when it was last saved, so we have to
225 // assume dirty
226 m_ZoneFillsDirty = true;
227
228 m_aboutTitle = _HKI( "KiCad PCB Editor" );
229
230 // Must be created before the menus are created.
231 if( ADVANCED_CFG::GetCfg().m_ShowPcbnewExportNetlist )
232 {
233 m_exportNetlistAction = new TOOL_ACTION( "pcbnew.EditorControl.exportNetlist",
234 AS_GLOBAL, 0, "", _( "Netlist..." ),
235 _( "Export netlist used to update schematics" ) );
236 }
237
238 // Create GAL canvas
239 auto canvas = new PCB_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
240 GetGalDisplayOptions(),
242
243 SetCanvas( canvas );
244 SetBoard( new BOARD() );
245
246 wxIcon icon;
247 wxIconBundle icon_bundle;
248
249 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 48 ) );
250 icon_bundle.AddIcon( icon );
251 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 128 ) );
252 icon_bundle.AddIcon( icon );
253 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew, 256 ) );
254 icon_bundle.AddIcon( icon );
255 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew_32 ) );
256 icon_bundle.AddIcon( icon );
257 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pcbnew_16 ) );
258 icon_bundle.AddIcon( icon );
259
260 SetIcons( icon_bundle );
261
262 // LoadSettings() *after* creating m_LayersManager, because LoadSettings()
263 // initialize parameters in m_LayersManager
264 LoadSettings( config() );
265
266 SetScreen( new PCB_SCREEN( GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS ) ) );
267
268 // PCB drawings start in the upper left corner.
269 GetScreen()->m_Center = false;
270
271 setupTools();
272 setupUIConditions();
273
274 m_toolbarSettings = Pgm().GetSettingsManager().GetToolbarSettings<PCB_EDIT_TOOLBAR_SETTINGS>( "pcbnew-toolbars" );
275 configureToolbars();
276 RecreateToolbars();
277 PrepareLayerIndicator( true );
278
279 ReCreateMenuBar();
280
281#ifdef KICAD_IPC_API
283 &PCB_EDIT_FRAME::onPluginAvailabilityChanged, this );
284#endif
285
286 // Fetch a COPY of the config as a lot of these initializations are going to overwrite our
287 // data.
288 PCBNEW_SETTINGS::AUI_PANELS aui_cfg = GetPcbNewSettings()->m_AuiPanels;
289
290 m_propertiesPanel = new PCB_PROPERTIES_PANEL( this, this );
291 m_propertiesPanel->SetSplitterProportion( aui_cfg.properties_splitter );
292
293 m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this );
294
295 m_appearancePanel = new APPEARANCE_CONTROLS( this, GetCanvas() );
296 m_searchPane = new PCB_SEARCH_PANE( this );
297 m_netInspectorPanel = new PCB_NET_INSPECTOR_PANEL( this, this );
298 m_designBlocksPane = new PCB_DESIGN_BLOCK_PANE( this, nullptr, m_designBlockHistoryList );
299
300 m_auimgr.SetManagedWindow( this );
301
302 CreateInfoBar();
303
304 unsigned int auiFlags = wxAUI_MGR_DEFAULT;
305#if !defined( _WIN32 )
306 // Windows cannot redraw the UI fast enough during a live resize and may lead to all kinds
307 // of graphical glitches.
308 auiFlags |= wxAUI_MGR_LIVE_RESIZE;
309#endif
310 m_auimgr.SetFlags( auiFlags );
311
312 // Rows; layers 4 - 6
313 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) )
314 .Top().Layer( 6 ) );
315 m_auimgr.AddPane( m_tbTopAux, EDA_PANE().HToolbar().Name( wxS( "TopAuxToolbar" ) )
316 .Top().Layer( 5 ) );
317 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) )
318 .Bottom().Layer( 6 ) );
319
320 // Columns; layers 1 - 3
321 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( wxS( "LeftToolbar" ) )
322 .Left().Layer( 3 ) );
323
324 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( wxS( "RightToolbar" ) )
325 .Right().Layer( 3 ) );
326
327 m_auimgr.AddPane( m_appearancePanel, EDA_PANE().Name( wxS( "LayersManager" ) )
328 .Right().Layer( 4 )
329 .Caption( _( "Appearance" ) ).PaneBorder( false )
330 .MinSize( m_appearancePanel->GetMinSize().x, -1 )
331#ifdef __WXMAC__
332 // Best size for this pane is calculated larger than necessary on wxMac
333 .BestSize( m_appearancePanel->GetMinSize().x, -1 )
334#else
335 .BestSize( m_appearancePanel->GetBestSize().x, -1 )
336#endif
337 .FloatingSize( m_appearancePanel->GetBestSize() )
338 .CloseButton( false ) );
339
340 m_auimgr.AddPane( m_selectionFilterPanel, EDA_PANE().Name( wxS( "SelectionFilter" ) )
341 .Right().Layer( 4 ).Position( 2 )
342 .Caption( _( "Selection Filter" ) ).PaneBorder( false )
343 .MinSize( m_selectionFilterPanel->GetMinSize().x, -1 )
344 .BestSize( m_selectionFilterPanel->GetBestSize().x, -1 )
345 .FloatingSize( m_selectionFilterPanel->GetBestSize() )
346 .CloseButton( false ) );
347
348 m_auimgr.AddPane( m_designBlocksPane, EDA_PANE().Name( DesignBlocksPaneName() )
349 .Right().Layer( 5 )
350 .Caption( _( "Design Blocks" ) )
351 .CaptionVisible( true )
352 .PaneBorder( true )
353 .TopDockable( false )
354 .BottomDockable( false )
355 .CloseButton( true )
356 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
357 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
358 .FloatingSize( FromDIP( wxSize( 800, 600 ) ) )
359 .FloatingPosition( FromDIP( wxPoint( 50, 200 ) ) )
360 .Show( true ) );
361
362 m_auimgr.AddPane( m_propertiesPanel, EDA_PANE().Name( PropertiesPaneName() )
363 .Left().Layer( 5 )
364 .Caption( _( "Properties" ) ).PaneBorder( false )
365 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
366 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
367 .FloatingSize( wxSize( 300, 200 ) )
368 .CloseButton( true ) );
369
370 // Center
371 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
372 .Center() );
373
374 m_auimgr.AddPane( m_netInspectorPanel, EDA_PANE()
375 .Name( NetInspectorPanelName() )
376 .Bottom()
377 .Caption( _( "Net Inspector" ) )
378 .PaneBorder( false )
379 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
380 .BestSize( FromDIP( wxSize( 300, 200 ) ) )
381 .FloatingSize( wxSize( 300, 200 ) )
382 .CloseButton( true ) );
383
384 m_auimgr.AddPane( m_searchPane, EDA_PANE().Name( SearchPaneName() )
385 .Bottom()
386 .Caption( _( "Search" ) ).PaneBorder( false )
387 .MinSize( FromDIP( wxSize ( 180, 60 ) ) )
388 .BestSize( FromDIP( wxSize ( 180, 100 ) ) )
389 .FloatingSize( FromDIP( wxSize( 480, 200 ) ) )
390 .DestroyOnClose( false )
391 .CloseButton( true ) );
392
393
394 m_auimgr.GetPane( "LayersManager" ).Show( m_show_layer_manager_tools );
395 m_auimgr.GetPane( "SelectionFilter" ).Show( m_show_layer_manager_tools );
396 m_auimgr.GetPane( PropertiesPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.show_properties );
397 m_auimgr.GetPane( NetInspectorPanelName() ).Show( m_show_net_inspector );
398 m_auimgr.GetPane( SearchPaneName() ).Show( m_show_search );
399 m_auimgr.GetPane( DesignBlocksPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.design_blocks_show );
400
401 // The selection filter doesn't need to grow in the vertical direction when docked
402 m_auimgr.GetPane( "SelectionFilter" ).dock_proportion = 0;
403
404 FinishAUIInitialization();
405
406 if( aui_cfg.right_panel_width > 0 )
407 {
408 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( wxS( "LayersManager" ) );
409 SetAuiPaneSize( m_auimgr, layersManager, aui_cfg.right_panel_width, -1 );
410
411 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
412 SetAuiPaneSize( m_auimgr, designBlocksPane, aui_cfg.design_blocks_panel_docked_width, -1 );
413 }
414
415 if( aui_cfg.properties_panel_width > 0 && m_propertiesPanel )
416 {
417 wxAuiPaneInfo& propertiesPanel = m_auimgr.GetPane( PropertiesPaneName() );
418 SetAuiPaneSize( m_auimgr, propertiesPanel, aui_cfg.properties_panel_width, -1 );
419 }
420
421 if( aui_cfg.search_panel_height > 0
422 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_TOP
423 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) )
424 {
425 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
426 searchPane.Direction( aui_cfg.search_panel_dock_direction );
427 SetAuiPaneSize( m_auimgr, searchPane, -1, aui_cfg.search_panel_height );
428 }
429 else if( aui_cfg.search_panel_width > 0
430 && ( aui_cfg.search_panel_dock_direction == wxAUI_DOCK_LEFT
431 || aui_cfg.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) )
432 {
433 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
434 searchPane.Direction( aui_cfg.search_panel_dock_direction );
435 SetAuiPaneSize( m_auimgr, searchPane, aui_cfg.search_panel_width, -1 );
436 }
437
438 m_appearancePanel->SetTabIndex( aui_cfg.appearance_panel_tab );
439
440 {
441 m_layerPairSettings = std::make_unique<LAYER_PAIR_SETTINGS>();
442
443 m_layerPairSettings->Bind( PCB_LAYER_PAIR_PRESETS_CHANGED, [&]( wxCommandEvent& aEvt )
444 {
445 // Update the project file list
446 std::span<const LAYER_PAIR_INFO> newPairInfos = m_layerPairSettings->GetLayerPairs();
448 std::vector<LAYER_PAIR_INFO>{ newPairInfos.begin(), newPairInfos.end() };
449 });
450
451 m_layerPairSettings->Bind( PCB_CURRENT_LAYER_PAIR_CHANGED, [&]( wxCommandEvent& aEvt )
452 {
453 const LAYER_PAIR& layerPair = m_layerPairSettings->GetCurrentLayerPair();
454 PCB_SCREEN& screen = *GetScreen();
455
456 screen.m_Route_Layer_TOP = layerPair.GetLayerA();
457 screen.m_Route_Layer_BOTTOM = layerPair.GetLayerB();
458
459 // Update the toolbar icon
460 PrepareLayerIndicator();
461 });
462 }
463
464 GetToolManager()->PostAction( ACTIONS::zoomFitScreen );
465
466 // This is used temporarily to fix a client size issue on GTK that causes zoom to fit
467 // to calculate the wrong zoom size. See PCB_EDIT_FRAME::onSize().
468 Bind( wxEVT_SIZE, &PCB_EDIT_FRAME::onSize, this );
469
470 Bind( wxEVT_IDLE,
471 [this]( wxIdleEvent& aEvent )
472 {
473 BOX2D viewport = GetCanvas()->GetView()->GetViewport();
474
475 if( viewport != m_lastNetnamesViewport )
476 {
477 redrawNetnames();
478 m_lastNetnamesViewport = viewport;
479 }
480
481 // Do not forget to pass the Idle event to other clients:
482 aEvent.Skip();
483 } );
484
485 resolveCanvasType();
486
487 setupUnits( config() );
488
489 // Ensure the DRC engine is initialized so that constraints can be resolved even before a
490 // board is loaded or saved
491 try
492 {
493 m_toolManager->GetTool<DRC_TOOL>()->GetDRCEngine()->InitEngine( wxFileName() );
494 }
495 catch( PARSE_ERROR& )
496 {
497 }
498
499 // Ensure the Python interpreter is up to date with its environment variables
500 PythonSyncEnvironmentVariables();
501 PythonSyncProjectName();
502
503 // Sync action plugins in case they changed since the last time the frame opened
504 GetToolManager()->RunAction( ACTIONS::pluginsReload );
505
506#ifdef KICAD_IPC_API
507 m_apiHandler = std::make_unique<API_HANDLER_PCB>( this );
508 Pgm().GetApiServer().RegisterHandler( m_apiHandler.get() );
509
510 if( Kiface().IsSingle() )
511 {
512 m_apiHandlerCommon = std::make_unique<API_HANDLER_COMMON>();
513 Pgm().GetApiServer().RegisterHandler( m_apiHandlerCommon.get() );
514 }
515#endif
516
517 GetCanvas()->SwitchBackend( m_canvasType );
518 ActivateGalCanvas();
519
520 // Default shutdown reason until a file is loaded
521 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New PCB file is unsaved" ) );
522
523 // disable Export STEP item if kicad2step does not exist
524 wxString strK2S = Pgm().GetExecutablePath();
525
526#ifdef __WXMAC__
527 if( strK2S.Find( wxT( "pcbnew.app" ) ) != wxNOT_FOUND )
528 {
529 // On macOS, we have standalone applications inside the main bundle, so we handle that here:
530 strK2S += wxT( "../../" );
531 }
532
533 strK2S += wxT( "Contents/MacOS/" );
534#endif
535
536 wxFileName appK2S( strK2S, wxT( "kicad2step" ) );
537
538#ifdef _WIN32
539 appK2S.SetExt( wxT( "exe" ) );
540#endif
541
542 // Ensure the window is on top
543 Raise();
544
545// if( !appK2S.FileExists() )
546 // GetMenuBar()->FindItem( ID_GEN_EXPORT_FILE_STEP )->Enable( false );
547
548 // AUI doesn't refresh properly on wxMac after changes in eb7dc6dd, so force it to
549#ifdef __WXMAC__
550 if( Kiface().IsSingle() )
551 {
552 CallAfter( [this]()
553 {
554 m_appearancePanel->OnBoardChanged();
555 } );
556 }
557#endif
558
559 // Register a call to update the toolbar sizes. It can't be done immediately because
560 // it seems to require some sizes calculated that aren't yet (at least on GTK).
561 CallAfter( [this]()
562 {
563 // Ensure the controls on the toolbars all are correctly sized
564 UpdateToolbarControlSizes();
565 } );
566
568 {
569 m_eventCounterTimer = new wxTimer( this );
570
571 Bind( wxEVT_TIMER,
572 [&]( wxTimerEvent& aEvent )
573 {
574 GetCanvas()->m_PaintEventCounter->Show();
575 GetCanvas()->m_PaintEventCounter->Reset();
576
578 static_cast<KIGFX::WX_VIEW_CONTROLS*>( GetCanvas()->GetViewControls() );
579 vc->m_MotionEventCounter->Show();
580 vc->m_MotionEventCounter->Reset();
581
582 },
583 m_eventCounterTimer->GetId() );
584
585 m_eventCounterTimer->Start( 1000 );
586 }
587
590 DragAcceptFiles( true );
591
592 Bind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs, this );
593}
594
595
597{
599
600 if( ADVANCED_CFG::GetCfg().m_ShowEventCounters )
601 {
602 // Stop the timer during destruction early to avoid potential event race conditions (that
603 // do happen on windows)
604 m_eventCounterTimer->Stop();
605 delete m_eventCounterTimer;
606 }
607
608 // Close modeless dialogs
609 wxWindow* open_dlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
610
611 if( open_dlg )
612 open_dlg->Close( true );
613
614 // Shutdown all running tools
615 if( m_toolManager )
617
618 if( GetBoard() )
620
622 delete m_appearancePanel;
624 delete m_propertiesPanel;
625 delete m_netInspectorPanel;
626}
627
628
629void PCB_EDIT_FRAME::SetBoard( BOARD* aBoard, bool aBuildConnectivity,
630 PROGRESS_REPORTER* aReporter )
631{
632 if( m_pcb )
634
635 PCB_BASE_EDIT_FRAME::SetBoard( aBoard, aReporter );
636
637 aBoard->SetProject( &Prj() );
638
639 if( aBuildConnectivity )
640 aBoard->BuildConnectivity();
641
642 // reload the drawing-sheet
643 SetPageSettings( aBoard->GetPageSettings() );
644}
645
646
648{
649 return m_pcb;
650}
651
652
653std::unique_ptr<GRID_HELPER> PCB_EDIT_FRAME::MakeGridHelper()
654{
655 return std::make_unique<PCB_GRID_HELPER>( m_toolManager, GetMagneticItemsSettings() );
656}
657
658
660{
661 /*
662 * While new items being scrolled into the view will get painted, they will only get
663 * annotated with netname instances currently within the view. Subsequent panning will not
664 * draw newly-visible netname instances because the item has already been drawn.
665 *
666 * This routine, fired on idle if the viewport has changed, looks for visible items that
667 * might have multiple netname instances and redraws them. (It does not need to handle pads
668 * and vias because they only ever have a single netname instance drawn on them.)
669 */
670 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() );
671
672 if( !cfg || cfg->m_Display.m_NetNames < 2 )
673 return;
674
675 KIGFX::VIEW* view = GetCanvas()->GetView();
676 BOX2D viewport = view->GetViewport();
677
678 // Inflate to catch most of the track width
679 BOX2I_MINMAX clipbox( BOX2ISafe( viewport.Inflate( pcbIUScale.mmToIU( 2.0 ) ) ) );
680
681 for( PCB_TRACK* track : GetBoard()->Tracks() )
682 {
683 // Don't need to update vias
684 if( track->Type() == PCB_VIA_T )
685 continue;
686
687 // Don't update invisible tracks
688 if( !clipbox.Intersects( BOX2I_MINMAX( track->GetStart(), track->GetEnd() ) ) )
689 continue;
690
691 if( track->ViewGetLOD( GetNetnameLayer( track->GetLayer() ), view ) < view->GetScale() )
692 view->Update( track, KIGFX::REPAINT );
693 }
694}
695
696
697void PCB_EDIT_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
698{
699 PCB_BASE_FRAME::SetPageSettings( aPageSettings );
700
701 // Prepare drawing-sheet template
704 m_pcb->GetProject(),
706 &m_pcb->GetProperties() );
707
708 drawingSheet->SetSheetName( std::string( GetScreenDesc().mb_str() ) );
709 drawingSheet->SetSheetPath( std::string( GetFullScreenDesc().mb_str() ) );
710
711 // A board is not like a schematic having a main page and sub sheets.
712 // So for the drawing sheet, use only the first page option to display items
713 drawingSheet->SetIsFirstPage( true );
714
715 BASE_SCREEN* screen = GetScreen();
716
717 if( screen != nullptr )
718 {
719 drawingSheet->SetPageNumber(TO_UTF8( screen->GetPageNumber() ) );
720 drawingSheet->SetSheetCount( screen->GetPageCount() );
721 }
722
723 if( BOARD* board = GetBoard() )
724 drawingSheet->SetFileName( TO_UTF8( board->GetFileName() ) );
725
726 // PCB_DRAW_PANEL_GAL takes ownership of the drawing-sheet
727 GetCanvas()->SetDrawingSheet( drawingSheet );
728}
729
730
732{
733 return GetScreen() && GetScreen()->IsContentModified();
734}
735
736
738{
739 return m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
740}
741
742
744{
745 // Create the manager and dispatcher & route draw panel events to the dispatcher
748 GetCanvas()->GetViewControls(), config(), this );
749 m_actions = new PCB_ACTIONS();
751
752 // Register tools
786
787 for( TOOL_BASE* tool : m_toolManager->Tools() )
788 {
789 if( PCB_TOOL_BASE* pcbTool = dynamic_cast<PCB_TOOL_BASE*>( tool ) )
790 pcbTool->SetIsBoardEditor( true );
791 }
792
793 // Run the selection tool, it is supposed to be always active
794 m_toolManager->InvokeTool( "pcbnew.InteractiveSelection" );
795}
796
797
799{
801
803 PCB_EDITOR_CONDITIONS cond( this );
804
805 auto undoCond =
806 [ this ] (const SELECTION& aSel )
807 {
809
810 if( drawingTool && drawingTool->GetDrawingMode() != DRAWING_TOOL::MODE::NONE )
811 return true;
812
814
815 if( routerTool && routerTool->RoutingInProgress() )
816 return true;
817
818 return GetUndoCommandCount() > 0;
819 };
820
821 wxASSERT( mgr );
822
823#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
824#define CHECK( x ) ACTION_CONDITIONS().Check( x )
825// clang-format off
826
828 mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) );
830
835 mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
836 mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );
837 mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
838
839 mgr->SetConditions( ACTIONS::cut, ENABLE( cond.HasItems() ) );
840 mgr->SetConditions( ACTIONS::copy, ENABLE( cond.HasItems() ) );
847
848 static const std::vector<KICAD_T> groupTypes = { PCB_GROUP_T, PCB_GENERATOR_T };
849
854
860
861 if( SCRIPTING::IsWxAvailable() )
863
864 auto enableZoneControlCondition =
865 [this] ( const SELECTION& )
866 {
869 };
870
872 ENABLE( enableZoneControlCondition )
873 .Check( cond.ZoneDisplayMode( ZONE_DISPLAY_MODE::SHOW_FILLED ) ) );
875 ENABLE( enableZoneControlCondition )
876 .Check( cond.ZoneDisplayMode( ZONE_DISPLAY_MODE::SHOW_ZONE_OUTLINE ) ) );
878 ENABLE( enableZoneControlCondition )
879 .Check( cond.ZoneDisplayMode( ZONE_DISPLAY_MODE::SHOW_FRACTURE_BORDERS ) ) );
881 ENABLE( enableZoneControlCondition )
882 .Check( cond.ZoneDisplayMode( ZONE_DISPLAY_MODE::SHOW_TRIANGULATION ) ) );
883
885
886 auto hasElements =
887 [ this ] ( const SELECTION& aSel )
888 {
889 return GetBoard() &&
890 ( !GetBoard()->IsEmpty() || !SELECTION_CONDITIONS::Idle( aSel ) );
891 };
892
893 auto constrainedDrawingModeCond =
894 [this]( const SELECTION& )
895 {
897 };
898
899 auto boardFlippedCond =
900 [this]( const SELECTION& )
901 {
902 return GetCanvas() && GetCanvas()->GetView()->IsMirroredX();
903 };
904
905 auto layerManagerCond =
906 [this] ( const SELECTION& )
907 {
908 return LayerManagerShown();
909 };
910
911 auto propertiesCond =
912 [this] ( const SELECTION& )
913 {
914 return PropertiesShown();
915 };
916
917 auto netInspectorCond =
918 [this] ( const SELECTION& )
919 {
920 return NetInspectorShown();
921 };
922
923 auto searchPaneCond =
924 [this] ( const SELECTION& )
925 {
926 return m_auimgr.GetPane( SearchPaneName() ).IsShown();
927 };
928
929 auto designBlockCond =
930 [ this ] (const SELECTION& aSel )
931 {
932 return m_auimgr.GetPane( DesignBlocksPaneName() ).IsShown();
933 };
934
935 auto highContrastCond =
936 [this] ( const SELECTION& )
937 {
938 return GetDisplayOptions().m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL;
939 };
940
941 auto globalRatsnestCond =
942 [this] (const SELECTION& )
943 {
945 };
946
947 auto curvedRatsnestCond =
948 [this] (const SELECTION& )
949 {
951 };
952
953 auto netHighlightCond =
954 [this]( const SELECTION& )
955 {
957 return !settings->GetHighlightNetCodes().empty();
958 };
959
960 auto enableNetHighlightCond =
961 [this]( const SELECTION& )
962 {
964 return tool && tool->IsNetHighlightSet();
965 };
966
967 mgr->SetConditions( PCB_ACTIONS::toggleHV45Mode, CHECK( constrainedDrawingModeCond ) );
968 mgr->SetConditions( ACTIONS::highContrastMode, CHECK( highContrastCond ) );
969 mgr->SetConditions( PCB_ACTIONS::flipBoard, CHECK( boardFlippedCond ) );
970 mgr->SetConditions( PCB_ACTIONS::showLayersManager, CHECK( layerManagerCond ) );
971 mgr->SetConditions( PCB_ACTIONS::showRatsnest, CHECK( globalRatsnestCond ) );
972 mgr->SetConditions( PCB_ACTIONS::ratsnestLineMode, CHECK( curvedRatsnestCond ) );
973 mgr->SetConditions( PCB_ACTIONS::toggleNetHighlight, CHECK( netHighlightCond )
974 .Enable( enableNetHighlightCond ) );
975 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
976 mgr->SetConditions( PCB_ACTIONS::showNetInspector, CHECK( netInspectorCond ) );
977 mgr->SetConditions( PCB_ACTIONS::showSearch, CHECK( searchPaneCond ) );
978 mgr->SetConditions( PCB_ACTIONS::showDesignBlockPanel, CHECK( designBlockCond ) );
979
982
983 auto isArcKeepCenterMode =
984 [this]( const SELECTION& )
985 {
986 return GetPcbNewSettings()->m_ArcEditMode == ARC_EDIT_MODE::KEEP_CENTER_ADJUST_ANGLE_RADIUS;
987 };
988
989 auto isArcKeepEndpointMode =
990 [this]( const SELECTION& )
991 {
992 return GetPcbNewSettings()->m_ArcEditMode == ARC_EDIT_MODE::KEEP_ENDPOINTS_OR_START_DIRECTION;
993 };
994
995 mgr->SetConditions( PCB_ACTIONS::pointEditorArcKeepCenter, CHECK( isArcKeepCenterMode ) );
996 mgr->SetConditions( PCB_ACTIONS::pointEditorArcKeepEndpoint, CHECK( isArcKeepEndpointMode ) );
997
998 auto isHighlightMode =
999 [this]( const SELECTION& )
1000 {
1002 return tool && tool->GetRouterMode() == PNS::RM_MarkObstacles;
1003 };
1004
1005 auto isShoveMode =
1006 [this]( const SELECTION& )
1007 {
1009 return tool && tool->GetRouterMode() == PNS::RM_Shove;
1010 };
1011
1012 auto isWalkaroundMode =
1013 [this]( const SELECTION& )
1014 {
1016 return tool && tool->GetRouterMode() == PNS::RM_Walkaround;
1017 };
1018
1019 mgr->SetConditions( PCB_ACTIONS::routerHighlightMode, CHECK( isHighlightMode ) );
1020 mgr->SetConditions( PCB_ACTIONS::routerShoveMode, CHECK( isShoveMode ) );
1021 mgr->SetConditions( PCB_ACTIONS::routerWalkaroundMode, CHECK( isWalkaroundMode ) );
1022
1023 auto isAutoTrackWidth =
1024 [this]( const SELECTION& )
1025 {
1027 };
1028
1029 mgr->SetConditions( PCB_ACTIONS::autoTrackWidth, CHECK( isAutoTrackWidth ) );
1030
1031 auto haveNetCond =
1032 [] ( const SELECTION& aSel )
1033 {
1034 for( EDA_ITEM* item : aSel )
1035 {
1036 if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
1037 {
1038 if( bci->GetNetCode() > 0 )
1039 return true;
1040 }
1041 }
1042
1043 return false;
1044 };
1045
1046 mgr->SetConditions( PCB_ACTIONS::showNetInRatsnest, ENABLE( haveNetCond ) );
1047 mgr->SetConditions( PCB_ACTIONS::hideNetInRatsnest, ENABLE( haveNetCond ) );
1050
1051 static const std::vector<KICAD_T> trackTypes = { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T };
1052 static const std::vector<KICAD_T> padOwnerTypes = { PCB_FOOTPRINT_T, PCB_PAD_T };
1053 static const std::vector<KICAD_T> footprintTypes = { PCB_FOOTPRINT_T };
1054 static const std::vector<KICAD_T> crossProbeTypes = { PCB_PAD_T, PCB_FOOTPRINT_T, PCB_GROUP_T };
1055 static const std::vector<KICAD_T> zoneTypes = { PCB_ZONE_T };
1056
1062
1063
1065 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1066
1068 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1069
1070 mgr->SetConditions( PCB_ACTIONS::zoneDuplicate, ENABLE( singleZoneCond ) );
1071 mgr->SetConditions( PCB_ACTIONS::drawZoneCutout, ENABLE( singleZoneCond ) );
1072 mgr->SetConditions( PCB_ACTIONS::drawSimilarZone, ENABLE( singleZoneCond ) );
1073 mgr->SetConditions( PCB_ACTIONS::zoneMerge, ENABLE( zoneMergeCond ) );
1074
1076
1077#define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
1078
1079 // These tools can be used at any time to inspect the board
1084
1085 auto isDRCIdle =
1086 [this] ( const SELECTION& )
1087 {
1089 return !( tool && tool->IsDRCRunning() );
1090 };
1091
1092#define CURRENT_EDIT_TOOL( action ) \
1093 mgr->SetConditions( action, ACTION_CONDITIONS().Check( cond.CurrentTool( action ) ) \
1094 .Enable( isDRCIdle ) )
1095
1096 // These tools edit the board, so they must be disabled during some operations
1127
1133
1134#undef CURRENT_TOOL
1135#undef CURRENT_EDIT_TOOL
1136#undef ENABLE
1137#undef CHECK
1138// clang-format on
1139}
1140
1141
1142void PCB_EDIT_FRAME::OnQuit( wxCommandEvent& event )
1143{
1144 if( event.GetId() == wxID_EXIT )
1145 Kiway().OnKiCadExit();
1146
1147 if( event.GetId() == wxID_CLOSE || Kiface().IsSingle() )
1148 Close( false );
1149}
1150
1151
1152void PCB_EDIT_FRAME::ResolveDRCExclusions( bool aCreateMarkers )
1153{
1154 BOARD_COMMIT commit( this );
1155
1156 for( PCB_MARKER* marker : GetBoard()->ResolveDRCExclusions( aCreateMarkers ) )
1157 {
1158 if( marker->GetMarkerType() == MARKER_BASE::MARKER_DRAWING_SHEET )
1159 marker->GetRCItem()->SetItems( GetCanvas()->GetDrawingSheet() );
1160
1161 commit.Add( marker );
1162 }
1163
1164 commit.Push( wxEmptyString, SKIP_UNDO | SKIP_SET_DIRTY );
1165
1166 for( PCB_MARKER* marker : GetBoard()->Markers() )
1167 {
1168 if( marker->GetSeverity() == RPT_SEVERITY_EXCLUSION )
1169 GetCanvas()->GetView()->Update( marker );
1170 }
1171
1173}
1174
1175
1176bool PCB_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
1177{
1178 // Shutdown blocks must be determined and vetoed as early as possible
1179 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
1180 && IsContentModified() )
1181 {
1182 return false;
1183 }
1184
1186
1187 if( zoneFillerTool->IsBusy() )
1188 {
1189 wxBell();
1190
1191 if( wxWindow* reporter = dynamic_cast<wxWindow*>( zoneFillerTool->GetProgressReporter() ) )
1192 reporter->ShowWithEffect( wxSHOW_EFFECT_EXPAND );
1193
1194 return false;
1195 }
1196
1197 if( Kiface().IsSingle() )
1198 {
1199 auto* fpEditor = (FOOTPRINT_EDIT_FRAME*) Kiway().Player( FRAME_FOOTPRINT_EDITOR, false );
1200
1201 if( fpEditor && !fpEditor->Close() ) // Can close footprint editor?
1202 return false;
1203
1204 auto* fpViewer = (FOOTPRINT_VIEWER_FRAME*) Kiway().Player( FRAME_FOOTPRINT_VIEWER, false );
1205
1206 if( fpViewer && !fpViewer->Close() ) // Can close footprint viewer?
1207 return false;
1208
1209 // FOOTPRINT_CHOOSER_FRAME is always modal so this shouldn't come up, but better safe than
1210 // sorry.
1211 auto* chooser = (FOOTPRINT_CHOOSER_FRAME*) Kiway().Player( FRAME_FOOTPRINT_CHOOSER, false );
1212
1213 if( chooser && !chooser->Close() ) // Can close footprint chooser?
1214 return false;
1215 }
1216 else
1217 {
1218 auto* fpEditor = (FOOTPRINT_EDIT_FRAME*) Kiway().Player( FRAME_FOOTPRINT_EDITOR, false );
1219
1220 if( fpEditor && fpEditor->IsCurrentFPFromBoard() )
1221 {
1222 if( !fpEditor->CanCloseFPFromBoard( true ) )
1223 return false;
1224 }
1225 }
1226
1227 if( IsContentModified() )
1228 {
1229 wxFileName fileName = GetBoard()->GetFileName();
1230 wxString msg = _( "Save changes to '%s' before closing?" );
1231
1232 if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
1233 [&]() -> bool
1234 {
1235 return Files_io_from_id( ID_SAVE_BOARD );
1236 } ) )
1237 {
1238 return false;
1239 }
1240 }
1241
1242 return PCB_BASE_EDIT_FRAME::canCloseWindow( aEvent );
1243}
1244
1245
1247{
1248 // On Windows 7 / 32 bits, on OpenGL mode only, Pcbnew crashes
1249 // when closing this frame if a footprint was selected, and the footprint editor called
1250 // to edit this footprint, and when closing pcbnew if this footprint is still selected
1251 // See https://bugs.launchpad.net/kicad/+bug/1655858
1252 // I think this is certainly a OpenGL event fired after frame deletion, so this workaround
1253 // avoid the crash (JPC)
1254 GetCanvas()->SetEvtHandlerEnabled( false );
1255
1257
1258#ifdef KICAD_IPC_API
1259 Pgm().GetApiServer().DeregisterHandler( m_apiHandler.get() );
1260 wxTheApp->Unbind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED,
1261 &PCB_EDIT_FRAME::onPluginAvailabilityChanged, this );
1262#endif
1263
1264 // Clean up mode-less dialogs.
1265 Unbind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs,
1266 this );
1267
1268 wxWindow* open_dlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
1269
1270 if( open_dlg )
1271 open_dlg->Close( true );
1272
1273 if( m_findDialog )
1274 {
1275 m_findDialog->Destroy();
1276 m_findDialog = nullptr;
1277 }
1278
1280 {
1281 m_inspectDrcErrorDlg->Destroy();
1282 m_inspectDrcErrorDlg = nullptr;
1283 }
1284
1286 {
1287 m_inspectClearanceDlg->Destroy();
1288 m_inspectClearanceDlg = nullptr;
1289 }
1290
1292 {
1293 m_inspectConstraintsDlg->Destroy();
1294 m_inspectConstraintsDlg = nullptr;
1295 }
1296
1297 if( m_footprintDiffDlg )
1298 {
1299 m_footprintDiffDlg->Destroy();
1300 m_footprintDiffDlg = nullptr;
1301 }
1302
1303 // Delete the auto save file if it exists.
1304 wxFileName fn = GetBoard()->GetFileName();
1305
1306 // Auto save file name is the normal file name prefixed with 'FILEEXT::AutoSaveFilePrefix'.
1307 fn.SetName( FILEEXT::AutoSaveFilePrefix + fn.GetName() );
1308
1309 // When the auto save feature does not have write access to the board file path, it falls
1310 // back to a platform specific user temporary file path.
1311 if( !fn.IsOk() || !fn.IsDirWritable() )
1312 fn.SetPath( wxFileName::GetTempDir() );
1313
1314 wxLogTrace( traceAutoSave, wxT( "Deleting auto save file <" ) + fn.GetFullPath() + wxT( ">" ) );
1315
1316 // Remove the auto save file on a normal close of Pcbnew.
1317 if( fn.FileExists() && !wxRemoveFile( fn.GetFullPath() ) )
1318 {
1319 wxLogTrace( traceAutoSave, wxT( "The auto save file could not be removed!" ) );
1320 }
1321
1322 // Make sure local settings are persisted
1323 if( Prj().GetLocalSettings().ShouldAutoSave() )
1324 {
1327 }
1328 else
1329 {
1330 wxLogTrace( traceAutoSave, wxT( "Skipping auto-save of migrated local settings" ) );
1331 }
1332
1333 // Do not show the layer manager during closing to avoid flicker
1334 // on some platforms (Windows) that generate useless redraw of items in
1335 // the Layer Manager
1337 {
1338 m_auimgr.GetPane( wxS( "LayersManager" ) ).Show( false );
1339 m_auimgr.GetPane( wxS( "TabbedPanel" ) ).Show( false );
1340 }
1341
1342 // Unlink the old project if needed
1344
1345 // Delete board structs and undo/redo lists, to avoid crash on exit
1346 // when deleting some structs (mainly in undo/redo lists) too late
1347 Clear_Pcb( false, true );
1348
1349 // do not show the window because ScreenPcb will be deleted and we do not
1350 // want any paint event
1351 Show( false );
1352
1354}
1355
1356
1358{
1361 GetCanvas()->Refresh();
1362}
1363
1364
1365void PCB_EDIT_FRAME::ShowBoardSetupDialog( const wxString& aInitialPage )
1366{
1367 static std::mutex dialogMutex; // Local static mutex
1368
1369 std::unique_lock<std::mutex> dialogLock( dialogMutex, std::try_to_lock );
1370
1371 // One dialog at a time.
1372 if( !dialogLock.owns_lock() )
1373 {
1374 if( m_boardSetupDlg && m_boardSetupDlg->IsShown() )
1375 {
1376 m_boardSetupDlg->Raise(); // Brings the existing dialog to the front
1377 }
1378
1379 return;
1380 }
1381
1382 // Make sure everything's up-to-date
1384
1385 DIALOG_BOARD_SETUP dlg( this );
1386
1387 if( !aInitialPage.IsEmpty() )
1388 dlg.SetInitialPage( aInitialPage, wxEmptyString );
1389
1390 // Assign dlg to the m_boardSetupDlg pointer to track its status.
1391 m_boardSetupDlg = &dlg;
1392
1393 // QuasiModal required for Scintilla auto-complete
1394 if( dlg.ShowQuasiModal() == wxID_OK )
1395 {
1397
1398 if( !GetBoard()->SynchronizeComponentClasses( std::unordered_set<wxString>() ) )
1399 {
1402 m_infoBar->ShowMessage( _( "Could not load component class assignment rules" ),
1403 wxICON_WARNING, WX_INFOBAR::MESSAGE_TYPE::GENERIC );
1404 }
1405
1406 // We don't know if anything was modified, so err on the side of requiring a save
1407 OnModify();
1408
1410
1413
1414 PCBNEW_SETTINGS* settings = GetPcbNewSettings();
1415 static LSET maskAndPasteLayers = LSET( { F_Mask, F_Paste, B_Mask, B_Paste } );
1416
1418 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1419 {
1420 int flags = 0;
1421
1422 if( !aItem->IsBOARD_ITEM() )
1423 return flags;
1424
1425 BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
1426
1427 if( item->Type() == PCB_VIA_T || item->Type() == PCB_PAD_T )
1428 {
1429 // Note: KIGFX::REPAINT isn't enough for things that go from invisible
1430 // to visible as they won't be found in the view layer's itemset for
1431 // re-painting.
1432 if( ( GetBoard()->GetVisibleLayers() & maskAndPasteLayers ).any() )
1433 flags |= KIGFX::ALL;
1434 }
1435
1436 if( item->Type() == PCB_TRACE_T || item->Type() == PCB_ARC_T || item->Type() == PCB_VIA_T )
1437 {
1438 if( settings->m_Display.m_TrackClearance == SHOW_WITH_VIA_ALWAYS )
1439 flags |= KIGFX::REPAINT;
1440 }
1441
1442 if( item->Type() == PCB_PAD_T )
1443 {
1444 if( settings->m_Display.m_PadClearance )
1445 flags |= KIGFX::REPAINT;
1446 }
1447
1448 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
1449 {
1450 if( text->HasTextVars() )
1451 {
1452 text->ClearRenderCache();
1453 text->ClearBoundingBoxCache();
1454 flags |= KIGFX::GEOMETRY | KIGFX::REPAINT;
1455 }
1456 }
1457
1458 return flags;
1459 } );
1460
1461 GetCanvas()->Refresh();
1462
1466
1467 //this event causes the routing tool to reload its design rules information
1469 toolEvent.SetHasPosition( false );
1470 m_toolManager->ProcessEvent( toolEvent );
1471 }
1472
1473 GetCanvas()->SetFocus();
1474
1475 // Reset m_boardSetupDlg after the dialog is closed
1476 m_boardSetupDlg = nullptr;
1477}
1478
1479
1481{
1483}
1484
1485
1487{
1489
1490 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
1491 wxASSERT( cfg );
1492
1493 if( cfg )
1494 {
1498 }
1499}
1500
1501
1503{
1505
1506 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
1507 wxASSERT( cfg );
1508
1509 if( cfg )
1510 {
1511 wxAuiPaneInfo& apperancePane = m_auimgr.GetPane( AppearancePanelName() );
1512 cfg->m_AuiPanels.show_layer_manager = apperancePane.IsShown();
1513
1514 if( m_propertiesPanel )
1515 {
1516 cfg->m_AuiPanels.show_properties = m_propertiesPanel->IsShownOnScreen();
1519 }
1520
1521 // ensure m_show_search is up to date (the pane can be closed)
1522 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
1523 m_show_search = searchPaneInfo.IsShown();
1525 cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
1526 cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
1527 cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
1528
1530 {
1531 wxAuiPaneInfo& netInspectorhPaneInfo = m_auimgr.GetPane( NetInspectorPanelName() );
1532 m_show_net_inspector = netInspectorhPaneInfo.IsShown();
1534 }
1535
1536 if( m_appearancePanel )
1537 {
1542 }
1543
1544 wxAuiPaneInfo& designBlocksPane = m_auimgr.GetPane( DesignBlocksPaneName() );
1545 cfg->m_AuiPanels.design_blocks_show = designBlocksPane.IsShown();
1546
1547 if( designBlocksPane.IsDocked() )
1549 else
1550 {
1551 cfg->m_AuiPanels.design_blocks_panel_float_height = designBlocksPane.floating_size.y;
1552 cfg->m_AuiPanels.design_blocks_panel_float_width = designBlocksPane.floating_size.x;
1553 }
1554
1556 }
1557}
1558
1559
1561{
1562 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( config() );
1563
1564 return cfg ? cfg->m_RotationAngle : ANGLE_90;
1565}
1566
1567
1569{
1571}
1572
1573
1575{
1576
1577 GetColorSettings()->SetColor( LAYER_GRID, aColor );
1578 GetCanvas()->GetGAL()->SetGridColor( aColor );
1579}
1580
1581
1582void PCB_EDIT_FRAME::SetActiveLayer( PCB_LAYER_ID aLayer, bool aForceRedraw )
1583{
1584 const PCB_LAYER_ID oldLayer = GetActiveLayer();
1585
1586 if( oldLayer == aLayer && !aForceRedraw )
1587 return;
1588
1590
1592
1593 m_toolManager->PostAction( PCB_ACTIONS::layerChanged ); // notify other tools
1594 GetCanvas()->SetFocus(); // allow capture of hotkeys
1595 GetCanvas()->SetHighContrastLayer( aLayer );
1596
1597 /*
1598 * Only show pad, via and track clearances when a copper layer is active
1599 * and then only show the clearance layer for that copper layer. For
1600 * front/back non-copper layers, show the clearance layer for the outer
1601 * layer on that side.
1602 *
1603 * For pads/vias, this is to avoid clutter when there are pad/via layers
1604 * that vary in flash (i.e. clearance from the hole or pad edge), padstack
1605 * shape on each layer or clearances on each layer.
1606 *
1607 * For tracks, this follows the same logic as pads/vias, but in theory could
1608 * have their own set of independent clearance layers to allow track clearance
1609 * to be shown for more layers.
1610 */
1611 const auto getClearanceLayerForActive = []( PCB_LAYER_ID aActiveLayer ) -> std::optional<int>
1612 {
1613 if( IsCopperLayer( aActiveLayer ) )
1614 return CLEARANCE_LAYER_FOR( aActiveLayer );
1615
1616 return std::nullopt;
1617 };
1618
1619 if( std::optional<int> oldClearanceLayer = getClearanceLayerForActive( oldLayer ) )
1620 GetCanvas()->GetView()->SetLayerVisible( *oldClearanceLayer, false );
1621
1622 if( std::optional<int> newClearanceLayer = getClearanceLayerForActive( aLayer ) )
1623 GetCanvas()->GetView()->SetLayerVisible( *newClearanceLayer, true );
1624
1626 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1627 {
1628 if( !aItem->IsBOARD_ITEM() )
1629 return 0;
1630
1631 BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
1632
1633 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible
1634 // as they won't be found in the view layer's itemset for re-painting.
1635 if( GetDisplayOptions().m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN )
1636 {
1637 if( item->IsOnLayer( oldLayer ) || item->IsOnLayer( aLayer ) )
1638 return KIGFX::ALL;
1639 }
1640
1641 if( item->Type() == PCB_VIA_T )
1642 {
1643 PCB_VIA* via = static_cast<PCB_VIA*>( item );
1644
1645 // Vias on a restricted layer set must be redrawn when the active layer
1646 // is changed
1647 if( via->GetViaType() == VIATYPE::BLIND_BURIED
1648 || via->GetViaType() == VIATYPE::MICROVIA )
1649 {
1650 return KIGFX::REPAINT;
1651 }
1652
1653 if( via->GetRemoveUnconnected() )
1654 return KIGFX::ALL;
1655 }
1656 else if( item->Type() == PCB_PAD_T )
1657 {
1658 PAD* pad = static_cast<PAD*>( item );
1659
1660 if( pad->GetRemoveUnconnected() )
1661 return KIGFX::ALL;
1662 }
1663
1664 return 0;
1665 } );
1666
1667 GetCanvas()->Refresh();
1668}
1669
1670
1672{
1674
1675 layerEnum.Choices().Clear();
1676 layerEnum.Undefined( UNDEFINED_LAYER );
1677
1678 for( PCB_LAYER_ID layer : LSET::AllLayersMask().Seq() )
1679 {
1680 // Canonical name
1681 layerEnum.Map( layer, LSET::Name( layer ) );
1682
1683 // User name
1684 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
1685 }
1686
1687 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
1688
1689 try
1690 {
1691 drcTool->GetDRCEngine()->InitEngine( GetDesignRulesPath() );
1692 }
1693 catch( PARSE_ERROR& )
1694 {
1695 // Not sure this is the best place to tell the user their rules are buggy, so
1696 // we'll stay quiet for now. Feel free to revisit this decision....
1697 }
1698
1699 UpdateTitle();
1700
1701 wxFileName fn = GetBoard()->GetFileName();
1702
1703 // Display a warning that the file is read only
1704 if( fn.FileExists() && !fn.IsFileWritable() )
1705 {
1708 m_infoBar->ShowMessage( _( "Board file is read only." ),
1710 }
1711
1713
1714 // Sync layer and item visibility
1716
1717 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
1718
1720
1721 // Apply saved display state to the appearance panel after it has been set up
1722 PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings();
1723
1725
1726 if( GetBoard()->GetDesignSettings().IsLayerEnabled( localSettings.m_ActiveLayer ) )
1727 SetActiveLayer( localSettings.m_ActiveLayer, true );
1728 else
1729 SetActiveLayer( GetActiveLayer(), true ); // Make sure to repaint even if not switching
1730
1731 PROJECT_FILE& projectFile = Prj().GetProjectFile();
1732
1733 m_layerPairSettings->SetLayerPairs( projectFile.m_LayerPairInfos );
1734 m_layerPairSettings->SetCurrentLayerPair( LAYER_PAIR{ F_Cu, B_Cu } );
1735
1736 // Updates any auto dimensions and the auxiliary toolbar tracks/via sizes
1738
1739 // Sync the net inspector now we have connectivity calculated
1742
1743 // Display the loaded board:
1744 Zoom_Automatique( false );
1745
1746 // Invalidate painting as loading the DRC engine will cause clearances to become valid
1748
1749 Refresh();
1750
1751 SetMsgPanel( GetBoard() );
1752 SetStatusText( wxEmptyString );
1753
1754 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "PCB file changes are unsaved" ) );
1755}
1756
1757
1759{
1761}
1762
1763
1765{
1766 return GetBoard()->IsElementVisible( aElement );
1767}
1768
1769
1771{
1772 // Force the RATSNEST visible
1773 if( aElement == LAYER_RATSNEST )
1774 GetCanvas()->GetView()->SetLayerVisible( aElement, true );
1775 else
1776 GetCanvas()->GetView()->SetLayerVisible( aElement , aNewState );
1777
1778 GetBoard()->SetElementVisibility( aElement, aNewState );
1779}
1780
1781
1783{
1784 // call my base class
1786
1787 m_auimgr.GetPane( m_appearancePanel ).Caption( _( "Appearance" ) );
1788 m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
1789 m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
1790 m_auimgr.GetPane( m_netInspectorPanel ).Caption( _( "Net Inspector" ) );
1791 m_auimgr.Update();
1792
1793 UpdateTitle();
1794}
1795
1796
1798{
1800
1801 if( project.m_PcbLastPath[ aType ].IsEmpty() )
1802 return wxEmptyString;
1803
1804 wxFileName absoluteFileName = project.m_PcbLastPath[ aType ];
1805 wxFileName pcbFileName = GetBoard()->GetFileName();
1806
1807 absoluteFileName.MakeAbsolute( pcbFileName.GetPath() );
1808 return absoluteFileName.GetFullPath();
1809}
1810
1811
1812void PCB_EDIT_FRAME::SetLastPath( LAST_PATH_TYPE aType, const wxString& aLastPath )
1813{
1815
1816 wxFileName relativeFileName = aLastPath;
1817 wxFileName pcbFileName = GetBoard()->GetFileName();
1818
1819 relativeFileName.MakeRelativeTo( pcbFileName.GetPath() );
1820
1821 if( relativeFileName.GetFullPath() != project.m_PcbLastPath[ aType ] )
1822 {
1823 project.m_PcbLastPath[ aType ] = relativeFileName.GetFullPath();
1824 OnModify();
1825 }
1826}
1827
1828
1830{
1832 m_ZoneFillsDirty = true;
1833
1834 if( m_isClosing )
1835 return;
1836
1837 Update3DView( true, GetPcbNewSettings()->m_Display.m_Live3DRefresh );
1838
1839 if( !GetTitle().StartsWith( wxT( "*" ) ) )
1840 UpdateTitle();
1841
1842}
1843
1844
1846{
1847 Update3DView( true, true );
1848
1849 std::shared_ptr<CONNECTIVITY_DATA> connectivity = GetBoard()->GetConnectivity();
1850 connectivity->RecalculateRatsnest( nullptr );
1852
1853 std::vector<MSG_PANEL_ITEM> msg_list;
1854 GetBoard()->GetMsgPanelInfo( this, msg_list );
1855 SetMsgPanel( msg_list );
1856}
1857
1858
1860{
1861 wxFileName fn = GetBoard()->GetFileName();
1862 bool readOnly = false;
1863 bool unsaved = false;
1864
1865 if( fn.IsOk() && fn.FileExists() )
1866 readOnly = !fn.IsFileWritable();
1867 else
1868 unsaved = true;
1869
1870 wxString title;
1871
1872 if( IsContentModified() )
1873 title = wxT( "*" );
1874
1875 title += fn.GetName();
1876
1877 if( readOnly )
1878 title += wxS( " " ) + _( "[Read Only]" );
1879
1880 if( unsaved )
1881 title += wxS( " " ) + _( "[Unsaved]" );
1882
1883 title += wxT( " \u2014 " ) + _( "PCB Editor" );
1884
1885 SetTitle( title );
1886}
1887
1888
1890{
1891 // Update the layer manager and other widgets from the board setup
1892 // (layer and items visibility, colors ...)
1893
1894 // Rebuild list of nets (full ratsnest rebuild)
1896
1897 // Update info shown by the horizontal toolbars
1899
1900 LSET activeLayers = GetBoard()->GetEnabledLayers();
1901
1902 if( !activeLayers.test( GetActiveLayer() ) )
1903 SetActiveLayer( activeLayers.Seq().front() );
1904
1906
1908
1909 layerEnum.Choices().Clear();
1910 layerEnum.Undefined( UNDEFINED_LAYER );
1911
1912 for( PCB_LAYER_ID layer : LSET::AllLayersMask().Seq() )
1913 {
1914 // Canonical name
1915 layerEnum.Map( layer, LSET::Name( layer ) );
1916
1917 // User name
1918 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
1919 }
1920
1921 // Sync visibility with canvas
1922 for( PCB_LAYER_ID layer : LSET::AllLayersMask().Seq() )
1923 GetCanvas()->GetView()->SetLayerVisible( layer, GetBoard()->IsLayerVisible( layer ) );
1924
1925 // Stackup and/or color theme may have changed
1928}
1929
1930
1932{
1933 // switches currently used canvas (Cairo / OpenGL).
1934 PCB_BASE_FRAME::SwitchCanvas( aCanvasType );
1935}
1936
1937
1939{
1940 if( !m_findDialog )
1941 {
1942 m_findDialog = new DIALOG_FIND( this );
1945 }
1946
1947 wxString findString;
1948
1949 PCB_SELECTION& selection = m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
1950
1951 if( selection.Size() == 1 )
1952 {
1953 EDA_ITEM* front = selection.Front();
1954
1955 switch( front->Type() )
1956 {
1957 case PCB_FOOTPRINT_T:
1958 findString = UnescapeString( static_cast<FOOTPRINT*>( front )->GetValue() );
1959 break;
1960
1961 case PCB_FIELD_T:
1962 case PCB_TEXT_T:
1963 findString = UnescapeString( static_cast<PCB_TEXT*>( front )->GetText() );
1964
1965 if( findString.Contains( wxT( "\n" ) ) )
1966 findString = findString.Before( '\n' );
1967
1968 break;
1969
1970 default:
1971 break;
1972 }
1973 }
1974
1975 m_findDialog->Preload( findString );
1976
1977 m_findDialog->Show( true );
1978}
1979
1980
1981void PCB_EDIT_FRAME::FindNext( bool reverse )
1982{
1983 if( !m_findDialog )
1985
1986 m_findDialog->FindNext( reverse );
1987}
1988
1989
1991{
1992 PCB_PLOT_PARAMS plotSettings = GetPlotSettings();
1993
1994 switch( aID )
1995 {
1996 case ID_GEN_PLOT_GERBER:
1997 plotSettings.SetFormat( PLOT_FORMAT::GERBER );
1998 break;
1999 case ID_GEN_PLOT_DXF:
2000 plotSettings.SetFormat( PLOT_FORMAT::DXF );
2001 break;
2002 case ID_GEN_PLOT_HPGL:
2003 plotSettings.SetFormat( PLOT_FORMAT::HPGL );
2004 break;
2005 case ID_GEN_PLOT_PDF:
2006 plotSettings.SetFormat( PLOT_FORMAT::PDF );
2007 break;
2008 case ID_GEN_PLOT_PS:
2009 plotSettings.SetFormat( PLOT_FORMAT::POST );
2010 break;
2011 case ID_GEN_PLOT_SVG:
2012 plotSettings.SetFormat( PLOT_FORMAT::SVG );
2013 break;
2014 case ID_GEN_PLOT:
2015 /* keep the previous setup */
2016 break;
2017 default:
2018 wxFAIL_MSG( wxT( "ToPlotter(): unexpected plot type" ) ); break;
2019 break;
2020 }
2021
2022 SetPlotSettings( plotSettings );
2023
2024 DIALOG_PLOT dlg( this );
2025 dlg.ShowQuasiModal( );
2026}
2027
2028
2030{
2031 if( Kiface().IsSingle() )
2032 return 0;
2033
2034 // Update PCB requires a netlist. Therefore the schematic editor must be running
2035 // If this is not the case, open the schematic editor
2036 KIWAY_PLAYER* frame = Kiway().Player( FRAME_SCH, true );
2037
2038 // If Kiway() cannot create the eeschema frame, it shows a error message, and
2039 // frame is null
2040 if( !frame )
2041 return -1;
2042
2043 if( !frame->IsShownOnScreen() )
2044 {
2045 wxEventBlocker blocker( this );
2046 wxFileName fn( Prj().GetProjectPath(), Prj().GetProjectName(),
2048
2049 // Maybe the file hasn't been converted to the new s-expression file format so
2050 // see if the legacy schematic file is still in play.
2051 if( !fn.FileExists() )
2052 {
2054
2055 if( !fn.FileExists() )
2056 {
2057 DisplayErrorMessage( this, _( "The schematic for this board cannot be found." ) );
2058 return -2;
2059 }
2060 }
2061
2062 frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
2063
2064 // we show the schematic editor frame, because do not show is seen as
2065 // a not yet opened schematic by Kicad manager, which is not the case
2066 frame->Show( true );
2067
2068 // bring ourselves back to the front
2069 Raise();
2070 }
2071
2072 return 1; //Success!
2073}
2074
2075
2077 const wxString& aAnnotateMessage )
2078{
2079 int standalone = TestStandalone();
2080
2081 if( standalone == 0 )
2082 {
2083 DisplayErrorMessage( this, _( "Cannot update the PCB because PCB editor is opened in "
2084 "stand-alone mode. In order to create or update PCBs from "
2085 "schematics, you must launch the KiCad project manager and "
2086 "create a project." ) );
2087 return false; // Not in standalone mode
2088 }
2089
2090 if( standalone < 0 ) // Problem with Eeschema or the schematic
2091 return false;
2092
2093 Raise(); // Show
2094
2095 std::string payload( aAnnotateMessage );
2096
2097 Kiway().ExpressMail( FRAME_SCH, MAIL_SCH_GET_NETLIST, payload, this );
2098
2099 if( payload == aAnnotateMessage )
2100 {
2101 Raise();
2102 DisplayErrorMessage( this, aAnnotateMessage );
2103 return false;
2104 }
2105
2106 try
2107 {
2108 auto lineReader = new STRING_LINE_READER( payload, _( "Eeschema netlist" ) );
2109 KICAD_NETLIST_READER netlistReader( lineReader, &aNetlist );
2110 netlistReader.LoadNetlist();
2111 }
2112 catch( const IO_ERROR& e )
2113 {
2114 Raise();
2115
2116 // Do not translate extra_info strings. These are for developers
2117 wxString extra_info = e.Problem() + wxT( " : " ) + e.What() + wxT( " at " ) + e.Where();
2118
2119 DisplayErrorMessage( this, _( "Received an error while reading netlist. Please "
2120 "report this issue to the KiCad team using the menu "
2121 "Help->Report Bug."), extra_info );
2122 return false;
2123 }
2124
2125 return true;
2126}
2127
2128
2130{
2131 wxString msg;
2132 wxFileName schematic( Prj().GetProjectPath(), Prj().GetProjectName(),
2134
2135 if( !schematic.FileExists() )
2136 {
2137 wxFileName legacySchematic( Prj().GetProjectPath(), Prj().GetProjectName(),
2139
2140 if( legacySchematic.FileExists() )
2141 {
2142 schematic = legacySchematic;
2143 }
2144 else
2145 {
2146 msg.Printf( _( "Schematic file '%s' not found." ), schematic.GetFullPath() );
2147 DisplayErrorMessage( this, msg );
2148 return;
2149 }
2150 }
2151
2152 if( Kiface().IsSingle() )
2153 {
2154 ExecuteFile( EESCHEMA_EXE, schematic.GetFullPath() );
2155 }
2156 else
2157 {
2158 KIWAY_PLAYER* frame = Kiway().Player( FRAME_SCH, false );
2159
2160 // Please: note: DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::initBuffers() calls
2161 // Kiway.Player( FRAME_SCH, true )
2162 // therefore, the schematic editor is sometimes running, but the schematic project
2163 // is not loaded, if the library editor was called, and the dialog field editor was used.
2164 // On Linux, it happens the first time the schematic editor is launched, if
2165 // library editor was running, and the dialog field editor was open
2166 // On Windows, it happens always after the library editor was called,
2167 // and the dialog field editor was used
2168 if( !frame )
2169 {
2170 try
2171 {
2172 frame = Kiway().Player( FRAME_SCH, true );
2173 }
2174 catch( const IO_ERROR& err )
2175 {
2176
2177 DisplayErrorMessage( this, _( "Eeschema failed to load." ) + wxS( "\n" ) + err.What() );
2178 return;
2179 }
2180 }
2181
2182 wxEventBlocker blocker( this );
2183
2184 // If Kiway() cannot create the eeschema frame, it shows a error message, and
2185 // frame is null
2186 if( !frame )
2187 return;
2188
2189 if( !frame->IsShownOnScreen() ) // the frame exists, (created by the dialog field editor)
2190 // but no project loaded.
2191 {
2192 frame->OpenProjectFiles( std::vector<wxString>( 1, schematic.GetFullPath() ) );
2193 frame->Show( true );
2194 }
2195
2196 // On Windows, Raise() does not bring the window on screen, when iconized or not shown
2197 // On Linux, Raise() brings the window on screen, but this code works fine
2198 if( frame->IsIconized() )
2199 {
2200 frame->Iconize( false );
2201
2202 // If an iconized frame was created by Pcbnew, Iconize( false ) is not enough
2203 // to show the frame at its normal size: Maximize should be called.
2204 frame->Maximize( false );
2205 }
2206
2207 frame->Raise();
2208 }
2209}
2210
2211
2213{
2214 const ENV_VAR_MAP& vars = Pgm().GetLocalEnvVariables();
2215
2216 // Set the environment variables for python scripts
2217 // note: the string will be encoded UTF8 for python env
2218 for( const std::pair<const wxString, ENV_VAR_ITEM>& var : vars )
2219 UpdatePythonEnvVar( var.first, var.second.GetValue() );
2220
2221 // Because the env vars can be modified by the python scripts (rewritten in UTF8),
2222 // regenerate them (in Unicode) for our normal environment
2223 for( const std::pair<const wxString, ENV_VAR_ITEM>& var : vars )
2224 wxSetEnv( var.first, var.second.GetValue() );
2225}
2226
2227
2229{
2230 wxString evValue;
2231 wxGetEnv( PROJECT_VAR_NAME, &evValue );
2232 UpdatePythonEnvVar( wxString( PROJECT_VAR_NAME ).ToStdString(), evValue );
2233
2234 // Because PROJECT_VAR_NAME can be modified by the python scripts (rewritten in UTF8),
2235 // regenerate it (in Unicode) for our normal environment
2236 wxSetEnv( PROJECT_VAR_NAME, evValue );
2237}
2238
2239
2241{
2242 if( aFootprint == nullptr )
2243 return;
2244
2246
2247 /*
2248 * Make sure dlg is destroyed before GetCanvas->Refresh is called
2249 * later or the refresh will try to modify its properties since
2250 * they share a GL context.
2251 */
2252 {
2253 DIALOG_FOOTPRINT_PROPERTIES dlg( this, aFootprint );
2254
2255 dlg.ShowQuasiModal();
2256 retvalue = dlg.GetReturnValue();
2257 }
2258
2259 /*
2260 * retvalue =
2261 * FP_PROPS_UPDATE_FP to show Update Footprints dialog
2262 * FP_PROPS_CHANGE_FP to show Change Footprints dialog
2263 * FP_PROPS_OK for normal edit
2264 * FP_PROPS_CANCEL if aborted
2265 * FP_PROPS_EDIT_BOARD_FP to load board footprint into Footprint Editor
2266 * FP_PROPS_EDIT_LIBRARY_FP to load library footprint into Footprint Editor
2267 */
2268
2270 {
2271 // If something edited, push a refresh request
2272 GetCanvas()->Refresh();
2273 }
2275 {
2276 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2277 {
2278 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2279
2280 fp_editor->LoadFootprintFromBoard( aFootprint );
2281 fp_editor->Show( true );
2282 fp_editor->Raise(); // Iconize( false );
2283 }
2284 }
2286 {
2287 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2288 {
2289 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2290
2291 fp_editor->LoadFootprintFromLibrary( aFootprint->GetFPID() );
2292 fp_editor->Show( true );
2293 fp_editor->Raise(); // Iconize( false );
2294 }
2295 }
2297 {
2298 ShowExchangeFootprintsDialog( aFootprint, true, true );
2299 }
2301 {
2302 ShowExchangeFootprintsDialog( aFootprint, false, true );
2303 }
2304}
2305
2306
2308 bool aSelectedMode )
2309{
2310 DIALOG_EXCHANGE_FOOTPRINTS dialog( this, aFootprint, aUpdateMode, aSelectedMode );
2311
2312 return dialog.ShowQuasiModal();
2313}
2314
2315
2327static void processTextItem( const PCB_TEXT& aSrc, PCB_TEXT& aDest,
2328 bool aResetText, bool aResetTextLayers, bool aResetTextEffects,
2329 bool* aUpdated )
2330{
2331 if( aResetText )
2332 *aUpdated |= aSrc.GetText() != aDest.GetText();
2333 else
2334 aDest.SetText( aSrc.GetText() );
2335
2336 if( aResetTextLayers )
2337 {
2338 *aUpdated |= aSrc.GetLayer() != aDest.GetLayer();
2339 *aUpdated |= aSrc.IsVisible() != aDest.IsVisible();
2340 }
2341 else
2342 {
2343 aDest.SetLayer( aSrc.GetLayer() );
2344 aDest.SetVisible( aSrc.IsVisible() );
2345 }
2346
2347 if( aResetTextEffects )
2348 {
2349 *aUpdated |= aSrc.GetHorizJustify() != aDest.GetHorizJustify();
2350 *aUpdated |= aSrc.GetVertJustify() != aDest.GetVertJustify();
2351 *aUpdated |= aSrc.GetTextSize() != aDest.GetTextSize();
2352 *aUpdated |= aSrc.GetTextThickness() != aDest.GetTextThickness();
2353 *aUpdated |= aSrc.GetTextAngle() != aDest.GetTextAngle();
2354 *aUpdated |= aSrc.GetFPRelativePosition() != aDest.GetFPRelativePosition();
2355 }
2356 else
2357 {
2358 // Careful: SetAttributes() will clobber the position
2359 aDest.SetAttributes( aSrc );
2361 }
2362
2363 aDest.SetLocked( aSrc.IsLocked() );
2364 const_cast<KIID&>( aDest.m_Uuid ) = aSrc.m_Uuid;
2365}
2366
2367
2368static PCB_TEXT* getMatchingTextItem( PCB_TEXT* aRefItem, FOOTPRINT* aFootprint )
2369{
2370 std::vector<PCB_TEXT*> candidates;
2371
2372 for( BOARD_ITEM* item : aFootprint->GraphicalItems() )
2373 {
2374 PCB_TEXT* candidate = dynamic_cast<PCB_TEXT*>( item );
2375
2376 if( candidate && candidate->GetText() == aRefItem->GetText() )
2377 candidates.push_back( candidate );
2378 }
2379
2380 if( candidates.size() == 0 )
2381 return nullptr;
2382
2383 if( candidates.size() == 1 )
2384 return candidates[0];
2385
2386 // Try refining the match by layer
2387 std::vector<PCB_TEXT*> candidatesOnSameLayer;
2388
2389 for( PCB_TEXT* candidate : candidates )
2390 {
2391 if( candidate->GetLayer() == aRefItem->GetLayer() )
2392 candidatesOnSameLayer.push_back( candidate );
2393 }
2394
2395 if( candidatesOnSameLayer.size() == 1 )
2396 return candidatesOnSameLayer[0];
2397
2398 // Last ditch effort: refine by position
2399 std::vector<PCB_TEXT*> candidatesAtSamePos;
2400
2401 for( PCB_TEXT* candidate : candidatesOnSameLayer.size() ? candidatesOnSameLayer : candidates )
2402 {
2403 if( candidate->GetFPRelativePosition() == aRefItem->GetFPRelativePosition() )
2404 candidatesAtSamePos.push_back( candidate );
2405 }
2406
2407 if( candidatesAtSamePos.size() > 0 )
2408 return candidatesAtSamePos[0];
2409 else if( candidatesOnSameLayer.size() > 0 )
2410 return candidatesOnSameLayer[0];
2411 else
2412 return candidates[0];
2413}
2414
2415
2417 BOARD_COMMIT& aCommit, bool deleteExtraTexts,
2418 bool resetTextLayers, bool resetTextEffects,
2419 bool resetTextContent, bool resetFabricationAttrs,
2420 bool reset3DModels, bool* aUpdated )
2421{
2422 PCB_GROUP* parentGroup = aExisting->GetParentGroup();
2423 bool dummyBool = false;
2424
2425 if( !aUpdated )
2426 aUpdated = &dummyBool;
2427
2428 if( parentGroup )
2429 {
2430 parentGroup->RemoveItem( aExisting );
2431 parentGroup->AddItem( aNew );
2432 }
2433
2434 aNew->SetParent( GetBoard() );
2435
2436 PlaceFootprint( aNew, false );
2437
2438 // PlaceFootprint will move the footprint to the cursor position, which we don't want. Copy
2439 // the original position across.
2440 aNew->SetPosition( aExisting->GetPosition() );
2441
2442 if( aNew->GetLayer() != aExisting->GetLayer() )
2443 aNew->Flip( aNew->GetPosition(), GetPcbNewSettings()->m_FlipDirection );
2444
2445 if( aNew->GetOrientation() != aExisting->GetOrientation() )
2446 aNew->SetOrientation( aExisting->GetOrientation() );
2447
2448 aNew->SetLocked( aExisting->IsLocked() );
2449
2450 // Now transfer the net info from "old" pads to the new footprint
2451 for( PAD* newPad : aNew->Pads() )
2452 {
2453 PAD* oldPad = nullptr;
2454
2455 // Pads with no numbers can't be matched. (Then again, they're never connected to a
2456 // net either, so it's just the UUID retention that we can't perform.)
2457 if( newPad->GetNumber().IsEmpty() )
2458 {
2460 continue;
2461 }
2462
2463 // Search for a similar pad to reuse UUID and net info
2464 PAD* last_pad = nullptr;
2465
2466 while( true )
2467 {
2468 oldPad = aExisting->FindPadByNumber( newPad->GetNumber(), last_pad );
2469
2470 if( !oldPad )
2471 break;
2472
2473 if( newPad->IsOnCopperLayer() == oldPad->IsOnCopperLayer() ) // a candidate is found
2474 break;
2475
2476 last_pad = oldPad;
2477 }
2478
2479 if( oldPad )
2480 {
2481 const_cast<KIID&>( newPad->m_Uuid ) = oldPad->m_Uuid;
2482 newPad->SetLocalRatsnestVisible( oldPad->GetLocalRatsnestVisible() );
2483 newPad->SetPinFunction( oldPad->GetPinFunction() );
2484 newPad->SetPinType( oldPad->GetPinType() );
2485 }
2486
2487 if( newPad->IsOnCopperLayer() )
2488 newPad->SetNetCode( oldPad ? oldPad->GetNetCode() : NETINFO_LIST::UNCONNECTED );
2489 else
2490 newPad->SetNetCode( NETINFO_LIST::UNCONNECTED );
2491 }
2492
2493 for( BOARD_ITEM* oldItem : aExisting->GraphicalItems() )
2494 {
2495 PCB_TEXT* oldTextItem = dynamic_cast<PCB_TEXT*>( oldItem );
2496
2497 if( oldTextItem )
2498 {
2499 // Dimensions have PCB_TEXT base but are not treated like texts in the updater
2500 if( dynamic_cast<PCB_DIMENSION_BASE*>( oldTextItem ) )
2501 continue;
2502
2503 PCB_TEXT* newTextItem = getMatchingTextItem( oldTextItem, aNew );
2504
2505 if( newTextItem )
2506 {
2507 processTextItem( *oldTextItem, *newTextItem, resetTextContent, resetTextLayers,
2508 resetTextEffects, aUpdated );
2509 }
2510 else if( deleteExtraTexts )
2511 {
2512 *aUpdated = true;
2513 }
2514 else
2515 {
2516 aNew->Add( static_cast<BOARD_ITEM*>( oldTextItem->Clone() ) );
2517 }
2518 }
2519 }
2520
2521 // Copy reference. The initial text is always used, never resetted
2522 processTextItem( aExisting->Reference(), aNew->Reference(), false, resetTextLayers,
2523 resetTextEffects, aUpdated );
2524
2525 // Copy value
2526 processTextItem( aExisting->Value(), aNew->Value(),
2527 // reset value text only when it is a proxy for the footprint ID
2528 // (cf replacing value "MountingHole-2.5mm" with "MountingHole-4.0mm")
2529 aExisting->GetValue() == aExisting->GetFPID().GetLibItemName().wx_str(),
2530 resetTextLayers, resetTextEffects, aUpdated );
2531
2532 // Copy fields in accordance with the reset* flags
2533 for( PCB_FIELD* oldField : aExisting->GetFields() )
2534 {
2535 // Reference and value are already handled
2536 if( oldField->IsReference() || oldField->IsValue() )
2537 continue;
2538
2539 PCB_FIELD* newField = aNew->GetField( oldField->GetName() );
2540
2541 if( newField )
2542 {
2543 processTextItem( *oldField, *newField, resetTextContent, resetTextLayers,
2544 resetTextEffects, aUpdated );
2545 }
2546 else if( deleteExtraTexts )
2547 {
2548 *aUpdated = true;
2549 }
2550 else
2551 {
2552 newField = new PCB_FIELD( *oldField );
2553 aNew->Add( newField );
2554 processTextItem( *oldField, *newField, true, true, true, aUpdated );
2555 }
2556 }
2557
2558 // Careful; allow-soldermask-bridges is in the m_attributes field but is not presented
2559 // as a fabrication attribute in the GUI....
2560 int existingFabAttrs = aExisting->GetAttributes() & ~FP_ALLOW_SOLDERMASK_BRIDGES;
2561 int libraryFabAttrs = aNew->GetAttributes() & ~FP_ALLOW_SOLDERMASK_BRIDGES;
2562
2563 if( resetFabricationAttrs )
2564 {
2565 // We've replaced the existing footprint with the library one, so the fabrication attrs
2566 // are already reset. Just set the aUpdated flag if appropriate.
2567 if( libraryFabAttrs != existingFabAttrs )
2568 *aUpdated = true;
2569 }
2570 else
2571 {
2572 int solderMaskBridgesFlag = aNew->GetAttributes() & FP_ALLOW_SOLDERMASK_BRIDGES;
2573 aNew->SetAttributes( existingFabAttrs | solderMaskBridgesFlag );
2574 }
2575
2576 if( reset3DModels )
2577 {
2578 // We've replaced the existing footprint with the library one, so the 3D models are
2579 // already reset. Just set the aUpdated flag if appropriate.
2580 if( aNew->Models().size() != aExisting->Models().size() )
2581 {
2582 *aUpdated = true;
2583 }
2584 else
2585 {
2586 for( size_t ii = 0; ii < aNew->Models().size(); ++ii )
2587 {
2588 if( aNew->Models()[ii] != aExisting->Models()[ii] )
2589 {
2590 *aUpdated = true;
2591 break;
2592 }
2593 }
2594 }
2595 }
2596 else
2597 {
2598 aNew->Models() = aExisting->Models(); // Linked list of 3D models.
2599 }
2600
2601 // Updating other parameters
2602 const_cast<KIID&>( aNew->m_Uuid ) = aExisting->m_Uuid;
2603 aNew->SetPath( aExisting->GetPath() );
2604 aNew->SetSheetfile( aExisting->GetSheetfile() );
2605 aNew->SetSheetname( aExisting->GetSheetname() );
2606 aNew->SetFilters( aExisting->GetFilters() );
2607 aNew->SetStaticComponentClass( aExisting->GetComponentClass() );
2608
2609 aCommit.Remove( aExisting );
2610 aCommit.Add( aNew );
2611
2612 aNew->ClearFlags();
2613}
2614
2615
2617{
2619
2621
2622 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
2623
2625
2626 // Netclass definitions could have changed, either by us or by Eeschema, so we need to
2627 // recompile the implicit rules
2628 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
2629 WX_INFOBAR* infobar = GetInfoBar();
2630
2631 try
2632 {
2633 drcTool->GetDRCEngine()->InitEngine( GetDesignRulesPath() );
2634
2635 if( infobar->GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::DRC_RULES_ERROR )
2636 infobar->Dismiss();
2637 }
2638 catch( PARSE_ERROR& )
2639 {
2640 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( infobar, wxID_ANY, _( "Edit design rules" ),
2641 wxEmptyString );
2642
2643 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
2644 [&]( wxHyperlinkEvent& aEvent )
2645 {
2646 ShowBoardSetupDialog( _( "Custom Rules" ) );
2647 } ) );
2648
2649 infobar->RemoveAllButtons();
2650 infobar->AddButton( button );
2651 infobar->AddCloseButton();
2652 infobar->ShowMessage( _( "Could not compile custom design rules." ), wxICON_ERROR,
2654 }
2655
2658
2659 // Update the environment variables in the Python interpreter
2660 if( aFlags & ENVVARS_CHANGED )
2662
2663 Layout();
2664 SendSizeEvent();
2665}
2666
2667
2669{
2671}
2672
2673
2675{
2677}
2678
2679
2681{
2682 // For now, be conservative: Don't allow any API use while the user is changing things
2683 if( GetToolManager()->GetCurrentTool() != GetToolManager()->GetTool<PCB_SELECTION_TOOL>() )
2684 return false;
2685
2687
2688 if( zoneFillerTool->IsBusy() )
2689 return false;
2690
2691 ROUTER_TOOL* routerTool = m_toolManager->GetTool<ROUTER_TOOL>();
2692
2693 if( routerTool->RoutingInProgress() )
2694 return false;
2695
2697}
2698
2699
2700bool ExportBoardToHyperlynx( BOARD* aBoard, const wxFileName& aPath );
2701
2702
2703void PCB_EDIT_FRAME::OnExportHyperlynx( wxCommandEvent& event )
2704{
2705 wxString wildcard = wxT( "*.hyp" );
2706 wxFileName fn = GetBoard()->GetFileName();
2707
2708 fn.SetExt( wxT("hyp") );
2709
2710 wxFileDialog dlg( this, _( "Export Hyperlynx Layout" ), fn.GetPath(), fn.GetFullName(),
2711 wildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
2712
2713 if( dlg.ShowModal() != wxID_OK )
2714 return;
2715
2716 fn = dlg.GetPath();
2717
2718 // always enforce filename extension, user may not have entered it.
2719 fn.SetExt( wxT( "hyp" ) );
2720
2722}
2723
2724
2726{
2727 return GetBoard()->GetFileName();
2728}
2729
2730
2732{
2733 return m_auimgr.GetPane( wxS( "LayersManager" ) ).IsShown();
2734}
2735
2736
2738{
2739 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
2740}
2741
2742
2744{
2745 return m_auimgr.GetPane( NetInspectorPanelName() ).IsShown();
2746}
2747
2748
2749void PCB_EDIT_FRAME::onSize( wxSizeEvent& aEvent )
2750{
2751 if( IsShownOnScreen() )
2752 {
2753 // We only need this until the frame is done resizing and the final client size is
2754 // established.
2755 Unbind( wxEVT_SIZE, &PCB_EDIT_FRAME::onSize, this );
2757 }
2758
2759 // Skip() is called in the base class.
2760 EDA_DRAW_FRAME::OnSize( aEvent );
2761}
2762
2763
2765{
2768 _( "Violation Report" ) );
2769
2770 return m_inspectDrcErrorDlg;
2771}
2772
2773
2775{
2778 _( "Clearance Report" ) );
2779
2780 return m_inspectClearanceDlg;
2781}
2782
2783
2785{
2788 _( "Constraints Report" ) );
2789
2791}
2792
2793
2795{
2796 if( !m_footprintDiffDlg )
2798 _( "Compare Footprint with Library" ) );
2799
2800 return m_footprintDiffDlg;
2801}
2802
2803
2805{
2806 if( m_inspectDrcErrorDlg && aEvent.GetString() == INSPECT_DRC_ERROR_DIALOG_NAME )
2807 {
2808 m_inspectDrcErrorDlg->Destroy();
2809 m_inspectDrcErrorDlg = nullptr;
2810 }
2811 else if( m_inspectClearanceDlg && aEvent.GetString() == INSPECT_CLEARANCE_DIALOG_NAME )
2812 {
2813 m_inspectClearanceDlg->Destroy();
2814 m_inspectClearanceDlg = nullptr;
2815 }
2816 else if( m_inspectConstraintsDlg && aEvent.GetString() == INSPECT_CONSTRAINTS_DIALOG_NAME )
2817 {
2818 m_inspectConstraintsDlg->Destroy();
2819 m_inspectConstraintsDlg = nullptr;
2820 }
2821 else if( m_footprintDiffDlg && aEvent.GetString() == INSPECT_CONSTRAINTS_DIALOG_NAME )
2822 {
2823 m_footprintDiffDlg->Destroy();
2824 m_footprintDiffDlg = nullptr;
2825 }
2826}
2827
2828#ifdef KICAD_IPC_API
2829void PCB_EDIT_FRAME::onPluginAvailabilityChanged( wxCommandEvent& aEvt )
2830{
2831 wxLogTrace( traceApi, "PCB frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" );
2833 aEvt.Skip();
2834}
2835#endif
Class PCBNEW_ACTION_PLUGINS.
const KICOMMON_API wxEventTypeTag< wxCommandEvent > EDA_EVT_PLUGIN_AVAILABILITY_CHANGED
Notifies other parts of KiCad when plugin availability changes.
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
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
@ icon_pcbnew_32
@ icon_pcbnew_16
constexpr BOX2I BOX2ISafe(const BOX2D &aInput)
Definition: box2.h:929
static TOOL_ACTION toggleGrid
Definition: actions.h:191
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION millimetersUnits
Definition: actions.h:199
static TOOL_ACTION unselectAll
Definition: actions.h:76
static TOOL_ACTION togglePolarCoords
Definition: actions.h:202
static TOOL_ACTION copy
Definition: actions.h:71
static TOOL_ACTION pluginsReload
Definition: actions.h:245
static TOOL_ACTION pasteSpecial
Definition: actions.h:74
static TOOL_ACTION milsUnits
Definition: actions.h:198
static TOOL_ACTION toggleBoundingBoxes
Definition: actions.h:147
static TOOL_ACTION showSearch
Definition: actions.h:108
static TOOL_ACTION undo
Definition: actions.h:68
static TOOL_ACTION duplicate
Definition: actions.h:77
static TOOL_ACTION inchesUnits
Definition: actions.h:197
static TOOL_ACTION highContrastMode
Definition: actions.h:145
static TOOL_ACTION embeddedFiles
Definition: actions.h:248
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:144
static TOOL_ACTION measureTool
Definition: actions.h:207
static TOOL_ACTION doDelete
Definition: actions.h:78
static TOOL_ACTION selectionTool
Definition: actions.h:206
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION zoomFitScreen
Definition: actions.h:134
static TOOL_ACTION redo
Definition: actions.h:69
static TOOL_ACTION deleteTool
Definition: actions.h:79
static TOOL_ACTION zoomTool
Definition: actions.h:138
static TOOL_ACTION showProperties
Definition: actions.h:220
static TOOL_ACTION cut
Definition: actions.h:70
static TOOL_ACTION gridSetOrigin
Definition: actions.h:188
static TOOL_ACTION toggleGridOverrides
Definition: actions.h:192
static TOOL_ACTION selectAll
Definition: actions.h:75
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 ApplyLayerPreset(const wxString &aPresetName)
int GetTabIndex() const
Set the current notebook tab.
void UpdateDisplayOptions()
Return a list of the layer presets created by the user.
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.
Definition: app_settings.h:92
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
Definition: base_screen.cpp:70
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.
bool GetLocalRatsnestVisible() const
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:78
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:235
virtual void SetLocked(bool aLocked)
Definition: board_item.h:326
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:94
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:286
VECTOR2I GetFPRelativePosition() const
Definition: board_item.cpp:334
void SetFPRelativePosition(const VECTOR2I &aPos)
Definition: board_item.cpp:348
virtual bool IsLocked() const
Definition: board_item.cpp:82
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:297
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:829
void BuildListOfNets()
Definition: board.h:860
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition: board.cpp:895
void RemoveAllListeners()
Remove all listeners.
Definition: board.cpp:2730
const PAGE_INFO & GetPageSettings() const
Definition: board.h:715
GAL_SET GetVisibleElements() const
Return a set of all the element categories that are visible.
Definition: board.cpp:889
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:185
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
Definition: board.cpp:2144
TITLE_BLOCK & GetTitleBlock()
Definition: board.h:721
const std::map< wxString, wxString > & GetProperties() const
Definition: board.h:369
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
Definition: board.cpp:195
const wxString & GetFileName() const
Definition: board.h:334
void SetElementVisibility(GAL_LAYER_ID aLayer, bool aNewState)
Change the visibility of an element category.
Definition: board.cpp:901
void ClearProject()
Definition: board.cpp:233
PROJECT * GetProject() const
Definition: board.h:511
bool IsEmpty() const
Definition: board.h:393
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:1824
void UpdateRatsnestExclusions()
Update the visibility flags on the current unconnected ratsnest lines.
Definition: board.cpp:297
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition: board.h:495
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:92
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
Definition: commit.h:80
Handle actions that are shared between different applications.
Handles action that are shared between different applications.
Definition: common_tools.h:38
void SetCallback(std::function< void(BOARD_ITEM *)> aCallback)
Function to be called on each found event.
Definition: dialog_find.h:63
bool Show(bool show=true) override
The Show method is overridden to make the search combobox focused by default.
void Preload(const wxString &aFindString)
void FindNext(bool reverse)
Finds the next item.
Definition: dialog_find.h:71
enum FP_PROPS_RETVALUE GetReturnValue()
A dialog to set the plot options and create plot files in various formats.
Definition: dialog_plot.h:41
int ShowQuasiModal()
Tool responsible for drawing graphical elements like lines, arcs, circles, etc.
Definition: drawing_tool.h:55
MODE GetDrawingMode() const
Return the current drawing mode of the DRAWING_TOOL or MODE::NONE if not currently in any drawing mod...
std::shared_ptr< DRC_ENGINE > GetDRCEngine()
Definition: drc_tool.h:78
bool IsDRCRunning() const
Check to see if the DRC engine is running the tests.
Definition: drc_tool.h:71
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.
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 base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:95
const KIID m_Uuid
Definition: eda_item.h:494
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:107
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: eda_item.h:133
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:110
Specialization of the wxAuiPaneInfo class for KiCad panels.
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:80
const EDA_ANGLE & GetTextAngle() const
Definition: eda_text.h:134
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:174
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition: eda_text.cpp:426
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition: eda_text.h:187
virtual void SetVisible(bool aVisible)
Definition: eda_text.cpp:379
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition: eda_text.h:190
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:270
int GetTextThickness() const
Definition: eda_text.h:126
VECTOR2I GetTextSize() const
Definition: eda_text.h:248
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 Units(EDA_UNITS aUnit)
Create a functor that tests if the frame has the specified units.
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.
SELECTION_CONDITION FullscreenCursor()
Create a functor testing if the cursor is full screen in a frame.
The interactive edit tool.
Definition: edit_tool.h:56
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition: property.h:686
static ENUM_MAP< T > & Instance()
Definition: property.h:680
ENUM_MAP & Undefined(T aValue)
Definition: property.h:693
wxPGChoices & Choices()
Definition: property.h:729
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.
void SetPosition(const VECTOR2I &aPos) override
Definition: footprint.cpp:2456
void SetLocked(bool isLocked) override
Set the #MODULE_is_LOCKED bit in the m_ModuleStatus.
Definition: footprint.h:426
EDA_ANGLE GetOrientation() const
Definition: footprint.h:232
void SetOrientation(const EDA_ANGLE &aNewAngle)
Definition: footprint.cpp:2538
wxString GetSheetname() const
Definition: footprint.h:271
void SetPath(const KIID_PATH &aPath)
Definition: footprint.h:269
void SetFilters(const wxString &aFilters)
Definition: footprint.h:278
void SetStaticComponentClass(const COMPONENT_CLASS *aClass) const
Sets the component class object pointer for this footprint.
Definition: footprint.cpp:4038
void SetAttributes(int aAttributes)
Definition: footprint.h:296
void SetSheetfile(const wxString &aSheetfile)
Definition: footprint.h:275
PCB_FIELD & Value()
read/write accessors:
Definition: footprint.h:655
PCB_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this footprint.
Definition: footprint.cpp:582
std::deque< PAD * > & Pads()
Definition: footprint.h:211
int GetAttributes() const
Definition: footprint.h:295
const COMPONENT_CLASS * GetComponentClass() const
Returns the component class for this footprint.
Definition: footprint.cpp:4056
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: footprint.h:241
wxString GetSheetfile() const
Definition: footprint.h:274
const LIB_ID & GetFPID() const
Definition: footprint.h:253
bool IsLocked() const override
Definition: footprint.h:416
PCB_FIELD & Reference()
Definition: footprint.h:656
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition: footprint.cpp:1069
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
Definition: footprint.cpp:2397
wxString GetFilters() const
Definition: footprint.h:277
void SetSheetname(const wxString &aSheetname)
Definition: footprint.h:272
void GetFields(std::vector< PCB_FIELD * > &aVector, bool aVisibleOnly) const
Populate a std::vector with PCB_TEXTs.
Definition: footprint.cpp:627
std::vector< FP_3DMODEL > & Models()
Definition: footprint.h:225
const wxString & GetValue() const
Definition: footprint.h:641
const KIID_PATH & GetPath() const
Definition: footprint.h:268
VECTOR2I GetPosition() const override
Definition: footprint.h:229
DRAWINGS & GraphicalItems()
Definition: footprint.h:214
PAD * FindPadByNumber(const wxString &aPadNumber, PAD *aSearchAfterMe=nullptr) const
Return a PAD with a matching number.
Definition: footprint.cpp:1955
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
bool Contains(GAL_LAYER_ID aPos)
Definition: layer_ids.h:426
Handle actions specific to filling copper zones.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:77
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
virtual const wxString Problem() const
what was the problem?
Definition: exceptions.cpp:46
virtual const wxString Where() const
where did the Problem() occur?
Definition: exceptions.cpp:40
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:104
void SetGridColor(const COLOR4D &aGridColor)
Set the grid color.
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
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
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const std::set< int > & GetHighlightNetCodes() const
Return the netcode of currently highlighted net.
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:272
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition: view.cpp:520
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:1673
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:396
bool IsMirroredX() const
Return true if view is flipped across the X axis.
Definition: view.h:246
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1549
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:216
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition: view.h:635
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:1559
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.
Definition: kiway_player.h:65
virtual bool OpenProjectFiles(const std::vector< wxString > &aFileList, int aCtl=0)
Open a project or set of files given by aFileList.
Definition: kiway_player.h:113
void OnSockRequestServer(wxSocketEvent &evt)
Definition: eda_dde.cpp:99
void OnSockRequest(wxSocketEvent &evt)
Definition: eda_dde.cpp:69
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:285
void OnKiCadExit()
Definition: kiway.cpp:727
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:406
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
Definition: kiway.cpp:527
virtual void CommonSettingsChanged(int aFlags=0)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition: kiway.cpp:617
int SetLayerSelection(int layer)
PCB_LAYER_ID GetLayerA() const
PCB_LAYER_ID GetLayerB() const
const UTF8 & GetLibItemName() const
Definition: lib_id.h:102
LSET is a set of PCB_LAYER_IDs.
Definition: lset.h:37
static LSET AllLayersMask()
Definition: lset.cpp:601
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:297
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:381
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
Definition: pcb_netlist.h:255
virtual void OnBoardChanged()
Notification from file loader when board changed and connectivity rebuilt.
virtual void SaveSettings()
Save the net inspector settings - called from EDA_EDIT_FRAME when hiding the panel.
virtual void OnParentSetupChanged()
Rebuild inspector data if project settings updated.
Tool relating to pads and pad settings.
Definition: pad_tool.h:37
Definition: pad.h:54
const wxString & GetPinType() const
Definition: pad.h:153
const wxString & GetPinFunction() const
Definition: pad.h:147
bool IsOnCopperLayer() const override
Definition: pad.cpp:1058
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:59
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 toggleHV45Mode
Definition: pcb_actions.h:544
static TOOL_ACTION drawRuleArea
Definition: pcb_actions.h:224
static TOOL_ACTION microwaveCreateGap
Definition: pcb_actions.h:533
static TOOL_ACTION drawBezier
Definition: pcb_actions.h:207
static TOOL_ACTION placeText
Definition: pcb_actions.h:209
static TOOL_ACTION pointEditorArcKeepCenter
Definition: pcb_actions.h:303
static TOOL_ACTION drawOrthogonalDimension
Definition: pcb_actions.h:220
static TOOL_ACTION drawRectangle
Definition: pcb_actions.h:204
static TOOL_ACTION padDisplayMode
Definition: pcb_actions.h:341
static TOOL_ACTION placeReferenceImage
Definition: pcb_actions.h:208
static TOOL_ACTION showRatsnest
Definition: pcb_actions.h:336
static TOOL_ACTION showLayersManager
Definition: pcb_actions.h:458
static TOOL_ACTION toggleNetHighlight
Definition: pcb_actions.h:580
static TOOL_ACTION saveSelectionAsDesignBlock
Definition: pcb_actions.h:467
static TOOL_ACTION drawCircle
Definition: pcb_actions.h:205
static TOOL_ACTION routeDiffPair
Activation of the Push and Shove router (differential pair mode)
Definition: pcb_actions.h:258
static TOOL_ACTION tuneDiffPair
Definition: pcb_actions.h:261
static TOOL_ACTION layerChanged
Definition: pcb_actions.h:394
static TOOL_ACTION ddAppendBoard
Drag and drop.
Definition: pcb_actions.h:609
static TOOL_ACTION highlightNet
Definition: pcb_actions.h:578
static TOOL_ACTION autoTrackWidth
Definition: pcb_actions.h:404
static TOOL_ACTION drawTable
Definition: pcb_actions.h:211
static TOOL_ACTION drawTextBox
Definition: pcb_actions.h:210
static TOOL_ACTION routerHighlightMode
Actions to enable switching modes via hotkey assignments.
Definition: pcb_actions.h:277
static TOOL_ACTION routerWalkaroundMode
Definition: pcb_actions.h:279
static TOOL_ACTION routerShoveMode
Definition: pcb_actions.h:278
static TOOL_ACTION drawZoneCutout
Definition: pcb_actions.h:225
static TOOL_ACTION drawPolygon
Definition: pcb_actions.h:203
static TOOL_ACTION hideNetInRatsnest
Definition: pcb_actions.h:585
static TOOL_ACTION group
Definition: pcb_actions.h:552
static TOOL_ACTION zoneDisplayFilled
Definition: pcb_actions.h:343
static TOOL_ACTION showNetInRatsnest
Definition: pcb_actions.h:586
static TOOL_ACTION drawRadialDimension
Definition: pcb_actions.h:219
static TOOL_ACTION tuneSingleTrack
Definition: pcb_actions.h:260
static TOOL_ACTION viaDisplayMode
Definition: pcb_actions.h:342
static TOOL_ACTION drawLeader
Definition: pcb_actions.h:221
static TOOL_ACTION saveBoardAsDesignBlock
Definition: pcb_actions.h:466
static TOOL_ACTION drillOrigin
Definition: pcb_actions.h:562
static TOOL_ACTION tuneSkew
Definition: pcb_actions.h:262
static TOOL_ACTION trackDisplayMode
Definition: pcb_actions.h:340
static TOOL_ACTION showNetInspector
Definition: pcb_actions.h:459
static TOOL_ACTION microwaveCreateStubArc
Definition: pcb_actions.h:537
static TOOL_ACTION zoneDisplayTriangulated
Definition: pcb_actions.h:346
static TOOL_ACTION ungroup
Definition: pcb_actions.h:553
static TOOL_ACTION placeDesignBlock
Definition: pcb_actions.h:464
static TOOL_ACTION selectUnconnected
Select unconnected footprints from ratsnest of selection.
Definition: pcb_actions.h:103
static TOOL_ACTION zoneDisplayFractured
Definition: pcb_actions.h:345
static TOOL_ACTION drawVia
Definition: pcb_actions.h:223
static TOOL_ACTION drawArc
Definition: pcb_actions.h:206
static TOOL_ACTION zoneDuplicate
Duplicate zone onto another layer.
Definition: pcb_actions.h:419
static TOOL_ACTION graphicsOutlines
Display footprint graphics as outlines.
Definition: pcb_actions.h:516
static TOOL_ACTION drawSimilarZone
Definition: pcb_actions.h:226
static TOOL_ACTION pointEditorArcKeepEndpoint
Definition: pcb_actions.h:304
static TOOL_ACTION showDesignBlockPanel
Definition: pcb_actions.h:465
static TOOL_ACTION drawCenterDimension
Definition: pcb_actions.h:218
static TOOL_ACTION selectSameSheet
Select all components on the same sheet as the selected footprint.
Definition: pcb_actions.h:112
static TOOL_ACTION microwaveCreateStub
Definition: pcb_actions.h:535
static TOOL_ACTION selectNet
Select all connections belonging to a single net.
Definition: pcb_actions.h:97
static TOOL_ACTION microwaveCreateLine
Definition: pcb_actions.h:541
static TOOL_ACTION flipBoard
Definition: pcb_actions.h:396
static TOOL_ACTION zoneDisplayOutline
Definition: pcb_actions.h:344
static TOOL_ACTION ratsnestLineMode
Definition: pcb_actions.h:337
static TOOL_ACTION textOutlines
Display texts as lines.
Definition: pcb_actions.h:519
static TOOL_ACTION highlightNetSelection
Definition: pcb_actions.h:581
static TOOL_ACTION microwaveCreateFunctionShape
Definition: pcb_actions.h:539
static TOOL_ACTION zoneMerge
Definition: pcb_actions.h:416
static TOOL_ACTION unlock
Definition: pcb_actions.h:549
static TOOL_ACTION placeFootprint
Definition: pcb_actions.h:229
static TOOL_ACTION routeSingleTrack
Activation of the Push and Shove router.
Definition: pcb_actions.h:255
static TOOL_ACTION createArray
Tool for creating an array of objects.
Definition: pcb_actions.h:513
static TOOL_ACTION deselectNet
Remove all connections belonging to a single net from the active selection.
Definition: pcb_actions.h:100
static TOOL_ACTION showPythonConsole
Definition: pcb_actions.h:460
static TOOL_ACTION drawLine
Definition: pcb_actions.h:202
static TOOL_ACTION localRatsnestTool
Definition: pcb_actions.h:587
static TOOL_ACTION drawAlignedDimension
Definition: pcb_actions.h:217
static TOOL_ACTION drawZone
Definition: pcb_actions.h:222
static TOOL_ACTION selectOnSchematic
Select symbols/pins on schematic corresponding to selected footprints/pads.
Definition: pcb_actions.h:115
static TOOL_ACTION lock
Definition: pcb_actions.h:548
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.
void doCloseWindow() override
void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
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
PANEL_SELECTION_FILTER * m_selectionFilterPanel
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.
virtual const PCB_PLOT_PARAMS & GetPlotSettings() const
Return the PCB_PLOT_PARAMS for the BOARD owned by this frame.
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 PCB_LAYER_ID GetActiveLayer() const
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()
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual void SetPageSettings(const PAGE_INFO &aPageSettings) override
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
BOARD * GetBoard() const
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Return the BOARD_DESIGN_SETTINGS for the open project.
virtual void SetPlotSettings(const PCB_PLOT_PARAMS &aSettings)
void PlaceFootprint(FOOTPRINT *aFootprint, bool aRecreateRatsnest=true)
Place aFootprint at the current cursor position and updates footprint coordinates with the new positi...
virtual void SetActiveLayer(PCB_LAYER_ID aLayer)
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 Get45degMode()
Create a functor that tests whether only 45 degree lines should be allowed.
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 ShowBoardSetupDialog(const wxString &aInitialPage=wxEmptyString)
void SetLastPath(LAST_PATH_TYPE aType, const wxString &aLastPath)
Set the path of the last file successfully read.
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 setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
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 OnExportSTEP(wxCommandEvent &event)
Export the current BOARD to a STEP assembly.
void ExchangeFootprint(FOOTPRINT *aExisting, FOOTPRINT *aNew, BOARD_COMMIT &aCommit, bool deleteExtraTexts=true, bool resetTextLayers=true, bool resetTextEffects=true, bool resetFabricationAttrs=true, bool resetTextContent=true, bool reset3DModels=true, bool *aUpdated=nullptr)
Replace aExisting footprint by aNew footprint using the Existing footprint settings (position,...
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 onBoardLoaded()
Update the state of the GUI after a new board is loaded or created.
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 OnExportIDF3(wxCommandEvent &event)
Export the current BOARD to a IDFv3 board and lib files.
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.
bool m_show_layer_manager_tools
void OnExportVRML(wxCommandEvent &event)
Export the current BOARD to a VRML file.
void ShowFindDialog()
Show the Find dialog.
void onSize(wxSizeEvent &aEvent)
int ShowExchangeFootprintsDialog(FOOTPRINT *aFootprint, bool aUpdateMode, bool aSelectedMode)
int TestStandalone()
Test if standalone mode.
void ShowFootprintPropertiesDialog(FOOTPRINT *aFootprint)
void OnExportHyperlynx(wxCommandEvent &event)
Export the current BOARD to a Hyperlynx HYP file.
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
TOOL_ACTION * m_exportNetlistAction
The export board netlist tool action object.
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.
void RecreateCmpFileFromBoard(wxCommandEvent &aEvent)
Recreates a .cmp file from the current loaded board.
DIALOG_BOOK_REPORTER * GetFootprintDiffDialog()
EDA_ANGLE GetRotationAngle() const override
Return the angle used for rotate operations.
COLOR4D GetGridColor() override
void Files_io(wxCommandEvent &event)
Call Files_io_from_id with the wxCommandEvent id.
void UpdateTitle()
Set the main window title bar text.
DIALOG_BOOK_REPORTER * m_footprintDiffDlg
void ExportToGenCAD(wxCommandEvent &event)
Create a file in GenCAD 1.4 format from the current board.
void ActivateGalCanvas() override
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
void Process_Special_Functions(wxCommandEvent &event)
Definition: edit.cpp:53
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)
void ToPlotter(int aID)
Open a dialog frame to create plot and drill files relative to the current board.
DIALOG_BOOK_REPORTER * GetInspectConstraintsDialog()
Toolbar configuration for the PCB editor frame.
A set of BOARD_ITEMs (i.e., without duplicates).
Definition: pcb_group.h:52
virtual bool RemoveItem(BOARD_ITEM *aItem)
Remove item from group.
Definition: pcb_group.cpp:96
virtual bool AddItem(BOARD_ITEM *aItem)
Add item to group.
Definition: pcb_group.cpp:81
PCB net inspection panel.
Generic tool for picking an item.
Parameters and options when plotting/printing a board.
void SetFormat(PLOT_FORMAT aFormat)
Tool that displays edit points allowing to modify items by dragging the points.
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:
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:456
Tool useful for viewing footprints.
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
Definition: pgm_base.cpp:933
virtual const wxString & GetExecutablePath() const
Definition: pgm_base.cpp:1048
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:125
The interactive edit tool.
A progress reporter interface for use in multi-threaded environments.
The backing store for a PROJECT, in JSON format.
Definition: project_file.h:73
std::vector< LAYER_PAIR_INFO > m_LayerPairInfos
List of stored 3D viewports (view matrixes)
Definition: project_file.h:199
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 PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
Definition: project.h:209
void IncrementNetclassesTicker()
Definition: project.h:121
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:203
void IncrementTextVarsTicker()
Definition: project.h:118
float SplitterProportion() const
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.
void FocusSearch()
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.
EDA_ITEM * Front() const
Definition: selection.h:172
int Size() const
Returns the number of selected parts.
Definition: selection.h:116
T * GetToolbarSettings(const wxString &aFilename)
Return a handle to the given toolbar settings.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition: richio.h:253
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:171
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:173
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
ACTIONS * m_actions
Definition: tools_holder.h:172
Represent a single user action.
Definition: tool_action.h:304
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:168
void SetHasPosition(bool aHasPosition)
Definition: tool_event.h:258
Master controller class:
Definition: tool_manager.h:62
bool ProcessEvent(const TOOL_EVENT &aEvent)
Propagate an event to tools that requested events of matching type(s).
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:150
bool InvokeTool(TOOL_ID aToolId)
Call a tool by sending a tool activation event to tool of given ID.
ACTION_MANAGER * GetActionManager() const
Definition: tool_manager.h:306
bool PostAction(const std::string &aActionName, T aParam)
Run the specified action after the current action (coroutine) ends.
Definition: tool_manager.h:235
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
std::vector< TOOL_BASE * > Tools()
Definition: tool_manager.h:341
void RegisterTool(TOOL_BASE *aTool)
Add a tool to the manager set and sets it up.
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Set the work environment (model, view, view controls and the parent window).
void InitTools()
Initialize all registered tools.
void ShutdownAllTools()
Shutdown all tools with a currently registered event loop in this tool manager by waking them up with...
wxString wx_str() const
Definition: utf8.cpp:45
A modified version of the wxInfoBar class that allows us to:
Definition: wx_infobar.h:76
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
Definition: wx_infobar.cpp:353
@ OUTDATED_SAVE
OUTDATED_SAVE Messages that should be cleared on save.
@ GENERIC
GENERIC Are messages that do not have special handling.
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
Definition: wx_infobar.cpp:343
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Definition: wx_infobar.cpp:154
Handle actions specific to filling copper zones.
PROGRESS_REPORTER * GetProgressReporter()
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:130
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:194
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define DIALOG_DRC_WINDOW_NAME
Definition: dialog_drc.h:42
#define _HKI(x)
#define _(s)
Declaration of the eda_3d_viewer class.
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:403
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define PCB_EDIT_FRAME_NAME
static const std::vector< KICAD_T > footprintTypes
Definition: edit_tool.cpp:81
static const std::vector< KICAD_T > groupTypes
Definition: edit_tool.cpp:83
static const std::vector< KICAD_T > trackTypes
Definition: edit_tool.cpp:85
KiCad executable names.
const wxString EESCHEMA_EXE
bool ExportBoardToHyperlynx(BOARD *aBoard, const wxFileName &aPath)
@ FP_ALLOW_SOLDERMASK_BRIDGES
Definition: footprint.h:86
#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
@ ID_MAIN_MENUBAR
Definition: gerbview_id.h:38
int ExecuteFile(const wxString &aEditorName, const wxString &aFileName, wxProcess *aCallback, bool aFileForKicad)
Call the executable file aEditorName with the parameter aFileName.
Definition: gestfich.cpp:143
bool m_ShowEventCounters
Shows debugging event counters in various places.
static const std::string LegacySchematicFileExtension
static const std::string LegacyPcbFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string AutoSaveFilePrefix
static const std::string KiCadPcbFileExtension
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
const wxChar *const traceApi
Flag to enable debug output related to the IPC API and its plugin system.
Definition: api_utils.cpp:26
@ ID_ON_GRID_SELECT
Definition: id.h:137
@ ID_GEN_PLOT_DXF
Definition: id.h:93
@ ID_FILE_LIST_CLEAR
Definition: id.h:84
@ ID_EDA_SOCKET_EVENT
Definition: id.h:155
@ ID_GEN_PLOT_PS
Definition: id.h:89
@ ID_EDA_SOCKET_EVENT_SERV
Definition: id.h:154
@ ID_GEN_PLOT_GERBER
Definition: id.h:91
@ ID_ON_ZOOM_SELECT
Definition: id.h:135
@ ID_GEN_PLOT
Definition: id.h:88
@ ID_GEN_PLOT_SVG
Definition: id.h:92
@ ID_GEN_PLOT_HPGL
Definition: id.h:90
@ ID_FILEMAX
Definition: id.h:82
@ ID_FILE1
Definition: id.h:81
@ ID_GEN_PLOT_PDF
Definition: id.h:94
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
PROJECT & Prj()
Definition: kicad.cpp:597
int GetNetnameLayer(int aLayer)
Return a netname layer corresponding to the given layer.
Definition: layer_ids.h:839
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition: layer_ids.h:663
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
Definition: layer_ids.h:228
@ LAYER_GRID
Definition: layer_ids.h:253
@ LAYER_ZONES
Control for copper zone opacity/visibility (color ignored).
Definition: layer_ids.h:294
@ LAYER_RATSNEST
Definition: layer_ids.h:252
#define CLEARANCE_LAYER_FOR(boardLayer)
Definition: layer_ids.h:361
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
@ 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:90
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: unix/app.cpp:79
@ RM_MarkObstacles
Ignore collisions, mark obstacles.
@ RM_Walkaround
Only walk around.
@ RM_Shove
Only shove.
static void processTextItem(const PCB_TEXT &aSrc, PCB_TEXT &aDest, bool aResetText, bool aResetTextLayers, bool aResetTextEffects, bool *aUpdated)
copy text settings from aSrc to aDest
#define FOOTPRINT_DIFF_DIALOG_NAME
static PCB_TEXT * getMatchingTextItem(PCB_TEXT *aRefItem, FOOTPRINT *aFootprint)
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
bool ExportBoardToHyperlynx(BOARD *aBoard, const wxFileName &aPath)
#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:24
@ ID_POPUP_PCB_SELECT_WIDTH1
Definition: pcbnew_id.h:28
@ ID_POPUP_PCB_SELECT_VIASIZE8
Definition: pcbnew_id.h:51
@ ID_GEN_EXPORT_FILE_HYPERLYNX
Definition: pcbnew_id.h:87
@ ID_IMPORT_NON_KICAD_BOARD
Definition: pcbnew_id.h:19
@ ID_MENU_RECOVER_BOARD_AUTOSAVE
Definition: pcbnew_id.h:80
@ ID_AUX_TOOLBAR_PCB_VIA_SIZE
Definition: pcbnew_id.h:22
@ ID_PCB_GEN_CMP_FILE
Definition: pcbnew_id.h:92
@ ID_MENU_EXPORT_FOOTPRINTS_TO_NEW_LIBRARY
Definition: pcbnew_id.h:82
@ ID_POPUP_PCB_SELECT_WIDTH_END_RANGE
Definition: pcbnew_id.h:78
@ ID_MENU_EXPORT_FOOTPRINTS_TO_LIBRARY
Definition: pcbnew_id.h:81
@ ID_GEN_EXPORT_FILE_VRML
Definition: pcbnew_id.h:85
@ ID_POPUP_PCB_SELECT_VIASIZE1
Definition: pcbnew_id.h:44
@ ID_GEN_EXPORT_FILE_STEP
Definition: pcbnew_id.h:86
@ ID_GEN_EXPORT_FILE_IDF3
Definition: pcbnew_id.h:84
@ ID_AUX_TOOLBAR_PCB_TRACK_WIDTH
Definition: pcbnew_id.h:23
@ ID_GEN_EXPORT_FILE_GENCADFORMAT
Definition: pcbnew_id.h:88
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...
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1071
see class PGM_BASE
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
Definition: project.h:40
LAST_PATH_TYPE
For storing PcbNew MRU paths of various types.
Definition: project_file.h:49
@ RPT_SEVERITY_EXCLUSION
#define SKIP_SET_DIRTY
Definition: sch_commit.h:43
#define SKIP_UNDO
Definition: sch_commit.h:41
#define CURRENT_TOOL(action)
std::function< bool(const SELECTION &)> SELECTION_CONDITION
Functor type that checks a specific condition for selected items.
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.
Definition: string_utils.h:403
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
const double IU_PER_MILS
Definition: base_units.h:77
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
A filename or source description, a problem input line, a line number, a byte offset,...
Definition: ki_exception.h:120
@ 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
Definition: tools_holder.h:153
#define ENVVARS_CHANGED
Definition: tools_holder.h:152
wxLogTrace helper definitions.
@ 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_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition: typeinfo.h:110
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition: typeinfo.h:107
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition: typeinfo.h:92
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition: typeinfo.h:90
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition: typeinfo.h:86
@ 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_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:96
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.