diff --git a/src/ifcwrap/IfcGeomWrapper.i b/src/ifcwrap/IfcGeomWrapper.i index 1e37fb9819..81de00aacd 100644 --- a/src/ifcwrap/IfcGeomWrapper.i +++ b/src/ifcwrap/IfcGeomWrapper.i @@ -58,6 +58,14 @@ } } +%inline %{ +template +std::pair vector_to_buffer(const T& t) { + using V = typename std::remove_reference::type; + return { reinterpret_cast(t.data()), t.size() * sizeof(V::value_type) }; +} +%} + %include "../ifcgeom_schema_agnostic/ifc_geom_api.h" %include "../ifcgeom_schema_agnostic/IfcGeomIteratorSettings.h" %include "../ifcgeom_schema_agnostic/IfcGeomElement.h" @@ -234,6 +242,31 @@ struct ShapeRTTI : public boost::static_visitor %} %extend IfcGeom::Representation::Triangulation { + + std::pair faces_buffer() const { + return vector_to_buffer(self->faces()); + } + + std::pair edges_buffer() const { + return vector_to_buffer(self->edges()); + } + + std::pair material_ids_buffer() const { + return vector_to_buffer(self->material_ids()); + } + + std::pair item_ids_buffer() const { + return vector_to_buffer(self->item_ids()); + } + + std::pair verts_buffer() const { + return vector_to_buffer(self->verts()); + } + + std::pair normals_buffer() const { + return vector_to_buffer(self->normals()); + } + %pythoncode %{ # Hide the getters with read-only property implementations id = property(id) @@ -242,16 +275,16 @@ struct ShapeRTTI : public boost::static_visitor material_ids = property(material_ids) materials = property(materials) item_ids = property(item_ids) - %} -}; - -// Specialized accessors follow later, for otherwise property definitions -// would appear before templated getter functions are defined. -%extend IfcGeom::Representation::Triangulation { - %pythoncode %{ # Hide the getters with read-only property implementations verts = property(verts) normals = property(normals) + + faces_buffer = property(faces_buffer) + edges_buffer = property(edges_buffer) + material_ids_buffer = property(material_ids_buffer) + item_ids_buffer = property(item_ids_buffer) + verts_buffer = property(verts_buffer) + normals = property(normals) %} }; @@ -266,6 +299,9 @@ struct ShapeRTTI : public boost::static_visitor }; %extend IfcGeom::Element { + std::pair transformation_buffer() const { + return vector_to_buffer(self->transformation().matrix().data()); + } IfcUtil::IfcBaseClass* product_() const { return $self->product(); @@ -282,6 +318,7 @@ struct ShapeRTTI : public boost::static_visitor unique_id = property(unique_id) transformation = property(transformation) product = property(product_) + transformation_buffer = property(transformation_buffer) %} }; diff --git a/src/ifcwrap/utils/typemaps_out.i b/src/ifcwrap/utils/typemaps_out.i index 757ad932dd..2b2d82fd27 100644 --- a/src/ifcwrap/utils/typemaps_out.i +++ b/src/ifcwrap/utils/typemaps_out.i @@ -146,3 +146,7 @@ CREATE_VECTOR_TYPEMAP_OUT(IfcParse::attribute const *) CREATE_VECTOR_TYPEMAP_OUT(IfcParse::inverse_attribute const *) CREATE_VECTOR_TYPEMAP_OUT(IfcParse::entity const *) CREATE_VECTOR_TYPEMAP_OUT(IfcParse::declaration const *) + +%typemap(out) std::pair { + $result = PyBytes_FromStringAndSize($1.first, $1.second); +}