A limited attempt at some const correctness in the IfcGeomObjects interface

This commit is contained in:
Thomas Krijnen
2013-05-11 10:03:20 +00:00
parent 80bc1b5dab
commit dccbccfa06
8 changed files with 302 additions and 117 deletions
+2 -1
View File
@@ -270,7 +270,8 @@ void ColladaSerializer::writeHeader() {
} }
void ColladaSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject* o) { 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() { void ColladaSerializer::finalize() {
+1 -1
View File
@@ -237,7 +237,7 @@ int main(int argc, char** argv) {
geom_object = IfcGeomObjects::GetShapeModel(); 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) { for (std::string::iterator c = lowercase_type.begin(); c != lowercase_type.end(); ++c) {
*c = tolower(*c); *c = tolower(*c);
} }
+10 -2
View File
@@ -35,9 +35,17 @@ bool OpenCascadeBasedSerializer::ready() {
} }
void OpenCascadeBasedSerializer::writeShapeModel(const IfcGeomObjects::IfcGeomShapeModelObject* o) { 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(); 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(); const TopoDS_Shape& s = it->Shape();
bool trsf_valid = false; bool trsf_valid = false;
+10 -8
View File
@@ -64,18 +64,20 @@ void WaveFrontOBJSerializer::writeMaterial(const IfcGeom::SurfaceStyle& style) {
} }
} }
void WaveFrontOBJSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject* o) { 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 << "g " << name << std::endl;
obj_stream << "s 1" << std::endl; obj_stream << "s 1" << std::endl;
const IfcGeomObjects::IfcRepresentationTriangulation& mesh = o->mesh();
const int vcount = o->mesh->verts.size() / 3; const int vcount = mesh.verts().size() / 3;
for ( std::vector<float>::const_iterator it = o->mesh->verts.begin(); it != o->mesh->verts.end(); ) { for ( std::vector<float>::const_iterator it = mesh.verts().begin(); it != mesh.verts().end(); ) {
const double x = *(it++); const double x = *(it++);
const double y = *(it++); const double y = *(it++);
const double z = *(it++); const double z = *(it++);
obj_stream << "v " << x << " " << y << " " << z << std::endl; obj_stream << "v " << x << " " << y << " " << z << std::endl;
} }
for ( std::vector<float>::const_iterator it = o->mesh->normals.begin(); it != o->mesh->normals.end(); ) { for ( std::vector<float>::const_iterator it = mesh.normals().begin(); it != mesh.normals().end(); ) {
const double x = *(it++); const double x = *(it++);
const double y = *(it++); const double y = *(it++);
const double z = *(it++); const double z = *(it++);
@@ -83,17 +85,17 @@ void WaveFrontOBJSerializer::writeTesselated(const IfcGeomObjects::IfcGeomObject
} }
int previous_material_id = -2; int previous_material_id = -2;
std::vector<int>::const_iterator material_it = o->mesh->materials.begin(); std::vector<int>::const_iterator material_it = mesh.materials().begin();
for ( std::vector<int>::const_iterator it = o->mesh->faces.begin(); it != o->mesh->faces.end(); ) { for ( std::vector<int>::const_iterator it = mesh.faces().begin(); it != mesh.faces().end(); ) {
const int material_id = *(material_it++); const int material_id = *(material_it++);
if (material_id != previous_material_id) { if (material_id != previous_material_id) {
const IfcGeom::SurfaceStyle* material_style = 0; const IfcGeom::SurfaceStyle* material_style = 0;
if (material_id >= 0) { if (material_id >= 0) {
material_style = o->mesh->surface_styles[material_id]; material_style = mesh.surface_styles()[material_id];
} else { } 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(); const std::string material_name = material_style->Name();
obj_stream << "usemtl " << material_name << std::endl; obj_stream << "usemtl " << material_name << std::endl;
+59 -37
View File
@@ -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 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 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(); 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 ) { if ( weld_vertices ) {
const VertKey key = std::make_pair(material_index, std::make_pair(X, std::make_pair(Y, Z))); const VertKey key = std::make_pair(material_index, std::make_pair(X, std::make_pair(Y, Z)));
VertKeyMap::const_iterator it = welds.find(key); VertKeyMap::const_iterator it = welds.find(key);
@@ -65,9 +65,9 @@ int IfcGeomObjects::IfcRepresentationTriangulation::addvert(int material_index,
i = (int) welds.size(); i = (int) welds.size();
welds[key] = i; welds[key] = i;
} }
verts.push_back(X); _verts.push_back(X);
verts.push_back(Y); _verts.push_back(Y);
verts.push_back(Z); _verts.push_back(Z);
return i; return i;
} }
@@ -77,7 +77,7 @@ bool use_brep_data = false;
static IfcParse::IfcFile* ifc_file = 0; static IfcParse::IfcFile* ifc_file = 0;
IfcGeomObjects::IfcRepresentationBrepData::IfcRepresentationBrepData(const IfcRepresentationShapeModel& shapes) IfcGeomObjects::IfcRepresentationBrepData::IfcRepresentationBrepData(const IfcRepresentationShapeModel& shapes)
: id(shapes.getId()) : _id(shapes.getId())
{ {
try { try {
TopoDS_Compound compound; TopoDS_Compound compound;
@@ -98,25 +98,25 @@ IfcGeomObjects::IfcRepresentationBrepData::IfcRepresentationBrepData(const IfcRe
} }
std::stringstream sstream; std::stringstream sstream;
BRepTools::Write(compound,sstream); BRepTools::Write(compound,sstream);
brep_data = sstream.str(); _brep_data = sstream.str();
} catch(...) { } 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) IfcGeomObjects::IfcRepresentationTriangulation::IfcRepresentationTriangulation(const IfcRepresentationShapeModel& shapes)
: id(shapes.getId()) : _id(shapes.getId())
{ {
for ( IfcGeom::IfcRepresentationShapeItems::const_iterator it = shapes.begin(); it != shapes.end(); ++ it ) { for ( IfcGeom::IfcRepresentationShapeItems::const_iterator it = shapes.begin(); it != shapes.end(); ++ it ) {
int surface_style_id = -1; int surface_style_id = -1;
if (it->hasStyle()) { if (it->hasStyle()) {
std::vector<const IfcGeom::SurfaceStyle*>::const_iterator jt = std::find(surface_styles.begin(), surface_styles.end(), &it->Style()); std::vector<const IfcGeom::SurfaceStyle*>::const_iterator jt = std::find(_surface_styles.begin(), _surface_styles.end(), &it->Style());
if (jt == surface_styles.end()) { if (jt == _surface_styles.end()) {
surface_style_id = surface_styles.size(); surface_style_id = _surface_styles.size();
surface_styles.push_back(&it->Style()); _surface_styles.push_back(&it->Style());
} else { } 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); // BRepTools::Clean(s);
BRepMesh::Mesh(s, IfcGeom::GetValue(IfcGeom::GV_DEFLECTION_TOLERANCE)); BRepMesh::Mesh(s, IfcGeom::GetValue(IfcGeom::GV_DEFLECTION_TOLERANCE));
} catch(...) { } 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; continue;
} }
TopExp_Explorer exp; TopExp_Explorer exp;
@@ -169,9 +169,9 @@ IfcGeomObjects::IfcRepresentationTriangulation::IfcRepresentationTriangulation(c
gp_Vec normal_direction; gp_Vec normal_direction;
prop.Normal(uv.X(),uv.Y(),p,normal_direction); prop.Normal(uv.X(),uv.Y(),p,normal_direction);
gp_Dir normal = gp_Dir(normal_direction.XYZ() * rotation_matrix); gp_Dir normal = gp_Dir(normal_direction.XYZ() * rotation_matrix);
normals.push_back((float)normal.X()); _normals.push_back((float)normal.X());
normals.push_back((float)normal.Y()); _normals.push_back((float)normal.Y());
normals.push_back((float)normal.Z()); _normals.push_back((float)normal.Z());
} }
} }
@@ -191,23 +191,23 @@ IfcGeomObjects::IfcRepresentationTriangulation::IfcRepresentationTriangulation(c
const gp_XYZ v1 = pt2-pt1; const gp_XYZ v1 = pt2-pt1;
const gp_XYZ v2 = pt3-pt2; const gp_XYZ v2 = pt3-pt2;
gp_Dir normal = gp_Dir(v1^v2); gp_Dir normal = gp_Dir(v1^v2);
normals.push_back((float)normal.X()); _normals.push_back((float)normal.X());
normals.push_back((float)normal.Y()); _normals.push_back((float)normal.Y());
normals.push_back((float)normal.Z()); _normals.push_back((float)normal.Z());
*/ */
faces.push_back(dict[n1]); _faces.push_back(dict[n1]);
faces.push_back(dict[n2]); _faces.push_back(dict[n2]);
faces.push_back(dict[n3]); _faces.push_back(dict[n3]);
materials.push_back(surface_style_id); _materials.push_back(surface_style_id);
addedge(n1,n2,edgecount,edges_temp); addedge(n1,n2,edgecount,edges_temp);
addedge(n2,n3,edgecount,edges_temp); addedge(n2,n3,edgecount,edges_temp);
addedge(n3,n1,edgecount,edges_temp); addedge(n3,n1,edgecount,edges_temp);
} }
for ( std::vector<std::pair<int,int> >::const_iterator it = edges_temp.begin(); it != edges_temp.end(); ++it ) { for ( std::vector<std::pair<int,int> >::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& type,
const std::string& guid, const std::string& guid,
const gp_Trsf& trsf) const gp_Trsf& trsf)
: id(id) : _id(id)
, parent_id(parent_id) , _parent_id(parent_id)
, name(name) , _name(name)
, type(type) , _type(type)
, guid(guid) , _guid(guid)
, trsf(trsf)
{ {
// Convert the gp_Trsf into a 4x3 Matrix // Convert the gp_Trsf into a 4x3 Matrix
for( int i = 1; i < 5; ++ i ) for( int i = 1; i < 5; ++ i )
for ( int j = 1; j < 4; ++ j ) 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( IfcGeomObjects::IfcGeomShapeModelObject::IfcGeomShapeModelObject(
@@ -243,19 +242,19 @@ IfcGeomObjects::IfcGeomShapeModelObject::IfcGeomShapeModelObject(
const gp_Trsf& trsf, const gp_Trsf& trsf,
IfcRepresentationShapeModel* shapes) IfcRepresentationShapeModel* shapes)
: IfcObject(id,parent_id,name,type,guid,trsf) : IfcObject(id,parent_id,name,type,guid,trsf)
, mesh(shapes) , _mesh(shapes)
{} {}
IfcGeomObjects::IfcGeomBrepDataObject::IfcGeomBrepDataObject( IfcGeomObjects::IfcGeomBrepDataObject::IfcGeomBrepDataObject(
const IfcGeomShapeModelObject& shape_model) const IfcGeomShapeModelObject& shape_model)
: IfcObject(shape_model) : IfcObject(shape_model)
, mesh(new IfcRepresentationBrepData(*shape_model.mesh)) , _mesh(new IfcRepresentationBrepData(shape_model.mesh()))
{} {}
IfcGeomObjects::IfcGeomObject::IfcGeomObject( IfcGeomObjects::IfcGeomObject::IfcGeomObject(
const IfcGeomShapeModelObject& shape_model) const IfcGeomShapeModelObject& shape_model)
: IfcObject(shape_model) : IfcObject(shape_model)
, mesh(new IfcRepresentationTriangulation(*shape_model.mesh)) , _mesh(new IfcRepresentationTriangulation(shape_model.mesh()))
{} {}
// A container and iterator for IfcShapeRepresentations // A container and iterator for IfcShapeRepresentations
@@ -445,7 +444,7 @@ IfcGeomObjects::IfcGeomShapeModelObject* create_shape_model_for_next_entity() {
} }
trsf = gp_Trsf(); 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 ) { } else if ( use_world_coords ) {
for ( IfcGeom::IfcRepresentationShapeItems::iterator it = shapes.begin(); it != shapes.end(); ++ it ) { for ( IfcGeom::IfcRepresentationShapeItems::iterator it = shapes.begin(); it != shapes.end(); ++ it ) {
it->move(trsf); it->move(trsf);
@@ -698,10 +697,33 @@ void IfcGeomObjects::Settings(int setting, bool value) {
int IfcGeomObjects::Progress() { int IfcGeomObjects::Progress() {
return 100 * done / total; return 100 * done / total;
} }
std::string IfcGeomObjects::GetLog() {
const std::string IfcGeomObjects::GetLog() {
return Logger::GetLog(); return Logger::GetLog();
} }
IfcParse::IfcFile* IfcGeomObjects::GetFile() { IfcParse::IfcFile* IfcGeomObjects::GetFile() {
return ifc_file; 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<float>& IfcGeomObjects::IfcRepresentationTriangulation::verts() const { return _verts; }
const std::vector<int>& IfcGeomObjects::IfcRepresentationTriangulation::faces() const { return _faces; }
const std::vector<int>& IfcGeomObjects::IfcRepresentationTriangulation::edges() const { return _edges; }
const std::vector<float>& IfcGeomObjects::IfcRepresentationTriangulation::normals() const { return _normals; }
const std::vector<int>& IfcGeomObjects::IfcRepresentationTriangulation::materials() const { return _materials; }
const std::vector<const IfcGeom::SurfaceStyle*>& 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<float>& 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; }
+57 -31
View File
@@ -116,15 +116,13 @@ namespace IfcGeomObjects {
class IfcRepresentationShapeModel { class IfcRepresentationShapeModel {
private: private:
unsigned int id; unsigned int id;
bool owns_shapes;
const IfcGeom::IfcRepresentationShapeItems shapes; const IfcGeom::IfcRepresentationShapeItems shapes;
IfcRepresentationShapeModel(const IfcRepresentationShapeModel& other); IfcRepresentationShapeModel(const IfcRepresentationShapeModel& other);
IfcRepresentationShapeModel& operator=(const IfcRepresentationShapeModel& other); IfcRepresentationShapeModel& operator=(const IfcRepresentationShapeModel& other);
public: public:
IfcRepresentationShapeModel(unsigned int id, const IfcGeom::IfcRepresentationShapeItems& shapes, bool owns_shapes = false) IfcRepresentationShapeModel(unsigned int id, const IfcGeom::IfcRepresentationShapeItems& shapes)
: id(id) : id(id)
, shapes(shapes) , shapes(shapes)
, owns_shapes(owns_shapes)
{} {}
virtual ~IfcRepresentationShapeModel() {} virtual ~IfcRepresentationShapeModel() {}
IfcGeom::IfcRepresentationShapeItems::const_iterator begin() const { return shapes.begin(); } IfcGeom::IfcRepresentationShapeItems::const_iterator begin() const { return shapes.begin(); }
@@ -133,24 +131,38 @@ namespace IfcGeomObjects {
}; };
class IfcRepresentationBrepData { class IfcRepresentationBrepData {
private:
int _id;
std::string _brep_data;
public: public:
int id; int id() const;
std::string brep_data; const std::string& brep_data() const;
IfcRepresentationBrepData(const IfcRepresentationShapeModel& s); IfcRepresentationBrepData(const IfcRepresentationShapeModel& s);
virtual ~IfcRepresentationBrepData() {} virtual ~IfcRepresentationBrepData() {}
private:
IfcRepresentationBrepData();
IfcRepresentationBrepData(const IfcRepresentationBrepData&);
IfcRepresentationBrepData& operator=(const IfcRepresentationBrepData&);
}; };
class IfcRepresentationTriangulation { class IfcRepresentationTriangulation {
public: private:
int id; int _id;
std::vector<float> verts; std::vector<float> _verts;
std::vector<int> faces; std::vector<int> _faces;
std::vector<int> edges; std::vector<int> _edges;
std::vector<float> normals; std::vector<float> _normals;
std::vector<int> materials; std::vector<int> _materials;
std::vector<const IfcGeom::SurfaceStyle*> surface_styles; std::vector<const IfcGeom::SurfaceStyle*> _surface_styles;
VertKeyMap welds; VertKeyMap welds;
public:
int id() const;
const std::vector<float>& verts() const;
const std::vector<int>& faces() const;
const std::vector<int>& edges() const;
const std::vector<float>& normals() const;
const std::vector<int>& materials() const;
const std::vector<const IfcGeom::SurfaceStyle*>& surface_styles() const;
IfcRepresentationTriangulation(const IfcRepresentationShapeModel& s); IfcRepresentationTriangulation(const IfcRepresentationShapeModel& s);
virtual ~IfcRepresentationTriangulation() {} virtual ~IfcRepresentationTriangulation() {}
private: private:
@@ -160,41 +172,53 @@ namespace IfcGeomObjects {
if ( edgecount.find(e) == edgecount.end() ) edgecount[e] = 1; if ( edgecount.find(e) == edgecount.end() ) edgecount[e] = 1;
else edgecount[e] ++; else edgecount[e] ++;
edges_temp.push_back(e); edges_temp.push_back(e);
} }
IfcRepresentationTriangulation();
IfcRepresentationTriangulation(const IfcRepresentationTriangulation&);
IfcRepresentationTriangulation& operator=(const IfcRepresentationTriangulation&);
}; };
class IfcObject { class IfcObject {
private:
int _id;
int _parent_id;
std::string _name;
std::string _type;
std::string _guid;
std::vector<float> _matrix;
public: public:
int id; int id() const;
int parent_id; int parent_id() const;
std::string name; const std::string& name() const;
std::string type; const std::string& type() const;
std::string guid; const std::string& guid() const;
std::vector<float> matrix; const std::vector<float>& matrix() const;
gp_Trsf trsf;
IfcObject(int id, int parent_id, const std::string& name, const std::string& type, const std::string& guid, const gp_Trsf& trsf); IfcObject(int id, int parent_id, const std::string& name, const std::string& type, const std::string& guid, const gp_Trsf& trsf);
virtual ~IfcObject() {} virtual ~IfcObject() {}
}; };
class IfcGeomShapeModelObject : public IfcObject { class IfcGeomShapeModelObject : public IfcObject {
private:
IfcRepresentationShapeModel* _mesh;
public: 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); 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() { virtual ~IfcGeomShapeModelObject() {
delete mesh; delete _mesh;
} }
private: private:
IfcGeomShapeModelObject(const IfcGeomShapeModelObject& other); IfcGeomShapeModelObject(const IfcGeomShapeModelObject& other);
IfcGeomShapeModelObject& operator=(const IfcGeomShapeModelObject& other); IfcGeomShapeModelObject& operator=(const IfcGeomShapeModelObject& other);
}; };
class IfcGeomObject : public IfcObject { class IfcGeomObject : public IfcObject {
private:
IfcRepresentationTriangulation* _mesh;
public: public:
IfcRepresentationTriangulation* mesh; const IfcRepresentationTriangulation& mesh() const;
IfcGeomObject(const IfcGeomShapeModelObject& shape_model); IfcGeomObject(const IfcGeomShapeModelObject& shape_model);
virtual ~IfcGeomObject() { virtual ~IfcGeomObject() {
delete mesh; delete _mesh;
} }
private: private:
IfcGeomObject(const IfcGeomObject& other); IfcGeomObject(const IfcGeomObject& other);
@@ -202,11 +226,13 @@ namespace IfcGeomObjects {
}; };
class IfcGeomBrepDataObject : public IfcObject { class IfcGeomBrepDataObject : public IfcObject {
private:
IfcRepresentationBrepData* _mesh;
public: public:
IfcRepresentationBrepData* mesh; const IfcRepresentationBrepData& mesh() const;
IfcGeomBrepDataObject(const IfcGeomShapeModelObject& shape_model); IfcGeomBrepDataObject(const IfcGeomShapeModelObject& shape_model);
virtual ~IfcGeomBrepDataObject() { virtual ~IfcGeomBrepDataObject() {
delete mesh; delete _mesh;
} }
private: private:
IfcGeomBrepDataObject(const IfcGeomBrepDataObject& other); IfcGeomBrepDataObject(const IfcGeomBrepDataObject& other);
@@ -229,7 +255,7 @@ namespace IfcGeomObjects {
bool Next(); bool Next();
int Progress(); int Progress();
std::string GetLog(); const std::string GetLog();
IfcParse::IfcFile* GetFile(); IfcParse::IfcFile* GetFile();
bool CleanUp(); bool CleanUp();
+73 -17
View File
@@ -1,20 +1,20 @@
/******************************************************************************** /********************************************************************************
* * * *
* This file is part of IfcOpenShell. * * This file is part of IfcOpenShell. *
* * * *
* IfcOpenShell is free software: you can redistribute it and/or modify * * 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 * * 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 * * the Free Software Foundation, either version 3.0 of the License, or *
* (at your option) any later version. * * (at your option) any later version. *
* * * *
* IfcOpenShell is distributed in the hope that it will be useful, * * IfcOpenShell is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of * * but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* Lesser GNU General Public License for more details. * * Lesser GNU General Public License for more details. *
* * * *
* You should have received a copy of the Lesser GNU General Public License * * You should have received a copy of the Lesser GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. * * along with this program. If not, see <http://www.gnu.org/licenses/>. *
* * * *
********************************************************************************/ ********************************************************************************/
%include "std_vector.i" %include "std_vector.i"
@@ -24,11 +24,67 @@
%module IfcImport %{ %module IfcImport %{
#include "Interface.h" #include "Interface.h"
using namespace IfcGeom;
using namespace IfcGeomObjects; 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 { namespace std {
%template(IntVector) vector<int>; %template(IntVector) vector<int>;
%template(FloatVector) vector<float>; %template(FloatVector) vector<float>;
%template(ObjVector) vector<IfcGeomObject>;
}; };
+90 -20
View File
@@ -17,6 +17,11 @@
* * * *
********************************************************************************/ ********************************************************************************/
namespace IfcGeom {
class SurfaceStyle {
};
}
namespace IfcGeomObjects { namespace IfcGeomObjects {
const int WELD_VERTICES = 1; const int WELD_VERTICES = 1;
@@ -28,37 +33,102 @@ namespace IfcGeomObjects {
const int FORCE_CCW_FACE_ORIENTATION = 7; const int FORCE_CCW_FACE_ORIENTATION = 7;
const int DISABLE_OPENING_SUBTRACTIONS = 8; const int DISABLE_OPENING_SUBTRACTIONS = 8;
class IfcMesh { class IfcRepresentationTriangulation {
private:
int _id;
std::vector<float> _verts;
std::vector<int> _faces;
std::vector<int> _edges;
std::vector<float> _normals;
std::vector<int> _materials;
std::vector<const IfcGeom::SurfaceStyle*> _surface_styles;
IfcRepresentationTriangulation();
IfcRepresentationTriangulation(const IfcRepresentationTriangulation&);
IfcRepresentationTriangulation& operator=(const IfcRepresentationTriangulation&);
virtual ~IfcRepresentationTriangulation();
public: public:
int id; int id() const;
std::vector<float> verts; const std::vector<float>& verts() const;
std::vector<int> faces; const std::vector<int>& faces() const;
std::vector<int> edges; const std::vector<int>& edges() const;
std::vector<float> normals; const std::vector<float>& normals() const;
std::string brep_data; const std::vector<int>& 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 { class IfcObject {
private:
int _id;
int _parent_id;
std::string _name;
std::string _type;
std::string _guid;
std::vector<float> _matrix;
IfcObject();
IfcObject(const IfcObject& other);
IfcObject& operator=(const IfcObject& other);
virtual ~IfcObject() {}
public: public:
int id; int id() const;
int parent_id; int parent_id() const;
std::string name; const std::string& name() const;
std::string type; const std::string& type() const;
std::string guid; const std::string& guid() const;
std::vector<float> matrix; const std::vector<float>& matrix() const;
}; };
class IfcGeomObject : public IfcObject { class IfcGeomObject : public IfcObject {
private:
IfcRepresentationTriangulation* _mesh;
IfcGeomObject();
IfcGeomObject(const IfcGeomObject& other);
IfcGeomObject& operator=(const IfcGeomObject& other);
virtual ~IfcGeomObject();
public: 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); 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); const IfcObject* GetObject(int id);
bool CleanUp();
std::string GetLog(); bool Next();
int Progress();
const std::string GetLog();
bool CleanUp();
}; };