Support for 'L' in DRC expression language.
Also make layer testing work again against both canonical names and user names.
This commit is contained in:
parent
a2d9acb647
commit
09ab269770
|
@ -178,8 +178,8 @@ public:
|
||||||
class VALUE
|
class VALUE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
VALUE():
|
VALUE() :
|
||||||
m_type(VT_UNDEFINED),
|
m_type( VT_UNDEFINED ),
|
||||||
m_valueDbl( 0 ),
|
m_valueDbl( 0 ),
|
||||||
m_stringIsWildcard( false )
|
m_stringIsWildcard( false )
|
||||||
{};
|
{};
|
||||||
|
@ -197,17 +197,20 @@ public:
|
||||||
m_stringIsWildcard( false )
|
m_stringIsWildcard( false )
|
||||||
{};
|
{};
|
||||||
|
|
||||||
double AsDouble() const
|
virtual ~VALUE()
|
||||||
|
{};
|
||||||
|
|
||||||
|
virtual double AsDouble() const
|
||||||
{
|
{
|
||||||
return m_valueDbl;
|
return m_valueDbl;
|
||||||
}
|
}
|
||||||
|
|
||||||
const wxString& AsString() const
|
virtual const wxString& AsString() const
|
||||||
{
|
{
|
||||||
return m_valueStr;
|
return m_valueStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EqualTo( const VALUE* b ) const;
|
virtual bool EqualTo( const VALUE* b ) const;
|
||||||
|
|
||||||
VAR_TYPE_T GetType() const { return m_type; };
|
VAR_TYPE_T GetType() const { return m_type; };
|
||||||
|
|
||||||
|
|
|
@ -522,7 +522,6 @@ public:
|
||||||
|
|
||||||
ENUM_MAP& Map( T aValue, const wxString& aName )
|
ENUM_MAP& Map( T aValue, const wxString& aName )
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( m_choices.Index( aName ) == wxNOT_FOUND, "Redefined string for a value in ENUM_MAP" );
|
|
||||||
m_choices.Add( aName, static_cast<int>( aValue ) );
|
m_choices.Add( aName, static_cast<int>( aValue ) );
|
||||||
m_reverseMap[ aName ] = aValue;
|
m_reverseMap[ aName ] = aValue;
|
||||||
return *this;
|
return *this;
|
||||||
|
|
|
@ -499,6 +499,7 @@ LSET DRC_RULES_PARSER::parseLayer()
|
||||||
{
|
{
|
||||||
reportError( wxString::Format( _( "Unrecognized layer '%s'." ),
|
reportError( wxString::Format( _( "Unrecognized layer '%s'." ),
|
||||||
layerName ) );
|
layerName ) );
|
||||||
|
retVal.set( UNDEFINED_LAYER );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1203,7 +1203,12 @@ void PCB_EDIT_FRAME::UpdateUserInterface()
|
||||||
layerEnum.Undefined( UNDEFINED_LAYER );
|
layerEnum.Undefined( UNDEFINED_LAYER );
|
||||||
|
|
||||||
for( LSEQ seq = LSET::AllLayersMask().Seq(); seq; ++seq )
|
for( LSEQ seq = LSET::AllLayersMask().Seq(); seq; ++seq )
|
||||||
|
{
|
||||||
|
// Canonical name
|
||||||
|
layerEnum.Map( *seq, LSET::Name( *seq ) );
|
||||||
|
// User name
|
||||||
layerEnum.Map( *seq, GetBoard()->GetLayerName( *seq ) );
|
layerEnum.Map( *seq, GetBoard()->GetLayerName( *seq ) );
|
||||||
|
}
|
||||||
|
|
||||||
// Sync visibility with canvas
|
// Sync visibility with canvas
|
||||||
KIGFX::VIEW* view = GetCanvas()->GetView();
|
KIGFX::VIEW* view = GetCanvas()->GetView();
|
||||||
|
|
|
@ -340,9 +340,9 @@ PCB_EXPR_BUILTIN_FUNCTIONS::PCB_EXPR_BUILTIN_FUNCTIONS()
|
||||||
|
|
||||||
|
|
||||||
void PCB_EXPR_BUILTIN_FUNCTIONS::RegisterAllFunctions()
|
void PCB_EXPR_BUILTIN_FUNCTIONS::RegisterAllFunctions()
|
||||||
{
|
{
|
||||||
m_funcs.clear();
|
m_funcs.clear();
|
||||||
registerFunc( "existsOnLayer('x')", existsOnLayer );
|
RegisterFunc( "existsOnLayer('x')", existsOnLayer );
|
||||||
RegisterFunc( "isPlated()", isPlated );
|
RegisterFunc( "isPlated()", isPlated );
|
||||||
RegisterFunc( "insideCourtyard('x')", insideCourtyard );
|
RegisterFunc( "insideCourtyard('x')", insideCourtyard );
|
||||||
RegisterFunc( "insideArea('x')", insideArea );
|
RegisterFunc( "insideArea('x')", insideArea );
|
||||||
|
@ -364,8 +364,43 @@ BOARD_ITEM* PCB_EXPR_VAR_REF::GetObject( LIBEVAL::CONTEXT* aCtx ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class PCB_LAYER_VALUE : public LIBEVAL::VALUE
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PCB_LAYER_VALUE( PCB_LAYER_ID aLayer ) :
|
||||||
|
LIBEVAL::VALUE( double( aLayer ) )
|
||||||
|
{};
|
||||||
|
|
||||||
|
virtual bool EqualTo( const VALUE* b ) const override
|
||||||
|
{
|
||||||
|
// For boards with user-defined layer names there will be 2 entries for each layer
|
||||||
|
// in the ENUM_MAP: one for the canonical layer name and one for the user layer name.
|
||||||
|
// We need to check against both.
|
||||||
|
|
||||||
|
wxPGChoices& layerMap = ENUM_MAP<PCB_LAYER_ID>::Instance().Choices();
|
||||||
|
PCB_LAYER_ID layerId = ToLAYER_ID( (int) AsDouble() );
|
||||||
|
|
||||||
|
for( unsigned ii = 0; ii < layerMap.GetCount(); ++ii )
|
||||||
|
{
|
||||||
|
wxPGChoiceEntry& entry = layerMap[ii];
|
||||||
|
|
||||||
|
if( entry.GetValue() == layerId && entry.GetText().Matches( b->AsString() ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
LIBEVAL::VALUE PCB_EXPR_VAR_REF::GetValue( LIBEVAL::CONTEXT* aCtx )
|
LIBEVAL::VALUE PCB_EXPR_VAR_REF::GetValue( LIBEVAL::CONTEXT* aCtx )
|
||||||
{
|
{
|
||||||
|
if( m_itemIndex == 2 )
|
||||||
|
{
|
||||||
|
PCB_EXPR_CONTEXT* context = static_cast<PCB_EXPR_CONTEXT*>( aCtx );
|
||||||
|
return PCB_LAYER_VALUE( context->GetLayer() );
|
||||||
|
}
|
||||||
|
|
||||||
BOARD_ITEM* item = const_cast<BOARD_ITEM*>( GetObject( aCtx ) );
|
BOARD_ITEM* item = const_cast<BOARD_ITEM*>( GetObject( aCtx ) );
|
||||||
auto it = m_matchingTypes.find( TYPE_HASH( *item ) );
|
auto it = m_matchingTypes.find( TYPE_HASH( *item ) );
|
||||||
|
|
||||||
|
@ -413,7 +448,7 @@ std::unique_ptr<LIBEVAL::VAR_REF> PCB_EXPR_UCODE::CreateVarRef( const wxString&
|
||||||
const wxString& aField )
|
const wxString& aField )
|
||||||
{
|
{
|
||||||
PROPERTY_MANAGER& propMgr = PROPERTY_MANAGER::Instance();
|
PROPERTY_MANAGER& propMgr = PROPERTY_MANAGER::Instance();
|
||||||
std::unique_ptr<PCB_EXPR_VAR_REF> vref;;
|
std::unique_ptr<PCB_EXPR_VAR_REF> vref;
|
||||||
|
|
||||||
if( aVar == "A" )
|
if( aVar == "A" )
|
||||||
{
|
{
|
||||||
|
@ -423,6 +458,10 @@ std::unique_ptr<LIBEVAL::VAR_REF> PCB_EXPR_UCODE::CreateVarRef( const wxString&
|
||||||
{
|
{
|
||||||
vref.reset( new PCB_EXPR_VAR_REF( 1 ) );
|
vref.reset( new PCB_EXPR_VAR_REF( 1 ) );
|
||||||
}
|
}
|
||||||
|
else if( aVar == "L" )
|
||||||
|
{
|
||||||
|
vref.reset( new PCB_EXPR_VAR_REF( 2 ) );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
Loading…
Reference in New Issue