KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_edit_frame.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright (C) 2013 Wayne Stambaugh <[email protected]>
7 * Copyright (C) 2013-2023 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>
90#include <tools/pad_tool.h>
94#include <tools/pcb_actions.h>
96#include <router/router_tool.h>
99#include <gestfich.h>
100#include <executable_names.h>
102#include <wx/socket.h>
103#include <wx/wupdlock.h>
104#include <dialog_drc.h> // for DIALOG_DRC_WINDOW_NAME definition
108#include <widgets/wx_infobar.h>
112#include <widgets/wx_aui_utils.h>
113#include <kiplatform/app.h>
114#include <core/profile.h>
115#include <math/box2_minmax.h>
119
120#ifdef KICAD_IPC_API
121#include <api/api_server.h>
122#include <api/api_handler_pcb.h>
124#include <api/api_utils.h>
125#endif
126
127#include <action_plugin.h>
129#include "../scripting/python_scripting.h"
130
131#include <wx/filedlg.h>
132
133using namespace std::placeholders;
134
135
136#define INSPECT_DRC_ERROR_DIALOG_NAME wxT( "InspectDrcErrorDialog" )
137#define INSPECT_CLEARANCE_DIALOG_NAME wxT( "InspectClearanceDialog" )
138#define INSPECT_CONSTRAINTS_DIALOG_NAME wxT( "InspectConstraintsDialog" )
139#define FOOTPRINT_DIFF_DIALOG_NAME wxT( "FootprintDiffDialog" )
140
141
142BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME )
145
146
149
150 EVT_SIZE( PCB_EDIT_FRAME::OnSize )
151
153
154 // Menu Files:
156
160
166
169
170 EVT_MENU( wxID_EXIT, PCB_EDIT_FRAME::OnQuit )
171 EVT_MENU( wxID_CLOSE, PCB_EDIT_FRAME::OnQuit )
172
173 // menu Postprocess
175
176 // 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.
193 PCB_EDIT_FRAME::OnUpdateSelectTrackWidth )
195 PCB_EDIT_FRAME::OnUpdateSelectViaSize )
196 // Drop files event
197 EVT_DROP_FILES( PCB_EDIT_FRAME::OnDropFiles )
198END_EVENT_TABLE()
199
200
201PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
202 PCB_BASE_EDIT_FRAME( aKiway, aParent, FRAME_PCB_EDITOR, _( "PCB Editor" ),
203 wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
205 m_exportNetlistAction( nullptr ),
206 m_findDialog( nullptr ),
207 m_inspectDrcErrorDlg( nullptr ),
208 m_inspectClearanceDlg( nullptr ),
209 m_inspectConstraintsDlg( nullptr ),
210 m_footprintDiffDlg( nullptr ),
211 m_importProperties( nullptr )
212{
213 m_maximizeByDefault = true;
214 m_showBorderAndTitleBlock = true; // true to display sheet references
215 m_SelTrackWidthBox = nullptr;
216 m_SelViaSizeBox = nullptr;
217 m_SelLayerBox = 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 ReCreateMenuBar();
275 ReCreateHToolbar();
276 ReCreateAuxiliaryToolbar();
277 ReCreateVToolbar();
278 ReCreateOptToolbar();
279
280#ifdef KICAD_IPC_API
282 &PCB_EDIT_FRAME::onPluginAvailabilityChanged, this );
283#endif
284
285 m_propertiesPanel = new PCB_PROPERTIES_PANEL( this, this );
286
287 float proportion = GetPcbNewSettings()->m_AuiPanels.properties_splitter;
288 m_propertiesPanel->SetSplitterProportion( proportion );
289
290 m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this );
291
292 m_appearancePanel = new APPEARANCE_CONTROLS( this, GetCanvas() );
293 m_searchPane = new PCB_SEARCH_PANE( this );
294 m_netInspectorPanel = new PCB_NET_INSPECTOR_PANEL( this, this );
295
296 m_auimgr.SetManagedWindow( this );
297
298 CreateInfoBar();
299
300 unsigned int auiFlags = wxAUI_MGR_DEFAULT;
301#if !defined( _WIN32 )
302 // Windows cannot redraw the UI fast enough during a live resize and may lead to all kinds
303 // of graphical glitches.
304 auiFlags |= wxAUI_MGR_LIVE_RESIZE;
305#endif
306 m_auimgr.SetFlags( auiFlags );
307
308 // Rows; layers 4 - 6
309 m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( wxS( "MainToolbar" ) )
310 .Top().Layer( 6 ) );
311 m_auimgr.AddPane( m_auxiliaryToolBar, EDA_PANE().HToolbar().Name( wxS( "AuxToolbar" ) )
312 .Top().Layer( 5 ) );
313 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) )
314 .Bottom().Layer( 6 ) );
315
316 // Columns; layers 1 - 3
317 m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( wxS( "OptToolbar" ) )
318 .Left().Layer( 3 ) );
319
320 m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( wxS( "ToolsToolbar" ) )
321 .Right().Layer( 3 ) );
322
323 m_auimgr.AddPane( m_appearancePanel, EDA_PANE().Name( wxS( "LayersManager" ) )
324 .Right().Layer( 4 )
325 .Caption( _( "Appearance" ) ).PaneBorder( false )
326 .MinSize( FromDIP( 180 ), -1 ).BestSize( FromDIP( 180 ), -1 ) );
327
328 m_auimgr.AddPane( m_selectionFilterPanel, EDA_PANE().Name( wxS( "SelectionFilter" ) )
329 .Right().Layer( 4 ).Position( 2 )
330 .Caption( _( "Selection Filter" ) ).PaneBorder( false )
331 .MinSize( FromDIP( 180 ), -1 ).BestSize( FromDIP( 180 ), -1 ) );
332
333 m_auimgr.AddPane( m_propertiesPanel, EDA_PANE().Name( PropertiesPaneName() )
334 .Left().Layer( 5 )
335 .Caption( _( "Properties" ) ).PaneBorder( false )
336 .MinSize( FromDIP( wxSize( 240, 60 ) ) ).BestSize( FromDIP( wxSize( 300, 200 ) ) ) );
337
338 // Center
339 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
340 .Center() );
341
342 m_auimgr.AddPane( m_netInspectorPanel, EDA_PANE()
343 .Name( NetInspectorPanelName() )
344 .Bottom()
345 .Caption( _( "Net Inspector" ) )
346 .PaneBorder( false )
347 .MinSize( FromDIP( wxSize( 240, 60 ) ) )
348 .BestSize( FromDIP( wxSize( 300, 200 ) ) ) );
349
350 m_auimgr.AddPane( m_searchPane, EDA_PANE().Name( SearchPaneName() )
351 .Bottom()
352 .Caption( _( "Search" ) ).PaneBorder( false )
353 .MinSize( FromDIP( wxSize ( 180, 60 ) ) ).BestSize( FromDIP( wxSize ( 180, 100 ) ) )
354 .FloatingSize( FromDIP( wxSize( 480, 200 ) ) )
355 .DestroyOnClose( false ) );
356
357
358 m_auimgr.GetPane( "LayersManager" ).Show( m_show_layer_manager_tools );
359 m_auimgr.GetPane( "SelectionFilter" ).Show( m_show_layer_manager_tools );
360 m_auimgr.GetPane( PropertiesPaneName() ).Show( GetPcbNewSettings()->m_AuiPanels.show_properties );
361 m_auimgr.GetPane( NetInspectorPanelName() ).Show( m_show_net_inspector );
362 m_auimgr.GetPane( SearchPaneName() ).Show( m_show_search );
363
364 // The selection filter doesn't need to grow in the vertical direction when docked
365 m_auimgr.GetPane( "SelectionFilter" ).dock_proportion = 0;
366
367 FinishAUIInitialization();
368
369 if( PCBNEW_SETTINGS* settings = dynamic_cast<PCBNEW_SETTINGS*>( config() ) )
370 {
371 if( settings->m_AuiPanels.right_panel_width > 0 )
372 {
373 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( wxS( "LayersManager" ) );
374 SetAuiPaneSize( m_auimgr, layersManager, settings->m_AuiPanels.right_panel_width, -1 );
375 }
376
377 if( settings->m_AuiPanels.properties_panel_width > 0 && m_propertiesPanel )
378 {
379 wxAuiPaneInfo& propertiesPanel = m_auimgr.GetPane( PropertiesPaneName() );
380 SetAuiPaneSize( m_auimgr, propertiesPanel,
381 settings->m_AuiPanels.properties_panel_width, -1 );
382 }
383
384 if( settings->m_AuiPanels.search_panel_height > 0
385 && ( settings->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_TOP
386 || settings->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) )
387 {
388 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
389 searchPane.Direction( settings->m_AuiPanels.search_panel_dock_direction );
390 SetAuiPaneSize( m_auimgr, searchPane, -1, settings->m_AuiPanels.search_panel_height );
391 }
392 else if( settings->m_AuiPanels.search_panel_width > 0
393 && ( settings->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_LEFT
394 || settings->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) )
395 {
396 wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
397 searchPane.Direction( settings->m_AuiPanels.search_panel_dock_direction );
398 SetAuiPaneSize( m_auimgr, searchPane, settings->m_AuiPanels.search_panel_width, -1 );
399 }
400
401 m_appearancePanel->SetTabIndex( settings->m_AuiPanels.appearance_panel_tab );
402 }
403
404 {
405 m_layerPairSettings = std::make_unique<LAYER_PAIR_SETTINGS>();
406
407 m_layerPairSettings->Bind( PCB_LAYER_PAIR_PRESETS_CHANGED, [&]( wxCommandEvent& aEvt )
408 {
409 // Update the project file list
410 std::span<const LAYER_PAIR_INFO> newPairInfos = m_layerPairSettings->GetLayerPairs();
412 std::vector<LAYER_PAIR_INFO>{ newPairInfos.begin(), newPairInfos.end() };
413 });
414
415 m_layerPairSettings->Bind( PCB_CURRENT_LAYER_PAIR_CHANGED, [&]( wxCommandEvent& aEvt )
416 {
417 const LAYER_PAIR& layerPair = m_layerPairSettings->GetCurrentLayerPair();
418 PCB_SCREEN& screen = *GetScreen();
419
420 screen.m_Route_Layer_TOP = layerPair.GetLayerA();
421 screen.m_Route_Layer_BOTTOM = layerPair.GetLayerB();
422
423 // Update the toolbar icon
424 PrepareLayerIndicator();
425 });
426 }
427
428 GetToolManager()->PostAction( ACTIONS::zoomFitScreen );
429
430 // This is used temporarily to fix a client size issue on GTK that causes zoom to fit
431 // to calculate the wrong zoom size. See PCB_EDIT_FRAME::onSize().
432 Bind( wxEVT_SIZE, &PCB_EDIT_FRAME::onSize, this );
433
434 Bind( wxEVT_IDLE,
435 [this]( wxIdleEvent& aEvent )
436 {
437 BOX2D viewport = GetCanvas()->GetView()->GetViewport();
438
439 if( viewport != m_lastNetnamesViewport )
440 {
441 redrawNetnames();
442 m_lastNetnamesViewport = viewport;
443 }
444
445 // Do not forget to pass the Idle event to other clients:
446 aEvent.Skip();
447 } );
448
449 resolveCanvasType();
450
451 setupUnits( config() );
452
453 // Ensure the DRC engine is initialized so that constraints can be resolved even before a
454 // board is loaded or saved
455 try
456 {
457 m_toolManager->GetTool<DRC_TOOL>()->GetDRCEngine()->InitEngine( wxFileName() );
458 }
459 catch( PARSE_ERROR& )
460 {
461 }
462
463 // Ensure the Python interpreter is up to date with its environment variables
464 PythonSyncEnvironmentVariables();
465 PythonSyncProjectName();
466
467 // Sync action plugins in case they changed since the last time the frame opened
468 GetToolManager()->RunAction( ACTIONS::pluginsReload );
469
470#ifdef KICAD_IPC_API
471 m_apiHandler = std::make_unique<API_HANDLER_PCB>( this );
472 Pgm().GetApiServer().RegisterHandler( m_apiHandler.get() );
473
474 if( Kiface().IsSingle() )
475 {
476 m_apiHandlerCommon = std::make_unique<API_HANDLER_COMMON>();
477 Pgm().GetApiServer().RegisterHandler( m_apiHandlerCommon.get() );
478 }
479#endif
480
481 GetCanvas()->SwitchBackend( m_canvasType );
482 ActivateGalCanvas();
483
484 // Default shutdown reason until a file is loaded
485 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New PCB file is unsaved" ) );
486
487 // disable Export STEP item if kicad2step does not exist
488 wxString strK2S = Pgm().GetExecutablePath();
489
490#ifdef __WXMAC__
491 if( strK2S.Find( wxT( "pcbnew.app" ) ) != wxNOT_FOUND )
492 {
493 // On macOS, we have standalone applications inside the main bundle, so we handle that here:
494 strK2S += wxT( "../../" );
495 }
496
497 strK2S += wxT( "Contents/MacOS/" );
498#endif
499
500 wxFileName appK2S( strK2S, wxT( "kicad2step" ) );
501
502#ifdef _WIN32
503 appK2S.SetExt( wxT( "exe" ) );
504#endif
505
506 // Ensure the window is on top
507 Raise();
508
509// if( !appK2S.FileExists() )
510 // GetMenuBar()->FindItem( ID_GEN_EXPORT_FILE_STEP )->Enable( false );
511
512 // AUI doesn't refresh properly on wxMac after changes in eb7dc6dd, so force it to
513#ifdef __WXMAC__
514 if( Kiface().IsSingle() )
515 {
516 CallAfter( [this]()
517 {
518 m_appearancePanel->OnBoardChanged();
519 } );
520 }
521#endif
522
523 // Register a call to update the toolbar sizes. It can't be done immediately because
524 // it seems to require some sizes calculated that aren't yet (at least on GTK).
525 CallAfter( [this]()
526 {
527 // Ensure the controls on the toolbars all are correctly sized
528 UpdateToolbarControlSizes();
529 } );
530
532 {
533 m_eventCounterTimer = new wxTimer( this );
534
535 Bind( wxEVT_TIMER,
536 [&]( wxTimerEvent& aEvent )
537 {
538 GetCanvas()->m_PaintEventCounter->Show();
539 GetCanvas()->m_PaintEventCounter->Reset();
540
542 static_cast<KIGFX::WX_VIEW_CONTROLS*>( GetCanvas()->GetViewControls() );
543 vc->m_MotionEventCounter->Show();
544 vc->m_MotionEventCounter->Reset();
545
546 },
547 m_eventCounterTimer->GetId() );
548
549 m_eventCounterTimer->Start( 1000 );
550 }
551
552 Bind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs,
553 this );
556 DragAcceptFiles( true );
557}
558
559
561{
563
564 if( ADVANCED_CFG::GetCfg().m_ShowEventCounters )
565 {
566 // Stop the timer during destruction early to avoid potential event race conditions (that
567 // do happen on windows)
568 m_eventCounterTimer->Stop();
569 delete m_eventCounterTimer;
570 }
571
572#ifdef KICAD_IPC_API
573 Pgm().GetApiServer().DeregisterHandler( m_apiHandler.get() );
574 wxTheApp->Unbind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED,
575 &PCB_EDIT_FRAME::onPluginAvailabilityChanged, this );
576#endif
577
578 // Close modeless dialogs
579 wxWindow* open_dlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
580
581 if( open_dlg )
582 open_dlg->Close( true );
583
584 // Shutdown all running tools
585 if( m_toolManager )
587
588 if( GetBoard() )
590
592 delete m_appearancePanel;
594 delete m_propertiesPanel;
595 delete m_netInspectorPanel;
596}
597
598
599void PCB_EDIT_FRAME::SetBoard( BOARD* aBoard, bool aBuildConnectivity,
600 PROGRESS_REPORTER* aReporter )
601{
602 if( m_pcb )
604
605 PCB_BASE_EDIT_FRAME::SetBoard( aBoard, aReporter );
606
607 aBoard->SetProject( &Prj() );
608
609 if( aBuildConnectivity )
610 aBoard->BuildConnectivity();
611
612 // reload the drawing-sheet
613 SetPageSettings( aBoard->GetPageSettings() );
614}
615
616
618{
619 return m_pcb;
620}
621
622
623std::unique_ptr<GRID_HELPER> PCB_EDIT_FRAME::MakeGridHelper()
624{
625 return std::make_unique<PCB_GRID_HELPER>( m_toolManager, GetMagneticItemsSettings() );
626}
627
628
630{
631 /*
632 * While new items being scrolled into the view will get painted, they will only get
633 * annotated with netname instances currently within the view. Subsequent panning will not
634 * draw newly-visible netname instances because the item has already been drawn.
635 *
636 * This routine, fired on idle if the viewport has changed, looks for visible items that
637 * might have multiple netname instances and redraws them. (It does not need to handle pads
638 * and vias because they only ever have a single netname instance drawn on them.)
639 */
640 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() );
641
642 if( !cfg || cfg->m_Display.m_NetNames < 2 )
643 return;
644
645 KIGFX::VIEW* view = GetCanvas()->GetView();
646 BOX2D viewport = view->GetViewport();
647
648 // Inflate to catch most of the track width
649 BOX2I_MINMAX clipbox( BOX2ISafe( viewport.Inflate( pcbIUScale.mmToIU( 2.0 ) ) ) );
650
651 for( PCB_TRACK* track : GetBoard()->Tracks() )
652 {
653 // Don't need to update vias
654 if( track->Type() == PCB_VIA_T )
655 continue;
656
657 // Don't update invisible tracks
658 if( !clipbox.Intersects( BOX2I_MINMAX( track->GetStart(), track->GetEnd() ) ) )
659 continue;
660
661 if( track->ViewGetLOD( GetNetnameLayer( track->GetLayer() ), view ) < view->GetScale() )
662 view->Update( track, KIGFX::REPAINT );
663 }
664}
665
666
667void PCB_EDIT_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
668{
669 PCB_BASE_FRAME::SetPageSettings( aPageSettings );
670
671 // Prepare drawing-sheet template
674 m_pcb->GetProject(),
676 &m_pcb->GetProperties() );
677
678 drawingSheet->SetSheetName( std::string( GetScreenDesc().mb_str() ) );
679 drawingSheet->SetSheetPath( std::string( GetFullScreenDesc().mb_str() ) );
680
681 // A board is not like a schematic having a main page and sub sheets.
682 // So for the drawing sheet, use only the first page option to display items
683 drawingSheet->SetIsFirstPage( true );
684
685 BASE_SCREEN* screen = GetScreen();
686
687 if( screen != nullptr )
688 {
689 drawingSheet->SetPageNumber(TO_UTF8( screen->GetPageNumber() ) );
690 drawingSheet->SetSheetCount( screen->GetPageCount() );
691 }
692
693 if( BOARD* board = GetBoard() )
694 drawingSheet->SetFileName( TO_UTF8( board->GetFileName() ) );
695
696 // PCB_DRAW_PANEL_GAL takes ownership of the drawing-sheet
697 GetCanvas()->SetDrawingSheet( drawingSheet );
698}
699
700
702{
703 return GetScreen() && GetScreen()->IsContentModified();
704}
705
706
708{
709 return m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
710}
711
712
714{
715 // Create the manager and dispatcher & route draw panel events to the dispatcher
718 GetCanvas()->GetViewControls(), config(), this );
719 m_actions = new PCB_ACTIONS();
721
722 // Register tools
755
756 for( TOOL_BASE* tool : m_toolManager->Tools() )
757 {
758 if( PCB_TOOL_BASE* pcbTool = dynamic_cast<PCB_TOOL_BASE*>( tool ) )
759 pcbTool->SetIsBoardEditor( true );
760 }
761
762 // Run the selection tool, it is supposed to be always active
763 m_toolManager->InvokeTool( "pcbnew.InteractiveSelection" );
764}
765
766
768{
770
772 PCB_EDITOR_CONDITIONS cond( this );
773
774 auto undoCond =
775 [ this ] (const SELECTION& aSel )
776 {
778
779 if( drawingTool && drawingTool->GetDrawingMode() != DRAWING_TOOL::MODE::NONE )
780 return true;
781
783
784 if( routerTool && routerTool->RoutingInProgress() )
785 return true;
786
787 return GetUndoCommandCount() > 0;
788 };
789
790 wxASSERT( mgr );
791
792#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
793#define CHECK( x ) ACTION_CONDITIONS().Check( x )
794// clang-format off
795
797 mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) );
799
804 mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) );
805 mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) );
806 mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
807
808 mgr->SetConditions( ACTIONS::cut, ENABLE( cond.HasItems() ) );
809 mgr->SetConditions( ACTIONS::copy, ENABLE( cond.HasItems() ) );
816
817 static const std::vector<KICAD_T> groupTypes = { PCB_GROUP_T, PCB_GENERATOR_T };
818
823
829
830 if( SCRIPTING::IsWxAvailable() )
832
833 auto enableZoneControlCondition =
834 [this] ( const SELECTION& )
835 {
838 };
839
841 ENABLE( enableZoneControlCondition )
842 .Check( cond.ZoneDisplayMode( ZONE_DISPLAY_MODE::SHOW_FILLED ) ) );
844 ENABLE( enableZoneControlCondition )
845 .Check( cond.ZoneDisplayMode( ZONE_DISPLAY_MODE::SHOW_ZONE_OUTLINE ) ) );
847 ENABLE( enableZoneControlCondition )
848 .Check( cond.ZoneDisplayMode( ZONE_DISPLAY_MODE::SHOW_FRACTURE_BORDERS ) ) );
850 ENABLE( enableZoneControlCondition )
851 .Check( cond.ZoneDisplayMode( ZONE_DISPLAY_MODE::SHOW_TRIANGULATION ) ) );
852
854
855 auto constrainedDrawingModeCond =
856 [this]( const SELECTION& )
857 {
859 };
860
861 auto boardFlippedCond =
862 [this]( const SELECTION& )
863 {
864 return GetCanvas() && GetCanvas()->GetView()->IsMirroredX();
865 };
866
867 auto layerManagerCond =
868 [this] ( const SELECTION& )
869 {
870 return LayerManagerShown();
871 };
872
873 auto propertiesCond =
874 [this] ( const SELECTION& )
875 {
876 return PropertiesShown();
877 };
878
879 auto netInspectorCond =
880 [this] ( const SELECTION& )
881 {
882 return NetInspectorShown();
883 };
884
885 auto searchPaneCond =
886 [this] ( const SELECTION& )
887 {
888 return m_auimgr.GetPane( SearchPaneName() ).IsShown();
889 };
890
891 auto highContrastCond =
892 [this] ( const SELECTION& )
893 {
894 return GetDisplayOptions().m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL;
895 };
896
897 auto globalRatsnestCond =
898 [this] (const SELECTION& )
899 {
901 };
902
903 auto curvedRatsnestCond =
904 [this] (const SELECTION& )
905 {
907 };
908
909 auto netHighlightCond =
910 [this]( const SELECTION& )
911 {
913 return !settings->GetHighlightNetCodes().empty();
914 };
915
916 auto enableNetHighlightCond =
917 [this]( const SELECTION& )
918 {
920 return tool && tool->IsNetHighlightSet();
921 };
922
923 mgr->SetConditions( PCB_ACTIONS::toggleHV45Mode, CHECK( constrainedDrawingModeCond ) );
924 mgr->SetConditions( ACTIONS::highContrastMode, CHECK( highContrastCond ) );
925 mgr->SetConditions( PCB_ACTIONS::flipBoard, CHECK( boardFlippedCond ) );
926 mgr->SetConditions( PCB_ACTIONS::showLayersManager, CHECK( layerManagerCond ) );
927 mgr->SetConditions( PCB_ACTIONS::showRatsnest, CHECK( globalRatsnestCond ) );
928 mgr->SetConditions( PCB_ACTIONS::ratsnestLineMode, CHECK( curvedRatsnestCond ) );
929 mgr->SetConditions( PCB_ACTIONS::toggleNetHighlight, CHECK( netHighlightCond )
930 .Enable( enableNetHighlightCond ) );
931 mgr->SetConditions( PCB_ACTIONS::showProperties, CHECK( propertiesCond ) );
932 mgr->SetConditions( PCB_ACTIONS::showNetInspector, CHECK( netInspectorCond ) );
933 mgr->SetConditions( PCB_ACTIONS::showSearch, CHECK( searchPaneCond ) );
934
935 auto isArcKeepCenterMode =
936 [this]( const SELECTION& )
937 {
938 return GetPcbNewSettings()->m_ArcEditMode == ARC_EDIT_MODE::KEEP_CENTER_ADJUST_ANGLE_RADIUS;
939 };
940
941 auto isArcKeepEndpointMode =
942 [this]( const SELECTION& )
943 {
944 return GetPcbNewSettings()->m_ArcEditMode == ARC_EDIT_MODE::KEEP_ENDPOINTS_OR_START_DIRECTION;
945 };
946
947 mgr->SetConditions( PCB_ACTIONS::pointEditorArcKeepCenter, CHECK( isArcKeepCenterMode ) );
948 mgr->SetConditions( PCB_ACTIONS::pointEditorArcKeepEndpoint, CHECK( isArcKeepEndpointMode ) );
949
950 auto isHighlightMode =
951 [this]( const SELECTION& )
952 {
954 return tool && tool->GetRouterMode() == PNS::RM_MarkObstacles;
955 };
956
957 auto isShoveMode =
958 [this]( const SELECTION& )
959 {
961 return tool && tool->GetRouterMode() == PNS::RM_Shove;
962 };
963
964 auto isWalkaroundMode =
965 [this]( const SELECTION& )
966 {
968 return tool && tool->GetRouterMode() == PNS::RM_Walkaround;
969 };
970
971 mgr->SetConditions( PCB_ACTIONS::routerHighlightMode, CHECK( isHighlightMode ) );
972 mgr->SetConditions( PCB_ACTIONS::routerShoveMode, CHECK( isShoveMode ) );
973 mgr->SetConditions( PCB_ACTIONS::routerWalkaroundMode, CHECK( isWalkaroundMode ) );
974
975 auto haveNetCond =
976 [] ( const SELECTION& aSel )
977 {
978 for( EDA_ITEM* item : aSel )
979 {
980 if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
981 {
982 if( bci->GetNetCode() > 0 )
983 return true;
984 }
985 }
986
987 return false;
988 };
989
994
995 static const std::vector<KICAD_T> trackTypes = { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T };
996 static const std::vector<KICAD_T> padOwnerTypes = { PCB_FOOTPRINT_T, PCB_PAD_T };
997 static const std::vector<KICAD_T> footprintTypes = { PCB_FOOTPRINT_T };
998 static const std::vector<KICAD_T> crossProbeTypes = { PCB_PAD_T, PCB_FOOTPRINT_T, PCB_GROUP_T };
999 static const std::vector<KICAD_T> zoneTypes = { PCB_ZONE_T };
1000
1006
1007
1009 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1010
1012 && SELECTION_CONDITIONS::OnlyTypes( zoneTypes );
1013
1014 mgr->SetConditions( PCB_ACTIONS::zoneDuplicate, ENABLE( singleZoneCond ) );
1015 mgr->SetConditions( PCB_ACTIONS::drawZoneCutout, ENABLE( singleZoneCond ) );
1016 mgr->SetConditions( PCB_ACTIONS::drawSimilarZone, ENABLE( singleZoneCond ) );
1017 mgr->SetConditions( PCB_ACTIONS::zoneMerge, ENABLE( zoneMergeCond ) );
1018
1020
1021#define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
1022
1023 // These tools can be used at any time to inspect the board
1028
1029 auto isDRCIdle =
1030 [this] ( const SELECTION& )
1031 {
1033 return !( tool && tool->IsDRCRunning() );
1034 };
1035
1036#define CURRENT_EDIT_TOOL( action ) \
1037 mgr->SetConditions( action, ACTION_CONDITIONS().Check( cond.CurrentTool( action ) ) \
1038 .Enable( isDRCIdle ) )
1039
1040 // These tools edit the board, so they must be disabled during some operations
1070
1076
1077#undef CURRENT_TOOL
1078#undef CURRENT_EDIT_TOOL
1079#undef ENABLE
1080#undef CHECK
1081// clang-format on
1082}
1083
1084
1085void PCB_EDIT_FRAME::OnQuit( wxCommandEvent& event )
1086{
1087 if( event.GetId() == wxID_EXIT )
1088 Kiway().OnKiCadExit();
1089
1090 if( event.GetId() == wxID_CLOSE || Kiface().IsSingle() )
1091 Close( false );
1092}
1093
1094
1095void PCB_EDIT_FRAME::ResolveDRCExclusions( bool aCreateMarkers )
1096{
1097 BOARD_COMMIT commit( this );
1098
1099 for( PCB_MARKER* marker : GetBoard()->ResolveDRCExclusions( aCreateMarkers ) )
1100 {
1101 if( marker->GetMarkerType() == MARKER_BASE::MARKER_DRAWING_SHEET )
1102 marker->GetRCItem()->SetItems( GetCanvas()->GetDrawingSheet() );
1103
1104 commit.Add( marker );
1105 }
1106
1107 commit.Push( wxEmptyString, SKIP_UNDO | SKIP_SET_DIRTY );
1108
1109 for( PCB_MARKER* marker : GetBoard()->Markers() )
1110 {
1111 if( marker->GetSeverity() == RPT_SEVERITY_EXCLUSION )
1112 GetCanvas()->GetView()->Update( marker );
1113 }
1114
1116}
1117
1118
1119bool PCB_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
1120{
1121 // Shutdown blocks must be determined and vetoed as early as possible
1122 if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
1123 && IsContentModified() )
1124 {
1125 return false;
1126 }
1127
1129
1130 if( zoneFillerTool->IsBusy() )
1131 {
1132 wxBell();
1133
1134 if( wxWindow* reporter = dynamic_cast<wxWindow*>( zoneFillerTool->GetProgressReporter() ) )
1135 reporter->ShowWithEffect( wxSHOW_EFFECT_EXPAND );
1136
1137 return false;
1138 }
1139
1140 if( Kiface().IsSingle() )
1141 {
1142 auto* fpEditor = (FOOTPRINT_EDIT_FRAME*) Kiway().Player( FRAME_FOOTPRINT_EDITOR, false );
1143
1144 if( fpEditor && !fpEditor->Close() ) // Can close footprint editor?
1145 return false;
1146
1147 auto* fpViewer = (FOOTPRINT_VIEWER_FRAME*) Kiway().Player( FRAME_FOOTPRINT_VIEWER, false );
1148
1149 if( fpViewer && !fpViewer->Close() ) // Can close footprint viewer?
1150 return false;
1151
1152 // FOOTPRINT_CHOOSER_FRAME is always modal so this shouldn't come up, but better safe than
1153 // sorry.
1154 auto* chooser = (FOOTPRINT_CHOOSER_FRAME*) Kiway().Player( FRAME_FOOTPRINT_CHOOSER, false );
1155
1156 if( chooser && !chooser->Close() ) // Can close footprint chooser?
1157 return false;
1158 }
1159 else
1160 {
1161 auto* fpEditor = (FOOTPRINT_EDIT_FRAME*) Kiway().Player( FRAME_FOOTPRINT_EDITOR, false );
1162
1163 if( fpEditor && fpEditor->IsCurrentFPFromBoard() )
1164 {
1165 if( !fpEditor->CanCloseFPFromBoard( true ) )
1166 return false;
1167 }
1168 }
1169
1170 if( IsContentModified() )
1171 {
1172 wxFileName fileName = GetBoard()->GetFileName();
1173 wxString msg = _( "Save changes to '%s' before closing?" );
1174
1175 if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
1176 [&]() -> bool
1177 {
1178 return Files_io_from_id( ID_SAVE_BOARD );
1179 } ) )
1180 {
1181 return false;
1182 }
1183 }
1184
1185 return PCB_BASE_EDIT_FRAME::canCloseWindow( aEvent );
1186}
1187
1188
1190{
1191 // On Windows 7 / 32 bits, on OpenGL mode only, Pcbnew crashes
1192 // when closing this frame if a footprint was selected, and the footprint editor called
1193 // to edit this footprint, and when closing pcbnew if this footprint is still selected
1194 // See https://bugs.launchpad.net/kicad/+bug/1655858
1195 // I think this is certainly a OpenGL event fired after frame deletion, so this workaround
1196 // avoid the crash (JPC)
1197 GetCanvas()->SetEvtHandlerEnabled( false );
1198
1200
1201 // Clean up mode-less dialogs.
1202 Unbind( EDA_EVT_CLOSE_DIALOG_BOOK_REPORTER, &PCB_EDIT_FRAME::onCloseModelessBookReporterDialogs,
1203 this );
1204
1205 wxWindow* open_dlg = wxWindow::FindWindowByName( DIALOG_DRC_WINDOW_NAME );
1206
1207 if( open_dlg )
1208 open_dlg->Close( true );
1209
1210 if( m_findDialog )
1211 {
1212 m_findDialog->Destroy();
1213 m_findDialog = nullptr;
1214 }
1215
1217 {
1218 m_inspectDrcErrorDlg->Destroy();
1219 m_inspectDrcErrorDlg = nullptr;
1220 }
1221
1223 {
1224 m_inspectClearanceDlg->Destroy();
1225 m_inspectClearanceDlg = nullptr;
1226 }
1227
1229 {
1230 m_inspectConstraintsDlg->Destroy();
1231 m_inspectConstraintsDlg = nullptr;
1232 }
1233
1234 if( m_footprintDiffDlg )
1235 {
1236 m_footprintDiffDlg->Destroy();
1237 m_footprintDiffDlg = nullptr;
1238 }
1239
1240 // Delete the auto save file if it exists.
1241 wxFileName fn = GetBoard()->GetFileName();
1242
1243 // Auto save file name is the normal file name prefixed with 'FILEEXT::AutoSaveFilePrefix'.
1244 fn.SetName( FILEEXT::AutoSaveFilePrefix + fn.GetName() );
1245
1246 // When the auto save feature does not have write access to the board file path, it falls
1247 // back to a platform specific user temporary file path.
1248 if( !fn.IsOk() || !fn.IsDirWritable() )
1249 fn.SetPath( wxFileName::GetTempDir() );
1250
1251 wxLogTrace( traceAutoSave, wxT( "Deleting auto save file <" ) + fn.GetFullPath() + wxT( ">" ) );
1252
1253 // Remove the auto save file on a normal close of Pcbnew.
1254 if( fn.FileExists() && !wxRemoveFile( fn.GetFullPath() ) )
1255 {
1256 wxLogTrace( traceAutoSave, wxT( "The auto save file could not be removed!" ) );
1257 }
1258
1259 // Make sure local settings are persisted
1261
1262 // Do not show the layer manager during closing to avoid flicker
1263 // on some platforms (Windows) that generate useless redraw of items in
1264 // the Layer Manager
1266 {
1267 m_auimgr.GetPane( wxS( "LayersManager" ) ).Show( false );
1268 m_auimgr.GetPane( wxS( "TabbedPanel" ) ).Show( false );
1269 }
1270
1271 // Unlink the old project if needed
1273
1274 // Delete board structs and undo/redo lists, to avoid crash on exit
1275 // when deleting some structs (mainly in undo/redo lists) too late
1276 Clear_Pcb( false, true );
1277
1278 // do not show the window because ScreenPcb will be deleted and we do not
1279 // want any paint event
1280 Show( false );
1281
1283}
1284
1285
1287{
1290 GetCanvas()->Refresh();
1291}
1292
1293
1294void PCB_EDIT_FRAME::ShowBoardSetupDialog( const wxString& aInitialPage )
1295{
1296 static std::mutex dialogMutex; // Local static mutex
1297
1298 std::unique_lock<std::mutex> dialogLock( dialogMutex, std::try_to_lock );
1299
1300 // One dialog at a time.
1301 if( !dialogLock.owns_lock() )
1302 {
1303 if( m_boardSetupDlg && m_boardSetupDlg->IsShown() )
1304 {
1305 m_boardSetupDlg->Raise(); // Brings the existing dialog to the front
1306 }
1307
1308 return;
1309 }
1310
1311 // Make sure everything's up-to-date
1313
1314 DIALOG_BOARD_SETUP dlg( this );
1315
1316 if( !aInitialPage.IsEmpty() )
1317 dlg.SetInitialPage( aInitialPage, wxEmptyString );
1318
1319 // Assign dlg to the m_boardSetupDlg pointer to track its status.
1320 m_boardSetupDlg = &dlg;
1321
1322 // QuasiModal required for Scintilla auto-complete
1323 if( dlg.ShowQuasiModal() == wxID_OK )
1324 {
1326 // We don't know if anything was modified, so err on the side of requiring a save
1327 OnModify();
1328
1329 Kiway().CommonSettingsChanged( false, true );
1330
1333
1334 PCBNEW_SETTINGS* settings = GetPcbNewSettings();
1335 static LSET maskAndPasteLayers = LSET( { F_Mask, F_Paste, B_Mask, B_Paste } );
1336
1338 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1339 {
1340 int flags = 0;
1341
1342 if( !aItem->IsBOARD_ITEM() )
1343 return flags;
1344
1345 BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
1346
1347 if( item->Type() == PCB_VIA_T || item->Type() == PCB_PAD_T )
1348 {
1349 // Note: KIGFX::REPAINT isn't enough for things that go from invisible
1350 // to visible as they won't be found in the view layer's itemset for
1351 // re-painting.
1352 if( ( GetBoard()->GetVisibleLayers() & maskAndPasteLayers ).any() )
1353 flags |= KIGFX::ALL;
1354 }
1355
1356 if( item->Type() == PCB_TRACE_T || item->Type() == PCB_ARC_T || item->Type() == PCB_VIA_T )
1357 {
1358 if( settings->m_Display.m_TrackClearance == SHOW_WITH_VIA_ALWAYS )
1359 flags |= KIGFX::REPAINT;
1360 }
1361
1362 if( item->Type() == PCB_PAD_T )
1363 {
1364 if( settings->m_Display.m_PadClearance )
1365 flags |= KIGFX::REPAINT;
1366 }
1367
1368 EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem );
1369
1370 if( text && text->HasTextVars() )
1371 {
1372 text->ClearRenderCache();
1373 text->ClearBoundingBoxCache();
1374 flags |= KIGFX::GEOMETRY | KIGFX::REPAINT;
1375 }
1376
1377 return flags;
1378 } );
1379
1380 GetCanvas()->Refresh();
1381
1385
1386 //this event causes the routing tool to reload its design rules information
1388 toolEvent.SetHasPosition( false );
1389 m_toolManager->ProcessEvent( toolEvent );
1390 }
1391
1392 GetCanvas()->SetFocus();
1393
1394 // Reset m_boardSetupDlg after the dialog is closed
1395 m_boardSetupDlg = nullptr;
1396}
1397
1398
1400{
1402
1403 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
1404 wxASSERT( cfg );
1405
1406 if( cfg )
1407 {
1411 }
1412}
1413
1414
1416{
1418
1419 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
1420 wxASSERT( cfg );
1421
1422 if( cfg )
1423 {
1425
1426 if( m_propertiesPanel )
1427 {
1428 cfg->m_AuiPanels.show_properties = m_propertiesPanel->IsShownOnScreen();
1431 }
1432
1433 // ensure m_show_search is up to date (the pane can be closed)
1434 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
1435 m_show_search = searchPaneInfo.IsShown();
1437 cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
1438 cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
1439 cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
1440
1442 {
1443 wxAuiPaneInfo& netInspectorhPaneInfo = m_auimgr.GetPane( NetInspectorPanelName() );
1444 m_show_net_inspector = netInspectorhPaneInfo.IsShown();
1446 }
1447
1448 if( m_appearancePanel )
1449 {
1454 }
1455 }
1456}
1457
1458
1460{
1461 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( config() );
1462
1463 return cfg ? cfg->m_RotationAngle : ANGLE_90;
1464}
1465
1466
1468{
1470}
1471
1472
1474{
1475
1476 GetColorSettings()->SetColor( LAYER_GRID, aColor );
1477 GetCanvas()->GetGAL()->SetGridColor( aColor );
1478}
1479
1480
1482{
1483 PCB_LAYER_ID oldLayer = GetActiveLayer();
1484
1485 if( oldLayer == aLayer )
1486 return;
1487
1489
1491
1492 m_toolManager->PostAction( PCB_ACTIONS::layerChanged ); // notify other tools
1493 GetCanvas()->SetFocus(); // allow capture of hotkeys
1494 GetCanvas()->SetHighContrastLayer( aLayer );
1495
1497 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1498 {
1499 if( !aItem->IsBOARD_ITEM() )
1500 return 0;
1501
1502 BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aItem );
1503
1504 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible
1505 // as they won't be found in the view layer's itemset for re-painting.
1506 if( GetDisplayOptions().m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN )
1507 {
1508 if( item->IsOnLayer( oldLayer ) || item->IsOnLayer( aLayer ) )
1509 return KIGFX::ALL;
1510 }
1511
1512 if( item->Type() == PCB_VIA_T )
1513 {
1514 PCB_VIA* via = static_cast<PCB_VIA*>( item );
1515
1516 // Vias on a restricted layer set must be redrawn when the active layer
1517 // is changed
1518 if( via->GetViaType() == VIATYPE::BLIND_BURIED
1519 || via->GetViaType() == VIATYPE::MICROVIA )
1520 {
1521 return KIGFX::REPAINT;
1522 }
1523
1524 if( via->GetRemoveUnconnected() )
1525 return KIGFX::ALL;
1526
1527 // Clearances could be layer-dependent so redraw them when the active layer
1528 // is changed
1529 if( GetPcbNewSettings()->m_Display.m_TrackClearance == SHOW_WITH_VIA_ALWAYS )
1530 return KIGFX::REPAINT;
1531 }
1532 else if( item->Type() == PCB_PAD_T )
1533 {
1534 PAD* pad = static_cast<PAD*>( item );
1535
1536 if( pad->GetRemoveUnconnected() )
1537 return KIGFX::ALL;
1538
1539 // Clearances could be layer-dependent so redraw them when the active layer
1540 // is changed
1541 if( GetPcbNewSettings()->m_Display.m_PadClearance )
1542 {
1543 // Round-corner rects are expensive to draw, but are mostly found on
1544 // SMD pads which only need redrawing on an active-to-not-active
1545 // switch.
1546 if( pad->GetAttribute() == PAD_ATTRIB::SMD )
1547 {
1548 if( ( oldLayer == F_Cu || aLayer == F_Cu ) && pad->IsOnLayer( F_Cu ) )
1549 return KIGFX::REPAINT;
1550
1551 if( ( oldLayer == B_Cu || aLayer == B_Cu ) && pad->IsOnLayer( B_Cu ) )
1552 return KIGFX::REPAINT;
1553 }
1554 else if( pad->IsOnLayer( oldLayer ) || pad->IsOnLayer( aLayer ) )
1555 {
1556 return KIGFX::REPAINT;
1557 }
1558 }
1559 }
1560 else if( item->Type() == PCB_TRACE_T || item->Type() == PCB_ARC_T )
1561 {
1562 PCB_TRACK* track = static_cast<PCB_TRACK*>( item );
1563
1564 // Clearances could be layer-dependent so redraw them when the active layer
1565 // is changed
1566 if( GetPcbNewSettings()->m_Display.m_TrackClearance )
1567 {
1568 // Tracks aren't particularly expensive to draw, but it's an easy check.
1569 if( track->IsOnLayer( oldLayer ) || track->IsOnLayer( aLayer ) )
1570 return KIGFX::REPAINT;
1571 }
1572 }
1573
1574 return 0;
1575 } );
1576
1577 GetCanvas()->Refresh();
1578}
1579
1580
1582{
1584
1585 layerEnum.Choices().Clear();
1586 layerEnum.Undefined( UNDEFINED_LAYER );
1587
1588 for( PCB_LAYER_ID layer : LSET::AllLayersMask().Seq() )
1589 {
1590 // Canonical name
1591 layerEnum.Map( layer, LSET::Name( layer ) );
1592
1593 // User name
1594 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
1595 }
1596
1597 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
1598
1599 try
1600 {
1601 drcTool->GetDRCEngine()->InitEngine( GetDesignRulesPath() );
1602 }
1603 catch( PARSE_ERROR& )
1604 {
1605 // Not sure this is the best place to tell the user their rules are buggy, so
1606 // we'll stay quiet for now. Feel free to revisit this decision....
1607 }
1608
1609 UpdateTitle();
1610
1611 wxFileName fn = GetBoard()->GetFileName();
1612
1613 // Display a warning that the file is read only
1614 if( fn.FileExists() && !fn.IsFileWritable() )
1615 {
1618 m_infoBar->ShowMessage( _( "Board file is read only." ),
1620 }
1621
1623
1624 // Sync layer and item visibility
1626
1627 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
1628
1630
1631 // Apply saved display state to the appearance panel after it has been set up
1632 PROJECT_LOCAL_SETTINGS& localSettings = Prj().GetLocalSettings();
1633
1635
1636 if( GetBoard()->GetDesignSettings().IsLayerEnabled( localSettings.m_ActiveLayer ) )
1637 SetActiveLayer( localSettings.m_ActiveLayer );
1638
1639 PROJECT_FILE& projectFile = Prj().GetProjectFile();
1640
1641 m_layerPairSettings->SetLayerPairs( projectFile.m_LayerPairInfos );
1642 m_layerPairSettings->SetCurrentLayerPair( LAYER_PAIR{ F_Cu, B_Cu } );
1643
1644 // Updates any auto dimensions and the auxiliary toolbar tracks/via sizes
1646
1647 // Sync the net inspector now we have connectivity calculated
1650
1651 // Display the loaded board:
1652 Zoom_Automatique( false );
1653
1654 // Invalidate painting as loading the DRC engine will cause clearances to become valid
1656
1657 Refresh();
1658
1659 SetMsgPanel( GetBoard() );
1660 SetStatusText( wxEmptyString );
1661
1662 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "PCB file changes are unsaved" ) );
1663}
1664
1665
1667{
1669}
1670
1671
1673{
1674 return GetBoard()->IsElementVisible( aElement );
1675}
1676
1677
1679{
1680 // Force the RATSNEST visible
1681 if( aElement == LAYER_RATSNEST )
1682 GetCanvas()->GetView()->SetLayerVisible( aElement, true );
1683 else
1684 GetCanvas()->GetView()->SetLayerVisible( aElement , aNewState );
1685
1686 GetBoard()->SetElementVisibility( aElement, aNewState );
1687}
1688
1689
1691{
1692 // call my base class
1694
1695 m_auimgr.GetPane( m_appearancePanel ).Caption( _( "Appearance" ) );
1696 m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
1697 m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
1698 m_auimgr.GetPane( m_netInspectorPanel ).Caption( _( "Net Inspector" ) );
1699 m_auimgr.Update();
1700
1701 UpdateTitle();
1702}
1703
1704
1706{
1708
1709 if( project.m_PcbLastPath[ aType ].IsEmpty() )
1710 return wxEmptyString;
1711
1712 wxFileName absoluteFileName = project.m_PcbLastPath[ aType ];
1713 wxFileName pcbFileName = GetBoard()->GetFileName();
1714
1715 absoluteFileName.MakeAbsolute( pcbFileName.GetPath() );
1716 return absoluteFileName.GetFullPath();
1717}
1718
1719
1720void PCB_EDIT_FRAME::SetLastPath( LAST_PATH_TYPE aType, const wxString& aLastPath )
1721{
1723
1724 wxFileName relativeFileName = aLastPath;
1725 wxFileName pcbFileName = GetBoard()->GetFileName();
1726
1727 relativeFileName.MakeRelativeTo( pcbFileName.GetPath() );
1728
1729 if( relativeFileName.GetFullPath() != project.m_PcbLastPath[ aType ] )
1730 {
1731 project.m_PcbLastPath[ aType ] = relativeFileName.GetFullPath();
1732 OnModify();
1733 }
1734}
1735
1736
1738{
1740
1741 Update3DView( true, GetPcbNewSettings()->m_Display.m_Live3DRefresh );
1742
1743 if( !GetTitle().StartsWith( wxT( "*" ) ) )
1744 UpdateTitle();
1745
1746 m_ZoneFillsDirty = true;
1747}
1748
1749
1751{
1752 Update3DView( true, true );
1753
1754 std::shared_ptr<CONNECTIVITY_DATA> connectivity = GetBoard()->GetConnectivity();
1755 connectivity->RecalculateRatsnest( nullptr );
1757
1758 std::vector<MSG_PANEL_ITEM> msg_list;
1759 GetBoard()->GetMsgPanelInfo( this, msg_list );
1760 SetMsgPanel( msg_list );
1761}
1762
1763
1764void PCB_EDIT_FRAME::ExportSVG( wxCommandEvent& event )
1765{
1766 InvokeExportSVG( this, GetBoard() );
1767}
1768
1769
1771{
1772 wxFileName fn = GetBoard()->GetFileName();
1773 bool readOnly = false;
1774 bool unsaved = false;
1775
1776 if( fn.IsOk() && fn.FileExists() )
1777 readOnly = !fn.IsFileWritable();
1778 else
1779 unsaved = true;
1780
1781 wxString title;
1782
1783 if( IsContentModified() )
1784 title = wxT( "*" );
1785
1786 title += fn.GetName();
1787
1788 if( readOnly )
1789 title += wxS( " " ) + _( "[Read Only]" );
1790
1791 if( unsaved )
1792 title += wxS( " " ) + _( "[Unsaved]" );
1793
1794 title += wxT( " \u2014 " ) + _( "PCB Editor" );
1795
1796 SetTitle( title );
1797}
1798
1799
1801{
1802 // Update the layer manager and other widgets from the board setup
1803 // (layer and items visibility, colors ...)
1804
1805 // Rebuild list of nets (full ratsnest rebuild)
1807
1808 // Update info shown by the horizontal toolbars
1810
1811 LSET activeLayers = GetBoard()->GetEnabledLayers();
1812
1813 if( !activeLayers.test( GetActiveLayer() ) )
1814 SetActiveLayer( activeLayers.Seq().front() );
1815
1817
1819
1820 layerEnum.Choices().Clear();
1821 layerEnum.Undefined( UNDEFINED_LAYER );
1822
1823 for( PCB_LAYER_ID layer : LSET::AllLayersMask().Seq() )
1824 {
1825 // Canonical name
1826 layerEnum.Map( layer, LSET::Name( layer ) );
1827
1828 // User name
1829 layerEnum.Map( layer, GetBoard()->GetLayerName( layer ) );
1830 }
1831
1832 // Sync visibility with canvas
1833 for( PCB_LAYER_ID layer : LSET::AllLayersMask().Seq() )
1834 GetCanvas()->GetView()->SetLayerVisible( layer, GetBoard()->IsLayerVisible( layer ) );
1835
1836 // Stackup and/or color theme may have changed
1839}
1840
1841
1843{
1844 // switches currently used canvas (Cairo / OpenGL).
1845 PCB_BASE_FRAME::SwitchCanvas( aCanvasType );
1846}
1847
1848
1850{
1851 if( !m_findDialog )
1852 {
1853 m_findDialog = new DIALOG_FIND( this );
1856 }
1857
1858 wxString findString;
1859
1860 PCB_SELECTION& selection = m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
1861
1862 if( selection.Size() == 1 )
1863 {
1864 EDA_ITEM* front = selection.Front();
1865
1866 switch( front->Type() )
1867 {
1868 case PCB_FOOTPRINT_T:
1869 findString = UnescapeString( static_cast<FOOTPRINT*>( front )->GetValue() );
1870 break;
1871
1872 case PCB_FIELD_T:
1873 case PCB_TEXT_T:
1874 findString = UnescapeString( static_cast<PCB_TEXT*>( front )->GetText() );
1875
1876 if( findString.Contains( wxT( "\n" ) ) )
1877 findString = findString.Before( '\n' );
1878
1879 break;
1880
1881 default:
1882 break;
1883 }
1884 }
1885
1886 m_findDialog->Preload( findString );
1887
1888 m_findDialog->Show( true );
1889}
1890
1891
1892void PCB_EDIT_FRAME::FindNext( bool reverse )
1893{
1894 if( !m_findDialog )
1896
1897 m_findDialog->FindNext( reverse );
1898}
1899
1900
1902{
1903 PCB_PLOT_PARAMS plotSettings = GetPlotSettings();
1904
1905 switch( aID )
1906 {
1907 case ID_GEN_PLOT_GERBER:
1908 plotSettings.SetFormat( PLOT_FORMAT::GERBER );
1909 break;
1910 case ID_GEN_PLOT_DXF:
1911 plotSettings.SetFormat( PLOT_FORMAT::DXF );
1912 break;
1913 case ID_GEN_PLOT_HPGL:
1914 plotSettings.SetFormat( PLOT_FORMAT::HPGL );
1915 break;
1916 case ID_GEN_PLOT_PDF:
1917 plotSettings.SetFormat( PLOT_FORMAT::PDF );
1918 break;
1919 case ID_GEN_PLOT_PS:
1920 plotSettings.SetFormat( PLOT_FORMAT::POST );
1921 break;
1922 case ID_GEN_PLOT:
1923 /* keep the previous setup */
1924 break;
1925 default:
1926 wxFAIL_MSG( wxT( "ToPlotter(): unexpected plot type" ) ); break;
1927 break;
1928 }
1929
1930 SetPlotSettings( plotSettings );
1931
1932 DIALOG_PLOT dlg( this );
1933 dlg.ShowQuasiModal( );
1934}
1935
1936
1938{
1939 if( Kiface().IsSingle() )
1940 return 0;
1941
1942 // Update PCB requires a netlist. Therefore the schematic editor must be running
1943 // If this is not the case, open the schematic editor
1944 KIWAY_PLAYER* frame = Kiway().Player( FRAME_SCH, true );
1945
1946 // If Kiway() cannot create the eeschema frame, it shows a error message, and
1947 // frame is null
1948 if( !frame )
1949 return -1;
1950
1951 if( !frame->IsShownOnScreen() )
1952 {
1953 wxEventBlocker blocker( this );
1954 wxFileName fn( Prj().GetProjectPath(), Prj().GetProjectName(),
1956
1957 // Maybe the file hasn't been converted to the new s-expression file format so
1958 // see if the legacy schematic file is still in play.
1959 if( !fn.FileExists() )
1960 {
1962
1963 if( !fn.FileExists() )
1964 {
1965 DisplayErrorMessage( this, _( "The schematic for this board cannot be found." ) );
1966 return -2;
1967 }
1968 }
1969
1970 frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
1971
1972 // we show the schematic editor frame, because do not show is seen as
1973 // a not yet opened schematic by Kicad manager, which is not the case
1974 frame->Show( true );
1975
1976 // bring ourselves back to the front
1977 Raise();
1978 }
1979
1980 return 1; //Success!
1981}
1982
1983
1985 const wxString& aAnnotateMessage )
1986{
1987 int standalone = TestStandalone();
1988
1989 if( standalone == 0 )
1990 {
1991 DisplayErrorMessage( this, _( "Cannot update the PCB because PCB editor is opened in "
1992 "stand-alone mode. In order to create or update PCBs from "
1993 "schematics, you must launch the KiCad project manager and "
1994 "create a project." ) );
1995 return false; // Not in standalone mode
1996 }
1997
1998 if( standalone < 0 ) // Problem with Eeschema or the schematic
1999 return false;
2000
2001 Raise(); // Show
2002
2003 std::string payload( aAnnotateMessage );
2004
2005 Kiway().ExpressMail( FRAME_SCH, MAIL_SCH_GET_NETLIST, payload, this );
2006
2007 if( payload == aAnnotateMessage )
2008 {
2009 Raise();
2010 DisplayErrorMessage( this, aAnnotateMessage );
2011 return false;
2012 }
2013
2014 try
2015 {
2016 auto lineReader = new STRING_LINE_READER( payload, _( "Eeschema netlist" ) );
2017 KICAD_NETLIST_READER netlistReader( lineReader, &aNetlist );
2018 netlistReader.LoadNetlist();
2019 }
2020 catch( const IO_ERROR& e )
2021 {
2022 Raise();
2023
2024 // Do not translate extra_info strings. These are for developers
2025 wxString extra_info = e.Problem() + wxT( " : " ) + e.What() + wxT( " at " ) + e.Where();
2026
2027 DisplayErrorMessage( this, _( "Received an error while reading netlist. Please "
2028 "report this issue to the KiCad team using the menu "
2029 "Help->Report Bug."), extra_info );
2030 return false;
2031 }
2032
2033 return true;
2034}
2035
2036
2038{
2039 wxString msg;
2040 wxFileName schematic( Prj().GetProjectPath(), Prj().GetProjectName(),
2042
2043 if( !schematic.FileExists() )
2044 {
2045 wxFileName legacySchematic( Prj().GetProjectPath(), Prj().GetProjectName(),
2047
2048 if( legacySchematic.FileExists() )
2049 {
2050 schematic = legacySchematic;
2051 }
2052 else
2053 {
2054 msg.Printf( _( "Schematic file '%s' not found." ), schematic.GetFullPath() );
2055 DisplayErrorMessage( this, msg );
2056 return;
2057 }
2058 }
2059
2060 if( Kiface().IsSingle() )
2061 {
2062 ExecuteFile( EESCHEMA_EXE, schematic.GetFullPath() );
2063 }
2064 else
2065 {
2066 KIWAY_PLAYER* frame = Kiway().Player( FRAME_SCH, false );
2067
2068 // Please: note: DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::initBuffers() calls
2069 // Kiway.Player( FRAME_SCH, true )
2070 // therefore, the schematic editor is sometimes running, but the schematic project
2071 // is not loaded, if the library editor was called, and the dialog field editor was used.
2072 // On Linux, it happens the first time the schematic editor is launched, if
2073 // library editor was running, and the dialog field editor was open
2074 // On Windows, it happens always after the library editor was called,
2075 // and the dialog field editor was used
2076 if( !frame )
2077 {
2078 try
2079 {
2080 frame = Kiway().Player( FRAME_SCH, true );
2081 }
2082 catch( const IO_ERROR& err )
2083 {
2084
2085 DisplayErrorMessage( this, _( "Eeschema failed to load." ) + wxS( "\n" ) + err.What() );
2086 return;
2087 }
2088 }
2089
2090 wxEventBlocker blocker( this );
2091
2092 // If Kiway() cannot create the eeschema frame, it shows a error message, and
2093 // frame is null
2094 if( !frame )
2095 return;
2096
2097 if( !frame->IsShownOnScreen() ) // the frame exists, (created by the dialog field editor)
2098 // but no project loaded.
2099 {
2100 frame->OpenProjectFiles( std::vector<wxString>( 1, schematic.GetFullPath() ) );
2101 frame->Show( true );
2102 }
2103
2104 // On Windows, Raise() does not bring the window on screen, when iconized or not shown
2105 // On Linux, Raise() brings the window on screen, but this code works fine
2106 if( frame->IsIconized() )
2107 {
2108 frame->Iconize( false );
2109
2110 // If an iconized frame was created by Pcbnew, Iconize( false ) is not enough
2111 // to show the frame at its normal size: Maximize should be called.
2112 frame->Maximize( false );
2113 }
2114
2115 frame->Raise();
2116 }
2117}
2118
2119
2121{
2122 const ENV_VAR_MAP& vars = Pgm().GetLocalEnvVariables();
2123
2124 // Set the environment variables for python scripts
2125 // note: the string will be encoded UTF8 for python env
2126 for( const std::pair<const wxString, ENV_VAR_ITEM>& var : vars )
2127 UpdatePythonEnvVar( var.first, var.second.GetValue() );
2128
2129 // Because the env vars can be modified by the python scripts (rewritten in UTF8),
2130 // regenerate them (in Unicode) for our normal environment
2131 for( const std::pair<const wxString, ENV_VAR_ITEM>& var : vars )
2132 wxSetEnv( var.first, var.second.GetValue() );
2133}
2134
2135
2137{
2138 wxString evValue;
2139 wxGetEnv( PROJECT_VAR_NAME, &evValue );
2140 UpdatePythonEnvVar( wxString( PROJECT_VAR_NAME ).ToStdString(), evValue );
2141
2142 // Because PROJECT_VAR_NAME can be modified by the python scripts (rewritten in UTF8),
2143 // regenerate it (in Unicode) for our normal environment
2144 wxSetEnv( PROJECT_VAR_NAME, evValue );
2145}
2146
2147
2149{
2150 if( aFootprint == nullptr )
2151 return;
2152
2154
2155 /*
2156 * Make sure dlg is destroyed before GetCanvas->Refresh is called
2157 * later or the refresh will try to modify its properties since
2158 * they share a GL context.
2159 */
2160 {
2161 DIALOG_FOOTPRINT_PROPERTIES dlg( this, aFootprint );
2162
2163 dlg.ShowModal();
2164 retvalue = dlg.GetReturnValue();
2165 }
2166
2167 /*
2168 * retvalue =
2169 * FP_PROPS_UPDATE_FP to show Update Footprints dialog
2170 * FP_PROPS_CHANGE_FP to show Change Footprints dialog
2171 * FP_PROPS_OK for normal edit
2172 * FP_PROPS_CANCEL if aborted
2173 * FP_PROPS_EDIT_BOARD_FP to load board footprint into Footprint Editor
2174 * FP_PROPS_EDIT_LIBRARY_FP to load library footprint into Footprint Editor
2175 */
2176
2178 {
2179 // If something edited, push a refresh request
2180 GetCanvas()->Refresh();
2181 }
2183 {
2184 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2185 {
2186 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2187
2188 fp_editor->LoadFootprintFromBoard( aFootprint );
2189 fp_editor->Show( true );
2190 fp_editor->Raise(); // Iconize( false );
2191 }
2192 }
2194 {
2195 if( KIWAY_PLAYER* frame = Kiway().Player( FRAME_FOOTPRINT_EDITOR, true ) )
2196 {
2197 FOOTPRINT_EDIT_FRAME* fp_editor = static_cast<FOOTPRINT_EDIT_FRAME*>( frame );
2198
2199 fp_editor->LoadFootprintFromLibrary( aFootprint->GetFPID() );
2200 fp_editor->Show( true );
2201 fp_editor->Raise(); // Iconize( false );
2202 }
2203 }
2205 {
2206 ShowExchangeFootprintsDialog( aFootprint, true, true );
2207 }
2209 {
2210 ShowExchangeFootprintsDialog( aFootprint, false, true );
2211 }
2212}
2213
2214
2216 bool aSelectedMode )
2217{
2218 DIALOG_EXCHANGE_FOOTPRINTS dialog( this, aFootprint, aUpdateMode, aSelectedMode );
2219
2220 return dialog.ShowQuasiModal();
2221}
2222
2223
2235static void processTextItem( const PCB_TEXT& aSrc, PCB_TEXT& aDest,
2236 bool aResetText, bool aResetTextLayers, bool aResetTextEffects,
2237 bool* aUpdated )
2238{
2239 if( aResetText )
2240 *aUpdated |= aSrc.GetText() != aDest.GetText();
2241 else
2242 aDest.SetText( aSrc.GetText() );
2243
2244 if( aResetTextLayers )
2245 {
2246 *aUpdated |= aSrc.GetLayer() != aDest.GetLayer();
2247 *aUpdated |= aSrc.IsVisible() != aDest.IsVisible();
2248 }
2249 else
2250 {
2251 aDest.SetLayer( aSrc.GetLayer() );
2252 aDest.SetVisible( aSrc.IsVisible() );
2253 }
2254
2255 if( aResetTextEffects )
2256 {
2257 *aUpdated |= aSrc.GetHorizJustify() != aDest.GetHorizJustify();
2258 *aUpdated |= aSrc.GetVertJustify() != aDest.GetVertJustify();
2259 *aUpdated |= aSrc.GetTextSize() != aDest.GetTextSize();
2260 *aUpdated |= aSrc.GetTextThickness() != aDest.GetTextThickness();
2261 *aUpdated |= aSrc.GetTextAngle() != aDest.GetTextAngle();
2262 *aUpdated |= aSrc.GetFPRelativePosition() != aDest.GetFPRelativePosition();
2263 }
2264 else
2265 {
2266 // Careful: the visible bit and position are also set by SetAttributes()
2267 bool visible = aDest.IsVisible();
2268 aDest.SetAttributes( aSrc );
2269 aDest.SetVisible( visible );
2271 }
2272
2273 aDest.SetLocked( aSrc.IsLocked() );
2274 const_cast<KIID&>( aDest.m_Uuid ) = aSrc.m_Uuid;
2275}
2276
2277
2278static PCB_TEXT* getMatchingTextItem( PCB_TEXT* aRefItem, FOOTPRINT* aFootprint )
2279{
2280 std::vector<PCB_TEXT*> candidates;
2281
2282 for( BOARD_ITEM* item : aFootprint->GraphicalItems() )
2283 {
2284 PCB_TEXT* candidate = dynamic_cast<PCB_TEXT*>( item );
2285
2286 if( candidate && candidate->GetText() == aRefItem->GetText() )
2287 candidates.push_back( candidate );
2288 }
2289
2290 if( candidates.size() == 0 )
2291 return nullptr;
2292
2293 if( candidates.size() == 1 )
2294 return candidates[0];
2295
2296 // Try refining the match by layer
2297 std::vector<PCB_TEXT*> candidatesOnSameLayer;
2298
2299 for( PCB_TEXT* candidate : candidates )
2300 {
2301 if( candidate->GetLayer() == aRefItem->GetLayer() )
2302 candidatesOnSameLayer.push_back( candidate );
2303 }
2304
2305 if( candidatesOnSameLayer.size() == 1 )
2306 return candidatesOnSameLayer[0];
2307
2308 // Last ditch effort: refine by position
2309 std::vector<PCB_TEXT*> candidatesAtSamePos;
2310
2311 for( PCB_TEXT* candidate : candidatesOnSameLayer.size() ? candidatesOnSameLayer : candidates )
2312 {
2313 if( candidate->GetFPRelativePosition() == aRefItem->GetFPRelativePosition() )
2314 candidatesAtSamePos.push_back( candidate );
2315 }
2316
2317 if( candidatesAtSamePos.size() > 0 )
2318 return candidatesAtSamePos[0];
2319 else if( candidatesOnSameLayer.size() > 0 )
2320 return candidatesOnSameLayer[0];
2321 else
2322 return candidates[0];
2323}
2324
2325
2327 BOARD_COMMIT& aCommit, bool deleteExtraTexts,
2328 bool resetTextLayers, bool resetTextEffects,
2329 bool resetTextContent, bool resetFabricationAttrs,
2330 bool reset3DModels, bool* aUpdated )
2331{
2332 PCB_GROUP* parentGroup = aExisting->GetParentGroup();
2333 bool dummyBool = false;
2334
2335 if( !aUpdated )
2336 aUpdated = &dummyBool;
2337
2338 if( parentGroup )
2339 {
2340 parentGroup->RemoveItem( aExisting );
2341 parentGroup->AddItem( aNew );
2342 }
2343
2344 aNew->SetParent( GetBoard() );
2345
2346 PlaceFootprint( aNew, false );
2347
2348 // PlaceFootprint will move the footprint to the cursor position, which we don't want. Copy
2349 // the original position across.
2350 aNew->SetPosition( aExisting->GetPosition() );
2351
2352 if( aNew->GetLayer() != aExisting->GetLayer() )
2353 aNew->Flip( aNew->GetPosition(), GetPcbNewSettings()->m_FlipDirection );
2354
2355 if( aNew->GetOrientation() != aExisting->GetOrientation() )
2356 aNew->SetOrientation( aExisting->GetOrientation() );
2357
2358 aNew->SetLocked( aExisting->IsLocked() );
2359
2360 // Now transfer the net info from "old" pads to the new footprint
2361 for( PAD* newPad : aNew->Pads() )
2362 {
2363 PAD* oldPad = nullptr;
2364
2365 // Pads with no numbers can't be matched. (Then again, they're never connected to a
2366 // net either, so it's just the UUID retention that we can't perform.)
2367 if( newPad->GetNumber().IsEmpty() )
2368 {
2370 continue;
2371 }
2372
2373 // Search for a similar pad to reuse UUID and net info
2374 PAD* last_pad = nullptr;
2375
2376 while( true )
2377 {
2378 oldPad = aExisting->FindPadByNumber( newPad->GetNumber(), last_pad );
2379
2380 if( !oldPad )
2381 break;
2382
2383 if( newPad->IsOnCopperLayer() == oldPad->IsOnCopperLayer() ) // a candidate is found
2384 break;
2385
2386 last_pad = oldPad;
2387 }
2388
2389 if( oldPad )
2390 {
2391 const_cast<KIID&>( newPad->m_Uuid ) = oldPad->m_Uuid;
2392 newPad->SetLocalRatsnestVisible( oldPad->GetLocalRatsnestVisible() );
2393 newPad->SetPinFunction( oldPad->GetPinFunction() );
2394 newPad->SetPinType( oldPad->GetPinType() );
2395 }
2396
2397 if( newPad->IsOnCopperLayer() )
2398 newPad->SetNetCode( oldPad ? oldPad->GetNetCode() : NETINFO_LIST::UNCONNECTED );
2399 else
2400 newPad->SetNetCode( NETINFO_LIST::UNCONNECTED );
2401 }
2402
2403 for( BOARD_ITEM* oldItem : aExisting->GraphicalItems() )
2404 {
2405 PCB_TEXT* oldTextItem = dynamic_cast<PCB_TEXT*>( oldItem );
2406
2407 if( oldTextItem )
2408 {
2409 // Dimensions have PCB_TEXT base but are not treated like texts in the updater
2410 if( dynamic_cast<PCB_DIMENSION_BASE*>( oldTextItem ) )
2411 continue;
2412
2413 PCB_TEXT* newTextItem = getMatchingTextItem( oldTextItem, aNew );
2414
2415 if( newTextItem )
2416 {
2417 processTextItem( *oldTextItem, *newTextItem, resetTextContent, resetTextLayers,
2418 resetTextEffects, aUpdated );
2419 }
2420 else if( deleteExtraTexts )
2421 {
2422 *aUpdated = true;
2423 }
2424 else
2425 {
2426 aNew->Add( static_cast<BOARD_ITEM*>( oldTextItem->Clone() ) );
2427 }
2428 }
2429 }
2430
2431 // Copy reference. The initial text is always used, never resetted
2432 processTextItem( aExisting->Reference(), aNew->Reference(), false, resetTextLayers,
2433 resetTextEffects, aUpdated );
2434
2435 // Copy value
2436 processTextItem( aExisting->Value(), aNew->Value(),
2437 // reset value text only when it is a proxy for the footprint ID
2438 // (cf replacing value "MountingHole-2.5mm" with "MountingHole-4.0mm")
2439 aExisting->GetValue() == aExisting->GetFPID().GetLibItemName().wx_str(),
2440 resetTextLayers, resetTextEffects, aUpdated );
2441
2442 // Copy fields in accordance with the reset* flags
2443 for( PCB_FIELD* oldField : aExisting->GetFields() )
2444 {
2445 // Reference and value are already handled
2446 if( oldField->IsReference() || oldField->IsValue() )
2447 continue;
2448
2449 PCB_FIELD* newField = aNew->GetFieldByName( oldField->GetName() );
2450
2451 if( newField )
2452 {
2453 processTextItem( *oldField, *newField, resetTextContent, resetTextLayers,
2454 resetTextEffects, aUpdated );
2455 }
2456 else if( deleteExtraTexts )
2457 {
2458 *aUpdated = true;
2459 }
2460 else
2461 {
2462 newField = new PCB_FIELD( *oldField );
2463 aNew->Add( newField );
2464 processTextItem( *oldField, *newField, true, true, true, aUpdated );
2465 }
2466 }
2467
2468 // Careful; allow-soldermask-bridges is in the m_attributes field but is not presented
2469 // as a fabrication attribute in the GUI....
2470 int existingFabAttrs = aExisting->GetAttributes() & ~FP_ALLOW_SOLDERMASK_BRIDGES;
2471 int libraryFabAttrs = aNew->GetAttributes() & ~FP_ALLOW_SOLDERMASK_BRIDGES;
2472
2473 if( resetFabricationAttrs )
2474 {
2475 // We've replaced the existing footprint with the library one, so the fabrication attrs
2476 // are already reset. Just set the aUpdated flag if appropriate.
2477 if( libraryFabAttrs != existingFabAttrs )
2478 *aUpdated = true;
2479 }
2480 else
2481 {
2482 int solderMaskBridgesFlag = aNew->GetAttributes() & FP_ALLOW_SOLDERMASK_BRIDGES;
2483 aNew->SetAttributes( existingFabAttrs | solderMaskBridgesFlag );
2484 }
2485
2486 if( reset3DModels )
2487 {
2488 // We've replaced the existing footprint with the library one, so the 3D models are
2489 // already reset. Just set the aUpdated flag if appropriate.
2490 if( aNew->Models().size() != aExisting->Models().size() )
2491 {
2492 *aUpdated = true;
2493 }
2494 else
2495 {
2496 for( size_t ii = 0; ii < aNew->Models().size(); ++ii )
2497 {
2498 if( aNew->Models()[ii] != aExisting->Models()[ii] )
2499 {
2500 *aUpdated = true;
2501 break;
2502 }
2503 }
2504 }
2505 }
2506 else
2507 {
2508 aNew->Models() = aExisting->Models(); // Linked list of 3D models.
2509 }
2510
2511 // Updating other parameters
2512 const_cast<KIID&>( aNew->m_Uuid ) = aExisting->m_Uuid;
2513 aNew->SetPath( aExisting->GetPath() );
2514 aNew->SetSheetfile( aExisting->GetSheetfile() );
2515 aNew->SetSheetname( aExisting->GetSheetname() );
2516 aNew->SetFilters( aExisting->GetFilters() );
2517 aNew->SetComponentClass( aExisting->GetComponentClass() );
2518
2519 aCommit.Remove( aExisting );
2520 aCommit.Add( aNew );
2521
2522 aNew->ClearFlags();
2523}
2524
2525
2526void PCB_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
2527{
2528 PCB_BASE_EDIT_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
2529
2531
2532 SetElementVisibility( LAYER_RATSNEST, GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
2533
2535
2536 // Netclass definitions could have changed, either by us or by Eeschema, so we need to
2537 // recompile the implicit rules
2538 DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
2539 WX_INFOBAR* infobar = GetInfoBar();
2540
2541 try
2542 {
2543 drcTool->GetDRCEngine()->InitEngine( GetDesignRulesPath() );
2544
2545 if( infobar->GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::DRC_RULES_ERROR )
2546 infobar->Dismiss();
2547 }
2548 catch( PARSE_ERROR& )
2549 {
2550 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( infobar, wxID_ANY, _( "Edit design rules" ),
2551 wxEmptyString );
2552
2553 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
2554 [&]( wxHyperlinkEvent& aEvent )
2555 {
2556 ShowBoardSetupDialog( _( "Custom Rules" ) );
2557 } ) );
2558
2559 infobar->RemoveAllButtons();
2560 infobar->AddButton( button );
2561 infobar->AddCloseButton();
2562 infobar->ShowMessage( _( "Could not compile custom design rules." ), wxICON_ERROR,
2564 }
2565
2568
2569 // Update the environment variables in the Python interpreter
2570 if( aEnvVarsChanged )
2572
2573 Layout();
2574 SendSizeEvent();
2575}
2576
2577
2579{
2581}
2582
2583
2585{
2587}
2588
2589
2591{
2592 // For now, be conservative: Don't allow any API use while the user is changing things
2593 if( GetToolManager()->GetCurrentTool() != GetToolManager()->GetTool<PCB_SELECTION_TOOL>() )
2594 return false;
2595
2597
2598 if( zoneFillerTool->IsBusy() )
2599 return false;
2600
2601 ROUTER_TOOL* routerTool = m_toolManager->GetTool<ROUTER_TOOL>();
2602
2603 if( routerTool->RoutingInProgress() )
2604 return false;
2605
2607}
2608
2609
2610bool ExportBoardToHyperlynx( BOARD* aBoard, const wxFileName& aPath );
2611
2612
2613void PCB_EDIT_FRAME::OnExportHyperlynx( wxCommandEvent& event )
2614{
2615 wxString wildcard = wxT( "*.hyp" );
2616 wxFileName fn = GetBoard()->GetFileName();
2617
2618 fn.SetExt( wxT("hyp") );
2619
2620 wxFileDialog dlg( this, _( "Export Hyperlynx Layout" ), fn.GetPath(), fn.GetFullName(),
2621 wildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
2622
2623 if( dlg.ShowModal() != wxID_OK )
2624 return;
2625
2626 fn = dlg.GetPath();
2627
2628 // always enforce filename extension, user may not have entered it.
2629 fn.SetExt( wxT( "hyp" ) );
2630
2632}
2633
2634
2636{
2637 return GetBoard()->GetFileName();
2638}
2639
2640
2642{
2643 return m_auimgr.GetPane( wxS( "LayersManager" ) ).IsShown();
2644}
2645
2646
2648{
2649 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
2650}
2651
2652
2654{
2655 return m_auimgr.GetPane( NetInspectorPanelName() ).IsShown();
2656}
2657
2658
2659void PCB_EDIT_FRAME::onSize( wxSizeEvent& aEvent )
2660{
2661 if( IsShownOnScreen() )
2662 {
2663 // We only need this until the frame is done resizing and the final client size is
2664 // established.
2665 Unbind( wxEVT_SIZE, &PCB_EDIT_FRAME::onSize, this );
2667 }
2668
2669 // Skip() is called in the base class.
2670 EDA_DRAW_FRAME::OnSize( aEvent );
2671}
2672
2673
2675{
2678 _( "Violation Report" ) );
2679
2680 return m_inspectDrcErrorDlg;
2681}
2682
2683
2685{
2688 _( "Clearance Report" ) );
2689
2690 return m_inspectClearanceDlg;
2691}
2692
2693
2695{
2698 _( "Constraints Report" ) );
2699
2701}
2702
2703
2705{
2706 if( !m_footprintDiffDlg )
2708 _( "Compare Footprint with Library" ) );
2709
2710 return m_footprintDiffDlg;
2711}
2712
2713
2715{
2716 if( m_inspectDrcErrorDlg && aEvent.GetString() == INSPECT_DRC_ERROR_DIALOG_NAME )
2717 {
2718 m_inspectDrcErrorDlg->Destroy();
2719 m_inspectDrcErrorDlg = nullptr;
2720 }
2721 else if( m_inspectClearanceDlg && aEvent.GetString() == INSPECT_CLEARANCE_DIALOG_NAME )
2722 {
2723 m_inspectClearanceDlg->Destroy();
2724 m_inspectClearanceDlg = nullptr;
2725 }
2726 else if( m_inspectConstraintsDlg && aEvent.GetString() == INSPECT_CONSTRAINTS_DIALOG_NAME )
2727 {
2728 m_inspectConstraintsDlg->Destroy();
2729 m_inspectConstraintsDlg = nullptr;
2730 }
2731 else if( m_footprintDiffDlg && aEvent.GetString() == INSPECT_CONSTRAINTS_DIALOG_NAME )
2732 {
2733 m_footprintDiffDlg->Destroy();
2734 m_footprintDiffDlg = nullptr;
2735 }
2736}
2737
2738#ifdef KICAD_IPC_API
2739void PCB_EDIT_FRAME::onPluginAvailabilityChanged( wxCommandEvent& aEvt )
2740{
2741 wxLogTrace( traceApi, "PCB frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" );
2743 aEvt.Skip();
2744}
2745#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:187
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION millimetersUnits
Definition: actions.h:195
static TOOL_ACTION unselectAll
Definition: actions.h:76
static TOOL_ACTION togglePolarCoords
Definition: actions.h:198
static TOOL_ACTION copy
Definition: actions.h:71
static TOOL_ACTION pluginsReload
Definition: actions.h:241
static TOOL_ACTION pasteSpecial
Definition: actions.h:74
static TOOL_ACTION milsUnits
Definition: actions.h:194
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:193
static TOOL_ACTION highContrastMode
Definition: actions.h:145
static TOOL_ACTION embeddedFiles
Definition: actions.h:244
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:144
static TOOL_ACTION measureTool
Definition: actions.h:203
static TOOL_ACTION doDelete
Definition: actions.h:78
static TOOL_ACTION selectionTool
Definition: actions.h:202
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:216
static TOOL_ACTION cut
Definition: actions.h:70
static TOOL_ACTION gridSetOrigin
Definition: actions.h:184
static TOOL_ACTION toggleGridOverrides
Definition: actions.h:188
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
Revert the commit by restoring the modified items state.
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:79
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:237
virtual void SetLocked(bool aLocked)
Definition: board_item.h:328
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:90
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:288
VECTOR2I GetFPRelativePosition() const
Definition: board_item.cpp:327
void SetFPRelativePosition(const VECTOR2I &aPos)
Definition: board_item.cpp:341
virtual bool IsLocked() const
Definition: board_item.cpp:75
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:290
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:778
void BuildListOfNets()
Definition: board.h:834
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition: board.cpp:844
void RemoveAllListeners()
Remove all listeners.
Definition: board.cpp:2688
const PAGE_INFO & GetPageSettings() const
Definition: board.h:689
GAL_SET GetVisibleElements() const
Return a set of all the element categories that are visible.
Definition: board.cpp:838
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:187
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
Definition: board.cpp:2055
TITLE_BLOCK & GetTitleBlock()
Definition: board.h:695
const std::map< wxString, wxString > & GetProperties() const
Definition: board.h:362
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
Definition: board.cpp:197
const wxString & GetFileName() const
Definition: board.h:327
void SetElementVisibility(GAL_LAYER_ID aLayer, bool aNewState)
Change the visibility of an element category.
Definition: board.cpp:850
void ClearProject()
Definition: board.cpp:235
PROJECT * GetProject() const
Definition: board.h:491
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:1735
void UpdateRatsnestExclusions()
Update the visibility flags on the current unconnected ratsnest lines.
Definition: board.cpp:296
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition: board.h:475
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)
Notify observers that aItem has been removed.
Definition: commit.h:92
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
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)
Definition: dialog_find.cpp:98
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()
int ShowModal() override
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)
Changes the sheet-count number displayed in the title block.
void SetPageNumber(const std::string &aPageNumber)
Changes 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 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()
Checks if this frame is ready to accept API commands.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
virtual void OnSize(wxSizeEvent &aEvent)
virtual bool canCloseWindow(wxCloseEvent &aCloseEvent)
virtual int GetUndoCommandCount() const
WX_INFOBAR * GetInfoBar()
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)
Changes the current rendering backend.
virtual void OnSize(wxSizeEvent &event) override
Recalculate the size of toolbars and display panel when the frame size changes.
virtual void OnSelectZoom(wxCommandEvent &event)
Set the zoom factor when selected by the zoom list box in the main tool bar.
GAL_DISPLAY_OPTIONS_IMPL & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
virtual wxString GetScreenDesc() const
static const wxString PropertiesPaneName()
virtual void Zoom_Automatique(bool aWarpPointer)
Redraw the screen with best zoom level and the best centering that shows all the page or the board.
NET_INSPECTOR_PANEL * m_netInspectorPanel
static const wxString NetInspectorPanelName()
SEARCH_PANE * m_searchPane
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:89
const KIID m_Uuid
Definition: eda_item.h:489
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: eda_item.h:129
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:104
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:424
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition: eda_text.h:187
virtual void SetVisible(bool aVisible)
Definition: eda_text.cpp:377
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition: eda_text.h:190
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:269
int GetTextThickness() const
Definition: eda_text.h:126
VECTOR2I GetTextSize() const
Definition: eda_text.h:245
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:669
static ENUM_MAP< T > & Instance()
Definition: property.h:663
ENUM_MAP & Undefined(T aValue)
Definition: property.h:676
wxPGChoices & Choices()
Definition: property.h:712
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:2388
void SetLocked(bool isLocked) override
Set the #MODULE_is_LOCKED bit in the m_ModuleStatus.
Definition: footprint.h:421
EDA_ANGLE GetOrientation() const
Definition: footprint.h:227
void SetComponentClass(const COMPONENT_CLASS *aClass)
Definition: footprint.h:1015
void SetOrientation(const EDA_ANGLE &aNewAngle)
Definition: footprint.cpp:2458
PCB_FIELD * GetFieldByName(const wxString &aFieldName)
Return a field in this symbol.
Definition: footprint.cpp:589
wxString GetSheetname() const
Definition: footprint.h:266
void SetPath(const KIID_PATH &aPath)
Definition: footprint.h:264
void SetFilters(const wxString &aFilters)
Definition: footprint.h:273
void SetAttributes(int aAttributes)
Definition: footprint.h:291
void SetSheetfile(const wxString &aSheetfile)
Definition: footprint.h:270
PCB_FIELD & Value()
read/write accessors:
Definition: footprint.h:658
std::deque< PAD * > & Pads()
Definition: footprint.h:206
int GetAttributes() const
Definition: footprint.h:290
const COMPONENT_CLASS * GetComponentClass() const
Definition: footprint.h:1017
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: footprint.h:236
wxString GetSheetfile() const
Definition: footprint.h:269
const LIB_ID & GetFPID() const
Definition: footprint.h:248
bool IsLocked() const override
Definition: footprint.h:411
void GetFields(std::vector< PCB_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with PCB_TEXTs.
Definition: footprint.cpp:616
PCB_FIELD & Reference()
Definition: footprint.h:659
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition: footprint.cpp:1025
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
Definition: footprint.cpp:2330
wxString GetFilters() const
Definition: footprint.h:272
void SetSheetname(const wxString &aSheetname)
Definition: footprint.h:267
std::vector< FP_3DMODEL > & Models()
Definition: footprint.h:220
const wxString & GetValue() const
Definition: footprint.h:644
const KIID_PATH & GetPath() const
Definition: footprint.h:263
VECTOR2I GetPosition() const override
Definition: footprint.h:224
DRAWINGS & GraphicalItems()
Definition: footprint.h:209
PAD * FindPadByNumber(const wxString &aPadNumber, PAD *aSearchAfterMe=nullptr) const
Return a PAD with a matching number.
Definition: footprint.cpp:1852
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
bool Contains(GAL_LAYER_ID aPos)
Definition: layer_ids.h:341
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:84
bool IsBOARD_ITEM() const
Definition: view_item.h:100
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
double GetScale() const
Definition: view.h:273
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition: view.cpp:522
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:1669
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:397
bool IsMirroredX() const
Return true if view is flipped across the X axis.
Definition: view.h:247
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1545
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:217
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition: view.h:636
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:1555
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:284
void OnKiCadExit()
Definition: kiway.cpp:725
virtual void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition: kiway.cpp:617
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
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:36
static LSET AllLayersMask()
Definition: lset.cpp:711
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:420
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:193
@ 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:241
virtual void OnBoardChanged()
Notification from file loader when board changed and connectivity rebuilt.
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:151
const wxString & GetPinFunction() const
Definition: pad.h:145
bool IsOnCopperLayer() const override
Definition: pad.cpp:988
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:50
static TOOL_ACTION toggleHV45Mode
Definition: pcb_actions.h:524
static TOOL_ACTION drawRuleArea
Definition: pcb_actions.h:223
static TOOL_ACTION microwaveCreateGap
Definition: pcb_actions.h:513
static TOOL_ACTION drawBezier
Definition: pcb_actions.h:206
static TOOL_ACTION placeText
Definition: pcb_actions.h:208
static TOOL_ACTION pointEditorArcKeepCenter
Definition: pcb_actions.h:302
static TOOL_ACTION drawOrthogonalDimension
Definition: pcb_actions.h:219
static TOOL_ACTION drawRectangle
Definition: pcb_actions.h:203
static TOOL_ACTION padDisplayMode
Definition: pcb_actions.h:340
static TOOL_ACTION placeReferenceImage
Definition: pcb_actions.h:207
static TOOL_ACTION showRatsnest
Definition: pcb_actions.h:335
static TOOL_ACTION showLayersManager
Definition: pcb_actions.h:454
static TOOL_ACTION toggleNetHighlight
Definition: pcb_actions.h:560
static TOOL_ACTION drawCircle
Definition: pcb_actions.h:204
static TOOL_ACTION routeDiffPair
Activation of the Push and Shove router (differential pair mode)
Definition: pcb_actions.h:257
static TOOL_ACTION tuneDiffPair
Definition: pcb_actions.h:260
static TOOL_ACTION layerChanged
Definition: pcb_actions.h:392
static TOOL_ACTION ddAppendBoard
Drag and drop.
Definition: pcb_actions.h:589
static TOOL_ACTION highlightNet
Definition: pcb_actions.h:558
static TOOL_ACTION drawTable
Definition: pcb_actions.h:210
static TOOL_ACTION drawTextBox
Definition: pcb_actions.h:209
static TOOL_ACTION routerHighlightMode
Actions to enable switching modes via hotkey assignments.
Definition: pcb_actions.h:276
static TOOL_ACTION routerWalkaroundMode
Definition: pcb_actions.h:278
static TOOL_ACTION routerShoveMode
Definition: pcb_actions.h:277
static TOOL_ACTION drawZoneCutout
Definition: pcb_actions.h:224
static TOOL_ACTION drawPolygon
Definition: pcb_actions.h:202
static TOOL_ACTION hideNetInRatsnest
Definition: pcb_actions.h:565
static TOOL_ACTION group
Definition: pcb_actions.h:532
static TOOL_ACTION zoneDisplayFilled
Definition: pcb_actions.h:342
static TOOL_ACTION showNetInRatsnest
Definition: pcb_actions.h:566
static TOOL_ACTION drawRadialDimension
Definition: pcb_actions.h:218
static TOOL_ACTION tuneSingleTrack
Definition: pcb_actions.h:259
static TOOL_ACTION viaDisplayMode
Definition: pcb_actions.h:341
static TOOL_ACTION drawLeader
Definition: pcb_actions.h:220
static TOOL_ACTION drillOrigin
Definition: pcb_actions.h:542
static TOOL_ACTION tuneSkew
Definition: pcb_actions.h:261
static TOOL_ACTION trackDisplayMode
Definition: pcb_actions.h:339
static TOOL_ACTION showNetInspector
Definition: pcb_actions.h:455
static TOOL_ACTION microwaveCreateStubArc
Definition: pcb_actions.h:517
static TOOL_ACTION zoneDisplayTriangulated
Definition: pcb_actions.h:345
static TOOL_ACTION ungroup
Definition: pcb_actions.h:533
static TOOL_ACTION selectUnconnected
Select unconnected footprints from ratsnest of selection.
Definition: pcb_actions.h:102
static TOOL_ACTION zoneDisplayFractured
Definition: pcb_actions.h:344
static TOOL_ACTION drawVia
Definition: pcb_actions.h:222
static TOOL_ACTION drawArc
Definition: pcb_actions.h:205
static TOOL_ACTION zoneDuplicate
Duplicate zone onto another layer.
Definition: pcb_actions.h:415
static TOOL_ACTION graphicsOutlines
Display footprint graphics as outlines.
Definition: pcb_actions.h:496
static TOOL_ACTION drawSimilarZone
Definition: pcb_actions.h:225
static TOOL_ACTION pointEditorArcKeepEndpoint
Definition: pcb_actions.h:303
static TOOL_ACTION drawCenterDimension
Definition: pcb_actions.h:217
static TOOL_ACTION selectSameSheet
Select all components on the same sheet as the selected footprint.
Definition: pcb_actions.h:111
static TOOL_ACTION microwaveCreateStub
Definition: pcb_actions.h:515
static TOOL_ACTION selectNet
Select all connections belonging to a single net.
Definition: pcb_actions.h:96
static TOOL_ACTION microwaveCreateLine
Definition: pcb_actions.h:521
static TOOL_ACTION flipBoard
Definition: pcb_actions.h:394
static TOOL_ACTION zoneDisplayOutline
Definition: pcb_actions.h:343
static TOOL_ACTION ratsnestLineMode
Definition: pcb_actions.h:336
static TOOL_ACTION textOutlines
Display texts as lines.
Definition: pcb_actions.h:499
static TOOL_ACTION highlightNetSelection
Definition: pcb_actions.h:561
static TOOL_ACTION microwaveCreateFunctionShape
Definition: pcb_actions.h:519
static TOOL_ACTION zoneMerge
Definition: pcb_actions.h:412
static TOOL_ACTION unlock
Definition: pcb_actions.h:529
static TOOL_ACTION placeFootprint
Definition: pcb_actions.h:228
static TOOL_ACTION routeSingleTrack
Activation of the Push and Shove router.
Definition: pcb_actions.h:254
static TOOL_ACTION createArray
Tool for creating an array of objects.
Definition: pcb_actions.h:493
static TOOL_ACTION deselectNet
Remove all connections belonging to a single net from the active selection.
Definition: pcb_actions.h:99
static TOOL_ACTION showPythonConsole
Definition: pcb_actions.h:456
static TOOL_ACTION drawLine
Definition: pcb_actions.h:201
static TOOL_ACTION localRatsnestTool
Definition: pcb_actions.h:567
static TOOL_ACTION drawAlignedDimension
Definition: pcb_actions.h:216
static TOOL_ACTION drawZone
Definition: pcb_actions.h:221
static TOOL_ACTION selectOnSchematic
Select symbols/pins on schematic corresponding to selected footprints/pads.
Definition: pcb_actions.h:114
static TOOL_ACTION lock
Definition: pcb_actions.h:528
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 ...
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
Returns the BOARD_DESIGN_SETTINGS for the open project.
virtual void SetPlotSettings(const PCB_PLOT_PARAMS &aSettings)
void PlaceFootprint(FOOTPRINT *aFootprint, bool aRecreateRatsnest=true)
Places aFootprint at the current cursor position and updates footprint coordinates with the new posit...
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
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 ReCreateHToolbar() override
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).
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
Checks 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.
void ReCreateAuxiliaryToolbar() override
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 ExportSVG(wxCommandEvent &event)
Show the Export to SVG file dialog.
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
PCB_LAYER_BOX_SELECTOR * m_SelLayerBox
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 CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Called after the preferences dialog is run.
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)
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()
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
Net inspection panel for pcbnew.
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:452
Tool useful for viewing footprints.
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
Definition: pgm_base.cpp:924
virtual const wxString & GetExecutablePath() const
Definition: pgm_base.cpp:1039
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:72
std::vector< LAYER_PAIR_INFO > m_LayerPairInfos
List of stored 3D viewports (view matrixes)
Definition: project_file.h:184
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:206
void IncrementNetclassesTicker()
Definition: project.h:118
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:200
void IncrementTextVarsTicker()
Definition: project.h:115
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.
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
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:167
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:169
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
ACTIONS * m_actions
Definition: tools_holder.h:168
Represent a single user action.
Definition: tool_action.h:269
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:167
void SetHasPosition(bool aHasPosition)
Returns if the action associated with this event should be treated as immediate regardless of the cur...
Definition: tool_event.h:257
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:302
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:337
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()
Initializes 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:304
@ OUTDATED_SAVE
OUTDATED_SAVE Messages that should be cleared on save.
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
Definition: wx_infobar.cpp:294
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:195
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define DIALOG_DRC_WINDOW_NAME
Definition: dialog_drc.h:42
bool InvokeExportSVG(PCB_EDIT_FRAME *aCaller, BOARD *aBoard)
Function InvokeExportSVG shows the Export SVG dialog.
#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
GERBVIEW_FRAME::OnZipFileHistory GERBVIEW_FRAME::OnSelectHighlightChoice EVT_UPDATE_UI(ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER, GERBVIEW_FRAME::OnUpdateLayerSelectBox) void GERBVIEW_FRAME
KiCad executable names.
const wxString EESCHEMA_EXE
bool ExportBoardToHyperlynx(BOARD *aBoard, const wxFileName &aPath)
@ FP_ALLOW_SOLDERMASK_BRIDGES
Definition: footprint.h:81
#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:145
@ ID_GEN_PLOT_DXF
Definition: id.h:95
@ ID_FILE_LIST_CLEAR
Definition: id.h:86
@ ID_EDA_SOCKET_EVENT
Definition: id.h:163
@ ID_GEN_PLOT_PS
Definition: id.h:91
@ ID_EDA_SOCKET_EVENT_SERV
Definition: id.h:162
@ ID_GEN_PLOT_GERBER
Definition: id.h:93
@ ID_ON_ZOOM_SELECT
Definition: id.h:143
@ ID_GEN_PLOT
Definition: id.h:90
@ ID_GEN_PLOT_SVG
Definition: id.h:94
@ ID_GEN_PLOT_HPGL
Definition: id.h:92
@ ID_FILEMAX
Definition: id.h:84
@ ID_FILE1
Definition: id.h:83
@ ID_GEN_PLOT_PDF
Definition: id.h:96
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
PROJECT & Prj()
Definition: kicad.cpp:597
int GetNetnameLayer(int aLayer)
Returns a netname layer corresponding to the given layer.
Definition: layer_ids.h:706
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
Definition: layer_ids.h:191
@ LAYER_GRID
Definition: layer_ids.h:206
@ LAYER_ZONES
Control for copper zone opacity/visibility (color ignored)
Definition: layer_ids.h:232
@ LAYER_RATSNEST
Definition: layer_ids.h:205
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:57
@ ALL
All except INITIAL_ADD.
Definition: view_item.h:58
@ 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:25
@ ID_POPUP_PCB_SELECT_WIDTH1
Definition: pcbnew_id.h:29
@ ID_POPUP_PCB_SELECT_VIASIZE8
Definition: pcbnew_id.h:52
@ ID_GEN_EXPORT_FILE_HYPERLYNX
Definition: pcbnew_id.h:88
@ ID_IMPORT_NON_KICAD_BOARD
Definition: pcbnew_id.h:19
@ ID_MENU_RECOVER_BOARD_AUTOSAVE
Definition: pcbnew_id.h:81
@ ID_AUX_TOOLBAR_PCB_VIA_SIZE
Definition: pcbnew_id.h:22
@ ID_AUX_TOOLBAR_PCB_SELECT_AUTO_WIDTH
Definition: pcbnew_id.h:24
@ ID_PCB_GEN_CMP_FILE
Definition: pcbnew_id.h:93
@ ID_MENU_EXPORT_FOOTPRINTS_TO_NEW_LIBRARY
Definition: pcbnew_id.h:83
@ ID_POPUP_PCB_SELECT_WIDTH_END_RANGE
Definition: pcbnew_id.h:79
@ ID_MENU_EXPORT_FOOTPRINTS_TO_LIBRARY
Definition: pcbnew_id.h:82
@ ID_GEN_EXPORT_FILE_VRML
Definition: pcbnew_id.h:86
@ ID_POPUP_PCB_SELECT_VIASIZE1
Definition: pcbnew_id.h:45
@ ID_GEN_EXPORT_FILE_STEP
Definition: pcbnew_id.h:87
@ ID_TOOLBARH_PCB_SELECT_LAYER
Definition: pcbnew_id.h:96
@ ID_GEN_EXPORT_FILE_IDF3
Definition: pcbnew_id.h:85
@ ID_AUX_TOOLBAR_PCB_TRACK_WIDTH
Definition: pcbnew_id.h:23
@ ID_GEN_EXPORT_FILE_GENCADFORMAT
Definition: pcbnew_id.h:89
void ScriptingOnDestructPcbEditFrame(PCB_EDIT_FRAME *aPcbEditFrame)
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
@ SHOW_WITH_VIA_ALWAYS
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
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:48
@ 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:398
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:48
@ AS_ACTIVE
All active tools.
Definition: tool_action.h:47
@ TA_MODEL_CHANGE
Definition: tool_event.h:120
@ TC_COMMAND
Definition: tool_event.h:56
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.