diff --git a/src/ifcgeom/kernels/cgal/CgalEntityMapping.cpp b/src/ifcgeom/kernels/cgal/CgalEntityMapping.cpp index 73232096a5..4509a8de7e 100644 --- a/src/ifcgeom/kernels/cgal/CgalEntityMapping.cpp +++ b/src/ifcgeom/kernels/cgal/CgalEntityMapping.cpp @@ -115,7 +115,7 @@ bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcManifoldSolidBrep* l, Conv bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcConnectedFaceSet* l, cgal_shape_t& shape) { IfcSchema::IfcFace::list::ptr faces = l->CfsFaces(); -// TopTools_ListOfShape face_list; + std::list face_list; for (IfcSchema::IfcFace::list::it it = faces->begin(); it != faces->end(); ++it) { bool success = false; cgal_face_t face; @@ -128,30 +128,29 @@ bool IfcGeom::CgalKernel::convert(const IfcSchema::IfcConnectedFaceSet* l, cgal_ Logger::Message(Logger::LOG_WARNING, "Failed to convert face:", (*it)->entity); continue; } - -// if (face_area(face) > getValue(GV_MINIMAL_FACE_AREA)) { -// face_list.Append(face); -// } else { -// Logger::Message(Logger::LOG_WARNING, "Invalid face:", (*it)->entity); -// } + + face_list.push_back(face); } -// -// if (face_list.Extent() == 0) { -// return false; -// } -// -// if (face_list.Extent() > getValue(GV_MAX_FACES_TO_SEW) || !create_solid_from_faces(face_list, shape)) { -// TopoDS_Compound compound; -// BRep_Builder builder; -// builder.MakeCompound(compound); -// -// TopTools_ListIteratorOfListOfShape face_iterator; -// for (face_iterator.Initialize(face_list); face_iterator.More(); face_iterator.Next()) { -// builder.Add(compound, face_iterator.Value()); -// } -// shape = compound; -// } + for (auto const &face : face_list) { + std::cout << "Face" << std::endl; + std::cout << "\touter: "; + for (auto const &point: *face->outer) { + std::cout << "(" << point << ") "; + } std::cout << std::endl; + for (auto const &inner: face->inner) { + std::cout << "\tinner: "; + for (auto const &point: *inner) { + std::cout << "(" << point << ") "; + } std::cout << std::endl; + } + } + + cgal_shape_t polyhedron = new CGAL::Polyhedron_3(); + PolyhedronBuilder builder(&face_list); + polyhedron->delegate(builder); + + shape = polyhedron; return true; } diff --git a/src/ifcgeom/kernels/cgal/CgalKernel.h b/src/ifcgeom/kernels/cgal/CgalKernel.h index dc3cdbd9b7..b32435793d 100644 --- a/src/ifcgeom/kernels/cgal/CgalKernel.h +++ b/src/ifcgeom/kernels/cgal/CgalKernel.h @@ -57,6 +57,53 @@ struct CgalFace { typedef CgalFace *cgal_face_t; typedef CGAL::Polyhedron_3 *cgal_shape_t; +struct PolyhedronBuilder : public CGAL::Modifier_base::HalfedgeDS> { +private: + std::list *face_list; +public: + PolyhedronBuilder(std::list *face_list) { + this->face_list = face_list; + } + + void operator()(CGAL::Polyhedron_3::HalfedgeDS &hds) { + std::map points_map; + std::list> facet_vertices; + CGAL::Polyhedron_incremental_builder_3::HalfedgeDS> builder(hds, true); + + for (auto const &face: *face_list) { + facet_vertices.push_back(std::list()); + for (auto const &point: *face->outer) { + if (points_map.count(point) == 0) { + facet_vertices.back().push_back(points_map.size()); + points_map[point] = points_map.size(); + } else { + facet_vertices.back().push_back(points_map[point]); + } + } + } + + builder.begin_surface(points_map.size(), facet_vertices.size()); + + for (auto const &point: points_map) { + std::cout << "Adding point " << point.first << std::endl; + builder.add_vertex(point.first); + } + + for (auto const &facet: facet_vertices) { + builder.begin_facet(); + std::cout << "Adding facet "; + for (auto const &vertex: facet) { + std::cout << vertex << " "; + builder.add_vertex_to_facet(vertex); + } + std::cout << std::endl; + builder.end_facet(); + } + + builder.end_surface(); + } +}; + namespace IfcGeom { class IFC_GEOM_API CgalCache {