Implement Component Classes

- Adds Component Class field to SCH_DIRECTIVE_LABEL
- Adds SCH_SYMBOLs to SCH_RULE_AREA item lists
- SCH_SYMBOLs resolve Component Class directives
- Netlist exporter / importer handles Component Class names
- Adds DRC expressions and functions
- Adds QA check for component class netlist export
This commit is contained in:
JamesJCode
2024-10-01 22:36:18 +01:00
parent ae96ac6d2e
commit d64a112971
37 changed files with 1827 additions and 19 deletions
+37
View File
@@ -1208,6 +1208,42 @@ static void hasNetclassFunc( LIBEVAL::CONTEXT* aCtx, void* self )
} );
}
static void hasComponentClassFunc( LIBEVAL::CONTEXT* aCtx, void* self )
{
LIBEVAL::VALUE* arg = aCtx->Pop();
LIBEVAL::VALUE* result = aCtx->AllocValue();
result->Set( 0.0 );
aCtx->Push( result );
if( !arg || arg->AsString().IsEmpty() )
{
if( aCtx->HasErrorCallback() )
aCtx->ReportError(
_( "Missing component class name argument to hasComponentClass()" ) );
return;
}
PCBEXPR_VAR_REF* vref = static_cast<PCBEXPR_VAR_REF*>( self );
BOARD_ITEM* item = vref ? vref->GetObject( aCtx ) : nullptr;
if( !item )
return;
result->SetDeferredEval(
[item, arg]() -> double
{
BOARD_ITEM* boardItem = static_cast<BOARD_ITEM*>( item );
const COMPONENT_CLASS* compClass = boardItem->GetComponentClass();
if( compClass && compClass->ContainsClassName( arg->AsString() ) )
return 1.0;
return 0.0;
} );
}
PCBEXPR_BUILTIN_FUNCTIONS::PCBEXPR_BUILTIN_FUNCTIONS()
{
@@ -1249,4 +1285,5 @@ void PCBEXPR_BUILTIN_FUNCTIONS::RegisterAllFunctions()
RegisterFunc( wxT( "getField('x')" ), getFieldFunc );
RegisterFunc( wxT( "hasNetclass('x')" ), hasNetclassFunc );
RegisterFunc( wxT( "hasComponentClass('x')" ), hasComponentClassFunc );
}