KiCad PCB EDA Suite
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-2022 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
76
77 // Drop files event
78 EVT_DROP_FILES( PL_EDITOR_FRAME::OnDropFiles )
79END_EVENT_TABLE()
80
81
82PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
83 EDA_DRAW_FRAME( aKiway, aParent, FRAME_PL_EDITOR, wxT( "PlEditorFrame" ),
84 wxDefaultPosition, wxDefaultSize,
86 m_propertiesPagelayout( nullptr ),
87 m_propertiesFrameWidth( 200 ),
88 m_originSelectBox( nullptr ),
89 m_originSelectChoice( 0 ),
90 m_pageSelectBox( nullptr ),
91 m_mruImagePath( wxEmptyString )
92{
93 m_maximizeByDefault = true;
94 SetUserUnits( EDA_UNITS::MILLIMETRES );
95
96 m_showBorderAndTitleBlock = true; // true for reference drawings.
98 m_aboutTitle = _HKI( "KiCad Drawing Sheet Editor" );
99
100 // Give an icon
101 wxIcon icon;
102 wxIconBundle icon_bundle;
103
104 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor ) );
105 icon_bundle.AddIcon( icon );
106 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_32 ) );
107 icon_bundle.AddIcon( icon );
108 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_16 ) );
109 icon_bundle.AddIcon( icon );
110
111 SetIcons( icon_bundle );
112
113 // Create GAL canvas
114 auto* drawPanel = new PL_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
115 GetGalDisplayOptions(),
117 SetCanvas( drawPanel );
118
119 LoadSettings( config() );
120
121 m_acceptedExts.emplace( DrawingSheetFileExtension, nullptr );
122 DragAcceptFiles( true );
123
124 wxSize pageSizeIU = GetPageLayout().GetPageSettings().GetSizeIU( drawSheetIUScale.IU_PER_MILS );
125 SetScreen( new BASE_SCREEN( pageSizeIU ) );
126
127 setupTools();
128 setupUIConditions();
129 ReCreateMenuBar();
130 ReCreateHToolbar();
131 ReCreateVToolbar();
132 ReCreateOptToolbar();
133
134 wxWindow* stsbar = GetStatusBar();
135 int spacer = KIUI::GetTextSize( wxT( "M" ), stsbar ).x * 2;
136
137 int dims[] = {
138
139 // balance of status bar on far left is set to a default or whatever is left over.
140 -1,
141
142 // When using GetTextSize() remember the width of '1' is not the same
143 // as the width of '0' unless the font is fixed width, and it usually won't be.
144
145 // zoom:
146 KIUI::GetTextSize( wxT( "Z 762000" ), stsbar ).x + spacer,
147
148 // cursor coords
149 KIUI::GetTextSize( wxT( "X 0234.567 Y 0234.567" ), stsbar ).x + spacer,
150
151 // delta distances
152 KIUI::GetTextSize( wxT( "dx 0234.567 dx 0234.567" ), stsbar ).x + spacer,
153
154 // grid size
155 KIUI::GetTextSize( wxT( "grid 0234.567" ), stsbar ).x + spacer,
156
157 // Coord origin (use the bigger message)
158 KIUI::GetTextSize( _( "coord origin: Right Bottom page corner" ), stsbar ).x + spacer,
159
160 // units display, Inches is bigger than mm
161 KIUI::GetTextSize( _( "Inches" ), stsbar ).x + spacer,
162
163 // constraint mode
164 KIUI::GetTextSize( _( "Constrain to H, V, 45" ), stsbar ).x + spacer
165 };
166
167 SetStatusWidths( arrayDim( dims ), dims );
168
169 m_auimgr.SetManagedWindow( this );
170
171 CreateInfoBar();
172 m_propertiesPagelayout = new PROPERTIES_FRAME( this );
173
174 // Rows; layers 4 - 6
175 m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
176 .Top().Layer( 6 ) );
177 m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
178 .Left().Layer( 3 ) );
179 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
180 .Bottom().Layer( 6 ) );
181
182 // Columns; layers 1 - 3
183 m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
184 .Right().Layer( 2 ) );
185
186 m_auimgr.AddPane( m_propertiesPagelayout, EDA_PANE().Palette().Name( "Props" )
187 .Right().Layer( 3 )
188 .Caption( _( "Properties" ) )
189 .MinSize( m_propertiesPagelayout->GetMinSize() )
190 .BestSize( m_propertiesFrameWidth, -1 ) );
191
192 // Center
193 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" )
194 .Center() );
195
196 FinishAUIInitialization();
197
198 resolveCanvasType();
199 SwitchCanvas( m_canvasType );
200
201 // Add the exit key handler
202 setupUnits( config() );
203
204 VECTOR2I originCoord = ReturnCoordOriginCorner();
205 SetGridOrigin( originCoord );
206
207 // Initialize the current drawing sheet
208#if 0 //start with empty layout
211#else // start with the default KiCad layout
213#endif
214 OnNewDrawingSheet();
215
216 // Ensure the window is on top
217 Raise();
218
219 // Register a call to update the toolbar sizes. It can't be done immediately because
220 // it seems to require some sizes calculated that aren't yet (at least on GTK).
221 CallAfter( [&]()
222 {
223 // Ensure the controls on the toolbars all are correctly sized
224 UpdateToolbarControlSizes();
225 } );
226}
227
228
230{
231 // Ensure m_canvasType is up to date, to save it in config
233
234 // Shutdown all running tools
235 if( m_toolManager )
237}
238
239
241{
242 // Create the manager and dispatcher & route draw panel events to the dispatcher
244 m_toolManager->SetEnvironment( nullptr, GetCanvas()->GetView(),
245 GetCanvas()->GetViewControls(), config(), this );
246 m_actions = new PL_ACTIONS();
248
250
251 // Register tools
262
263 // Run the selection tool, it is supposed to be always active
264 m_toolManager->InvokeTool( "plEditor.InteractiveSelection" );
265}
266
267
269{
271
273 EDITOR_CONDITIONS cond( this );
274
275 wxASSERT( mgr );
276
277#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
278#define CHECK( x ) ACTION_CONDITIONS().Check( x )
279
283
289
294
301
310
311 // Not a tool, just a way to activate the action
314
315 auto titleBlockNormalMode =
316 [] ( const SELECTION& )
317 {
319 };
320
321 auto titleBlockEditMode =
322 [] ( const SELECTION& )
323 {
325 };
326
327 mgr->SetConditions( PL_ACTIONS::layoutNormalMode, CHECK( titleBlockNormalMode ) );
328 mgr->SetConditions( PL_ACTIONS::layoutEditMode, CHECK( titleBlockEditMode ) );
329
330#undef CHECK
331#undef ENABLE
332}
333
334
335bool PL_EDITOR_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
336{
337 wxString fn = aFileSet[0];
338
339 if( !LoadDrawingSheetFile( fn ) )
340 {
341 wxMessageBox( wxString::Format( _( "Error loading drawing sheet '%s'." ), fn ) );
342 return false;
343 }
344 else
345 {
347 return true;
348 }
349}
350
351
353{
354 return GetScreen() && GetScreen()->IsContentModified();
355}
356
357
358void PL_EDITOR_FRAME::OnExit( wxCommandEvent& aEvent )
359{
360 if( aEvent.GetId() == wxID_EXIT )
361 Kiway().OnKiCadExit();
362
363 if( aEvent.GetId() == wxID_CLOSE || Kiface().IsSingle() )
364 Close( false );
365}
366
367
368bool PL_EDITOR_FRAME::canCloseWindow( wxCloseEvent& aEvent )
369{
370 // Shutdown blocks must be determined and vetoed as early as possible
372 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
373 && IsContentModified() )
374 {
375 return false;
376 }
377
378 if( IsContentModified() )
379 {
380 wxFileName filename = GetCurrentFileName();
381 wxString msg = _( "Save changes to '%s' before closing?" );
382
383 if( !HandleUnsavedChanges( this, wxString::Format( msg, filename.GetFullName() ),
384 [&]() -> bool
385 {
386 return saveCurrentPageLayout();
387 } ) )
388 {
389 return false;
390 }
391 }
392
393 return true;
394}
395
396
398{
399 // do not show the window because we do not want any paint event
400 Show( false );
401
402 // clean up the data before the view is destroyed
404
405 // On Linux, m_propertiesPagelayout must be destroyed
406 // before deleting the main frame to avoid a crash when closing
407 m_propertiesPagelayout->Destroy();
408 Destroy();
409}
410
411
412void PL_EDITOR_FRAME::OnSelectPage( wxCommandEvent& event )
413{
414 KIGFX::VIEW* view = GetCanvas()->GetView();
415 view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGE1, m_pageSelectBox->GetSelection() == 0 );
416 view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGEn, m_pageSelectBox->GetSelection() == 1 );
417 GetCanvas()->Refresh();
418}
419
420
422{
423 m_originSelectChoice = m_originSelectBox->GetSelection();
424 UpdateStatusBar(); // Update grid origin
426 GetCanvas()->Refresh();
427}
428
429
430void PL_EDITOR_FRAME::ToPrinter( bool doPreview )
431{
432 // static print data and page setup data, to remember settings during the session
433 static wxPrintData* s_PrintData;
434 static wxPageSetupDialogData* s_pageSetupData = nullptr;
435
436 const PAGE_INFO& pageInfo = GetPageSettings();
437
438 if( s_PrintData == nullptr ) // First print
439 {
440 s_PrintData = new wxPrintData();
441 s_PrintData->SetQuality( wxPRINT_QUALITY_HIGH ); // Default resolution = HIGH;
442 }
443
444 if( !s_PrintData->Ok() )
445 {
446 wxMessageBox( _( "Error Init Printer info" ) );
447 return;
448 }
449
450 if( s_pageSetupData == nullptr )
451 s_pageSetupData = new wxPageSetupDialogData( *s_PrintData );
452
453 s_pageSetupData->SetPaperId( pageInfo.GetPaperId() );
454 s_pageSetupData->GetPrintData().SetOrientation( pageInfo.GetWxOrientation() );
455
456 if( pageInfo.IsCustom() )
457 {
458 if( pageInfo.IsPortrait() )
459 s_pageSetupData->SetPaperSize( wxSize( EDA_UNIT_UTILS::Mils2mm( pageInfo.GetWidthMils() ),
460 EDA_UNIT_UTILS::Mils2mm( pageInfo.GetHeightMils() ) ) );
461 else
462 s_pageSetupData->SetPaperSize( wxSize( EDA_UNIT_UTILS::Mils2mm( pageInfo.GetHeightMils() ),
463 EDA_UNIT_UTILS::Mils2mm( pageInfo.GetWidthMils() ) ) );
464 }
465
466 *s_PrintData = s_pageSetupData->GetPrintData();
467
468 if( doPreview )
469 InvokeDialogPrintPreview( this, s_PrintData );
470 else
471 InvokeDialogPrint( this, s_PrintData, s_pageSetupData );
472}
473
474
475const BOX2I PL_EDITOR_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
476{
478 return rv;
479}
480
481
483{
485
486 if( aCfg->m_Window.grid.sizes.empty() )
487 {
488 aCfg->m_Window.grid.sizes = { "5.00 mm",
489 "2.50 mm",
490 "2.00 mm",
491 "1.00 mm",
492 "0.50 mm",
493 "0.25 mm",
494 "0.20 mm",
495 "0.10 mm" };
496 }
497
498 // Currently values read from config file are not used because the user cannot
499 // change this config
500 // if( aCfg->m_Window.zoom_factors.empty() )
501 {
503 }
504
505 PL_EDITOR_SETTINGS* cfg = dynamic_cast<PL_EDITOR_SETTINGS*>( aCfg );
506 wxCHECK( cfg, /*void*/ );
507
510
512
515
516 PAGE_INFO pageInfo = GetPageSettings();
517 pageInfo.SetType( cfg->m_LastPaperSize, cfg->m_LastWasPortrait );
518 SetPageSettings( pageInfo );
519}
520
521
523{
525
526 auto cfg = static_cast<PL_EDITOR_SETTINGS*>( aCfg );
527
529
530 cfg->m_PropertiesFrameWidth = m_propertiesFrameWidth;
531 cfg->m_CornerOrigin = m_originSelectChoice;
532 cfg->m_BlackBackground = GetDrawBgColor() == BLACK;
533 cfg->m_LastPaperSize = GetPageSettings().GetType();
534 cfg->m_LastWasPortrait = GetPageSettings().IsPortrait();
535 cfg->m_LastCustomWidth = PAGE_INFO::GetCustomWidthMils();
536 cfg->m_LastCustomHeight = PAGE_INFO::GetCustomHeightMils();
537}
538
539
541{
542 wxString title;
543 wxFileName file( GetCurrentFileName() );
544
545 if( file.IsOk() )
546 title = file.GetName();
547 else
548 title = _( "[no drawing sheet loaded]" );
549
550 title += wxT( " \u2014 " ) + _( "Drawing Sheet Editor" ),
551
552 SetTitle( title );
553}
554
555
557{
559}
560
561
562void PL_EDITOR_FRAME::SetCurrentFileName( const wxString& aName )
563{
565}
566
567
568void PL_EDITOR_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
569{
570 m_pageLayout.SetPageSettings( aPageSettings );
571
572 if( GetScreen() )
574}
575
576
578{
580}
581
582
584{
585 // this function is only needed because EDA_DRAW_FRAME is not compiled
586 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
587 // into an application specific source file.
589}
590
591
593{
594 return GetPageLayout().GetTitleBlock();
595}
596
597
599{
600 m_pageLayout.SetTitleBlock( aTitleBlock );
601}
602
603
604void PL_EDITOR_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
605{
606 EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
607
608 SETTINGS_MANAGER& settingsManager = Pgm().GetSettingsManager();
609 PL_EDITOR_SETTINGS* cfg = settingsManager.GetAppSettings<PL_EDITOR_SETTINGS>();
610 COLOR_SETTINGS* colors = settingsManager.GetColorSettings( cfg->m_ColorTheme );
611
612 // Update gal display options like cursor shape, grid options:
614
615 GetCanvas()->GetView()->GetPainter()->GetSettings()->LoadColors( colors );
616
619
621 Layout();
622 SendSizeEvent();
623}
624
625
627{
628 // calculate the position (in page, in iu) of the corner used as coordinate origin
629 // coordinate origin can be the paper Top Left corner, or each of 4 page corners
630 VECTOR2I originCoord;
631
632 // To avoid duplicate code, we use a dummy segment starting at 0,0 in relative coord
634
635 switch( m_originSelectChoice )
636 {
637 default:
638 case 0: // Origin = paper Left Top corner
639 break;
640
641 case 1: // Origin = page Right Bottom corner
642 dummy.SetStart( 0, 0, RB_CORNER );
643 originCoord = dummy.GetStartPosUi();
644 break;
645
646 case 2: // Origin = page Left Bottom corner
647 dummy.SetStart( 0, 0, LB_CORNER );
648 originCoord = dummy.GetStartPosUi();
649 break;
650
651 case 3: // Origin = page Right Top corner
652 dummy.SetStart( 0, 0, RT_CORNER );
653 originCoord = dummy.GetStartPosUi();
654 break;
655
656 case 4: // Origin = page Left Top corner
657 dummy.SetStart( 0, 0, LT_CORNER );
658 originCoord = dummy.GetStartPosUi();
659 break;
660 }
661
662 return originCoord;
663}
664
665
667{
668 wxString line;
669 wxString gridformatter;
670
671 switch( GetUserUnits() )
672 {
673 case EDA_UNITS::INCHES: gridformatter = wxS( "grid %.3f" ); break;
674 case EDA_UNITS::MILLIMETRES: gridformatter = wxS( "grid %.4f" ); break;
675 default: gridformatter = wxS( "grid %f" ); break;
676 }
677
679 GetCanvas()->GetGAL()->GetGridSize().x );
680 line.Printf( gridformatter, grid );
681
682 SetStatusText( line, 4 );
683}
684
685
687{
688 // Display Zoom level:
689 SetStatusText( GetZoomLevelIndicator(), 1 );
690
691 // coordinate origin can be the paper Top Left corner, or each of 4 page corners
692 VECTOR2I originCoord = ReturnCoordOriginCorner();
693 SetGridOrigin( originCoord );
694
695 // We need the orientation of axis (sign of coordinates)
696 int Xsign = 1;
697 int Ysign = 1;
698
699 switch( m_originSelectChoice )
700 {
701 default:
702 case 0: // Origin = paper Left Top corner
703 break;
704
705 case 1: // Origin = page Right Bottom corner
706 Xsign = -1;
707 Ysign = -1;
708 break;
709
710 case 2: // Origin = page Left Bottom corner
711 Ysign = -1;
712 break;
713
714 case 3: // Origin = page Right Top corner
715 Xsign = -1;
716 break;
717
718 case 4: // Origin = page Left Top corner
719 break;
720 }
721
722 // Display absolute coordinates:
724 VECTOR2D coord = cursorPos - originCoord;
725 double dXpos =
727 double dYpos =
729
730 wxString absformatter = wxT( "X %.4g Y %.4g" );
731 wxString locformatter = wxT( "dx %.4g dy %.4g" );
732
733 switch( GetUserUnits() )
734 {
735 case EDA_UNITS::INCHES: SetStatusText( _( "inches" ), 6 ); break;
736 case EDA_UNITS::MILS: SetStatusText( _( "mils" ), 6 ); break;
737 case EDA_UNITS::MILLIMETRES: SetStatusText( _( "mm" ), 6 ); break;
738 case EDA_UNITS::UNSCALED: SetStatusText( wxEmptyString, 6 ); break;
739 default: wxASSERT( false ); break;
740 }
741
742 wxString line;
743
744 // Display abs coordinates
745 line.Printf( absformatter, dXpos, dYpos );
746 SetStatusText( line, 2 );
747
748 // Display relative coordinates:
749 if( GetScreen() )
750 {
751 double dx = cursorPos.x - GetScreen()->m_LocalOrigin.x;
752 double dy = cursorPos.y - GetScreen()->m_LocalOrigin.y;
755 line.Printf( locformatter, dXpos, dYpos );
756 SetStatusText( line, 3 );
757 }
758
760
761 // Display corner reference for coord origin
762 line.Printf( _("coord origin: %s"),
763 m_originSelectBox->GetString( m_originSelectChoice ).GetData() );
764 SetStatusText( line, 5 );
765}
766
767
769{
772
773 for( DS_DATA_ITEM* dataItem : model.GetItems() )
774 {
775 // Ensure the scaling factor (used only in printing) of bitmaps is up to date
776 if( dataItem->GetType() == DS_DATA_ITEM::DS_BITMAP )
777 {
778 BITMAP_BASE* bitmap = static_cast<DS_DATA_ITEM_BITMAP*>( dataItem )->m_ImageBitmap;
779 bitmap->SetPixelSizeIu( drawSheetIUScale.IU_PER_MILS * 1000 / bitmap->GetPPI() );
780 }
781 }
782
784 wxEmptyString );
785
787 GetCanvas()->Refresh();
788}
789
790
792{
793 return static_cast<PL_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
794}
795
796
798{
799 return m_toolManager->GetTool<PL_SELECTION_TOOL>()->GetSelection();
800}
801
802
804{
806
808 PL_SELECTION& selection = selTool->GetSelection();
809 DS_DATA_ITEM* item = nullptr;
810
811 if( selection.GetSize() == 1 )
812 item = static_cast<DS_DRAW_ITEM_BASE*>( selection.Front() )->GetPeer();
813
817 GetCanvas()->Refresh();
818}
819
820
822{
823 DS_DATA_ITEM * item = nullptr;
824
825 switch( aType )
826 {
828 item = new DS_DATA_ITEM_TEXT( wxT( "Text") );
829 break;
830
833 break;
834
837 break;
838
840 item = new DS_DATA_ITEM_POLYGONS();
841 break;
842
844 {
845 wxFileDialog fileDlg( this, _( "Choose Image" ), m_mruImagePath, wxEmptyString,
846 _( "Image Files" ) + wxS( " " ) + wxImage::GetImageExtWildcard(),
847 wxFD_OPEN );
848
849 if( fileDlg.ShowModal() != wxID_OK )
850 return nullptr;
851
852 wxString fullFilename = fileDlg.GetPath();
853 m_mruImagePath = wxPathOnly( fullFilename );
854
855 if( !wxFileExists( fullFilename ) )
856 {
857 wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
858 break;
859 }
860
862
863 if( !image->ReadImageFile( fullFilename ) )
864 {
865 wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
866 delete image;
867 break;
868 }
869
870 // Set the scale factor for pl_editor (it is set for Eeschema by default)
871 image->SetPixelSizeIu( drawSheetIUScale.IU_PER_MILS * 1000.0 / image->GetPPI() );
872 item = new DS_DATA_ITEM_BITMAP( image );
873 }
874 break;
875 }
876
877 if( item == nullptr )
878 return nullptr;
879
881 item->SyncDrawItems( nullptr, GetCanvas()->GetView() );
882
883 return item;
884}
885
886
888{
890 GetScreen()->SetContentModified( false );
892
895
897
899
900 if( GetCurrentFileName().IsEmpty() )
901 {
902 // Default shutdown reason until a file is loaded
903 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New drawing sheet file is unsaved" ) );
904 }
905 else
906 {
907 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Drawing sheet changes are unsaved" ) );
908 }
909}
910
911
913{
914 if( aItemCount == 0 )
915 return;
916
917 UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
918 unsigned icnt = list.m_CommandsList.size();
919
920 if( aItemCount > 0 )
921 icnt = aItemCount;
922
923 for( unsigned ii = 0; ii < icnt; ii++ )
924 {
925 if( list.m_CommandsList.size() == 0 )
926 break;
927
928 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
929 list.m_CommandsList.erase( list.m_CommandsList.begin() );
930
931 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
932 {
933 delete aItem;
934 } );
935 delete curr_cmd; // Delete command
936 }
937}
938
939
941{
942 return m_pageSelectBox->GetSelection() == 0;
943}
944
945#if 1
947{
949
950 std::vector<MSG_PANEL_ITEM> msgItems;
951 msgItems.emplace_back( _( "Page Width" ), MessageTextFromValue( size.x ) );
952 msgItems.emplace_back( _( "Page Height" ), MessageTextFromValue( size.y ) );
953
954 SetMsgPanel( msgItems );
955}
956#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:105
@ icon_pagelayout_editor
@ icon_pagelayout_editor_16
@ icon_pagelayout_editor_32
static TOOL_ACTION toggleGrid
Definition: actions.h:143
static TOOL_ACTION paste
Definition: actions.h:69
static TOOL_ACTION millimetersUnits
Definition: actions.h:149
static TOOL_ACTION copy
Definition: actions.h:68
static TOOL_ACTION milsUnits
Definition: actions.h:148
static TOOL_ACTION undo
Definition: actions.h:65
static TOOL_ACTION inchesUnits
Definition: actions.h:147
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:104
static TOOL_ACTION doDelete
Definition: actions.h:73
static TOOL_ACTION selectionTool
Definition: actions.h:156
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION zoomFitScreen
Definition: actions.h:98
static TOOL_ACTION redo
Definition: actions.h:66
static TOOL_ACTION deleteTool
Definition: actions.h:74
static TOOL_ACTION zoomTool
Definition: actions.h:101
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 InitDataPoints(const wxSize &aPageSizeInternalUnits)
Definition: base_screen.cpp:46
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
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.
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 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
Update the board display after modifying it by a python script (note: it is automatically called by a...
@ 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:1484
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:213
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:53
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:274
void OnKiCadExit()
Definition: kiway.cpp:668
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:232
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:238
wxPrintOrientation GetWxOrientation() const
Definition: page_info.h:122
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:181
bool IsPortrait() const
Definition: page_info.h:117
const wxSize GetSizeIU(double aIUScale) const
Gets the page size in internal units.
Definition: page_info.h:162
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:120
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 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.
const wxSize GetPageSizeIU() const override
Works off of GetPageSettings() to return the size of the paper page in the internal units of this par...
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.
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(bool aLoadNow=true)
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:48
@ BLACK
Definition: color4d.h:44
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:260
This file is part of the common library.
#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
@ 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:201
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
#define CHECK(x)
#define ENABLE(x)
@ ID_SELECT_PAGE_NUMBER
Definition: pl_editor_id.h:39
@ ID_SELECT_COORDINATE_ORIGIN
Definition: pl_editor_id.h:38
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:111
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:618
Definition of file extensions used in Kicad.
#define ZOOM_LIST_PL_EDITOR
Definition: zoom_defines.h:35