diff --git a/include/libeval_compiler/libeval_compiler.h b/include/libeval_compiler/libeval_compiler.h index 2a3bfa0d5a..65e53422ed 100644 --- a/include/libeval_compiler/libeval_compiler.h +++ b/include/libeval_compiler/libeval_compiler.h @@ -84,6 +84,7 @@ enum VAR_TYPE_T { VT_STRING = 1, VT_NUMERIC, + VT_NUMERIC_DOUBLE, VT_UNDEFINED, VT_PARSE_ERROR, VT_NULL diff --git a/pcbnew/pcbexpr_evaluator.cpp b/pcbnew/pcbexpr_evaluator.cpp index 3b1a84de55..7e180f5f48 100644 --- a/pcbnew/pcbexpr_evaluator.cpp +++ b/pcbnew/pcbexpr_evaluator.cpp @@ -344,6 +344,20 @@ LIBEVAL::VALUE* PCBEXPR_VAR_REF::GetValue( LIBEVAL::CONTEXT* aCtx ) return new LIBEVAL::VALUE( static_cast<double>( item->Get<int>( it->second ) ) ); } + else if( m_type == LIBEVAL::VT_NUMERIC_DOUBLE ) + { + if( m_isOptional ) + { + auto val = item->Get<std::optional<double>>( it->second ); + + if( val.has_value() ) + return new LIBEVAL::VALUE( val.value() ); + + return LIBEVAL::VALUE::MakeNullValue(); + } + + return new LIBEVAL::VALUE( item->Get<double>( it->second ) ); + } else { wxString str; @@ -428,17 +442,6 @@ LIBEVAL::VALUE* PCBEXPR_TYPE_REF::GetValue( LIBEVAL::CONTEXT* aCtx ) } -LIBEVAL::VALUE* PCBORIENTATION_REF::GetValue( LIBEVAL::CONTEXT* aCtx ) -{ - BOARD_ITEM* item = GetObject( aCtx ); - - if( !item || item->Type() != PCB_FOOTPRINT_T ) - return new LIBEVAL::VALUE(); - - return new LIBEVAL::VALUE( static_cast<FOOTPRINT*>( item )->GetOrientationDegrees() ); -} - - LIBEVAL::FUNC_CALL_REF PCBEXPR_UCODE::CreateFuncCall( const wxString& aName ) { PCBEXPR_BUILTIN_FUNCTIONS& registry = PCBEXPR_BUILTIN_FUNCTIONS::Instance(); @@ -498,15 +501,6 @@ std::unique_ptr<LIBEVAL::VAR_REF> PCBEXPR_UCODE::CreateVarRef( const wxString& a else return nullptr; } - else if( aField.CmpNoCase( wxT( "Orientation" ) ) == 0 ) - { - if( aVar == wxT( "A" ) ) - return std::make_unique<PCBORIENTATION_REF>( 0 ); - else if( aVar == wxT( "B" ) ) - return std::make_unique<PCBORIENTATION_REF>( 1 ); - else - return nullptr; - } if( aVar == wxT( "A" ) || aVar == wxT( "AB" ) ) vref = std::make_unique<PCBEXPR_VAR_REF>( 0 ); @@ -542,6 +536,15 @@ std::unique_ptr<LIBEVAL::VAR_REF> PCBEXPR_UCODE::CreateVarRef( const wxString& a vref->SetType( LIBEVAL::VT_NUMERIC ); vref->SetIsOptional(); } + else if( prop->TypeHash() == TYPE_HASH( double ) ) + { + vref->SetType( LIBEVAL::VT_NUMERIC_DOUBLE ); + } + else if( prop->TypeHash() == TYPE_HASH( std::optional<double> ) ) + { + vref->SetType( LIBEVAL::VT_NUMERIC_DOUBLE ); + vref->SetIsOptional(); + } else if( prop->TypeHash() == TYPE_HASH( bool ) ) { vref->SetType( LIBEVAL::VT_NUMERIC ); @@ -550,7 +553,6 @@ std::unique_ptr<LIBEVAL::VAR_REF> PCBEXPR_UCODE::CreateVarRef( const wxString& a { vref->SetType( LIBEVAL::VT_STRING ); } - else if ( prop->HasChoices() ) { // it's an enum, we treat it as string vref->SetType( LIBEVAL::VT_STRING ); @@ -590,7 +592,8 @@ BOARD* PCBEXPR_CONTEXT::GetBoard() const const std::vector<wxString>& PCBEXPR_UNIT_RESOLVER::GetSupportedUnits() const { - static const std::vector<wxString> pcbUnits = { wxT( "mil" ), wxT( "mm" ), wxT( "in" ), wxT( "deg" ) }; + static const std::vector<wxString> pcbUnits = { wxT( "mil" ), wxT( "mm" ), wxT( "in" ), + wxT( "deg" ) }; return pcbUnits; } diff --git a/pcbnew/pcbexpr_evaluator.h b/pcbnew/pcbexpr_evaluator.h index eb7fb359ac..3077d006ae 100644 --- a/pcbnew/pcbexpr_evaluator.h +++ b/pcbnew/pcbexpr_evaluator.h @@ -172,19 +172,6 @@ public: }; -class PCBORIENTATION_REF : public PCBEXPR_VAR_REF -{ -public: - PCBORIENTATION_REF( int aItemIndex ) : - PCBEXPR_VAR_REF( aItemIndex ) - { - SetType( LIBEVAL::VT_NUMERIC ); - } - - LIBEVAL::VALUE* GetValue( LIBEVAL::CONTEXT* aCtx ) override; -}; - - class PCBEXPR_BUILTIN_FUNCTIONS { public: