Как получить устройства регулирования потока для напорной трубопроводной сети
Напорная трубопроводная сеть (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:
- private IEnumerable<ObjectId> GetAllPressureAppurtenances(Editor ed)
- {
- var tvs = new TypedValue[]
- {
- new TypedValue((int) DxfCode.Start, "AECC_APPURTENANCE"),
- };
- var selectionFilter = new SelectionFilter(tvs);
- var res = ed.SelectAll(selectionFilter);
- if (res.Status != PromptStatus.OK)
- {
- yield break;
- }
- var objectCollection = res.Value;
- foreach (SelectedObject selectedObject in objectCollection)
- {
- yield return selectedObject.ObjectId;
- }
- }
Не буду подробно комментировать этот код. Отмечу лишь что имя класса Dxf для PressureAppurtenance равно AECC_APPURTENANCE.
Дальше, чтобы определить принадлежность устройства к конкретной сети, нужно получить сам объект PressureAppurtenance по идентификатору и сравнить свойство NetworkId с конкретной напорной трубопроводной сетью.
- // получим все устройства регулировании потока в базе данных
- var appurtenanceIds = GetAllPressureAppurtenances(_document.Editor).ToList();
- // Сюда будем сохранять список устройств регулирования потока конкретной напорной сети
- var appurtenances = new List<PressureAppurtenance>(appurtenanceIds.Count);
- using (var t = _document.TransactionManager.StartTransaction())
- {
- foreach (ObjectId appurtenanceId in appurtenanceIds)
- {
- var pressureAppurtenance = t.GetObject(appurtenanceId, OpenMode.ForRead) as PressureAppurtenance;
- // Здесь проверяем, что устройство регулирования потока принадлежит конкретной трубопроводной сети
- if (pressureAppurtenance.NetworkId.Equals(_pressurePipeNetwork.Id))
- appurtenances.Add(pressureAppurtenance);
- }
- }
Надеюсь что в следующих версиях Autodesk исправит это недоразумение и добавить метод GetAppurtenanceIds() для класса PressureNetwork.
Автор перевода: Виктор Чекалин
Обсуждение: http://adn-cis.org/forum/index.php?topic=621
Опубликовано 19.03.2014Отредактировано 02.04.2014 в 21:34:57