72 const std::set<DRC_CONSTRAINT_T>& aClaimedConstraints )
78 auto data = std::make_shared<DRC_RE_VIA_STYLE_CONSTRAINT_DATA>();
79 data->SetRuleName( aRule.
m_Name );
80 data->SetConstraintCode(
"via_style" );
104 auto data = std::make_shared<DRC_RE_ROUTING_DIFF_PAIR_CONSTRAINT_DATA>();
105 data->SetRuleName( aRule.
m_Name );
106 data->SetConstraintCode(
"diff_pair_gap" );
143 auto data = std::make_shared<DRC_RE_MINIMUM_TEXT_HEIGHT_THICKNESS_CONSTRAINT_DATA>();
144 data->SetRuleName( aRule.
m_Name );
145 data->SetConstraintCode(
"text_height" );
161 auto data = std::make_shared<DRC_RE_ROUTING_WIDTH_CONSTRAINT_DATA>();
162 data->SetRuleName( aRule.
m_Name );
163 data->SetConstraintCode(
"track_width" );
170 data->SetPreferredRoutingWidth(
toMM( trackWidth->
GetValue().
Opt() ) );
179 auto data = std::make_shared<DRC_RE_ABSOLUTE_LENGTH_TWO_CONSTRAINT_DATA>();
180 data->SetRuleName( aRule.
m_Name );
181 data->SetConstraintCode(
"length" );
197 auto data = std::make_shared<DRC_RE_MATCHED_LENGTH_DIFF_PAIR_CONSTRAINT_DATA>();
198 data->SetRuleName( aRule.
m_Name );
199 data->SetConstraintCode(
"length" );
220 auto data = std::make_shared<DRC_RE_PERMITTED_LAYERS_CONSTRAINT_DATA>();
221 data->SetRuleName( aRule.
m_Name );
225 if( constraint && constraint->
m_Test )
229 data->SetTopLayerEnabled( expr.Contains( wxS(
"F.Cu" ) ) );
230 data->SetBottomLayerEnabled( expr.Contains( wxS(
"B.Cu" ) ) );
238 auto data = std::make_shared<DRC_RE_ALLOWED_ORIENTATION_CONSTRAINT_DATA>();
239 data->SetRuleName( aRule.
m_Name );
240 data->SetConstraintCode( wxS(
"allowed_orientation" ) );
244 if( constraint && constraint->
m_Test )
248 data->SetIsZeroDegreesAllowed( expr.Contains( wxS(
"== 0 deg" ) ) );
249 data->SetIsNinetyDegreesAllowed( expr.Contains( wxS(
"== 90 deg" ) ) );
250 data->SetIsOneEightyDegreesAllowed( expr.Contains( wxS(
"== 180 deg" ) ) );
251 data->SetIsTwoSeventyDegreesAllowed( expr.Contains( wxS(
"== 270 deg" ) ) );
253 if( !data->GetIsZeroDegreesAllowed() && !data->GetIsNinetyDegreesAllowed()
254 && !data->GetIsOneEightyDegreesAllowed() && !data->GetIsTwoSeventyDegreesAllowed() )
256 data->SetIsAllDegreesAllowed(
true );
261 data->SetIsAllDegreesAllowed(
true );
269 auto data = std::make_shared<DRC_RE_BOOL_INPUT_CONSTRAINT_DATA>();
270 data->SetRuleName( aRule.
m_Name );
271 data->SetConstraintCode( wxS(
"disallow via" ) );
279 data->SetBoolInputValue( ( constraint->
m_DisallowFlags & viaFlags ) != 0 );
287 auto data = std::make_shared<DRC_RE_CUSTOM_RULE_CONSTRAINT_DATA>();
288 data->SetRuleName( aRule.
m_Name );
298 data->SetRuleName( aRule.
m_Name );
301 data->SetConstraintCode( code );
313 data->SetNumericInputValue( constraint->
GetValue().
Min() );
325 auto data = std::make_shared<DRC_RE_CUSTOM_RULE_CONSTRAINT_DATA>();
326 data->SetRuleName( aRule.
m_Name );
334 const wxString& aOriginalText )
336 std::vector<DRC_RE_LOADED_PANEL_ENTRY> entries;
345 std::vector<DRC_PANEL_MATCH> matches =
m_matcher.MatchRule( aRule );
353 if( assertion && assertion->
m_Test )
357 if( expr.Contains( wxS(
"Orientation" ) ) && !expr.Contains( wxS(
"Layer" ) ) )
366 constraintData->SetRuleCondition( condition );
375 if( entries.empty() )
378 entries.push_back( std::move( entry ) );
383 if( entries.empty() )
385 auto customData = std::make_shared<DRC_RE_CUSTOM_RULE_CONSTRAINT_DATA>();
386 customData->SetRuleName( aRule.
m_Name );
387 customData->SetRuleCondition( condition );
388 customData->SetRuleText( aOriginalText );
394 entries.push_back( std::move( entry ) );
403 std::vector<DRC_RE_LOADED_PANEL_ENTRY> allEntries;
404 std::vector<std::shared_ptr<DRC_RULE>> parsedRules;
406 wxString rulesText = aRulesText;
408 if( !rulesText.Contains(
"(version" ) )
409 rulesText.Prepend(
"(version 1)\n" );
414 parser.
Parse( parsedRules,
nullptr );
421 for(
const auto& rule : parsedRules )
426 std::vector<DRC_RE_LOADED_PANEL_ENTRY> ruleEntries =
LoadRule( *rule, originalText );
428 for(
auto& entry : ruleEntries )
429 allEntries.push_back( std::move( entry ) );
442 wxString quotedSearch = wxString::Format( wxS(
"(rule \"%s\"" ), aRuleName );
443 wxString unquotedSearch = wxString::Format( wxS(
"(rule %s" ), aRuleName );
445 size_t startPos = aContent.find( quotedSearch );
447 if( startPos == wxString::npos )
451 while( ( pos = aContent.find( unquotedSearch, pos ) ) != wxString::npos )
453 size_t afterMatch = pos + unquotedSearch.length();
455 if( afterMatch >= aContent.length()
456 || aContent[afterMatch] ==
')'
457 || aContent[afterMatch] ==
' '
458 || aContent[afterMatch] ==
'\n'
459 || aContent[afterMatch] ==
'\r'
460 || aContent[afterMatch] ==
'\t' )
470 if( startPos == wxString::npos )
471 return wxEmptyString;
475 size_t endPos = startPos;
476 bool inString =
false;
477 bool escaped =
false;
479 for(
size_t i = startPos; i < aContent.length(); ++i )
481 wxUniChar c = aContent[i];
497 inString = !inString;
512 if( parenCount == 0 )
520 if( parenCount != 0 )
521 return wxEmptyString;
523 return aContent.Mid( startPos, endPos - startPos + 1 );
std::shared_ptr< DRC_RE_BASE_CONSTRAINT_DATA > createConstraintData(DRC_RULE_EDITOR_CONSTRAINT_NAME aPanel, const DRC_RULE &aRule, const std::set< DRC_CONSTRAINT_T > &aClaimedConstraints)
Create the appropriate constraint data object for a panel type.
Represents a rule loaded from a .kicad_dru file and mapped to a panel.
wxString originalRuleText
wxString layerSource
Original layer text: "inner", "outer", or layer name.