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