04.09.2023 19:17
Автор темы
АВТОМАТИЗАЦИЯ
1
Сообщения
1
Пользователи
0
Лайки
130
Просмотры
0
Вобщем, в "selects" - текущий выбор юзера. В "rebarAlls" - коллекция арматурных стержней, отфильтрованных по определенным параметрам. Обе коллекции содержат элементы, проверил по id - пересекающиеся элементы есть. Отчего жеж итоговое rebars.count у меня всегда получается ноль? : )
UIDocument uidoc = cmdData.Application.ActiveUIDocument; IList<Element> selects = uidoc.Selection.GetElementIds().Select(x => doc.GetElement(x)).ToList(); IList<Element> rebarAlls = GetRebarElements(doc); string str1=""; foreach (Element element in selects) { ElementId id = element.Id; str1 = str1 + id.ToString() + "\n"; } str1 = str1 + "\n" + "\n"; foreach (Element element in rebarAlls) { ElementId id = element.Id; str1 = str1 + id.ToString() + "\n"; } rebars = selects.Intersect(rebarAlls).ToList(); TaskDialog.Show("RebarSketch", str1);
1 Ответ
0
08.09.2023 10:22
Автор темы
Вобщем, оказалось, что "Intersect для корректной работы требуется чтобы в типе были переопределены методы Equals, GetHashCode. Класс Element этого не делает. Значит, нужно создать класс реализующий IEqualityComparer<Element> и передать его в метод Intersect".
Сделал, как подсказали, и заработало!
using Autodesk.Revit.DB; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ME.Functions { public class ElementEqualityComparer : IEqualityComparer<Element> { public bool Equals(Element x, Element y) { if (ReferenceEquals(x, y)) return true; if (x is null || y is null) return false; return x.Id == y.Id; } public int GetHashCode(Element obj) { return obj.Id.GetHashCode(); } } } ... rebars = rebarAlls.Intersect(selects, new ElementEqualityComparer()).ToList()