From f8a2cce2022634a512475c92eb51e316ff556111 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sun, 1 Sep 2024 15:14:22 +0200 Subject: [PATCH] Use polygon_from_points() and handle Position for CSG Pyramid #5241 --- src/ifcgeom/mapping/IfcRectangularPyramid.cpp | 59 +++++++------------ 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/src/ifcgeom/mapping/IfcRectangularPyramid.cpp b/src/ifcgeom/mapping/IfcRectangularPyramid.cpp index 70ff3e9a9d..ab22069991 100644 --- a/src/ifcgeom/mapping/IfcRectangularPyramid.cpp +++ b/src/ifcgeom/mapping/IfcRectangularPyramid.cpp @@ -21,6 +21,8 @@ #define mapping POSTFIX_SCHEMA(mapping) using namespace ifcopenshell::geometry; +#include "../profile_helper.h" + taxonomy::ptr mapping::map_impl(const IfcSchema::IfcRectangularPyramid* inst) { const double dx = inst->XLength() * length_unit_; const double dy = inst->YLength() * length_unit_; @@ -33,96 +35,77 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcRectangularPyramid* inst) { // Base { auto face = taxonomy::make(); - auto loop = taxonomy::make(); - face->children.push_back(loop); - loop->external = true; shell->children.push_back(face); - std::array points{ + std::vector points{ taxonomy::make(0, 0, 0), - taxonomy::make(dx, 0, 0), + taxonomy::make(0, dy, 0), taxonomy::make(dx, dy, 0), - taxonomy::make(0, dy, 0) + taxonomy::make(dx, 0, 0), }; - loop->children.push_back(taxonomy::make(points[0], points[1])); - loop->children.push_back(taxonomy::make(points[1], points[2])); - loop->children.push_back(taxonomy::make(points[2], points[3])); - loop->children.push_back(taxonomy::make(points[3], points[0])); + points.push_back(points.front()); + face->children.push_back(polygon_from_points(points)); } // Lateral faces { auto face = taxonomy::make(); - auto loop = taxonomy::make(); - face->children.push_back(loop); - loop->external = true; shell->children.push_back(face); - std::array points{ + std::vector points{ taxonomy::make(0, 0, 0), taxonomy::make(0, dy, 0), taxonomy::make(0.5*dx, 0.5*dy, dz) }; - loop->children.push_back(taxonomy::make(points[0], points[1])); - loop->children.push_back(taxonomy::make(points[1], points[2])); - loop->children.push_back(taxonomy::make(points[2], points[0])); + points.push_back(points.front()); + face->children.push_back(polygon_from_points(points)); } { auto face = taxonomy::make(); - auto loop = taxonomy::make(); - face->children.push_back(loop); - loop->external = true; shell->children.push_back(face); - std::array points{ + std::vector points{ taxonomy::make(0, dy, 0), taxonomy::make(dx, dy, 0), taxonomy::make(0.5*dx, 0.5*dy, dz) }; - loop->children.push_back(taxonomy::make(points[0], points[1])); - loop->children.push_back(taxonomy::make(points[1], points[2])); - loop->children.push_back(taxonomy::make(points[2], points[0])); + points.push_back(points.front()); + face->children.push_back(polygon_from_points(points)); } { auto face = taxonomy::make(); - auto loop = taxonomy::make(); - face->children.push_back(loop); - loop->external = true; shell->children.push_back(face); - std::array points{ + std::vector points{ taxonomy::make(dx, dy, 0), taxonomy::make(dx, 0, 0), taxonomy::make(0.5*dx, 0.5*dy, dz) }; - loop->children.push_back(taxonomy::make(points[0], points[1])); - loop->children.push_back(taxonomy::make(points[1], points[2])); - loop->children.push_back(taxonomy::make(points[2], points[0])); + points.push_back(points.front()); + face->children.push_back(polygon_from_points(points)); } { auto face = taxonomy::make(); - auto loop = taxonomy::make(); - face->children.push_back(loop); - loop->external = true; shell->children.push_back(face); - std::array points{ + std::vector points{ taxonomy::make(dx, 0, 0), taxonomy::make(0, 0, 0), taxonomy::make(0.5*dx, 0.5*dy, dz) }; - loop->children.push_back(taxonomy::make(points[0], points[1])); - loop->children.push_back(taxonomy::make(points[1], points[2])); - loop->children.push_back(taxonomy::make(points[2], points[0])); + points.push_back(points.front()); + face->children.push_back(polygon_from_points(points)); } + solid->matrix = taxonomy::cast(map(inst->Position())); + return solid; }