Дубликаты конечных точек для каждого элемента

Я работаю над экспортом вершин всех стен.
Мне удается вывести результаты, но каждая стена имеет одинаковый набор вершин.
Я использовал подход к получению краев элемента, но он состоял из 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 ключи объекта, вам нужно реализовать нечеткое сравнение для сравнения ключей.

Вот пример обхода геометрии для получения уникальных вершин.

Я использую его в своей надстройке для конкретных конструктивных точек.

Другие вопросы по тегам