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 <board.h>
32#include <footprint.h>
33#include <confirm.h>
35#include <filename_resolver.h>
36#include <pcb_edit_frame.h>
37#include <pcbnew_settings.h>
38#include <pgm_base.h>
39#include <project_pcb.h>
40#include <kiplatform/ui.h>
49
50
51int DIALOG_FOOTPRINT_PROPERTIES::m_page = 0; // remember the last open page during session
52
53
55 FOOTPRINT* aFootprint ) :
57 m_frame( aParent ),
58 m_footprint( aFootprint ),
59 m_posX( aParent, m_XPosLabel, m_ModPositionX, m_XPosUnit ),
60 m_posY( aParent, m_YPosLabel, m_ModPositionY, m_YPosUnit ),
61 m_orientation( aParent, m_orientationLabel, m_orientationCtrl, nullptr ),
62 m_netClearance( aParent, m_NetClearanceLabel, m_NetClearanceCtrl, m_NetClearanceUnits ),
63 m_solderMask( aParent, m_SolderMaskMarginLabel, m_SolderMaskMarginCtrl,
64 m_SolderMaskMarginUnits ),
65 m_solderPaste( aParent, m_SolderPasteMarginLabel, m_SolderPasteMarginCtrl,
66 m_SolderPasteMarginUnits ),
67 m_solderPasteRatio( aParent, m_PasteMarginRatioLabel, m_PasteMarginRatioCtrl,
68 m_PasteMarginRatioUnits ),
69 m_returnValue( FP_PROPS_CANCEL ),
70 m_initialized( false ),
71 m_gridSize( 0, 0 ),
72 m_lastRequestedSize( 0, 0 )
73{
74 // Create the 3D models page
76 m_NoteBook->AddPage( m_3dPanel, _("3D Models"), false );
77
79 m_NoteBook->AddPage( m_embeddedFiles, _( "Embedded Files" ) );
80
81 // Configure display origin transforms
84
86
87 m_delayedErrorMessage = wxEmptyString;
88 m_delayedFocusGrid = nullptr;
91 m_initialFocus = false;
92
93 // Give an icon
94 wxIcon icon;
95 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_modedit ) );
96 SetIcon( icon );
97
98 // Give a bit more room for combobox editors
99 m_itemsGrid->SetDefaultRowSize( m_itemsGrid->GetDefaultRowSize() + 4 );
100
102 m_itemsGrid->PushEventHandler( new GRID_TRICKS( m_itemsGrid ) );
103
104 // Show/hide text item columns according to the user's preference
106 m_itemsGrid->ShowHideColumns( cfg->m_FootprintTextShownColumns );
107
108 m_orientation.SetUnits( EDA_UNITS::DEGREES );
110
111 // Set predefined rotations in combo dropdown, according to the locale floating point
112 // separator notation
113 double rot_list[] = { 0.0, 90.0, -90.0, 180.0 };
114
115 for( size_t ii = 0; ii < m_orientationCtrl->GetCount() && ii < 4; ++ii )
116 m_orientationCtrl->SetString( ii, wxString::Format( "%.1f", rot_list[ii] ) );
117
118 // Set font size for items showing long strings:
119 wxFont infoFont = KIUI::GetInfoFont( this );
120 m_libraryIDLabel->SetFont( infoFont );
121 m_tcLibraryID->SetFont( infoFont );
122
123 infoFont.SetStyle( wxFONTSTYLE_ITALIC );
124 m_staticTextInfoCopper->SetFont( infoFont );
125 m_staticTextInfoPaste->SetFont( infoFont );
126
127 m_NoteBook->SetSelection( m_page );
128
129 if( m_page == 0 )
130 {
134 }
135 else if( m_page == 1 )
136 {
138 }
139
141
142 m_solderPasteRatio.SetUnits( EDA_UNITS::PERCENT );
144
145 // Configure button logos
146 m_bpAdd->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
147 m_bpDelete->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
148
149 m_tcLibraryID->SetBackgroundColour( KIPLATFORM::UI::GetDialogBGColour() );
150
151 // We can't set the tab order through wxWidgets due to shortcomings in their mnemonics
152 // implementation on MSW
153 m_tabOrder = {
165 m_cbDNP,
172 };
173
175
177}
178
179
181{
182 PCBNEW_SETTINGS* cfg = nullptr;
183
184 try
185 {
186 cfg = m_frame->GetPcbNewSettings();
187 }
188 catch( const std::runtime_error& e )
189 {
190 wxFAIL_MSG( e.what() );
191 }
192
193 if( cfg )
194 {
196 }
197
198 // Prevents crash bug in wxGrid's d'tor
200
201 // Delete the GRID_TRICKS.
202 m_itemsGrid->PopEventHandler( true );
203
204 // free the memory used by all models, otherwise models which were
205 // browsed but not used would consume memory
207
208 // the GL canvas has to be visible before it is destroyed
209 m_page = m_NoteBook->GetSelection();
210 m_NoteBook->SetSelection( 1 );
211}
212
213
215{
217 {
219 Close();
220 }
221}
222
223
225{
227 {
229 Close();
230 }
231}
232
233
235{
237 {
239 Close();
240 }
241}
242
243
245{
247 {
249 Close();
250 }
251}
252
253
255{
256 if( !wxDialog::TransferDataToWindow() )
257 return false;
258
259 if( !m_PanelGeneral->TransferDataToWindow() )
260 return false;
261
262 // Add the models to the panel
264 return false;
265
267 return false;
268
269 // Footprint Fields
270 for( PCB_FIELD* srcField : m_footprint->GetFields() )
271 {
272 PCB_FIELD field( *srcField );
274
275 m_fields->push_back( field );
276 }
277
278 // notify the grid
279 wxGridTableMessage tmsg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
281 m_itemsGrid->ProcessTableMessage( tmsg );
282
283 // Footprint Properties
284
287
288 m_BoardSideCtrl->SetSelection( (m_footprint->GetLayer() == B_Cu) ? 1 : 0 );
289
290 EDA_ANGLE orientation = m_footprint->GetOrientation();
292
293 m_cbLocked->SetValue( m_footprint->IsLocked() );
294 m_cbLocked->SetToolTip( _( "Locked footprints cannot be freely moved and oriented on the "
295 "canvas and can only be selected when the 'Locked items' checkbox "
296 "is checked in the selection filter." ) );
297
299 m_componentType->SetSelection( 0 );
300 else if( m_footprint->GetAttributes() & FP_SMD )
301 m_componentType->SetSelection( 1 );
302 else
303 m_componentType->SetSelection( 2 );
304
309 m_cbDNP->SetValue( m_footprint->GetAttributes() & FP_DNP );
310
311 // Local Clearances
312
313 if( m_footprint->GetLocalClearance().has_value() )
315 else
316 m_netClearance.SetValue( wxEmptyString );
317
318 if( m_footprint->GetLocalSolderMaskMargin().has_value() )
320 else
321 m_solderMask.SetValue( wxEmptyString );
322
323 if( m_footprint->GetLocalSolderPasteMargin().has_value() )
325 else
326 m_solderPaste.SetValue( wxEmptyString );
327
330 else
331 m_solderPasteRatio.SetValue( wxEmptyString );
332
334
336 {
337 default:
338 case ZONE_CONNECTION::INHERITED: m_ZoneConnectionChoice->SetSelection( 0 ); break;
339 case ZONE_CONNECTION::FULL: m_ZoneConnectionChoice->SetSelection( 1 ); break;
340 case ZONE_CONNECTION::THERMAL: m_ZoneConnectionChoice->SetSelection( 2 ); break;
341 case ZONE_CONNECTION::NONE: m_ZoneConnectionChoice->SetSelection( 3 ); break;
342 }
343
344 // Show the footprint's FPID.
345 m_tcLibraryID->SetValue( m_footprint->GetFPID().Format() );
346
347 for( int col = 0; col < m_itemsGrid->GetNumberCols(); col++ )
348 {
349 m_itemsGrid->SetColMinimalWidth( col, m_itemsGrid->GetVisibleWidth( col, true, false ) );
350
351 // Adjust the column size.
352 int col_size = m_itemsGrid->GetVisibleWidth( col );
353
354 if( col == PFC_LAYER ) // This one's a drop-down. Check all possible values.
355 {
356 BOARD* board = m_footprint->GetBoard();
357
358 for( PCB_LAYER_ID layer : board->GetEnabledLayers().Seq() )
359 col_size = std::max( col_size, GetTextExtent( board->GetLayerName( layer ) ).x );
360
361 // Swatch and gaps:
362 col_size += KiROUND( 14 * GetDPIScaleFactor() ) + 12;
363 }
364
365 if( m_itemsGrid->IsColShown( col ) )
366 m_itemsGrid->SetColSize( col, col_size );
367 }
368
369 m_itemsGrid->SetRowLabelSize( 0 );
370
371 Layout();
373 m_initialized = true;
374
375 return true;
376}
377
378
380{
382 return false;
383
384 if( !DIALOG_SHIM::Validate() )
385 return false;
386
387 // Validate texts.
388 for( size_t i = 0; i < m_fields->size(); ++i )
389 {
390 PCB_FIELD& field = m_fields->at( i );
391
392 // Check for missing field names.
393 if( field.GetName( false ).IsEmpty() )
394 {
396 m_delayedErrorMessage = wxString::Format( _( "Fields must have a name." ) );
399
400 return false;
401 }
402
404 int maxSize = pcbIUScale.mmToIU( TEXT_MAX_SIZE_MM );
405 int width = m_frame->ValueFromString( m_itemsGrid->GetCellValue( i, PFC_WIDTH ) );
406 int height = m_frame->ValueFromString( m_itemsGrid->GetCellValue( i, PFC_HEIGHT ) );
407
408 if( width < minSize )
409 {
410 wxString min = m_frame->StringFromValue( minSize, true );
411
412 m_itemsGrid->SetCellValue( i, PFC_WIDTH, min );
413
415 m_delayedErrorMessage = wxString::Format( _( "Text width must be at least %s." ), min );
418
419 return false;
420 }
421 else if( width > maxSize )
422 {
423 wxString max = m_frame->StringFromValue( maxSize, true );
424
425 m_itemsGrid->SetCellValue( i, PFC_WIDTH, max );
426
428 m_delayedErrorMessage = wxString::Format( _( "Text width must be at most %s." ), max );
431
432 return false;
433 }
434
435 if( height < minSize )
436 {
437 wxString min = m_frame->StringFromValue( minSize, true );
438
439 m_itemsGrid->SetCellValue( i, PFC_HEIGHT, min );
440
442 m_delayedErrorMessage = wxString::Format( _( "Text height must be at least %s." ), min );
445
446 return false;
447 }
448 else if( height > maxSize )
449 {
450 wxString max = m_frame->StringFromValue( maxSize, true );
451
452 m_itemsGrid->SetCellValue( i, PFC_HEIGHT, max );
453
455 m_delayedErrorMessage = wxString::Format( _( "Text height must be at most %s." ), max );
458
459 return false;
460 }
461
462 // Test for acceptable values for thickness and size and clamp if fails
463 int maxPenWidth = Clamp_Text_PenSize( field.GetTextThickness(), field.GetTextSize() );
464
465 if( field.GetTextThickness() > maxPenWidth )
466 {
467 wxString clamped = m_frame->StringFromValue( maxPenWidth, true );
468
469 m_itemsGrid->SetCellValue( i, PFC_THICKNESS, clamped );
470
472 m_delayedErrorMessage = wxString::Format( _( "Text thickness is too large for the "
473 "text size.\n"
474 "It will be clamped at %s." ),
475 clamped );
478
479 return false;
480 }
481 }
482
483 if( !m_netClearance.Validate( 0, INT_MAX ) )
484 return false;
485
486 return true;
487}
488
489
491{
492 if( !Validate() )
493 return false;
494
496 return false;
497
498 // This only commits the editor, model updating is done below so it is inside
499 // the commit
501 return false;
502
504 return false;
505
506 auto view = m_frame->GetCanvas()->GetView();
507 BOARD_COMMIT commit( m_frame );
508 commit.Modify( m_footprint );
509
510 // Update fields
511 for( size_t ii = 0; ii < m_fields->size(); ++ii )
512 {
513 PCB_FIELD& field = m_fields->at( ii );
515 }
516
517 size_t i = 0;
518
519 for( PCB_FIELD* field : m_footprint->GetFields() )
520 {
521 // copy grid table entries till we run out, then delete any remaining texts
522 if( i < m_fields->size() )
523 *field = m_fields->at( i++ );
524 else
525 field->DeleteStructure();
526 }
527
528 // if there are still grid table entries, create new fields for them
529 while( i < m_fields->size() )
530 {
531 view->Add( m_footprint->AddField( m_fields->at( i++ ) ) );
532 }
533
534 // Initialize masks clearances
535 if( m_netClearance.IsNull() )
537 else
539
540 if( m_solderMask.IsNull() )
542 else
544
545 if( m_solderPaste.IsNull() )
547 else
549
552 else
554
555 switch( m_ZoneConnectionChoice->GetSelection() )
556 {
557 default:
558 case 0: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::INHERITED ); break;
559 case 1: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::FULL ); break;
560 case 2: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::THERMAL ); break;
561 case 3: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::NONE ); break;
562 }
563
564 // Set Footprint Position
566 m_footprint->SetPosition( pos );
567 m_footprint->SetLocked( m_cbLocked->GetValue() );
568
569 int attributes = 0;
570
571 switch( m_componentType->GetSelection() )
572 {
573 case 0: attributes |= FP_THROUGH_HOLE; break;
574 case 1: attributes |= FP_SMD; break;
575 default: break;
576 }
577
578 if( m_boardOnly->GetValue() )
579 attributes |= FP_BOARD_ONLY;
580
581 if( m_excludeFromPosFiles->GetValue() )
582 attributes |= FP_EXCLUDE_FROM_POS_FILES;
583
584 if( m_excludeFromBOM->GetValue() )
585 attributes |= FP_EXCLUDE_FROM_BOM;
586
587 if( m_cbDNP->GetValue() )
588 attributes |= FP_DNP;
589
590 if( m_noCourtyards->GetValue() )
591 attributes |= FP_ALLOW_MISSING_COURTYARD;
592
593 if( m_allowSolderMaskBridges->GetValue() )
594 attributes |= FP_ALLOW_SOLDERMASK_BRIDGES;
595
596 m_footprint->SetAttributes( attributes );
597
599
600 if( m_footprint->GetOrientation() != orient )
602
603 // Set component side, that also have effect on the fields positions on board
604 bool change_layer = false;
605 if( m_BoardSideCtrl->GetSelection() == 0 ) // layer req = COMPONENT
606 {
607 if( m_footprint->GetLayer() == B_Cu )
608 change_layer = true;
609 }
610 else if( m_footprint->GetLayer() == F_Cu )
611 change_layer = true;
612
613 if( change_layer )
615
616 // Copy the models from the panel to the footprint
617 std::vector<FP_3DMODEL>& panelList = m_3dPanel->GetModelList();
618 std::vector<FP_3DMODEL>* fpList = &m_footprint->Models();
619 fpList->clear();
620 fpList->insert( fpList->end(), panelList.begin(), panelList.end() );
621
622 // This is a simple edit, we must create an undo entry
623 if( m_footprint->GetEditFlags() == 0 ) // i.e. not edited, or moved
624 commit.Push( _( "Edit Footprint Properties" ) );
625
627 return true;
628}
629
630
632{
634 return;
635
636 int fieldId = (int) m_fields->size();
637 PCB_FIELD newField =
640
641 newField.SetVisible( false );
642 newField.SetLayer( m_footprint->GetLayer() == F_Cu ? F_Fab : B_Fab );
643 newField.SetFPRelativePosition( { 0, 0 } );
645
646 m_fields->push_back( newField );
647
648 // notify the grid
649 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
650 m_itemsGrid->ProcessTableMessage( msg );
651
652 m_itemsGrid->SetFocus();
653 m_itemsGrid->MakeCellVisible( m_fields->size() - 1, 0 );
654 m_itemsGrid->SetGridCursor( m_fields->size() - 1, 0 );
655
656 m_itemsGrid->EnableCellEditControl( true );
657 m_itemsGrid->ShowCellEditControl();
658
659 OnModify();
660}
661
662
664{
666 return;
667
668 wxArrayInt selectedRows = m_itemsGrid->GetSelectedRows();
669
670 if( selectedRows.empty() && m_itemsGrid->GetGridCursorRow() >= 0 )
671 selectedRows.push_back( m_itemsGrid->GetGridCursorRow() );
672
673 if( selectedRows.empty() )
674 return;
675
676 for( int row : selectedRows )
677 {
678 if( row < MANDATORY_FIELDS )
679 {
680 DisplayError( this, wxString::Format( _( "The first %d fields are mandatory." ),
682 return;
683 }
684 }
685
686 m_itemsGrid->CommitPendingChanges( true /* quiet mode */ );
687 m_itemsGrid->ClearSelection();
688
689 // Reverse sort so deleting a row doesn't change the indexes of the other rows.
690 selectedRows.Sort( []( int* first, int* second ) { return *second - *first; } );
691
692 for( int row : selectedRows )
693 {
694 m_fields->erase( m_fields->begin() + row );
695
696 // notify the grid
697 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
698 m_itemsGrid->ProcessTableMessage( msg );
699
700 if( m_itemsGrid->GetNumberRows() > 0 )
701 {
702 m_itemsGrid->MakeCellVisible( std::max( 0, row-1 ), m_itemsGrid->GetGridCursorCol() );
703 m_itemsGrid->SetGridCursor( std::max( 0, row-1 ), m_itemsGrid->GetGridCursorCol() );
704 }
705 }
706
707 OnModify();
708}
709
710
712{
713 // Account for scroll bars
715
716 itemsWidth -= m_itemsGrid->GetRowLabelSize();
717
718 for( int i = 0; i < m_itemsGrid->GetNumberCols(); i++ )
719 {
720 if( i == 1 )
721 continue;
722
723 itemsWidth -= m_itemsGrid->GetColSize( i );
724 }
725
726 m_itemsGrid->SetColSize(
727 1, std::max( itemsWidth, m_itemsGrid->GetVisibleWidth( 0, true, false ) ) );
728
729 // Update the width of the 3D panel
731}
732
733
735{
736 if( !m_initialized )
737 return;
738
739 // Handle a grid error. This is delayed to OnUpdateUI so that we can change focus
740 // even when the original validation was triggered from a killFocus event, and so
741 // that the corresponding notebook page can be shown in the background when triggered
742 // from an OK.
743 if( m_delayedFocusRow >= 0 )
744 {
745 // We will re-enter this routine if an error dialog is displayed, so make sure we
746 // zero out our member variables first.
747 wxGrid* grid = m_delayedFocusGrid;
748 int row = m_delayedFocusRow;
749 int col = m_delayedFocusColumn;
750 wxString msg = m_delayedErrorMessage;
751
752 m_delayedFocusGrid = nullptr;
755 m_delayedErrorMessage = wxEmptyString;
756
757 if( !msg.IsEmpty() )
758 {
759 // Do not use DisplayErrorMessage(); it screws up window order on Mac
760 DisplayError( nullptr, msg );
761 }
762
763 grid->SetFocus();
764 grid->MakeCellVisible( row, col );
765
766 // Selecting the first grid item only makes sense for the
767 // items grid
768 if( !m_initialFocus || grid == m_itemsGrid )
769 {
770 grid->SetGridCursor( row, col );
771
772 if( !( col == 0 && row < MANDATORY_FIELDS ) )
773 grid->EnableCellEditControl( true );
774
775 grid->ShowCellEditControl();
776
777 if( grid == m_itemsGrid && row == 0 && col == 0 )
778 {
779 auto referenceEditor = grid->GetCellEditor( 0, 0 );
780
781 if( auto textEntry = dynamic_cast<wxTextEntry*>( referenceEditor->GetControl() ) )
782 KIUI::SelectReferenceNumber( textEntry );
783
784 referenceEditor->DecRef();
785 }
786 }
787
788 m_initialFocus = false;
789 }
790}
791
792
794{
795 wxSize new_size = aEvent.GetSize();
796
797 if( ( !m_itemsGrid->IsCellEditControlShown() || m_lastRequestedSize != new_size )
798 && m_gridSize != new_size )
799 {
800 m_gridSize = new_size;
801
802 // A trick to fix a cosmetic issue: when, in m_itemsGrid, a layer selector widget has
803 // the focus (is activated in column 6) when resizing the grid, the widget is not moved.
804 // So just change the widget having the focus in this case
805 if( m_NoteBook->GetSelection() == 0 && !m_itemsGrid->HasFocus() )
806 {
807 int col = m_itemsGrid->GetGridCursorCol();
808
809 if( col == 6 ) // a layer selector widget can be activated
810 m_itemsGrid->SetFocus();
811 }
812
814 }
815
816 // We store this value to check whether the dialog is changing size. This might indicate
817 // that the user is scaling the dialog with an editor shown. Some editors do not close
818 // (at least on GTK) when the user drags a dialog corner
819 m_lastRequestedSize = new_size;
820
821 // Always propagate for a grid repaint (needed if the height changes, as well as width)
822 aEvent.Skip();
823
824}
825
826
827void DIALOG_FOOTPRINT_PROPERTIES::OnPageChanging( wxNotebookEvent& aEvent )
828{
830 aEvent.Veto();
831}
832
833
834void DIALOG_FOOTPRINT_PROPERTIES::OnCheckBox( wxCommandEvent& event )
835{
836 if( m_initialized )
837 OnModify();
838}
839
840
841void DIALOG_FOOTPRINT_PROPERTIES::OnCombobox( wxCommandEvent& event )
842{
843 if( m_initialized )
844 OnModify();
845}
846
847
848void DIALOG_FOOTPRINT_PROPERTIES::OnText( wxCommandEvent& event )
849{
850 if( m_initialized )
851 OnModify();
852}
853
854
855void DIALOG_FOOTPRINT_PROPERTIES::OnChoice( wxCommandEvent& event )
856{
857 if( m_initialized )
858 OnModify();
859}
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:276
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:47
void SetFPRelativePosition(const VECTOR2I &aPos)
Definition: board_item.cpp:309
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:289
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:760
wxString ConvertCrossReferencesToKIIDs(const wxString &aSource) const
Convert cross-references back and forth between ${refDes:field} and ${kiid:field}.
Definition: board.cpp:1536
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:577
wxString ConvertKIIDsToCrossReferences(const wxString &aSource) const
Definition: board.cpp:1590
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 OnText(wxCommandEvent &event) override
void OnCombobox(wxCommandEvent &event) override
PANEL_FP_PROPERTIES_3D_MODEL * m_3dPanel
void OnGridSize(wxSizeEvent &aEvent) override
void OnPageChanging(wxNotebookEvent &event) override
void EditLibraryFootprint(wxCommandEvent &) override
DIALOG_FOOTPRINT_PROPERTIES(PCB_EDIT_FRAME *aParent, FOOTPRINT *aFootprint)
void OnChoice(wxCommandEvent &event) override
void EditFootprint(wxCommandEvent &) override
void OnCheckBox(wxCommandEvent &event) override
void UpdateFootprint(wxCommandEvent &) override
void ChangeFootprint(wxCommandEvent &) override
std::vector< wxWindow * > m_tabOrder
Definition: dialog_shim.h:231
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:102
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void OnModify()
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:221
EDA_ANGLE Normalize180()
Definition: eda_angle.h:260
EDA_ITEM_FLAGS GetEditFlags() const
Definition: eda_item.h:133
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:94
virtual void SetVisible(bool aVisible)
Definition: eda_text.cpp:275
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:182
int GetTextThickness() const
Definition: eda_text.h:122
VECTOR2I GetTextSize() const
Definition: eda_text.h:241
void SetPosition(const VECTOR2I &aPos) override
Definition: footprint.cpp:2348
ZONE_CONNECTION GetLocalZoneConnection() const
Definition: footprint.h:287
void SetLocked(bool isLocked) override
Set the #MODULE_is_LOCKED bit in the m_ModuleStatus.
Definition: footprint.h:420
EDA_ANGLE GetOrientation() const
Definition: footprint.h:226
void SetLocalSolderPasteMarginRatio(std::optional< double > aRatio)
Definition: footprint.h:284
PCB_FIELD * AddField(const PCB_FIELD &aField)
Add a field to the symbol.
Definition: footprint.cpp:595
void SetAttributes(int aAttributes)
Definition: footprint.h:290
std::optional< int > GetLocalSolderPasteMargin() const
Definition: footprint.h:280
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
Definition: footprint.cpp:2252
std::optional< int > GetLocalClearance() const
Definition: footprint.h:274
int GetAttributes() const
Definition: footprint.h:289
void SetLocalZoneConnection(ZONE_CONNECTION aType)
Definition: footprint.h:286
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: footprint.h:235
const LIB_ID & GetFPID() const
Definition: footprint.h:247
bool IsLocked() const override
Definition: footprint.h:410
void GetFields(std::vector< PCB_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with PCB_TEXTs.
Definition: footprint.cpp:580
std::optional< double > GetLocalSolderPasteMarginRatio() const
Definition: footprint.h:283
std::vector< FP_3DMODEL > & Models()
Definition: footprint.h:219
void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight) override
Flip this object, i.e.
Definition: footprint.cpp:2289
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
Definition: footprint.h:278
void SetLocalClearance(std::optional< int > aClearance)
Definition: footprint.h:275
std::optional< int > GetLocalSolderMaskMargin() const
Definition: footprint.h:277
void SetLocalSolderPasteMargin(std::optional< int > aMargin)
Definition: footprint.h:281
VECTOR2I GetPosition() const override
Definition: footprint.h:223
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:392
bool TransferDataToWindow() override
bool TransferDataFromWindow() override
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:769
void ShowHideColumns(const wxString &shownColumns)
Show/hide the grid columns based on a tokenized string of shown column indexes.
Definition: wx_grid.cpp:487
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:270
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:443
wxString GetShownColumnsAsString()
Get a tokenized string containing the shown column indexes.
Definition: wx_grid.cpp:457
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:637
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:170
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:46
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
Definition: eda_text.h:47
@ FP_SMD
Definition: footprint.h:75
@ FP_DNP
Definition: footprint.h:82
@ FP_ALLOW_MISSING_COURTYARD
Definition: footprint.h:81
@ FP_EXCLUDE_FROM_POS_FILES
Definition: footprint.h:76
@ FP_BOARD_ONLY
Definition: footprint.h:78
@ FP_EXCLUDE_FROM_BOM
Definition: footprint.h:77
@ FP_THROUGH_HOLE
Definition: footprint.h:74
@ FP_ALLOW_SOLDERMASK_BRIDGES
Definition: footprint.h:80
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: wxgtk/ui.cpp:61
wxSize GetUnobscuredSize(const wxWindow *aWindow)
Tries to determine the size of the viewport of a scrollable widget (wxDataViewCtrl,...
Definition: wxgtk/ui.cpp:195
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
Definition: ui_common.cpp:154
KICOMMON_API void SelectReferenceNumber(wxTextEntry *aTextEntry)
Select the number (or "?") in a reference for ease of editing.
Definition: ui_common.cpp:228
@ PFC_HEIGHT
@ PFC_THICKNESS
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.
constexpr ret_type KiROUND(fp_type v, bool aQuiet=false)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:100