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

10/09/2013

Определение максимального воздушного потока в соединителях воздуховодов

Мой коллега сделал простенькую утилиту для Revit MEP, с которой я хотел бы поделиться.

Вопрос: Нам нужно извлечь некие определенные значения параметров воздуховода и показать из пользователю.

Нужно получить максимальное значение потока для каждого воздуховода, и сохранить его в общем параметре.

В конечном итоге пользователь должен подтвердить, что размер воздуховода соответствует максимально возможному потоку. По этой причине мы рассматриваем только сами воздуховоды и не обращаем внимание на фитинги, так как их размер соответствует размеру воздуховода.

Для хранения значения максимального потока я создал вот такой общий параметр:

*GROUP ID NAME

GROUP   1 Mechanical - Airflow

*PARAM  GUID  NAME   DATATYPE  DATACATEGORY  GROUP  VISIBLE

PARAM   XXXX  Duct Max Airflow HVAC_AIR_FLOW  1 1

 

Ответ: На самом деле задача является довольно простой. Вот алгоритм работы:

  • Получить все воздуховоды в модели
  • Для каждого воздуховода получить соединители воздуховода
  • Определить значение максимального потока
  • Записать это значение в общий параметр воздуховода

На первом шаге нам нужно создать несколько примеров модели в Revit, на которых мы будем тестировать. Модель должна содержать как можно меньше элементов для более легкой идентификации объектов.

Вот несколько примеров для теста

 

Вы можете исследовать модель с помощью RevitLookup или BiPChecker для того чтобы узнать как получить доступ к необходимым данным (потоку). На рисунке изображен приме, как мы можем получить значение параметра Поток для соединителей воздуховодов

 

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

  • GetConnectorManager – получить Connector Manager для выбранного элемента.
  • GetMaxFlow – получить значение максимального потока среди всех соединителей воздуховода
  • SetMAxFlowOnElement – определить значение максимального потока для элемента и записать значение в общий параметр
  • Execute – главный метод для внешней команды. Создание транзакции, обработка всех воздуховодов.

Получить Connector Manager

Вначале мы думалиб что должны обработать как сами воздуховоды так и фитинги. Для них используются разные методы, чтобы получить Connector Manager.

Следующий метод инкапсулирует и скрывает эти различия. Таким образом, один и тот же метод используется и для воздуховодов и для фитингов.

Код - C#: [Выделить]
  1.  
  2. /// <summary>
  3. /// Return the given element's connector manager,
  4. /// using either the family instance MEPModel or
  5. /// directly from the duct connector manager.
  6. /// </summary>
  7. static ConnectorManager GetConnectorManager(
  8.   Element e )
  9. {
  10.   Duct duct = e as Duct;
  11.     return null == duct
  12.     ? ( e as FamilyInstance ).MEPModel.ConnectorManager
  13.     : duct.ConnectorManager;
  14. }
  15.  
  16.  

Максимальный поток среди всех соединителей

Следующий метод перебирает все коннекторы из заданного набора и возвращает значение максимального потока среди всех этих соединителей.

Метод Flow выбрасывает исключение, если соединитель не является трубным соединителем или соединителем воздуховода. Таким образом, остальные типы соединителей пропускаются.

Код - C#: [Выделить]
  1.  
  2.   /// <summary>
  3.   /// Retrieve max flow from all the given connectors.
  4.   /// </summary>
  5.   static double GetMaxFlow(
  6.     ConnectorSet connectors )
  7.   {
  8.     double flow = 0.0;
  9.  
  10.     foreach( Connector c in connectors )
  11.     {
  12.       // Accessing flow property requires these
  13.       // domains or throws an exception saying
  14.       // "Flow is available only for connectors
  15.       // of DomainHavc and DomainPiping."
  16.  
  17.       Domain d = c.Domain;
  18.  
  19.       if( Domain.DomainHvac != d
  20.         && Domain.DomainPiping != d )
  21.       {
  22.         continue;
  23.       }
  24.  
  25.       if( flow < c.Flow )
  26.       {
  27.         flow = c.Flow;
  28.       }
  29.     }
  30.     return flow;
  31.   }
  32.  

Определение максимального потока для элемента и установка общего параметра

Мы используем GUID параметра для идентификации параметра, чтобы не зависеть от языка.

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

Код - C#: [Выделить]
  1.   /// <summary>
  2.   /// Identify the 'Duct Max Airflow' shared parameter.
  3.   /// </summary>
  4.   static Guid _shared_param_duct_max_airflow
  5.     = new Guid( "87b12ca4-8a4c-4731-bf88-f50bccd9c5d4" );
  6.  
  7.   /// <summary>
  8.   /// Set the max flow parameter on the given
  9.   /// element and return true on success.
  10.   /// This is generic, so it can handle both
  11.   /// ducts and fittings. Later, this proved
  12.   /// unnecessary, and we use ot for ducts only.
  13.   /// </summary>
  14.   static bool SetMaxFlowOnElement( Element e )
  15.   {
  16.     ConnectorSet connectors
  17.       = GetConnectorManager( e ).Connectors;
  18.  
  19.     int n = connectors.Size;
  20.  
  21.     double flow = GetMaxFlow( connectors );
  22.  
  23.     Debug.Print(
  24.       "{0} has {1} connector{2} and max flow {3}.",
  25.       Util.ElementDescription( e ), n,
  26.       Util.PluralSuffix( n ), flow );
  27.  
  28.     Parameter p = e.get_Parameter(
  29.       _shared_param_duct_max_airflow );
  30.  
  31.     bool rc = false;
  32.  
  33.     if( null == p )
  34.     {
  35.       //Util.InfoMsg( "Please ensure that all "
  36.       //  + "duct and their fittings have a "
  37.       //  + "'Duct Max Airflow' shared parameter." );
  38.  
  39.       Debug.Print( "{0} has no 'Duct Max Airflow' "
  40.         + "shared parameter.",
  41.         Util.ElementDescription( e ) );
  42.     }
  43.     else
  44.     {
  45.       // Store the max flow value in the specified
  46.       // parameter on the given element.
  47.  
  48.       rc = p.Set( flow );
  49.     }
  50.     return rc;
  51.   }

Выполнение команды

В методе выполнения внешней команды я создаю транзакцию, извлекаю все воздуховоды и последовательно их обрабатываю.

Код - C#: [Выделить]
  1.   public Result Execute(
  2.     ExternalCommandData commandData,
  3.     ref string message,
  4.     ElementSet elements )
  5.   {
  6.     UIApplication uiapp = commandData.Application;
  7.     UIDocument uidoc = uiapp.ActiveUIDocument;
  8.  
  9.     if( null == uidoc )
  10.     {
  11.       Util.InfoMsg( "Please run this command "
  12.         + "in a valid document context." );
  13.  
  14.       return Result.Failed;
  15.     }
  16.  
  17.     Application app = uiapp.Application;
  18.     Document doc = uidoc.Document;
  19.  
  20.     int nDucts = 0;
  21.  
  22.     using( Transaction tx = new Transaction( doc ) )
  23.     {
  24.       tx.Start( Util.Caption );
  25.  
  26.       FilteredElementCollector ducts
  27.         = new FilteredElementCollector( doc )
  28.           .OfClass( typeof( Duct ) );
  29.  
  30.       foreach( Duct duct in ducts )
  31.       {
  32.         if( SetMaxFlowOnElement( duct ) )
  33.         {
  34.           ++nDucts;
  35.         }
  36.         else
  37.         {
  38.           return Result.Failed;
  39.         }
  40.       }
  41.       tx.Commit();
  42.     }
  43.  
  44.     Util.InfoMsg( string.Format(
  45.       "Set max flow parameter on {0} duct{1}.",
  46.       nDucts, Util.PluralSuffix( nDucts ) ) );
  47.  
  48.     return Result.Succeeded;
  49.   }

Заключение

Как я говорил, задача очень проста.

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

Исходый код, содержащий готовый проект для Visual Studio можно скачать по ссылке.

Источник: http://thebuildingcoder.typepad.com/blog/2013/08/determining-maximal-flow-in-hvac-duct-connectors.html

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

Опубликовано 10.09.2013
Отредактировано 10.09.2013 в 07:36:25