diff --git a/common/pcb.keywords b/common/pcb.keywords index 9fd476e1bb..c410ee1ed1 100644 --- a/common/pcb.keywords +++ b/common/pcb.keywords @@ -28,6 +28,7 @@ add_net addsublayer aligned allowed +allow_missing_courtyard allow_soldermask_bridges anchor angle diff --git a/pcbnew/dialogs/dialog_footprint_properties.cpp b/pcbnew/dialogs/dialog_footprint_properties.cpp index c94008b077..f9bc88a792 100644 --- a/pcbnew/dialogs/dialog_footprint_properties.cpp +++ b/pcbnew/dialogs/dialog_footprint_properties.cpp @@ -266,6 +266,7 @@ bool DIALOG_FOOTPRINT_PROPERTIES::TransferDataToWindow() m_boardOnly->SetValue( m_footprint->GetAttributes() & FP_BOARD_ONLY ); m_excludeFromPosFiles->SetValue( m_footprint->GetAttributes() & FP_EXCLUDE_FROM_POS_FILES ); m_excludeFromBOM->SetValue( m_footprint->GetAttributes() & FP_EXCLUDE_FROM_BOM ); + m_noCourtyards->SetValue( m_footprint->GetAttributes() & FP_ALLOW_MISSING_COURTYARD ); // Local Clearances @@ -435,6 +436,9 @@ bool DIALOG_FOOTPRINT_PROPERTIES::TransferDataFromWindow() if( m_excludeFromBOM->GetValue() ) attributes |= FP_EXCLUDE_FROM_BOM; + if( m_noCourtyards->GetValue() ) + attributes |= FP_ALLOW_MISSING_COURTYARD; + if( m_allowSolderMaskBridges->GetValue() ) attributes |= FP_ALLOW_SOLDERMASK_BRIDGES; diff --git a/pcbnew/dialogs/dialog_footprint_properties_base.cpp b/pcbnew/dialogs/dialog_footprint_properties_base.cpp index dd58ca8f5f..c8f17f1113 100644 --- a/pcbnew/dialogs/dialog_footprint_properties_base.cpp +++ b/pcbnew/dialogs/dialog_footprint_properties_base.cpp @@ -203,6 +203,11 @@ DIALOG_FOOTPRINT_PROPERTIES_BASE::DIALOG_FOOTPRINT_PROPERTIES_BASE( wxWindow* pa m_excludeFromBOM = new wxCheckBox( sbFabSizer->GetStaticBox(), wxID_ANY, _("Exclude from BOM"), wxDefaultPosition, wxDefaultSize, 0 ); sbFabSizer->Add( m_excludeFromBOM, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + m_noCourtyards = new wxCheckBox( sbFabSizer->GetStaticBox(), wxID_ANY, _("Exempt from courtyard requirement"), wxDefaultPosition, wxDefaultSize, 0 ); + m_noCourtyards->SetToolTip( _("Will not generate \"missing courtyard\" DRC violations") ); + + sbFabSizer->Add( m_noCourtyards, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizerMiddle->Add( sbFabSizer, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); diff --git a/pcbnew/dialogs/dialog_footprint_properties_base.fbp b/pcbnew/dialogs/dialog_footprint_properties_base.fbp index 4e8bc0c2e1..ebb14830b7 100644 --- a/pcbnew/dialogs/dialog_footprint_properties_base.fbp +++ b/pcbnew/dialogs/dialog_footprint_properties_base.fbp @@ -1556,6 +1556,70 @@ + + 5 + wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Exempt from courtyard requirement + + 0 + + + 0 + + 1 + m_noCourtyards + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + Will not generate "missing courtyard" DRC violations + + wxFILTER_NONE + wxDefaultValidator + + + + + + diff --git a/pcbnew/dialogs/dialog_footprint_properties_base.h b/pcbnew/dialogs/dialog_footprint_properties_base.h index 123303ff09..74253e9854 100644 --- a/pcbnew/dialogs/dialog_footprint_properties_base.h +++ b/pcbnew/dialogs/dialog_footprint_properties_base.h @@ -72,6 +72,7 @@ class DIALOG_FOOTPRINT_PROPERTIES_BASE : public DIALOG_SHIM wxCheckBox* m_boardOnly; wxCheckBox* m_excludeFromPosFiles; wxCheckBox* m_excludeFromBOM; + wxCheckBox* m_noCourtyards; wxButton* m_buttonUpdate; wxButton* m_buttonExchange; wxButton* m_buttonModuleEditor; diff --git a/pcbnew/dialogs/dialog_footprint_properties_fp_editor.cpp b/pcbnew/dialogs/dialog_footprint_properties_fp_editor.cpp index ec08c44562..f4b0b63014 100644 --- a/pcbnew/dialogs/dialog_footprint_properties_fp_editor.cpp +++ b/pcbnew/dialogs/dialog_footprint_properties_fp_editor.cpp @@ -281,6 +281,7 @@ bool DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::TransferDataToWindow() m_boardOnly->SetValue( m_footprint->GetAttributes() & FP_BOARD_ONLY ); m_excludeFromPosFiles->SetValue( m_footprint->GetAttributes() & FP_EXCLUDE_FROM_POS_FILES ); m_excludeFromBOM->SetValue( m_footprint->GetAttributes() & FP_EXCLUDE_FROM_BOM ); + m_noCourtyards->SetValue( m_footprint->GetAttributes() & FP_ALLOW_MISSING_COURTYARD ); // Local Clearances @@ -490,6 +491,9 @@ bool DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::TransferDataFromWindow() if( m_excludeFromBOM->GetValue() ) attributes |= FP_EXCLUDE_FROM_BOM; + if( m_noCourtyards->GetValue() ) + attributes |= FP_ALLOW_MISSING_COURTYARD; + if( m_allowBridges->GetValue() ) attributes |= FP_ALLOW_SOLDERMASK_BRIDGES; diff --git a/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.cpp b/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.cpp index 631c9ddb7b..96d699b6b9 100644 --- a/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.cpp +++ b/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.cpp @@ -207,6 +207,11 @@ DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR_BASE::DIALOG_FOOTPRINT_PROPERTIES_FP_EDITO m_excludeFromBOM = new wxCheckBox( sbFabSizer->GetStaticBox(), wxID_ANY, _("Exclude from BOM"), wxDefaultPosition, wxDefaultSize, 0 ); sbFabSizer->Add( m_excludeFromBOM, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + m_noCourtyards = new wxCheckBox( sbFabSizer->GetStaticBox(), wxID_ANY, _("Exempt from courtyard requirement"), wxDefaultPosition, wxDefaultSize, 0 ); + m_noCourtyards->SetToolTip( _("Will not generate \"missing courtyard\" DRC violations") ); + + sbFabSizer->Add( m_noCourtyards, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizerProperties->Add( sbFabSizer, 1, wxEXPAND|wxRIGHT, 5 ); diff --git a/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.fbp b/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.fbp index 72fcba393f..c533c2f7d8 100644 --- a/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.fbp +++ b/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.fbp @@ -1460,6 +1460,70 @@ + + 5 + wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Exempt from courtyard requirement + + 0 + + + 0 + + 1 + m_noCourtyards + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + Will not generate "missing courtyard" DRC violations + + wxFILTER_NONE + wxDefaultValidator + + + + + + diff --git a/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.h b/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.h index 84a4c9402a..93438d529d 100644 --- a/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.h +++ b/pcbnew/dialogs/dialog_footprint_properties_fp_editor_base.h @@ -66,6 +66,7 @@ class DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR_BASE : public DIALOG_SHIM wxCheckBox* m_boardOnly; wxCheckBox* m_excludeFromPosFiles; wxCheckBox* m_excludeFromBOM; + wxCheckBox* m_noCourtyards; wxPanel* m_PanelClearances; wxStaticText* m_staticTextInfo; wxStaticText* m_NetClearanceLabel; diff --git a/pcbnew/drc/drc_test_provider_courtyard_clearance.cpp b/pcbnew/drc/drc_test_provider_courtyard_clearance.cpp index 7952c48219..322d6018bf 100644 --- a/pcbnew/drc/drc_test_provider_courtyard_clearance.cpp +++ b/pcbnew/drc/drc_test_provider_courtyard_clearance.cpp @@ -123,6 +123,9 @@ bool DRC_TEST_PROVIDER_COURTYARD_CLEARANCE::testFootprintCourtyardDefinitions() if( m_drcEngine->IsErrorLimitExceeded( DRCE_MISSING_COURTYARD ) ) continue; + if( footprint->GetAttributes() & FP_ALLOW_MISSING_COURTYARD ) + continue; + std::shared_ptr drcItem = DRC_ITEM::Create( DRCE_MISSING_COURTYARD ); drcItem->SetItems( footprint ); reportViolation( drcItem, footprint->GetPosition() ); diff --git a/pcbnew/footprint.h b/pcbnew/footprint.h index d028247c06..be0c73b396 100644 --- a/pcbnew/footprint.h +++ b/pcbnew/footprint.h @@ -65,13 +65,14 @@ enum INCLUDE_NPTH_T */ enum FOOTPRINT_ATTR_T { - FP_THROUGH_HOLE = 0x0001, - FP_SMD = 0x0002, - FP_EXCLUDE_FROM_POS_FILES = 0x0004, - FP_EXCLUDE_FROM_BOM = 0x0008, - FP_BOARD_ONLY = 0x0010, // Footprint has no corresponding symbol - FP_JUST_ADDED = 0x0020, // Footprint just added by netlist update - FP_ALLOW_SOLDERMASK_BRIDGES = 0x0040 + FP_THROUGH_HOLE = 0x0001, + FP_SMD = 0x0002, + FP_EXCLUDE_FROM_POS_FILES = 0x0004, + FP_EXCLUDE_FROM_BOM = 0x0008, + FP_BOARD_ONLY = 0x0010, // Footprint has no corresponding symbol + FP_JUST_ADDED = 0x0020, // Footprint just added by netlist update + FP_ALLOW_SOLDERMASK_BRIDGES = 0x0040, + FP_ALLOW_MISSING_COURTYARD = 0x0080 }; class FP_3DMODEL diff --git a/pcbnew/plugins/kicad/pcb_parser.cpp b/pcbnew/plugins/kicad/pcb_parser.cpp index eb81e1d868..b976b219da 100644 --- a/pcbnew/plugins/kicad/pcb_parser.cpp +++ b/pcbnew/plugins/kicad/pcb_parser.cpp @@ -3467,6 +3467,9 @@ FOOTPRINT* PCB_PARSER::parseFOOTPRINT_unchecked( wxArrayString* aInitialComments attributes |= FP_EXCLUDE_FROM_BOM; break; + case T_allow_missing_courtyard: + attributes |= FP_ALLOW_MISSING_COURTYARD; + case T_allow_soldermask_bridges: attributes |= FP_ALLOW_SOLDERMASK_BRIDGES; break; diff --git a/pcbnew/plugins/kicad/pcb_plugin.cpp b/pcbnew/plugins/kicad/pcb_plugin.cpp index f1ec983a29..3ae5b00fc4 100644 --- a/pcbnew/plugins/kicad/pcb_plugin.cpp +++ b/pcbnew/plugins/kicad/pcb_plugin.cpp @@ -1212,6 +1212,9 @@ void PCB_PLUGIN::format( const FOOTPRINT* aFootprint, int aNestLevel ) const if( aFootprint->GetAttributes() & FP_EXCLUDE_FROM_BOM ) m_out->Print( 0, " exclude_from_bom" ); + if( aFootprint->GetAttributes() & FP_ALLOW_MISSING_COURTYARD ) + m_out->Print( 0, " allow_missing_courtyard" ); + if( aFootprint->GetAttributes() & FP_ALLOW_SOLDERMASK_BRIDGES ) m_out->Print( 0, " allow_soldermask_bridges" );