From 1cdf69589105ad093480262b6225573c93db5943 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sun, 7 Nov 2021 19:23:48 +0100 Subject: [PATCH] #1785 check settings in cache and upgrade to world coords --- src/ifcgeom/IfcGeomIteratorSettings.h | 6 +++++- src/serializers/HdfSerializer.cpp | 26 +++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/ifcgeom/IfcGeomIteratorSettings.h b/src/ifcgeom/IfcGeomIteratorSettings.h index 30e572f7b9..12cec3ff71 100644 --- a/src/ifcgeom/IfcGeomIteratorSettings.h +++ b/src/ifcgeom/IfcGeomIteratorSettings.h @@ -160,8 +160,12 @@ namespace IfcGeom /// Optional rotation that is applied to serialized objects, (0,0,0,1) by default. std::array rotation = std::array{0.0, 0.0, 0.0, 1.0}; + uint64_t get_raw() const { + return settings_; + } + protected: - unsigned settings_; + uint64_t settings_; double deflection_tolerance_, angular_tolerance_, force_space_transparency_; std::set context_ids_; }; diff --git a/src/serializers/HdfSerializer.cpp b/src/serializers/HdfSerializer.cpp index 477b03224a..f2192a80f3 100644 --- a/src/serializers/HdfSerializer.cpp +++ b/src/serializers/HdfSerializer.cpp @@ -113,6 +113,11 @@ namespace { return H5::PredType::NATIVE_INT; } + template <> + H5::DataType h5_datatype_for_cpp() { + return H5::PredType::NATIVE_UINT64; + } + template <> H5::DataType h5_datatype_for_cpp() { return H5::PredType::NATIVE_DOUBLE; @@ -308,6 +313,10 @@ IfcGeom::Element* HdfSerializer::read(IfcParse::IfcFile& f, const std::string& g if (rt == READ_BREP && !brep_geometry) { auto brepDataset = representation_group.openDataSet(DATASET_NAME_OCCT); + auto stored_settings = read_scalar_attribute(brepDataset, "settings"); + if (stored_settings != settings_.get_raw() && (stored_settings | IfcGeom::IteratorSettings::USE_WORLD_COORDS) != settings_.get_raw()) { + throw std::runtime_error("Settings mismatch"); + } std::vector parts; { @@ -379,9 +388,19 @@ IfcGeom::Element* HdfSerializer::read(IfcParse::IfcFile& f, const std::string& g shapes.push_back(IfcGeom::IfcRepresentationShapeItem(part.id, trsf, shp, style_ptr)); } + if (settings_.get(IfcGeom::IteratorSettings::USE_WORLD_COORDS) && !(stored_settings & IfcGeom::IteratorSettings::USE_WORLD_COORDS)) { + for (IfcGeom::IfcRepresentationShapeItems::iterator it = shapes.begin(); it != shapes.end(); ++it) { + it->prepend(trsf); + } + trsf = gp_Trsf(); + } + brep_geometry = boost::shared_ptr(new IfcGeom::Representation::BRep(element_settings, geom_id, shapes)); - brep_cache_.insert({ representation_id_str, brep_geometry }); + + if (!settings_.get(IfcGeom::IteratorSettings::USE_WORLD_COORDS)) { + brep_cache_.insert({ representation_id_str, brep_geometry }); + } } if (rt == READ_TRIANGULATION && !triangulation_geometry) { @@ -626,6 +645,11 @@ void HdfSerializer::write(const IfcGeom::BRepElement* o) { auto brepDataset = representation_group.createDataSet(DATASET_NAME_OCCT, compound, dataspace_parts); brepDataset.write(parts, compound); + + H5::DataSpace attrdspace(H5S_SCALAR); + H5::Attribute att = brepDataset.createAttribute("settings", H5::PredType::NATIVE_UINT64, attrdspace); + uint64_t value = o->geometry().settings().get_raw(); + att.write(H5::PredType::NATIVE_UINT64, &value); } namespace {