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 @@
+
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" );