ADN Club > Revit API
Разные FaceNormal у всех PlanarFace для DirectShape
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); }
Навигация
Перейти к полной версии