diff --git a/src/ifcconvert/ColladaSerializer.cpp b/src/ifcconvert/ColladaSerializer.cpp index c8b82cd525..f8e3bf6be3 100644 --- a/src/ifcconvert/ColladaSerializer.cpp +++ b/src/ifcconvert/ColladaSerializer.cpp @@ -399,7 +399,7 @@ void ColladaSerializer::ColladaExporter::write(const IfcGeom::TriangulationEleme const std::string name = serializer->settings().get(SerializerSettings::USE_ELEMENT_GUIDS) ? o->guid() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_NAMES) ? o->name() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_TYPES) ? o->type() + slabSuffix : o->unique_id())); - const std::string representation_id = "representation-" + boost::lexical_cast(o->geometry().id()); + const std::string representation_id = "representation-" + o->geometry().id(); std::vector material_references; foreach(const IfcGeom::Material& material, mesh.materials()) { if (!materials.contains(material)) { diff --git a/src/ifcgeom/IfcGeomFunctions.cpp b/src/ifcgeom/IfcGeomFunctions.cpp index 8f116bfe8f..e3ce460745 100644 --- a/src/ifcgeom/IfcGeomFunctions.cpp +++ b/src/ifcgeom/IfcGeomFunctions.cpp @@ -1082,6 +1082,10 @@ template IfcGeom::BRepElement

* IfcGeom::Kernel::create_brep_for_representation_and_product( const IteratorSettings& settings, IfcSchema::IfcRepresentation* representation, IfcSchema::IfcProduct* product) { + std::stringstream representation_id_builder; + + representation_id_builder << representation->entity->id(); + IfcGeom::Representation::BRep* shape; IfcGeom::IfcRepresentationShapeItems shapes, shapes2; @@ -1098,6 +1102,17 @@ IfcGeom::BRepElement

* IfcGeom::Kernel::create_brep_for_representation_and_pro std::vector< std::vector > folded_layers; std::vector styles; if (convert_layerset(product, layers, styles, thickness)) { + + IfcSchema::IfcRelAssociates::list::ptr associations = product->HasAssociations(); + for (IfcSchema::IfcRelAssociates::list::it it = associations->begin(); it != associations->end(); ++it) { + IfcSchema::IfcRelAssociatesMaterial* associates_material = (**it).as(); + if (associates_material) { + unsigned layerset_id = associates_material->RelatingMaterial()->entity->id(); + representation_id_builder << "-layerset-" << layerset_id; + break; + } + } + if (product->as() && fold_layers(product->as(), shapes, layers, thickness, folded_layers)) { if (apply_folded_layerset(shapes, folded_layers, styles, shapes2)) { std::swap(shapes, shapes2); @@ -1136,6 +1151,11 @@ IfcGeom::BRepElement

* IfcGeom::Kernel::create_brep_for_representation_and_pro ElementSettings element_settings(settings, getValue(GV_LENGTH_UNIT), product_type); if (!settings.get(IfcGeom::IteratorSettings::DISABLE_OPENING_SUBTRACTIONS) && openings && openings->size()) { + representation_id_builder << "-openings"; + for (IfcSchema::IfcRelVoidsElement::list::it it = openings->begin(); it != openings->end(); ++it) { + representation_id_builder << "-" << (*it)->entity->id(); + } + IfcGeom::IfcRepresentationShapeItems opened_shapes; try { #if OCC_VERSION_HEX < 0x60900 @@ -1160,16 +1180,18 @@ IfcGeom::BRepElement

* IfcGeom::Kernel::create_brep_for_representation_and_pro it->prepend(trsf); } trsf = gp_Trsf(); + representation_id_builder << "-world-coords"; } - shape = new IfcGeom::Representation::BRep(element_settings, representation->entity->id(), opened_shapes); + shape = new IfcGeom::Representation::BRep(element_settings, representation_id_builder.str(), opened_shapes); } else if (settings.get(IteratorSettings::USE_WORLD_COORDS)) { for ( IfcGeom::IfcRepresentationShapeItems::iterator it = shapes.begin(); it != shapes.end(); ++ it ) { it->prepend(trsf); } trsf = gp_Trsf(); - shape = new IfcGeom::Representation::BRep(element_settings, representation->entity->id(), shapes); + representation_id_builder << "-world-coords"; + shape = new IfcGeom::Representation::BRep(element_settings, representation_id_builder.str(), shapes); } else { - shape = new IfcGeom::Representation::BRep(element_settings, representation->entity->id(), shapes); + shape = new IfcGeom::Representation::BRep(element_settings, representation_id_builder.str(), shapes); } std::string context_string = ""; diff --git a/src/ifcgeom/IfcGeomIterator.h b/src/ifcgeom/IfcGeomIterator.h index 308899d76d..f8cb45c983 100644 --- a/src/ifcgeom/IfcGeomIterator.h +++ b/src/ifcgeom/IfcGeomIterator.h @@ -340,6 +340,8 @@ namespace IfcGeom { std::set mapped_representations_processed; + bool geometry_reuse_ok_for_current_representation_; + BRepElement

* create_shape_model_for_next_entity() { for (;;) { IfcSchema::IfcRepresentation* representation; @@ -397,14 +399,14 @@ namespace IfcGeom { // With world coords enabled, object transformations are directly applied to // the BRep. There is no way to re-use the geometry for multiple products. - const bool process_maps_for_current_representation = !settings.get(IteratorSettings::USE_WORLD_COORDS) && + geometry_reuse_ok_for_current_representation_ = !settings.get(IteratorSettings::USE_WORLD_COORDS) && (!has_openings || settings.get(IteratorSettings::DISABLE_OPENING_SUBTRACTIONS)) && (!has_layers || !settings.get(IteratorSettings::APPLY_LAYERSETS)); bool representation_processed_as_mapped_item = false; IfcSchema::IfcRepresentation* representation_mapped_to = 0; - if (process_maps_for_current_representation) { + if (geometry_reuse_ok_for_current_representation_) { IfcSchema::IfcRepresentationItem::list::ptr items = representation->Items(); if (items->size() == 1) { IfcSchema::IfcRepresentationItem* item = *items->begin(); @@ -457,7 +459,7 @@ namespace IfcGeom { IfcSchema::IfcRepresentationMap::list::ptr maps = representation->RepresentationMap(); - if (process_maps_for_current_representation && maps->size() == 1) { + if (geometry_reuse_ok_for_current_representation_ && maps->size() == 1) { IfcSchema::IfcRepresentationMap* map = *maps->begin(); if (kernel.is_identity_transform(map->MappingOrigin())) { IfcSchema::IfcMappedItem::list::ptr items = map->MapUsage(); @@ -511,7 +513,7 @@ namespace IfcGeom { Logger::SetProduct(product); BRepElement

* element; - if (ifcproduct_iterator == ifcproducts->begin() || settings.get(IteratorSettings::USE_WORLD_COORDS)) { + if (ifcproduct_iterator == ifcproducts->begin() || !geometry_reuse_ok_for_current_representation_) { element = kernel.create_brep_for_representation_and_product

(settings, representation, product); } else { element = kernel.create_brep_for_processed_representation(settings, representation, product, current_shape_model); @@ -678,7 +680,7 @@ namespace IfcGeom { } } else if (!settings.get(IteratorSettings::DISABLE_TRIANGULATION)) { try { - if (ifcproduct_iterator == ifcproducts->begin() || settings.get(IteratorSettings::USE_WORLD_COORDS)) { + if (ifcproduct_iterator == ifcproducts->begin() || !geometry_reuse_ok_for_current_representation_) { next_triangulation = new TriangulationElement

(*next_shape_model); } else { next_triangulation = new TriangulationElement

(*next_shape_model, current_triangulation->geometry_pointer()); diff --git a/src/ifcgeom/IfcGeomRepresentation.cpp b/src/ifcgeom/IfcGeomRepresentation.cpp index c5ecc7623c..40130337af 100644 --- a/src/ifcgeom/IfcGeomRepresentation.cpp +++ b/src/ifcgeom/IfcGeomRepresentation.cpp @@ -29,7 +29,7 @@ IfcGeom::Representation::Serialization::Serialization(const BRep& brep) : Representation(brep.settings()) - , _id(brep.getId()) + , id_(brep.id()) { TopoDS_Compound compound; BRep_Builder builder; @@ -40,18 +40,18 @@ IfcGeom::Representation::Serialization::Serialization(const BRep& brep) if (it->hasStyle() && it->Style().Diffuse()) { const IfcGeom::SurfaceStyle::ColorComponent& clr = *it->Style().Diffuse(); - _surface_styles.push_back(clr.R()); - _surface_styles.push_back(clr.G()); - _surface_styles.push_back(clr.B()); + surface_styles_.push_back(clr.R()); + surface_styles_.push_back(clr.G()); + surface_styles_.push_back(clr.B()); } 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().Transparency()) { - _surface_styles.push_back(1. - *it->Style().Transparency()); + surface_styles_.push_back(1. - *it->Style().Transparency()); } else { - _surface_styles.push_back(1.); + surface_styles_.push_back(1.); } if (settings().get(IteratorSettings::CONVERT_BACK_UNITS)) { @@ -66,5 +66,5 @@ IfcGeom::Representation::Serialization::Serialization(const BRep& brep) } std::stringstream sstream; BRepTools::Write(compound,sstream); - _brep_data = sstream.str(); + brep_data_ = sstream.str(); } \ No newline at end of file diff --git a/src/ifcgeom/IfcGeomRepresentation.h b/src/ifcgeom/IfcGeomRepresentation.h index b8f29a11ef..01e1418530 100644 --- a/src/ifcgeom/IfcGeomRepresentation.h +++ b/src/ifcgeom/IfcGeomRepresentation.h @@ -46,45 +46,45 @@ namespace IfcGeom { Representation(const Representation&); //N/A Representation& operator =(const Representation&); //N/A protected: - const ElementSettings _settings; + const ElementSettings settings_; public: explicit Representation(const ElementSettings& settings) - : _settings(settings) + : settings_(settings) {} - const ElementSettings& settings() const { return _settings; } + const ElementSettings& settings() const { return settings_; } virtual ~Representation() {} }; class IFC_GEOM_API BRep : public Representation { private: - unsigned int id; - const IfcGeom::IfcRepresentationShapeItems _shapes; + std::string id_; + const IfcGeom::IfcRepresentationShapeItems shapes_; BRep(const BRep& other); BRep& operator=(const BRep& other); public: - BRep(const ElementSettings& settings, unsigned int id, const IfcGeom::IfcRepresentationShapeItems& shapes) + BRep(const ElementSettings& settings, const std::string& id, const IfcGeom::IfcRepresentationShapeItems& shapes) : Representation(settings) - , id(id) - , _shapes(shapes) + , id_(id) + , shapes_(shapes) {} virtual ~BRep() {} - IfcGeom::IfcRepresentationShapeItems::const_iterator begin() const { return _shapes.begin(); } - IfcGeom::IfcRepresentationShapeItems::const_iterator end() const { return _shapes.end(); } - const IfcGeom::IfcRepresentationShapeItems& shapes() const { return _shapes; } - const unsigned int& getId() const { return id; } + IfcGeom::IfcRepresentationShapeItems::const_iterator begin() const { return shapes_.begin(); } + IfcGeom::IfcRepresentationShapeItems::const_iterator end() const { return shapes_.end(); } + const IfcGeom::IfcRepresentationShapeItems& shapes() const { return shapes_; } + const std::string& id() const { return id_; } }; class IFC_GEOM_API Serialization : public Representation { private: - int _id; - std::string _brep_data; - std::vector _surface_styles; + std::string id_; + std::string brep_data_; + std::vector surface_styles_; public: - int id() const { return _id; } - const std::string& brep_data() const { return _brep_data; } - const std::vector& surface_styles() const { return _surface_styles; } + const std::string& brep_data() const { return brep_data_; } + const std::vector& surface_styles() const { return surface_styles_; } Serialization(const BRep& brep); virtual ~Serialization() {} + const std::string& id() const { return id_; } private: Serialization(); Serialization(const Serialization&); @@ -101,7 +101,7 @@ namespace IfcGeom { typedef std::map VertexKeyMap; typedef std::pair Edge; - int _id; + std::string id_; std::vector

_verts; std::vector _faces; std::vector _edges; @@ -112,7 +112,7 @@ namespace IfcGeom { VertexKeyMap welds; public: - int id() const { return _id; } + const std::string& id() const { return id_; } const std::vector

& verts() const { return _verts; } const std::vector& faces() const { return _faces; } const std::vector& edges() const { return _edges; } @@ -123,7 +123,7 @@ namespace IfcGeom { Triangulation(const BRep& shape_model) : Representation(shape_model.settings()) - , _id(shape_model.getId()) + , id_(shape_model.id()) { for ( IfcGeom::IfcRepresentationShapeItems::const_iterator iit = shape_model.begin(); iit != shape_model.end(); ++ iit ) {