diff --git a/common/base_struct.cpp b/common/base_struct.cpp index 7cd02340bf..912d80d0f3 100644 --- a/common/base_struct.cpp +++ b/common/base_struct.cpp @@ -744,9 +744,8 @@ static struct EDA_ITEM_DESC EDA_ITEM_DESC() { ENUM_MAP::Instance() + .Undefined( TYPE_NOT_INIT ) .Map( NOT_USED, wxT( "" ) ) - //.Map( EOT, wxT( "" ) ) - .Map( TYPE_NOT_INIT, wxT( "" ) ) // == EOT .Map( SCREEN_T, _( "Screen" ) ) .Map( PCB_MODULE_T, _( "Footprint" ) ) @@ -764,21 +763,21 @@ static struct EDA_ITEM_DESC .Map( PCB_ITEM_LIST_T, _( "Item List" ) ) .Map( PCB_NETINFO_T, _( "Net Info" ) ) - .Map( SCH_MARKER_T, _( "Schematic Marker" ) ) - .Map( SCH_JUNCTION_T, _( "Junction" ) ) - .Map( SCH_NO_CONNECT_T, _( "No-Connect Flag" ) ) - .Map( SCH_BUS_WIRE_ENTRY_T, _( "Wire Entry" ) ) - .Map( SCH_BUS_BUS_ENTRY_T, _( "Bus Entry" ) ) - .Map( SCH_LINE_T, _( "Graphic Line" ) ) - .Map( SCH_BITMAP_T, _( "Bitmap" ) ) - .Map( SCH_TEXT_T, _( "Schematic Text" ) ) - .Map( SCH_LABEL_T, _( "Net Label" ) ) - .Map( SCH_GLOBAL_LABEL_T, _( "Global Label" ) ) - .Map( SCH_HIER_LABEL_T, _( "Hierarchical Label" ) ) - .Map( SCH_FIELD_T, _( "Schematic Field" ) ) - .Map( SCH_COMPONENT_T, _( "Component" ) ) - .Map( SCH_SHEET_PIN_T, _( "Sheet Pin" ) ) - .Map( SCH_SHEET_T, _( "Sheet" ) ) + .Map( SCH_MARKER_T, _( "Schematic Marker" ) ) + .Map( SCH_JUNCTION_T, _( "Junction" ) ) + .Map( SCH_NO_CONNECT_T, _( "No-Connect Flag" ) ) + .Map( SCH_BUS_WIRE_ENTRY_T, _( "Wire Entry" ) ) + .Map( SCH_BUS_BUS_ENTRY_T, _( "Bus Entry" ) ) + .Map( SCH_LINE_T, _( "Graphic Line" ) ) + .Map( SCH_BITMAP_T, _( "Bitmap" ) ) + .Map( SCH_TEXT_T, _( "Schematic Text" ) ) + .Map( SCH_LABEL_T, _( "Net Label" ) ) + .Map( SCH_GLOBAL_LABEL_T, _( "Global Label" ) ) + .Map( SCH_HIER_LABEL_T, _( "Hierarchical Label" ) ) + .Map( SCH_FIELD_T, _( "Schematic Field" ) ) + .Map( SCH_COMPONENT_T, _( "Component" ) ) + .Map( SCH_SHEET_PIN_T, _( "Sheet Pin" ) ) + .Map( SCH_SHEET_T, _( "Sheet" ) ) .Map( SCH_FIELD_LOCATE_REFERENCE_T, _( "Field Locate Reference" ) ) .Map( SCH_FIELD_LOCATE_VALUE_T, _( "Field Locate Value" ) ) @@ -799,9 +798,7 @@ static struct EDA_ITEM_DESC .Map( GERBER_LAYOUT_T, _( "Gerber Layout" ) ) .Map( GERBER_DRAW_ITEM_T, _( "Draw Item" ) ) - .Map( GERBER_IMAGE_T, _( "Image" ) ) - - .Map( MAX_STRUCT_TYPE_ID, wxT( "" ) ); + .Map( GERBER_IMAGE_T, _( "Image" ) ); PROPERTY_MANAGER& propMgr = PROPERTY_MANAGER::Instance(); REGISTER_TYPE( EDA_ITEM ); diff --git a/common/libeval_compiler/libeval_compiler.cpp b/common/libeval_compiler/libeval_compiler.cpp index 16003b17cc..7981db98d9 100644 --- a/common/libeval_compiler/libeval_compiler.cpp +++ b/common/libeval_compiler/libeval_compiler.cpp @@ -787,7 +787,7 @@ void UOP::Exec( CONTEXT* ctx, UCODE* ucode ) case TR_UOP_PUSH_VAR: { auto value = ctx->AllocValue(); - value->Set( reinterpret_cast( m_arg )->GetValue( ctx, ucode ) ); + value->Set( reinterpret_cast( m_arg )->GetValue( ucode ) ); ctx->Push( value ); } break; diff --git a/include/libeval_compiler/libeval_compiler.h b/include/libeval_compiler/libeval_compiler.h index 6e64ed4623..765e3c0705 100644 --- a/include/libeval_compiler/libeval_compiler.h +++ b/include/libeval_compiler/libeval_compiler.h @@ -249,7 +249,7 @@ class VAR_REF { public: virtual VAR_TYPE_T GetType() = 0; - virtual VALUE GetValue( CONTEXT* aCtx, UCODE* aUcode ) = 0; + virtual VALUE GetValue( UCODE* aUcode ) = 0; }; diff --git a/include/property.h b/include/property.h index f1044d2fbf..2689443917 100644 --- a/include/property.h +++ b/include/property.h @@ -528,14 +528,22 @@ public: return *this; } - void SetDefault( T aValue ) + ENUM_MAP& Undefined( T aValue ) { - m_default = aValue; + m_undefined = aValue; + return *this; } const wxString& ToString( T value ) const { - return m_choices.GetLabel( static_cast( value ) ); + static const wxString s_undef = "UNDEFINED"; + + int idx = static_cast( value ); + + if( idx >= 0 && idx < (int) m_choices.GetCount() ) + return m_choices.GetLabel( static_cast( value ) ); + else + return s_undef; } const T ToEnum( const wxString value ) @@ -543,7 +551,7 @@ public: if( m_reverseMap.count( value ) ) return m_reverseMap[ value ]; else - return m_default; + return m_undefined; } wxPGChoices& Choices() @@ -554,7 +562,7 @@ public: private: wxPGChoices m_choices; std::unordered_map m_reverseMap; - T m_default; // Returned if the string is not recognized + T m_undefined; // Returned if the string is not recognized ENUM_MAP() { diff --git a/pcbnew/board_connected_item.cpp b/pcbnew/board_connected_item.cpp index 8c848714d6..6366a36848 100644 --- a/pcbnew/board_connected_item.cpp +++ b/pcbnew/board_connected_item.cpp @@ -208,7 +208,7 @@ static struct BOARD_CONNECTED_ITEM_DESC if( layerEnum.Choices().GetCount() == 0 ) { - layerEnum.SetDefault( UNDEFINED_LAYER ); + layerEnum.Undefined( UNDEFINED_LAYER ); for( LSEQ seq = LSET::AllLayersMask().Seq(); seq; ++seq ) layerEnum.Map( *seq, LSET::Name( *seq ) ); diff --git a/pcbnew/class_board_item.cpp b/pcbnew/class_board_item.cpp index 342117dde1..eeeb8e0da3 100644 --- a/pcbnew/class_board_item.cpp +++ b/pcbnew/class_board_item.cpp @@ -147,7 +147,7 @@ static struct BOARD_ITEM_DESC if( layerEnum.Choices().GetCount() == 0 ) { - layerEnum.SetDefault( UNDEFINED_LAYER ); + layerEnum.Undefined( UNDEFINED_LAYER ); for( LSEQ seq = LSET::AllLayersMask().Seq(); seq; ++seq ) layerEnum.Map( *seq, LSET::Name( *seq ) ); diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index 824708d5f9..ff557689a2 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -983,6 +983,7 @@ static struct TRACK_VIA_DESC TRACK_VIA_DESC() { ENUM_MAP::Instance() + .Undefined( VIATYPE::NOT_DEFINED ) .Map( VIATYPE::THROUGH, _( "Through" ) ) .Map( VIATYPE::BLIND_BURIED, _( "Blind/Buried" ) ) .Map( VIATYPE::MICROVIA, _( "Microvia" ) ); diff --git a/pcbnew/pcb_edit_frame.cpp b/pcbnew/pcb_edit_frame.cpp index 7401b2864d..403463e4e0 100644 --- a/pcbnew/pcb_edit_frame.cpp +++ b/pcbnew/pcb_edit_frame.cpp @@ -470,7 +470,7 @@ void PCB_EDIT_FRAME::ReFillLayerWidget() ENUM_MAP& layerEnum = ENUM_MAP::Instance(); layerEnum.Choices().Clear(); - layerEnum.SetDefault( UNDEFINED_LAYER ); + layerEnum.Undefined( UNDEFINED_LAYER ); for( LSEQ seq = LSET::AllLayersMask().Seq(); seq; ++seq ) layerEnum.Map( *seq, GetBoard()->GetLayerName( *seq ) ); diff --git a/pcbnew/pcb_expr_evaluator.cpp b/pcbnew/pcb_expr_evaluator.cpp index 42e9d6a7ac..5f5b930497 100644 --- a/pcbnew/pcb_expr_evaluator.cpp +++ b/pcbnew/pcb_expr_evaluator.cpp @@ -99,17 +99,18 @@ BOARD_ITEM* PCB_EXPR_VAR_REF::GetObject( LIBEVAL::UCODE* aUcode ) const } -LIBEVAL::VALUE PCB_EXPR_VAR_REF::GetValue( LIBEVAL::CONTEXT* aCtx, LIBEVAL::UCODE* aUcode ) +LIBEVAL::VALUE PCB_EXPR_VAR_REF::GetValue( LIBEVAL::UCODE* aUcode ) { BOARD_ITEM* item = const_cast( GetObject( aUcode ) ); auto it = m_matchingTypes.find( TYPE_HASH( *item ) ); if( it == m_matchingTypes.end() ) { - wxString msg; - msg.Printf("property not found for item of type: 0x%x!\n", TYPE_HASH( *item ) ); - aCtx->ReportError( (const char *) msg.c_str() ); - return LIBEVAL::VALUE( 0.0 ); + // Don't force user to type "A.Type == 'via' && A.Via_Type == 'buried'" when the + // simplier "A.Via_Type == 'buried'" is perfectly clear. Instead, return an undefined + // value when the property doesn't appear on a particular object. + + return LIBEVAL::VALUE( "UNDEFINED" ); } else { @@ -118,6 +119,7 @@ LIBEVAL::VALUE PCB_EXPR_VAR_REF::GetValue( LIBEVAL::CONTEXT* aCtx, LIBEVAL::UCOD else { wxString str; + if( !m_isEnum ) { //printf("item %p Get string '%s'\n", item, (const char*) it->second->Name().c_str() ); @@ -125,10 +127,11 @@ LIBEVAL::VALUE PCB_EXPR_VAR_REF::GetValue( LIBEVAL::CONTEXT* aCtx, LIBEVAL::UCOD } else { - const auto& any = item->Get( it->second ); + const wxAny& any = item->Get( it->second ); any.GetAs( &str ); //printf("item %p get enum: '%s'\n", item , (const char*) str.c_str() ); } + return LIBEVAL::VALUE( (const char*) str.c_str() ); } } diff --git a/pcbnew/pcb_expr_evaluator.h b/pcbnew/pcb_expr_evaluator.h index 496b241d3b..4c3d91a175 100644 --- a/pcbnew/pcb_expr_evaluator.h +++ b/pcbnew/pcb_expr_evaluator.h @@ -85,7 +85,7 @@ public: m_matchingTypes[type_hash] = prop; } - virtual LIBEVAL::VALUE GetValue( LIBEVAL::CONTEXT* aCtx, LIBEVAL::UCODE* aUcode ) override; + virtual LIBEVAL::VALUE GetValue( LIBEVAL::UCODE* aUcode ) override; BOARD_ITEM* GetObject( LIBEVAL::UCODE* aUcode ) const;