From 858e57351e9f2d59412c7d324fc461312037e6d8 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 11 Sep 2024 17:46:11 +0500 Subject: [PATCH] AbstractKernel::convert - more generic approach --- src/ifcgeom/AbstractKernel.cpp | 11 ++--------- src/ifcgeom/AbstractKernel.h | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/ifcgeom/AbstractKernel.cpp b/src/ifcgeom/AbstractKernel.cpp index 4a59c24521..23d7bc1e21 100644 --- a/src/ifcgeom/AbstractKernel.cpp +++ b/src/ifcgeom/AbstractKernel.cpp @@ -29,16 +29,9 @@ bool ifcopenshell::geometry::kernels::AbstractKernel::convert(const taxonomy::pt try { return dispatch_conversion<0>::dispatch(this, item->kind(), item, results); } catch (std::exception& e) { - std::string prev_exception; + std::string prev_exception = std::string(e.what()); try { - prev_exception = std::string(e.what()); - // Try to upgrade. Works for circles and ellipses. - auto concrete_item = ifcopenshell::geometry::taxonomy::template dcast(item); - if (concrete_item) { - return convert_impl(concrete_item, results); - } - Logger::Error(prev_exception + " Upgrade also didn't worked.", item->instance); - return false; + return dispatch_with_upgrade<0>::dispatch(this, item, results); } catch (std::exception& e) { Logger::Error(prev_exception + " Conversion for upgraded element failed with: " + std::string(e.what()), item->instance); return false; diff --git a/src/ifcgeom/AbstractKernel.h b/src/ifcgeom/AbstractKernel.h index 87a6e4d623..f743d7c497 100644 --- a/src/ifcgeom/AbstractKernel.h +++ b/src/ifcgeom/AbstractKernel.h @@ -102,6 +102,26 @@ namespace { } }; + template + struct dispatch_with_upgrade { + static bool dispatch(ifcopenshell::geometry::kernels::AbstractKernel* kernel, const ifcopenshell::geometry::taxonomy::ptr item, IfcGeom::ConversionResults& results) { + auto concrete_item = ifcopenshell::geometry::taxonomy::template dcast>(item); + if (concrete_item) { + return kernel->convert_impl(concrete_item, results); + } else { + return dispatch_with_upgrade::dispatch(kernel, item, results); + } + } + }; + + template <> + struct dispatch_with_upgrade { + static bool dispatch(ifcopenshell::geometry::kernels::AbstractKernel*, const ifcopenshell::geometry::taxonomy::ptr item, IfcGeom::ConversionResults&) { + Logger::Error("No conversion with upgrade for " + std::to_string(item->kind())); + return false; + } + }; + template struct TupleTypeIndex;