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 The 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#include <tool/tool_manager.h>
51
52
53int DIALOG_FOOTPRINT_PROPERTIES::m_page = 0; // remember the last open page during session
54
55
58 m_frame( aParent ),
59 m_footprint( aFootprint ),
68 m_initialized( false )
69{
70 // Create the extra panels. Embedded files is referenced by the 3D model panel.
73
74 m_NoteBook->AddPage( m_3dPanel, _("3D Models"), false );
75 m_NoteBook->AddPage( m_embeddedFiles, _( "Embedded Files" ) );
76
77 // Configure display origin transforms
80
81 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
82 embeddedFilesStack.push_back( m_embeddedFiles->GetLocalFiles() );
83 embeddedFilesStack.push_back( m_frame->GetBoard()->GetEmbeddedFiles() );
84
85 m_fields = new PCB_FIELDS_GRID_TABLE( m_frame, this, std::move( embeddedFilesStack ) );
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 m_itemsGrid->SetTable( m_fields );
99 m_itemsGrid->PushEventHandler( new GRID_TRICKS( m_itemsGrid ) );
100 m_itemsGrid->SetupColumnAutosizer( PFC_VALUE );
101
102 // Show/hide text item columns according to the user's preference
103 if( PCBNEW_SETTINGS* cfg = m_frame->GetPcbNewSettings() )
104 m_itemsGrid->ShowHideColumns( cfg->m_FootprintTextShownColumns );
105
107 m_orientation.SetPrecision( 3 );
108
109 // Set predefined rotations in combo dropdown, according to the locale floating point
110 // separator notation
111 double rot_list[] = { 0.0, 90.0, -90.0, 180.0 };
112
113 for( size_t ii = 0; ii < m_orientationCtrl->GetCount() && ii < 4; ++ii )
114 m_orientationCtrl->SetString( ii, wxString::Format( "%.1f", rot_list[ii] ) );
115
116 // Set font size for items showing long strings:
117 wxFont infoFont = KIUI::GetSmallInfoFont( this );
118 m_libraryIDLabel->SetFont( infoFont );
119 m_tcLibraryID->SetFont( infoFont );
120
121 infoFont = KIUI::GetInfoFont( this ).Italic();
122 m_staticTextInfoCopper->SetFont( infoFont );
123 m_staticTextInfoPaste->SetFont( infoFont );
124
125 m_NoteBook->SetSelection( m_page );
126
127 if( m_page == 0 )
128 {
132 }
133 else if( m_page == 1 )
134 {
136 }
137
138 m_solderPaste.SetNegativeZero();
139
141 m_solderPasteRatio.SetNegativeZero();
142
143 // Configure button logos
146
147 m_tcLibraryID->SetBackgroundColour( KIPLATFORM::UI::GetDialogBGColour() );
148
149 // We can't set the tab order through wxWidgets due to shortcomings in their mnemonics
150 // implementation on MSW
151 m_tabOrder = {
162 m_cbDNP,
169 };
170
172
173 // The 3D model tab was added after the base dtor. The final dialog size needs to be set
174 // accordingly.
175 SetSizer( m_GeneralBoxSizer );
176 Layout();
177 m_GeneralBoxSizer->Fit( this );
178
180}
181
182
184{
185 if( PCBNEW_SETTINGS* cfg = m_frame->GetPcbNewSettings() )
186 cfg->m_FootprintTextShownColumns = m_itemsGrid->GetShownColumnsAsString();
187
188 // Prevents crash bug in wxGrid's d'tor
189 m_itemsGrid->DestroyTable( m_fields );
190
191 // Delete the GRID_TRICKS.
192 m_itemsGrid->PopEventHandler( true );
193
194 // free the memory used by all models, otherwise models which were
195 // browsed but not used would consume memory
197
198 // the GL canvas has to be visible before it is destroyed
199 m_page = m_NoteBook->GetSelection();
200 m_NoteBook->SetSelection( 1 );
201}
202
203
205{
207 {
209 Close();
210 }
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{
246 if( !wxDialog::TransferDataToWindow() )
247 return false;
248
249 if( !m_PanelGeneral->TransferDataToWindow() )
250 return false;
251
252 // Add the models to the panel
253 if( !m_3dPanel->TransferDataToWindow() )
254 return false;
255
256 if( !m_embeddedFiles->TransferDataToWindow() )
257 return false;
258
259 // Footprint Fields
260 for( PCB_FIELD* srcField : m_footprint->GetFields() )
261 {
262 PCB_FIELD field( *srcField );
263 field.SetText( m_footprint->GetBoard()->ConvertKIIDsToCrossReferences( field.GetText() ) );
264
265 m_fields->push_back( field );
266 }
267
268 // notify the grid
269 wxGridTableMessage tmsg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, m_fields->GetNumberRows() );
270 m_itemsGrid->ProcessTableMessage( tmsg );
271
272 // Footprint Properties
273
274 m_posX.SetValue( m_footprint->GetPosition().x );
275 m_posY.SetValue( m_footprint->GetPosition().y );
276
277 m_BoardSideCtrl->SetSelection( (m_footprint->GetLayer() == B_Cu) ? 1 : 0 );
278
279 EDA_ANGLE orientation = m_footprint->GetOrientation();
280 m_orientation.SetAngleValue( orientation.Normalize180() );
281
282 m_cbLocked->SetValue( m_footprint->IsLocked() );
283 m_cbLocked->SetToolTip( _( "Locked footprints cannot be freely moved or oriented on the canvas and can only be "
284 "selected when the 'Locked items' checkbox is checked in the selection filter." ) );
285
286 if( m_footprint->GetAttributes() & FP_THROUGH_HOLE )
287 m_componentType->SetSelection( 0 );
288 else if( m_footprint->GetAttributes() & FP_SMD )
289 m_componentType->SetSelection( 1 );
290 else
291 m_componentType->SetSelection( 2 );
292
293 m_boardOnly->SetValue( m_footprint->GetAttributes() & FP_BOARD_ONLY );
294 m_excludeFromPosFiles->SetValue( m_footprint->GetAttributes() & FP_EXCLUDE_FROM_POS_FILES );
295 m_excludeFromBOM->SetValue( m_footprint->GetAttributes() & FP_EXCLUDE_FROM_BOM );
296 m_cbDNP->SetValue( m_footprint->GetAttributes() & FP_DNP );
297
298 // Local Clearances
299
300 if( m_footprint->GetLocalClearance().has_value() )
301 m_netClearance.SetValue( m_footprint->GetLocalClearance().value() );
302 else
303 m_netClearance.SetValue( wxEmptyString );
304
305 if( m_footprint->GetLocalSolderMaskMargin().has_value() )
306 m_solderMask.SetValue( m_footprint->GetLocalSolderMaskMargin().value() );
307 else
308 m_solderMask.SetValue( wxEmptyString );
309
310 if( m_footprint->GetLocalSolderPasteMargin().has_value() )
311 m_solderPaste.SetValue( m_footprint->GetLocalSolderPasteMargin().value() );
312 else
313 m_solderPaste.SetValue( wxEmptyString );
314
315 if( m_footprint->GetLocalSolderPasteMarginRatio().has_value() )
316 m_solderPasteRatio.SetDoubleValue( m_footprint->GetLocalSolderPasteMarginRatio().value() * 100.0 );
317 else
318 m_solderPasteRatio.SetValue( wxEmptyString );
319
320 m_allowSolderMaskBridges->SetValue( m_footprint->AllowSolderMaskBridges() );
321
322 switch( m_footprint->GetLocalZoneConnection() )
323 {
324 default:
325 case ZONE_CONNECTION::INHERITED: m_ZoneConnectionChoice->SetSelection( 0 ); break;
326 case ZONE_CONNECTION::FULL: m_ZoneConnectionChoice->SetSelection( 1 ); break;
327 case ZONE_CONNECTION::THERMAL: m_ZoneConnectionChoice->SetSelection( 2 ); break;
328 case ZONE_CONNECTION::NONE: m_ZoneConnectionChoice->SetSelection( 3 ); break;
329 }
330
331 wxString jumperGroups;
332
333 if( m_footprint->GetDuplicatePadNumbersAreJumpers() )
334 jumperGroups = _( "all pads with duplicate numbers" );
335
336 for( const std::set<wxString>& group : m_footprint->JumperPadGroups() )
337 {
338 wxString groupTxt;
339
340 for( const wxString& pinNumber : group )
341 {
342 if( !groupTxt.IsEmpty() )
343 groupTxt << ", ";
344
345 groupTxt << pinNumber;
346 }
347
348 if( !jumperGroups.IsEmpty() )
349 jumperGroups << "; ";
350
351 jumperGroups << "(" << groupTxt << ")";
352 }
353
354 if( jumperGroups.IsEmpty() )
355 {
356 m_jumperGroupsText->SetLabel( _( "none" ) );
358 }
359 else
360 {
361 m_jumperGroupsText->SetLabel( jumperGroups );
362 }
363
364 // Show the footprint's FPID.
365 m_tcLibraryID->SetValue( m_footprint->GetFPID().Format() );
366
367 for( int col = 0; col < m_itemsGrid->GetNumberCols(); col++ )
368 {
369 m_itemsGrid->SetColMinimalWidth( col, m_itemsGrid->GetVisibleWidth( col, true, false ) );
370
371 // Adjust the column size.
372 int col_size = m_itemsGrid->GetVisibleWidth( col );
373
374 if( col == PFC_LAYER ) // This one's a drop-down. Check all possible values.
375 {
376 BOARD* board = m_footprint->GetBoard();
377
378 for( PCB_LAYER_ID layer : board->GetEnabledLayers() )
379 col_size = std::max( col_size, GetTextExtent( board->GetLayerName( layer ) ).x );
380
381 // Swatch and gaps:
382 col_size += KiROUND( 14 * GetDPIScaleFactor() ) + 12;
383 }
384
385 if( m_itemsGrid->IsColShown( col ) )
386 m_itemsGrid->SetColSize( col, col_size );
387 }
388
389 m_itemsGrid->SetRowLabelSize( 0 );
390
391 Layout();
392 m_initialized = true;
393
394 return true;
395}
396
397
399{
400 if( !m_itemsGrid->CommitPendingChanges() )
401 return false;
402
403 if( !DIALOG_SHIM::Validate() )
404 return false;
405
406 // Validate texts.
407 for( size_t i = 0; i < m_fields->size(); ++i )
408 {
409 PCB_FIELD& field = m_fields->at( i );
410
411 // Check for missing field names.
412 if( field.GetName( false ).IsEmpty() )
413 {
415 m_delayedErrorMessage = wxString::Format( _( "Fields must have a name." ) );
418
419 return false;
420 }
421
422 int minSize = pcbIUScale.mmToIU( TEXT_MIN_SIZE_MM );
423 int maxSize = pcbIUScale.mmToIU( TEXT_MAX_SIZE_MM );
424 int width = m_frame->ValueFromString( m_itemsGrid->GetCellValue( i, PFC_WIDTH ) );
425 int height = m_frame->ValueFromString( m_itemsGrid->GetCellValue( i, PFC_HEIGHT ) );
426
427 if( width < minSize )
428 {
429 wxString min = m_frame->StringFromValue( minSize, true );
430
431 m_itemsGrid->SetCellValue( i, PFC_WIDTH, min );
432
434 m_delayedErrorMessage = wxString::Format( _( "Text width must be at least %s." ), min );
437
438 return false;
439 }
440 else if( width > maxSize )
441 {
442 wxString max = m_frame->StringFromValue( maxSize, true );
443
444 m_itemsGrid->SetCellValue( i, PFC_WIDTH, max );
445
447 m_delayedErrorMessage = wxString::Format( _( "Text width must be at most %s." ), max );
450
451 return false;
452 }
453
454 if( height < minSize )
455 {
456 wxString min = m_frame->StringFromValue( minSize, true );
457
458 m_itemsGrid->SetCellValue( i, PFC_HEIGHT, min );
459
461 m_delayedErrorMessage = wxString::Format( _( "Text height must be at least %s." ), min );
464
465 return false;
466 }
467 else if( height > maxSize )
468 {
469 wxString max = m_frame->StringFromValue( maxSize, true );
470
471 m_itemsGrid->SetCellValue( i, PFC_HEIGHT, max );
472
474 m_delayedErrorMessage = wxString::Format( _( "Text height must be at most %s." ), max );
477
478 return false;
479 }
480
481 // Test for acceptable values for thickness and size and clamp if fails
482 int maxPenWidth = ClampTextPenSize( field.GetTextThickness(), field.GetTextSize() );
483
484 if( field.GetTextThickness() > maxPenWidth )
485 {
486 wxString clamped = m_frame->StringFromValue( maxPenWidth, true );
487
488 m_itemsGrid->SetCellValue( i, PFC_THICKNESS, clamped );
489
491 m_delayedErrorMessage = wxString::Format( _( "Text thickness is too large for the text size.\n"
492 "It will be clamped at %s." ),
493 clamped );
496
497 return false;
498 }
499 }
500
501 if( !m_netClearance.Validate( 0, INT_MAX ) )
502 return false;
503
504 return true;
505}
506
507
509{
510 if( !Validate() )
511 return false;
512
513 if( !m_itemsGrid->CommitPendingChanges() )
514 return false;
515
516 KIGFX::PCB_VIEW* view = m_frame->GetCanvas()->GetView();
517 PCB_SELECTION_TOOL* selectionTool = m_frame->GetToolManager()->GetTool<PCB_SELECTION_TOOL>();
518 BOARD_COMMIT commit( m_frame );
519 commit.Modify( m_footprint );
520
521 // Make sure this happens inside a commit to capture any changed files
522 if( !m_3dPanel->TransferDataFromWindow() )
523 return false;
524
525 if( !m_embeddedFiles->TransferDataFromWindow() )
526 return false;
527
528 // Clear out embedded files that are no longer in use
529 std::set<wxString> files;
530 std::set<wxString> files_to_delete;
531
532 // Get the new files from the footprint fields
533 for( PCB_FIELD& field : *m_fields )
534 {
535 if( field.GetText().StartsWith( FILEEXT::KiCadUriPrefix ) )
536 files.insert( field.GetText() );
537 }
538
539 // Find any files referenced in the old fields that are not in the new fields
540 for( PCB_FIELD* field : m_footprint->GetFields() )
541 {
542 if( field->GetText().StartsWith( FILEEXT::KiCadUriPrefix ) )
543 {
544 if( files.find( field->GetText() ) == files.end() )
545 files_to_delete.insert( field->GetText() );
546 }
547 }
548
549 for( const wxString& file : files_to_delete )
550 {
551 wxString name = file.Mid( FILEEXT::KiCadUriPrefix.size() + 3 ); // Skip "kicad-embed://"
552 m_footprint->RemoveFile( name );
553 }
554
555 // Update fields
556 for( PCB_FIELD* existing : m_footprint->GetFields() )
557 delete existing;
558
559 m_footprint->GetFields().clear();
560
561 int ordinal = 42; // Arbitrarily larger than any mandatory FIELD_T ids.
562
563 for( PCB_FIELD& field : *m_fields )
564 {
565 PCB_FIELD* newField = field.CloneField();
566 newField->SetText( commit.GetBoard()->ConvertCrossReferencesToKIIDs( field.GetText() ) );
567
568 if( !field.IsMandatory() )
569 newField->SetOrdinal( ordinal++ );
570
571 m_footprint->Add( newField );
572 view->Add( newField );
573
574 if( newField->IsSelected() )
575 {
576 // The old copy was in the selection list, but this one is not. Remove the
577 // out-of-sync selection flag so we can re-add the field to the selection.
578 newField->ClearSelected();
579 selectionTool->AddItemToSel( newField, true );
580 }
581 }
582
583 // Initialize masks clearances
584 if( m_netClearance.IsNull() )
585 m_footprint->SetLocalClearance( {} );
586 else
587 m_footprint->SetLocalClearance( m_netClearance.GetValue() );
588
589 if( m_solderMask.IsNull() )
590 m_footprint->SetLocalSolderMaskMargin( {} );
591 else
592 m_footprint->SetLocalSolderMaskMargin( m_solderMask.GetValue() );
593
594 if( m_solderPaste.IsNull() )
595 m_footprint->SetLocalSolderPasteMargin( {} );
596 else
597 m_footprint->SetLocalSolderPasteMargin( m_solderPaste.GetValue() );
598
599 if( m_solderPasteRatio.IsNull() )
600 m_footprint->SetLocalSolderPasteMarginRatio( {} );
601 else
602 m_footprint->SetLocalSolderPasteMarginRatio( m_solderPasteRatio.GetDoubleValue() / 100.0 );
603
604 switch( m_ZoneConnectionChoice->GetSelection() )
605 {
606 default:
607 case 0: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::INHERITED ); break;
608 case 1: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::FULL ); break;
609 case 2: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::THERMAL ); break;
610 case 3: m_footprint->SetLocalZoneConnection( ZONE_CONNECTION::NONE ); break;
611 }
612
613 // Set Footprint Position
614 VECTOR2I pos( m_posX.GetValue(), m_posY.GetValue() );
615 m_footprint->SetPosition( pos );
616 m_footprint->SetLocked( m_cbLocked->GetValue() );
617
618 int attributes = 0;
619
620 switch( m_componentType->GetSelection() )
621 {
622 case 0: attributes |= FP_THROUGH_HOLE; break;
623 case 1: attributes |= FP_SMD; break;
624 default: break;
625 }
626
627 if( m_boardOnly->GetValue() )
628 attributes |= FP_BOARD_ONLY;
629
630 if( m_excludeFromPosFiles->GetValue() )
631 attributes |= FP_EXCLUDE_FROM_POS_FILES;
632
633 if( m_excludeFromBOM->GetValue() )
634 attributes |= FP_EXCLUDE_FROM_BOM;
635
636 if( m_cbDNP->GetValue() )
637 attributes |= FP_DNP;
638
639 m_footprint->SetAttributes( attributes );
640
641 m_footprint->SetAllowSolderMaskBridges( m_allowSolderMaskBridges->GetValue() );
642
643 EDA_ANGLE orient = m_orientation.GetAngleValue().Normalize();
644
645 if( m_footprint->GetOrientation() != orient )
646 m_footprint->Rotate( m_footprint->GetPosition(), orient - m_footprint->GetOrientation() );
647
648 // Set component side, that also have effect on the fields positions on board
649 bool change_layer = false;
650
651 if( m_BoardSideCtrl->GetSelection() == 0 ) // layer req = COMPONENT
652 {
653 if( m_footprint->GetLayer() == B_Cu )
654 change_layer = true;
655 }
656 else if( m_footprint->GetLayer() == F_Cu )
657 {
658 change_layer = true;
659 }
660
661 if( change_layer )
662 m_footprint->Flip( m_footprint->GetPosition(), m_frame->GetPcbNewSettings()->m_FlipDirection );
663
664 // Copy the models from the panel to the footprint
665 std::vector<FP_3DMODEL>& panelList = m_3dPanel->GetModelList();
666 std::vector<FP_3DMODEL>* fpList = &m_footprint->Models();
667 fpList->clear();
668 fpList->insert( fpList->end(), panelList.begin(), panelList.end() );
669
670 // This is a simple edit, we must create an undo entry
671 if( m_footprint->GetEditFlags() == 0 ) // i.e. not edited, or moved
672 commit.Push( _( "Edit Footprint Properties" ) );
673
675 return true;
676}
677
678
680{
681 m_itemsGrid->OnAddRow(
682 [&]() -> std::pair<int, int>
683 {
685
686 newField.SetVisible( false );
687 newField.SetLayer( m_footprint->GetLayer() == F_Cu ? F_Fab : B_Fab );
688 newField.SetFPRelativePosition( { 0, 0 } );
689 newField.StyleFromSettings( m_frame->GetDesignSettings(), true );
690
691 m_fields->push_back( newField );
692
693 // notify the grid
694 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
695 m_itemsGrid->ProcessTableMessage( msg );
696 OnModify();
697
698 return { m_fields->size() - 1, PFC_NAME };
699 } );
700}
701
702
704{
705 m_itemsGrid->OnDeleteRows(
706 [&]( int row )
707 {
708 if( row < m_fields->GetMandatoryRowCount() )
709 {
710 DisplayError( this, wxString::Format( _( "The first %d fields are mandatory." ),
711 m_fields->GetMandatoryRowCount() ) );
712 return false;
713 }
714
715 return true;
716 },
717 [&]( int row )
718 {
719 m_fields->erase( m_fields->begin() + row );
720
721 // notify the grid
722 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
723 m_itemsGrid->ProcessTableMessage( msg );
724 } );
725
726 OnModify();
727}
728
729
731{
732 if( !m_initialized )
733 return;
734
735 // Handle a grid error. This is delayed to OnUpdateUI so that we can change focus
736 // even when the original validation was triggered from a killFocus event, and so
737 // that the corresponding notebook page can be shown in the background when triggered
738 // from an OK.
739 if( m_delayedFocusRow >= 0 )
740 {
741 // We will re-enter this routine if an error dialog is displayed, so make sure we
742 // zero out our member variables first.
743 wxGrid* grid = m_delayedFocusGrid;
744 int row = m_delayedFocusRow;
745 int col = m_delayedFocusColumn;
746 wxString msg = m_delayedErrorMessage;
747
748 m_delayedFocusGrid = nullptr;
751 m_delayedErrorMessage = wxEmptyString;
752
753 if( !msg.IsEmpty() )
754 {
755 // Do not use DisplayErrorMessage(); it screws up window order on Mac
756 DisplayError( nullptr, msg );
757 }
758
759 grid->SetFocus();
760 grid->MakeCellVisible( row, col );
761
762 // Selecting the first grid item only makes sense for the
763 // items grid
764 if( !m_initialFocus || grid == m_itemsGrid )
765 {
766 grid->SetGridCursor( row, col );
767
768 if( !( col == 0 && row < m_fields->GetMandatoryRowCount() ) )
769 grid->EnableCellEditControl( true );
770
771 grid->ShowCellEditControl();
772
773 if( grid == m_itemsGrid && row == 0 && col == 0 )
774 {
775 wxGridCellEditor* referenceEditor = grid->GetCellEditor( 0, 0 );
776
777 if( wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( referenceEditor->GetControl() ) )
778 KIUI::SelectReferenceNumber( textEntry );
779
780 referenceEditor->DecRef();
781 }
782 }
783
784 m_initialFocus = false;
785 }
786}
787
788
789void DIALOG_FOOTPRINT_PROPERTIES::OnPageChanging( wxNotebookEvent& aEvent )
790{
791 if( !m_itemsGrid->CommitPendingChanges() )
792 aEvent.Veto();
793}
794
795
796void DIALOG_FOOTPRINT_PROPERTIES::OnCheckBox( wxCommandEvent& event )
797{
798 if( m_initialized )
799 OnModify();
800}
801
802
803void DIALOG_FOOTPRINT_PROPERTIES::OnCombobox( wxCommandEvent& event )
804{
805 if( m_initialized )
806 OnModify();
807}
808
809
810void DIALOG_FOOTPRINT_PROPERTIES::OnText( wxCommandEvent& event )
811{
812 if( m_initialized )
813 OnModify();
814}
815
816
817void DIALOG_FOOTPRINT_PROPERTIES::OnChoice( wxCommandEvent& event )
818{
819 if( m_initialized )
820 OnModify();
821}
const char * name
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:112
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
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition bitmap.cpp:110
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition board_item.h:280
void SetFPRelativePosition(const VECTOR2I &aPos)
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:322
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition board.cpp:692
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition board.cpp:924
DIALOG_FOOTPRINT_PROPERTIES_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Footprint Properties"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
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 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
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition dialog_shim.h:82
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 Normalize180()
Definition eda_angle.h:268
void ClearSelected()
Definition eda_item.h:137
bool IsSelected() const
Definition eda_item.h:127
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:397
virtual void SetText(const wxString &aText)
Definition eda_text.cpp:281
int GetTextThickness() const
Definition eda_text.h:128
VECTOR2I GetTextSize() const
Definition eda_text.h:261
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Definition grid_tricks.h:61
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
Definition pcb_view.cpp:57
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
The main frame for Pcbnew.
void SetOrdinal(int aOrdinal)
Definition pcb_field.h:116
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
PCB_FIELD * CloneField() const
Same as Clone, but returns a PCB_FIELD item.
Definition pcb_field.h:92
The selection tool: currently supports:
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings, bool aCheckSide) override
Definition pcb_text.cpp:314
static S3D_CACHE * Get3DCacheManager(PROJECT *aProject, bool updateProjDir=false)
Return a pointer to an instance of the 3D cache manager.
void FlushCache(bool closePlugins=true)
Free all data in the cache and by default closes all plugins.
Definition 3d_cache.cpp:525
int AddItemToSel(const TOOL_EVENT &aEvent)
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:169
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:47
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
Definition eda_text.h:48
@ FP_SMD
Definition footprint.h:82
@ FP_DNP
Definition footprint.h:87
@ FP_EXCLUDE_FROM_POS_FILES
Definition footprint.h:83
@ FP_BOARD_ONLY
Definition footprint.h:85
@ FP_EXCLUDE_FROM_BOM
Definition footprint.h:84
@ FP_THROUGH_HOLE
Definition footprint.h:81
int ClampTextPenSize(int aPenSize, int aSize, bool aStrict)
Pen width should not allow characters to become cluttered up in their own fatness.
Definition gr_text.cpp:73
static const std::string KiCadUriPrefix
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
@ B_Cu
Definition layer_ids.h:65
@ F_Fab
Definition layer_ids.h:119
@ F_Cu
Definition layer_ids.h:64
@ B_Fab
Definition layer_ids.h:118
wxColour GetDialogBGColour()
Definition wxgtk/ui.cpp:61
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
KICOMMON_API wxFont GetSmallInfoFont(wxWindow *aWindow)
KICOMMON_API wxFont GetControlFont(wxWindow *aWindow)
KICOMMON_API void SelectReferenceNumber(wxTextEntry *aTextEntry)
Select the number (or "?") in a reference for ease of editing.
@ PFC_THICKNESS
see class PGM_BASE
wxString GetUserFieldName(int aFieldNdx, bool aTranslateForHI)
#define DO_TRANSLATE
@ USER
The field ID hasn't been set yet; field is invalid.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695
@ THERMAL
Use thermal relief for pads.
Definition zones.h:50
@ NONE
Pads are not covered.
Definition zones.h:49
@ FULL
pads are covered by copper
Definition zones.h:51