ADN Open CIS
Сообщество программистов Autodesk в СНГ

12/06/2014

Минимальный размер DirectShape

В Revit 2015 API появилась возможность импортировать геометрию элементов напрямую в проект. В API, класс DirectShape представляет собой геометрическую фигуру.

У одного из пользователей возник вопрос, касающийся использования данного класса

Вопрос: Я создаю фигуры (DirectShape)  в Revit 2015 API из имеющегося набора поверхностей при помощи класса TessellatedShapeBuilder.

Проблема в том, что минимально допустимая длина грани, с которой Revit может работать равна 0,0026 фута. Если я пытаюсь использовать грань длиной 0,0025 фута, то Revit падает с ошибкой.

Можно ли изменить этот минимальный допуск?

Или может быть есть какой-то другой способ создания фигуры, где можно задать меньшую длину грани?

Ответ: К сожалению, нет. Никак.

Допуск изменить нельзя, и другого способа создания фигуры не существует.

При создании линии модели существует ограничение в 1/16 дюйма, подобное же ограничение распространяется и на фигуры.

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

В команде определена статическая переменная Iterate_until_crash.

По умолчанию она равна false. В этом случае просто создается тетраэдр с длиной грани равным 0.5 фута:

 

Соответствующее сообщение выводится в окно Output:

Код - XML: [Выделить]
  1. Создание DirectShape тетраэдр с длиной грани 0.5...

Если установить Iterate_until_crash равным true, то в бесконечном цикле будут попытки создания тетраэдра с длиной грани равной половине предыдущей длины.

Довольно быстро возникнет исключение, тем не менее, какие-то фигуры будут созданы и в окне Output мы увидим следующее:

Код - XML: [Выделить]
  1. Создание DirectShape тетраэдр с длиной грани 0.5...
  2. Создание DirectShape тетраэдр с длиной грани 0.25...
  3. Создание DirectShape тетраэдр с длиной грани 0.125...
  4. Создание DirectShape тетраэдр с длиной грани 0.0625...
  5. Создание DirectShape тетраэдр с длиной грани 0.03125...
  6. Создание DirectShape тетраэдр с длиной грани 0.015625...
  7. Создание DirectShape тетраэдр с длиной грани 0. 0078125...
  8. Создание DirectShape тетраэдр с длиной грани 0.00390625...
  9. Создание DirectShape тетраэдр с длиной грани 0. 001953125...  

  • A first chance exception of type 'Autodesk.Revit.Exceptions.InvalidOperationException' occurred in RevitAPI.dll
  • Создание DirectShape тетраэдр с длиной грани 0.001953125 вызвало исключение 'could not create consistent vertex list'

Вот полный код команды:

Код - C#: [Выделить]
  1. #region Namespaces
  2. using System;
  3. using System.Linq;
  4. using System.Collections.Generic;
  5. using System.Diagnostics;
  6. using Autodesk.Revit.ApplicationServices;
  7. using Autodesk.Revit.Attributes;
  8. using Autodesk.Revit.DB;
  9. using Autodesk.Revit.UI;
  10. using Autodesk.Revit.UI.Selection;
  11. #endregion
  12.  
  13. namespace DirectShapeMinSize
  14. {
  15.   [Transaction( TransactionMode.Manual )]
  16.   public class Command : IExternalCommand
  17.   {
  18.     /// <summary>
  19.     /// Установите значение равным true
  20.     /// чтобы создавать меньшие тетраэдры
  21.     /// пока не возникнет исключение
  22.     /// </summary>
  23.     static bool Iterate_until_crash = false;
  24.  
  25.     public Result Execute(
  26.       ExternalCommandData commandData,
  27.       ref string message,
  28.       ElementSet elements )
  29.     {
  30.       UIApplication uiapp = commandData.Application;
  31.       UIDocument uidoc = uiapp.ActiveUIDocument;
  32.       Application app = uiapp.Application;
  33.       Document doc = uidoc.Document;
  34.  
  35.       FilteredElementCollector collector
  36.         = new FilteredElementCollector( doc )
  37.           .OfClass( typeof( GraphicsStyle ) );
  38.  
  39.       GraphicsStyle style = collector.Cast<GraphicsStyle>()
  40.         .FirstOrDefault<GraphicsStyle>( gs => gs.Name.Equals( "<Sketch>" ) );
  41.  
  42.       ElementId graphicsStyleId = null;
  43.  
  44.       if( style != null )
  45.       {
  46.         graphicsStyleId = style.Id;
  47.       }
  48.  
  49.       // не забываем создать транзакцию при изменении документа
  50.  
  51.       using( Transaction tx = new Transaction( doc ) )
  52.       {
  53.         tx.Start( "Создание фигуры" );
  54.  
  55.         double length = 1; // foot
  56.  
  57.         try
  58.         {
  59.           do
  60.           {
  61.             length = 0.5 * length;
  62.  
  63.             Debug.Print(
  64.                 "Создание DirectShape тетраэдр с длиной грани {0}...",
  65.                 length );
  66.  
  67.             List<XYZ> args = new List<XYZ>( 3 );
  68.  
  69.             TessellatedShapeBuilder builder = new TessellatedShapeBuilder();
  70.  
  71.             builder.OpenConnectedFaceSet( false );
  72.  
  73.             args.Add( XYZ.Zero );
  74.             args.Add( length * XYZ.BasisX );
  75.             args.Add( length * XYZ.BasisY );
  76.             builder.AddFace( new TessellatedFace( args, ElementId.InvalidElementId ) );
  77.  
  78.             args.Clear();
  79.             args.Add( XYZ.Zero );
  80.             args.Add( length * XYZ.BasisX );
  81.             args.Add( length * XYZ.BasisZ );
  82.             builder.AddFace( new TessellatedFace( args, ElementId.InvalidElementId ) );
  83.  
  84.             args.Clear();
  85.             args.Add( XYZ.Zero );
  86.             args.Add( length * XYZ.BasisY );
  87.             args.Add( length * XYZ.BasisZ );
  88.             builder.AddFace( new TessellatedFace( args, ElementId.InvalidElementId ) );
  89.  
  90.             args.Clear();
  91.             args.Add( length * XYZ.BasisX );
  92.             args.Add( length * XYZ.BasisY );
  93.             args.Add( length * XYZ.BasisZ );
  94.             builder.AddFace( new TessellatedFace( args, ElementId.InvalidElementId ) );
  95.  
  96.             builder.CloseConnectedFaceSet();
  97.  
  98.             TessellatedShapeBuilderResult result
  99.               = builder.Build(
  100.                 TessellatedShapeBuilderTarget.Solid,
  101.                 TessellatedShapeBuilderFallback.Abort,
  102.                 graphicsStyleId );
  103.  
  104.             ElementId categoryId = new ElementId(
  105.               BuiltInCategory.OST_GenericModel );
  106.  
  107.             DirectShape ds = DirectShape.CreateElement(
  108.               doc, categoryId, "A", "B" );
  109.  
  110.             ds.SetShape( result.GetGeometricalObjects() );
  111.  
  112.             ds.Name = "Тест";
  113.           }
  114.           while( Iterate_until_crash && 0 < length );
  115.         }
  116.         catch( Exception e )
  117.         {
  118.           Debug.Print(
  119.             " Создание DirectShape тетраэдр с длиной грани {0} "
  120.             + "вызвало исключение '{1}'",
  121.             length, e.Message );
  122.  
  123.           message = e.Message;
  124.           return Result.Failed;
  125.         }
  126.         tx.Commit();
  127.       }
  128.       return Result.Succeeded;
  129.     }
  130.   }
  131. }

Полный код для Visual Studio можно скачать по ссылке DirectShapeMinSize.zip

Источник: http://thebuildingcoder.typepad.com/blog/2014/05/directshape-performance-and-minimum-size.html

 

Обсуждение: http://adn-cis.org/forum/index.php?topic=799

Опубликовано 12.06.2014