cgal kernel: permissiveness for multiple outer bounds in face

This commit is contained in:
Thomas Krijnen
2023-09-14 21:57:49 +02:00
parent 179e3049dd
commit 380cf4eca5
2 changed files with 18 additions and 15 deletions
+17 -14
View File
@@ -189,10 +189,8 @@ bool CgalKernel::convert(const taxonomy::shell::ptr l, cgal_shape_t& shape) {
std::list<cgal_face_t> face_list; std::list<cgal_face_t> face_list;
for (auto& f : l->children) { for (auto& f : l->children) {
bool success = false; bool success = false;
cgal_face_t face;
try { try {
success = convert(f, face); success = convert(f, face_list);
} catch (...) {} } catch (...) {}
if (!success) { if (!success) {
@@ -204,22 +202,20 @@ bool CgalKernel::convert(const taxonomy::shell::ptr l, cgal_shape_t& shape) {
// for (auto &point: face.outer) { // for (auto &point: face.outer) {
// std::cout << "\tPoint(" << point << ")" << std::endl; // std::cout << "\tPoint(" << point << ")" << std::endl;
// } // }
face_list.push_back(face);
} }
shape = utils::create_polyhedron(face_list); shape = utils::create_polyhedron(face_list);
return shape.size_of_facets(); return shape.size_of_facets();
} }
bool CgalKernel::convert(const taxonomy::face::ptr face, cgal_face_t& result) { bool CgalKernel::convert(const taxonomy::face::ptr face, std::list<cgal_face_t>& result) {
int num_outer_bounds = 0; int num_outer_bounds = 0;
for (auto& bound : face->children) { for (auto& bound : face->children) {
if (bound->external.get_value_or(false)) num_outer_bounds++; if (bound->external.get_value_or(false)) num_outer_bounds++;
} }
if (num_outer_bounds != 1) { if (num_outer_bounds != 1 && num_outer_bounds != face->children.size()) {
Logger::Message(Logger::LOG_ERROR, "Invalid configuration of boundaries for:", face->instance); Logger::Message(Logger::LOG_ERROR, "Invalid configuration of boundaries for:", face->instance);
return false; return false;
} }
@@ -241,9 +237,16 @@ bool CgalKernel::convert(const taxonomy::face::ptr face, cgal_face_t& result) {
} else { } else {
mf.inner.push_back(wire); mf.inner.push_back(wire);
} }
if (num_outer_bounds > 1) {
result.push_back(mf);
mf = cgal_face_t{};
}
} }
result = mf; if (num_outer_bounds == 1) {
result.push_back(mf);
}
// std::cout << "Face: " << std::endl; // std::cout << "Face: " << std::endl;
// for (auto &point: face.outer) { // for (auto &point: face.outer) {
@@ -1114,12 +1117,12 @@ bool CgalKernel::convert(const taxonomy::extrusion::ptr extrusion, cgal_shape_t
return false; return false;
} }
cgal_face_t bottom_face; std::list<cgal_face_t> bottom_face;
if (!convert(extrusion->basis, bottom_face)) { if (!convert(extrusion->basis, bottom_face) || bottom_face.size() != 1) {
return false; return false;
} }
return process_extrusion(bottom_face, extrusion->direction, extrusion->depth, shape); return process_extrusion(bottom_face.front(), extrusion->direction, extrusion->depth, shape);
} }
CGAL::Polyhedron_3<Kernel_> ifcopenshell::geometry::utils::create_cube(double d) { CGAL::Polyhedron_3<Kernel_> ifcopenshell::geometry::utils::create_cube(double d) {
@@ -1844,14 +1847,14 @@ bool CgalKernel::convert_impl(const taxonomy::boolean_result::ptr br, Conversion
} }
if (!face->children.empty()) { if (!face->children.empty()) {
cgal_face_t f; std::list<cgal_face_t> fs;
if (!convert(face, f)) { if (!convert(face, fs) || fs.size() != 1) {
return false; return false;
} }
// static // static
auto z = taxonomy::make<taxonomy::direction3>(0, 0, 1); auto z = taxonomy::make<taxonomy::direction3>(0, 0, 1);
cgal_shape_t poly; cgal_shape_t poly;
process_extrusion(f, z, 200, poly); process_extrusion(fs.front(), z, 200, poly);
for (auto& v : vertices(poly)) { for (auto& v : vertices(poly)) {
v->point() = Kernel_::Point_3( v->point() = Kernel_::Point_3(
v->point().cartesian(0), v->point().cartesian(0),
+1 -1
View File
@@ -100,7 +100,7 @@ namespace ifcopenshell {
void remove_duplicate_points_from_loop(cgal_wire_t& polygon); void remove_duplicate_points_from_loop(cgal_wire_t& polygon);
bool convert(const taxonomy::extrusion::ptr, cgal_shape_t&); bool convert(const taxonomy::extrusion::ptr, cgal_shape_t&);
bool convert(const taxonomy::face::ptr, cgal_face_t&); bool convert(const taxonomy::face::ptr, std::list<cgal_face_t>&);
bool convert(const taxonomy::loop::ptr, cgal_wire_t&); bool convert(const taxonomy::loop::ptr, cgal_wire_t&);
// bool convert(const taxonomy::matrix4::ptr, cgal_placement_t&); // bool convert(const taxonomy::matrix4::ptr, cgal_placement_t&);
bool convert(const taxonomy::shell::ptr, cgal_shape_t&); bool convert(const taxonomy::shell::ptr, cgal_shape_t&);