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