From c9267d7ace8584bca4997ad2bb1db8d38413d6cf Mon Sep 17 00:00:00 2001 From: Ken Arroyo Ohori Date: Thu, 30 Mar 2017 21:11:05 -0600 Subject: [PATCH] Fixed orientation bug in tapered extrusions --- .../kernels/cgal/CgalIfcGeomShapes.cpp | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/ifcgeom/kernels/cgal/CgalIfcGeomShapes.cpp b/src/ifcgeom/kernels/cgal/CgalIfcGeomShapes.cpp index 227d45825c..e3264e78ec 100644 --- a/src/ifcgeom/kernels/cgal/CgalIfcGeomShapes.cpp +++ b/src/ifcgeom/kernels/cgal/CgalIfcGeomShapes.cpp @@ -136,7 +136,6 @@ bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcExtrudedAreaSolidTapered* // Outer std::list face_list; face_list.push_back(face1); - face_list.push_back(face2); std::vector::const_iterator current_face1_vertex = face1.outer.begin(); std::vector::const_iterator current_face2_vertex = face2.outer.begin(); @@ -158,12 +157,27 @@ bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcExtrudedAreaSolidTapered* ++current_face2_vertex; } + cgal_face_t top_face; + for (std::vector::const_reverse_iterator vertex = face2.outer.rbegin(); + vertex != face2.outer.rend(); + ++vertex) { + top_face.outer.push_back(*vertex); + } face_list.push_back(top_face); + if (face1.inner.empty() || face2.inner.empty()) { shape = create_polyhedron(face_list); if (has_position) for (auto &vertex: vertices(shape)) vertex->point() = vertex->point().transform(trsf); return true; } +// std::ofstream f1; +// CGAL::Polyhedron_3 outer_polyhedron; +// PolyhedronBuilder builder(&face_list); +// outer_polyhedron.delegate(builder); +// f1.open("/Users/ken/Desktop/outer.off"); +// f1 << outer_polyhedron << std::endl; +// f1.close(); + CGAL::Nef_polyhedron_3 nef_shape = create_nef_polyhedron(face_list); // Inner @@ -182,7 +196,6 @@ bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcExtrudedAreaSolidTapered* cgal_face_t hole_face2; hole_face2.outer = *inner_face2; remove_duplicate_points_from_loop(hole_face2.outer); - face_list.push_back(hole_face2); current_face1_vertex = hole_face1.outer.begin(); current_face2_vertex = hole_face2.outer.begin(); @@ -204,6 +217,21 @@ bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcExtrudedAreaSolidTapered* ++current_face2_vertex; } + cgal_face_t top_hole_face; + for (std::vector::const_reverse_iterator vertex = hole_face2.outer.rbegin(); + vertex != hole_face2.outer.rend(); + ++vertex) { + top_hole_face.outer.push_back(*vertex); + } face_list.push_back(top_hole_face); + +// std::ofstream f2; +// CGAL::Polyhedron_3 inner_polyhedron; +// PolyhedronBuilder builder(&face_list); +// inner_polyhedron.delegate(builder); +// f2.open("/Users/ken/Desktop/inner.off"); +// f2 << inner_polyhedron << std::endl; +// f2.close(); + nef_shape -= create_nef_polyhedron(face_list); ++inner_face1;