KiCad PCB EDA Suite
Loading...
Searching...
No Matches
footprint_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) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2015 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright (C) 2015-2016 Wayne Stambaugh <[email protected]>
7 * Copyright (C) 1992-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 "tools/convert_tool.h"
24#include "tools/drawing_tool.h"
25#include "tools/edit_tool.h"
28#include "tools/pad_tool.h"
29#include "tools/pcb_actions.h"
30#include "tools/pcb_control.h"
37#include <bitmaps.h>
38#include <board.h>
39#include <footprint.h>
40#include <confirm.h>
43#include <footprint_info_impl.h>
44#include <fp_lib_table.h>
46#include <kiface_base.h>
47#include <kiplatform/app.h>
48#include <kiway.h>
49#include <macros.h>
50#include <pcbnew_id.h>
51#include <pgm_base.h>
52#include <project.h>
53#include <project_pcb.h>
55#include <tool/action_toolbar.h>
56#include <tool/common_control.h>
57#include <tool/common_tools.h>
59#include <tool/selection.h>
62#include <tool/tool_manager.h>
63#include <tool/zoom_tool.h>
66#include <tools/group_tool.h>
69#include <widgets/lib_tree.h>
74#include <wx/filedlg.h>
76
77BEGIN_EVENT_TABLE( FOOTPRINT_EDIT_FRAME, PCB_BASE_FRAME )
78 EVT_MENU( wxID_CLOSE, FOOTPRINT_EDIT_FRAME::CloseFootprintEditor )
79 EVT_MENU( wxID_EXIT, FOOTPRINT_EDIT_FRAME::OnExitKiCad )
80
82
85
87
90
91 // Horizontal toolbar
93
94 // UI update events.
96 FOOTPRINT_EDIT_FRAME::OnUpdateLoadFootprintFromBoard )
98 FOOTPRINT_EDIT_FRAME::OnUpdateSaveFootprintToBoard )
100
101 // Drop files event
102 EVT_DROP_FILES( FOOTPRINT_EDIT_FRAME::OnDropFiles )
103
104END_EVENT_TABLE()
105
106
107FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
108 PCB_BASE_EDIT_FRAME( aKiway, aParent, FRAME_FOOTPRINT_EDITOR, wxEmptyString,
109 wxDefaultPosition, wxDefaultSize,
110 KICAD_DEFAULT_DRAWFRAME_STYLE, GetFootprintEditorFrameName() ),
111 m_show_layer_manager_tools( true )
112{
113 m_showBorderAndTitleBlock = false; // true to show the frame references
114 m_aboutTitle = _HKI( "KiCad Footprint Editor" );
115 m_selLayerBox = nullptr;
116 m_editorSettings = nullptr;
117
118 // Give an icon
119 wxIcon icon;
120 wxIconBundle icon_bundle;
121
122 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_modedit, 48 ) );
123 icon_bundle.AddIcon( icon );
124 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_modedit, 128 ) );
125 icon_bundle.AddIcon( icon );
126 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_modedit, 256 ) );
127 icon_bundle.AddIcon( icon );
128 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_modedit_32 ) );
129 icon_bundle.AddIcon( icon );
130 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_modedit_16 ) );
131 icon_bundle.AddIcon( icon );
132
133 SetIcons( icon_bundle );
134
135 // Create GAL canvas
136 m_canvasType = loadCanvasTypeSetting( GetSettings() );
137
138 PCB_DRAW_PANEL_GAL* drawPanel = new PCB_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
139 GetGalDisplayOptions(), m_canvasType );
140 SetCanvas( drawPanel );
141
142 CreateInfoBar();
143
144 SetBoard( new BOARD() );
145
146 // This board will only be used to hold a footprint for editing
148
149 // In Footprint Editor, the default net clearance is not known (it depends on the actual
150 // board). So we do not show the default clearance, by setting it to 0. The footprint or
151 // pad specific clearance will be shown.
152 GetBoard()->GetDesignSettings().m_NetSettings->m_DefaultNetClass->SetClearance( 0 );
153
154 // Don't show the default board solder mask expansion in the footprint editor. Only the
155 // footprint or pad mask expansions settings should be shown.
157
158 // Ensure all layers and items are visible:
159 // In footprint editor, some layers have no meaning or cannot be used, but we show all of
160 // them, at least to be able to edit a bad layer
162
163 GetGalDisplayOptions().m_axesEnabled = true;
164
165 // In Footprint Editor, set the default paper size to A4 for plot/print
166 SetPageSettings( PAGE_INFO( PAGE_INFO::A4 ) );
167 SetScreen( new PCB_SCREEN( GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS ) ) );
168
169 // Create the manager and dispatcher & route draw panel events to the dispatcher
170 setupTools();
171 setupUIConditions();
172
173 initLibraryTree();
174 m_treePane = new FOOTPRINT_TREE_PANE( this );
175
176 // restore the last footprint from the project, if any, after the library has been init'ed
177 restoreLastFootprint();
178
179 ReCreateMenuBar();
180 ReCreateHToolbar();
181 ReCreateVToolbar();
182 ReCreateOptToolbar();
183
184 m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this );
185 m_appearancePanel = new APPEARANCE_CONTROLS( this, GetCanvas(), true );
186 m_propertiesPanel = new PCB_PROPERTIES_PANEL( this, this );
187
188 // LoadSettings() *after* creating m_LayersManager, because LoadSettings() initialize
189 // parameters in m_LayersManager
190 // NOTE: KifaceSettings() will return PCBNEW_SETTINGS if we started from pcbnew
191 LoadSettings( GetSettings() );
192
193 float proportion = GetFootprintEditorSettings()->m_AuiPanels.properties_splitter;
194 m_propertiesPanel->SetSplitterProportion( proportion );
195
196 // Must be set after calling LoadSettings() to be sure these parameters are not dependent
197 // on what is read in stored settings. Enable one internal layer, because footprints
198 // support keepout areas that can be on internal layers only (therefore on the first internal
199 // layer). This is needed to handle these keepout in internal layers only.
201 GetBoard()->SetEnabledLayers( GetBoard()->GetEnabledLayers().set( In1_Cu ) );
202 GetBoard()->SetVisibleLayers( GetBoard()->GetEnabledLayers() );
203 GetBoard()->SetLayerName( In1_Cu, _( "Inner layers" ) );
204
205 SetActiveLayer( F_SilkS );
206
207 m_auimgr.SetManagedWindow( this );
208
209 unsigned int auiFlags = wxAUI_MGR_DEFAULT;
210#if !defined( _WIN32 )
211 // Windows cannot redraw the UI fast enough during a live resize and may lead to all kinds
212 // of graphical glitches
213 auiFlags |= wxAUI_MGR_LIVE_RESIZE;
214#endif
215 m_auimgr.SetFlags( auiFlags );
216
217 // Rows; layers 4 - 6
218 m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
219 .Top().Layer( 6 ) );
220
221 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
222 .Bottom().Layer( 6 ) );
223
224 // Columns; layers 1 - 3
225 m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "Footprints" )
226 .Left().Layer( 4 )
227 .Caption( _( "Libraries" ) )
228 .MinSize( FromDIP( 250 ), -1 ).BestSize( FromDIP( 250 ), -1 ) );
229 m_auimgr.AddPane( m_propertiesPanel, EDA_PANE().Name( PropertiesPaneName() )
230 .Left().Layer( 3 )
231 .Caption( _( "Properties" ) ).PaneBorder( false )
232 .MinSize( FromDIP( wxSize( 240, 60 ) ) ).BestSize( FromDIP( wxSize( 300, 200 ) ) ) );
233 m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
234 .Left().Layer( 2 ) );
235
236 m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
237 .Right().Layer(2) );
238 m_auimgr.AddPane( m_appearancePanel, EDA_PANE().Name( "LayersManager" )
239 .Right().Layer( 3 )
240 .Caption( _( "Appearance" ) ).PaneBorder( false )
241 .MinSize( FromDIP( 180 ), -1 ).BestSize( FromDIP( 180 ), -1 ) );
242 m_auimgr.AddPane( m_selectionFilterPanel, EDA_PANE().Palette().Name( "SelectionFilter" )
243 .Right().Layer( 3 ).Position( 2 )
244 .Caption( _( "Selection Filter" ) ).PaneBorder( false )
245 .MinSize( FromDIP( 180 ), -1 ).BestSize( FromDIP( 180 ), -1 ) );
246
247 // Center
248 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" )
249 .Center() );
250
251 m_auimgr.GetPane( "LayersManager" ).Show( m_show_layer_manager_tools );
252 m_auimgr.GetPane( "SelectionFilter" ).Show( m_show_layer_manager_tools );
253 m_auimgr.GetPane( PropertiesPaneName() ).Show( GetSettings()->m_AuiPanels.show_properties );
254
255 // The selection filter doesn't need to grow in the vertical direction when docked
256 m_auimgr.GetPane( "SelectionFilter" ).dock_proportion = 0;
257
260 DragAcceptFiles( true );
261
262 ActivateGalCanvas();
263
264 FinishAUIInitialization();
265
266 // Apply saved visibility stuff at the end
267 if( FOOTPRINT_EDITOR_SETTINGS* cfg = dynamic_cast<FOOTPRINT_EDITOR_SETTINGS*>( GetSettings() ) )
268 {
269 wxAuiPaneInfo& treePane = m_auimgr.GetPane( "Footprints" );
270 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( "LayersManager" );
271
272 if( cfg->m_LibWidth > 0 )
273 SetAuiPaneSize( m_auimgr, treePane, cfg->m_LibWidth, -1 );
274
275 if( cfg->m_AuiPanels.right_panel_width > 0 )
276 SetAuiPaneSize( m_auimgr, layersManager, cfg->m_AuiPanels.right_panel_width, -1 );
277
278 m_appearancePanel->SetUserLayerPresets( cfg->m_LayerPresets );
279 m_appearancePanel->ApplyLayerPreset( cfg->m_ActiveLayerPreset );
280 m_appearancePanel->SetTabIndex( cfg->m_AuiPanels.appearance_panel_tab );
281 }
282
283 GetToolManager()->PostAction( ACTIONS::zoomFitScreen );
284 UpdateTitle();
285 setupUnits( GetSettings() );
286
287 resolveCanvasType();
288
289 // Default shutdown reason until a file is loaded
290 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Footprint changes are unsaved" ) );
291
292 // Catch unhandled accelerator command characters that were no handled by the library tree
293 // panel.
294 Bind( wxEVT_CHAR, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
295 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
296
297 // Ensure the window is on top
298 Raise();
299 Show( true );
300
301 // Register a call to update the toolbar sizes. It can't be done immediately because
302 // it seems to require some sizes calculated that aren't yet (at least on GTK).
303 CallAfter(
304 [this]()
305 {
306 // Ensure the controls on the toolbars all are correctly sized
307 UpdateToolbarControlSizes();
308 m_treePane->FocusSearchFieldIfExists();
309 } );
310}
311
312
314{
315 // Shutdown all running tools
316 if( m_toolManager )
318
319 // save the footprint in the PROJECT
321
322 // Clear the watched file
323 setFPWatcher( nullptr );
324
326 delete m_appearancePanel;
327 delete m_treePane;
328}
329
330
332{
334
335 FOOTPRINT* fp = static_cast<FOOTPRINT*>( GetModel() );
336
337 if( fp )
338 {
339 std::vector<MSG_PANEL_ITEM> msgItems;
340 fp->GetMsgPanelInfo( this, msgItems );
341 SetMsgPanel( msgItems );
342 }
343}
344
345
347{
348 return GetScreen() && GetScreen()->IsContentModified()
350}
351
352
354{
355 return m_toolManager->GetTool<PCB_SELECTION_TOOL>()->GetSelection();
356}
357
358
360{
361 // switches currently used canvas (Cairo / OpenGL).
362 PCB_BASE_FRAME::SwitchCanvas( aCanvasType );
363
364 GetCanvas()->GetGAL()->SetAxesEnabled( true );
365
366 // The base class method *does not reinit* the layers manager. We must update the layer
367 // widget to match board visibility states, both layers and render columns, and and some
368 // settings dependent on the canvas.
370}
371
372
374{
375 SyncLibraryTree( true );
377}
378
379
381{
382 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
383 treePane.Show( !IsLibraryTreeShown() );
384
385 if( IsLibraryTreeShown() )
386 {
387 // SetAuiPaneSize also updates m_auimgr
389 }
390 else
391 {
392 m_editorSettings->m_LibWidth = m_treePane->GetSize().x;
393 m_auimgr.Update();
394 }
395}
396
397
399{
401}
402
403
405{
407 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( "LayersManager" );
408 wxAuiPaneInfo& selectionFilter = m_auimgr.GetPane( "SelectionFilter" );
409
410 // show auxiliary Vertical layers and visibility manager toolbar
412 layersManager.Show( m_show_layer_manager_tools );
413 selectionFilter.Show( m_show_layer_manager_tools );
414
416 {
417 SetAuiPaneSize( m_auimgr, layersManager, settings->m_AuiPanels.right_panel_width, -1 );
418 }
419 else
420 {
421 settings->m_AuiPanels.right_panel_width = m_appearancePanel->GetSize().x;
422 m_auimgr.Update();
423 }
424}
425
426
428{
429 return const_cast<wxAuiManager&>( m_auimgr ).GetPane( m_treePane ).IsShown();
430}
431
432
434{
435 return GetBoard()->GetFirstFootprint();
436}
437
438
440{
441 LIB_ID id;
442
443 if( IsLibraryTreeShown() )
445
446 if( id.GetLibNickname().empty() )
447 id = GetLoadedFPID();
448
449 return id;
450}
451
452
454{
455 FOOTPRINT* footprint = GetBoard()->GetFirstFootprint();
456
457 if( footprint )
458 return LIB_ID( footprint->GetFPID().GetLibNickname(), m_footprintNameWhenLoaded );
459 else
460 return LIB_ID();
461}
462
463
465{
466 if( GetBoard()->GetFirstFootprint() )
467 {
470 }
471
472 GetScreen()->SetContentModified( false );
473}
474
475
477{
478 // If we've already vetted closing this window, then we have no FP anymore
479 if( m_isClosing || !GetBoard() )
480 return false;
481
482 FOOTPRINT* footprint = GetBoard()->GetFirstFootprint();
483
484 return ( footprint && footprint->GetLink() != niluuid );
485}
486
487
489{
490 LIB_ID id = GetLoadedFPID();
491
492 if( id.IsValid() )
493 {
495 Prj().SetRString( PROJECT::PCB_FOOTPRINT_EDITOR_FP_NAME, id.GetLibItemName() );
496 }
497}
498
499
501{
502 const wxString& footprintName = Prj().GetRString( PROJECT::PCB_FOOTPRINT_EDITOR_FP_NAME );
503 const wxString& libNickname = Prj().GetRString( PROJECT::PCB_FOOTPRINT_EDITOR_LIB_NICKNAME );
504
505 if( libNickname.Length() && footprintName.Length() )
506 {
507 LIB_ID id;
508 id.SetLibNickname( libNickname );
509 id.SetLibItemName( footprintName );
510
511 FOOTPRINT* footprint = loadFootprint( id );
512
513 if( footprint )
514 AddFootprintToBoard( footprint );
515 }
516}
517
518
520{
522
523 m_originalFootprintCopy.reset( static_cast<FOOTPRINT*>( aFootprint->Clone() ) );
524 m_originalFootprintCopy->SetParent( nullptr );
525
527
529 // Ensure item UUIDs are valid
530 // ("old" footprints can have null uuids that create issues in fp editor)
531 aFootprint->FixUuids();
532
534 {
535 wxString msg;
536 msg.Printf( _( "Editing %s from board. Saving will update the board only." ),
537 aFootprint->GetReference() );
538
539 if( WX_INFOBAR* infobar = GetInfoBar() )
540 {
541 infobar->RemoveAllButtons();
542 infobar->AddCloseButton();
543 infobar->ShowMessage( msg, wxICON_INFORMATION );
544 }
545 }
546 else
547 {
548 if( WX_INFOBAR* infobar = GetInfoBar() )
549 infobar->Dismiss();
550 }
551
553}
554
555
557{
558 ReloadFootprint( aFootprint );
559
561 setFPWatcher( nullptr );
562 else
563 setFPWatcher( aFootprint );
564}
565
566
568{
570}
571
572
574{
575 return GetBoard()->GetDesignSettings();
576}
577
578
580{
581 wxFAIL_MSG( wxT( "Plotting not supported in Footprint Editor" ) );
582
584}
585
586
588{
589 wxFAIL_MSG( wxT( "Plotting not supported in Footprint Editor" ) );
590}
591
592
594{
595 if( !m_editorSettings )
597
598 return m_editorSettings;
599}
600
601
603{
606}
607
608
610{
611 // Get our own settings; aCfg will be the PCBNEW_SETTINGS because we're part of the pcbnew
612 // compile unit
614
615 if( cfg )
616 {
618
620
623
626
628 }
629}
630
631
633{
634 // Load canvas type from the FOOTPRINT_EDITOR_SETTINGS:
636
637 // If we had an OpenGL failure this session, use the fallback GAL but don't update the
638 // user preference silently:
639
642}
643
644
646{
648
649 // Get our own settings; aCfg will be the PCBNEW_SETTINGS because we're part of the pcbnew
650 // compile unit
652
653 if( cfg )
654 {
656
659 cfg->m_LibWidth = m_treePane->GetSize().x;
661
663
665 {
666 cfg->m_AuiPanels.show_properties = m_propertiesPanel->IsShownOnScreen();
669 }
670
672
674 {
679 }
680 }
681}
682
683
684
686{
687 FOOTPRINT_EDITOR_SETTINGS* cfg = const_cast<FOOTPRINT_EDIT_FRAME*>( this )->GetSettings();
688
689 return cfg ? cfg->m_RotationAngle : ANGLE_90;
690}
691
692
693
695{
696 wxString currentTheme = GetFootprintEditorSettings()->m_ColorTheme;
697 return Pgm().GetSettingsManager().GetColorSettings( currentTheme );
698}
699
700
702{
703 // Get the actual frame settings for magnetic items
705 wxCHECK( cfg, nullptr );
706 return &cfg->m_MagneticItems;
707}
708
709
710const BOX2I FOOTPRINT_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
711{
712 FOOTPRINT* footprint = GetBoard()->GetFirstFootprint();
713
714 if( footprint )
715 {
716 bool hasGraphicalItem = footprint->Pads().size() || footprint->Zones().size();
717
718 if( !hasGraphicalItem )
719 {
720 for( const BOARD_ITEM* item : footprint->GraphicalItems() )
721 {
722 if( item->Type() == PCB_TEXT_T || item->Type() == PCB_TEXTBOX_T )
723 continue;
724
725 hasGraphicalItem = true;
726 break;
727 }
728 }
729
730 if( hasGraphicalItem )
731 {
732 return footprint->GetBoundingBox( false, false );
733 }
734 else
735 {
736 BOX2I newFootprintBB( { 0, 0 }, { 0, 0 } );
737 newFootprintBB.Inflate( pcbIUScale.mmToIU( 12 ) );
738 return newFootprintBB;
739 }
740 }
741
742 return GetBoardBoundingBox( false );
743}
744
745
747{
748 if( IsContentModified() )
749 {
750 wxString footprintName = GetBoard()->GetFirstFootprint()->GetReference();
751 wxString msg = _( "Save changes to '%s' before closing?" );
752
753 if( !HandleUnsavedChanges( this, wxString::Format( msg, footprintName ),
754 [&]() -> bool
755 {
756 return SaveFootprint( GetBoard()->GetFirstFootprint() );
757 } ) )
758 {
759 return false;
760 }
761 }
762
763 if( doClose )
764 {
765 GetInfoBar()->ShowMessageFor( wxEmptyString, 1 );
766 Clear_Pcb( false );
767 UpdateTitle();
768 }
769
770 return true;
771}
772
773
774bool FOOTPRINT_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
775{
776 if( IsContentModified() )
777 {
778 // Shutdown blocks must be determined and vetoed as early as possible
780 aEvent.GetId() == wxEVT_QUERY_END_SESSION )
781 {
782 aEvent.Veto();
783 return false;
784 }
785
786 wxString footprintName = GetBoard()->GetFirstFootprint()->GetFPID().GetLibItemName();
787
789 footprintName = GetBoard()->GetFirstFootprint()->GetReference();
790
791 wxString msg = _( "Save changes to '%s' before closing?" );
792
793 if( !HandleUnsavedChanges( this, wxString::Format( msg, footprintName ),
794 [&]() -> bool
795 {
796 return SaveFootprint( GetBoard()->GetFirstFootprint() );
797 } ) )
798 {
799 aEvent.Veto();
800 return false;
801 }
802 }
803
804 PAD_TOOL* padTool = m_toolManager->GetTool<PAD_TOOL>();
805
806 if( padTool->InPadEditMode() )
807 padTool->ExitPadEditMode();
808
809 // Save footprint tree column widths
810 m_adapter->SaveSettings();
811
813}
814
815
817{
818 // No more vetos
819 GetCanvas()->SetEventDispatcher( nullptr );
821
822 // Do not show the layer manager during closing to avoid flicker
823 // on some platforms (Windows) that generate useless redraw of items in
824 // the Layer Manager
825 m_auimgr.GetPane( wxT( "LayersManager" ) ).Show( false );
826 m_auimgr.GetPane( wxT( "SelectionFilter" ) ).Show( false );
827
828 Clear_Pcb( false );
829
831
832 if( mgr->IsProjectOpen() && wxFileName::IsDirWritable( Prj().GetProjectPath() ) )
833 {
834 GFootprintList.WriteCacheToFile( Prj().GetProjectPath() + wxT( "fp-info-cache" ) );
835 }
836}
837
838
839void FOOTPRINT_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
840{
841 Kiway().OnKiCadExit();
842}
843
844
846{
847 Close();
848}
849
850
852{
854
855 aEvent.Enable( frame != nullptr );
856}
857
858
860{
862
863 FOOTPRINT* editorFootprint = GetBoard()->GetFirstFootprint();
864 bool canInsert = frame && editorFootprint && editorFootprint->GetLink() == niluuid;
865
866 // If the source was deleted, the footprint can inserted but not updated in the board.
867 if( frame && editorFootprint && editorFootprint->GetLink() != niluuid )
868 {
869 BOARD* mainpcb = frame->GetBoard();
870 canInsert = true;
871
872 // search if the source footprint was not deleted:
873 for( FOOTPRINT* candidate : mainpcb->Footprints() )
874 {
875 if( editorFootprint->GetLink() == candidate->m_Uuid )
876 {
877 canInsert = false;
878 break;
879 }
880 }
881 }
882
883 aEvent.Enable( canInsert );
884}
885
886
888{
889 // call my base class
891
892 // We have 2 panes to update.
893 // For some obscure reason, the AUI manager hides the first modified pane.
894 // So force show panes
895 wxAuiPaneInfo& tree_pane_info = m_auimgr.GetPane( m_treePane );
896 bool tree_shown = tree_pane_info.IsShown();
897 tree_pane_info.Caption( _( "Libraries" ) );
898
899 wxAuiPaneInfo& lm_pane_info = m_auimgr.GetPane( m_appearancePanel );
900 bool lm_shown = lm_pane_info.IsShown();
901 lm_pane_info.Caption( _( "Appearance" ) );
902 wxAuiPaneInfo& sf_pane_info = m_auimgr.GetPane( m_selectionFilterPanel );
903 sf_pane_info.Caption( _( "Selection Filter" ) );
904
905 // update the layer manager
907
908 // Now restore the visibility:
909 lm_pane_info.Show( lm_shown );
910 tree_pane_info.Show( tree_shown );
911 m_auimgr.Update();
912
914
915 UpdateTitle();
916}
917
918
920{
922 Update3DView( true, true );
924
925 if( !GetTitle().StartsWith( wxT( "*" ) ) )
926 UpdateTitle();
927}
928
929
931{
932 wxString title;
933 LIB_ID fpid = GetLoadedFPID();
934 FOOTPRINT* footprint = GetBoard()->GetFirstFootprint();
935 bool writable = true;
936
938 {
939 if( IsContentModified() )
940 title = wxT( "*" );
941
942 title += footprint->GetReference();
943 title += wxS( " " ) + wxString::Format( _( "[from %s]" ), Prj().GetProjectName()
944 + wxT( "." )
945 + FILEEXT::PcbFileExtension );
946 }
947 else if( fpid.IsValid() )
948 {
949 try
950 {
952 }
953 catch( const IO_ERROR& )
954 {
955 // best efforts...
956 }
957
958 // Note: don't used GetLoadedFPID(); footprint name may have been edited
959 if( IsContentModified() )
960 title = wxT( "*" );
961
962 title += From_UTF8( footprint->GetFPID().Format().c_str() );
963
964 if( !writable )
965 title += wxS( " " ) + _( "[Read Only]" );
966 }
967 else if( !fpid.GetLibItemName().empty() )
968 {
969 // Note: don't used GetLoadedFPID(); footprint name may have been edited
970 if( IsContentModified() )
971 title = wxT( "*" );
972
973 title += From_UTF8( footprint->GetFPID().GetLibItemName().c_str() );
974 title += wxS( " " ) + _( "[Unsaved]" );
975 }
976 else
977 {
978 title = _( "[no footprint loaded]" );
979 }
980
981 title += wxT( " \u2014 " ) + _( "Footprint Editor" );
982
983 SetTitle( title );
984}
985
986
988{
990}
991
992
994{
998 UpdateTitle();
999}
1000
1001
1003{
1005
1006 WX_PROGRESS_REPORTER progressReporter( this, _( "Loading Footprint Libraries" ), 2 );
1007
1008 if( GFootprintList.GetCount() == 0 )
1009 GFootprintList.ReadCacheFromFile( Prj().GetProjectPath() + wxT( "fp-info-cache" ) );
1010
1011 GFootprintList.ReadFootprintFiles( fpTable, nullptr, &progressReporter );
1012 progressReporter.Show( false );
1013
1016
1018 auto adapter = static_cast<FP_TREE_SYNCHRONIZING_ADAPTER*>( m_adapter.get() );
1019
1020 adapter->AddLibraries( this );
1021}
1022
1023
1025{
1027 auto adapter = static_cast<FP_TREE_SYNCHRONIZING_ADAPTER*>( m_adapter.get() );
1028 LIB_ID target = GetTargetFPID();
1029 bool targetSelected = ( target == GetLibTree()->GetSelectedLibId() );
1030
1031 // Sync FOOTPRINT_INFO list to the libraries on disk
1032 if( aProgress )
1033 {
1034 WX_PROGRESS_REPORTER progressReporter( this, _( "Updating Footprint Libraries" ), 2 );
1035 GFootprintList.ReadFootprintFiles( fpTable, nullptr, &progressReporter );
1036 progressReporter.Show( false );
1037 }
1038 else
1039 {
1040 GFootprintList.ReadFootprintFiles( fpTable, nullptr, nullptr );
1041 }
1042
1043 // Unselect before syncing to avoid null reference in the adapter
1044 // if a selected item is removed during the sync
1045 GetLibTree()->Unselect();
1046
1047 // Sync the LIB_TREE to the FOOTPRINT_INFO list
1048 adapter->Sync( fpTable );
1049
1050 GetLibTree()->Regenerate( true );
1051
1052 if( target.IsValid() )
1053 {
1054 if( adapter->FindItem( target ) )
1055 {
1056 if( targetSelected )
1057 GetLibTree()->SelectLibId( target );
1058 else
1059 GetLibTree()->CenterLibId( target );
1060 }
1061 else
1062 {
1063 // Try to focus on parent
1064 target.SetLibItemName( wxEmptyString );
1065 GetLibTree()->CenterLibId( target );
1066 }
1067 }
1068}
1069
1070
1072{
1074}
1075
1076
1078{
1079 GetLibTree()->SelectLibId( aLibID );
1080}
1081
1082
1084{
1086}
1087
1088
1090{
1091 // Create the manager and dispatcher & route draw panel events to the dispatcher
1094 GetCanvas()->GetViewControls(), config(), this );
1095 m_actions = new PCB_ACTIONS();
1097
1099
1109 m_toolManager->RegisterTool( new PCB_CONTROL ); // copy/paste
1120
1121 for( TOOL_BASE* tool : m_toolManager->Tools() )
1122 {
1123 if( PCB_TOOL_BASE* pcbTool = dynamic_cast<PCB_TOOL_BASE*>( tool ) )
1124 pcbTool->SetIsFootprintEditor( true );
1125 }
1126
1127 m_toolManager->GetTool<PCB_VIEWER_TOOLS>()->SetFootprintFrame( true );
1129
1130 m_toolManager->InvokeTool( "pcbnew.InteractiveSelection" );
1131
1132 // Load or reload wizard plugins in case they changed since the last time the frame opened
1133 // Because the board editor has also a plugin python menu,
1134 // call the PCB_EDIT_FRAME RunAction() if the board editor is running
1135 // Otherwise run the current RunAction().
1136 PCB_EDIT_FRAME* pcbframe = static_cast<PCB_EDIT_FRAME*>( Kiway().Player( FRAME_PCB_EDITOR, false ) );
1137
1138 if( pcbframe )
1140 else
1142}
1143
1144
1146{
1148
1150 PCB_EDITOR_CONDITIONS cond( this );
1151
1152 wxASSERT( mgr );
1153
1154#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
1155#define CHECK( x ) ACTION_CONDITIONS().Check( x )
1156
1157 auto haveFootprintCond =
1158 [this]( const SELECTION& )
1159 {
1160 return GetBoard() && GetBoard()->GetFirstFootprint() != nullptr;
1161 };
1162
1163 auto footprintTargettedCond =
1164 [this]( const SELECTION& )
1165 {
1166 return !GetTargetFPID().GetLibItemName().empty();
1167 };
1168
1169 mgr->SetConditions( ACTIONS::saveAs, ENABLE( footprintTargettedCond ) );
1172
1175
1179 mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) );
1180 mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) );
1181 mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
1182
1183 mgr->SetConditions( ACTIONS::cut, ENABLE( cond.HasItems() ) );
1184 mgr->SetConditions( ACTIONS::copy, ENABLE( cond.HasItems() ) );
1191
1198
1202
1205
1206 auto constrainedDrawingModeCond =
1207 [this]( const SELECTION& )
1208 {
1209 return GetSettings()->m_Use45Limit;
1210 };
1211
1212 auto highContrastCond =
1213 [this]( const SELECTION& )
1214 {
1215 return GetDisplayOptions().m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL;
1216 };
1217
1218 auto boardFlippedCond =
1219 [this]( const SELECTION& )
1220 {
1221 return GetCanvas() && GetCanvas()->GetView()->IsMirroredX();
1222 };
1223
1224 auto libraryTreeCond =
1225 [this](const SELECTION& )
1226 {
1227 return IsLibraryTreeShown();
1228 };
1229
1230 auto layerManagerCond =
1231 [this]( const SELECTION& )
1232 {
1233 return m_auimgr.GetPane( "LayersManager" ).IsShown();
1234 };
1235
1236 auto propertiesCond =
1237 [this] ( const SELECTION& )
1238 {
1239 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
1240 };
1241
1242 mgr->SetConditions( PCB_ACTIONS::toggleHV45Mode, CHECK( constrainedDrawingModeCond ) );
1243 mgr->SetConditions( ACTIONS::highContrastMode, CHECK( highContrastCond ) );
1244 mgr->SetConditions( PCB_ACTIONS::flipBoard, CHECK( boardFlippedCond ) );
1246
1247 mgr->SetConditions( ACTIONS::showLibraryTree, CHECK( libraryTreeCond ) );
1248 mgr->SetConditions( PCB_ACTIONS::showLayersManager, CHECK( layerManagerCond ) );
1249 mgr->SetConditions( PCB_ACTIONS::showProperties, CHECK( propertiesCond ) );
1250
1251 mgr->SetConditions( ACTIONS::print, ENABLE( haveFootprintCond ) );
1252 mgr->SetConditions( PCB_ACTIONS::exportFootprint, ENABLE( haveFootprintCond ) );
1253 mgr->SetConditions( PCB_ACTIONS::placeImportedGraphics, ENABLE( haveFootprintCond ) );
1254
1255 mgr->SetConditions( PCB_ACTIONS::footprintProperties, ENABLE( haveFootprintCond ) );
1256 mgr->SetConditions( PCB_ACTIONS::editTextAndGraphics, ENABLE( haveFootprintCond ) );
1257 mgr->SetConditions( PCB_ACTIONS::checkFootprint, ENABLE( haveFootprintCond ) );
1258 mgr->SetConditions( PCB_ACTIONS::repairFootprint, ENABLE( haveFootprintCond ) );
1259 mgr->SetConditions( PCB_ACTIONS::cleanupGraphics, ENABLE( haveFootprintCond ) );
1260
1261 auto isArcKeepCenterMode =
1262 [this]( const SELECTION& )
1263 {
1264 return GetSettings()->m_ArcEditMode == ARC_EDIT_MODE::KEEP_CENTER_ADJUST_ANGLE_RADIUS;
1265 };
1266
1267 auto isArcKeepEndpointMode =
1268 [this]( const SELECTION& )
1269 {
1270 return GetSettings()->m_ArcEditMode == ARC_EDIT_MODE::KEEP_ENDPOINTS_OR_START_DIRECTION;
1271 };
1272
1273 mgr->SetConditions( PCB_ACTIONS::pointEditorArcKeepCenter, CHECK( isArcKeepCenterMode ) );
1274 mgr->SetConditions( PCB_ACTIONS::pointEditorArcKeepEndpoint, CHECK( isArcKeepEndpointMode ) );
1275
1276
1277// Only enable a tool if the part is edtable
1278#define CURRENT_EDIT_TOOL( action ) \
1279 mgr->SetConditions( action, ACTION_CONDITIONS().Enable( haveFootprintCond ) \
1280 .Check( cond.CurrentTool( action ) ) )
1281
1301
1302#undef CURRENT_EDIT_TOOL
1303#undef ENABLE
1304#undef CHECK
1305}
1306
1307
1309{
1311
1312 // Be sure the axis are enabled
1313 GetCanvas()->GetGAL()->SetAxesEnabled( true );
1314
1315 UpdateView();
1316
1317 // Ensure the m_Layers settings are using the canvas type:
1319}
1320
1321
1322void FOOTPRINT_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
1323{
1324 PCB_BASE_EDIT_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
1325
1327 GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
1328
1329 GetBoard()->GetDesignSettings() = cfg->m_DesignSettings;
1330
1334
1336
1337 if( aEnvVarsChanged )
1338 SyncLibraryTree( true );
1339
1340 Layout();
1341 SendSizeEvent();
1342}
1343
1344
1346{
1347 LIB_ID id = GetLoadedFPID();
1348
1349 if( id.empty() )
1350 {
1351 DisplayErrorMessage( this, _( "No footprint selected." ) );
1352 return;
1353 }
1354
1355 wxFileName fn( id.GetLibItemName() );
1356 fn.SetExt( wxT( "png" ) );
1357
1358 wxString projectPath = wxPathOnly( Prj().GetProjectFullName() );
1359
1360 wxFileDialog dlg( this, _( "Export View as PNG" ), projectPath, fn.GetFullName(),
1361 FILEEXT::PngFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1362
1363 if( dlg.ShowModal() == wxID_CANCEL || dlg.GetPath().IsEmpty() )
1364 return;
1365
1366 // calling wxYield is mandatory under Linux, after closing the file selector dialog
1367 // to refresh the screen before creating the PNG or JPEG image from screen
1368 wxYield();
1369 this->SaveCanvasImageToFile( dlg.GetPath(), BITMAP_TYPE::PNG );
1370}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
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_modedit_32
@ icon_modedit
@ icon_modedit_16
static TOOL_ACTION toggleGrid
Definition: actions.h:177
static TOOL_ACTION paste
Definition: actions.h:72
static TOOL_ACTION millimetersUnits
Definition: actions.h:185
static TOOL_ACTION unselectAll
Definition: actions.h:75
static TOOL_ACTION revert
Definition: actions.h:55
static TOOL_ACTION showLibraryTree
Definition: actions.h:144
static TOOL_ACTION saveAs
Definition: actions.h:52
static TOOL_ACTION copy
Definition: actions.h:71
static TOOL_ACTION pluginsReload
Cursor control event types.
Definition: actions.h:229
static TOOL_ACTION pasteSpecial
Definition: actions.h:73
static TOOL_ACTION milsUnits
Definition: actions.h:184
static TOOL_ACTION toggleBoundingBoxes
Definition: actions.h:137
static TOOL_ACTION undo
Definition: actions.h:68
static TOOL_ACTION duplicate
Definition: actions.h:76
static TOOL_ACTION inchesUnits
Definition: actions.h:183
static TOOL_ACTION highContrastMode
Definition: actions.h:135
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:134
static TOOL_ACTION measureTool
Definition: actions.h:193
static TOOL_ACTION doDelete
Definition: actions.h:77
static TOOL_ACTION selectionTool
Definition: actions.h:192
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION zoomFitScreen
Definition: actions.h:126
static TOOL_ACTION redo
Definition: actions.h:69
static TOOL_ACTION deleteTool
Definition: actions.h:78
static TOOL_ACTION zoomTool
Definition: actions.h:129
static TOOL_ACTION print
Definition: actions.h:57
static TOOL_ACTION showProperties
Definition: actions.h:206
static TOOL_ACTION cut
Definition: actions.h:70
static TOOL_ACTION gridSetOrigin
Definition: actions.h:174
static TOOL_ACTION ddAddLibrary
Definition: actions.h:60
static TOOL_ACTION toggleGridOverrides
Definition: actions.h:178
static TOOL_ACTION selectAll
Definition: actions.h:74
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
std::vector< LAYER_PRESET > GetUserLayerPresets() const
Update the current layer presets from those saved in the project file.
int GetTabIndex() const
Set the current notebook tab.
void UpdateDisplayOptions()
Return a list of the layer presets created by the user.
wxString GetActiveLayerPreset() const
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:92
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:175
bool IsContentModified() const
Definition: base_screen.h:60
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
Container for design settings for a BOARD object.
std::shared_ptr< NET_SETTINGS > m_NetSettings
Abstract interface for BOARD_ITEMs capable of storing other items inside.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:79
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:288
void SetBoardUse(BOARD_USE aUse)
Set what the board is going to be used for.
Definition: board.h:300
void SetEnabledLayers(LSET aLayerMask)
A proxy function that calls the correspondent function in m_BoardSettings.
Definition: board.cpp:775
bool SetLayerName(PCB_LAYER_ID aLayer, const wxString &aLayerName)
Changes the name of the layer given by aLayer.
Definition: board.cpp:589
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition: board.h:439
void SetVisibleAlls()
Change the bit-mask of visible element categories and layers.
Definition: board.cpp:804
const FOOTPRINTS & Footprints() const
Definition: board.h:329
void SetVisibleLayers(LSET aLayerMask)
A proxy function that calls the correspondent function in m_BoardSettings changes the bit-mask of vis...
Definition: board.cpp:787
void SetCopperLayerCount(int aCount)
Definition: board.cpp:737
void DeleteAllFootprints()
Remove all footprints from the deque and free the memory associated with them.
Definition: board.cpp:1355
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:872
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:541
Color settings are a bit different than most of the settings objects in that there can be more than o...
Handle actions that are shared between different applications.
Handles action that are shared between different applications.
Definition: common_tools.h:38
Tool responsible for drawing graphical elements like lines, arcs, circles, etc.
Definition: drawing_tool.h:55
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.
wxAuiManager m_auimgr
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)
bool m_isClosing
Set by NonUserClose() to indicate that the user did not request the current close.
WX_INFOBAR * GetInfoBar()
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
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.
bool SaveCanvasImageToFile(const wxString &aFileName, BITMAP_TYPE aBitmapType)
Save the current view as an image file.
virtual void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Changes the current rendering backend.
EDA_DRAW_PANEL_GAL::GAL_TYPE loadCanvasTypeSetting(APP_SETTINGS_BASE *aCfg=nullptr)
Returns the canvas type stored in the application settings.
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.
static bool m_openGLFailureOccured
Has any failure occured when switching to OpenGL in any EDA_DRAW_FRAME?
static const wxString PropertiesPaneName()
virtual void UpdateMsgPanel()
Redraw the message panel.
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.
@ GAL_TYPE_OPENGL
OpenGL implementation.
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
Specialization of the wxAuiPaneInfo class for KiCad panels.
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 CurrentTool(const TOOL_ACTION &aTool)
Create a functor testing if the specified tool is the current active tool in the frame.
virtual SELECTION_CONDITION UndoAvailable()
Create a functor that tests if there are any items in the undo queue.
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 ContentModified()
Create a functor that tests if the content of the frame is modified.
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
Module editor specific tools.
BOARD_DESIGN_SETTINGS m_DesignSettings
Only some of these settings are actually used for footprint editing.
std::vector< LAYER_PRESET > m_LayerPresets
PCB_SELECTION_FILTER_OPTIONS m_SelectionFilter
void CloseFootprintEditor(wxCommandEvent &Event)
BOARD_DESIGN_SETTINGS & GetDesignSettings() const override
Returns the BOARD_DESIGN_SETTINGS for the open project.
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
void ActivateGalCanvas() override
Use to start up the GAL drawing canvas.
void HardRedraw() override
Refresh the library tree and redraw the window.
static const wxChar * GetFootprintEditorFrameName()
void SyncLibraryTree(bool aProgress)
Synchronize the footprint library tree to the current state of the footprint library table.
void OnSaveFootprintAsPng(wxCommandEvent &event)
void FocusLibraryTreeInput() override
void ToggleLibraryTree() override
BOARD_ITEM_CONTAINER * GetModel() const override
LIB_TREE * GetLibTree() const override
bool canCloseWindow(wxCloseEvent &Event) override
void UpdateMsgPanel() override
Redraw the message panel.
LIB_ID GetTargetFPID() const
Return the LIB_ID of the part selected in the footprint tree, or the loaded part if there is no selec...
LIB_ID GetLoadedFPID() const
Return the LIB_ID of the part being edited.
APP_SETTINGS_BASE * config() const override
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
void SelectLayer(wxCommandEvent &event)
void SetPlotSettings(const PCB_PLOT_PARAMS &aSettings) override
bool SaveFootprint(FOOTPRINT *aFootprint)
Save in an existing library a given footprint.
void initLibraryTree()
Make sure the footprint info list is loaded (with a progress dialog) and then initialize the footprin...
void OnLoadFootprintFromBoard(wxCommandEvent &event)
Called from the main toolbar to load a footprint from board mainly to edit it.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Called after the preferences dialog is run.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void ShowChangedLanguage() override
Update visible items after a language change.
void resolveCanvasType() override
Determines the Canvas type to load (with prompt if required) and initializes m_canvasType.
void OnSaveFootprintToBoard(wxCommandEvent &event)
bool IsContentModified() const override
Get if any footprints or libraries have been modified but not saved.
void UpdateUserInterface()
Update the layer manager and other widgets from the board setup (layer and items visibility,...
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > m_adapter
bool IsLibraryTreeShown() const override
FOOTPRINT_EDITOR_SETTINGS * m_editorSettings
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Returns bbox of document with option to not include some items.
bool Clear_Pcb(bool doAskAboutUnsavedChanges)
Delete all and reinitialize the current board.
Definition: initpcb.cpp:105
void OnUpdateLoadFootprintFromBoard(wxUpdateUIEvent &aEvent)
void OnUpdateSaveFootprintToBoard(wxUpdateUIEvent &aEvent)
Install the corresponding dialog editor for the given item.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
bool CanCloseFPFromBoard(bool doClose)
void AddFootprintToBoard(FOOTPRINT *aFootprint) override
Override from PCB_BASE_EDIT_FRAME which adds a footprint to the editor's dummy board,...
void OnModify() override
Must be called after a footprint change in order to set the "modify" flag of the current screen and p...
FOOTPRINT_TREE_PANE * m_treePane
void OnDisplayOptionsChanged() override
void FocusOnLibID(const LIB_ID &aLibID)
const PCB_PLOT_PARAMS & GetPlotSettings() const override
Return the PCB_PLOT_PARAMS for the BOARD owned by this frame.
std::unique_ptr< FOOTPRINT > m_originalFootprintCopy
void ReloadFootprint(FOOTPRINT *aFootprint) override
Override from PCB_BASE_FRAME which reloads the footprint from the library without setting the footpri...
EDA_ANGLE GetRotationAngle() const override
Return the angle used for rotate operations.
void RefreshLibraryTree()
Redisplay the library tree.
void OnExitKiCad(wxCommandEvent &aEvent)
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
MAGNETIC_SETTINGS * GetMagneticItemsSettings() override
FOOTPRINT_EDITOR_SETTINGS * GetSettings()
void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType) override
Switch the currently used canvas (Cairo / OpenGL).
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
bool ReadFootprintFiles(FP_LIB_TABLE *aTable, const wxString *aNickname=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr) override
Read all the footprints provided by the combination of aTable and aNickname.
void WriteCacheToFile(const wxString &aFilePath) override
void ReadCacheFromFile(const wxString &aFilePath) override
void DisplayErrors(wxTopLevelWindow *aCaller=nullptr)
unsigned GetErrorCount() const
unsigned GetCount() const
Footprint Editor pane with footprint library tree.
void FocusSearchFieldIfExists()
Focus the search widget if it exists.
bool FixUuids()
Old footprints do not always have a valid UUID (some can be set to null uuid) However null UUIDs,...
Definition: footprint.cpp:636
ZONES & Zones()
Definition: footprint.h:200
EDA_ITEM * Clone() const override
Invoke a function on all children.
Definition: footprint.cpp:2023
PADS & Pads()
Definition: footprint.h:194
const LIB_ID & GetFPID() const
Definition: footprint.h:236
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: footprint.cpp:1526
KIID GetLink() const
Definition: footprint.h:840
const wxString & GetReference() const
Definition: footprint.h:590
DRAWINGS & GraphicalItems()
Definition: footprint.h:197
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: footprint.cpp:1239
bool IsFootprintLibWritable(const wxString &aNickname)
Return true if the library given by aNickname is writable.
void AddLibraries(EDA_BASE_FRAME *aParent)
static wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > Create(FOOTPRINT_EDIT_FRAME *aFrame, FP_LIB_TABLE *aLibs)
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:77
bool m_axesEnabled
Fullscreen crosshair or small cross.
void SetAxesEnabled(bool aAxesEnabled)
Enable drawing the axes.
void UpdateAllLayersColor()
Apply the new coloring scheme to all layers.
Definition: view.cpp:804
bool IsMirroredX() const
Return true if view is flipped across the X axis.
Definition: view.h:251
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition: view.h:625
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 KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:406
Module editor specific tools.
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
int SetLibItemName(const UTF8 &aLibItemName)
Override the library item name portion of the LIB_ID to aLibItemName.
Definition: lib_id.cpp:110
bool IsValid() const
Check if this LID_ID is valid.
Definition: lib_id.h:172
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
Definition: lib_id.cpp:99
UTF8 Format() const
Definition: lib_id.cpp:118
const wxString GetUniStringLibItemName() const
Get strings for display messages in dialogs.
Definition: lib_id.h:112
const UTF8 & GetLibItemName() const
Definition: lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:87
void RefreshLibTree()
Refreshes the tree (mainly to update highlighting and asterisking)
Definition: lib_tree.cpp:440
void CenterLibId(const LIB_ID &aLibId)
Ensure that an item is visible (preferably centered).
Definition: lib_tree.cpp:349
void ShowChangedLanguage()
Definition: lib_tree.cpp:291
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition: lib_tree.cpp:343
LIB_TREE_MODEL_ADAPTER::SORT_MODE GetSortMode() const
Definition: lib_tree.h:141
void Unselect()
Unselect currently selected item in wxDataViewCtrl.
Definition: lib_tree.cpp:355
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
For multi-unit symbols, if the user selects the symbol itself rather than picking an individual unit,...
Definition: lib_tree.cpp:301
void Regenerate(bool aKeepState)
Regenerate the tree.
Definition: lib_tree.cpp:422
void SetSortMode(LIB_TREE_MODEL_ADAPTER::SORT_MODE aMode)
Save/restore the sorting mode.
Definition: lib_tree.h:140
Tool relating to pads and pad settings.
Definition: pad_tool.h:37
void ExitPadEditMode()
Definition: pad_tool.cpp:778
bool InPadEditMode()
Definition: pad_tool.h:65
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:59
static const wxChar A4[]
Definition: page_info.h:68
void SetCheckboxesFromFilter(PCB_SELECTION_FILTER_OPTIONS &aOptions)
Gather all the actions that are shared by tools.
Definition: pcb_actions.h:50
static TOOL_ACTION toggleHV45Mode
Definition: pcb_actions.h:512
static TOOL_ACTION drawRuleArea
Definition: pcb_actions.h:218
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 setAnchor
Definition: pcb_actions.h:225
static TOOL_ACTION padDisplayMode
Definition: pcb_actions.h:330
static TOOL_ACTION placeReferenceImage
Definition: pcb_actions.h:202
static TOOL_ACTION showLayersManager
Definition: pcb_actions.h:442
static TOOL_ACTION drawCircle
Definition: pcb_actions.h:200
static TOOL_ACTION mirrorH
Mirroring of selected items.
Definition: pcb_actions.h:139
static TOOL_ACTION exportFootprint
Definition: pcb_actions.h:464
static TOOL_ACTION drawTextBox
Definition: pcb_actions.h:204
static TOOL_ACTION drawPolygon
Definition: pcb_actions.h:198
static TOOL_ACTION placePad
Activation of the drawing tool (placing a PAD)
Definition: pcb_actions.h:472
static TOOL_ACTION group
Definition: pcb_actions.h:520
static TOOL_ACTION drawRadialDimension
Definition: pcb_actions.h:213
static TOOL_ACTION editTextAndGraphics
Definition: pcb_actions.h:412
static TOOL_ACTION drawLeader
Definition: pcb_actions.h:215
static TOOL_ACTION ddImportFootprint
Definition: pcb_actions.h:578
static TOOL_ACTION ungroup
Definition: pcb_actions.h:521
static TOOL_ACTION placeImportedGraphics
Definition: pcb_actions.h:224
static TOOL_ACTION drawArc
Definition: pcb_actions.h:201
static TOOL_ACTION graphicsOutlines
Display footprint graphics as outlines.
Definition: pcb_actions.h:484
static TOOL_ACTION pointEditorArcKeepEndpoint
Definition: pcb_actions.h:294
static TOOL_ACTION drawCenterDimension
Definition: pcb_actions.h:212
static TOOL_ACTION footprintProperties
Definition: pcb_actions.h:466
static TOOL_ACTION flipBoard
Definition: pcb_actions.h:383
static TOOL_ACTION textOutlines
Display texts as lines.
Definition: pcb_actions.h:487
static TOOL_ACTION checkFootprint
Definition: pcb_actions.h:469
static TOOL_ACTION mirrorV
Definition: pcb_actions.h:140
static TOOL_ACTION repairFootprint
Definition: pcb_actions.h:538
static TOOL_ACTION drawLine
Definition: pcb_actions.h:197
static TOOL_ACTION cleanupGraphics
Definition: pcb_actions.h:416
static TOOL_ACTION rotateCw
Rotation of selected objects.
Definition: pcb_actions.h:132
static TOOL_ACTION rotateCcw
Definition: pcb_actions.h:133
static TOOL_ACTION drawAlignedDimension
Definition: pcb_actions.h:211
Common, abstract interface for edit frames.
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.
void setFPWatcher(FOOTPRINT *aFootprint)
Creates (or removes) a watcher on the specified footprint.
void OnModify() override
Must be called after a change in order to set the "modify" flag and update other data structures and ...
FOOTPRINT * loadFootprint(const LIB_ID &aFootprintId)
Attempts to load aFootprintId from the footprint library table.
BOX2I GetBoardBoundingBox(bool aBoardEdgesOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
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 void AddFootprintToBoard(FOOTPRINT *aFootprint)
Add the given footprint to the board.
PCB_DISPLAY_OPTIONS m_displayOptions
FOOTPRINT_EDITOR_SETTINGS * GetFootprintEditorSettings() const
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
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
void UpdateColors()
Update the color settings in the painter and GAL.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void DisplayBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Add all items from the current board to the VIEW, so they can be displayed by GAL.
Group generic conditions for PCB editor states.
SELECTION_CONDITION PadFillDisplay()
Create a functor that tests if the frame fills the pads.
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 TextFillDisplay()
Create a functor that tests if the frame fills text items.
The main frame for Pcbnew.
Generic tool for picking an item.
Parameters and options when plotting/printing a board.
Tool that displays edit points allowing to modify items by dragging the points.
The selection tool: currently supports:
Tool useful for viewing footprints.
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
The interactive edit tool.
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
Definition: project_pcb.cpp:37
@ PCB_FOOTPRINT_EDITOR_FP_NAME
Definition: project.h:192
@ PCB_FOOTPRINT_EDITOR_LIB_NICKNAME
Definition: project.h:193
virtual void SetRString(RSTRING_T aStringId, const wxString &aString)
Store a "retained string", which is any session and project specific string identified in enum RSTRIN...
Definition: project.cpp:269
virtual const wxString & GetRString(RSTRING_T aStringId)
Return a "retained string", which is any session and project specific string identified in enum RSTRI...
Definition: project.cpp:280
float SplitterProportion() const
Action handler for the Properties panel.
Tool relating to pads and pad settings.
static SELECTION_CONDITION HasType(KICAD_T aType)
Create a functor that tests if among the selected items there is at least one of a given type.
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
static bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieves a color settings object that applications can read colors from.
bool IsProjectOpen() const
Helper for checking if we have a project open TODO: This should be deprecated along with Prj() once w...
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
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
virtual void DispatchWxEvent(wxEvent &aEvent)
Process wxEvents (mostly UI events), translate them to TOOL_EVENTs, and make tools handle those.
Master controller class:
Definition: tool_manager.h:62
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
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...
bool empty() const
Definition: utf8.h:104
const char * c_str() const
Definition: utf8.h:103
A modified version of the wxInfoBar class that allows us to:
Definition: wx_infobar.h:75
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
Definition: wx_infobar.cpp:140
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
Definition: confirm.cpp:130
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:195
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define _HKI(x)
static bool empty(const wxTextEntryBase *aCtrl)
#define _(s)
Declaration of the eda_3d_viewer class.
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:403
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define FOOTPRINT_EDIT_FRAME_NAME
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)
FOOTPRINT_LIST_IMPL GFootprintList
The global footprint info table.
Definition: cvpcb.cpp:156
@ FRAME_PCB_EDITOR
Definition: frame_type.h:42
@ FRAME_FOOTPRINT_EDITOR
Definition: frame_type.h:43
static const std::string KiCadFootprintLibPathExtension
static const std::string KiCadFootprintFileExtension
static wxString PngFileWildcard()
@ ID_ON_GRID_SELECT
Definition: id.h:145
@ ID_ON_ZOOM_SELECT
Definition: id.h:143
PROJECT & Prj()
Definition: kicad.cpp:595
KIID niluuid(0)
@ F_SilkS
Definition: layer_ids.h:104
@ In1_Cu
Definition: layer_ids.h:65
This file contains miscellaneous commonly used macros and functions.
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
Definition: definitions.h:49
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: unix/app.cpp:90
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: unix/app.cpp:79
@ ID_FPEDIT_SAVE_PNG
Definition: pcbnew_id.h:98
@ ID_ADD_FOOTPRINT_TO_BOARD
Definition: pcbnew_id.h:116
@ ID_LOAD_FOOTPRINT_FROM_BOARD
Definition: pcbnew_id.h:117
@ ID_TOOLBARH_PCB_SELECT_LAYER
Definition: pcbnew_id.h:96
SETTINGS_MANAGER * GetSettingsManager()
BOARD * GetBoard()
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1059
see class PGM_BASE
KIWAY Kiway(KFCTL_STANDALONE)
wxString From_UTF8(const char *cstring)
const double IU_PER_MILS
Definition: base_units.h:77
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition: typeinfo.h:110
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition: typeinfo.h:93
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition: typeinfo.h:92
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.