04.09.2023 19:17
Создатель темы
АВТОМАТИЗАЦИЯ
1
Записи
1
Пользователи
0
Reactions
894
Просмотры
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()