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

30/09/2016

Как получить форму воздуховода и трубы

Это довольно старая тема, которая ранее уже обсуждалась. Еще тогда было потрачено довольно много времени для решения этой проблемы.

Сейчас ситуация немного изменилась и процесс стал гораздо легче, так как в Revit 2015 появилось свойство ElementType.FamilyName.

Вопрос: Есть ли простой способ получить форму воздуховода? Я знаю, как это сделать в интерфейсе, а вот как в API?

Ответ: Вероятно вы спрашиваете, как определить форму поперечного сечения воздуховода.

Это был довольно сложный вопрос когда-то и существует несколько вариантов его решения, например, геометрический анализ, как в предыдущих обсуждениях:

Еще один способ – открыть семейство соединения воздуховодов, добраться до свойства DuctConnector и до его свойства Shape. Но, к сожалению, открытие семейства – это довольно затратная операция.

Начиная с Revit 2015 наиболее простой и эффективный способ достичь необходимой цели – прочитать свойство ElementType.FamilyName.

Например, такой код:

Код - C#: [Выделить]
  1.   /// <summary>
  2.   /// Определение формы элемента
  3.   /// по названию семейства
  4.   /// </summary>
  5.   static public string GetElementShape4(
  6.     Element e )
  7.   {
  8.     string shape = "неизвестная форма";
  9.  
  10.     ElementId tid = e.GetTypeId();
  11.  
  12.     if( ElementId.InvalidElementId != tid )
  13.     {
  14.       Document doc = e.Document;
  15.  
  16.       ElementType etyp = doc.GetElement( tid )
  17.         as ElementType;
  18.  
  19.       if( null != etyp )
  20.       {
  21.         shape = etyp.FamilyName;
  22.       }
  23.     }
  24.     return shape;
  25.   }

Я добавил данный код в примеры The Building Coder в модуль CmdMepElementShape.cs, строки 721-745.

Вот результат на примере из двух прямоугольных воздуховодов

 

Выбрав левый воздуховод:

 

Выбрав соединение в середине:

 

 

Charles Piro в обсуждении предложил еще один способ, выбрав форму каждого из соединения воздуховодов:

Код - C#: [Выделить]
  1.   /// <summary>
  2.   /// Возаращет форму воздуховода на одном из его конце.
  3.   /// </summary>
  4.   public ConnectorProfileType GetShape( Duct duct )
  5.   {
  6.     ConnectorProfileType ductShape
  7.       = ConnectorProfileType.Invalid;
  8.  
  9.     foreach( Connector c
  10.       in duct.ConnectorManager.Connectors )
  11.     {
  12.       if( c.ConnectorType == ConnectorType.End )
  13.       {
  14.         ductShape = c.Shape;
  15.         break;
  16.       }
  17.     }
  18.     return ductShape;
  19.   }

Я немного изменил код, добавив формы всех его соединений:

Код - C#: [Выделить]
  1.   /// <summary>
  2.   /// возвращает формы всех содинений воздуховода
  3.   /// </summary>
  4.   static ConnectorProfileType[] GetProfileTypes(
  5.     Duct duct )
  6.   {
  7.     ConnectorSet connectors
  8.       = duct.ConnectorManager.Connectors;
  9.  
  10.     int n = connectors.Size;
  11.  
  12.     ConnectorProfileType[] profileTypes
  13.       = new ConnectorProfileType[n];
  14.  
  15.     int i = 0;
  16.  
  17.     foreach( Connector c in connectors )
  18.     {
  19.       profileTypes[i++] = c.Shape;
  20.     }
  21.     return profileTypes;
  22.   }

Вывод результата:

 

Результат на соединении воздуховодов такой же, как и раньше, так как это не воздуховод:

 

Обновленные примеры включают код Charles

Источник: http://thebuildingcoder.typepad.com/blog/2016/02/ifc-import-levels-and-mep-element-shapes.html

Автор перевода: Виктор Чекалин

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

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