KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pl_editor_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) 2013 CERN
5 * Copyright (C) 2017-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 * @author Jean-Pierre Charras, jp.charras at wanadoo.fr
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <kiface_base.h>
27#include <pgm_base.h>
28#include <bitmaps.h>
29#include <core/arraydim.h>
33#include <confirm.h>
34#include <kiplatform/app.h>
35#include <painter.h>
37#include <tool/selection.h>
38#include <tool/action_toolbar.h>
41#include <tool/tool_manager.h>
42#include <tool/common_control.h>
43#include <tool/common_tools.h>
44#include <tool/picker_tool.h>
45#include <tool/zoom_tool.h>
47#include "pl_editor_frame.h"
48#include "pl_editor_id.h"
49#include "pl_editor_settings.h"
50#include "properties_frame.h"
51#include "tools/pl_actions.h"
54#include "tools/pl_edit_tool.h"
58#include <zoom_defines.h>
59
60#include <wx/filedlg.h>
61#include <wx/print.h>
62#include <wx/treebook.h>
63
64
65BEGIN_EVENT_TABLE( PL_EDITOR_FRAME, EDA_DRAW_FRAME )
66 EVT_MENU( wxID_CLOSE, PL_EDITOR_FRAME::OnExit )
67 EVT_MENU( wxID_EXIT, PL_EDITOR_FRAME::OnExit )
68
69 EVT_MENU( wxID_FILE, PL_EDITOR_FRAME::Files_io )
70
73
75
78
79 // Drop files event
80 EVT_DROP_FILES( PL_EDITOR_FRAME::OnDropFiles )
81END_EVENT_TABLE()
82
83
84PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
85 EDA_DRAW_FRAME( aKiway, aParent, FRAME_PL_EDITOR, wxT( "PlEditorFrame" ),
86 wxDefaultPosition, wxDefaultSize,
88 m_propertiesPagelayout( nullptr ),
89 m_propertiesFrameWidth( 200 ),
90 m_originSelectBox( nullptr ),
91 m_originSelectChoice( 0 ),
92 m_pageSelectBox( nullptr ),
93 m_mruImagePath( wxEmptyString )
94{
95 m_maximizeByDefault = true;
96 SetUserUnits( EDA_UNITS::MILLIMETRES );
97
98 m_showBorderAndTitleBlock = true; // true for reference drawings.
100 m_aboutTitle = _HKI( "KiCad Drawing Sheet Editor" );
101
102 // Give an icon
103 wxIcon icon;
104 wxIconBundle icon_bundle;
105
106 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor ) );
107 icon_bundle.AddIcon( icon );
108 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_32 ) );
109 icon_bundle.AddIcon( icon );
110 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_16 ) );
111 icon_bundle.AddIcon( icon );
112
113 SetIcons( icon_bundle );
114
115 // Create GAL canvas
116 auto* drawPanel = new PL_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
117 GetGalDisplayOptions(),
119 SetCanvas( drawPanel );
120
121 LoadSettings( config() );
122
123 m_acceptedExts.emplace( DrawingSheetFileExtension, nullptr );
124 DragAcceptFiles( true );
125
126 VECTOR2I pageSizeIU = GetPageLayout().GetPageSettings().GetSizeIU( drawSheetIUScale.IU_PER_MILS );
127 SetScreen( new BASE_SCREEN( pageSizeIU ) );
128
129 setupTools();
130 setupUIConditions();
131 ReCreateMenuBar();
132 ReCreateHToolbar();
133 ReCreateVToolbar();
134 ReCreateOptToolbar();
135
136 wxWindow* stsbar = GetStatusBar();
137 int spacer = KIUI::GetTextSize( wxT( "M" ), stsbar ).x * 2;
138
139 int dims[] = {
140
141 // balance of status bar on far left is set to a default or whatever is left over.
142 -1,
143
144 // When using GetTextSize() remember the width of '1' is not the same
145 // as the width of '0' unless the font is fixed width, and it usually won't be.
146
147 // zoom:
148 KIUI::GetTextSize( wxT( "Z 762000" ), stsbar ).x + spacer,
149
150 // cursor coords
151 KIUI::GetTextSize( wxT( "X 0234.567 Y 0234.567" ), stsbar ).x + spacer,
152
153 // delta distances
154 KIUI::GetTextSize( wxT( "dx 0234.567 dx 0234.567" ), stsbar ).x + spacer,
155
156 // grid size
157 KIUI::GetTextSize( wxT( "grid 0234.567" ), stsbar ).x + spacer,
158
159 // Coord origin (use the bigger message)
160 KIUI::GetTextSize( _( "coord origin: Right Bottom page corner" ), stsbar ).x + spacer,
161
162 // units display, Inches is bigger than mm
163 KIUI::GetTextSize( _( "Inches" ), stsbar ).x + spacer,
164
165 // constraint mode
166 KIUI::GetTextSize( _( "Constrain to H, V, 45" ), stsbar ).x + spacer
167 };
168
169 SetStatusWidths( arrayDim( dims ), dims );
170
171 m_auimgr.SetManagedWindow( this );
172
173 CreateInfoBar();
174 m_propertiesPagelayout = new PROPERTIES_FRAME( this );
175
176 // Rows; layers 4 - 6
177 m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
178 .Top().Layer( 6 ) );
179 m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
180 .Left().Layer( 3 ) );
181 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
182 .Bottom().Layer( 6 ) );
183
184 // Columns; layers 1 - 3
185 m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
186 .Right().Layer( 2 ) );
187
188 m_auimgr.AddPane( m_propertiesPagelayout, EDA_PANE().Palette().Name( "Props" )
189 .Right().Layer( 3 )
190 .Caption( _( "Properties" ) )
191 .MinSize( m_propertiesPagelayout->GetMinSize() )
192 .BestSize( m_propertiesFrameWidth, -1 ) );
193
194 // Center
195 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" )
196 .Center() );
197
198 FinishAUIInitialization();
199
200 resolveCanvasType();
201 SwitchCanvas( m_canvasType );
202
203 // Add the exit key handler
204 setupUnits( config() );
205
206 VECTOR2I originCoord = ReturnCoordOriginCorner();
207 SetGridOrigin( originCoord );
208
209 // Initialize the current drawing sheet
210#if 0 //start with empty layout
213#else // start with the default KiCad layout
215#endif
216 OnNewDrawingSheet();
217
218 // Ensure the window is on top
219 Raise();
220
221 // Register a call to update the toolbar sizes. It can't be done immediately because
222 // it seems to require some sizes calculated that aren't yet (at least on GTK).
223 CallAfter( [&]()
224 {
225 // Ensure the controls on the toolbars all are correctly sized
226 UpdateToolbarControlSizes();
227 } );
228}
229
230
232{
233 // Ensure m_canvasType is up to date, to save it in config
235
236 // Shutdown all running tools
237 if( m_toolManager )
239}
240
241
243{
244 // Create the manager and dispatcher & route draw panel events to the dispatcher
246 m_toolManager->SetEnvironment( nullptr, GetCanvas()->GetView(),
247 GetCanvas()->GetViewControls(), config(), this );
248 m_actions = new PL_ACTIONS();
250
252
253 // Register tools
264
265 // Run the selection tool, it is supposed to be always active
266 m_toolManager->InvokeTool( "plEditor.InteractiveSelection" );
267}
268
269
271{
273
275 EDITOR_CONDITIONS cond( this );
276
277 wxASSERT( mgr );
278
279#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
280#define CHECK( x ) ACTION_CONDITIONS().Check( x )
281
285
288 mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) );
289 mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) );
290 mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
291
296
303
312
313 // Not a tool, just a way to activate the action
316
317 auto titleBlockNormalMode =
318 [] ( const SELECTION& )
319 {
321 };
322
323 auto titleBlockEditMode =
324 [] ( const SELECTION& )
325 {
327 };
328
329 mgr->SetConditions( PL_ACTIONS::layoutNormalMode, CHECK( titleBlockNormalMode ) );
330 mgr->SetConditions( PL_ACTIONS::layoutEditMode, CHECK( titleBlockEditMode ) );
331
332#undef CHECK
333#undef ENABLE
334}
335
336
337bool PL_EDITOR_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
338{
339 wxString fn = aFileSet[0];
340
341 if( !LoadDrawingSheetFile( fn ) )
342 {
343 wxMessageBox( wxString::Format( _( "Error loading drawing sheet '%s'." ), fn ) );
344 return false;
345 }
346 else
347 {
349 return true;
350 }
351}
352
353
355{
356 // Must be called after a change in order to set the "modify" flag and update
357 // the frame title.
359
361
363}
364
365
367{
368 return GetScreen() && GetScreen()->IsContentModified();
369}
370
371
372void PL_EDITOR_FRAME::OnExit( wxCommandEvent& aEvent )
373{
374 if( aEvent.GetId() == wxID_EXIT )
375 Kiway().OnKiCadExit();
376
377 if( aEvent.GetId() == wxID_CLOSE || Kiface().IsSingle() )
378 Close( false );
379}
380
381
382bool PL_EDITOR_FRAME::canCloseWindow( wxCloseEvent& aEvent )
383{
384 // Shutdown blocks must be determined and vetoed as early as possible
386 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
387 && IsContentModified() )
388 {
389 return false;
390 }
391
392 if( IsContentModified() )
393 {
394 wxFileName filename = GetCurrentFileName();
395 wxString msg = _( "Save changes to '%s' before closing?" );
396
397 if( !HandleUnsavedChanges( this, wxString::Format( msg, filename.GetFullName() ),
398 [&]() -> bool
399 {
400 return saveCurrentPageLayout();
401 } ) )
402 {
403 return false;
404 }
405 }
406
407 return true;
408}
409
410
412{
413 // do not show the window because we do not want any paint event
414 Show( false );
415
416 // clean up the data before the view is destroyed
418
419 // On Linux, m_propertiesPagelayout must be destroyed
420 // before deleting the main frame to avoid a crash when closing
421 m_propertiesPagelayout->Destroy();
422 Destroy();
423}
424
425
426void PL_EDITOR_FRAME::OnSelectPage( wxCommandEvent& event )
427{
428 KIGFX::VIEW* view = GetCanvas()->GetView();
429 view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGE1, m_pageSelectBox->GetSelection() == 0 );
430 view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGEn, m_pageSelectBox->GetSelection() == 1 );
431 GetCanvas()->Refresh();
432}
433
434
436{
437 m_originSelectChoice = m_originSelectBox->GetSelection();
438 UpdateStatusBar(); // Update grid origin
440 GetCanvas()->Refresh();
441}
442
443
444void PL_EDITOR_FRAME::ToPrinter( bool doPreview )
445{
446 // static print data and page setup data, to remember settings during the session
447 static wxPrintData* s_PrintData;
448 static wxPageSetupDialogData* s_pageSetupData = nullptr;
449
450 const PAGE_INFO& pageInfo = GetPageSettings();
451
452 if( s_PrintData == nullptr ) // First print
453 {
454 s_PrintData = new wxPrintData();
455 s_PrintData->SetQuality( wxPRINT_QUALITY_HIGH ); // Default resolution = HIGH;
456 }
457
458 if( !s_PrintData->Ok() )
459 {
460 wxMessageBox( _( "Error Init Printer info" ) );
461 return;
462 }
463
464 if( s_pageSetupData == nullptr )
465 s_pageSetupData = new wxPageSetupDialogData( *s_PrintData );
466
467 s_pageSetupData->SetPaperId( pageInfo.GetPaperId() );
468 s_pageSetupData->GetPrintData().SetOrientation( pageInfo.GetWxOrientation() );
469
470 if( pageInfo.IsCustom() )
471 {
472 if( pageInfo.IsPortrait() )
473 s_pageSetupData->SetPaperSize( wxSize( EDA_UNIT_UTILS::Mils2mm( pageInfo.GetWidthMils() ),
474 EDA_UNIT_UTILS::Mils2mm( pageInfo.GetHeightMils() ) ) );
475 else
476 s_pageSetupData->SetPaperSize( wxSize( EDA_UNIT_UTILS::Mils2mm( pageInfo.GetHeightMils() ),
477 EDA_UNIT_UTILS::Mils2mm( pageInfo.GetWidthMils() ) ) );
478 }
479
480 *s_PrintData = s_pageSetupData->GetPrintData();
481
482 if( doPreview )
483 InvokeDialogPrintPreview( this, s_PrintData );
484 else
485 InvokeDialogPrint( this, s_PrintData, s_pageSetupData );
486}
487
488
489const BOX2I PL_EDITOR_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
490{
492 return rv;
493}
494
495
497{
499
500 if( aCfg->m_Window.grid.sizes.empty() )
501 {
502 aCfg->m_Window.grid.sizes = { "5.00 mm",
503 "2.50 mm",
504 "2.00 mm",
505 "1.00 mm",
506 "0.50 mm",
507 "0.25 mm",
508 "0.20 mm",
509 "0.10 mm" };
510 }
511
512 // Currently values read from config file are not used because the user cannot
513 // change this config
514 // if( aCfg->m_Window.zoom_factors.empty() )
515 {
517 }
518
519 PL_EDITOR_SETTINGS* cfg = dynamic_cast<PL_EDITOR_SETTINGS*>( aCfg );
520 wxCHECK( cfg, /*void*/ );
521
524
526
529
530 PAGE_INFO pageInfo = GetPageSettings();
531 pageInfo.SetType( cfg->m_LastPaperSize, cfg->m_LastWasPortrait );
532 SetPageSettings( pageInfo );
533}
534
535
537{
539
540 auto cfg = static_cast<PL_EDITOR_SETTINGS*>( aCfg );
541
543
544 cfg->m_PropertiesFrameWidth = m_propertiesFrameWidth;
545 cfg->m_CornerOrigin = m_originSelectChoice;
546 cfg->m_BlackBackground = GetDrawBgColor() == BLACK;
547 cfg->m_LastPaperSize = GetPageSettings().GetType();
548 cfg->m_LastWasPortrait = GetPageSettings().IsPortrait();
549 cfg->m_LastCustomWidth = PAGE_INFO::GetCustomWidthMils();
550 cfg->m_LastCustomHeight = PAGE_INFO::GetCustomHeightMils();
551}
552
553
555{
556 wxString title;
557 wxFileName file( GetCurrentFileName() );
558
559 if( IsContentModified() )
560 title = wxT( "*" );
561
562 if( file.IsOk() )
563 title += file.GetName();
564 else
565 title += _( "[no drawing sheet loaded]" );
566
567 title += wxT( " \u2014 " ) + _( "Drawing Sheet Editor" ),
568
569 SetTitle( title );
570}
571
572
574{
576}
577
578
579void PL_EDITOR_FRAME::SetCurrentFileName( const wxString& aName )
580{
582}
583
584
585void PL_EDITOR_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
586{
587 m_pageLayout.SetPageSettings( aPageSettings );
588
589 if( GetScreen() )
591}
592
593
595{
597}
598
599
601{
602 // this function is only needed because EDA_DRAW_FRAME is not compiled
603 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
604 // into an application specific source file.
606}
607
608
610{
611 return GetPageLayout().GetTitleBlock();
612}
613
614
616{
617 m_pageLayout.SetTitleBlock( aTitleBlock );
618}
619
620
621void PL_EDITOR_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
622{
623 EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
624
625 SETTINGS_MANAGER& settingsManager = Pgm().GetSettingsManager();
626 PL_EDITOR_SETTINGS* cfg = settingsManager.GetAppSettings<PL_EDITOR_SETTINGS>();
627 COLOR_SETTINGS* colors = settingsManager.GetColorSettings( cfg->m_ColorTheme );
628
629 // Update gal display options like cursor shape, grid options:
631
632 GetCanvas()->GetView()->GetPainter()->GetSettings()->LoadColors( colors );
633
636
638 Layout();
639 SendSizeEvent();
640}
641
642
644{
645 // calculate the position (in page, in iu) of the corner used as coordinate origin
646 // coordinate origin can be the paper Top Left corner, or each of 4 page corners
647 VECTOR2I originCoord;
648
649 // To avoid duplicate code, we use a dummy segment starting at 0,0 in relative coord
651
652 switch( m_originSelectChoice )
653 {
654 default:
655 case 0: // Origin = paper Left Top corner
656 break;
657
658 case 1: // Origin = page Right Bottom corner
659 dummy.SetStart( 0, 0, RB_CORNER );
660 originCoord = dummy.GetStartPosIU();
661 break;
662
663 case 2: // Origin = page Left Bottom corner
664 dummy.SetStart( 0, 0, LB_CORNER );
665 originCoord = dummy.GetStartPosIU();
666 break;
667
668 case 3: // Origin = page Right Top corner
669 dummy.SetStart( 0, 0, RT_CORNER );
670 originCoord = dummy.GetStartPosIU();
671 break;
672
673 case 4: // Origin = page Left Top corner
674 dummy.SetStart( 0, 0, LT_CORNER );
675 originCoord = dummy.GetStartPosIU();
676 break;
677 }
678
679 return originCoord;
680}
681
682
684{
685 wxString line;
686 wxString gridformatter;
687
688 switch( GetUserUnits() )
689 {
690 case EDA_UNITS::INCHES: gridformatter = wxS( "grid %.3f" ); break;
691 case EDA_UNITS::MILLIMETRES: gridformatter = wxS( "grid %.4f" ); break;
692 default: gridformatter = wxS( "grid %f" ); break;
693 }
694
696 GetCanvas()->GetGAL()->GetGridSize().x );
697 line.Printf( gridformatter, grid );
698
699 SetStatusText( line, 4 );
700}
701
702
704{
705 // Display Zoom level:
706 SetStatusText( GetZoomLevelIndicator(), 1 );
707
708 // coordinate origin can be the paper Top Left corner, or each of 4 page corners
709 VECTOR2I originCoord = ReturnCoordOriginCorner();
710 SetGridOrigin( originCoord );
711
712 // We need the orientation of axis (sign of coordinates)
713 int Xsign = 1;
714 int Ysign = 1;
715
716 switch( m_originSelectChoice )
717 {
718 default:
719 case 0: // Origin = paper Left Top corner
720 break;
721
722 case 1: // Origin = page Right Bottom corner
723 Xsign = -1;
724 Ysign = -1;
725 break;
726
727 case 2: // Origin = page Left Bottom corner
728 Ysign = -1;
729 break;
730
731 case 3: // Origin = page Right Top corner
732 Xsign = -1;
733 break;
734
735 case 4: // Origin = page Left Top corner
736 break;
737 }
738
739 // Display absolute coordinates:
741 VECTOR2D coord = cursorPos - originCoord;
742 double dXpos =
744 double dYpos =
746
747 wxString absformatter = wxT( "X %.4g Y %.4g" );
748 wxString locformatter = wxT( "dx %.4g dy %.4g" );
749
750 switch( GetUserUnits() )
751 {
752 case EDA_UNITS::INCHES: SetStatusText( _( "inches" ), 6 ); break;
753 case EDA_UNITS::MILS: SetStatusText( _( "mils" ), 6 ); break;
754 case EDA_UNITS::MILLIMETRES: SetStatusText( _( "mm" ), 6 ); break;
755 case EDA_UNITS::UNSCALED: SetStatusText( wxEmptyString, 6 ); break;
756 default: wxASSERT( false ); break;
757 }
758
759 wxString line;
760
761 // Display abs coordinates
762 line.Printf( absformatter, dXpos, dYpos );
763 SetStatusText( line, 2 );
764
765 // Display relative coordinates:
766 if( GetScreen() )
767 {
768 double dx = cursorPos.x - GetScreen()->m_LocalOrigin.x;
769 double dy = cursorPos.y - GetScreen()->m_LocalOrigin.y;
772 line.Printf( locformatter, dXpos, dYpos );
773 SetStatusText( line, 3 );
774 }
775
777
778 // Display corner reference for coord origin
779 line.Printf( _("coord origin: %s"),
780 m_originSelectBox->GetString( m_originSelectChoice ).GetData() );
781 SetStatusText( line, 5 );
782}
783
784
786{
789
790 for( DS_DATA_ITEM* dataItem : model.GetItems() )
791 {
792 // Ensure the scaling factor (used only in printing) of bitmaps is up to date
793 if( dataItem->GetType() == DS_DATA_ITEM::DS_BITMAP )
794 {
795 BITMAP_BASE* bitmap = static_cast<DS_DATA_ITEM_BITMAP*>( dataItem )->m_ImageBitmap;
796 bitmap->SetPixelSizeIu( drawSheetIUScale.IU_PER_MILS * 1000 / bitmap->GetPPI() );
797 }
798 }
799
801 wxEmptyString );
802
804 GetCanvas()->Refresh();
805}
806
807
809{
810 return static_cast<PL_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
811}
812
813
815{
816 return m_toolManager->GetTool<PL_SELECTION_TOOL>()->GetSelection();
817}
818
819
821{
823
825 PL_SELECTION& selection = selTool->GetSelection();
826 DS_DATA_ITEM* item = nullptr;
827
828 if( selection.GetSize() == 1 )
829 item = static_cast<DS_DRAW_ITEM_BASE*>( selection.Front() )->GetPeer();
830
834 GetCanvas()->Refresh();
835}
836
837
839{
840 DS_DATA_ITEM * item = nullptr;
841
842 switch( aType )
843 {
845 item = new DS_DATA_ITEM_TEXT( wxT( "Text") );
846 break;
847
850 break;
851
854 break;
855
857 item = new DS_DATA_ITEM_POLYGONS();
858 break;
859
861 {
862 wxFileDialog fileDlg( this, _( "Choose Image" ), m_mruImagePath, wxEmptyString,
863 _( "Image Files" ) + wxS( " " ) + wxImage::GetImageExtWildcard(),
864 wxFD_OPEN );
865
866 if( fileDlg.ShowModal() != wxID_OK )
867 return nullptr;
868
869 wxString fullFilename = fileDlg.GetPath();
870 m_mruImagePath = wxPathOnly( fullFilename );
871
872 if( !wxFileExists( fullFilename ) )
873 {
874 wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
875 break;
876 }
877
879
880 if( !image->ReadImageFile( fullFilename ) )
881 {
882 wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
883 delete image;
884 break;
885 }
886
887 // Set the scale factor for pl_editor (it is set for Eeschema by default)
888 image->SetPixelSizeIu( drawSheetIUScale.IU_PER_MILS * 1000.0 / image->GetPPI() );
889 item = new DS_DATA_ITEM_BITMAP( image );
890 }
891 break;
892 }
893
894 if( item == nullptr )
895 return nullptr;
896
898 item->SyncDrawItems( nullptr, GetCanvas()->GetView() );
899
900 return item;
901}
902
903
905{
907 GetScreen()->SetContentModified( false );
909
912
914
916
917 if( GetCurrentFileName().IsEmpty() )
918 {
919 // Default shutdown reason until a file is loaded
920 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New drawing sheet file is unsaved" ) );
921 }
922 else
923 {
924 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Drawing sheet changes are unsaved" ) );
925 }
926}
927
928
930{
931 if( aItemCount == 0 )
932 return;
933
934 UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
935 unsigned icnt = list.m_CommandsList.size();
936
937 if( aItemCount > 0 )
938 icnt = aItemCount;
939
940 for( unsigned ii = 0; ii < icnt; ii++ )
941 {
942 if( list.m_CommandsList.size() == 0 )
943 break;
944
945 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
946 list.m_CommandsList.erase( list.m_CommandsList.begin() );
947
948 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
949 {
950 delete aItem;
951 } );
952 delete curr_cmd; // Delete command
953 }
954}
955
956
958{
959 return m_pageSelectBox->GetSelection() == 0;
960}
961
962#if 1
964{
966
967 std::vector<MSG_PANEL_ITEM> msgItems;
968 msgItems.emplace_back( _( "Page Width" ), MessageTextFromValue( size.x ) );
969 msgItems.emplace_back( _( "Page Height" ), MessageTextFromValue( size.y ) );
970
971 SetMsgPanel( msgItems );
972}
973#endif
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
constexpr EDA_IU_SCALE drawSheetIUScale
Definition: base_units.h:110
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:106
@ icon_pagelayout_editor
@ icon_pagelayout_editor_16
@ icon_pagelayout_editor_32
static TOOL_ACTION toggleGrid
Definition: actions.h:144
static TOOL_ACTION paste
Definition: actions.h:69
static TOOL_ACTION millimetersUnits
Definition: actions.h:150
static TOOL_ACTION copy
Definition: actions.h:68
static TOOL_ACTION milsUnits
Definition: actions.h:149
static TOOL_ACTION undo
Definition: actions.h:65
static TOOL_ACTION inchesUnits
Definition: actions.h:148
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:105
static TOOL_ACTION doDelete
Definition: actions.h:73
static TOOL_ACTION selectionTool
Definition: actions.h:157
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION zoomFitScreen
Definition: actions.h:99
static TOOL_ACTION redo
Definition: actions.h:66
static TOOL_ACTION deleteTool
Definition: actions.h:74
static TOOL_ACTION zoomTool
Definition: actions.h:102
static TOOL_ACTION cut
Definition: actions.h:67
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...
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:110
WINDOW_SETTINGS m_Window
Definition: app_settings.h:187
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:190
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:41
bool IsContentModified() const
Definition: base_screen.h:60
void SetVirtualPageNumber(int aPageNumber)
Definition: base_screen.h:76
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
Definition: base_screen.h:85
VECTOR2D m_LocalOrigin
Relative Screen cursor coordinate (on grid) in user units.
Definition: base_screen.h:90
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
void InitDataPoints(const VECTOR2I &aPageSizeInternalUnits)
Definition: base_screen.cpp:46
This class handle bitmap images in KiCad.
Definition: bitmap_base.h:52
void SetPixelSizeIu(double aPixSize)
Definition: bitmap_base.h:69
int GetPPI() const
Definition: bitmap_base.h:123
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
Drawing sheet structure type definitions.
Definition: ds_data_item.h:96
virtual void SyncDrawItems(DS_DRAW_ITEM_LIST *aCollector, KIGFX::VIEW *aView)
Handle the graphic items list to draw/plot the frame and title block.
Definition: ds_data_model.h:39
static DS_DATA_MODEL & GetTheInstance()
static function: returns the instance of DS_DATA_MODEL used in the application
void Append(DS_DATA_ITEM *aItem)
void AllowVoidList(bool Allow)
In KiCad applications, a drawing sheet is needed So if the list is empty, a default drawing sheet is ...
Definition: ds_data_model.h:83
void ClearList()
Erase the list of items.
std::vector< DS_DATA_ITEM * > & GetItems()
bool LoadDrawingSheet(const wxString &aFullFileName=wxEmptyString, bool Append=false)
Populates the list with a custom layout or the default layout if no custom layout is available.
Base class to handle basic graphic items.
Definition: ds_draw_item.h:59
virtual APP_SETTINGS_BASE * config() const
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
UNDO_REDO_CONTAINER m_undoList
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
UNDO_REDO_LIST
Specifies whether we are interacting with the undo or redo stacks.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
UNDO_REDO_CONTAINER m_redoList
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handles event fired when a file is dropped to the window.
The base class for create windows for drawing purpose.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
virtual BASE_SCREEN * GetScreen() const
Return a pointer to a BASE_SCREEN or one of its derivatives.
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
KIGFX::GAL_DISPLAY_OPTIONS & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
const wxString GetZoomLevelIndicator() const
Return a human readable value for display in dialogs.
void RecreateToolbars()
Rebuild all toolbars, and update the checked state of check tools.
virtual void SetDrawBgColor(const COLOR4D &aColor)
void OnGridSettings(wxCommandEvent &event)
void PrintDrawingSheet(const RENDER_SETTINGS *aSettings, BASE_SCREEN *aScreen, const std::map< wxString, wxString > *aProperties, double aMils2Iu, const wxString &aFilename, const wxString &aSheetLayer=wxEmptyString)
Prints the drawing-sheet (frame and title block).
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual COLOR4D GetDrawBgColor() const
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
@ GAL_TYPE_NONE
GAL not used (the legacy wxDC engine is used)
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
Specialization of the wxAuiPaneInfo class for KiCad panels.
Class that groups generic conditions for editor states.
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.
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 FullscreenCursor()
Create a functor testing if the cursor is full screen in a frame.
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
virtual void LoadColors(const COLOR_SETTINGS *aSettings)
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:69
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:393
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1501
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:213
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:279
void OnKiCadExit()
Definition: kiway.cpp:733
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:54
static void SetCustomWidthMils(int aWidthInMils)
Set the width of Custom page in mils for any custom page constructed or made via SetType() after maki...
Definition: page_info.cpp:233
static int GetCustomHeightMils()
Definition: page_info.h:187
static void SetCustomHeightMils(int aHeightInMils)
Set the height of Custom page in mils for any custom page constructed or made via SetType() after mak...
Definition: page_info.cpp:239
wxPrintOrientation GetWxOrientation() const
Definition: page_info.h:122
const VECTOR2I GetSizeIU(double aIUScale) const
Gets the page size in internal units.
Definition: page_info.h:162
int GetHeightMils() const
Definition: page_info.h:133
wxPaperSize GetPaperId() const
Definition: page_info.h:127
int GetWidthMils() const
Definition: page_info.h:130
const wxString & GetType() const
Definition: page_info.h:94
bool IsCustom() const
Definition: page_info.cpp:182
bool IsPortrait() const
Definition: page_info.h:117
static int GetCustomWidthMils()
Definition: page_info.h:182
bool SetType(const wxString &aStandardPageDescriptionName, bool aIsPortrait=false)
Set the name of the page type and also the sizes and margins commonly associated with that type name.
Definition: page_info.cpp:121
A holder to handle information on schematic or board items.
void ClearListAndDeleteItems(std::function< void(EDA_ITEM *)> aItemDeleter)
Delete the list of pickers AND the data pointed by #m_PickedItem or #m_PickedItemLink according to th...
Gather all the actions that are shared by tools.
Definition: pl_actions.h:36
static TOOL_ACTION placeImage
Definition: pl_actions.h:59
static TOOL_ACTION drawRectangle
Definition: pl_actions.h:60
static TOOL_ACTION layoutNormalMode
Definition: pl_actions.h:67
static TOOL_ACTION placeText
Definition: pl_actions.h:58
static TOOL_ACTION layoutEditMode
Definition: pl_actions.h:68
static TOOL_ACTION appendImportedDrawingSheet
Definition: pl_actions.h:62
static TOOL_ACTION drawLine
Definition: pl_actions.h:61
Tool responsible for drawing/placing items (lines, rectangles, text, etc.)
void DisplayDrawingSheet()
Build and update the list of WS_DRAW_ITEM_xxx showing the frame layout.
Handle actions specific to the drawing sheet editor.
The main window used in the drawing sheet editor.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl) override
Open a project or set of files given by aFileList.
void OnNewDrawingSheet()
Must be called to initialize parameters when a new drawing sheet is loaded.
void OnModify() override
Must be called after a change in order to set the "modify" flag.
void SetCurrentFileName(const wxString &aName)
Store the current layout description file filename.
bool IsContentModified() const override
Get if the drawing sheet has been modified but not saved.
void Files_io(wxCommandEvent &event)
void ToPrinter(bool doPreview)
Open a dialog frame to print layers.
void UpdateMsgPanelInfo()
Display the size of the sheet to the message panel.
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Returns bbox of document with option to not include some items.
wxString m_mruImagePath
void doCloseWindow() override
VECTOR2I ReturnCoordOriginCorner() const
Calculate the position (in page, in iu) of the corner used as coordinate origin of items.
void OnClearFileHistory(wxCommandEvent &aEvent)
void SetPageSettings(const PAGE_INFO &) override
DS_DATA_ITEM * AddDrawingSheetItem(int aType)
Add a new item to the drawing sheet item list.
wxString GetCurrentFileName() const override
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
void OnFileHistory(wxCommandEvent &event)
void UpdateStatusBar() override
Update the status bar information.
void SetGridOrigin(const VECTOR2I &aPoint) override
void OnSelectPage(wxCommandEvent &event)
const TITLE_BLOCK & GetTitleBlock() const override
void UpdateTitleAndInfo()
Display the short filename (if exists) loaded file on the caption of the main window.
const VECTOR2I GetPageSizeIU() const override
Works off of GetPageSettings() to return the size of the paper page in the internal units of this par...
virtual void PrintPage(const RENDER_SETTINGS *aSettings) override
Print a page.
void OnSelectCoordOriginCorner(wxCommandEvent &event)
Called when the user select one of the 4 page corner as corner reference (or the left top paper corne...
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
PL_EDITOR_LAYOUT m_pageLayout
bool GetPageNumberOption() const
Drawing sheet editor can show the title block using a page number 1 or another number.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
void HardRedraw() override
Refresh the library tree and redraw the window.
void DisplayGridMsg() override
Display current grid size in the status bar.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
wxChoice * m_originSelectBox
const PAGE_INFO & GetPageSettings() const override
const PL_EDITOR_LAYOUT & GetPageLayout() const
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
PROPERTIES_FRAME * m_propertiesPagelayout
The last filename chosen to be proposed to the user.
wxChoice * m_pageSelectBox
PL_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void ClearUndoORRedoList(UNDO_REDO_LIST whichList, int aItemCount=-1) override
Remove the aItemCount of old commands from aList and delete commands, pickers and picked items if nee...
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock) override
void OnExit(wxCommandEvent &aEvent)
Event handler for the wxID_EXIT and wxID_CLOSE events.
bool LoadDrawingSheetFile(const wxString &aFullFileName)
Load a .kicad_wks drawing sheet file.
void SetPageSettings(const PAGE_INFO &aPageSettings)
TITLE_BLOCK & GetTitleBlock()
PAGE_INFO & GetPageSettings()
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Tool that displays edit points allowing to modify items by dragging the points.
PL_SELECTION & GetSelection()
Return the set of currently selected items.
PROPERTIES_FRAME display properties of the current item.
void CopyPrmsFromItemToPanel(DS_DATA_ITEM *aItem)
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).
static bool ShowNever(const SELECTION &aSelection)
Always returns false.
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.
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition: title_block.h:41
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:170
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:172
ACTIONS * m_actions
Definition: tools_holder.h:171
Master controller class:
Definition: tool_manager.h:55
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:142
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:196
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...
A holder to handle a list of undo (or redo) commands.
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A lower-precision version of StringFromValue().
EDA_UNITS GetUserUnits() const
@ WHITE
Definition: color4d.h:47
@ BLACK
Definition: color4d.h:43
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:243
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define _HKI(x)
int InvokeDialogPrintPreview(PL_EDITOR_FRAME *aCaller, wxPrintData *aPrintData)
Create and show a print preview dialog returns 1 if OK, 0 , there is a problem.
int InvokeDialogPrint(PL_EDITOR_FRAME *aCaller, wxPrintData *aPrintData, wxPageSetupDialogData *aPageSetupData)
Create and show a print dialog returns 1 if OK, 0 , there is a problem.
@ RB_CORNER
Definition: ds_data_item.h:49
@ RT_CORNER
Definition: ds_data_item.h:50
@ LT_CORNER
Definition: ds_data_item.h:52
@ LB_CORNER
Definition: ds_data_item.h:51
#define _(s)
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define PL_EDITOR_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
EVT_MENU_RANGE(ID_GERBVIEW_DRILL_FILE1, ID_GERBVIEW_DRILL_FILEMAX, GERBVIEW_FRAME::OnDrlFileHistory) EVT_MENU_RANGE(ID_GERBVIEW_ZIP_FILE1
@ FRAME_PL_EDITOR
Definition: frame_type.h:55
const std::string DrawingSheetFileExtension
@ ID_FILE_LIST_CLEAR
Definition: id.h:87
@ ID_FILEMAX
Definition: id.h:85
@ ID_FILE1
Definition: id.h:84
@ ID_GRID_SETTINGS
Definition: id.h:146
KIWAY Kiway
@ LAYER_DRAWINGSHEET_PAGEn
for drawingsheetEditor previewing
Definition: layer_ids.h:247
@ LAYER_DRAWINGSHEET_PAGE1
for drawingsheetEditor previewing
Definition: layer_ids.h:246
double ToUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Function To_User_Unit convert aValue in internal units to the appropriate user units defined by aUnit...
Definition: eda_units.cpp:190
int Mils2mm(double aVal)
Convert mils to mm.
Definition: eda_units.cpp:62
@ COLOR
Color has changed.
Definition: view_item.h:48
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: gtk/app.cpp:83
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: gtk/app.cpp:72
wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
Definition: ui_common.cpp:70
see class PGM_BASE
@ ID_SELECT_PAGE_NUMBER
Definition: pl_editor_id.h:39
@ ID_SELECT_COORDINATE_ORIGIN
Definition: pl_editor_id.h:38
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:115
std::vector< FAB_LAYER_COLOR > dummy
const double IU_PER_MILS
Definition: base_units.h:78
std::vector< wxString > sizes
Definition: app_settings.h:53
GRID_SETTINGS grid
Definition: app_settings.h:99
std::vector< double > zoom_factors
Definition: app_settings.h:96
VECTOR2< int > VECTOR2I
Definition: vector2d.h:588
Definition of file extensions used in Kicad.
#define ZOOM_LIST_PL_EDITOR
Definition: zoom_defines.h:35