дубликаты конечных точек для каждого элемента - PullRequest
0 голосов
/ 24 апреля 2018

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

0 голосов
/ 25 апреля 2018

Если вы используете словарь с XYZ ключами объекта, вам нужно реализовать нечеткое сравнение для сравнения ключей .

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

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

...