Добрый день!
Столкнулся со странным поведением при вызове методов UnionWith, IntersectWith в классе FilterElementCollector.
Когда параллельно создаются 2 или более коллектора, которые фильтруются через .WhereElementIsElementType() или .WhereElementNotIsElementType() вызов метода UnionWith() или IntersectWith(), такое ощущение, что инвертирует фильтр .WhereElement(Is, IsNot)ElementType() на противоположный:
Фрагмент кода для теста:
var fecWalls = new FilteredElementCollector(doc)
.WhereElementIsElementType()
.OfCategory(BuiltInCategory.OST_Walls);
PrintCollector(fecWalls, "Walls");
var fecColumns = new FilteredElementCollector(doc)
.WhereElementIsElementType()
.OfCategory(BuiltInCategory.OST_StructuralColumns);
PrintCollector(fecColumns, "Columns");
fecWalls.UnionWith(fecColumns);
PrintCollector(fecWalls, "Result");
функция PrintCollector группирует по имени элементы в коллекторе и выводит их количество в каждой группе, а так же выводит Id типа элемента ([element].GetTypeId()) для первого элемента в группе, что бы проверить является ли найденный элемент типом или экземпляром, если типом, то Id = -1
Вывод PrintCollector: видно, что fecWalls и fecColumn содержат типы элементов, Result - уже экземпляры.
--* EVENTS *--
Collector Walls has 4 elements:
Name: Витраж 1 - 1 item, Id: -1
Name: APMV_НС 200 (B25 W4 F150) - 1 item, Id: -1
Name: APMV_Пилон 250 (Бетон B25) - 1 item, Id: -1
Name: APMV_Пилон 200 (Бетон B25) - 1 item, Id: -1
Collector Columns has 2 elements:
Name: C120.30-8 (B25 W4 F150) - 1 item, Id: -1
Name: C120.35-8 (B25 W4 F150) - 1 item, Id: -1
Collector Result has 679 elements:
Name: APMV_НС 200 (B25 W4 F150) - 116 items, Id: 612036
Name: APMV_Пилон 250 (Бетон B25) - 39 items, Id: 2408247
Name: APMV_Пилон 200 (Бетон B25) - 51 items, Id: 2408249
Name: C120.30-8 (B25 W4 F150) - 473 items, Id: 2516913
var fecWalls = new FilteredElementCollector(doc)
.WhereElementIsNotElementType()
.OfCategory(BuiltInCategory.OST_Walls);
PrintCollector(fecWalls, "Walls");
var fecColumns = new FilteredElementCollector(doc)
.WhereElementIsNotElementType()
.OfCategory(BuiltInCategory.OST_StructuralColumns);
PrintCollector(fecColumns, "Columns");
fecWalls.UnionWith(fecColumns);
PrintCollector(fecWalls, "Result");
--* EVENTS *--
Collector Walls has 206 elements:
Name: APMV_НС 200 (B25 W4 F150) - 116 items, Id: 612036
Name: APMV_Пилон 250 (Бетон B25) - 39 items, Id: 2408247
Name: APMV_Пилон 200 (Бетон B25) - 51 items, Id: 2408249
Collector Columns has 473 elements:
Name: C120.30-8 (B25 W4 F150) - 473 items, Id: 2516913
Collector Result has 6 elements:
Name: Витраж 1 - 1 item, Id: -1
Name: APMV_НС 200 (B25 W4 F150) - 1 item, Id: -1
Name: APMV_Пилон 250 (Бетон B25) - 1 item, Id: -1
Name: APMV_Пилон 200 (Бетон B25) - 1 item, Id: -1
Name: C120.30-8 (B25 W4 F150) - 1 item, Id: -1
Name: C120.35-8 (B25 W4 F150) - 1 item, Id: -1
Кто то еще с этим сталкивался? Я как то неправильно понимаю суть FilterElementCollector? Или так и должно быть?