mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 22:50:21 +00:00
Use snake case conversion result APIs
Generated with the assistance of an AI coding tool.
This commit is contained in:
@@ -889,7 +889,7 @@ class context:
|
|||||||
def write_obj(ofn, *, elem=None, item=None):
|
def write_obj(ofn, *, elem=None, item=None):
|
||||||
s = ifcopenshell.geom.settings(USE_WORLD_COORDS=True, WELD_VERTICES=False)
|
s = ifcopenshell.geom.settings(USE_WORLD_COORDS=True, WELD_VERTICES=False)
|
||||||
if item:
|
if item:
|
||||||
geom = item.Triangulate(s)
|
geom = item.triangulate(s)
|
||||||
else:
|
else:
|
||||||
geom = elem.geometry
|
geom = elem.geometry
|
||||||
|
|
||||||
|
|||||||
@@ -1466,7 +1466,7 @@ void fix_quantities(ifcopenshell::file& f, bool no_progress, bool quiet, bool st
|
|||||||
auto quantity_count = latebound_access::create(f, "IfcQuantityCount");
|
auto quantity_count = latebound_access::create(f, "IfcQuantityCount");
|
||||||
latebound_access::set(quantity_count, "Name", std::string("Surface Genus"));
|
latebound_access::set(quantity_count, "Name", std::string("Surface Genus"));
|
||||||
latebound_access::set(quantity_count, "Description", '#' + boost::lexical_cast<std::string>(part.ItemId()));
|
latebound_access::set(quantity_count, "Description", '#' + boost::lexical_cast<std::string>(part.ItemId()));
|
||||||
latebound_access::set(quantity_count, "CountValue", (int64_t) part.Shape()->surface_genus());
|
latebound_access::set(quantity_count, "CountValue", (int64_t) part.shape()->surface_genus());
|
||||||
|
|
||||||
quantities_2.push_back(quantity_count);
|
quantities_2.push_back(quantity_count);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,8 +134,8 @@ void fix_storeycontainment(ifcopenshell::file& f, bool no_progress, bool quiet,
|
|||||||
std::vector<double> intersection_volumes(nefs.size());
|
std::vector<double> intersection_volumes(nefs.size());
|
||||||
|
|
||||||
for (auto& g : geom_object->geometry()) {
|
for (auto& g : geom_object->geometry()) {
|
||||||
auto s = std::static_pointer_cast<ifcopenshell::geom::cgal_shape>(g.Shape())->poly();
|
auto s = std::static_pointer_cast<ifcopenshell::geom::cgal_shape>(g.shape())->poly();
|
||||||
const auto& m = g.Placement()->ccomponents();
|
const auto& m = g.placement()->ccomponents();
|
||||||
const auto& n = geom_object->transformation().data()->ccomponents();
|
const auto& n = geom_object->transformation().data()->ccomponents();
|
||||||
|
|
||||||
const cgal_placement trsf(
|
const cgal_placement trsf(
|
||||||
|
|||||||
@@ -491,8 +491,8 @@ struct intersection_validator {
|
|||||||
std::wcout << sss.c_str() << std::endl;
|
std::wcout << sss.c_str() << std::endl;
|
||||||
|
|
||||||
for (auto& g : geom_object->geometry()) {
|
for (auto& g : geom_object->geometry()) {
|
||||||
cgal_polyhedron s = *std::static_pointer_cast<ifcopenshell::geom::cgal_shape>(g.Shape());
|
cgal_polyhedron s = *std::static_pointer_cast<ifcopenshell::geom::cgal_shape>(g.shape());
|
||||||
const auto& m = g.Placement()->ccomponents();
|
const auto& m = g.placement()->ccomponents();
|
||||||
const auto& n = geom_object->transformation().data()->ccomponents();
|
const auto& n = geom_object->transformation().data()->ccomponents();
|
||||||
|
|
||||||
const cgal_placement trsf(
|
const cgal_placement trsf(
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
#include "conversion_result.h"
|
#include "conversion_result.h"
|
||||||
#include "representation.h"
|
#include "representation.h"
|
||||||
|
|
||||||
ifcopenshell::geom::triangulation* ifcopenshell::geom::conversion_result_shape::Triangulate(const ifcopenshell::geom::settings& settings, ifcopenshell::logger& logger) const
|
ifcopenshell::geom::triangulation* ifcopenshell::geom::conversion_result_shape::triangulate(const ifcopenshell::geom::settings& settings, ifcopenshell::logger& logger) const
|
||||||
{
|
{
|
||||||
auto t = ifcopenshell::geom::triangulation::empty(settings);
|
auto t = ifcopenshell::geom::triangulation::empty(settings);
|
||||||
static ifcopenshell::geom::taxonomy::matrix4 iden;
|
static ifcopenshell::geom::taxonomy::matrix4 iden;
|
||||||
Triangulate(settings, iden, t, -1, -1, logger);
|
triangulate(settings, iden, t, -1, -1, logger);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -507,9 +507,9 @@ namespace ifcopenshell::geom {
|
|||||||
#else
|
#else
|
||||||
virtual std::string_view backend_id() const = 0;
|
virtual std::string_view backend_id() const = 0;
|
||||||
#endif
|
#endif
|
||||||
virtual void Triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const = 0;
|
virtual void triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const = 0;
|
||||||
ifcopenshell::geom::triangulation* Triangulate(const ifcopenshell::geom::settings& settings, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
ifcopenshell::geom::triangulation* triangulate(const ifcopenshell::geom::settings& settings, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
||||||
virtual void Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const = 0;
|
virtual void serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const = 0;
|
||||||
|
|
||||||
virtual int surface_genus() const = 0;
|
virtual int surface_genus() const = 0;
|
||||||
virtual bool is_manifold() const = 0;
|
virtual bool is_manifold() const = 0;
|
||||||
@@ -578,11 +578,11 @@ namespace ifcopenshell::geom {
|
|||||||
{}
|
{}
|
||||||
void append(ifcopenshell::geom::taxonomy::matrix4::ptr trsf);
|
void append(ifcopenshell::geom::taxonomy::matrix4::ptr trsf);
|
||||||
void prepend(ifcopenshell::geom::taxonomy::matrix4::ptr trsf);
|
void prepend(ifcopenshell::geom::taxonomy::matrix4::ptr trsf);
|
||||||
std::shared_ptr<conversion_result_shape> Shape() const { return shape_; }
|
std::shared_ptr<conversion_result_shape> shape() const { return shape_; }
|
||||||
ifcopenshell::geom::taxonomy::matrix4::ptr Placement() const { return placement_; }
|
ifcopenshell::geom::taxonomy::matrix4::ptr placement() const { return placement_; }
|
||||||
bool hasStyle() const { return !!style_; }
|
bool hasStyle() const { return !!style_; }
|
||||||
const ifcopenshell::geom::taxonomy::style& Style() const { return *style_; }
|
const ifcopenshell::geom::taxonomy::style& style() const { return *style_; }
|
||||||
ifcopenshell::geom::taxonomy::style::ptr StylePtr() const { return style_; }
|
ifcopenshell::geom::taxonomy::style::ptr style_ptr() const { return style_; }
|
||||||
void setStyle(ifcopenshell::geom::taxonomy::style::ptr newStyle) { style_ = newStyle; }
|
void setStyle(ifcopenshell::geom::taxonomy::style::ptr newStyle) { style_ = newStyle; }
|
||||||
int ItemId() const { return id; }
|
int ItemId() const { return id; }
|
||||||
conversion_result_shape* apply_transform(double unit_scale = 1.) const {
|
conversion_result_shape* apply_transform(double unit_scale = 1.) const {
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ namespace {
|
|||||||
void* box = nullptr;
|
void* box = nullptr;
|
||||||
double volume = 0.;
|
double volume = 0.;
|
||||||
for (auto& i : items) {
|
for (auto& i : items) {
|
||||||
nv += i.Shape()->num_vertices();
|
nv += i.shape()->num_vertices();
|
||||||
volume = i.Shape()->bounding_box(box);
|
volume = i.shape()->bounding_box(box);
|
||||||
}
|
}
|
||||||
density = nv / volume;
|
density = nv / volume;
|
||||||
if (density > 1e5) {
|
if (density > 1e5) {
|
||||||
items[0].Shape()->set_box(box);
|
items[0].shape()->set_box(box);
|
||||||
items.erase(items.begin() + 1, items.end());
|
items.erase(items.begin() + 1, items.end());
|
||||||
logger.notice("GEO", 30, "Substituted element with " + boost::lexical_cast<std::string>(density) + " vertices / m3 with a bounding box");
|
logger.notice("GEO", 30, "Substituted element with " + boost::lexical_cast<std::string>(density) + " vertices / m3 with a bounding box");
|
||||||
}
|
}
|
||||||
@@ -135,7 +135,7 @@ ifcopenshell::geom::brep_element* ifcopenshell::geom::converter::create_brep_for
|
|||||||
bool some_items_without_style = false;
|
bool some_items_without_style = false;
|
||||||
for (auto it = shapes.begin(); it != shapes.end(); ++it) {
|
for (auto it = shapes.begin(); it != shapes.end(); ++it) {
|
||||||
// @todo implement num_faces()
|
// @todo implement num_faces()
|
||||||
if (!it->hasStyle() /* && it->Shape()->num_faces() */) {
|
if (!it->hasStyle() /* && it->shape()->num_faces() */) {
|
||||||
some_items_without_style = true;
|
some_items_without_style = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -153,7 +153,7 @@ ifcopenshell::geom::brep_element* ifcopenshell::geom::converter::create_brep_for
|
|||||||
for (auto& s : shapes) {
|
for (auto& s : shapes) {
|
||||||
if (s.hasStyle()) {
|
if (s.hasStyle()) {
|
||||||
// @todo the uglyness
|
// @todo the uglyness
|
||||||
const_cast<taxonomy::style*>(&*s.StylePtr())->transparency = settings_.get<ifcopenshell::geom::settings::ForceSpaceTransparency>().get();
|
const_cast<taxonomy::style*>(&*s.style_ptr())->transparency = settings_.get<ifcopenshell::geom::settings::ForceSpaceTransparency>().get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -335,7 +335,7 @@ ifcopenshell::geom::brep_element* ifcopenshell::geom::converter::create_brep_for
|
|||||||
int genus = (int)q2->as<IfcSchema::IfcQuantityCount>()->CountValue();
|
int genus = (int)q2->as<IfcSchema::IfcQuantityCount>()->CountValue();
|
||||||
for (auto& part : elem->geometry()) {
|
for (auto& part : elem->geometry()) {
|
||||||
if (part.ItemId() == item_id) {
|
if (part.ItemId() == item_id) {
|
||||||
if (util::surface_genus(part.Shape()) != genus) {
|
if (util::surface_genus(part.shape()) != genus) {
|
||||||
all_succeeded = false;
|
all_succeeded = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ namespace ifcopenshell {
|
|||||||
for (auto& k : kernels_) {
|
for (auto& k : kernels_) {
|
||||||
bool is_valid = true;
|
bool is_valid = true;
|
||||||
for (auto& s : entity_shapes) {
|
for (auto& s : entity_shapes) {
|
||||||
if (!k->accepts(*s.Shape())) {
|
if (!k->accepts(*s.shape())) {
|
||||||
is_valid = false;
|
is_valid = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -364,7 +364,7 @@ void ifcopenshell::geom::cgal_shape::to_nef() const {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ifcopenshell::geom::cgal_shape::Triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger) const {
|
void ifcopenshell::geom::cgal_shape::triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger) const {
|
||||||
if (is_point() || is_wire()) {
|
if (is_point() || is_wire()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -458,7 +458,7 @@ void ifcopenshell::geom::cgal_shape::Triangulate(ifcopenshell::geom::settings se
|
|||||||
// std::map<cgal_vertex_descriptor, kernel_::Vector_3> vertex_normals;
|
// std::map<cgal_vertex_descriptor, kernel_::Vector_3> vertex_normals;
|
||||||
// boost::associative_property_map<std::map<cgal_vertex_descriptor, kernel_::Vector_3>> vertex_normals_map(vertex_normals);
|
// boost::associative_property_map<std::map<cgal_vertex_descriptor, kernel_::Vector_3>> vertex_normals_map(vertex_normals);
|
||||||
|
|
||||||
// Triangulate the shape and compute the normals
|
// triangulate the shape and compute the normals
|
||||||
std::map<facet_const_handle, kernel_::Vector_3> face_normals;
|
std::map<facet_const_handle, kernel_::Vector_3> face_normals;
|
||||||
boost::associative_property_map<std::map<facet_const_handle, kernel_::Vector_3>> face_normals_map(face_normals);
|
boost::associative_property_map<std::map<facet_const_handle, kernel_::Vector_3>> face_normals_map(face_normals);
|
||||||
|
|
||||||
@@ -586,7 +586,7 @@ void ifcopenshell::geom::cgal_shape::Triangulate(ifcopenshell::geom::settings se
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifcopenshell::geom::cgal_shape::Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& r) const {
|
void ifcopenshell::geom::cgal_shape::serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& r) const {
|
||||||
std::stringstream sstream;
|
std::stringstream sstream;
|
||||||
if (is_point()) {
|
if (is_point()) {
|
||||||
auto p = point();
|
auto p = point();
|
||||||
@@ -1035,11 +1035,11 @@ bool ifcopenshell::geom::cgal_shape::surface_area_along_direction(double tol, co
|
|||||||
|
|
||||||
#ifndef IFOPSH_SIMPLE_KERNEL
|
#ifndef IFOPSH_SIMPLE_KERNEL
|
||||||
|
|
||||||
void ifcopenshell::geom::cgal_shape_half_space_decomposition::Triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger) const {
|
void ifcopenshell::geom::cgal_shape_half_space_decomposition::triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger) const {
|
||||||
throw std::runtime_error("Not implemented");
|
throw std::runtime_error("Not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifcopenshell::geom::cgal_shape_half_space_decomposition::Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& r) const {
|
void ifcopenshell::geom::cgal_shape_half_space_decomposition::serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& r) const {
|
||||||
throw std::runtime_error("Not implemented");
|
throw std::runtime_error("Not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -226,8 +226,8 @@ namespace ifcopenshell { namespace geom {
|
|||||||
const cgal_point& point() const { return std::get<cgal_point>(*shape_); }
|
const cgal_point& point() const { return std::get<cgal_point>(*shape_); }
|
||||||
const cgal_wire& wire() const { return std::get<cgal_wire>(*shape_); }
|
const cgal_wire& wire() const { return std::get<cgal_wire>(*shape_); }
|
||||||
|
|
||||||
virtual void Triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
virtual void triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
||||||
virtual void Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
virtual void serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
||||||
|
|
||||||
virtual ifcopenshell::geom::conversion_result_shape* clone() const {
|
virtual ifcopenshell::geom::conversion_result_shape* clone() const {
|
||||||
if (shape_) {
|
if (shape_) {
|
||||||
@@ -319,8 +319,8 @@ namespace ifcopenshell { namespace geom {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
virtual void triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
||||||
virtual void Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
virtual void serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
||||||
|
|
||||||
virtual int surface_genus() const;
|
virtual int surface_genus() const;
|
||||||
virtual bool is_manifold() const;
|
virtual bool is_manifold() const;
|
||||||
|
|||||||
@@ -912,8 +912,8 @@ bool ifcopenshell::geom::kernels::cgal_kernel::convert_openings(const express::b
|
|||||||
std::list<CGAL::Nef_polyhedron_3<kernel_>> first_operands_nef, second_operands_nef;
|
std::list<CGAL::Nef_polyhedron_3<kernel_>> first_operands_nef, second_operands_nef;
|
||||||
|
|
||||||
for (auto& shp : entity_shapes) {
|
for (auto& shp : entity_shapes) {
|
||||||
cgal_polyhedron entity_shape = *std::static_pointer_cast<cgal_shape>(shp.Shape());
|
cgal_polyhedron entity_shape = *std::static_pointer_cast<cgal_shape>(shp.shape());
|
||||||
const auto& m = shp.Placement()->ccomponents();
|
const auto& m = shp.placement()->ccomponents();
|
||||||
if (!m.isIdentity()) {
|
if (!m.isIdentity()) {
|
||||||
cgal_placement trsf;
|
cgal_placement trsf;
|
||||||
convert_placement(m, trsf);
|
convert_placement(m, trsf);
|
||||||
@@ -943,9 +943,9 @@ bool ifcopenshell::geom::kernels::cgal_kernel::convert_openings(const express::b
|
|||||||
abstract_kernel::convert(op.first, opening_shapes);
|
abstract_kernel::convert(op.first, opening_shapes);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < opening_shapes.size(); ++i) {
|
for (unsigned int i = 0; i < opening_shapes.size(); ++i) {
|
||||||
cgal_polyhedron entity_shape_unlocated = *std::static_pointer_cast<cgal_shape>(opening_shapes[i].Shape());
|
cgal_polyhedron entity_shape_unlocated = *std::static_pointer_cast<cgal_shape>(opening_shapes[i].shape());
|
||||||
cgal_polyhedron entity_shape(entity_shape_unlocated);
|
cgal_polyhedron entity_shape(entity_shape_unlocated);
|
||||||
auto gtrsf = opening_shapes[i].Placement();
|
auto gtrsf = opening_shapes[i].placement();
|
||||||
// @todo check
|
// @todo check
|
||||||
Eigen::Matrix4d m = opening_trsf.ccomponents() * gtrsf->ccomponents();
|
Eigen::Matrix4d m = opening_trsf.ccomponents() * gtrsf->ccomponents();
|
||||||
if (!m.isIdentity()) {
|
if (!m.isIdentity()) {
|
||||||
@@ -1008,7 +1008,7 @@ bool ifcopenshell::geom::kernels::cgal_kernel::convert_openings(const express::b
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cut_shapes.push_back(ifcopenshell::geom::conversion_result(it->ItemId(), new cgal_shape(a_poly), it->StylePtr()));
|
cut_shapes.push_back(ifcopenshell::geom::conversion_result(it->ItemId(), new cgal_shape(a_poly), it->style_ptr()));
|
||||||
it++;
|
it++;
|
||||||
nit++;
|
nit++;
|
||||||
}
|
}
|
||||||
@@ -2068,11 +2068,11 @@ bool cgal_kernel::convert_impl(const taxonomy::boolean_result::ptr br, std::vect
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (auto it = cr.begin(); it != cr.end(); ++it) {
|
for (auto it = cr.begin(); it != cr.end(); ++it) {
|
||||||
cgal_polyhedron entity_shape_unlocated = *std::static_pointer_cast<cgal_shape>(it->Shape());
|
cgal_polyhedron entity_shape_unlocated = *std::static_pointer_cast<cgal_shape>(it->shape());
|
||||||
cgal_polyhedron entity_shape(entity_shape_unlocated);
|
cgal_polyhedron entity_shape(entity_shape_unlocated);
|
||||||
if (!it->Placement()->is_identity()) {
|
if (!it->placement()->is_identity()) {
|
||||||
cgal_placement trsf;
|
cgal_placement trsf;
|
||||||
convert_placement(it->Placement(), trsf);
|
convert_placement(it->placement(), trsf);
|
||||||
for (auto &vertex : vertices(entity_shape)) {
|
for (auto &vertex : vertices(entity_shape)) {
|
||||||
vertex->point() = vertex->point().transform(trsf);
|
vertex->point() = vertex->point().transform(trsf);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ std::optional<manifold::Manifold> ifcopenshell::geom::manifold_shape::as_manifol
|
|||||||
return manifold::Manifold::BatchBoolean(solids, manifold::OpType::Add);
|
return manifold::Manifold::BatchBoolean(solids, manifold::OpType::Add);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifcopenshell::geom::manifold_shape::Triangulate(ifcopenshell::geom::settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger&) const {
|
void ifcopenshell::geom::manifold_shape::triangulate(ifcopenshell::geom::settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger&) const {
|
||||||
for (const auto& part : parts_) {
|
for (const auto& part : parts_) {
|
||||||
auto mesh = transform_mesh(part.mesh, place);
|
auto mesh = transform_mesh(part.mesh, place);
|
||||||
std::vector<int> indices(mesh.NumVert());
|
std::vector<int> indices(mesh.NumVert());
|
||||||
@@ -250,7 +250,7 @@ void ifcopenshell::geom::manifold_shape::Triangulate(ifcopenshell::geom::setting
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifcopenshell::geom::manifold_shape::Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& result) const {
|
void ifcopenshell::geom::manifold_shape::serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& result) const {
|
||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
stream << std::setprecision(17);
|
stream << std::setprecision(17);
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ public:
|
|||||||
std::optional<manifold::Manifold> as_manifold() const;
|
std::optional<manifold::Manifold> as_manifold() const;
|
||||||
virtual std::string_view backend_id() const { return "manifold"; }
|
virtual std::string_view backend_id() const { return "manifold"; }
|
||||||
|
|
||||||
virtual void Triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
virtual void triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
||||||
virtual void Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
virtual void serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
||||||
|
|
||||||
virtual int surface_genus() const;
|
virtual int surface_genus() const;
|
||||||
virtual bool is_manifold() const;
|
virtual bool is_manifold() const;
|
||||||
|
|||||||
@@ -1412,7 +1412,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
for (const auto& result : results) {
|
for (const auto& result : results) {
|
||||||
if (result.hasStyle()) {
|
if (result.hasStyle()) {
|
||||||
return result.StylePtr();
|
return result.style_ptr();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@@ -1650,7 +1650,7 @@ bool manifold_kernel::convert_openings(const express::base&, const std::vector<s
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (const auto& result : converted) {
|
for (const auto& result : converted) {
|
||||||
auto moved = std::unique_ptr<ifcopenshell::geom::conversion_result_shape>(result.Shape()->moved(taxonomy::make<taxonomy::matrix4>(relative->ccomponents() * result.Placement()->ccomponents())));
|
auto moved = std::unique_ptr<ifcopenshell::geom::conversion_result_shape>(result.shape()->moved(taxonomy::make<taxonomy::matrix4>(relative->ccomponents() * result.placement()->ccomponents())));
|
||||||
auto* shape = dynamic_cast<ifcopenshell::geom::manifold_shape*>(moved.get());
|
auto* shape = dynamic_cast<ifcopenshell::geom::manifold_shape*>(moved.get());
|
||||||
if (!shape) {
|
if (!shape) {
|
||||||
ifcopenshell::logger::root().warning("Manifold kernel: opening result is not a manifold shape");
|
ifcopenshell::logger::root().warning("Manifold kernel: opening result is not a manifold shape");
|
||||||
@@ -1679,7 +1679,7 @@ bool manifold_kernel::convert_openings(const express::base&, const std::vector<s
|
|||||||
cut_shapes.emplace_back(ifcopenshell::geom::conversion_result(
|
cut_shapes.emplace_back(ifcopenshell::geom::conversion_result(
|
||||||
entity_shape.ItemId(),
|
entity_shape.ItemId(),
|
||||||
new ifcopenshell::geom::manifold_shape(result),
|
new ifcopenshell::geom::manifold_shape(result),
|
||||||
entity_shape.StylePtr()));
|
entity_shape.style_ptr()));
|
||||||
}
|
}
|
||||||
return !cut_shapes.empty();
|
return !cut_shapes.empty();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -812,7 +812,7 @@ bool ifcopenshell::geom::util::flatten_shape_list(const std::vector<ifcopenshell
|
|||||||
|
|
||||||
for (std::vector<ifcopenshell::geom::conversion_result>::const_iterator it = shapes.begin(); it != shapes.end(); ++it) {
|
for (std::vector<ifcopenshell::geom::conversion_result>::const_iterator it = shapes.begin(); it != shapes.end(); ++it) {
|
||||||
TopoDS_Shape merged;
|
TopoDS_Shape merged;
|
||||||
const TopoDS_Shape& s = std::static_pointer_cast<ifcopenshell::geom::open_cascade_shape>(it->Shape())->shape();
|
const TopoDS_Shape& s = std::static_pointer_cast<ifcopenshell::geom::open_cascade_shape>(it->shape())->shape();
|
||||||
if (fuse || create_shell) {
|
if (fuse || create_shell) {
|
||||||
merged = util::ensure_fit_for_subtraction(s, tol);
|
merged = util::ensure_fit_for_subtraction(s, tol);
|
||||||
} else {
|
} else {
|
||||||
@@ -820,7 +820,7 @@ bool ifcopenshell::geom::util::flatten_shape_list(const std::vector<ifcopenshell
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @todo refactor, also should be GTrsf
|
// @todo refactor, also should be GTrsf
|
||||||
const auto& m = it->Placement()->ccomponents();
|
const auto& m = it->placement()->ccomponents();
|
||||||
gp_Trsf trsf;
|
gp_Trsf trsf;
|
||||||
trsf.SetValues(
|
trsf.SetValues(
|
||||||
m(0, 0), m(0, 1), m(0, 2), m(0, 3),
|
m(0, 0), m(0, 1), m(0, 2), m(0, 3),
|
||||||
|
|||||||
@@ -122,13 +122,13 @@ bool open_cascade_kernel::convert_impl(const taxonomy::boolean_result::ptr br, s
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
for (auto& r : cr) {
|
for (auto& r : cr) {
|
||||||
auto S = std::static_pointer_cast<open_cascade_shape>(r.Shape())->shape();
|
auto S = std::static_pointer_cast<open_cascade_shape>(r.shape())->shape();
|
||||||
if (S.IsNull()) {
|
if (S.IsNull()) {
|
||||||
logger_.error("GEO", 120, "Null operand");
|
logger_.error("GEO", 120, "Null operand");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
gp_GTrsf trsf;
|
gp_GTrsf trsf;
|
||||||
convert(r.Placement(), trsf);
|
convert(r.placement(), trsf);
|
||||||
// @todo it really confuses me why I cannot use Moved() here instead
|
// @todo it really confuses me why I cannot use Moved() here instead
|
||||||
S.Location(S.Location() * trsf.Trsf());
|
S.Location(S.Location() * trsf.Trsf());
|
||||||
|
|
||||||
|
|||||||
@@ -251,9 +251,9 @@ bool ifcopenshell::geom::util::apply_folded_layerset(const std::vector<conversio
|
|||||||
|
|
||||||
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
||||||
TopoDS_Shape a, b;
|
TopoDS_Shape a, b;
|
||||||
if (split_solid_by_shell(std::static_pointer_cast<open_cascade_shape>(it->Shape())->shape(), shells.First(), a, b, tol)) {
|
if (split_solid_by_shell(std::static_pointer_cast<open_cascade_shape>(it->shape())->shape(), shells.First(), a, b, tol)) {
|
||||||
result.push_back(conversion_result(it->ItemId(), it->Placement(), new open_cascade_shape(b), (!!styles[0] ? styles[0] : it->StylePtr())));
|
result.push_back(conversion_result(it->ItemId(), it->placement(), new open_cascade_shape(b), (!!styles[0] ? styles[0] : it->style_ptr())));
|
||||||
result.push_back(conversion_result(it->ItemId(), it->Placement(), new open_cascade_shape(a), (!!styles[1] ? styles[1] : it->StylePtr())));
|
result.push_back(conversion_result(it->ItemId(), it->placement(), new open_cascade_shape(a), (!!styles[1] ? styles[1] : it->style_ptr())));
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -265,13 +265,13 @@ bool ifcopenshell::geom::util::apply_folded_layerset(const std::vector<conversio
|
|||||||
|
|
||||||
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
||||||
|
|
||||||
const TopoDS_Shape& s = std::static_pointer_cast<open_cascade_shape>(it->Shape())->shape();
|
const TopoDS_Shape& s = std::static_pointer_cast<open_cascade_shape>(it->shape())->shape();
|
||||||
TopoDS_Shape sld = ensure_fit_for_subtraction(s, tol);
|
TopoDS_Shape sld = ensure_fit_for_subtraction(s, tol);
|
||||||
|
|
||||||
std::vector<TopoDS_Shape> slices;
|
std::vector<TopoDS_Shape> slices;
|
||||||
if (split(s, shells, tol, slices) && slices.size() == styles.size()) {
|
if (split(s, shells, tol, slices) && slices.size() == styles.size()) {
|
||||||
for (size_t i = 0; i < slices.size(); ++i) {
|
for (size_t i = 0; i < slices.size(); ++i) {
|
||||||
result.push_back(conversion_result(it->ItemId(), it->Placement(), new open_cascade_shape(slices[i]), (!!styles[i] ? styles[i] : it->StylePtr())));
|
result.push_back(conversion_result(it->ItemId(), it->placement(), new open_cascade_shape(slices[i]), (!!styles[i] ? styles[i] : it->style_ptr())));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@@ -293,9 +293,9 @@ bool ifcopenshell::geom::util::apply_layerset(const std::vector<conversion_resul
|
|||||||
|
|
||||||
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
||||||
TopoDS_Shape a, b;
|
TopoDS_Shape a, b;
|
||||||
if (split_solid_by_surface(std::static_pointer_cast<open_cascade_shape>(it->Shape())->shape(), surfaces[1], a, b, tol)) {
|
if (split_solid_by_surface(std::static_pointer_cast<open_cascade_shape>(it->shape())->shape(), surfaces[1], a, b, tol)) {
|
||||||
result.push_back(conversion_result(it->ItemId(), it->Placement(),new open_cascade_shape(b), (!!styles[0] ? styles[0] : it->StylePtr())));
|
result.push_back(conversion_result(it->ItemId(), it->placement(),new open_cascade_shape(b), (!!styles[0] ? styles[0] : it->style_ptr())));
|
||||||
result.push_back(conversion_result(it->ItemId(), it->Placement(),new open_cascade_shape(a), (!!styles[1] ? styles[1] : it->StylePtr())));
|
result.push_back(conversion_result(it->ItemId(), it->placement(),new open_cascade_shape(a), (!!styles[1] ? styles[1] : it->style_ptr())));
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -310,7 +310,7 @@ bool ifcopenshell::geom::util::apply_layerset(const std::vector<conversion_resul
|
|||||||
// layer operations are applied in the correct order. This seems to be always the case.
|
// layer operations are applied in the correct order. This seems to be always the case.
|
||||||
Bnd_Box bb;
|
Bnd_Box bb;
|
||||||
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
||||||
BRepBndLib::Add(it->Shape(), bb);
|
BRepBndLib::Add(it->shape(), bb);
|
||||||
}
|
}
|
||||||
|
|
||||||
double x1, y1, z1, x2, y2, z2;
|
double x1, y1, z1, x2, y2, z2;
|
||||||
@@ -336,7 +336,7 @@ bool ifcopenshell::geom::util::apply_layerset(const std::vector<conversion_resul
|
|||||||
|
|
||||||
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
||||||
|
|
||||||
const TopoDS_Shape& s = std::static_pointer_cast<open_cascade_shape>(it->Shape())->shape();
|
const TopoDS_Shape& s = std::static_pointer_cast<open_cascade_shape>(it->shape())->shape();
|
||||||
TopoDS_Shape sld = ensure_fit_for_subtraction(s, tol);
|
TopoDS_Shape sld = ensure_fit_for_subtraction(s, tol);
|
||||||
|
|
||||||
NCollection_List<TopoDS_Shape> operands;
|
NCollection_List<TopoDS_Shape> operands;
|
||||||
@@ -354,14 +354,14 @@ bool ifcopenshell::geom::util::apply_layerset(const std::vector<conversion_resul
|
|||||||
/*
|
/*
|
||||||
// enable this is you want to see how IfcOpenShell has placed the layer surfaces
|
// enable this is you want to see how IfcOpenShell has placed the layer surfaces
|
||||||
for (auto& x : operands) {
|
for (auto& x : operands) {
|
||||||
result.push_back(conversion_result(it->ItemId(), it->Placement(), x, nullptr));
|
result.push_back(conversion_result(it->ItemId(), it->placement(), x, nullptr));
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
std::vector<TopoDS_Shape> slices;
|
std::vector<TopoDS_Shape> slices;
|
||||||
if (split(s, operands, tol, slices) && slices.size() == styles.size()) {
|
if (split(s, operands, tol, slices) && slices.size() == styles.size()) {
|
||||||
for (size_t i = 0; i < slices.size(); ++i) {
|
for (size_t i = 0; i < slices.size(); ++i) {
|
||||||
result.push_back(conversion_result(it->ItemId(), it->Placement(), new open_cascade_shape(slices[i]), (!!styles[i] ? styles[i] : it->StylePtr())));
|
result.push_back(conversion_result(it->ItemId(), it->placement(), new open_cascade_shape(slices[i]), (!!styles[i] ? styles[i] : it->style_ptr())));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ ifcopenshell::geom::conversion_result_shape* ifcopenshell::geom::open_cascade_sh
|
|||||||
return new open_cascade_shape(shape_);
|
return new open_cascade_shape(shape_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifcopenshell::geom::open_cascade_shape::Triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger) const {
|
void ifcopenshell::geom::open_cascade_shape::triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger) const {
|
||||||
|
|
||||||
// @todo remove duplication with open_cascade_kernel::convert(const taxonomy::matrix4::ptr matrix, gp_GTrsf& trsf);
|
// @todo remove duplication with open_cascade_kernel::convert(const taxonomy::matrix4::ptr matrix, gp_GTrsf& trsf);
|
||||||
// above can be static?
|
// above can be static?
|
||||||
@@ -104,7 +104,7 @@ void ifcopenshell::geom::open_cascade_shape::Triangulate(ifcopenshell::geom::set
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!has_triangulation) {
|
if (!has_triangulation) {
|
||||||
// Triangulate the shape
|
// triangulate the shape
|
||||||
try {
|
try {
|
||||||
BRepMesh_IncrementalMesh(shape_, settings.get<settings::MesherLinearDeflection>().get(), false, settings.get<settings::MesherAngularDeflection>().get());
|
BRepMesh_IncrementalMesh(shape_, settings.get<settings::MesherLinearDeflection>().get(), false, settings.get<settings::MesherAngularDeflection>().get());
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
@@ -372,7 +372,7 @@ void ifcopenshell::geom::open_cascade_shape::Triangulate(ifcopenshell::geom::set
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifcopenshell::geom::open_cascade_shape::Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& r) const {
|
void ifcopenshell::geom::open_cascade_shape::serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& r) const {
|
||||||
auto s = ifcopenshell::geom::util::apply_transformation(shape_, place);
|
auto s = ifcopenshell::geom::util::apply_transformation(shape_, place);
|
||||||
std::stringstream sstream;
|
std::stringstream sstream;
|
||||||
#if OCC_VERSION_HEX >= 0x70600
|
#if OCC_VERSION_HEX >= 0x70600
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ namespace ifcopenshell {
|
|||||||
operator const TopoDS_Shape& ();
|
operator const TopoDS_Shape& ();
|
||||||
virtual std::string_view backend_id() const;
|
virtual std::string_view backend_id() const;
|
||||||
|
|
||||||
virtual void Triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
virtual void triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
||||||
virtual void Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
virtual void serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
||||||
|
|
||||||
virtual ifcopenshell::geom::conversion_result_shape* clone() const;
|
virtual ifcopenshell::geom::conversion_result_shape* clone() const;
|
||||||
|
|
||||||
|
|||||||
@@ -89,10 +89,10 @@ bool ifcopenshell::geom::open_cascade_kernel::convert_openings(const express::ba
|
|||||||
abstract_kernel::convert(op.first, opening_shapes);
|
abstract_kernel::convert(op.first, opening_shapes);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < opening_shapes.size(); ++i) {
|
for (unsigned int i = 0; i < opening_shapes.size(); ++i) {
|
||||||
auto opening_shape_i = std::static_pointer_cast<open_cascade_shape>(opening_shapes[i].Shape())->shape();
|
auto opening_shape_i = std::static_pointer_cast<open_cascade_shape>(opening_shapes[i].shape())->shape();
|
||||||
const TopoDS_Shape& opening_shape_unlocated = util::ensure_fit_for_subtraction(opening_shape_i, settings_.get<settings::Precision>().get());
|
const TopoDS_Shape& opening_shape_unlocated = util::ensure_fit_for_subtraction(opening_shape_i, settings_.get<settings::Precision>().get());
|
||||||
|
|
||||||
auto gtrsf = opening_shapes[i].Placement();
|
auto gtrsf = opening_shapes[i].placement();
|
||||||
// @todo check
|
// @todo check
|
||||||
Eigen::Matrix4d m = relative * gtrsf->ccomponents();
|
Eigen::Matrix4d m = relative * gtrsf->ccomponents();
|
||||||
gp_Trsf trsf;
|
gp_Trsf trsf;
|
||||||
@@ -119,7 +119,7 @@ bool ifcopenshell::geom::open_cascade_kernel::convert_openings(const express::ba
|
|||||||
|
|
||||||
std::list<TopoDS_Shape> parts;
|
std::list<TopoDS_Shape> parts;
|
||||||
|
|
||||||
auto it3_shape = std::static_pointer_cast<open_cascade_shape>(it3->Shape())->shape();
|
auto it3_shape = std::static_pointer_cast<open_cascade_shape>(it3->shape())->shape();
|
||||||
if (it3_shape.IsNull()) {
|
if (it3_shape.IsNull()) {
|
||||||
logger_.error("GEO", 187, "Null operand");
|
logger_.error("GEO", 187, "Null operand");
|
||||||
continue;
|
continue;
|
||||||
@@ -187,7 +187,7 @@ bool ifcopenshell::geom::open_cascade_kernel::convert_openings(const express::ba
|
|||||||
} else {
|
} else {
|
||||||
entity_shape_unlocated = util::ensure_fit_for_subtraction(entity_part, settings_.get<settings::Precision>().get());
|
entity_shape_unlocated = util::ensure_fit_for_subtraction(entity_part, settings_.get<settings::Precision>().get());
|
||||||
}
|
}
|
||||||
const auto& m = it3->Placement()->ccomponents();
|
const auto& m = it3->placement()->ccomponents();
|
||||||
// @todo
|
// @todo
|
||||||
// if (entity_shape_gtrsf.Form() == gp_Other) {
|
// if (entity_shape_gtrsf.Form() == gp_Other) {
|
||||||
// ifcopenshell::logger::root().message(ifcopenshell::logger::LOG_WARNING, "Applying non uniform transformation to:", entity);
|
// ifcopenshell::logger::root().message(ifcopenshell::logger::LOG_WARNING, "Applying non uniform transformation to:", entity);
|
||||||
@@ -262,19 +262,19 @@ bool ifcopenshell::geom::open_cascade_kernel::convert_openings(const express::ba
|
|||||||
combined_result = C;
|
combined_result = C;
|
||||||
}
|
}
|
||||||
|
|
||||||
cut_shapes.push_back(ifcopenshell::geom::conversion_result(it3->ItemId(), new open_cascade_shape(combined_result), it3->StylePtr()));
|
cut_shapes.push_back(ifcopenshell::geom::conversion_result(it3->ItemId(), new open_cascade_shape(combined_result), it3->style_ptr()));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ifcopenshell::geom::open_cascade_kernel::unify_shapes(const std::vector<ifcopenshell::geom::conversion_result>& input, std::vector<ifcopenshell::geom::conversion_result>& output) {
|
bool ifcopenshell::geom::open_cascade_kernel::unify_shapes(const std::vector<ifcopenshell::geom::conversion_result>& input, std::vector<ifcopenshell::geom::conversion_result>& output) {
|
||||||
std::transform(input.begin(), input.end(), std::back_inserter(output), [this](auto v) {
|
std::transform(input.begin(), input.end(), std::back_inserter(output), [this](auto v) {
|
||||||
auto& s = std::static_pointer_cast<open_cascade_shape>(v.Shape())->shape();
|
auto& s = std::static_pointer_cast<open_cascade_shape>(v.shape())->shape();
|
||||||
return ifcopenshell::geom::conversion_result(
|
return ifcopenshell::geom::conversion_result(
|
||||||
v.ItemId(),
|
v.ItemId(),
|
||||||
v.Placement(),
|
v.placement(),
|
||||||
new open_cascade_shape(util::unify(s, settings_.get<ifcopenshell::geom::settings::Precision>().get())),
|
new open_cascade_shape(util::unify(s, settings_.get<ifcopenshell::geom::settings::Precision>().get())),
|
||||||
v.StylePtr());
|
v.style_ptr());
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -439,7 +439,7 @@ bool ifcopenshell::geom::open_cascade_kernel::convert_impl(const taxonomy::revol
|
|||||||
// } else {
|
// } else {
|
||||||
// bool some_items_without_style = false;
|
// bool some_items_without_style = false;
|
||||||
// for (std::vector<ifcopenshell::geom::conversion_result>::iterator it = shapes.begin(); it != shapes.end(); ++it) {
|
// for (std::vector<ifcopenshell::geom::conversion_result>::iterator it = shapes.begin(); it != shapes.end(); ++it) {
|
||||||
// if (!it->hasStyle() && util::count(it->Shape(), TopAbs_FACE)) {
|
// if (!it->hasStyle() && util::count(it->shape(), TopAbs_FACE)) {
|
||||||
// some_items_without_style = true;
|
// some_items_without_style = true;
|
||||||
// break;
|
// break;
|
||||||
// }
|
// }
|
||||||
@@ -457,7 +457,7 @@ bool ifcopenshell::geom::open_cascade_kernel::convert_impl(const taxonomy::revol
|
|||||||
// for (auto& s : shapes) {
|
// for (auto& s : shapes) {
|
||||||
// if (s.hasStyle()) {
|
// if (s.hasStyle()) {
|
||||||
// for (auto& p : style_cache) {
|
// for (auto& p : style_cache) {
|
||||||
// if (p.second == s.StylePtr()) {
|
// if (p.second == s.style_ptr()) {
|
||||||
// std::const_pointer_cast<ifcopenshell::geom::SurfaceStyle>(p.second)->Transparency() = settings.force_space_transparency();
|
// std::const_pointer_cast<ifcopenshell::geom::SurfaceStyle>(p.second)->Transparency() = settings.force_space_transparency();
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
@@ -604,7 +604,7 @@ bool ifcopenshell::geom::open_cascade_kernel::convert_impl(const taxonomy::revol
|
|||||||
// int genus = (int)q2->as<IfcSchema::IfcQuantityCount>()->CountValue();
|
// int genus = (int)q2->as<IfcSchema::IfcQuantityCount>()->CountValue();
|
||||||
// for (auto& part : elem->geometry()) {
|
// for (auto& part : elem->geometry()) {
|
||||||
// if (part.ItemId() == item_id) {
|
// if (part.ItemId() == item_id) {
|
||||||
// if (util::surface_genus(part.Shape()) != genus) {
|
// if (util::surface_genus(part.shape()) != genus) {
|
||||||
// all_succeeded = false;
|
// all_succeeded = false;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
@@ -779,7 +779,7 @@ bool ifcopenshell::geom::open_cascade_kernel::convert_impl(const taxonomy::revol
|
|||||||
//
|
//
|
||||||
// TopoDS_Vertex a, b;
|
// TopoDS_Vertex a, b;
|
||||||
// for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
// for (std::vector<conversion_result>::const_iterator it = items.begin(); it != items.end(); ++it) {
|
||||||
// TopExp_Explorer exp(it->Shape(), TopAbs_VERTEX);
|
// TopExp_Explorer exp(it->shape(), TopAbs_VERTEX);
|
||||||
// for (; exp.More(); exp.Next()) {
|
// for (; exp.More(); exp.Next()) {
|
||||||
// b = TopoDS::Vertex(exp.Current());
|
// b = TopoDS::Vertex(exp.Current());
|
||||||
// if (a.IsNull()) {
|
// if (a.IsNull()) {
|
||||||
|
|||||||
@@ -1771,11 +1771,11 @@ namespace ifcopenshell::geom {
|
|||||||
TopoDS_Iterator it(compound);
|
TopoDS_Iterator it(compound);
|
||||||
for (; it.More(); it.Next(), ++git) {
|
for (; it.More(); it.Next(), ++git) {
|
||||||
// Assumption is that the number of styles is small, so the linear lookup time is not significant.
|
// Assumption is that the number of styles is small, so the linear lookup time is not significant.
|
||||||
auto sit = std::find(styles_.begin(), styles_.end(), git->StylePtr());
|
auto sit = std::find(styles_.begin(), styles_.end(), git->style_ptr());
|
||||||
size_t index;
|
size_t index;
|
||||||
if (sit == styles_.end()) {
|
if (sit == styles_.end()) {
|
||||||
index = styles_.size();
|
index = styles_.size();
|
||||||
styles_.push_back(git->StylePtr());
|
styles_.push_back(git->style_ptr());
|
||||||
} else {
|
} else {
|
||||||
index = std::distance(styles_.begin(), sit);
|
index = std::distance(styles_.begin(), sit);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -286,7 +286,7 @@ ifcopenshell::geom::passthrough_shape::passthrough_shape(const std::vector<passt
|
|||||||
ifcopenshell::geom::passthrough_shape::passthrough_shape(std::vector<passthrough_part>&& parts)
|
ifcopenshell::geom::passthrough_shape::passthrough_shape(std::vector<passthrough_part>&& parts)
|
||||||
: parts_(normalize_parts(parts)) {}
|
: parts_(normalize_parts(parts)) {}
|
||||||
|
|
||||||
void ifcopenshell::geom::passthrough_shape::Triangulate(ifcopenshell::geom::settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger&) const {
|
void ifcopenshell::geom::passthrough_shape::triangulate(ifcopenshell::geom::settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger&) const {
|
||||||
auto mesh = build_mesh(parts_, &place);
|
auto mesh = build_mesh(parts_, &place);
|
||||||
std::vector<int> indices(mesh.vertices.size());
|
std::vector<int> indices(mesh.vertices.size());
|
||||||
for (size_t i = 0; i < mesh.vertices.size(); ++i) {
|
for (size_t i = 0; i < mesh.vertices.size(); ++i) {
|
||||||
@@ -302,7 +302,7 @@ void ifcopenshell::geom::passthrough_shape::Triangulate(ifcopenshell::geom::sett
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifcopenshell::geom::passthrough_shape::Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& result) const {
|
void ifcopenshell::geom::passthrough_shape::serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string& result) const {
|
||||||
auto mesh = build_mesh(parts_, &place);
|
auto mesh = build_mesh(parts_, &place);
|
||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
for (const auto& vertex : mesh.vertices) {
|
for (const auto& vertex : mesh.vertices) {
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ public:
|
|||||||
const std::vector<passthrough_part>& parts() const { return parts_; }
|
const std::vector<passthrough_part>& parts() const { return parts_; }
|
||||||
virtual std::string_view backend_id() const { return "passthrough"; }
|
virtual std::string_view backend_id() const { return "passthrough"; }
|
||||||
|
|
||||||
virtual void Triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
virtual void triangulate(ifcopenshell::geom::settings settings, const ifcopenshell::geom::taxonomy::matrix4& place, ifcopenshell::geom::triangulation* t, int item_id, int surface_style_id, ifcopenshell::logger& logger = ifcopenshell::logger::root()) const;
|
||||||
virtual void Serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
virtual void serialize(const ifcopenshell::geom::taxonomy::matrix4& place, std::string&) const;
|
||||||
|
|
||||||
virtual int surface_genus() const;
|
virtual int surface_genus() const;
|
||||||
virtual bool is_manifold() const;
|
virtual bool is_manifold() const;
|
||||||
|
|||||||
@@ -26,20 +26,20 @@ ifcopenshell::geom::serialization::serialization(const brep& brep)
|
|||||||
int sid = -1;
|
int sid = -1;
|
||||||
|
|
||||||
if (it->hasStyle()) {
|
if (it->hasStyle()) {
|
||||||
const auto& clr = it->Style().get_color().ccomponents();
|
const auto& clr = it->style().get_color().ccomponents();
|
||||||
surface_styles_.push_back(clr(0));
|
surface_styles_.push_back(clr(0));
|
||||||
surface_styles_.push_back(clr(1));
|
surface_styles_.push_back(clr(1));
|
||||||
surface_styles_.push_back(clr(2));
|
surface_styles_.push_back(clr(2));
|
||||||
|
|
||||||
sid = it->Style().instance ? it->Style().instance.id() : -1;
|
sid = it->style().instance ? it->style().instance.id() : -1;
|
||||||
} else {
|
} else {
|
||||||
surface_styles_.push_back(-1.);
|
surface_styles_.push_back(-1.);
|
||||||
surface_styles_.push_back(-1.);
|
surface_styles_.push_back(-1.);
|
||||||
surface_styles_.push_back(-1.);
|
surface_styles_.push_back(-1.);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (it->hasStyle() && it->Style().has_transparency()) {
|
if (it->hasStyle() && it->style().has_transparency()) {
|
||||||
surface_styles_.push_back(1. - it->Style().transparency);
|
surface_styles_.push_back(1. - it->style().transparency);
|
||||||
} else {
|
} else {
|
||||||
surface_styles_.push_back(1.);
|
surface_styles_.push_back(1.);
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ ifcopenshell::geom::serialization::serialization(const brep& brep)
|
|||||||
|
|
||||||
ifcopenshell::geom::taxonomy::matrix4 identity;
|
ifcopenshell::geom::taxonomy::matrix4 identity;
|
||||||
auto* comp = brep.as_compound();
|
auto* comp = brep.as_compound();
|
||||||
comp->Serialize(identity, brep_data_);
|
comp->serialize(identity, brep_data_);
|
||||||
delete comp;
|
delete comp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,9 +100,9 @@ bool ifcopenshell::geom::brep::calculate_projected_surface_area(const ifcopenshe
|
|||||||
|
|
||||||
for (std::vector<ifcopenshell::geom::conversion_result>::const_iterator it = begin(); it != end(); ++it) {
|
for (std::vector<ifcopenshell::geom::conversion_result>::const_iterator it = begin(); it != end(); ++it) {
|
||||||
double x, y, z;
|
double x, y, z;
|
||||||
it->Shape()->surface_area_along_direction(settings().get<ifcopenshell::geom::settings::MesherLinearDeflection>().get(), place, x, y, z);
|
it->shape()->surface_area_along_direction(settings().get<ifcopenshell::geom::settings::MesherLinearDeflection>().get(), place, x, y, z);
|
||||||
|
|
||||||
if (it->Shape()->is_manifold()) {
|
if (it->shape()->is_manifold()) {
|
||||||
x /= 2.;
|
x /= 2.;
|
||||||
y /= 2.;
|
y /= 2.;
|
||||||
z /= 2.;
|
z /= 2.;
|
||||||
@@ -127,10 +127,10 @@ ifcopenshell::geom::triangulation::triangulation(const brep& shape_model)
|
|||||||
|
|
||||||
int surface_style_id = -1;
|
int surface_style_id = -1;
|
||||||
if (iit->hasStyle()) {
|
if (iit->hasStyle()) {
|
||||||
auto jt = std::find(materials_.begin(), materials_.end(), iit->StylePtr());
|
auto jt = std::find(materials_.begin(), materials_.end(), iit->style_ptr());
|
||||||
if (jt == materials_.end()) {
|
if (jt == materials_.end()) {
|
||||||
surface_style_id = (int)materials_.size();
|
surface_style_id = (int)materials_.size();
|
||||||
materials_.push_back(iit->StylePtr());
|
materials_.push_back(iit->style_ptr());
|
||||||
} else {
|
} else {
|
||||||
surface_style_id = (int)(jt - materials_.begin());
|
surface_style_id = (int)(jt - materials_.begin());
|
||||||
}
|
}
|
||||||
@@ -147,7 +147,7 @@ ifcopenshell::geom::triangulation::triangulation(const brep& shape_model)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
iit->Shape()->Triangulate(settings(), *iit->Placement(), this, iit->ItemId(), surface_style_id);
|
iit->shape()->triangulate(settings(), *iit->placement(), this, iit->ItemId(), surface_style_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ void ifcopenshell::geom::triangulation::registerEdgeCount(int n1, int n2, std::m
|
|||||||
|
|
||||||
const ifcopenshell::geom::conversion_result_shape* ifcopenshell::geom::brep::item(int i) const {
|
const ifcopenshell::geom::conversion_result_shape* ifcopenshell::geom::brep::item(int i) const {
|
||||||
if (i >= 0 && i < shapes_.size()) {
|
if (i >= 0 && i < shapes_.size()) {
|
||||||
return shapes_[i].Shape()->moved(shapes_[i].Placement());
|
return shapes_[i].shape()->moved(shapes_[i].placement());
|
||||||
} else {
|
} else {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -142,8 +142,8 @@ class ConversionResult:
|
|||||||
def setStyle(self, newStyle): ...
|
def setStyle(self, newStyle): ...
|
||||||
|
|
||||||
class ConversionResultShape:
|
class ConversionResultShape:
|
||||||
def Serialize(self, place, arg3): ...
|
def serialize(self, place, arg3): ...
|
||||||
def Triangulate(self, *args): ...
|
def triangulate(self, *args): ...
|
||||||
def __init__(self, *args, **kwargs): ...
|
def __init__(self, *args, **kwargs): ...
|
||||||
def add(self, arg2): ...
|
def add(self, arg2): ...
|
||||||
def area(self): ...
|
def area(self): ...
|
||||||
|
|||||||
@@ -1168,7 +1168,7 @@ ifcopenshell::geom::taxonomy::item::ptr try_upcast(PyObject* obj0, swig_type_inf
|
|||||||
%extend ifcopenshell::geom::conversion_result_shape {
|
%extend ifcopenshell::geom::conversion_result_shape {
|
||||||
std::string serialize_obj() {
|
std::string serialize_obj() {
|
||||||
ifcopenshell::geom::settings settings;
|
ifcopenshell::geom::settings settings;
|
||||||
std::unique_ptr<ifcopenshell::geom::triangulation> triangulation($self->Triangulate(settings));
|
std::unique_ptr<ifcopenshell::geom::triangulation> triangulation($self->triangulate(settings));
|
||||||
std::ostringstream result;
|
std::ostringstream result;
|
||||||
|
|
||||||
for (auto it = triangulation->verts().begin(); it != triangulation->verts().end();) {
|
for (auto it = triangulation->verts().begin(); it != triangulation->verts().end();) {
|
||||||
@@ -1204,7 +1204,7 @@ ifcopenshell::geom::taxonomy::item::ptr try_upcast(PyObject* obj0, swig_type_inf
|
|||||||
std::string serialize() {
|
std::string serialize() {
|
||||||
std::string result;
|
std::string result;
|
||||||
ifcopenshell::geom::taxonomy::matrix4 iden;
|
ifcopenshell::geom::taxonomy::matrix4 iden;
|
||||||
$self->Serialize(iden, result);
|
$self->serialize(iden, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1317,7 +1317,7 @@ ifcopenshell::geom::taxonomy::item::ptr try_upcast(PyObject* obj0, swig_type_inf
|
|||||||
std::string serialize() {
|
std::string serialize() {
|
||||||
std::string result;
|
std::string result;
|
||||||
ifcopenshell::geom::taxonomy::matrix4 iden;
|
ifcopenshell::geom::taxonomy::matrix4 iden;
|
||||||
$self->Serialize(iden, result);
|
$self->serialize(iden, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user