#1674 use id to filter

This commit is contained in:
Thomas Krijnen
2021-09-14 11:36:19 +02:00
parent 99cd952c98
commit 38a0c71060
3 changed files with 35 additions and 3 deletions
@@ -230,6 +230,32 @@ namespace IfcGeom {
description = ss.str();
}
};
struct instance_id_filter : public filter {
std::set<int> instance_ids_;
instance_id_filter() {}
instance_id_filter(bool include, bool traverse, const std::set<int>& instance_ids)
: filter(include, traverse)
, instance_ids_(instance_ids) {}
bool match(IfcUtil::IfcBaseEntity* prod) const {
return instance_ids_.find(prod->data().id()) != instance_ids_.end();
}
bool operator()(IfcUtil::IfcBaseEntity* prod) const {
return filter::match(prod, std::bind(&instance_id_filter::match, this, std::placeholders::_1));
}
void update_description() {
std::stringstream ss;
ss << (traverse ? "traverse " : "") << (include ? "include" : "exclude") << " ids";
for (auto& id : instance_ids_) {
ss << " " << id;
}
description = ss.str();
}
};
}
#endif
@@ -97,10 +97,9 @@ class iterator(ifcopenshell_wrapper.Iterator):
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_with_include_exclude_globalid
initializer = ifcopenshell_wrapper.construct_iterator_with_include_exclude_id
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)))
include_or_exclude = [i.id() for i in include_or_exclude]
else:
initializer = ifcopenshell_wrapper.construct_iterator_with_include_exclude
+7
View File
@@ -214,10 +214,17 @@ struct ShapeRTTI : public boost::static_visitor<PyObject*>
af.include = include;
return new IfcGeom::Iterator(settings, file, {af}, num_threads);
}
IfcGeom::Iterator* construct_iterator_with_include_exclude_id(IfcGeom::IteratorSettings settings, IfcParse::IfcFile* file, std::vector<int> elems, bool include, int num_threads) {
std::set<int> elems_set(elems.begin(), elems.end());
IfcGeom::instance_id_filter af(include, false, elems_set);
return new IfcGeom::Iterator(settings, file, {af}, num_threads);
}
%}
%newobject construct_iterator_with_include_exclude;
%newobject construct_iterator_with_include_exclude_globalid;
%newobject construct_iterator_with_include_exclude_id;
%extend IfcGeom::Representation::Triangulation {
%pythoncode %{