From bdc6fcb66fc7e17ad273961e84c3ad2bf2b149fa Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Mon, 18 Oct 2021 11:38:01 +0200 Subject: [PATCH] #1803 Use abstract GeometrySerializer as cache to eliminate cyclic dependencies --- src/ifcgeom/IfcGeomIteratorImplementation.h | 2 +- .../GeometrySerializer.h | 14 ++++++++++- src/ifcgeom_schema_agnostic/IfcGeomIterator.h | 2 +- .../IteratorImplementation.h | 25 ++++++++++++++++--- .../Serializer.h | 0 src/serializers/ColladaSerializer.h | 6 ++--- src/serializers/GltfSerializer.cpp | 2 +- src/serializers/GltfSerializer.h | 4 +-- src/serializers/HdfSerializer.h | 5 +--- src/serializers/OpenCascadeBasedSerializer.h | 6 ++--- src/serializers/SvgSerializer.h | 6 ++--- src/serializers/WavefrontObjSerializer.cpp | 2 +- src/serializers/WavefrontObjSerializer.h | 4 +-- src/serializers/XmlSerializer.h | 2 +- 14 files changed, 54 insertions(+), 26 deletions(-) rename src/{serializers => ifcgeom_schema_agnostic}/GeometrySerializer.h (89%) rename src/{serializers => ifcgeom_schema_agnostic}/Serializer.h (100%) diff --git a/src/ifcgeom/IfcGeomIteratorImplementation.h b/src/ifcgeom/IfcGeomIteratorImplementation.h index f2f32a0fb8..593c09f658 100644 --- a/src/ifcgeom/IfcGeomIteratorImplementation.h +++ b/src/ifcgeom/IfcGeomIteratorImplementation.h @@ -1035,7 +1035,7 @@ namespace IfcGeom { gid2 = gid2.substr(0, hyphen); } - auto from_cache = cache_->read(*ifc_file, next_shape_model->guid(), boost::lexical_cast(gid2), HdfSerializer::READ_TRIANGULATION); + auto from_cache = cache_->read(*ifc_file, next_shape_model->guid(), boost::lexical_cast(gid2), GeometrySerializer::READ_TRIANGULATION); if (from_cache) { read_from_cache = true; next_triangulation = (TriangulationElement*)from_cache; diff --git a/src/serializers/GeometrySerializer.h b/src/ifcgeom_schema_agnostic/GeometrySerializer.h similarity index 89% rename from src/serializers/GeometrySerializer.h rename to src/ifcgeom_schema_agnostic/GeometrySerializer.h index ad531f8120..d92aea9533 100644 --- a/src/serializers/GeometrySerializer.h +++ b/src/ifcgeom_schema_agnostic/GeometrySerializer.h @@ -20,7 +20,7 @@ #ifndef GEOMETRYSERIALIZER_H #define GEOMETRYSERIALIZER_H -#include "../serializers/Serializer.h" +#include "../ifcgeom_schema_agnostic/Serializer.h" #include "../ifcgeom/IfcGeomElement.h" class SerializerSettings : public IfcGeom::IteratorSettings @@ -101,6 +101,8 @@ public: class GeometrySerializer : public Serializer { public: + enum read_type { READ_BREP, READ_TRIANGULATION }; + GeometrySerializer(const SerializerSettings& settings) : settings_(settings) {} virtual ~GeometrySerializer() {} @@ -108,6 +110,7 @@ public: virtual void write(const IfcGeom::TriangulationElement* o) = 0; virtual void write(const IfcGeom::BRepElement* o) = 0; virtual void setUnitNameAndMagnitude(const std::string& name, float magnitude) = 0; + virtual const IfcGeom::Element* read(IfcParse::IfcFile& f, const std::string& guid, unsigned int representation_id, read_type rt = READ_BREP) = 0; const SerializerSettings& settings() const { return settings_; } SerializerSettings& settings() { return settings_; } @@ -125,4 +128,13 @@ protected: SerializerSettings settings_; }; +class WriteOnlyGeometrySerializer : public GeometrySerializer { +public: + WriteOnlyGeometrySerializer(const SerializerSettings& settings) : GeometrySerializer(settings) {} + + virtual const IfcGeom::Element* read(IfcParse::IfcFile&, const std::string&, unsigned int, read_type = READ_BREP) { + throw std::runtime_error("Not supported"); + }; +}; + #endif diff --git a/src/ifcgeom_schema_agnostic/IfcGeomIterator.h b/src/ifcgeom_schema_agnostic/IfcGeomIterator.h index 6d08b35b04..04437e58a4 100644 --- a/src/ifcgeom_schema_agnostic/IfcGeomIterator.h +++ b/src/ifcgeom_schema_agnostic/IfcGeomIterator.h @@ -138,7 +138,7 @@ namespace IfcGeom { IfcUtil::IfcBaseClass* create() { return implementation_->create(); } - void set_cache(HdfSerializer* cache) { return implementation_->set_cache(cache); } + void set_cache(GeometrySerializer* cache) { return implementation_->set_cache(cache); } }; } diff --git a/src/ifcgeom_schema_agnostic/IteratorImplementation.h b/src/ifcgeom_schema_agnostic/IteratorImplementation.h index b384e9eb1e..5639f8c743 100644 --- a/src/ifcgeom_schema_agnostic/IteratorImplementation.h +++ b/src/ifcgeom_schema_agnostic/IteratorImplementation.h @@ -1,10 +1,29 @@ +/******************************************************************************** + * * + * This file is part of IfcOpenShell. * + * * + * IfcOpenShell is free software: you can redistribute it and/or modify * + * it under the terms of the Lesser GNU General Public License as published by * + * the Free Software Foundation, either version 3.0 of the License, or * + * (at your option) any later version. * + * * + * IfcOpenShell is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * Lesser GNU General Public License for more details. * + * * + * You should have received a copy of the Lesser GNU General Public License * + * along with this program. If not, see . * + * * + ********************************************************************************/ + #ifndef ITERATOR_IMPLEMENTATION_H #define ITERATOR_IMPLEMENTATION_H #include "../ifcgeom_schema_agnostic/IfcGeomFilter.h" +#include "../ifcgeom_schema_agnostic/GeometrySerializer.h" #include "../ifcparse/IfcFile.h" #include "../ifcgeom/IfcGeomIteratorSettings.h" -#include "../serializers/HdfSerializer.h" #include @@ -36,9 +55,9 @@ namespace IfcGeom { class IteratorImplementation { protected: - HdfSerializer* cache_ = nullptr; + GeometrySerializer* cache_ = nullptr; public: - void set_cache(HdfSerializer* cache) { cache_ = cache; } + void set_cache(GeometrySerializer* cache) { cache_ = cache; } virtual bool initialize() = 0; virtual void compute_bounds(bool with_geometry) = 0; diff --git a/src/serializers/Serializer.h b/src/ifcgeom_schema_agnostic/Serializer.h similarity index 100% rename from src/serializers/Serializer.h rename to src/ifcgeom_schema_agnostic/Serializer.h diff --git a/src/serializers/ColladaSerializer.h b/src/serializers/ColladaSerializer.h index 6c1433a8f2..5d7651df5a 100644 --- a/src/serializers/ColladaSerializer.h +++ b/src/serializers/ColladaSerializer.h @@ -43,13 +43,13 @@ #include "../ifcgeom_schema_agnostic/IfcGeomIterator.h" -#include "../serializers/GeometrySerializer.h" +#include "../ifcgeom_schema_agnostic/GeometrySerializer.h" #include #include -class ColladaSerializer : public GeometrySerializer +class ColladaSerializer : public WriteOnlyGeometrySerializer { // TODO The vast amount of implement details of ColladaSerializer could be hidden to the cpp file. private: @@ -219,7 +219,7 @@ private: float unit_magnitude; public: ColladaSerializer(const std::string& dae_filename, const SerializerSettings& settings) - : GeometrySerializer(settings) + : WriteOnlyGeometrySerializer(settings) , exporter("IfcOpenShell", dae_filename, this, settings.precision >= 15) { exporter.serializer = this; diff --git a/src/serializers/GltfSerializer.cpp b/src/serializers/GltfSerializer.cpp index 8a6374d9e5..2a2c5cb9e7 100644 --- a/src/serializers/GltfSerializer.cpp +++ b/src/serializers/GltfSerializer.cpp @@ -45,7 +45,7 @@ static const uint32_t PRIM_TRIANGLE_STRIP = 5; static const uint32_t PRIM_TRIANGLE_FAN = 6; GltfSerializer::GltfSerializer(const std::string& filename, const SerializerSettings& settings) - : GeometrySerializer(settings) + : WriteOnlyGeometrySerializer(settings) , filename_(filename) , tmp_filename1_(filename + ".indices.tmp") , tmp_filename2_(filename + ".vertices.tmp") diff --git a/src/serializers/GltfSerializer.h b/src/serializers/GltfSerializer.h index 102e2d1543..c9aae885d2 100644 --- a/src/serializers/GltfSerializer.h +++ b/src/serializers/GltfSerializer.h @@ -22,14 +22,14 @@ #ifdef WITH_GLTF -#include "../serializers/GeometrySerializer.h" +#include "../ifcgeom_schema_agnostic/GeometrySerializer.h" #include using json = nlohmann::json; #include -class GltfSerializer : public GeometrySerializer { +class GltfSerializer : public WriteOnlyGeometrySerializer { private: std::string filename_, tmp_filename1_, tmp_filename2_; std::ofstream fstream_, tmp_fstream1_, tmp_fstream2_; diff --git a/src/serializers/HdfSerializer.h b/src/serializers/HdfSerializer.h index 0859f41728..6d8d4729da 100644 --- a/src/serializers/HdfSerializer.h +++ b/src/serializers/HdfSerializer.h @@ -28,14 +28,11 @@ #include "H5Cpp.h" -#include "../serializers/GeometrySerializer.h" +#include "../ifcgeom_schema_agnostic/GeometrySerializer.h" #define USE_BINARY class HdfSerializer : public GeometrySerializer { -public: - enum read_type { READ_BREP, READ_TRIANGULATION }; - private: const std::string hdf_filename; unsigned int vcount_total; diff --git a/src/serializers/OpenCascadeBasedSerializer.h b/src/serializers/OpenCascadeBasedSerializer.h index 6c07c2be04..e289e6ebfd 100644 --- a/src/serializers/OpenCascadeBasedSerializer.h +++ b/src/serializers/OpenCascadeBasedSerializer.h @@ -22,9 +22,9 @@ #include "../ifcgeom_schema_agnostic/IfcGeomIterator.h" -#include "../serializers/GeometrySerializer.h" +#include "../ifcgeom_schema_agnostic/GeometrySerializer.h" -class OpenCascadeBasedSerializer : public GeometrySerializer { +class OpenCascadeBasedSerializer : public WriteOnlyGeometrySerializer { OpenCascadeBasedSerializer(const OpenCascadeBasedSerializer&); //N/A OpenCascadeBasedSerializer& operator =(const OpenCascadeBasedSerializer&); //N/A protected: @@ -32,7 +32,7 @@ protected: const char* getSymbolForUnitMagnitude(float mag); public: explicit OpenCascadeBasedSerializer(const std::string& out_filename, const SerializerSettings& settings) - : GeometrySerializer(settings) + : WriteOnlyGeometrySerializer(settings) , out_filename(out_filename) {} virtual ~OpenCascadeBasedSerializer() {} diff --git a/src/serializers/SvgSerializer.h b/src/serializers/SvgSerializer.h index 80dd1fca09..6ec84e7e17 100644 --- a/src/serializers/SvgSerializer.h +++ b/src/serializers/SvgSerializer.h @@ -22,7 +22,7 @@ #ifndef SVGSERIALIZER_H #define SVGSERIALIZER_H -#include "../serializers/GeometrySerializer.h" +#include "../ifcgeom_schema_agnostic/GeometrySerializer.h" #include "../serializers/util.h" #include "../ifcparse/utils.h" @@ -129,7 +129,7 @@ typedef boost::variant< Handle(HLRBRep_PolyAlgo) > hlr_t; -class SvgSerializer : public GeometrySerializer { +class SvgSerializer : public WriteOnlyGeometrySerializer { public: typedef std::pair > path_object; typedef std::vector< boost::shared_ptr > float_item_list; @@ -184,7 +184,7 @@ protected: public: SvgSerializer(const stream_or_filename& out_filename, const SerializerSettings& settings) - : GeometrySerializer(settings) + : WriteOnlyGeometrySerializer(settings) , svg_file(out_filename) , xmin(+std::numeric_limits::infinity()) , ymin(+std::numeric_limits::infinity()) diff --git a/src/serializers/WavefrontObjSerializer.cpp b/src/serializers/WavefrontObjSerializer.cpp index 8c9399f5ac..b5dea5bd4e 100644 --- a/src/serializers/WavefrontObjSerializer.cpp +++ b/src/serializers/WavefrontObjSerializer.cpp @@ -28,7 +28,7 @@ #include WaveFrontOBJSerializer::WaveFrontOBJSerializer(const stream_or_filename& obj_filename, const stream_or_filename& mtl_filename, const SerializerSettings& settings) - : GeometrySerializer(settings) + : WriteOnlyGeometrySerializer(settings) , obj_stream(obj_filename) , mtl_stream(mtl_filename) , vcount_total(1) diff --git a/src/serializers/WavefrontObjSerializer.h b/src/serializers/WavefrontObjSerializer.h index 94b02242dd..f640fd0db4 100644 --- a/src/serializers/WavefrontObjSerializer.h +++ b/src/serializers/WavefrontObjSerializer.h @@ -24,10 +24,10 @@ #include #include -#include "../serializers/GeometrySerializer.h" +#include "../ifcgeom_schema_agnostic/GeometrySerializer.h" // http://people.sc.fsu.edu/~jburkardt/txt/obj_format.txt -class WaveFrontOBJSerializer : public GeometrySerializer { +class WaveFrontOBJSerializer : public WriteOnlyGeometrySerializer { private: stream_or_filename obj_stream; stream_or_filename mtl_stream; diff --git a/src/serializers/XmlSerializer.h b/src/serializers/XmlSerializer.h index fbf128491b..0c18a24ddc 100644 --- a/src/serializers/XmlSerializer.h +++ b/src/serializers/XmlSerializer.h @@ -1,6 +1,6 @@ #define SCHEMA_METHOD -#include "../serializers/Serializer.h" +#include "../ifcgeom_schema_agnostic/Serializer.h" #include "../ifcparse/IfcFile.h" #include