From 661c8bc50f0a7226531a954e896bbe2cd971690c Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sat, 14 Oct 2023 16:37:50 +0200 Subject: [PATCH] Small changes to curve segment handling for purpose of wrapper --- src/ifcgeom/AbstractKernel.cpp | 6 ++++++ src/ifcgeom/AbstractKernel.h | 2 +- src/ifcgeom/Converter.cpp | 15 +++++++++++++++ src/ifcgeom/Converter.h | 12 +----------- .../kernels/opencascade/OpenCascadeKernel.h | 1 + src/ifcgeom/kernels/opencascade/loop.cpp | 16 +++++++++++++++- src/ifcgeom/mapping/IfcCompositeCurve.cpp | 2 ++ src/ifcgeom/mapping/IfcCurveSegment.cpp | 1 + src/ifcgeom/mapping/IfcGradientCurve.cpp | 1 + 9 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/ifcgeom/AbstractKernel.cpp b/src/ifcgeom/AbstractKernel.cpp index 1c7cf4075b..5041381cc4 100644 --- a/src/ifcgeom/AbstractKernel.cpp +++ b/src/ifcgeom/AbstractKernel.cpp @@ -75,3 +75,9 @@ bool ifcopenshell::geometry::kernels::AbstractKernel::convert_impl(const taxonom } return r.size() > s; } + +bool ifcopenshell::geometry::kernels::AbstractKernel::convert_impl(const taxonomy::piecewise_function::ptr item, IfcGeom::ConversionResults& cs) { + auto expl = item->evaluate(); + expl->instance = item->instance; + return convert(expl, cs); +} diff --git a/src/ifcgeom/AbstractKernel.h b/src/ifcgeom/AbstractKernel.h index a2c99ef441..80c4936a0c 100644 --- a/src/ifcgeom/AbstractKernel.h +++ b/src/ifcgeom/AbstractKernel.h @@ -54,7 +54,7 @@ namespace ifcopenshell { namespace geometry { namespace kernels { virtual bool convert_impl(const taxonomy::surface_curve_sweep::ptr, IfcGeom::ConversionResults&) { throw std::runtime_error("Not implemented"); } virtual bool convert_impl(const taxonomy::loft::ptr, IfcGeom::ConversionResults&) { throw std::runtime_error("Not implemented"); } virtual bool convert_impl(const taxonomy::collection::ptr, IfcGeom::ConversionResults&); - virtual bool convert_impl(const taxonomy::piecewise_function::ptr item, IfcGeom::ConversionResults& cs) { return convert(item->evaluate(), cs); } + virtual bool convert_impl(const taxonomy::piecewise_function::ptr item, IfcGeom::ConversionResults& cs); /* virtual void set_offset(const std::array &p_offset); diff --git a/src/ifcgeom/Converter.cpp b/src/ifcgeom/Converter.cpp index 1d3590234d..ab856d1301 100644 --- a/src/ifcgeom/Converter.cpp +++ b/src/ifcgeom/Converter.cpp @@ -356,6 +356,21 @@ IfcGeom::BRepElement* ifcopenshell::geometry::Converter::create_brep_for_represe ); } +IfcGeom::ConversionResults ifcopenshell::geometry::Converter::convert(IfcUtil::IfcBaseClass * item) +{ + std::clock_t map_start = std::clock(); + auto geom_item = mapping_->map(item); + IfcGeom::ConversionResults results; + if (geom_item) { + std::clock_t geom_start = std::clock(); + kernel_->convert(geom_item, results); + std::clock_t geom_end = std::clock(); + total_map_time += (geom_start - map_start) / (double) CLOCKS_PER_SEC; + total_geom_time += (geom_end - geom_start) / (double) CLOCKS_PER_SEC; + } + return results; +} + //#include "../../ifcparse/Ifc2x3.h" //#include "../../ifcparse/Ifc4.h" // diff --git a/src/ifcgeom/Converter.h b/src/ifcgeom/Converter.h index 9870f9f6af..554876a7a4 100644 --- a/src/ifcgeom/Converter.h +++ b/src/ifcgeom/Converter.h @@ -44,17 +44,7 @@ namespace ifcopenshell { namespace geometry { double total_map_time = 0.; double total_geom_time = 0.; - IfcGeom::ConversionResults convert(IfcUtil::IfcBaseClass* item) { - std::clock_t map_start = std::clock(); - auto geom_item = mapping_->map(item); - std::clock_t geom_start = std::clock(); - IfcGeom::ConversionResults results; - kernel_->convert(geom_item, results); - std::clock_t geom_end = std::clock(); - total_map_time += (geom_start - map_start) / (double) CLOCKS_PER_SEC; - total_geom_time += (geom_end - geom_start) / (double) CLOCKS_PER_SEC; - return results; - } + IfcGeom::ConversionResults convert(IfcUtil::IfcBaseClass* item); IfcGeom::BRepElement* create_brep_for_representation_and_product(const IfcUtil::IfcBaseEntity* representation, const IfcUtil::IfcBaseEntity* product); // IfcGeom::BRepElement* create_brep_for_processed_representation(const IfcUtil::IfcBaseEntity* representation, const IfcUtil::IfcBaseEntity* product, IfcGeom::BRepElement* brep); diff --git a/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.h b/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.h index 693ddbc991..424771f697 100644 --- a/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.h +++ b/src/ifcgeom/kernels/opencascade/OpenCascadeKernel.h @@ -138,6 +138,7 @@ public: bool convert(const taxonomy::solid::ptr, TopoDS_Shape&); bool convert(const taxonomy::bspline_surface::ptr bs, Handle(Geom_Surface) surf); + virtual bool convert_impl(const taxonomy::loop::ptr, IfcGeom::ConversionResults&); virtual bool convert_impl(const taxonomy::face::ptr, IfcGeom::ConversionResults&); virtual bool convert_impl(const taxonomy::solid::ptr, IfcGeom::ConversionResults&); virtual bool convert_impl(const taxonomy::shell::ptr, IfcGeom::ConversionResults&); diff --git a/src/ifcgeom/kernels/opencascade/loop.cpp b/src/ifcgeom/kernels/opencascade/loop.cpp index cdade4e16e..47a4dec273 100644 --- a/src/ifcgeom/kernels/opencascade/loop.cpp +++ b/src/ifcgeom/kernels/opencascade/loop.cpp @@ -240,4 +240,18 @@ bool OpenCascadeKernel::convert(const taxonomy::loop::ptr loop, TopoDS_Wire& wir wire = bld.wire(); return true; -} \ No newline at end of file +} + +bool OpenCascadeKernel::convert_impl(const taxonomy::loop::ptr loop, IfcGeom::ConversionResults& results) { + TopoDS_Wire shape; + if (!convert(loop, shape)) { + return false; + } + + results.emplace_back(ConversionResult( + loop->instance->data().id(), + new OpenCascadeShape(shape), + loop->surface_style + )); + return true; +} diff --git a/src/ifcgeom/mapping/IfcCompositeCurve.cpp b/src/ifcgeom/mapping/IfcCompositeCurve.cpp index 008f6375ef..6b814e5181 100644 --- a/src/ifcgeom/mapping/IfcCompositeCurve.cpp +++ b/src/ifcgeom/mapping/IfcCompositeCurve.cpp @@ -88,9 +88,11 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcCompositeCurve* inst) { aggregate_of_instance::ptr profile = inst->data().getInverse(&IfcSchema::IfcProfileDef::Class(), -1); const bool force_close = profile && profile->size() > 0; loop->closed = force_close; + loop->instance = inst; return loop; } else { + pwf->instance = inst; return pwf; } } diff --git a/src/ifcgeom/mapping/IfcCurveSegment.cpp b/src/ifcgeom/mapping/IfcCurveSegment.cpp index b2198fdb55..6c8ea34a60 100644 --- a/src/ifcgeom/mapping/IfcCurveSegment.cpp +++ b/src/ifcgeom/mapping/IfcCurveSegment.cpp @@ -455,6 +455,7 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcCurveSegment* inst) { // @todo it might be suboptimal that we no longer have the spans now auto pwf = taxonomy::make(); pwf->spans.push_back({ length, fn_transformed }); + pwf->instance = inst; return pwf; /* diff --git a/src/ifcgeom/mapping/IfcGradientCurve.cpp b/src/ifcgeom/mapping/IfcGradientCurve.cpp index 6794c1731d..67596b291c 100644 --- a/src/ifcgeom/mapping/IfcGradientCurve.cpp +++ b/src/ifcgeom/mapping/IfcGradientCurve.cpp @@ -70,6 +70,7 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcGradientCurve* inst) { auto pwf = taxonomy::make(); pwf->spans.emplace_back( min_length, composition ); + pwf->instance = inst; return pwf; }