Как получить форму воздуховода и трубы
Это довольно старая тема, которая ранее уже обсуждалась. Еще тогда было потрачено довольно много времени для решения этой проблемы.
Сейчас ситуация немного изменилась и процесс стал гораздо легче, так как в Revit 2015 появилось свойство ElementType.FamilyName.
Вопрос: Есть ли простой способ получить форму воздуховода? Я знаю, как это сделать в интерфейсе, а вот как в API?
Ответ: Вероятно вы спрашиваете, как определить форму поперечного сечения воздуховода.
Это был довольно сложный вопрос когда-то и существует несколько вариантов его решения, например, геометрический анализ, как в предыдущих обсуждениях:
- Определение различий в формах MEP элементов (на англ.)
- Улучшения в определении формы MEP элементов (на англ.)
Еще один способ – открыть семейство соединения воздуховодов, добраться до свойства DuctConnector и до его свойства Shape. Но, к сожалению, открытие семейства – это довольно затратная операция.
Начиная с Revit 2015 наиболее простой и эффективный способ достичь необходимой цели – прочитать свойство ElementType.FamilyName.
Например, такой код:
- /// <summary>
- /// Определение формы элемента
- /// по названию семейства
- /// </summary>
- static public string GetElementShape4(
- Element e )
- {
- string shape = "неизвестная форма";
- ElementId tid = e.GetTypeId();
- if( ElementId.InvalidElementId != tid )
- {
- Document doc = e.Document;
- ElementType etyp = doc.GetElement( tid )
- as ElementType;
- if( null != etyp )
- {
- shape = etyp.FamilyName;
- }
- }
- return shape;
- }
Я добавил данный код в примеры The Building Coder в модуль CmdMepElementShape.cs, строки 721-745.
Вот результат на примере из двух прямоугольных воздуховодов
Выбрав левый воздуховод:
Выбрав соединение в середине:
Charles Piro в обсуждении предложил еще один способ, выбрав форму каждого из соединения воздуховодов:
- /// <summary>
- /// Возаращет форму воздуховода на одном из его конце.
- /// </summary>
- public ConnectorProfileType GetShape( Duct duct )
- {
- ConnectorProfileType ductShape
- = ConnectorProfileType.Invalid;
- foreach( Connector c
- in duct.ConnectorManager.Connectors )
- {
- if( c.ConnectorType == ConnectorType.End )
- {
- ductShape = c.Shape;
- break;
- }
- }
- return ductShape;
- }
Я немного изменил код, добавив формы всех его соединений:
- /// <summary>
- /// возвращает формы всех содинений воздуховода
- /// </summary>
- static ConnectorProfileType[] GetProfileTypes(
- Duct duct )
- {
- ConnectorSet connectors
- = duct.ConnectorManager.Connectors;
- int n = connectors.Size;
- ConnectorProfileType[] profileTypes
- = new ConnectorProfileType[n];
- int i = 0;
- foreach( Connector c in connectors )
- {
- profileTypes[i++] = c.Shape;
- }
- return profileTypes;
- }
Вывод результата:
Результат на соединении воздуховодов такой же, как и раньше, так как это не воздуховод:
Обновленные примеры включают код 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