diff --git a/src/ifcopenshell-python/ifcopenshell/geom/main.py b/src/ifcopenshell-python/ifcopenshell/geom/main.py index 32fcaae008..34c206bd97 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/main.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/main.py @@ -23,6 +23,7 @@ from __future__ import print_function import os import sys +import operator from .. import ifcopenshell_wrapper from ..file import file @@ -86,12 +87,30 @@ class iterator(_iterator): # Couldn't get the typemaps properly applied using %extend so we # replicate the SWIG-generated __init__ call on the output of a # free function. - # @todo verify this works with SWIG 4 - self.this = ifcopenshell_wrapper.\ - construct_iterator_double_precision_with_include_exclude( + # @todo verify this works with SWIG 4 + + include_or_exclude = include if exclude is None else exclude + include_or_exclude_type = set(x.__class__.__name__ for x in include_or_exclude) + print(include_or_exclude_type) + + if include_or_exclude_type == {"entity_instance"}: + if not all(inst.is_a("IfcProduct") for inst in include_or_exclude): + raise ValueError("include and exclude need to be an aggregate of IfcProduct") + + initializer = ifcopenshell_wrapper.\ + construct_iterator_double_precision_with_include_exclude_globalid + + decode_unicode = lambda x: x.encode('ascii') if x.__class__.__name__ == "unicode" else x + include_or_exclude = list(map(decode_unicode, map(operator.attrgetter('GlobalId'), include_or_exclude))) + else: + initializer = ifcopenshell_wrapper.\ + construct_iterator_double_precision_with_include_exclude + + import pdb; pdb.set_trace() + self.this = initializer( self.settings, file_or_filename, - include if exclude is None else exclude, + include_or_exclude, include is not None, num_threads) else: diff --git a/src/ifcwrap/IfcGeomWrapper.i b/src/ifcwrap/IfcGeomWrapper.i index 5bc968dab6..e81e055597 100644 --- a/src/ifcwrap/IfcGeomWrapper.i +++ b/src/ifcwrap/IfcGeomWrapper.i @@ -171,6 +171,16 @@ struct ShapeRTTI : public boost::static_visitor return new IfcGeom::Iterator(settings, file, {ef}, num_threads); } + template + IfcGeom::Iterator* construct_iterator_with_include_exclude_globalid_(IfcGeom::IteratorSettings settings, IfcParse::IfcFile* file, std::vector elems, bool include, int num_threads) { + std::set elems_set(elems.begin(), elems.end()); + IfcGeom::attribute_filter af; + af.attribute_name = "GlobalId"; + af.populate(elems_set); + af.include = include; + return new IfcGeom::Iterator(settings, file, {af}, num_threads); + } + IfcGeom::Iterator* construct_iterator_single_precision_with_include_exclude(IfcGeom::IteratorSettings settings, IfcParse::IfcFile* file, std::vector elems, bool include, int num_threads) { return construct_iterator_with_include_exclude_(settings, file, elems, include, num_threads); } @@ -178,11 +188,21 @@ struct ShapeRTTI : public boost::static_visitor IfcGeom::Iterator* construct_iterator_double_precision_with_include_exclude(IfcGeom::IteratorSettings settings, IfcParse::IfcFile* file, std::vector elems, bool include, int num_threads) { return construct_iterator_with_include_exclude_(settings, file, elems, include, num_threads); } + + IfcGeom::Iterator* construct_iterator_single_precision_with_include_exclude_globalid(IfcGeom::IteratorSettings settings, IfcParse::IfcFile* file, std::vector elems, bool include, int num_threads) { + return construct_iterator_with_include_exclude_globalid_(settings, file, elems, include, num_threads); + } + + IfcGeom::Iterator* construct_iterator_double_precision_with_include_exclude_globalid(IfcGeom::IteratorSettings settings, IfcParse::IfcFile* file, std::vector elems, bool include, int num_threads) { + return construct_iterator_with_include_exclude_globalid_(settings, file, elems, include, num_threads); + } %} %ignore construct_iterator_with_include_exclude_; %newobject construct_iterator_single_precision_with_include_exclude; %newobject construct_iterator_double_precision_with_include_exclude; +%newobject construct_iterator_single_precision_with_include_exclude_globalid; +%newobject construct_iterator_double_precision_with_include_exclude_globalid; %extend IfcGeom::Iterator { static int mantissa_size() {