ifcwrap: use swig shadowing for keeping reference to Element

This commit is contained in:
Andrej730
2026-07-24 21:50:10 +05:00
parent 9001cca078
commit 2f1b2f9638
+16 -25
View File
@@ -256,6 +256,22 @@ namespace {
%include "../ifcgeom/Converter.h" %include "../ifcgeom/Converter.h"
%include "../ifcgeom/ConversionResult.h" %include "../ifcgeom/ConversionResult.h"
%include "../ifcgeom/ConversionSettings.h" %include "../ifcgeom/ConversionSettings.h"
// Keep the owning element alive while its geometry is referenced (#1124).
%define GEOMETRY_WITH_BACKREF(cls)
%feature("shadow") cls::geometry %{
@property
def geometry(self):
result = $action(self)
result._parent = self
return result
%}
%enddef
GEOMETRY_WITH_BACKREF(IfcGeom::TriangulationElement)
GEOMETRY_WITH_BACKREF(IfcGeom::SerializedElement)
GEOMETRY_WITH_BACKREF(IfcGeom::BRepElement)
%include "../ifcgeom/IfcGeomElement.h" %include "../ifcgeom/IfcGeomElement.h"
%include "../ifcgeom/IfcGeomRepresentation.h" %include "../ifcgeom/IfcGeomRepresentation.h"
%include "../ifcgeom/Iterator.h" %include "../ifcgeom/Iterator.h"
@@ -793,27 +809,9 @@ struct ShapeRTTI : public boost::static_visitor<PyObject*>
}; };
%extend IfcGeom::TriangulationElement { %extend IfcGeom::TriangulationElement {
%pythoncode %{
# Hide the getters with read-only property implementations
# Keep the owning element alive while its geometry is referenced (#1124).
def geometry_with_backref(self, _f=geometry):
result = _f(self)
result._parent = self
return result
geometry = property(geometry_with_backref)
%}
}; };
%extend IfcGeom::SerializedElement { %extend IfcGeom::SerializedElement {
%pythoncode %{
# Hide the getters with read-only property implementations
# Keep the owning element alive while its geometry is referenced (#1124).
def geometry_with_backref(self, _f=geometry):
result = _f(self)
result._parent = self
return result
geometry = property(geometry_with_backref)
%}
}; };
%extend IfcGeom::BRepElement { %extend IfcGeom::BRepElement {
@@ -836,13 +834,6 @@ struct ShapeRTTI : public boost::static_visitor<PyObject*>
} }
%pythoncode %{ %pythoncode %{
# Hide the getters with read-only property implementations
# Keep the owning element alive while its geometry is referenced (#1124).
def geometry_with_backref(self, _f=geometry):
result = _f(self)
result._parent = self
return result
geometry = property(geometry_with_backref)
volume = property(calc_volume_) volume = property(calc_volume_)
surface_area = property(calc_surface_area_) surface_area = property(calc_surface_area_)
%} %}