_data; public: Matrix(const ElementSettings& settings, const gp_Trsf& trsf) { // Convert the gp_Trsf into a 4x3 Matrix // Note that in case the CONVERT_BACK_UNITS setting is enabled // the translation component of the matrix needs to be divided // by the magnitude of the IFC model length unit because // internally in IfcOpenShell everything is measured in meters. for(int i = 1; i < 5; ++i) { for (int j = 1; j < 4; ++j) { const double trsf_value = trsf.Value(j,i); const double matrix_value = i == 4 && settings.get(IteratorSettings::CONVERT_BACK_UNITS) ? trsf_value / settings.unit_magnitude() : trsf_value; _data.push_back(static_cast
(matrix_value)); } } } const std::vector
& data() const { return _data; }
};
template _matrix;
public:
Transformation(const ElementSettings& settings, const gp_Trsf& trsf)
: trsf(trsf)
, _matrix(settings, trsf)
{}
const gp_Trsf& data() const { return trsf; }
const Matrix & matrix() const { return _matrix; }
};
template _transformation;
IfcSchema::IfcProduct* product_;
const Element * _storey;
public:
int id() const { return _id; }
int parent_id() const { return _parent_id; }
const std::string& name() const { return _name; }
const std::string& type() const { return _type; }
const std::string& guid() const { return _guid; }
const std::string& context() const { return _context; }
const std::string& unique_id() const { return _unique_id; }
const Transformation & transformation() const { return _transformation; }
IfcSchema::IfcProduct* product() const { return product_; }
const Element * storey() const { return _storey; }
void SetFloor(const Element * floor) { _storey = floor; }
Element(const ElementSettings& settings, int id, int parent_id, const std::string& name, const std::string& type,
const std::string& guid, const std::string& context, const gp_Trsf& trsf, IfcSchema::IfcProduct *product)
: _id(id), _parent_id(parent_id), _name(name), _type(type), _guid(guid), _context(context), _transformation(settings, trsf)
, product_(product)
{
std::ostringstream oss;
oss << "product-" << IfcParse::IfcGlobalId(guid).formatted();
if (!_context.empty()) {
std::string ctx = _context;
std::transform(ctx.begin(), ctx.end(), ctx.begin(), ::tolower);
std::replace(ctx.begin(), ctx.end(), ' ', '-');
oss << "-" << ctx;
}
_unique_id = oss.str();
}
virtual ~Element() {}
};
template {
private:
boost::shared_ptr (geometry->settings(),id,parent_id,name,type,guid,context,trsf, product)
, _geometry(geometry)
{}
private:
BRepElement(const BRepElement& other);
BRepElement& operator=(const BRepElement& other);
};
template {
private:
boost::shared_ptr< Representation::Triangulation > _geometry;
public:
const Representation::Triangulation & geometry() const { return *_geometry; }
const boost::shared_ptr< Representation::Triangulation >& geometry_pointer() const { return _geometry; }
TriangulationElement(const BRepElement & shape_model)
: Element (shape_model)
, _geometry(boost::shared_ptr (shape_model.geometry())))
{}
TriangulationElement(const Element & element, const boost::shared_ptr (element)
, _geometry(geometry)
{}
private:
TriangulationElement(const TriangulationElement& other);
TriangulationElement& operator=(const TriangulationElement& other);
};
template {
private:
Representation::Serialization* _geometry;
public:
const Representation::Serialization& geometry() const { return *_geometry; }
SerializedElement(const BRepElement & shape_model)
: Element (shape_model)
, _geometry(new Representation::Serialization(shape_model.geometry()))
{}
virtual ~SerializedElement() {
delete _geometry;
}
private:
SerializedElement(const SerializedElement& other);
SerializedElement& operator=(const SerializedElement& other);
};
}
#endif