Schema agnostic iterator

This commit is contained in:
Thomas Krijnen
2017-12-20 11:10:27 +01:00
parent f4463d2935
commit 830a03ffcd
10 changed files with 168 additions and 18 deletions
+1 -1
View File
@@ -41,7 +41,7 @@
#pragma GCC diagnostic pop
#endif
#include "../ifcgeom/IfcGeomIterator.h"
#include "../iterator/IfcGeomIterator.h"
#include "../ifcconvert/GeometrySerializer.h"
+2 -1
View File
@@ -27,7 +27,8 @@ typedef float real_t;
#endif
#include "../ifcconvert/Serializer.h"
#include "../ifcgeom/IfcGeomIterator.h"
#include "../iterator/IfcGeomIterator.h"
#include "../ifcgeom/IfcGeomElement.h"
class SerializerSettings : public IfcGeom::IteratorSettings
{
+1 -1
View File
@@ -33,7 +33,7 @@
#include "../ifcconvert/XmlSerializer.h"
#include "../ifcconvert/SvgSerializer.h"
#include "../ifcgeom/IfcGeomIterator.h"
#include "../iterator/IfcGeomIterator.h"
#include <IGESControl_Controller.hxx>
#include <Standard_Version.hxx>
+1 -1
View File
@@ -20,7 +20,7 @@
#ifndef OPENCASCADEBASEDSERIALIZER_H
#define OPENCASCADEBASEDSERIALIZER_H
#include "../ifcgeom/IfcGeomIterator.h"
#include "../iterator/IfcGeomIterator.h"
#include "../ifcconvert/GeometrySerializer.h"
+1 -1
View File
@@ -23,7 +23,7 @@
#include <STEPControl_Writer.hxx>
#include <Interface_Static.hxx>
#include "../ifcgeom/IfcGeomIterator.h"
#include "../iterator/IfcGeomIterator.h"
#include "../ifcconvert/OpenCascadeBasedSerializer.h"
@@ -17,13 +17,13 @@ void MAKE_INIT_FN(IteratorImplementation_)() {
static const std::string schema_name = TOSTRING(IfcSchema);
struct {
IteratorImplementation<float>* operator()(const IfcGeom::IteratorSettings& settings, IfcParse::IfcFile* file) const {
IfcGeom::IteratorImplementation<float>* operator()(const IfcGeom::IteratorSettings& settings, IfcParse::IfcFile* file) const {
return new IfcGeom::MAKE_TYPE_NAME(IteratorImplementation_)<float>(settings, file);
}
} factory_float;
struct {
IteratorImplementation<double>* operator()(const IfcGeom::IteratorSettings& settings, IfcParse::IfcFile* file) const {
IfcGeom::IteratorImplementation<double>* operator()(const IfcGeom::IteratorSettings& settings, IfcParse::IfcFile* file) const {
return new IfcGeom::MAKE_TYPE_NAME(IteratorImplementation_)<double>(settings, file);
}
} factory_double;
+4 -4
View File
@@ -337,7 +337,7 @@ namespace IfcGeom {
std::string getLog() const { return Logger::GetLog(); }
IfcParse::IfcFile* getFile() const { return ifc_file; }
IfcParse::IfcFile* file() const { return ifc_file; }
const std::vector<IfcGeom::filter_t>& filters() const { return filters_; }
std::vector<IfcGeom::filter_t>& filters() { return filters_; }
@@ -536,7 +536,7 @@ namespace IfcGeom {
// get the parent
try {
parent_object = getObject(ret->parent_id());
parent_object = get_object(ret->parent_id());
} catch (const std::exception& e) {
Logger::Error(e);
hasParent = false;
@@ -550,7 +550,7 @@ namespace IfcGeom {
{
// Find the next parent
try {
parent_object = getObject(parent_object->parent_id());
parent_object = get_object(parent_object->parent_id());
} catch (const std::exception& e) {
Logger::Error(e);
hasParent = false;
@@ -577,7 +577,7 @@ namespace IfcGeom {
return current_shape_model;
}
const Element<P>* getObject(int id) {
const Element<P>* get_object(int id) {
gp_Trsf trsf;
int parent_id = -1;
std::string instance_type, product_name, product_guid;
+115
View File
@@ -0,0 +1,115 @@
/********************************************************************************
* *
* 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 <http://www.gnu.org/licenses/>. *
* *
********************************************************************************/
/********************************************************************************
* *
* Geometrical data in an IFC file consists of shapes (IfcShapeRepresentation) *
* and instances (SUBTYPE OF IfcBuildingElement e.g. IfcWindow). *
* *
* IfcGeom::Representation::Triangulation is a class that represents a *
* triangulated IfcShapeRepresentation. *
* Triangulation.verts is a 1 dimensional vector of float defining the *
* cartesian coordinates of the vertices of the triangulated shape in the *
* format of [x1,y1,z1,..,xn,yn,zn] *
* Triangulation.faces is a 1 dimensional vector of int containing the *
* indices of the triangles referencing positions in Triangulation.verts *
* Triangulation.edges is a 1 dimensional vector of int in {0,1} that dictates*
* the visibility of the edges that span the faces in Triangulation.faces *
* *
* IfcGeom::Element represents the actual IfcBuildingElements. *
* IfcGeomObject.name is the GUID of the element *
* IfcGeomObject.type is the datatype of the element e.g. IfcWindow *
* IfcGeomObject.mesh is a pointer to an IfcMesh *
* IfcGeomObject.transformation.matrix is a 4x3 matrix that defines the *
* orientation and translation of the mesh in relation to the world origin *
* *
* IfcGeom::Iterator::initialize() *
* finds the most suitable representation contexts. Returns true iff *
* at least a single representation will process successfully *
* *
* IfcGeom::Iterator::get() *
* returns a pointer to the current IfcGeom::Element *
* *
* IfcGeom::Iterator::next() *
* returns true iff a following entity is available for a successive call to *
* IfcGeom::Iterator::get() *
* *
* IfcGeom::Iterator::progress() *
* returns an int in [0..100] that indicates the overall progress *
* *
********************************************************************************/
#ifndef IFCGEOMITERATOR_H
#define IFCGEOMITERATOR_H
#include "../iterator/IteratorImplementation.h"
// The infamous min & max Win32 #defines can leak here from OCE depending on the build configuration
#ifdef min
#undef min
#endif
#ifdef max
#undef max
#endif
namespace IfcGeom {
template <typename P>
class Iterator {
private:
Iterator(const Iterator&); // N/I
Iterator& operator=(const Iterator&); // N/I
IfcParse::IfcFile* file_;
IfcGeom::IteratorSettings settings_;
IteratorImplementation* implementation_;
public:
Iterator(const IfcGeom::IteratorSettings& settings, IfcParse::IfcFile* file)
: file_(file)
, settings_(settings)
{
implementation_ = iterator_implementations().construct(file_->schema()->name());
}
bool initialize() {
return implementation_->initialize();
}
int progress() const { return implementation_->progress(); }
std::string& unit_name() const { return implementation_->getUnitName(); }
double unit_magnitude() const { return implementation_->getUnitMagnitude(); }
IfcParse::IfcFile* file() const { return implementation_->getFile(); }
IfcUtil::IfcBaseClass* next() const { return implementation_->next(); }
Element<P>* get() { return implementation_->get(); }
BRepElement<P>* get_native() { return implementation_->get_native(); }
const Element<P>* get_object(int id) { return implementation_->get_object(id); }
IfcUtil::IfcBaseClass* create() { return implementation_->create(); }
};
}
#endif
+11
View File
@@ -22,5 +22,16 @@ void IteratorFactoryImplementation<P>::bind(const std::string& schema_name, type
this->insert(std::make_pair(schema_name, fn));
}
template <class P>
IfcGeom::IteratorImplementation<P>* IteratorFactoryImplementation<P>::construct(const std::string& schema_name, const IfcGeom::IteratorSettings& settings, IfcParse::IfcFile* file) {
std::map<std::string, typename get_factory_type<P>::type>::const_iterator it;
it = this->find(schema_name);
if (it == end()) {
throw IfcParse::IfcException("No geometry iterator registered for " + schema_name);
}
return it->second(settings, file);
}
template IteratorFactoryImplementation<float>;
template IteratorFactoryImplementation<double>;
+30 -7
View File
@@ -9,11 +9,19 @@
#include <map>
#include <string>
template <typename P>
class IteratorImplementation;
namespace IfcGeom {
template <typename P>
class IteratorImplementation;
typedef boost::function2<IteratorImplementation<float>*, const IfcGeom::IteratorSettings&, IfcParse::IfcFile*> iterator_float_fn;
typedef boost::function2<IteratorImplementation<double>*, const IfcGeom::IteratorSettings&, IfcParse::IfcFile*> iterator_double_fn;
template <typename P>
class Element;
template <typename P>
class BRepElement;
}
typedef boost::function2<IfcGeom::IteratorImplementation<float>*, const IfcGeom::IteratorSettings&, IfcParse::IfcFile*> iterator_float_fn;
typedef boost::function2<IfcGeom::IteratorImplementation<double>*, const IfcGeom::IteratorSettings&, IfcParse::IfcFile*> iterator_double_fn;
template <typename P>
struct get_factory_type {};
@@ -33,6 +41,7 @@ class IteratorFactoryImplementation : public std::map<std::string, typename get_
public:
IteratorFactoryImplementation();
void bind(const std::string& schema_name, typename get_factory_type<P>::type fn);
IfcGeom::IteratorImplementation<P>* construct(const std::string& schema_name, const IfcGeom::IteratorSettings&, IfcParse::IfcFile*);
};
template <typename P>
@@ -46,9 +55,23 @@ public:
}
};
template <typename T>
class IteratorImplementation {
namespace IfcGeom {
};
template <typename P>
class IteratorImplementation {
public:
virtual bool initialize() = 0;
virtual int progress() const = 0;
virtual const std::string& getUnitName() const = 0;
virtual double getUnitMagnitude() const = 0;
virtual IfcParse::IfcFile* file() const = 0;
virtual IfcUtil::IfcBaseClass* next() = 0;
virtual Element<P>* get() = 0;
virtual BRepElement<P>* get_native() = 0;
virtual const Element<P>* get_object(int id) = 0;
virtual IfcUtil::IfcBaseClass* create() = 0;
};
}
#endif