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

19/03/2014

Как получить устройства регулирования потока для напорной трубопроводной сети

Напорная трубопроводная сеть (Pressure Network) в Civil содержит три типа объектов:

  • Напорные трубы (Pressure Pipes)
  • Фитинги (Fittings)
  • Устройства регулирования потока (Appurtenances)

 

Для работы с напорными трубопроводными сетями в Civil .NET API необходимо подключить сборку AeccPressurePipesMgd.dll.

После этого получить список всех напорных трубопроводных сетей достаточно просто. Достаточно воспользоваться методом-расширением CivilDocument. GetPressurePipeNetworkIds(), который вернет список идентификаторов. Получить сам объект PressureNetwork в дальнейшем можно с помощью Transaction.GetObject().

Вообще, в Civil .NET API большинство объектов можно получить с помощью методов типа GetObjectNameIds(). Так, например, для получения списка поверхностей – CivilDocument.GetSurfaceIds(), для площадок – CivilDocument.GetSiteIds() и т.д.

Также и класс PressureNetwork имеет методы GetPipeIds() и GetFittingIds() для получения объектов Напорные трубы и фитинги конкретной напорной сети соответственно. Однако, метод GetAppurtenanceIds() для получения списка Устройств регулирования потоков – отсутствует.

 

Хотя при этом метод AddApurtenances() – присутствует. Ситуация конечно выглядит немного абсурдной и на лицо недоработка в API.

Также мы видим, что класс PressureAppurtenance, представляющий собой Устройство регулирования потока, присутствует в API. Поэтому есть надежда, что получить объекты этого класса все же можно.

Идея заключается в том, что сначала необходимо получить список всех объектов определенного типа из базы данных. В данном случае, объекта типа PressureAppurtenance. Класс PressureAppurtenance наследуются от класса PressurePart, который в свою очередь имеет свойство NetworkId.

 

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

Для получения списка объектов определенного типа воспользуемся методом Editor.SelectionAll(SelectionFilter).

Метод для получения списка всех идентификаторов объекта PressureAppurtenance:

Код - C#: [Выделить]
  1.         private IEnumerable<ObjectId> GetAllPressureAppurtenances(Editor ed)
  2.         {
  3.           
  4.             var tvs = new TypedValue[]
  5.             {
  6.                 new TypedValue((int) DxfCode.Start, "AECC_APPURTENANCE"),
  7.             };
  8.  
  9.             var selectionFilter = new SelectionFilter(tvs);
  10.  
  11.             var res = ed.SelectAll(selectionFilter);
  12.  
  13.             if (res.Status != PromptStatus.OK)
  14.             {
  15.                 yield break;
  16.             }
  17.  
  18.             var objectCollection = res.Value;
  19.  
  20.             foreach (SelectedObject selectedObject in objectCollection)
  21.             {
  22.                 yield return selectedObject.ObjectId;
  23.             }
  24.         }

Не буду подробно комментировать этот код. Отмечу лишь что имя класса Dxf для PressureAppurtenance равно AECC_APPURTENANCE.

Дальше, чтобы определить принадлежность устройства к конкретной сети, нужно получить сам объект PressureAppurtenance по идентификатору и сравнить свойство NetworkId с конкретной напорной трубопроводной сетью.

Код - C#: [Выделить]
  1.             // получим все устройства регулировании потока в базе данных
  2.             var appurtenanceIds = GetAllPressureAppurtenances(_document.Editor).ToList();
  3.  
  4.             // Сюда будем сохранять список устройств регулирования потока конкретной напорной сети
  5.             var appurtenances = new List<PressureAppurtenance>(appurtenanceIds.Count);
  6.  
  7.             using (var t = _document.TransactionManager.StartTransaction())
  8.             {
  9.                 foreach (ObjectId appurtenanceId in appurtenanceIds)
  10.                 {
  11.                     var pressureAppurtenance = t.GetObject(appurtenanceId, OpenMode.ForRead) as PressureAppurtenance;
  12.  
  13.                     // Здесь проверяем, что устройство регулирования потока принадлежит конкретной трубопроводной сети
  14.                     if (pressureAppurtenance.NetworkId.Equals(_pressurePipeNetwork.Id))
  15.                         appurtenances.Add(pressureAppurtenance);
  16.  
  17.                 }
  18.             }

Надеюсь что в следующих версиях Autodesk исправит это недоразумение и добавить метод GetAppurtenanceIds() для класса PressureNetwork.

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

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

Опубликовано 19.03.2014
Отредактировано 02.04.2014 в 21:34:57