Дубликаты конечных точек для каждого элемента
Я работаю над экспортом вершин всех стен.
Мне удается вывести результаты, но каждая стена имеет одинаковый набор вершин.
Я использовал подход к получению краев элемента, но он состоял из 92 конечных точек на стену, что не может быть правильным на основных стенах, которые я использую.
Затем я использовал метод получения граней и извлечения из него сетки, а затем вершин через свойство Vertices.
Это дало 28 вершин, что является правильным для некоторых стен, но координаты были одинаковыми для каждого элемента.
Как мне правильно подойти к этому?
Мой код:
FilteredElementCollector wallcollector = new FilteredElementCollector(doc).OfClass(typeof(Wall)).WhereElementIsNotElementType();
bool isconcrete = false;
foreach (var element in wallcollector.ToElements())
{
foreach (var mat in element.GetMaterialIds(false))
{
if (doc.GetElement(mat).Name.Contains("Concrete")) isconcrete = true;
}
if (isconcrete)
{
GeometryElement geo = element.get_Geometry(new Options());
if (geo != null)
{
foreach (var g in geo)
{
Solid geosolid = g as Solid;
if (geosolid != null)
{
foreach (Face f in geosolid.Faces)
{
Mesh mesh = f.Triangulate();
foreach (var xyz in mesh.Vertices)
{
FillDictionary(xyz, element);
}
}
}
}
}
}
}
Я не думаю, что моя итерация неверна, так как я в основном просто изучаю все, но, возможно, есть какая-то скрытая ошибка, которую я не вижу. Я использую словари для хранения своих данных. Вот как я заполняю это:
public void FillDictionary(XYZ point, Element element) {
if (element.Id.IntegerValue == formerid)
{
cornerByID[element.UniqueId].Add(ttr.OfPoint(point));
}
else
{
cornerlist.Clear();
cornerlist.Add(element.Name);
cornerlist.Add(element);
cornerlist.Add(element.Id);
cornerlist.Add(ttr.OfPoint(point));
cornerByID.Add(element.UniqueId, cornerlist);
formerid = element.Id.IntegerValue;
}
}
1 ответ
Если вы используете словарь с XYZ
ключи объекта, вам нужно реализовать нечеткое сравнение для сравнения ключей.
Вот пример обхода геометрии для получения уникальных вершин.
Я использую его в своей надстройке для конкретных конструктивных точек.