mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-12 06:32:09 +00:00
Schema agnostic iterator
This commit is contained in:
@@ -41,7 +41,7 @@
|
|||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../ifcgeom/IfcGeomIterator.h"
|
#include "../iterator/IfcGeomIterator.h"
|
||||||
|
|
||||||
#include "../ifcconvert/GeometrySerializer.h"
|
#include "../ifcconvert/GeometrySerializer.h"
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ typedef float real_t;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../ifcconvert/Serializer.h"
|
#include "../ifcconvert/Serializer.h"
|
||||||
#include "../ifcgeom/IfcGeomIterator.h"
|
#include "../iterator/IfcGeomIterator.h"
|
||||||
|
#include "../ifcgeom/IfcGeomElement.h"
|
||||||
|
|
||||||
class SerializerSettings : public IfcGeom::IteratorSettings
|
class SerializerSettings : public IfcGeom::IteratorSettings
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
#include "../ifcconvert/XmlSerializer.h"
|
#include "../ifcconvert/XmlSerializer.h"
|
||||||
#include "../ifcconvert/SvgSerializer.h"
|
#include "../ifcconvert/SvgSerializer.h"
|
||||||
|
|
||||||
#include "../ifcgeom/IfcGeomIterator.h"
|
#include "../iterator/IfcGeomIterator.h"
|
||||||
|
|
||||||
#include <IGESControl_Controller.hxx>
|
#include <IGESControl_Controller.hxx>
|
||||||
#include <Standard_Version.hxx>
|
#include <Standard_Version.hxx>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
#ifndef OPENCASCADEBASEDSERIALIZER_H
|
#ifndef OPENCASCADEBASEDSERIALIZER_H
|
||||||
#define OPENCASCADEBASEDSERIALIZER_H
|
#define OPENCASCADEBASEDSERIALIZER_H
|
||||||
|
|
||||||
#include "../ifcgeom/IfcGeomIterator.h"
|
#include "../iterator/IfcGeomIterator.h"
|
||||||
|
|
||||||
#include "../ifcconvert/GeometrySerializer.h"
|
#include "../ifcconvert/GeometrySerializer.h"
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#include <STEPControl_Writer.hxx>
|
#include <STEPControl_Writer.hxx>
|
||||||
#include <Interface_Static.hxx>
|
#include <Interface_Static.hxx>
|
||||||
|
|
||||||
#include "../ifcgeom/IfcGeomIterator.h"
|
#include "../iterator/IfcGeomIterator.h"
|
||||||
|
|
||||||
#include "../ifcconvert/OpenCascadeBasedSerializer.h"
|
#include "../ifcconvert/OpenCascadeBasedSerializer.h"
|
||||||
|
|
||||||
|
|||||||
@@ -17,13 +17,13 @@ void MAKE_INIT_FN(IteratorImplementation_)() {
|
|||||||
static const std::string schema_name = TOSTRING(IfcSchema);
|
static const std::string schema_name = TOSTRING(IfcSchema);
|
||||||
|
|
||||||
struct {
|
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);
|
return new IfcGeom::MAKE_TYPE_NAME(IteratorImplementation_)<float>(settings, file);
|
||||||
}
|
}
|
||||||
} factory_float;
|
} factory_float;
|
||||||
|
|
||||||
struct {
|
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);
|
return new IfcGeom::MAKE_TYPE_NAME(IteratorImplementation_)<double>(settings, file);
|
||||||
}
|
}
|
||||||
} factory_double;
|
} factory_double;
|
||||||
|
|||||||
@@ -337,7 +337,7 @@ namespace IfcGeom {
|
|||||||
|
|
||||||
std::string getLog() const { return Logger::GetLog(); }
|
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_; }
|
const std::vector<IfcGeom::filter_t>& filters() const { return filters_; }
|
||||||
std::vector<IfcGeom::filter_t>& filters() { return filters_; }
|
std::vector<IfcGeom::filter_t>& filters() { return filters_; }
|
||||||
@@ -536,7 +536,7 @@ namespace IfcGeom {
|
|||||||
|
|
||||||
// get the parent
|
// get the parent
|
||||||
try {
|
try {
|
||||||
parent_object = getObject(ret->parent_id());
|
parent_object = get_object(ret->parent_id());
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
Logger::Error(e);
|
Logger::Error(e);
|
||||||
hasParent = false;
|
hasParent = false;
|
||||||
@@ -550,7 +550,7 @@ namespace IfcGeom {
|
|||||||
{
|
{
|
||||||
// Find the next parent
|
// Find the next parent
|
||||||
try {
|
try {
|
||||||
parent_object = getObject(parent_object->parent_id());
|
parent_object = get_object(parent_object->parent_id());
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
Logger::Error(e);
|
Logger::Error(e);
|
||||||
hasParent = false;
|
hasParent = false;
|
||||||
@@ -577,7 +577,7 @@ namespace IfcGeom {
|
|||||||
return current_shape_model;
|
return current_shape_model;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Element<P>* getObject(int id) {
|
const Element<P>* get_object(int id) {
|
||||||
gp_Trsf trsf;
|
gp_Trsf trsf;
|
||||||
int parent_id = -1;
|
int parent_id = -1;
|
||||||
std::string instance_type, product_name, product_guid;
|
std::string instance_type, product_name, product_guid;
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -22,5 +22,16 @@ void IteratorFactoryImplementation<P>::bind(const std::string& schema_name, type
|
|||||||
this->insert(std::make_pair(schema_name, fn));
|
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<float>;
|
||||||
template IteratorFactoryImplementation<double>;
|
template IteratorFactoryImplementation<double>;
|
||||||
|
|||||||
@@ -9,11 +9,19 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
template <typename P>
|
namespace IfcGeom {
|
||||||
class IteratorImplementation;
|
template <typename P>
|
||||||
|
class IteratorImplementation;
|
||||||
|
|
||||||
typedef boost::function2<IteratorImplementation<float>*, const IfcGeom::IteratorSettings&, IfcParse::IfcFile*> iterator_float_fn;
|
template <typename P>
|
||||||
typedef boost::function2<IteratorImplementation<double>*, const IfcGeom::IteratorSettings&, IfcParse::IfcFile*> iterator_double_fn;
|
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>
|
template <typename P>
|
||||||
struct get_factory_type {};
|
struct get_factory_type {};
|
||||||
@@ -33,6 +41,7 @@ class IteratorFactoryImplementation : public std::map<std::string, typename get_
|
|||||||
public:
|
public:
|
||||||
IteratorFactoryImplementation();
|
IteratorFactoryImplementation();
|
||||||
void bind(const std::string& schema_name, typename get_factory_type<P>::type fn);
|
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>
|
template <typename P>
|
||||||
@@ -46,9 +55,23 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
namespace IfcGeom {
|
||||||
class IteratorImplementation {
|
|
||||||
|
|
||||||
};
|
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
|
#endif
|
||||||
Reference in New Issue
Block a user