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

27/06/2015

Чтение таблицы ASHRE

В Revit MEP мы можем получить Настройки метода определения потерь в виде ASHRE таблицы. Но, проблема в том, что эта таблица не доступна напрямую, так как она не прикреплена к элементу. Вопрос в том, как получить доступ к информации, предоставленной ниже на скриншоте:

 

 

На самом деле, фактически, эта информация хранится в Расширяемой области хранения и связана с элементом параметром  RBS_DUCT_FITTING_LOSS_METHOD_SERVER_PARAM в виде GUID значения.

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

Для заданного элемента, первым делом нужно получить значение этого параметра:

Код - C#: [Выделить]
  1. FamilyInstance fitting = doc.GetElement(eleId) as FamilyInstance;
  2. if (fitting == null) continue;
  3. Parameter param = fitting.get_Parameter(
  4.   BuiltInParameter.RBS_DUCT_FITTING_LOSS_METHOD_SERVER_PARAM);
  5. if (param == null) continue;
  6. string strValGUID = param.AsString();
  7. string strValTemp = getTableNameByServerId(fitting,
  8.   strValGUID,
  9.   ExternalServices.BuiltInExternalServices.
  10.   DuctFittingAndAccessoryPressureDropService);

Самая интересная часть находится в метода getTableNameByServerId, которого нет в API. Ниже показаны все шаги реализации метода.

Код - C#: [Выделить]
  1. // Имя поля с таблицей для воздуховодов
  2. public static readonly string fieldDuctTableName = "ASHRAETableName";
  3. // Имя поля с таблицей для труб.
  4. public static readonly string fieldPipeTableName = "PipeFittingKFactorTableName";
  5.  
  6. // Получаем сервер, затем получаем сущность с сервера
  7. // И получаем имя таблицы из сущности.
  8. private string getTableNameByServerId(
  9.   FamilyInstance fitting,
  10.   string strGUID,
  11.   ExternalServiceId serviceId)
  12. {
  13.   if (fitting == null || strGUID == null || serviceId == null)
  14.     return null;
  15.  
  16.   Guid serverGUID;
  17.   if (!Guid.TryParse(strGUID, out serverGUID))
  18.     return null;
  19.  
  20.   // For Pipe, the loss method might be defined on type
  21. // Для труб метод определения потерь может хранится в типе
  22.   if (serverGUID == MEPCalculationServerInfo.PipeUseDefinitionOnTypeGUID)
  23.   {
  24.     //check if the loss method of type is "table"
  25.     // Проверяем, является ли метод определения потерь таблицей
  26.     int eLossMethod = fitting.Symbol.get_Parameter(
  27.       BuiltInParameter.RBS_PIPE_TYPE_FITTING_LOSS_METHOD_PARAM).
  28.       AsInteger();
  29.  
  30.     if (eLossMethod == (int)PipeLossMethodType.Table)
  31.       return fitting.Symbol.get_Parameter(
  32.         BuiltInParameter.RBS_PIPE_TYPE_FITTING_LOSS_TABLE_PARAM).
  33.         AsString();
  34.     else
  35.       return null;
  36.   }
  37.   IExternalServer server = getServerById(strGUID, serviceId);
  38.   if (server != null)
  39.   {
  40.     Schema schema = null;
  41.     string fieldTableName = "";
  42.     if (serviceId == ExternalServices.BuiltInExternalServices.
  43.       DuctFittingAndAccessoryPressureDropService)
  44.     {
  45.       IDuctFittingAndAccessoryPressureDropServer ductServer =
  46.         server as IDuctFittingAndAccessoryPressureDropServer;
  47.       if (ductServer != null)
  48.       {
  49.         schema = ductServer.GetDataSchema();
  50.         fieldTableName = fieldDuctTableName;
  51.       }
  52.     }
  53.     else if (serviceId == ExternalServices.
  54.       BuiltInExternalServices.
  55.       PipeFittingAndAccessoryPressureDropService)
  56.     {
  57.       IPipeFittingAndAccessoryPressureDropServer pipeServer =
  58.         server as IPipeFittingAndAccessoryPressureDropServer;
  59.       if (pipeServer != null)
  60.       {
  61.         schema = pipeServer.GetDataSchema();
  62.         fieldTableName = fieldPipeTableName;
  63.       }
  64.     }
  65.  
  66.     if (schema != null)
  67.     {
  68.       Field field = schema.GetField(fieldTableName);
  69.       if (field != null)
  70.       {
  71.         Entity entity = fitting.GetEntity(schema);
  72.         if (entity != null && entity.IsValid())
  73.           return entity.Get<string>(field);
  74.       }
  75.     }
  76.   }
  77.  
  78.   return null;
  79. }
  80.  
  81. private IExternalServer getServerById(
  82.   string strGUID, ExternalServiceId serviceId)
  83. {
  84.   if (strGUID == null || serviceId == null)
  85.     return null;
  86.  
  87.   Guid serverGUID;
  88.   if (!Guid.TryParse(strGUID, out serverGUID))
  89.     return null;
  90.  
  91.  // Сначала получаем сервис, затем сервер
  92.   MultiServerService service =
  93.     ExternalServiceRegistry.GetService(serviceId)
  94.     as MultiServerService;
  95.   if (service != null && serverGUID != null)
  96.   {
  97.     IExternalServer server = service.GetServer(serverGUID);
  98.     if (server != null)
  99.       return server;
  100.   }
  101.  
  102.   return null;
  103. }

Источник: http://adndevblog.typepad.com/aec/2015/05/reading-ashrae-table-information-from-elements.html

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

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

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