KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_footprint_properties.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) 2016 Mario Luzeiro <[email protected]>
5 * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
6 * Copyright (C) 2015 Dick Hollenbeck, [email protected]
7 * Copyright (C) 2004-2024 KiCad Developers, see AUTHORS.txt for contributors.
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, you may find one here:
21 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22 * or you may search the http://www.gnu.org website for the version 2 license,
23 * or you may write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 */
26
28#include <bitmaps.h>
29#include <board_commit.h>
31#include <footprint.h>
32#include <confirm.h>
34#include <filename_resolver.h>
35#include <pcb_edit_frame.h>
36#include <pcbnew_settings.h>
37#include <pgm_base.h>
38#include <project_pcb.h>
39#include <kiplatform/ui.h>
48
49
50int DIALOG_FOOTPRINT_PROPERTIES::m_page = 0; // remember the last open page during session
51
52
54 FOOTPRINT* aFootprint ) :
56 m_frame( aParent ),
57 m_footprint( aFootprint ),
58 m_posX( aParent, m_XPosLabel, m_ModPositionX, m_XPosUnit ),
59 m_posY( aParent, m_YPosLabel, m_ModPositionY, m_YPosUnit ),
60 m_orientation( aParent, m_orientationLabel, m_orientationCtrl, nullptr ),
61 m_netClearance( aParent, m_NetClearanceLabel, m_NetClearanceCtrl, m_NetClearanceUnits ),
62 m_solderMask( aParent, m_SolderMaskMarginLabel, m_SolderMaskMarginCtrl,
63 m_SolderMaskMarginUnits ),
64 m_solderPaste( aParent, m_SolderPasteMarginLabel, m_SolderPasteMarginCtrl,
65 m_SolderPasteMarginUnits ),
66 m_solderPasteRatio( aParent, m_PasteMarginRatioLabel, m_PasteMarginRatioCtrl,
67 m_PasteMarginRatioUnits ),
68 m_returnValue( FP_PROPS_CANCEL ),
69 m_initialized( false ),
70 m_gridSize( 0, 0 ),
71 m_lastRequestedSize( 0, 0 )
72{
73 // Create the 3D models page
75 m_NoteBook->AddPage( m_3dPanel, _("3D Models"), false );
76
77 // Configure display origin transforms
80
81 m_fields = new FP_TEXT_GRID_TABLE( m_frame, this );
82
83 m_delayedErrorMessage = wxEmptyString;
84 m_delayedFocusGrid = nullptr;
87 m_initialFocus = false;
88
89 // Give an icon
90 wxIcon icon;
91 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_modedit ) );
92 SetIcon( icon );
93
94 // Give a bit more room for combobox editors
95 m_itemsGrid->SetDefaultRowSize( m_itemsGrid->GetDefaultRowSize() + 4 );
96
98 m_itemsGrid->PushEventHandler( new GRID_TRICKS( m_itemsGrid ) );
99
100 // Show/hide text item columns according to the user's preference
102 m_itemsGrid->ShowHideColumns( cfg->m_FootprintTextShownColumns );
103
104 m_orientation.SetUnits( EDA_UNITS::DEGREES );
106
107 // Set predefined rotations in combo dropdown, according to the locale floating point
108 // separator notation
109 double rot_list[] = { 0.0, 90.0, -90.0, 180.0 };
110
111 for( size_t ii = 0; ii < m_orientationCtrl->GetCount() && ii < 4; ++ii )
112 m_orientationCtrl->SetString( ii, wxString::Format( "%.1f", rot_list[ii] ) );
113
114 // Set font size for items showing long strings:
115 wxFont infoFont = KIUI::GetInfoFont( this );
116 m_libraryIDLabel->SetFont( infoFont );
117 m_tcLibraryID->SetFont( infoFont );
118
119 infoFont.SetStyle( wxFONTSTYLE_ITALIC );
120 m_staticTextInfoCopper->SetFont( infoFont );
121 m_staticTextInfoPaste->SetFont( infoFont );
122
123 m_NoteBook->SetSelection( m_page );
124
125 if( m_page == 0 )
126 {
130 }
131 else if( m_page == 1 )
132 {
134 }
135
137
138 m_solderPasteRatio.SetUnits( EDA_UNITS::PERCENT );
140
141 // Configure button logos
142 m_bpAdd->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
143 m_bpDelete->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
144
145 m_tcLibraryID->SetBackgroundColour( KIPLATFORM::UI::GetDialogBGColour() );
146
147 // We can't set the tab order through wxWidgets due to shortcomings in their mnemonics
148 // implementation on MSW
149 m_tabOrder = {
161 m_cbDNP,
168 };
169
171
173 m_initialized = true;
174}
175
176
178{
179 PCBNEW_SETTINGS* cfg = nullptr;
180
181 try
182 {
183 cfg = m_frame->GetPcbNewSettings();
184 }
185 catch( const std::runtime_error& e )
186 {
187 wxFAIL_MSG( e.what() );
188 }
189
190 if( cfg )
191 {
193 }
194
195 // Prevents crash bug in wxGrid's d'tor
197
198 // Delete the GRID_TRICKS.
199 m_itemsGrid->PopEventHandler( true );
200
201 // free the memory used by all models, otherwise models which were
202 // browsed but not used would consume memory
204
205 // the GL canvas has to be visible before it is destroyed
206 m_page = m_NoteBook->GetSelection();
207 m_NoteBook->SetSelection( 1 );
208}
209
210
212{
214 {
216 Close();
217 }
218}
219
220
222{
224 {
226 Close();
227 }
228}
229
230
232{
234 {
236 Close();
237 }
238}
239
240
242{
244 {
246 Close();
247 }
248}
249
250
252{
253 if( !wxDialog::TransferDataToWindow() )
254 return false;
255
256 if( !m_PanelGeneral->TransferDataToWindow() )
257 return false;
258
259 // Add the models to the panel
261 return false;
262
263 // Footprint Fields
264 for( PCB_FIELD* srcField : m_footprint->GetFields() )
265 {
266 PCB_FIELD field( *srcField );
268
269 m_fields->push_back( field );
270 }
271
272 // notify the grid
273 wxGridTableMessage tmsg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
275 m_itemsGrid->ProcessTableMessage( tmsg );
276
277 // Footprint Properties
278
281
282 m_BoardSideCtrl->SetSelection( (m_footprint->GetLayer() == B_Cu) ? 1 : 0 );
283
284 EDA_ANGLE orientation = m_footprint->GetOrientation();
286
287 m_cbLocked->SetValue( m_footprint->IsLocked() );
288 m_cbLocked->SetToolTip( _( "Locked footprints cannot be freely moved and oriented on the "
289 "canvas and can only be selected when the 'Locked items' checkbox "
290 "is checked in the selection filter." ) );
291
293 m_componentType->SetSelection( 0 );
294 else if( m_footprint->GetAttributes() & FP_SMD )
295 m_componentType->SetSelection( 1 );
296 else
297 m_componentType->SetSelection( 2 );
298
303 m_cbDNP->SetValue( m_footprint->GetAttributes() & FP_DNP );
304
305 // Local Clearances
306
307 if( m_footprint->GetLocalClearance().has_value() )
309 else
310 m_netClearance.SetValue( wxEmptyString );
311
312 if( m_footprint->GetLocalSolderMaskMargin().has_value() )
314 else
315 m_solderMask.SetValue( wxEmptyString );
316
317 if( m_footprint->GetLocalSolderPasteMargin().has_value() )
319 else
320 m_solderPaste.SetValue( wxEmptyString );
321
324 else
325 m_solderPasteRatio.SetValue( wxEmptyString );
326
328
330 {
331 default:
332 case ZONE_CONNECTION::INHERITED: m_ZoneConnectionChoice->SetSelection( 0 ); break;
333 case ZONE_CONNECTION::FULL: m_ZoneConnectionChoice->SetSelection( 1 ); break;
334 case ZONE_CONNECTION::THERMAL: m_ZoneConnectionChoice->SetSelection( 2 ); break;
335 case ZONE_CONNECTION::NONE: m_ZoneConnectionChoice->SetSelection( 3 ); break;
336 }
337
338 // Show the footprint's FPID.
339 m_tcLibraryID->SetValue( m_footprint->GetFPID().Format() );
340
341 for( int col = 0; col < m_itemsGrid->GetNumberCols(); col++ )
342 {
343 m_itemsGrid->SetColMinimalWidth( col, m_itemsGrid->GetVisibleWidth( col, true, false ) );
344
345 // Adjust the column size.
346 int col_size = m_itemsGrid->GetVisibleWidth( col );
347
348 if( col == FPT_LAYER ) // This one's a drop-down. Check all possible values.
349 {
350 BOARD* board = m_footprint->GetBoard();
351
352 for( PCB_LAYER_ID layer : board->GetEnabledLayers().Seq() )
353 col_size = std::max( col_size, GetTextExtent( board->GetLayerName( layer ) ).x );
354
355 // And the swatch:
356 col_size += 20;
357 }
358
359 if( m_itemsGrid->IsColShown( col ) )
360 m_itemsGrid->SetColSize( col, col_size );
361 }
362
363 m_itemsGrid->SetRowLabelSize( 0 );
364
365 Layout();
367
368 return true;
369}
370
371
373{
375 return false;
376
377 if( !DIALOG_SHIM::Validate() )
378 return false;
379
380 // Validate texts.
381 for( size_t i = 0; i < m_fields->size(); ++i )
382 {
383 PCB_FIELD& field = m_fields->at( i );
384
385 // Check for missing field names.
386 if( field.GetName( false ).IsEmpty() )
387 {
389 m_delayedErrorMessage = wxString::Format( _( "Fields must have a name." ) );
392
393 return false;
394 }
395
397 int maxSize = pcbIUScale.mmToIU( TEXT_MAX_SIZE_MM );
398 int width = m_frame->ValueFromString( m_itemsGrid->GetCellValue( i, FPT_WIDTH ) );
399 int height = m_frame->ValueFromString( m_itemsGrid->GetCellValue( i, FPT_HEIGHT ) );
400
401 if( width < minSize )
402 {
403 wxString min = m_frame->StringFromValue( minSize, true );
404
405 m_itemsGrid->SetCellValue( i, FPT_WIDTH, min );
406
408 m_delayedErrorMessage = wxString::Format( _( "Text width must be at least %s." ), min );
411
412 return false;
413 }
414 else if( width > maxSize )
415 {
416 wxString max = m_frame->StringFromValue( maxSize, true );
417
418 m_itemsGrid->SetCellValue( i, FPT_WIDTH, max );
419
421 m_delayedErrorMessage = wxString::Format( _( "Text width must be at most %s." ), max );
424
425 return false;
426 }
427
428 if( height < minSize )
429 {
430 wxString min = m_frame->StringFromValue( minSize, true );
431
432 m_itemsGrid->SetCellValue( i, FPT_HEIGHT, min );
433
435 m_delayedErrorMessage = wxString::Format( _( "Text height must be at least %s." ), min );
438
439 return false;
440 }
441 else if( height > maxSize )
442 {
443 wxString max = m_frame->StringFromValue( maxSize, true );
444
445 m_itemsGrid->SetCellValue( i, FPT_HEIGHT, max );
446
448 m_delayedErrorMessage = wxString::Format( _( "Text height must be at most %s." ), max );
451
452 return false;
453 }
454
455 // Test for acceptable values for thickness and size and clamp if fails
456 int maxPenWidth = Clamp_Text_PenSize( field.GetTextThickness(), field.GetTextSize() );
457
458 if( field.GetTextThickness() > maxPenWidth )
459 {
460 wxString clamped = m_frame->StringFromValue( maxPenWidth, true );
461
462 m_itemsGrid->SetCellValue( i, FPT_THICKNESS, clamped );
463
465 m_delayedErrorMessage = wxString::Format( _( "Text thickness is too large for the "
466 "text size.\n"
467 "It will be clamped at %s." ),
468 clamped );
471
472 return false;
473 }
474 }
475
476 if( !m_netClearance.Validate( 0, INT_MAX ) )
477 return false;
478
479 return true;
480}
481
482
484{
485 if( !Validate() )
486 return false;
487
489 return false;
490
491 // This only commits the editor, model updating is done below so it is inside
492 // the commit
494 return false;
495
496 auto view = m_frame->GetCanvas()->GetView();
497 BOARD_COMMIT commit( m_frame );
498 commit.Modify( m_footprint );
499
500 // Update fields
501 for( size_t ii = 0; ii < m_fields->size(); ++ii )
502 {
503 PCB_FIELD& field = m_fields->at( ii );
505 }
506
507 size_t i = 0;
508
509 for( PCB_FIELD* field : m_footprint->GetFields() )
510 {
511 // copy grid table entries till we run out, then delete any remaining texts
512 if( i < m_fields->size() )
513 *field = m_fields->at( i++ );
514 else
515 field->DeleteStructure();
516 }
517
518 // if there are still grid table entries, create new fields for them
519 while( i < m_fields->size() )
520 {
521 view->Add( m_footprint->AddField( m_fields->at( i++ ) ) );
522 }
523
524 // Initialize masks clearances
525 if( m_netClearance.IsNull() )
527 else
529
530 if( m_solderMask.IsNull() )
532 else
534
535 if( m_solderPaste.IsNull() )
537 else
539
542 else
544
545 switch( m_ZoneConnectionChoice->GetSelection() )
546 {
547 default:
548 case 0: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::INHERITED ); break;
549 case 1: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::FULL ); break;
550 case 2: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::THERMAL ); break;
551 case 3: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::NONE ); break;
552 }
553
554 // Set Footprint Position
556 m_footprint->SetPosition( pos );
557 m_footprint->SetLocked( m_cbLocked->GetValue() );
558
559 int attributes = 0;
560
561 switch( m_componentType->GetSelection() )
562 {
563 case 0: attributes |= FP_THROUGH_HOLE; break;
564 case 1: attributes |= FP_SMD; break;
565 default: break;
566 }
567
568 if( m_boardOnly->GetValue() )
569 attributes |= FP_BOARD_ONLY;
570
571 if( m_excludeFromPosFiles->GetValue() )
572 attributes |= FP_EXCLUDE_FROM_POS_FILES;
573
574 if( m_excludeFromBOM->GetValue() )
575 attributes |= FP_EXCLUDE_FROM_BOM;
576
577 if( m_cbDNP->GetValue() )
578 attributes |= FP_DNP;
579
580 if( m_noCourtyards->GetValue() )
581 attributes |= FP_ALLOW_MISSING_COURTYARD;
582
583 if( m_allowSolderMaskBridges->GetValue() )
584 attributes |= FP_ALLOW_SOLDERMASK_BRIDGES;
585
586 m_footprint->SetAttributes( attributes );
587
589
590 if( m_footprint->GetOrientation() != orient )
592
593 // Set component side, that also have effect on the fields positions on board
594 bool change_layer = false;
595 if( m_BoardSideCtrl->GetSelection() == 0 ) // layer req = COMPONENT
596 {
597 if( m_footprint->GetLayer() == B_Cu )
598 change_layer = true;
599 }
600 else if( m_footprint->GetLayer() == F_Cu )
601 change_layer = true;
602
603 if( change_layer )
605
606 // Copy the models from the panel to the footprint
607 std::vector<FP_3DMODEL>& panelList = m_3dPanel->GetModelList();
608 std::vector<FP_3DMODEL>* fpList = &m_footprint->Models();
609 fpList->clear();
610 fpList->insert( fpList->end(), panelList.begin(), panelList.end() );
611
612 // This is a simple edit, we must create an undo entry
613 if( m_footprint->GetEditFlags() == 0 ) // i.e. not edited, or moved
614 commit.Push( _( "Edit Footprint Properties" ) );
615
617 return true;
618}
619
620
622{
624 return;
625
626 int fieldId = (int) m_fields->size();
627 PCB_FIELD newField =
630
631 newField.SetVisible( false );
632 newField.SetLayer( m_footprint->GetLayer() == F_Cu ? F_Fab : B_Fab );
633 newField.SetFPRelativePosition( { 0, 0 } );
635
636 m_fields->push_back( newField );
637
638 // notify the grid
639 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
640 m_itemsGrid->ProcessTableMessage( msg );
641
642 m_itemsGrid->SetFocus();
643 m_itemsGrid->MakeCellVisible( m_fields->size() - 1, 0 );
644 m_itemsGrid->SetGridCursor( m_fields->size() - 1, 0 );
645
646 m_itemsGrid->EnableCellEditControl( true );
647 m_itemsGrid->ShowCellEditControl();
648}
649
650
652{
654 return;
655
656 wxArrayInt selectedRows = m_itemsGrid->GetSelectedRows();
657
658 if( selectedRows.empty() && m_itemsGrid->GetGridCursorRow() >= 0 )
659 selectedRows.push_back( m_itemsGrid->GetGridCursorRow() );
660
661 if( selectedRows.empty() )
662 return;
663
664 for( int row : selectedRows )
665 {
666 if( row < MANDATORY_FIELDS )
667 {
668 DisplayError( this, wxString::Format( _( "The first %d fields are mandatory." ),
670 return;
671 }
672 }
673
674 m_itemsGrid->CommitPendingChanges( true /* quiet mode */ );
675 m_itemsGrid->ClearSelection();
676
677 // Reverse sort so deleting a row doesn't change the indexes of the other rows.
678 selectedRows.Sort( []( int* first, int* second ) { return *second - *first; } );
679
680 for( int row : selectedRows )
681 {
682 m_fields->erase( m_fields->begin() + row );
683
684 // notify the grid
685 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
686 m_itemsGrid->ProcessTableMessage( msg );
687
688 if( m_itemsGrid->GetNumberRows() > 0 )
689 {
690 m_itemsGrid->MakeCellVisible( std::max( 0, row-1 ), m_itemsGrid->GetGridCursorCol() );
691 m_itemsGrid->SetGridCursor( std::max( 0, row-1 ), m_itemsGrid->GetGridCursorCol() );
692 }
693 }
694}
695
696
698{
699 // Account for scroll bars
701
702 itemsWidth -= m_itemsGrid->GetRowLabelSize();
703
704 for( int i = 0; i < m_itemsGrid->GetNumberCols(); i++ )
705 {
706 if( i == 1 )
707 continue;
708
709 itemsWidth -= m_itemsGrid->GetColSize( i );
710 }
711
712 m_itemsGrid->SetColSize(
713 1, std::max( itemsWidth, m_itemsGrid->GetVisibleWidth( 0, true, false ) ) );
714
715 // Update the width of the 3D panel
717}
718
719
721{
722 if( !m_initialized )
723 return;
724
725 // Handle a grid error. This is delayed to OnUpdateUI so that we can change focus
726 // even when the original validation was triggered from a killFocus event, and so
727 // that the corresponding notebook page can be shown in the background when triggered
728 // from an OK.
729 if( m_delayedFocusRow >= 0 )
730 {
731 // We will re-enter this routine if an error dialog is displayed, so make sure we
732 // zero out our member variables first.
733 wxGrid* grid = m_delayedFocusGrid;
734 int row = m_delayedFocusRow;
735 int col = m_delayedFocusColumn;
736 wxString msg = m_delayedErrorMessage;
737
738 m_delayedFocusGrid = nullptr;
741 m_delayedErrorMessage = wxEmptyString;
742
743 if( !msg.IsEmpty() )
744 {
745 // Do not use DisplayErrorMessage(); it screws up window order on Mac
746 DisplayError( nullptr, msg );
747 }
748
749 grid->SetFocus();
750 grid->MakeCellVisible( row, col );
751
752 // Selecting the first grid item only makes sense for the
753 // items grid
754 if( !m_initialFocus || grid == m_itemsGrid )
755 {
756 grid->SetGridCursor( row, col );
757
758 if( !( col == 0 && row < MANDATORY_FIELDS ) )
759 grid->EnableCellEditControl( true );
760
761 grid->ShowCellEditControl();
762
763 if( grid == m_itemsGrid && row == 0 && col == 0 )
764 {
765 auto referenceEditor = grid->GetCellEditor( 0, 0 );
766
767 if( auto textEntry = dynamic_cast<wxTextEntry*>( referenceEditor->GetControl() ) )
768 KIUI::SelectReferenceNumber( textEntry );
769
770 referenceEditor->DecRef();
771 }
772 }
773 m_initialFocus = false;
774 }
775}
776
777
779{
780 wxSize new_size = aEvent.GetSize();
781
782 if( ( !m_itemsGrid->IsCellEditControlShown() || m_lastRequestedSize != new_size )
783 && m_gridSize != new_size )
784 {
785 m_gridSize = new_size;
786
787 // A trick to fix a cosmetic issue: when, in m_itemsGrid, a layer selector widget has
788 // the focus (is activated in column 6) when resizing the grid, the widget is not moved.
789 // So just change the widget having the focus in this case
790 if( m_NoteBook->GetSelection() == 0 && !m_itemsGrid->HasFocus() )
791 {
792 int col = m_itemsGrid->GetGridCursorCol();
793
794 if( col == 6 ) // a layer selector widget can be activated
795 m_itemsGrid->SetFocus();
796 }
797
799 }
800
801 // We store this value to check whether the dialog is changing size. This might indicate
802 // that the user is scaling the dialog with an editor shown. Some editors do not close
803 // (at least on GTK) when the user drags a dialog corner
804 m_lastRequestedSize = new_size;
805
806 // Always propagate for a grid repaint (needed if the height changes, as well as width)
807 aEvent.Skip();
808
809}
810
811
812void DIALOG_FOOTPRINT_PROPERTIES::OnPageChange( wxNotebookEvent& aEvent )
813{
814 int page = aEvent.GetSelection();
815
816 // Shouldn't be necessary, but is on at least OSX
817 if( page >= 0 )
818 m_NoteBook->ChangeSelection( (unsigned) page );
819}
820
821
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
Definition: bitmap.cpp:110
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:104
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:260
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:46
void SetFPRelativePosition(const VECTOR2I &aPos)
Definition: board_item.cpp:276
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:282
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:680
wxString ConvertCrossReferencesToKIIDs(const wxString &aSource) const
Convert cross-references back and forth between ${refDes:field} and ${kiid:field}.
Definition: board.cpp:1436
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:567
wxString ConvertKIIDsToCrossReferences(const wxString &aSource) const
Definition: board.cpp:1490
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
Definition: commit.h:105
Class DIALOG_FOOTPRINT_PROPERTIES_BASE.
void OnDeleteField(wxCommandEvent &) override
void OnUpdateUI(wxUpdateUIEvent &) override
void OnAddField(wxCommandEvent &) override
void OnPageChange(wxNotebookEvent &event) override
PANEL_FP_PROPERTIES_3D_MODEL * m_3dPanel
void OnGridSize(wxSizeEvent &aEvent) override
void EditLibraryFootprint(wxCommandEvent &) override
DIALOG_FOOTPRINT_PROPERTIES(PCB_EDIT_FRAME *aParent, FOOTPRINT *aFootprint)
void EditFootprint(wxCommandEvent &) override
void UpdateFootprint(wxCommandEvent &) override
void ChangeFootprint(wxCommandEvent &) override
std::vector< wxWindow * > m_tabOrder
Definition: dialog_shim.h:226
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:98
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
EDA_ANGLE Normalize()
Definition: eda_angle.h:255
EDA_ANGLE Normalize180()
Definition: eda_angle.h:294
EDA_ITEM_FLAGS GetEditFlags() const
Definition: eda_item.h:132
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:98
virtual void SetVisible(bool aVisible)
Definition: eda_text.cpp:245
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:183
int GetTextThickness() const
Definition: eda_text.h:126
VECTOR2I GetTextSize() const
Definition: eda_text.h:222
void SetPosition(const VECTOR2I &aPos) override
Definition: footprint.cpp:2297
ZONE_CONNECTION GetLocalZoneConnection() const
Definition: footprint.h:274
void SetLocked(bool isLocked) override
Set the #MODULE_is_LOCKED bit in the m_ModuleStatus.
Definition: footprint.h:407
EDA_ANGLE GetOrientation() const
Definition: footprint.h:212
void SetLocalSolderPasteMarginRatio(std::optional< double > aRatio)
Definition: footprint.h:271
PCB_FIELD * AddField(const PCB_FIELD &aField)
Add a field to the symbol.
Definition: footprint.cpp:580
void SetAttributes(int aAttributes)
Definition: footprint.h:277
std::optional< int > GetLocalSolderPasteMargin() const
Definition: footprint.h:267
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
Definition: footprint.cpp:2201
std::optional< int > GetLocalClearance() const
Definition: footprint.h:261
int GetAttributes() const
Definition: footprint.h:276
void SetLocalZoneConnection(ZONE_CONNECTION aType)
Definition: footprint.h:273
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: footprint.h:221
const LIB_ID & GetFPID() const
Definition: footprint.h:233
bool IsLocked() const override
Definition: footprint.h:397
void GetFields(std::vector< PCB_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with PCB_TEXTs.
Definition: footprint.cpp:565
std::optional< double > GetLocalSolderPasteMarginRatio() const
Definition: footprint.h:270
std::vector< FP_3DMODEL > & Models()
Definition: footprint.h:205
void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight) override
Flip this object, i.e.
Definition: footprint.cpp:2238
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
Definition: footprint.h:265
void SetLocalClearance(std::optional< int > aClearance)
Definition: footprint.h:262
std::optional< int > GetLocalSolderMaskMargin() const
Definition: footprint.h:264
void SetLocalSolderPasteMargin(std::optional< int > aMargin)
Definition: footprint.h:268
VECTOR2I GetPosition() const override
Definition: footprint.h:209
int GetNumberRows() override
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Definition: grid_tricks.h:61
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
UTF8 Format() const
Definition: lib_id.cpp:118
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:418
std::vector< FP_3DMODEL > & GetModelList()
wxString m_FootprintTextShownColumns
PCBNEW_SETTINGS * GetPcbNewSettings() const
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Returns the BOARD_DESIGN_SETTINGS for the open project.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
The main frame for Pcbnew.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
Definition: pcb_field.cpp:92
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings) override
Definition: pcb_text.cpp:364
static S3D_CACHE * Get3DCacheManager(PROJECT *aProject, bool updateProjDir=false)
Return a pointer to an instance of the 3D cache manager.
Definition: project_pcb.cpp:77
void FlushCache(bool closePlugins=true)
Free all data in the cache and by default closes all plugins.
Definition: 3d_cache.cpp:608
void SetBitmap(const wxBitmapBundle &aBmp)
wxString StringFromValue(double aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aValue in internal units into a united string.
int ValueFromString(const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aTextValue in aUnits to internal units used by the frame.
virtual long long int GetValue()
Return the current value in Internal Units.
virtual void SetPrecision(int aLength)
Normally not needed, but can be used to set the precision when using internal units that are floats (...
virtual void SetUnits(EDA_UNITS aUnits)
Normally not needed (as the UNIT_BINDER inherits from the parent frame), but can be used to set to DE...
virtual EDA_ANGLE GetAngleValue()
virtual void SetNegativeZero()
Definition: unit_binder.h:71
virtual double GetDoubleValue()
Return the current value in Internal Units.
virtual void SetAngleValue(const EDA_ANGLE &aValue)
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.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
void SetCoordType(ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType)
Set the current origin transform mode.
Definition: unit_binder.h:188
bool IsNull() const
Return true if the control holds no value (ie: empty string, not 0).
int GetVisibleWidth(int aCol, bool aHeader=true, bool aContents=true, bool aKeep=false)
Calculates the specified column based on the actual size of the text on screen.
Definition: wx_grid.cpp:655
void ShowHideColumns(const wxString &shownColumns)
Show/hide the grid columns based on a tokenized string of shown column indexes.
Definition: wx_grid.cpp:408
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid's SetTable() method with one which doesn't mess up the grid column widths when setting th...
Definition: wx_grid.cpp:231
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
Definition: wx_grid.cpp:364
wxString GetShownColumnsAsString()
Get a tokenized string containing the shown column indexes.
Definition: wx_grid.cpp:378
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:558
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:280
This file is part of the common library.
const int minSize
Push and Shove router track width and via size dialog.
#define _(s)
Declaration of the eda_3d_viewer class.
#define TEXT_MIN_SIZE_MM
Minimum text size (1 micron).
Definition: eda_text.h:45
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
Definition: eda_text.h:46
@ FP_SMD
Definition: footprint.h:73
@ FP_DNP
Definition: footprint.h:80
@ FP_ALLOW_MISSING_COURTYARD
Definition: footprint.h:79
@ FP_EXCLUDE_FROM_POS_FILES
Definition: footprint.h:74
@ FP_BOARD_ONLY
Definition: footprint.h:76
@ FP_EXCLUDE_FROM_BOM
Definition: footprint.h:75
@ FP_THROUGH_HOLE
Definition: footprint.h:72
@ FP_ALLOW_SOLDERMASK_BRIDGES
Definition: footprint.h:78
@ FPT_LAYER
@ FPT_WIDTH
@ FPT_HEIGHT
@ FPT_THICKNESS
@ FPT_NAME
int Clamp_Text_PenSize(int aPenSize, int aSize, bool aStrict)
Pen width should not allow characters to become cluttered up in their own fatness.
Definition: gr_text.cpp:87
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ B_Cu
Definition: layer_ids.h:95
@ F_Fab
Definition: layer_ids.h:120
@ F_Cu
Definition: layer_ids.h:64
@ B_Fab
Definition: layer_ids.h:119
wxColour GetDialogBGColour()
Definition: gtk/ui.cpp:61
wxSize GetUnobscuredSize(const wxWindow *aWindow)
Tries to determine the size of the viewport of a scrollable widget (wxDataViewCtrl,...
Definition: gtk/ui.cpp:195
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
Definition: ui_common.cpp:151
KICOMMON_API void SelectReferenceNumber(wxTextEntry *aTextEntry)
Select the number (or "?") in a reference for ease of editing.
Definition: ui_common.cpp:225
see class PGM_BASE
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
static const wxString GetDefaultFieldName(int aFieldNdx, bool aTranslateForHI=false)
Return a default symbol field name for field aFieldNdx for all components.
#define DO_TRANSLATE
@ MANDATORY_FIELDS
The first 5 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.