ADN Club > Revit API

Разные FaceNormal у всех PlanarFace для DirectShape

(1/2) > >>

bronx:
Приветствую. Есть некоторый DirectShape(пример в аттаче). Я пытаюсь найти все внешние грани с помощью построения перпендикуляров из центра граней, с дальнейшей проверкой на пересечение с остальными гранями нашего DirectShape. Но проблема в том, что для каждого PlanarFace в нашем DirectShape мы имеем рзличные FaceNormal , и пересечения не наблюдается :'( Просьба подсказать, как можно выравнить все PlanarFace в одной плоскости. Заранее спасибо.

Александр Игнатович:
Прочитал раз 5, но так и не понял, что ты хочешь. Если поверхности имеют разные нормали, то они не находятся в одной плоскости (или параллельных плоскостях), зачем их выравнивать? Что ты в данном случае подразумеваешь под "внешними" гранями? Геометрия твердотельная или mesh?

bronx:
Просто странно, я строю этот DirectShape из выбранной на чертеже PlanarFace, но при этом поверхности имеют разные нормали Оо. Внешние грани - это внешние грани, описывающие полигон, а не те, что внутри него(смотри аттач.)

Александр Игнатович:
Картинка не сильно помогает ::). Предположу, что могут быть ситуации, когда у соседних face-ов в разные стороны направлены, т.е., например, XYZ.BasisZ и -XYZ.BasisZ. Тогда может быть, что face.GetSurface().OrientationMatchesParametricOrientation  - false. При этом методом face.ComputeNormal всегда будет возвращаться корректное значение. Ну или проверить код создания самого shape-а

bronx:
Вот пример кода создания DirectShape


--- Код - C# [Выбрать] ---    internal static ElementId NewDirectShape(          IList<Face> faces,          Transform transform,          Document doc,          string appGuid,          string shapeName)        {            int nFaces = 0;            int nFacesFailed = 0;             ElementId materialId = GetMaterial(doc);             TessellatedShapeBuilder builder = new TessellatedShapeBuilder { LogString = shapeName };             builder.OpenConnectedFaceSet(true);            foreach (var face in faces)            {                area += face.Area;                 Mesh mesh = face.Triangulate(0.8);                mesh = mesh.get_Transformed(transform);                for (int i = 0; i < mesh.NumTriangles; i++)                {                    List<XYZ> args = new List<XYZ>();                     MeshTriangle triangle = mesh.get_Triangle(                      i);                     XYZ p1 = triangle.get_Vertex(0);                    XYZ p2 = triangle.get_Vertex(1);                    XYZ p3 = triangle.get_Vertex(2);                     args.Add(p1);                    args.Add(p2);                    args.Add(p3);                     Coordinates.AddRange(args.Select(p => new Point3D { X = p.X, Y = p.Y, Z = p.Z }));                     TessellatedFace tesseFace = new TessellatedFace(args,materialId);                                        if (builder.DoesFaceHaveEnoughLoopsAndVertices(                      tesseFace))                    {                        builder.AddFace(tesseFace);                    }                }            }             builder.CloseConnectedFaceSet();                        builder.Target = TessellatedShapeBuilderTarget.AnyGeometry; // 2017            builder.Fallback = TessellatedShapeBuilderFallback.Mesh; // 2017                        builder.Build();            BuiltInCategory cat = GetBuiltInCategoryForShape();            DirectShape ds = DirectShape.CreateElement(doc, new ElementId(cat));                         ds.ApplicationId = appGuid;            ds.ApplicationDataId = shapeName;                 ds.SetShape(builder);        }

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии