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 = _( "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 GetCanvas()->GetView()->GetPainter()->GetSettings()->LoadColors( colors );
613
616
618 Layout();
619 SendSizeEvent();
620}
621
622
624{
625 // calculate the position (in page, in iu) of the corner used as coordinate origin
626 // coordinate origin can be the paper Top Left corner, or each of 4 page corners
627 VECTOR2I originCoord;
628
629 // To avoid duplicate code, we use a dummy segment starting at 0,0 in relative coord
631
632 switch( m_originSelectChoice )
633 {
634 default:
635 case 0: // Origin = paper Left Top corner
636 break;
637
638 case 1: // Origin = page Right Bottom corner
639 dummy.SetStart( 0, 0, RB_CORNER );
640 originCoord = dummy.GetStartPosUi();
641 break;
642
643 case 2: // Origin = page Left Bottom corner
644 dummy.SetStart( 0, 0, LB_CORNER );
645 originCoord = dummy.GetStartPosUi();
646 break;
647
648 case 3: // Origin = page Right Top corner
649 dummy.SetStart( 0, 0, RT_CORNER );
650 originCoord = dummy.GetStartPosUi();
651 break;
652
653 case 4: // Origin = page Left Top corner
654 dummy.SetStart( 0, 0, LT_CORNER );
655 originCoord = dummy.GetStartPosUi();
656 break;
657 }
658
659 return originCoord;
660}
661
662
664{
665 wxString line;
666 wxString gridformatter;
667
668 switch( GetUserUnits() )
669 {
670 case EDA_UNITS::INCHES: gridformatter = "grid %.3f"; break;
671 case EDA_UNITS::MILLIMETRES: gridformatter = "grid %.4f"; break;
672 default: gridformatter = "grid %f"; break;
673 }
674
676 GetCanvas()->GetGAL()->GetGridSize().x );
677 line.Printf( gridformatter, grid );
678
679 SetStatusText( line, 4 );
680}
681
682
684{
685 // Display Zoom level:
686 SetStatusText( GetZoomLevelIndicator(), 1 );
687
688 // coordinate origin can be the paper Top Left corner, or each of 4 page corners
689 VECTOR2I originCoord = ReturnCoordOriginCorner();
690 SetGridOrigin( originCoord );
691
692 // We need the orientation of axis (sign of coordinates)
693 int Xsign = 1;
694 int Ysign = 1;
695
696 switch( m_originSelectChoice )
697 {
698 default:
699 case 0: // Origin = paper Left Top corner
700 break;
701
702 case 1: // Origin = page Right Bottom corner
703 Xsign = -1;
704 Ysign = -1;
705 break;
706
707 case 2: // Origin = page Left Bottom corner
708 Ysign = -1;
709 break;
710
711 case 3: // Origin = page Right Top corner
712 Xsign = -1;
713 break;
714
715 case 4: // Origin = page Left Top corner
716 break;
717 }
718
719 // Display absolute coordinates:
721 VECTOR2D coord = cursorPos - originCoord;
722 double dXpos =
724 double dYpos =
726
727 wxString absformatter = wxT( "X %.4g Y %.4g" );
728 wxString locformatter = wxT( "dx %.4g dy %.4g" );
729
730 switch( GetUserUnits() )
731 {
732 case EDA_UNITS::INCHES: SetStatusText( _( "inches" ), 6 ); break;
733 case EDA_UNITS::MILS: SetStatusText( _( "mils" ), 6 ); break;
734 case EDA_UNITS::MILLIMETRES: SetStatusText( _( "mm" ), 6 ); break;
735 case EDA_UNITS::UNSCALED: SetStatusText( wxEmptyString, 6 ); break;
736 default: wxASSERT( false ); break;
737 }
738
739 wxString line;
740
741 // Display abs coordinates
742 line.Printf( absformatter, dXpos, dYpos );
743 SetStatusText( line, 2 );
744
745 // Display relative coordinates:
746 if( GetScreen() )
747 {
748 double dx = cursorPos.x - GetScreen()->m_LocalOrigin.x;
749 double dy = cursorPos.y - GetScreen()->m_LocalOrigin.y;
752 line.Printf( locformatter, dXpos, dYpos );
753 SetStatusText( line, 3 );
754 }
755
757
758 // Display corner reference for coord origin
759 line.Printf( _("coord origin: %s"),
760 m_originSelectBox->GetString( m_originSelectChoice ).GetData() );
761 SetStatusText( line, 5 );
762}
763
764
766{
769
770 for( DS_DATA_ITEM* dataItem : model.GetItems() )
771 {
772 // Ensure the scaling factor (used only in printing) of bitmaps is up to date
773 if( dataItem->GetType() == DS_DATA_ITEM::DS_BITMAP )
774 {
775 BITMAP_BASE* bitmap = static_cast<DS_DATA_ITEM_BITMAP*>( dataItem )->m_ImageBitmap;
776 bitmap->SetPixelSizeIu( drawSheetIUScale.IU_PER_MILS * 1000 / bitmap->GetPPI() );
777 }
778 }
779
781 wxEmptyString );
782
784 GetCanvas()->Refresh();
785}
786
787
789{
790 return static_cast<PL_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
791}
792
793
795{
796 return m_toolManager->GetTool<PL_SELECTION_TOOL>()->GetSelection();
797}
798
799
801{
803
805 PL_SELECTION& selection = selTool->GetSelection();
806 DS_DATA_ITEM* item = nullptr;
807
808 if( selection.GetSize() == 1 )
809 item = static_cast<DS_DRAW_ITEM_BASE*>( selection.Front() )->GetPeer();
810
814 GetCanvas()->Refresh();
815}
816
817
819{
820 DS_DATA_ITEM * item = nullptr;
821
822 switch( aType )
823 {
825 item = new DS_DATA_ITEM_TEXT( wxT( "Text") );
826 break;
827
830 break;
831
834 break;
835
837 item = new DS_DATA_ITEM_POLYGONS();
838 break;
839
841 {
842 wxFileDialog fileDlg( this, _( "Choose Image" ), m_mruImagePath, wxEmptyString,
843 _( "Image Files" ) + wxS( " " ) + wxImage::GetImageExtWildcard(),
844 wxFD_OPEN );
845
846 if( fileDlg.ShowModal() != wxID_OK )
847 return nullptr;
848
849 wxString fullFilename = fileDlg.GetPath();
850 m_mruImagePath = wxPathOnly( fullFilename );
851
852 if( !wxFileExists( fullFilename ) )
853 {
854 wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
855 break;
856 }
857
859
860 if( !image->ReadImageFile( fullFilename ) )
861 {
862 wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
863 delete image;
864 break;
865 }
866
867 // Set the scale factor for pl_editor (it is set for Eeschema by default)
868 image->SetPixelSizeIu( drawSheetIUScale.IU_PER_MILS * 1000.0 / image->GetPPI() );
869 item = new DS_DATA_ITEM_BITMAP( image );
870 }
871 break;
872 }
873
874 if( item == nullptr )
875 return nullptr;
876
878 item->SyncDrawItems( nullptr, GetCanvas()->GetView() );
879
880 return item;
881}
882
883
885{
887 GetScreen()->SetContentModified( false );
889
892
894
896
897 if( GetCurrentFileName().IsEmpty() )
898 {
899 // Default shutdown reason until a file is loaded
900 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New drawing sheet file is unsaved" ) );
901 }
902 else
903 {
904 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Drawing sheet changes are unsaved" ) );
905 }
906}
907
908
910{
911 if( aItemCount == 0 )
912 return;
913
914 UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
915 unsigned icnt = list.m_CommandsList.size();
916
917 if( aItemCount > 0 )
918 icnt = aItemCount;
919
920 for( unsigned ii = 0; ii < icnt; ii++ )
921 {
922 if( list.m_CommandsList.size() == 0 )
923 break;
924
925 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
926 list.m_CommandsList.erase( list.m_CommandsList.begin() );
927
928 curr_cmd->ClearListAndDeleteItems();
929 delete curr_cmd; // Delete command
930 }
931}
932
933
935{
936 return m_pageSelectBox->GetSelection() == 0;
937}
938
939#if 1
941{
943
944 std::vector<MSG_PANEL_ITEM> msgItems;
945 msgItems.emplace_back( _( "Page Width" ), MessageTextFromValue( size.x ) );
946 msgItems.emplace_back( _( "Page Height" ), MessageTextFromValue( size.y ) );
947
948 SetMsgPanel( msgItems );
949}
950#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:101
WINDOW_SETTINGS m_Window
Definition: app_settings.h:184
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:187
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:51
void SetPixelSizeIu(double aPixSize)
Definition: bitmap_base.h:67
int GetPPI() const
Definition: bitmap_base.h:134
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.
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.
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.
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:1478
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:267
void OnKiCadExit()
Definition: kiway.cpp:657
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()
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:240
This file is part of the common library.
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:198
int Mils2mm(double aVal)
Convert mils to mm.
Definition: eda_units.cpp:66
@ 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
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:74
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:111
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:90
std::vector< double > zoom_factors
Definition: app_settings.h:87
VECTOR2< int > VECTOR2I
Definition: vector2d.h:618
Definition of file extensions used in Kicad.
#define ZOOM_LIST_PL_EDITOR
Definition: zoom_defines.h:35