KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_page_settings.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) 2021-2023 KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <env_paths.h>
21#include <pgm_base.h>
22#include <bitmaps.h>
23#include <base_screen.h>
24#include <common.h> // ExpandEnvVarSubstitutions
25#include <core/arraydim.h>
27#include <eda_draw_frame.h>
28#include <eda_item.h>
29#include <embedded_files.h>
30#include <filename_resolver.h>
31#include <gr_basic.h>
32#include <kiface_base.h>
33#include <macros.h>
34#include <math/util.h> // for KiROUND
35#include <project.h>
36#include <tool/actions.h>
37#include <tool/tool_manager.h>
41#include <string_utils.h>
44#include <wx/valgen.h>
45#include <wx/tokenzr.h>
46#include <wx/filedlg.h>
47#include <wx/dcmemory.h>
48#include <wx/msgdlg.h>
49#include <confirm.h>
50
51#define MAX_PAGE_EXAMPLE_SIZE 200
52
53
54// List of page formats.
55// they are prefixed by "_HKI" (already in use for hotkeys) instead of "_",
56// because we need both the translated and the not translated version.
57// when displayed in dialog we should explicitly call wxGetTranslation()
58// to show the translated version.
59// See hotkeys_basic.h for more info
60#define _HKI( x ) wxT( x )
61static const wxString pageFmts[] =
62{
63 _HKI("A5 148x210mm"),
64 _HKI("A4 210x297mm"),
65 _HKI("A3 297x420mm"),
66 _HKI("A2 420x594mm"),
67 _HKI("A1 594x841mm"),
68 _HKI("A0 841x1189mm"),
69 _HKI("A 8.5x11in"),
70 _HKI("B 11x17in"),
71 _HKI("C 17x22in"),
72 _HKI("D 22x34in"),
73 _HKI("E 34x44in"),
74 _HKI("USLetter 8.5x11in"), // USLetter without space is correct
75 _HKI("USLegal 8.5x14in"), // USLegal without space is correct
76 _HKI("USLedger 11x17in"), // USLedger without space is correct
77 _HKI("User (Custom)"), // size defined by user. The string must contain "Custom"
78 // to be recognized in code
79};
80
82 const VECTOR2D& aMaxUserSizeMils ) :
84 m_parent( aParent ),
85 m_screen( m_parent->GetScreen() ),
86 m_initialized( false ),
87 m_pageBitmap( nullptr ),
88 m_iuPerMils( aIuPerMils ),
89 m_embeddedFiles( aEmbeddedFiles ),
90 m_customSizeX( aParent, m_userSizeXLabel, m_userSizeXCtrl, m_userSizeXUnits ),
91 m_customSizeY( aParent, m_userSizeYLabel, m_userSizeYCtrl, m_userSizeYUnits )
92{
94 m_browseButton->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
95
96 m_maxPageSizeMils = aMaxUserSizeMils;
98 m_customFmt = false;
100
102 wxString serialization;
104 m_drawingSheet->SetPageLayout( TO_UTF8( serialization ) );
105
106 m_PickDate->SetValue( wxDateTime::Now() );
107
108 if( m_parent->GetName() == PL_EDITOR_FRAME_NAME )
109 {
110 SetTitle( _( "Preview Settings" ) );
111 m_staticTextPaper->SetLabel( _( "Preview Paper" ) );
112 m_staticTextTitleBlock->SetLabel( _( "Preview Title Block Data" ) );
113 }
114 else
115 {
116 SetTitle( _( "Page Settings" ) );
117 m_staticTextPaper->SetLabel( _( "Paper" ) );
118 m_staticTextTitleBlock->SetLabel( _( "Title Block" ) );
119 }
120
124
126
127 Centre();
128}
129
130
132{
133 delete m_pageBitmap;
134 delete m_drawingSheet;
135}
136
137
139{
140 // initialize page format choice box and page format list.
141 // The first shows translated strings, the second contains not translated strings
142 m_paperSizeComboBox->Clear();
143
144 for( const wxString& pageFmt : pageFmts )
145 {
146 m_pageFmt.Add( pageFmt );
147 m_paperSizeComboBox->Append( wxGetTranslation( pageFmt ) );
148 }
149
150 // initialize the drawing sheet filename
152
156
157 // only a click fires the "selection changed" event, so have to fabricate this check
158 wxCommandEvent dummy;
160
161 if( m_customFmt )
162 {
165 }
166 else
167 {
170 }
171
172 m_TextRevision->SetValue( m_tb.GetRevision() );
173 m_TextDate->SetValue( m_tb.GetDate() );
174 m_TextTitle->SetValue( m_tb.GetTitle() );
175 m_TextCompany->SetValue( m_tb.GetCompany() );
176 m_TextComment1->SetValue( m_tb.GetComment( 0 ) );
177 m_TextComment2->SetValue( m_tb.GetComment( 1 ) );
178 m_TextComment3->SetValue( m_tb.GetComment( 2 ) );
179 m_TextComment4->SetValue( m_tb.GetComment( 3 ) );
180 m_TextComment5->SetValue( m_tb.GetComment( 4 ) );
181 m_TextComment6->SetValue( m_tb.GetComment( 5 ) );
182 m_TextComment7->SetValue( m_tb.GetComment( 6 ) );
183 m_TextComment8->SetValue( m_tb.GetComment( 7 ) );
184 m_TextComment9->SetValue( m_tb.GetComment( 8 ) );
185
186 // The default is to disable aall these fields for the "generic" dialog
187 m_TextSheetCount->Show( false );
188 m_TextSheetNumber->Show( false );
189 m_PaperExport->Show( false );
190 m_RevisionExport->Show( false );
191 m_DateExport->Show( false );
192 m_TitleExport->Show( false );
193 m_CompanyExport->Show( false );
194 m_Comment1Export->Show( false );
195 m_Comment2Export->Show( false );
196 m_Comment3Export->Show( false );
197 m_Comment4Export->Show( false );
198 m_Comment5Export->Show( false );
199 m_Comment6Export->Show( false );
200 m_Comment7Export->Show( false );
201 m_Comment8Export->Show( false );
202 m_Comment9Export->Show( false );
203
205
208
209 GetSizer()->SetSizeHints( this );
210
211 m_initialized = true;
212
213 return true;
214}
215
216
218{
219 int idx = std::max( m_paperSizeComboBox->GetSelection(), 0 );
220 const wxString paperType = m_pageFmt[idx];
221
222 if( paperType.Contains( PAGE_INFO::Custom ) )
223 {
225 return false;
226
228 return false;
229 }
230
231 if( SavePageSettings() )
232 {
234
237
238 // Call the post processing (if any) after changes
240 }
241
242 return true;
243}
244
245
246void DIALOG_PAGES_SETTINGS::OnPaperSizeChoice( wxCommandEvent& event )
247{
248 int idx = m_paperSizeComboBox->GetSelection();
249
250 if( idx < 0 )
251 idx = 0;
252
253 const wxString paperType = m_pageFmt[idx];
254
255 if( paperType.Contains( PAGE_INFO::Custom ) )
256 {
257 m_staticTextOrient->Enable( false );
258 m_orientationComboBox->Enable( false );
259
260 m_staticTextCustSize->Enable( true );
261 m_customSizeX.Enable( true );
262 m_customSizeY.Enable( true );
263 m_customFmt = true;
264 }
265 else
266 {
267 m_staticTextOrient->Enable( true );
268 m_orientationComboBox->Enable( true );
269
270 m_staticTextCustSize->Enable( false );
271 m_customSizeX.Enable( false );
272 m_customSizeY.Enable( false );
273 m_customFmt = false;
274 }
275
278}
279
280
282{
283 if( m_initialized )
284 {
287 }
288}
289
290
292{
293 if( m_initialized )
294 {
297 }
298}
299
300
302{
303 if( m_initialized )
304 {
307 }
308}
309
310
312{
313 if( m_initialized && m_TextRevision->IsModified() )
314 {
316 m_tb.SetRevision( m_TextRevision->GetValue() );
318 }
319}
320
321
322void DIALOG_PAGES_SETTINGS::OnDateTextUpdated( wxCommandEvent& event )
323{
324 if( m_initialized && m_TextDate->IsModified() )
325 {
327 m_tb.SetDate( m_TextDate->GetValue() );
329 }
330}
331
332
333void DIALOG_PAGES_SETTINGS::OnTitleTextUpdated( wxCommandEvent& event )
334{
335 if( m_initialized && m_TextTitle->IsModified() )
336 {
338 m_tb.SetTitle( m_TextTitle->GetValue() );
340 }
341}
342
343
345{
346 if( m_initialized && m_TextCompany->IsModified() )
347 {
349 m_tb.SetCompany( m_TextCompany->GetValue() );
351 }
352}
353
354
356{
357 if( m_initialized && m_TextComment1->IsModified() )
358 {
360 m_tb.SetComment( 0, m_TextComment1->GetValue() );
362 }
363}
364
365
367{
368 if( m_initialized && m_TextComment2->IsModified() )
369 {
371 m_tb.SetComment( 1, m_TextComment2->GetValue() );
373 }
374}
375
376
378{
379 if( m_initialized && m_TextComment3->IsModified() )
380 {
382 m_tb.SetComment( 2, m_TextComment3->GetValue() );
384 }
385}
386
387
389{
390 if( m_initialized && m_TextComment4->IsModified() )
391 {
393 m_tb.SetComment( 3, m_TextComment4->GetValue() );
395 }
396}
397
398
400{
401 if( m_initialized && m_TextComment5->IsModified() )
402 {
404 m_tb.SetComment( 4, m_TextComment5->GetValue() );
406 }
407}
408
409
411{
412 if( m_initialized && m_TextComment6->IsModified() )
413 {
415 m_tb.SetComment( 5, m_TextComment6->GetValue() );
417 }
418}
419
420
422{
423 if( m_initialized && m_TextComment7->IsModified() )
424 {
426 m_tb.SetComment( 6, m_TextComment7->GetValue() );
428 }
429}
430
431
433{
434 if( m_initialized && m_TextComment8->IsModified() )
435 {
437 m_tb.SetComment( 7, m_TextComment8->GetValue() );
439 }
440}
441
442
444{
445 if( m_initialized && m_TextComment9->IsModified() )
446 {
448 m_tb.SetComment( 8, m_TextComment9->GetValue() );
450 }
451}
452
453
454void DIALOG_PAGES_SETTINGS::OnDateApplyClick( wxCommandEvent& event )
455{
456 wxDateTime datetime = m_PickDate->GetValue();
457 wxString date =
458 // We can choose different formats. Should probably be kept in sync with CURRENT_DATE
459 // formatting in TITLE_BLOCK.
460 //
461 // datetime.Format( wxLocale::GetInfo( wxLOCALE_SHORT_DATE_FMT ) );
462 // datetime.Format( wxLocale::GetInfo( wxLOCALE_LONG_DATE_FMT ) );
463 // datetime.Format( wxT("%Y-%b-%d") );
464 datetime.FormatISODate();
465
466 m_TextDate->SetValue( date );
467}
468
469
471{
472 bool success = false;
473 wxString msg;
474 wxString fileName = GetWksFileName();
475
477 {
478
479 wxString fullFileName = m_filenameResolver->ResolvePath( fileName, m_projectPath, m_embeddedFiles );
480
482
483 if( !DS_DATA_MODEL::GetTheInstance().LoadDrawingSheet( fullFileName, &msg ) )
484 {
486 wxString::Format( _( "Error loading drawing sheet '%s'." ),
487 fullFileName ),
488 msg );
489 }
490
492 }
493
494 int idx = std::max( m_paperSizeComboBox->GetSelection(), 0 );
495 const wxString paperType = m_pageFmt[idx];
496
497 if( paperType.Contains( PAGE_INFO::Custom ) )
498 {
500
502
503 if( success )
504 {
507
510 }
511 }
512 else
513 {
514 // search for longest common string first, e.g. A4 before A
515 if( paperType.Contains( PAGE_INFO::USLetter ) )
517 else if( paperType.Contains( PAGE_INFO::USLegal ) )
519 else if( paperType.Contains( PAGE_INFO::USLedger ) )
521 else if( paperType.Contains( PAGE_INFO::GERBER ) )
523 else if( paperType.Contains( PAGE_INFO::A5 ) )
524 success = m_pageInfo.SetType( PAGE_INFO::A5 );
525 else if( paperType.Contains( PAGE_INFO::A4 ) )
526 success = m_pageInfo.SetType( PAGE_INFO::A4 );
527 else if( paperType.Contains( PAGE_INFO::A3 ) )
528 success = m_pageInfo.SetType( PAGE_INFO::A3 );
529 else if( paperType.Contains( PAGE_INFO::A2 ) )
530 success = m_pageInfo.SetType( PAGE_INFO::A2 );
531 else if( paperType.Contains( PAGE_INFO::A1 ) )
532 success = m_pageInfo.SetType( PAGE_INFO::A1 );
533 else if( paperType.Contains( PAGE_INFO::A0 ) )
534 success = m_pageInfo.SetType( PAGE_INFO::A0 );
535 else if( paperType.Contains( PAGE_INFO::A ) )
536 success = m_pageInfo.SetType( PAGE_INFO::A );
537 else if( paperType.Contains( PAGE_INFO::B ) )
538 success = m_pageInfo.SetType( PAGE_INFO::B );
539 else if( paperType.Contains( PAGE_INFO::C ) )
540 success = m_pageInfo.SetType( PAGE_INFO::C );
541 else if( paperType.Contains( PAGE_INFO::D ) )
542 success = m_pageInfo.SetType( PAGE_INFO::D );
543 else if( paperType.Contains( PAGE_INFO::E ) )
544 success = m_pageInfo.SetType( PAGE_INFO::E );
545
546 if( success )
547 {
548 int choice = m_orientationComboBox->GetSelection();
549 m_pageInfo.SetPortrait( choice != 0 );
550 }
551 }
552
553 if( !success )
554 {
555 wxFAIL_MSG( "The translation for paper size must preserve original spellings" );
557 }
558
560
561 m_tb.SetRevision( m_TextRevision->GetValue() );
562 m_tb.SetDate( m_TextDate->GetValue() );
563 m_tb.SetCompany( m_TextCompany->GetValue() );
564 m_tb.SetTitle( m_TextTitle->GetValue() );
565 m_tb.SetComment( 0, m_TextComment1->GetValue() );
566 m_tb.SetComment( 1, m_TextComment2->GetValue() );
567 m_tb.SetComment( 2, m_TextComment3->GetValue() );
568 m_tb.SetComment( 3, m_TextComment4->GetValue() );
569 m_tb.SetComment( 4, m_TextComment5->GetValue() );
570 m_tb.SetComment( 5, m_TextComment6->GetValue() );
571 m_tb.SetComment( 6, m_TextComment7->GetValue() );
572 m_tb.SetComment( 7, m_TextComment8->GetValue() );
573 m_tb.SetComment( 8, m_TextComment9->GetValue() );
574
576
577 return onSavePageSettings();
578}
579
580
582{
583 // search all the not translated label list containing our paper type
584 for( unsigned i = 0; i < m_pageFmt.GetCount(); ++i )
585 {
586 // parse each label looking for aPaperSize within it
587 wxStringTokenizer st( m_pageFmt[i] );
588
589 while( st.HasMoreTokens() )
590 {
591 if( st.GetNextToken() == aPaperSize )
592 {
593 m_paperSizeComboBox->SetSelection( i );
594 return;
595 }
596 }
597 }
598}
599
600
602{
603 int lyWidth, lyHeight;
604
605 VECTOR2D clamped_layout_size( std::clamp( m_layout_size.x, (double)MIN_PAGE_SIZE_MILS, m_maxPageSizeMils.x ),
606 std::clamp( m_layout_size.y, (double)MIN_PAGE_SIZE_MILS, m_maxPageSizeMils.y ) );
607
608 double lyRatio = clamped_layout_size.x < clamped_layout_size.y ?
609 (double) clamped_layout_size.y / clamped_layout_size.x :
610 (double) clamped_layout_size.x / clamped_layout_size.y;
611
612 if( clamped_layout_size.x < clamped_layout_size.y )
613 {
614 lyHeight = MAX_PAGE_EXAMPLE_SIZE;
615 lyWidth = KiROUND( (double) lyHeight / lyRatio );
616 }
617 else
618 {
619 lyWidth = MAX_PAGE_EXAMPLE_SIZE;
620 lyHeight = KiROUND( (double) lyWidth / lyRatio );
621 }
622
623 if( m_pageBitmap )
624 {
625 m_PageLayoutExampleBitmap->SetBitmap( wxNullBitmap );
626 delete m_pageBitmap;
627 }
628
629 m_pageBitmap = new wxBitmap( lyWidth + 1, lyHeight + 1 );
630
631 if( m_pageBitmap->IsOk() )
632 {
633 double scaleW = (double) lyWidth / clamped_layout_size.x;
634 double scaleH = (double) lyHeight / clamped_layout_size.y;
635 double scale = std::min( scaleW, scaleH );
636
637 // Prepare DC.
638 wxSize example_size( lyWidth + 1, lyHeight + 1 );
639 wxMemoryDC memDC;
640 memDC.SelectObject( *m_pageBitmap );
641 memDC.SetClippingRegion( wxPoint( 0, 0 ), example_size );
642 memDC.Clear();
643 memDC.SetUserScale( scale, scale );
644
645 // Get logical page size and margins.
646 PAGE_INFO pageDUMMY;
647
648 // Get page type
649 int idx = m_paperSizeComboBox->GetSelection();
650
651 if( idx < 0 )
652 idx = 0;
653
654 wxString pageFmtName = m_pageFmt[idx].BeforeFirst( ' ' );
655 bool portrait = clamped_layout_size.x < clamped_layout_size.y;
656 pageDUMMY.SetType( pageFmtName, portrait );
657
658 if( m_customFmt )
659 {
660 pageDUMMY.SetWidthMils( clamped_layout_size.x );
661 pageDUMMY.SetHeightMils( clamped_layout_size.y );
662 }
663
664 // Draw layout preview.
665 KIGFX::DS_RENDER_SETTINGS renderSettings;
666 COLOR_SETTINGS* colorSettings = m_parent->GetColorSettings();
667 COLOR4D bgColor = m_parent->GetDrawBgColor();
668 wxString emptyString;
669
671 {
672 GRResetPenAndBrush( &memDC );
673 renderSettings.SetDefaultPenWidth( 1 );
674 renderSettings.LoadColors( colorSettings );
675 renderSettings.SetPrintDC( &memDC );
676
680 {
682 renderSettings.SetLayerColor( LAYER_DRAWINGSHEET, color );
683 }
684
685 GRFilledRect( &memDC, VECTOR2I( 0, 0 ), m_layout_size, 0, bgColor, bgColor );
686
687 PrintDrawingSheet( &renderSettings, pageDUMMY, emptyString, emptyString, emptyString,
689 1, &Prj(), wxEmptyString, m_screen->GetVirtualPageNumber() == 1 );
690
691 memDC.SelectObject( wxNullBitmap );
693 }
694
696
697 // Refresh the dialog.
698 Layout();
699 Refresh();
700 }
701}
702
703
705{
706 int idx = std::max( m_paperSizeComboBox->GetSelection(), 0 );
707 const wxString paperType = m_pageFmt[idx];
708
709 // here we assume translators will keep original paper size spellings
710 if( paperType.Contains( PAGE_INFO::Custom ) )
711 {
713
715 {
717 m_orientationComboBox->SetStringSelection( _( "Portrait" ) );
718 else
719 m_orientationComboBox->SetStringSelection( _( "Landscape" ) );
720 }
721 }
722 else
723 {
724 PAGE_INFO pageInfo; // SetType() later to lookup size
725
726 static const wxChar* papers[] = {
727 // longest common string first, since sequential search below
742 };
743
744 unsigned i;
745
746 for( i=0; i < arrayDim( papers ); ++i )
747 {
748 if( paperType.Contains( papers[i] ) )
749 {
750 pageInfo.SetType( papers[i] );
751 break;
752 }
753 }
754
755 wxASSERT( i != arrayDim(papers) ); // dialog UI match the above list?
756
757 VECTOR2D sz = pageInfo.GetSizeMils();
758 m_layout_size = VECTOR2D( sz.x, sz.y );
759
760 // swap sizes to match orientation
761 bool isPortrait = (bool) m_orientationComboBox->GetSelection();
762
763 if( ( isPortrait && m_layout_size.x >= m_layout_size.y ) ||
764 ( !isPortrait && m_layout_size.x < m_layout_size.y ) )
765 {
766 std::swap( m_layout_size.x, m_layout_size.y );
767 }
768 }
769}
770
771
773{
774 double customSizeX = (double) m_customSizeX.GetDoubleValue() / m_iuPerMils;
775 double customSizeY = (double) m_customSizeY.GetDoubleValue() / m_iuPerMils;
776
777 // Ensure layout size can be converted to int coordinates later
778 customSizeX = std::clamp( customSizeX, double( INT_MIN ), double( INT_MAX ) );
779 customSizeY = std::clamp( customSizeY, double( INT_MIN ), double( INT_MAX ) );
780 m_layout_size = VECTOR2D( customSizeX, customSizeY );
781}
782
783
784void DIALOG_PAGES_SETTINGS::OnWksFileSelection( wxCommandEvent& event )
785{
786 wxFileName fn = GetWksFileName();
787 wxString name = fn.GetFullName();
788 wxString path;
789 wxString msg;
790
791 if( fn.IsAbsolute() )
792 {
793 path = fn.GetPath();
794 }
795 else
796 {
797 wxFileName expanded( ExpandEnvVarSubstitutions( GetWksFileName(), &m_parentFrame->Prj() ) );
798
799 if( expanded.IsAbsolute() )
800 path = expanded.GetPath();
801 else
803 }
804
805 // Display a file picker dialog
806 FILEDLG_OPEN_EMBED_FILE customize;
807 wxFileDialog fileDialog( this, _( "Drawing Sheet File" ), path, name,
809 wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST );
810
811 if( m_embeddedFiles )
812 fileDialog.SetCustomizeHook( customize );
813
814 if( fileDialog.ShowModal() != wxID_OK )
815 return;
816
817 wxString fileName = fileDialog.GetPath();
818 wxString shortFileName;
819
820 if( m_embeddedFiles && customize.GetEmbed() )
821 {
822 fn.Assign( fileName );
824 shortFileName = result->GetLink();
825 fileName = m_embeddedFiles->GetTemporaryFileName( result->name ).GetFullPath();
826 }
827 else if( !m_projectPath.IsEmpty() && fileName.StartsWith( m_projectPath ) )
828 {
829 // Try to use a project-relative path
830 fn = wxFileName( fileName );
831 fn.MakeRelativeTo( m_projectPath );
832 shortFileName = fn.GetFullPath();
833 }
834 else
835 {
836 // Failing that see if we can shorten it with env vars:
837 shortFileName = NormalizePath( fileName, &Pgm().GetLocalEnvVariables(), nullptr );
838 }
839
840 std::unique_ptr<DS_DATA_MODEL> ws = std::make_unique<DS_DATA_MODEL>();
841
842 if( !ws->LoadDrawingSheet( fileName, &msg ) )
843 {
845 wxString::Format( _( "Error loading drawing sheet '%s'.\n%s" ),
846 fileName ),
847 msg );
848 return;
849 }
850
851 delete m_drawingSheet;
852
853 m_drawingSheet = ws.release();
854
855 SetWksFileName( shortFileName );
856
859}
int color
Definition: DXF_plotter.cpp:58
const char * name
Definition: DXF_plotter.cpp:57
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
BASE_SCREEN class implementation.
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
Definition: bitmap.cpp:110
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition: box2.h:990
int GetPageCount() const
Definition: base_screen.h:72
int GetVirtualPageNumber() const
Definition: base_screen.h:75
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
Definition: base_screen.h:85
const wxString & GetPageNumber() const
Definition: base_screen.cpp:70
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
Color settings are a bit different than most of the settings objects in that there can be more than o...
Class DIALOG_PAGES_SETTINGS_BASE.
bool m_initialized
list of page sizes (not translated)
void SetCurrentPageSizeSelection(const wxString &aPaperSize)
void OnComment4TextUpdated(wxCommandEvent &event) override
void OnPageOrientationChoice(wxCommandEvent &event) override
void OnUserPageSizeYTextUpdated(wxCommandEvent &event) override
PAGE_INFO m_pageInfo
The max page size allowed by the caller frame.
FILENAME_RESOLVER * m_filenameResolver
DS_DATA_MODEL * m_drawingSheet
Temporary title block (basic inscriptions).
DIALOG_PAGES_SETTINGS(EDA_DRAW_FRAME *aParent, EMBEDDED_FILES *aEmbeddedFiles, double aIuPerMils, const VECTOR2D &aMaxUserSizeMils)
void OnRevisionTextUpdated(wxCommandEvent &event) override
const wxString GetWksFileName()
void OnComment6TextUpdated(wxCommandEvent &event) override
void OnDateApplyClick(wxCommandEvent &event) override
TITLE_BLOCK m_tb
true if the page selection is custom
void OnDateTextUpdated(wxCommandEvent &event) override
VECTOR2D m_layout_size
Temporary bitmap for the drawing sheet example.
void OnComment3TextUpdated(wxCommandEvent &event) override
void OnCompanyTextUpdated(wxCommandEvent &event) override
void OnUserPageSizeXTextUpdated(wxCommandEvent &event) override
void OnComment7TextUpdated(wxCommandEvent &event) override
EMBEDDED_FILES * m_embeddedFiles
void OnPaperSizeChoice(wxCommandEvent &event) override
virtual bool onSavePageSettings()
virtual void onTransferDataToWindow()
void OnComment5TextUpdated(wxCommandEvent &event) override
void OnComment9TextUpdated(wxCommandEvent &event) override
void OnComment1TextUpdated(wxCommandEvent &event) override
void OnComment8TextUpdated(wxCommandEvent &event) override
void OnWksFileSelection(wxCommandEvent &event) override
VECTOR2D m_maxPageSizeMils
Logical drawing sheet size.
virtual bool TransferDataToWindow() override
virtual bool TransferDataFromWindow() override
void SetWksFileName(const wxString &aFilename)
bool m_customFmt
Temporary page info.
void OnComment2TextUpdated(wxCommandEvent &event) override
wxBitmap * m_pageBitmap
the page layuout filename was changed
void OnTitleTextUpdated(wxCommandEvent &event) override
void SetupStandardButtons(std::map< int, wxString > aLabels={})
EDA_BASE_FRAME * m_parentFrame
Definition: dialog_shim.h:231
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 SaveInString(wxString *aOutputString)
Save the description in a buffer.
void SetPageLayout(const char *aPageLayout, bool aAppend=false, const wxString &aSource=wxT("Sexpr_string"))
Populate the list from a S expr description stored in a string.
static void SetAltInstance(DS_DATA_MODEL *aLayout=nullptr)
Set an alternate instance of DS_DATA_MODEL.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
bool IsType(FRAME_T aType) const
The base class for create windows for drawing purpose.
virtual void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)=0
virtual const TITLE_BLOCK & GetTitleBlock() const =0
virtual const PAGE_INFO & GetPageSettings() const =0
virtual void SetPageSettings(const PAGE_INFO &aPageSettings)=0
virtual COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const
Returns a pointer to the active color theme settings.
virtual void OnPageSettingsChange()
Called when modifying the page settings.
virtual COLOR4D GetDrawBgColor() const
wxFileName GetTemporaryFileName(const wxString &aName) const
EMBEDDED_FILE * AddFile(const wxFileName &aName, bool aOverwrite)
Loads a file from disk and adds it to the collection.
Provide an extensible class to resolve 3D model paths.
bool SetProject(PROJECT *aProject, bool *flgChanged=nullptr)
Set the current KiCad project directory as the first entry in the model path list.
void SetProgramBase(PGM_BASE *aBase)
Set a pointer to the application's PGM_BASE instance used to extract the local env vars.
wxString ResolvePath(const wxString &aFileName, const wxString &aWorkingPath, const EMBEDDED_FILES *aFiles)
Determines the full path of the given file name.
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
Store page-layout-specific render settings.
Definition: ds_painter.h:46
void LoadColors(const COLOR_SETTINGS *aSettings) override
Definition: ds_painter.cpp:57
void SetDefaultPenWidth(int aWidth)
void SetLayerColor(int aLayer, const COLOR4D &aColor)
Change the color used to draw a layer.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
void SetPrintDC(wxDC *aDC)
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:59
static const wxChar A3[]
Definition: page_info.h:69
static const wxChar USLedger[]
Definition: page_info.h:81
static const wxChar USLetter[]
Definition: page_info.h:79
static const wxChar USLegal[]
Definition: page_info.h:80
static const wxChar A0[]
Definition: page_info.h:72
static const wxChar A4[]
Definition: page_info.h:68
void SetPortrait(bool aIsPortrait)
Rotate the paper page 90 degrees.
Definition: page_info.cpp:187
static void SetCustomWidthMils(double 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 const wxChar Custom[]
"User" defined page type
Definition: page_info.h:82
void SetHeightMils(double aHeightInMils)
Definition: page_info.cpp:259
static const wxChar A1[]
Definition: page_info.h:71
static const wxChar E[]
Definition: page_info.h:77
static const wxChar B[]
Definition: page_info.h:74
static const wxChar A2[]
Definition: page_info.h:70
const VECTOR2D & GetSizeMils() const
Definition: page_info.h:144
static double GetCustomHeightMils()
Definition: page_info.h:196
double GetHeightMils() const
Definition: page_info.h:141
static const wxChar GERBER[]
Definition: page_info.h:78
const wxString & GetType() const
Definition: page_info.h:99
double GetWidthMils() const
Definition: page_info.h:136
bool IsPortrait() const
Definition: page_info.h:122
static const wxChar D[]
Definition: page_info.h:76
static const wxChar C[]
Definition: page_info.h:75
void SetWidthMils(double aWidthInMils)
Definition: page_info.cpp:245
static double GetCustomWidthMils()
Definition: page_info.h:191
static void SetCustomHeightMils(double 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
static const wxChar A5[]
Definition: page_info.h:67
static const wxChar A[]
Definition: page_info.h:73
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
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:135
void SetBitmap(const wxBitmapBundle &aBmp)
const wxString & GetCompany() const
Definition: title_block.h:96
void SetRevision(const wxString &aRevision)
Definition: title_block.h:81
void SetComment(int aIdx, const wxString &aComment)
Definition: title_block.h:101
const wxString & GetRevision() const
Definition: title_block.h:86
void SetTitle(const wxString &aTitle)
Definition: title_block.h:58
const wxString & GetDate() const
Definition: title_block.h:76
const wxString & GetComment(int aIdx) const
Definition: title_block.h:107
void SetCompany(const wxString &aCompany)
Definition: title_block.h:91
const wxString & GetTitle() const
Definition: title_block.h:63
void SetDate(const wxString &aDate)
Set the date field, and defaults to the current time and date.
Definition: title_block.h:71
void Enable(bool aEnable)
Enable/disable the label, widget and units label.
virtual double GetDoubleValue()
Return the current value in Internal Units.
virtual void SetDoubleValue(double aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
virtual bool Validate(double aMin, double aMax, EDA_UNITS aUnits=EDA_UNITS::UNSCALED)
Validate the control against the given range, informing the user of any errors found.
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
Definition: common.cpp:348
The common library.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:195
This file is part of the common library.
#define _HKI(x)
#define MAX_PAGE_EXAMPLE_SIZE
static const wxString pageFmts[]
#define _(s)
void PrintDrawingSheet(const RENDER_SETTINGS *aSettings, const PAGE_INFO &aPageInfo, const wxString &aSheetName, const wxString &aSheetPath, const wxString &aFileName, const TITLE_BLOCK &aTitleBlock, const std::map< wxString, wxString > *aProperties, int aSheetCount, const wxString &aPageNumber, double aMils2Iu, const PROJECT *aProject, const wxString &aSheetLayer, bool aIsFirstPage)
Print the border and title block.
#define PL_EDITOR_FRAME_NAME
wxString NormalizePath(const wxFileName &aFilePath, const ENV_VAR_MAP *aEnvVars, const wxString &aProjectPath)
Normalize a file path to an environmental variable, if possible.
Definition: env_paths.cpp:71
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ FRAME_SCH_VIEWER
Definition: frame_type.h:36
@ FRAME_SCH
Definition: frame_type.h:34
void GRResetPenAndBrush(wxDC *DC)
Definition: gr_basic.cpp:73
void GRFilledRect(wxDC *DC, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aWidth, const COLOR4D &aColor, const COLOR4D &aBgColor)
Definition: gr_basic.cpp:403
static wxString DrawingSheetFileWildcard()
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:218
@ LAYER_SCHEMATIC_DRAWINGSHEET
Definition: layer_ids.h:398
This file contains miscellaneous commonly used macros and functions.
#define MIN_PAGE_SIZE_MILS
Min and max page sizes for clamping, in mils.
Definition: page_info.h:38
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
see class PGM_BASE
static const char * emptyString
const int scale
std::vector< FAB_LAYER_COLOR > dummy
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: string_utils.h:398
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:691
VECTOR2< double > VECTOR2D
Definition: vector2d.h:690
Definition of file extensions used in Kicad.