Получение всех объектов вокруг Room

Автор Тема: Получение всех объектов вокруг Room  (Прочитано 493 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 127
  • Карма: 3
  • Sergey
  • Skype: sergey.s.shevtsov
Здравствуйте!
Столкнулся с интересной задачей, нужно получить все элементы окружающие Room.
Для стен написал так:
Код - C# [Выбрать]
  1. Room room = doc.GetElement(id) as Room;
  2. foreach (IList<Autodesk.Revit.DB.BoundarySegment> bsList in room.GetBoundarySegments(new SpatialElementBoundaryOptions())) {
  3. foreach (Autodesk.Revit.DB.BoundarySegment segments in bsList) {
  4.      Wall wall = segments.Element as Wall;
  5.      Curve curve = (LocationCurve)wall.Location as LocationCurve.Curve;
  6.      TaskDialog.Show("Bsegments", e.Name + " " + curve.Length * SCALE + "\n");
  7.      }
  8. }
  9.  
Далее пытался в стене найти окна или двери, но вся проблема в том, что одна стена может учавствовать в построении нескольких комнат, и если я нахожу в стене окно, то не факт что оно будет в выбранной комнате.
А также длины стен комнаты не являются корректными (потому что получен id всей стены, а не конкретно сегмента).
Есть ли возможность выбрать все элементы вокруг комнаты и получить корректные длины сегментов стены?

Спасибо


Оффлайн Антон Останин

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 4
Re: Получение всех объектов вокруг Room
« Ответ #1 : 12-12-2016, 18:05:29 »
Здравствуйте!
Попробуйте так:
Код - C# [Выбрать]
  1.                     SpatialElementGeometryCalculator calc = new SpatialElementGeometryCalculator(doc, new SpatialElementBoundaryOptions());
  2.                     SpatialElementGeometryResults results = calc.CalculateSpatialElementGeometry(room);
  3.                     var roomSolid = results.GetGeometry();
  4.                     foreach (Face face in roomSolid.Faces)
  5.                     {
  6.                         IList<SpatialElementBoundarySubface> subfaceList = results.GetBoundaryFaceInfo(face);
  7.                         foreach (SpatialElementBoundarySubface subface in subfaceList)                                              //Перебор всех прилегающих поверхностей к помещению
  8.                         {
  9.                            var area =  subface.GetSubface().Area;          //Площадь соприкосновения
  10.                         }
  11.                      }
  12.  

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 127
  • Карма: 3
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение всех объектов вокруг Room
« Ответ #2 : 13-12-2016, 09:46:15 »
Спасибо, этот код подойдет для получения длины сегментов стены, но правда не всегда отрабатывает если нет соприкосновения со стеной.

Оффлайн Антон Останин

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 4
Re: Получение всех объектов вокруг Room
« Ответ #3 : 13-12-2016, 09:52:31 »
Так это логично, если нет пересечения. :)

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 600
  • Карма: 75
  • Skype: chekalin-v
Re: Получение всех объектов вокруг Room
« Ответ #4 : 24-12-2016, 23:26:14 »
Далее пытался в стене найти окна или двери, но вся проблема в том, что одна стена может учавствовать в построении нескольких комнат, и если я нахожу в стене окно, то не факт что оно будет в выбранной комнате.
Сергей, окна, двери и любые другие элементы, находящиеся на стене, фактически не являются границами стен. Антон подсказал веерный метод для обнаружения границ помещения.
Ты верно отметил, что окно или дверь, находящееся на стене, может быть и за пределами конкретной комнаты. Самый простой способ понять, принадлежит ли окно/дверь  конкретному помещению - проверить свойства FamilyInstance.FromRoom и FamilyInstance.ToRoom