Не ровный DirectShape

Автор Тема: Не ровный DirectShape  (Прочитано 1703 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн bronxАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Не ровный DirectShape
« : 27-01-2022, 07:43:09 »
Приветствую. Всё ещё пытаюсь побороть DirectShape :D
Проблема возникает, когда я пытаюсь создать DirectShape из перегруженного TessellatedFace( в который передаётся IList<IList<XYZ>>) для получения поверхности с отверстиями. Но в итоге получается кривой DirectShape (см. вложение). Ниже прикладываю код, который я использую. Просьба помочь разобраться, как построить ровный DirectShape.

Код - C# [Выбрать]
  1. public static ElementId CreateDirectShapeWithHoles(
  2.             Document doc,
  3.             string shapeName,
  4.             string appGuid,
  5.             IList<IList<XYZ>> pointsList)
  6.         {
  7.             var materialId = GetMaterial(doc);
  8.  
  9.             var tessellatedFace = new TessellatedFace(pointsList, materialId);
  10.  
  11.             return CreateDirectShapeFromTessellatedFace(doc, shapeName, appGuid, tessellatedFace);
  12.         }
  13.  
  14.         private static ElementId CreateDirectShapeFromTessellatedFace(
  15.             Document doc, string shapeName, string appGuid, TessellatedFace tessellatedFace)
  16.         {
  17.             var builder = new TessellatedShapeBuilder
  18.             {
  19.                 LogString = shapeName
  20.             };
  21.  
  22.             builder.OpenConnectedFaceSet(true);
  23.  
  24.  
  25.             if (builder.DoesFaceHaveEnoughLoopsAndVertices(tessellatedFace))
  26.             {
  27.                 builder.AddFace(tessellatedFace);
  28.             }
  29.  
  30.             builder.CloseConnectedFaceSet();
  31.  
  32.             builder.Build();
  33.             var cat = GetBuiltInCategoryForShape();
  34.             var ds = DirectShape.CreateElement(doc, new ElementId(cat));
  35.  
  36.             ds.ApplicationId = appGuid;
  37.             ds.ApplicationDataId = shapeName;
  38.  
  39.             ds.Name = shapeName.Replace(':', '_');
  40.             ds.SetShape(builder);
  41.  
  42.             return ds.Id;
  43.         }



Отмечено как Решение bronx 27-01-2022, 11:55:28

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Не ровный DirectShape
« Ответ #1 : 27-01-2022, 09:18:28 »
Попробуйте вариант через Solid:
Код - C# [Выбрать]
  1. private TessellatedShapeBuilderResult TessellateSolid(Solid solid)
  2. {
  3.     var builder = new TessellatedShapeBuilder();
  4.  
  5.     var vertices = new List<XYZ>(3);
  6.  
  7.     builder.OpenConnectedFaceSet(false);
  8.  
  9.     var controls = new SolidOrShellTessellationControls()
  10.     {
  11.         Accuracy = 0.03,
  12.         LevelOfDetail = 0.5,
  13.         MinAngleInTriangle = 3 * Math.PI / 180.0,
  14.         MinExternalAngleBetweenTriangles = 0.2 * Math.PI
  15.     };
  16.  
  17.     var shell = SolidUtils.TessellateSolidOrShell(solid, controls);
  18.  
  19.     var component = shell.GetShellComponent(0);
  20.  
  21.     for (var i = 0; i < component.TriangleCount; ++i)
  22.     {
  23.         var t = component.GetTriangle(i);
  24.  
  25.         vertices.Clear();
  26.  
  27.         vertices.Add(component.GetVertex(t.VertexIndex0));
  28.         vertices.Add(component.GetVertex(t.VertexIndex1));
  29.         vertices.Add(component.GetVertex(t.VertexIndex2));
  30.  
  31.         var tf = new TessellatedFace(vertices, ElementId.InvalidElementId);
  32.  
  33.         if (builder.DoesFaceHaveEnoughLoopsAndVertices(tf))
  34.         {
  35.             builder.AddFace(tf);
  36.         }
  37.     }
  38.  
  39.     builder.CloseConnectedFaceSet();
  40.     builder.Target = TessellatedShapeBuilderTarget.AnyGeometry;
  41.     builder.Fallback = TessellatedShapeBuilderFallback.Mesh;
  42.     builder.Build();
  43.     return builder.GetBuildResult();
  44. }

LevelOfDetail - уровень детализации

Использование примерно такое:
Код - C# [Выбрать]
  1. var geometryObjects = new List<GeometryObject>();
  2. geometryObjects.AddRange(TessellateSolid(solid).GetGeometricalObjects());
  3. directShape.SetShape(geometryObjects);

Solid имеется почти у всех элементов