From dccbccfa06f38c844635785fd4668b81dd6466e4 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sat, 11 May 2013 10:03:20 +0000 Subject: [PATCH] A limited attempt at some const correctness in the IfcGeomObjects interface --- src/ifcconvert/ColladaSerializer.cpp | 3 +- src/ifcconvert/IfcConvert.cpp | 2 +- src/ifcconvert/OpenCascadeBasedSerializer.cpp | 12 +- src/ifcconvert/WavefrontObjSerializer.cpp | 18 +-- src/ifcgeom/IfcGeomObjects.cpp | 96 +++++++++------ src/ifcgeom/IfcGeomObjects.h | 88 +++++++++----- src/ifcwrap/IfcPython.i | 90 +++++++++++--- src/ifcwrap/Interface.h | 110 ++++++++++++++---- 8 files changed, 302 insertions(+), 117 deletions(-) diff --git a/src/ifcconvert/ColladaSerializer.cpp b/src/ifcconvert/ColladaSerializer.cpp index aaea6f75a2..3e29fc18ff 100644 --- a/src/ifcconvert/ColladaSerializer.cpp +++ b/src/ifcconvert/ColladaSerializer.cpp @@ -270,7 +270,8 @@ void ColladaSerializer::writeHeader() { } void ColladaSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject* o) { - exporter.writeTesselated(o->guid, o->name, o->type, o->id, o->matrix, o->mesh->verts, o->mesh->normals, o->mesh->faces, o->mesh->materials, o->mesh->surface_styles); + const IfcGeomObjects::IfcRepresentationTriangulation& mesh = o->mesh(); + exporter.writeTesselated(o->guid(), o->name(), o->type(), o->id(), o->matrix(), mesh.verts(), mesh.normals(), mesh.faces(), mesh.materials(), mesh.surface_styles()); } void ColladaSerializer::finalize() { diff --git a/src/ifcconvert/IfcConvert.cpp b/src/ifcconvert/IfcConvert.cpp index 51ff85587d..c5542f9fc3 100644 --- a/src/ifcconvert/IfcConvert.cpp +++ b/src/ifcconvert/IfcConvert.cpp @@ -237,7 +237,7 @@ int main(int argc, char** argv) { geom_object = IfcGeomObjects::GetShapeModel(); } - std::string lowercase_type = geom_object->type; + std::string lowercase_type = geom_object->type(); for (std::string::iterator c = lowercase_type.begin(); c != lowercase_type.end(); ++c) { *c = tolower(*c); } diff --git a/src/ifcconvert/OpenCascadeBasedSerializer.cpp b/src/ifcconvert/OpenCascadeBasedSerializer.cpp index d7248b0632..fe8ca86176 100644 --- a/src/ifcconvert/OpenCascadeBasedSerializer.cpp +++ b/src/ifcconvert/OpenCascadeBasedSerializer.cpp @@ -35,9 +35,17 @@ bool OpenCascadeBasedSerializer::ready() { } void OpenCascadeBasedSerializer::writeShapeModel(const IfcGeomObjects::IfcGeomShapeModelObject* o) { - for (IfcGeom::IfcRepresentationShapeItems::const_iterator it = o->mesh->begin(); it != o->mesh->end(); ++ it) { + for (IfcGeom::IfcRepresentationShapeItems::const_iterator it = o->mesh().begin(); it != o->mesh().end(); ++ it) { gp_GTrsf gtrsf = it->Placement(); - gtrsf.PreMultiply(o->trsf); + + // TODO: + gp_GTrsf o_trsf; + int k = 0; + for( int i = 1; i < 5; ++ i ) + for ( int j = 1; j < 4; ++ j ) + o_trsf.SetValue(j, i, o->matrix()[k++]); + + gtrsf.PreMultiply(o_trsf); const TopoDS_Shape& s = it->Shape(); bool trsf_valid = false; diff --git a/src/ifcconvert/WavefrontObjSerializer.cpp b/src/ifcconvert/WavefrontObjSerializer.cpp index 1a5b5a417c..6d56610db1 100644 --- a/src/ifcconvert/WavefrontObjSerializer.cpp +++ b/src/ifcconvert/WavefrontObjSerializer.cpp @@ -64,18 +64,20 @@ void WaveFrontOBJSerializer::writeMaterial(const IfcGeom::SurfaceStyle& style) { } } void WaveFrontOBJSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject* o) { - const std::string name = o->name.empty() ? o->guid : o->name; + const std::string name = o->name().empty() ? o->guid() : o->name(); obj_stream << "g " << name << std::endl; obj_stream << "s 1" << std::endl; + + const IfcGeomObjects::IfcRepresentationTriangulation& mesh = o->mesh(); - const int vcount = o->mesh->verts.size() / 3; - for ( std::vector::const_iterator it = o->mesh->verts.begin(); it != o->mesh->verts.end(); ) { + const int vcount = mesh.verts().size() / 3; + for ( std::vector::const_iterator it = mesh.verts().begin(); it != mesh.verts().end(); ) { const double x = *(it++); const double y = *(it++); const double z = *(it++); obj_stream << "v " << x << " " << y << " " << z << std::endl; } - for ( std::vector::const_iterator it = o->mesh->normals.begin(); it != o->mesh->normals.end(); ) { + for ( std::vector::const_iterator it = mesh.normals().begin(); it != mesh.normals().end(); ) { const double x = *(it++); const double y = *(it++); const double z = *(it++); @@ -83,17 +85,17 @@ void WaveFrontOBJSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject } int previous_material_id = -2; - std::vector::const_iterator material_it = o->mesh->materials.begin(); + std::vector::const_iterator material_it = mesh.materials().begin(); - for ( std::vector::const_iterator it = o->mesh->faces.begin(); it != o->mesh->faces.end(); ) { + for ( std::vector::const_iterator it = mesh.faces().begin(); it != mesh.faces().end(); ) { const int material_id = *(material_it++); if (material_id != previous_material_id) { const IfcGeom::SurfaceStyle* material_style = 0; if (material_id >= 0) { - material_style = o->mesh->surface_styles[material_id]; + material_style = mesh.surface_styles()[material_id]; } else { - material_style = IfcGeom::get_default_style(o->type); + material_style = IfcGeom::get_default_style(o->type()); } const std::string material_name = material_style->Name(); obj_stream << "usemtl " << material_name << std::endl; diff --git a/src/ifcgeom/IfcGeomObjects.cpp b/src/ifcgeom/IfcGeomObjects.cpp index b9aca028cc..c20ee6a309 100644 --- a/src/ifcgeom/IfcGeomObjects.cpp +++ b/src/ifcgeom/IfcGeomObjects.cpp @@ -57,7 +57,7 @@ int IfcGeomObjects::IfcRepresentationTriangulation::addvert(int material_index, const float X = convert_back_units ? (float) (p.X() / IfcGeom::GetValue(IfcGeom::GV_LENGTH_UNIT)) : (float)p.X(); const float Y = convert_back_units ? (float) (p.Y() / IfcGeom::GetValue(IfcGeom::GV_LENGTH_UNIT)) : (float)p.Y(); const float Z = convert_back_units ? (float) (p.Z() / IfcGeom::GetValue(IfcGeom::GV_LENGTH_UNIT)) : (float)p.Z(); - int i = (int) verts.size() / 3; + int i = (int) _verts.size() / 3; if ( weld_vertices ) { const VertKey key = std::make_pair(material_index, std::make_pair(X, std::make_pair(Y, Z))); VertKeyMap::const_iterator it = welds.find(key); @@ -65,9 +65,9 @@ int IfcGeomObjects::IfcRepresentationTriangulation::addvert(int material_index, i = (int) welds.size(); welds[key] = i; } - verts.push_back(X); - verts.push_back(Y); - verts.push_back(Z); + _verts.push_back(X); + _verts.push_back(Y); + _verts.push_back(Z); return i; } @@ -77,7 +77,7 @@ bool use_brep_data = false; static IfcParse::IfcFile* ifc_file = 0; IfcGeomObjects::IfcRepresentationBrepData::IfcRepresentationBrepData(const IfcRepresentationShapeModel& shapes) - : id(shapes.getId()) + : _id(shapes.getId()) { try { TopoDS_Compound compound; @@ -98,25 +98,25 @@ IfcGeomObjects::IfcRepresentationBrepData::IfcRepresentationBrepData(const IfcRe } std::stringstream sstream; BRepTools::Write(compound,sstream); - brep_data = sstream.str(); + _brep_data = sstream.str(); } catch(...) { - Logger::Message(Logger::LOG_ERROR,"Failed to serialize shape:",ifc_file->EntityById(id)->entity); + Logger::Message(Logger::LOG_ERROR,"Failed to serialize shape:",ifc_file->EntityById(_id)->entity); } } IfcGeomObjects::IfcRepresentationTriangulation::IfcRepresentationTriangulation(const IfcRepresentationShapeModel& shapes) - : id(shapes.getId()) + : _id(shapes.getId()) { for ( IfcGeom::IfcRepresentationShapeItems::const_iterator it = shapes.begin(); it != shapes.end(); ++ it ) { int surface_style_id = -1; if (it->hasStyle()) { - std::vector::const_iterator jt = std::find(surface_styles.begin(), surface_styles.end(), &it->Style()); - if (jt == surface_styles.end()) { - surface_style_id = surface_styles.size(); - surface_styles.push_back(&it->Style()); + std::vector::const_iterator jt = std::find(_surface_styles.begin(), _surface_styles.end(), &it->Style()); + if (jt == _surface_styles.end()) { + surface_style_id = _surface_styles.size(); + _surface_styles.push_back(&it->Style()); } else { - surface_style_id = jt - surface_styles.begin(); + surface_style_id = jt - _surface_styles.begin(); } } @@ -128,7 +128,7 @@ IfcGeomObjects::IfcRepresentationTriangulation::IfcRepresentationTriangulation(c // BRepTools::Clean(s); BRepMesh::Mesh(s, IfcGeom::GetValue(IfcGeom::GV_DEFLECTION_TOLERANCE)); } catch(...) { - Logger::Message(Logger::LOG_ERROR,"Failed to triangulate shape:",ifc_file->EntityById(id)->entity); + Logger::Message(Logger::LOG_ERROR,"Failed to triangulate shape:",ifc_file->EntityById(_id)->entity); continue; } TopExp_Explorer exp; @@ -169,9 +169,9 @@ IfcGeomObjects::IfcRepresentationTriangulation::IfcRepresentationTriangulation(c gp_Vec normal_direction; prop.Normal(uv.X(),uv.Y(),p,normal_direction); gp_Dir normal = gp_Dir(normal_direction.XYZ() * rotation_matrix); - normals.push_back((float)normal.X()); - normals.push_back((float)normal.Y()); - normals.push_back((float)normal.Z()); + _normals.push_back((float)normal.X()); + _normals.push_back((float)normal.Y()); + _normals.push_back((float)normal.Z()); } } @@ -191,23 +191,23 @@ IfcGeomObjects::IfcRepresentationTriangulation::IfcRepresentationTriangulation(c const gp_XYZ v1 = pt2-pt1; const gp_XYZ v2 = pt3-pt2; gp_Dir normal = gp_Dir(v1^v2); - normals.push_back((float)normal.X()); - normals.push_back((float)normal.Y()); - normals.push_back((float)normal.Z()); + _normals.push_back((float)normal.X()); + _normals.push_back((float)normal.Y()); + _normals.push_back((float)normal.Z()); */ - faces.push_back(dict[n1]); - faces.push_back(dict[n2]); - faces.push_back(dict[n3]); + _faces.push_back(dict[n1]); + _faces.push_back(dict[n2]); + _faces.push_back(dict[n3]); - materials.push_back(surface_style_id); + _materials.push_back(surface_style_id); addedge(n1,n2,edgecount,edges_temp); addedge(n2,n3,edgecount,edges_temp); addedge(n3,n1,edgecount,edges_temp); } for ( std::vector >::const_iterator it = edges_temp.begin(); it != edges_temp.end(); ++it ) { - edges.push_back(edgecount[*it]==1); + _edges.push_back(edgecount[*it]==1); } } } @@ -221,17 +221,16 @@ IfcGeomObjects::IfcObject::IfcObject( const std::string& type, const std::string& guid, const gp_Trsf& trsf) - : id(id) - , parent_id(parent_id) - , name(name) - , type(type) - , guid(guid) - , trsf(trsf) + : _id(id) + , _parent_id(parent_id) + , _name(name) + , _type(type) + , _guid(guid) { // Convert the gp_Trsf into a 4x3 Matrix for( int i = 1; i < 5; ++ i ) for ( int j = 1; j < 4; ++ j ) - matrix.push_back((float)trsf.Value(j,i)); + _matrix.push_back((float)trsf.Value(j,i)); } IfcGeomObjects::IfcGeomShapeModelObject::IfcGeomShapeModelObject( @@ -243,19 +242,19 @@ IfcGeomObjects::IfcGeomShapeModelObject::IfcGeomShapeModelObject( const gp_Trsf& trsf, IfcRepresentationShapeModel* shapes) : IfcObject(id,parent_id,name,type,guid,trsf) - , mesh(shapes) + , _mesh(shapes) {} IfcGeomObjects::IfcGeomBrepDataObject::IfcGeomBrepDataObject( const IfcGeomShapeModelObject& shape_model) : IfcObject(shape_model) - , mesh(new IfcRepresentationBrepData(*shape_model.mesh)) + , _mesh(new IfcRepresentationBrepData(shape_model.mesh())) {} IfcGeomObjects::IfcGeomObject::IfcGeomObject( const IfcGeomShapeModelObject& shape_model) : IfcObject(shape_model) - , mesh(new IfcRepresentationTriangulation(*shape_model.mesh)) + , _mesh(new IfcRepresentationTriangulation(shape_model.mesh())) {} // A container and iterator for IfcShapeRepresentations @@ -445,7 +444,7 @@ IfcGeomObjects::IfcGeomShapeModelObject* create_shape_model_for_next_entity() { } trsf = gp_Trsf(); } - shape = new IfcGeomObjects::IfcRepresentationShapeModel(shaperep->entity->id(),opened_shapes,true); + shape = new IfcGeomObjects::IfcRepresentationShapeModel(shaperep->entity->id(),opened_shapes); } else if ( use_world_coords ) { for ( IfcGeom::IfcRepresentationShapeItems::iterator it = shapes.begin(); it != shapes.end(); ++ it ) { it->move(trsf); @@ -698,10 +697,33 @@ void IfcGeomObjects::Settings(int setting, bool value) { int IfcGeomObjects::Progress() { return 100 * done / total; } -std::string IfcGeomObjects::GetLog() { + +const std::string IfcGeomObjects::GetLog() { return Logger::GetLog(); } IfcParse::IfcFile* IfcGeomObjects::GetFile() { return ifc_file; } + +int IfcGeomObjects::IfcRepresentationBrepData::id() const { return _id; } +const std::string& IfcGeomObjects::IfcRepresentationBrepData::brep_data() const { return _brep_data; } + +int IfcGeomObjects::IfcRepresentationTriangulation::id() const { return _id; } +const std::vector& IfcGeomObjects::IfcRepresentationTriangulation::verts() const { return _verts; } +const std::vector& IfcGeomObjects::IfcRepresentationTriangulation::faces() const { return _faces; } +const std::vector& IfcGeomObjects::IfcRepresentationTriangulation::edges() const { return _edges; } +const std::vector& IfcGeomObjects::IfcRepresentationTriangulation::normals() const { return _normals; } +const std::vector& IfcGeomObjects::IfcRepresentationTriangulation::materials() const { return _materials; } +const std::vector& IfcGeomObjects::IfcRepresentationTriangulation::surface_styles() const { return _surface_styles; } + +int IfcGeomObjects::IfcObject::id() const { return _id; } +int IfcGeomObjects::IfcObject::parent_id() const { return _parent_id; } +const std::string& IfcGeomObjects::IfcObject::name() const { return _name; } +const std::string& IfcGeomObjects::IfcObject::type() const { return _type; } +const std::string& IfcGeomObjects::IfcObject::guid() const { return _guid; } +const std::vector& IfcGeomObjects::IfcObject::matrix() const { return _matrix; } + +const IfcGeomObjects::IfcRepresentationShapeModel& IfcGeomObjects::IfcGeomShapeModelObject::mesh() const { return *_mesh; } +const IfcGeomObjects::IfcRepresentationTriangulation& IfcGeomObjects::IfcGeomObject::mesh() const { return *_mesh; } +const IfcGeomObjects::IfcRepresentationBrepData& IfcGeomObjects::IfcGeomBrepDataObject::mesh() const { return *_mesh; } diff --git a/src/ifcgeom/IfcGeomObjects.h b/src/ifcgeom/IfcGeomObjects.h index f0f48dc0e7..722994f580 100644 --- a/src/ifcgeom/IfcGeomObjects.h +++ b/src/ifcgeom/IfcGeomObjects.h @@ -116,15 +116,13 @@ namespace IfcGeomObjects { class IfcRepresentationShapeModel { private: unsigned int id; - bool owns_shapes; const IfcGeom::IfcRepresentationShapeItems shapes; IfcRepresentationShapeModel(const IfcRepresentationShapeModel& other); IfcRepresentationShapeModel& operator=(const IfcRepresentationShapeModel& other); public: - IfcRepresentationShapeModel(unsigned int id, const IfcGeom::IfcRepresentationShapeItems& shapes, bool owns_shapes = false) + IfcRepresentationShapeModel(unsigned int id, const IfcGeom::IfcRepresentationShapeItems& shapes) : id(id) , shapes(shapes) - , owns_shapes(owns_shapes) {} virtual ~IfcRepresentationShapeModel() {} IfcGeom::IfcRepresentationShapeItems::const_iterator begin() const { return shapes.begin(); } @@ -133,24 +131,38 @@ namespace IfcGeomObjects { }; class IfcRepresentationBrepData { + private: + int _id; + std::string _brep_data; public: - int id; - std::string brep_data; + int id() const; + const std::string& brep_data() const; IfcRepresentationBrepData(const IfcRepresentationShapeModel& s); virtual ~IfcRepresentationBrepData() {} + private: + IfcRepresentationBrepData(); + IfcRepresentationBrepData(const IfcRepresentationBrepData&); + IfcRepresentationBrepData& operator=(const IfcRepresentationBrepData&); }; class IfcRepresentationTriangulation { - public: - int id; - std::vector verts; - std::vector faces; - std::vector edges; - std::vector normals; - std::vector materials; - std::vector surface_styles; + private: + int _id; + std::vector _verts; + std::vector _faces; + std::vector _edges; + std::vector _normals; + std::vector _materials; + std::vector _surface_styles; VertKeyMap welds; - + public: + int id() const; + const std::vector& verts() const; + const std::vector& faces() const; + const std::vector& edges() const; + const std::vector& normals() const; + const std::vector& materials() const; + const std::vector& surface_styles() const; IfcRepresentationTriangulation(const IfcRepresentationShapeModel& s); virtual ~IfcRepresentationTriangulation() {} private: @@ -160,41 +172,53 @@ namespace IfcGeomObjects { if ( edgecount.find(e) == edgecount.end() ) edgecount[e] = 1; else edgecount[e] ++; edges_temp.push_back(e); - } + } + IfcRepresentationTriangulation(); + IfcRepresentationTriangulation(const IfcRepresentationTriangulation&); + IfcRepresentationTriangulation& operator=(const IfcRepresentationTriangulation&); }; class IfcObject { + private: + int _id; + int _parent_id; + std::string _name; + std::string _type; + std::string _guid; + std::vector _matrix; public: - int id; - int parent_id; - std::string name; - std::string type; - std::string guid; - std::vector matrix; - gp_Trsf trsf; + int id() const; + int parent_id() const; + const std::string& name() const; + const std::string& type() const; + const std::string& guid() const; + const std::vector& matrix() const; IfcObject(int id, int parent_id, const std::string& name, const std::string& type, const std::string& guid, const gp_Trsf& trsf); virtual ~IfcObject() {} }; class IfcGeomShapeModelObject : public IfcObject { + private: + IfcRepresentationShapeModel* _mesh; public: - IfcRepresentationShapeModel* mesh; + const IfcRepresentationShapeModel& mesh() const; IfcGeomShapeModelObject(int id, int parent_id, const std::string& name, const std::string& type, const std::string& guid, const gp_Trsf& trsf, IfcRepresentationShapeModel* mesh); virtual ~IfcGeomShapeModelObject() { - delete mesh; + delete _mesh; } private: IfcGeomShapeModelObject(const IfcGeomShapeModelObject& other); - IfcGeomShapeModelObject& operator=(const IfcGeomShapeModelObject& other); - + IfcGeomShapeModelObject& operator=(const IfcGeomShapeModelObject& other); }; class IfcGeomObject : public IfcObject { + private: + IfcRepresentationTriangulation* _mesh; public: - IfcRepresentationTriangulation* mesh; + const IfcRepresentationTriangulation& mesh() const; IfcGeomObject(const IfcGeomShapeModelObject& shape_model); virtual ~IfcGeomObject() { - delete mesh; + delete _mesh; } private: IfcGeomObject(const IfcGeomObject& other); @@ -202,11 +226,13 @@ namespace IfcGeomObjects { }; class IfcGeomBrepDataObject : public IfcObject { + private: + IfcRepresentationBrepData* _mesh; public: - IfcRepresentationBrepData* mesh; + const IfcRepresentationBrepData& mesh() const; IfcGeomBrepDataObject(const IfcGeomShapeModelObject& shape_model); virtual ~IfcGeomBrepDataObject() { - delete mesh; + delete _mesh; } private: IfcGeomBrepDataObject(const IfcGeomBrepDataObject& other); @@ -229,7 +255,7 @@ namespace IfcGeomObjects { bool Next(); int Progress(); - std::string GetLog(); + const std::string GetLog(); IfcParse::IfcFile* GetFile(); bool CleanUp(); diff --git a/src/ifcwrap/IfcPython.i b/src/ifcwrap/IfcPython.i index 3510e9cf91..ebe33c4212 100644 --- a/src/ifcwrap/IfcPython.i +++ b/src/ifcwrap/IfcPython.i @@ -1,20 +1,20 @@ /******************************************************************************** - * * - * This file is part of IfcOpenShell. * - * * - * IfcOpenShell is free software: you can redistribute it and/or modify * + * * + * 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. * - * * + * 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 . * - * * + * along with this program. If not, see . * + * * ********************************************************************************/ %include "std_vector.i" @@ -24,11 +24,67 @@ %module IfcImport %{ #include "Interface.h" + using namespace IfcGeom; using namespace IfcGeomObjects; %} +%extend IfcGeomObjects::IfcRepresentationTriangulation { + %pythoncode %{ + if _newclass: + # Hide the getters with read-only property implementations + id = property(id) + verts = property(verts) + faces = property(faces) + edges = property(edges) + normals = property(normals) + materials = property(materials) + def __repr__(self): return "RepresentationTriangulation #%d"%self.id + %} +}; + +%extend IfcGeomObjects::IfcRepresentationBrepData { + %pythoncode %{ + if _newclass: + # Hide the getters with read-only property implementations + id = property(id) + brep_data = property(brep_data) + def __repr__(self): return "RepresentationBrepData #%d"%self.id + %} +}; + +%extend IfcGeomObjects::IfcObject { + %pythoncode %{ + if _newclass: + # Hide the getters with read-only property implementations + id = property(id) + parent_id = property(parent_id) + name = property(name) + type = property(type) + guid = property(guid) + matrix = property(matrix) + def __repr__(self): return "Object #%d"%self.id + %} +}; + +%extend IfcGeomObjects::IfcGeomObject { + %pythoncode %{ + if _newclass: + # Hide the getters with read-only property implementations + mesh = property(mesh) + def __repr__(self): return "GeomObject #%d"%self.id + %} +}; + +%extend IfcGeomObjects::IfcGeomBrepDataObject { + %pythoncode %{ + if _newclass: + # Hide the getters with read-only property implementations + mesh = property(mesh) + def __repr__(self): return "GeomBrepDataObject #%d"%self.id + %} +}; + namespace std { - %template(IntVector) vector; - %template(FloatVector) vector; - %template(ObjVector) vector; + %template(IntVector) vector; + %template(FloatVector) vector; }; \ No newline at end of file diff --git a/src/ifcwrap/Interface.h b/src/ifcwrap/Interface.h index dc2592ab5a..c7a2e61f89 100644 --- a/src/ifcwrap/Interface.h +++ b/src/ifcwrap/Interface.h @@ -17,6 +17,11 @@ * * ********************************************************************************/ +namespace IfcGeom { + class SurfaceStyle { + }; +} + namespace IfcGeomObjects { const int WELD_VERTICES = 1; @@ -28,37 +33,102 @@ namespace IfcGeomObjects { const int FORCE_CCW_FACE_ORIENTATION = 7; const int DISABLE_OPENING_SUBTRACTIONS = 8; - class IfcMesh { + class IfcRepresentationTriangulation { + private: + int _id; + std::vector _verts; + std::vector _faces; + std::vector _edges; + std::vector _normals; + std::vector _materials; + std::vector _surface_styles; + + IfcRepresentationTriangulation(); + IfcRepresentationTriangulation(const IfcRepresentationTriangulation&); + IfcRepresentationTriangulation& operator=(const IfcRepresentationTriangulation&); + virtual ~IfcRepresentationTriangulation(); public: - int id; - std::vector verts; - std::vector faces; - std::vector edges; - std::vector normals; - std::string brep_data; + int id() const; + const std::vector& verts() const; + const std::vector& faces() const; + const std::vector& edges() const; + const std::vector& normals() const; + const std::vector& materials() const; + }; + + class IfcRepresentationBrepData { + private: + int _id; + std::string _brep_data; + + IfcRepresentationBrepData(); + IfcRepresentationBrepData(const IfcRepresentationBrepData&); + IfcRepresentationBrepData& operator=(const IfcRepresentationBrepData&); + virtual ~IfcRepresentationBrepData(); + public: + int id() const; + const std::string& brep_data() const; }; class IfcObject { + private: + int _id; + int _parent_id; + std::string _name; + std::string _type; + std::string _guid; + std::vector _matrix; + + IfcObject(); + IfcObject(const IfcObject& other); + IfcObject& operator=(const IfcObject& other); + virtual ~IfcObject() {} public: - int id; - int parent_id; - std::string name; - std::string type; - std::string guid; - std::vector matrix; + int id() const; + int parent_id() const; + const std::string& name() const; + const std::string& type() const; + const std::string& guid() const; + const std::vector& matrix() const; }; class IfcGeomObject : public IfcObject { + private: + IfcRepresentationTriangulation* _mesh; + + IfcGeomObject(); + IfcGeomObject(const IfcGeomObject& other); + IfcGeomObject& operator=(const IfcGeomObject& other); + virtual ~IfcGeomObject(); public: - IfcMesh* mesh; + const IfcRepresentationTriangulation& mesh() const; + }; + + class IfcGeomBrepDataObject : public IfcObject { + private: + IfcRepresentationBrepData* _mesh; + + IfcGeomBrepDataObject(); + IfcGeomBrepDataObject(const IfcGeomBrepDataObject& other); + IfcGeomBrepDataObject& operator=(const IfcGeomBrepDataObject& other); + virtual ~IfcGeomBrepDataObject(); + public: + const IfcRepresentationBrepData& mesh() const; }; - bool Next(); - const IfcGeomObject* Get(); - bool Init(const std::string fn); void Settings(int setting, bool value); - int Progress(); + + bool Init(const std::string fn); + + const IfcGeomObject* Get(); + const IfcGeomBrepDataObject* GetBrepData(); + const IfcObject* GetObject(int id); - bool CleanUp(); - std::string GetLog(); + + bool Next(); + + int Progress(); + + const std::string GetLog(); + bool CleanUp(); }; \ No newline at end of file