Как получить разделители помещений в Revit 2017

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

 public FindsRoomSeperators(){
        SpatialElementBoundaryOptions options = new SpatialElementBoundaryOptions();
        options.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Finish;

        foreach (IList<Autodesk.Revit.DB.BoundarySegment> boundSegList in room.GetBoundarySegments(options))
                {
                    foreach (Autodesk.Revit.DB.BoundarySegment boundSeg in boundSegList)
                            if ((BuiltInCategory)el.Category.Id.IntegerValue == BuiltInCategory.OST_RoomSeparationLines)
                                 //proccess el
                 }
   }

Однако, как и в Revit 2017, этот код теперь выдает метод, который не найден: «Autodesk.Revit.DB.Element Autodesk.Revit.DB.BoundarySegment.get_Element ()». исключение, предполагающее, что этот метод был удален.

      var geometry = (Solid)room.get_Geometry(new Options()).First();
      var faces = geometry.Faces;

И хотя это позволяет мне судить о таких вещах, как пол, стоящий под углом, он не говорит мне, какие края исходят от стен, а какие - от разделителей комнаты.

В идеале я мог бы взять те лица, которые у нас есть, и проверить, не является ли какой-либо из краев лица разделителем комнаты. У меня уже есть список всех стен, если это поможет.

Итак, как это сделать в Revit 2017? Желательно без нарушения совместимости с 2015 годом.


person Thijser    schedule 07.07.2016    source источник
comment
GetBoundarySegments () не был удален из API в 2017 году, он все еще существует (даже не отмечен как «устаревший»). Вы не пропустили ссылку?   -  person Augusto Goncalves    schedule 07.07.2016
comment
Код генерирует исключение в цикле foreach при вызове в 2017 году, но отлично работает в 2016 году. Вышеупомянутый метод вызывает исключение: Метод не найден: «Autodesk.Revit.DB.Element Autodesk.Revit.DB.BoundarySegment.get_Element ()».   -  person Thijser    schedule 07.07.2016


Ответы (2)


Это ожидается и задокументировано в файле Изменения и дополнения API платформы Revit (см. SDK), этот метод был помечен как устаревший в 2016 году и был удален в 2017 году.

Вместо этого вы должны использовать ElementId или LinkElementId (см. Документацию).

foreach (Autodesk.Revit.DB.BoundarySegment boundSeg in boundSegList)
{
  Element el = doc.GetElement(boundSeg.ElementId); // or doc.GetElement(boundSeg.LinkElementId);
  if ((BuiltInCategory)el.Category.Id.IntegerValue == BuiltInCategory.OST_RoomSeparationLines)
  {

  }
}
person Augusto Goncalves    schedule 07.07.2016
comment
Может быть, boundSeg.ElementId не существует в Revit 2015? Это дает мне ошибку: граничный сегмент не содержит определения для «ElementID». - person Thijser; 07.07.2016
comment
Да, свойство BoundarySegment.ElementId было введено в 2016 году (согласно документации) - person Augusto Goncalves; 07.07.2016
comment
Вы случайно не знаете, как разрешить мне использовать и то, и другое? Мне нужно участвовать как в 2015, так и в 2017 году. - person Thijser; 07.07.2016
comment
вы можете использовать Dynamic, см. мое первое предложение (и улучшенную версию) на stackoverflow.com/a/33401274/4838205 - person Augusto Goncalves; 07.07.2016

Документация изменений и дополнений Revit Platform API, на которую указывает Аугусто выше, также доступна в Интернете:

http://thebuildingcoder.typepad.com/blog/2016/04/whats-new-in-the-revit-2017-api.html.

Просто найдите BoundarySegment. Отсутствующий метод get_Element на самом деле является оболочкой для свойства Element, которое было удалено в Revit 2017.

Пример, демонстрирующий использование библиотеки .NET Reflection для поддержки различных функций в разных версиях Revit, предоставлен The Building Coder по адресу

http://thebuildingcoder.typepad.com/blog/2012/07/multi-version-add-in.html

person Jeremy Tammik    schedule 07.07.2016