Получение внешних границ стен

Автор Тема: Получение внешних границ стен  (Прочитано 6336 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Добрый вечер!

Пытаюсь получить внешние сегменты стен замкнутой  комнаты. Для прямоугольных стен одной толщины достаточно просто.
Но как быть в случае:


Касательно примера, внизу это соединение двух стен с разной толщиной, по внутренней линии стены.



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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Получение внешних границ стен
« Ответ #1 : 11-05-2017, 10:19:45 »
Сергей, встречный вопрос, а что будет считаться внешним контуром стены, в случае, если к внешнему контуру примыкают еще стены?



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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение внешних границ стен
« Ответ #2 : 11-05-2017, 10:57:13 »
Виктор, такой случай не возможен, потому как я создаю стены сам исходя из внутреннего контура комнаты. Ну точнее, конечно возможен, просто у меня уже будет список, созданных и соединненых стен, которые образуют комнату, без учета внешних примыкающих.
В целом я, конечно, получаю внешний контур стен, используя поверхности, но вот как получить вот этот кусочек, ума не приложу:

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


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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Получение внешних границ стен
« Ответ #3 : 12-05-2017, 10:28:49 »
Сергей, попробовал. Вроде нет проблем с указанной ситуацией.
Быстренько накидал код по отрисовке границ.
Исходный вариант:

Границы:


Как видишь, указанный тобой участок корректно обрабатывается. Сейчас отрисовываются еще и внутренние границы, но это поправимо.

Общий алгоритм такой:
1) Берем помещение
2) Находим все стены, которые являются границами помещения
3) Берем геометрию каждой стены, рисуем грани.

Покопаюсь еще немного в строну улучшения и дам код. Пока стыдно выкладывать:).

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение внешних границ стен
« Ответ #4 : 12-05-2017, 10:45:39 »
Виктор, спасибо.

Я пока бьюсь над своим алгоритмом:
- Беру сегменты соприкосновения стен с комнатой;
- Сдвигаю их на толщину стены;
- Соединяю их;
- В случае когда соединяются стены разной толщины (или если стены параллельны и невозможно найти пересечение) у них координата Х или Y одинаковая, исходя из этого делаю дополнительную границу.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Получение внешних границ стен
« Ответ #5 : 12-05-2017, 10:55:19 »
А в итоге нужен именно сегмент или какой то другой объект? в моем текущем варианте - это Edge или ModelLine, который я для визуализации использовал. Можно Face еще получить.

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение внешних границ стен
« Ответ #6 : 12-05-2017, 11:14:29 »
В итоге мне надо получить Curve, чтобы создать пол.
Но Edge и Modelline прекрасно подходят.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Получение внешних границ стен
« Ответ #7 : 12-05-2017, 11:21:52 »
В итоге мне надо получить Curve, чтобы создать пол.
Но Edge и Modelline прекрасно подходят.
Забавно, но мне когда то давно приходилось решать почти точно такую же задачу, только создать пол по центру стены. Там не возникало проблем.
На всякий случай предупрежу, что в случае проемов в полу, или, скажем помещения в центре помещения, с помощью Revit API не удастся создать пол. Например такой:

Только одним сегментом.

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение внешних границ стен
« Ответ #8 : 12-05-2017, 11:35:03 »
Забавно, но мне когда то давно приходилось решать почти точно такую же задачу, только создать пол по центру стены.
Мне еще предстоит бороться с таким случаем тоже, только часть стен брать внешнюю границу, а часть середину стены.


что в случае проемов в полу, или, скажем помещения в центре помещения, с помощью Revit API не удастся создать пол
Не требуется, во всяком случае пока.
Но если мне не изменяет память, я читал статью Jeremy, где он создавал пол с проемом для лестницы.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Получение внешних границ стен
« Ответ #9 : 12-05-2017, 11:38:39 »
Мне еще предстоит бороться с таким случаем тоже
А в случае с центром или с финишным покрытием там и бороться то не надо. Для этого есть методы.
Код - C# [Выбрать]
  1. SpatialElementBoundaryOptions options =
  2.                 new SpatialElementBoundaryOptions();
  3.  
  4.             // to calculate space boundary location on the wall center
  5.             options.SpatialElementBoundaryLocation =
  6.                 SpatialElementBoundaryLocation.Center;
  7.  
  8.             var boundarySegments =
  9.                 room.GetBoundarySegments(options);

Внешнюю границу таким образом не получить. Попробовал.

Но если мне не изменяет память, я читал статью Jeremy, где он создавал пол с проемом для лестницы.
На сколько я помню, там эти проемы создавались с помощью объекта Проем. Я вроде сам об этом ему писал тогда. Но в интерфейсе Revit можно создать пол с несколькими сегментами.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Получение внешних границ стен
« Ответ #10 : 12-05-2017, 11:40:50 »
Вот нашел, где я писал по этому поводу - http://thebuildingcoder.typepad.com/blog/2013/07/create-a-floor-with-an-opening-or-complex-boundary.html

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение внешних границ стен
« Ответ #11 : 12-05-2017, 11:51:21 »
Внешнюю границу таким образом не получить. Попробовал.
То есть если выбрать Finish(Spatial element finish face), то не сработает?

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение внешних границ стен
« Ответ #12 : 12-05-2017, 11:58:35 »
Цитата: Виктор Чекалин от 12-05-2017, 11:38:39
Внешнюю границу таким образом не получить. Попробовал.
То есть если выбрать Finish(Spatial element finish face), то не сработает?
Попробовал, не получилось:) А жаль.

Отмечено как Решение shss 15-05-2017, 12:12:20

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Получение внешних границ стен
« Ответ #13 : 12-05-2017, 22:08:10 »
В итоге, добил я свой алгоритм:)
Код - C# [Выбрать]
  1. //получаю сегмент стены и прилежащую стену к комнате
  2. SpatialElementBoundaryOptions segmentOptions = new SpatialElementBoundaryOptions();
  3. segmentOptions.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Center;
  4. foreach (IList<Autodesk.Revit.DB.BoundarySegment> loop in space.GetBoundarySegments(segmentOptions)) {
  5.     foreach (Autodesk.Revit.DB.BoundarySegment segment in loop) {
  6.         spaceSurroundWalls.Add(new WallSegment { Wall = doc.GetElement(segment.ElementId) as Wall, Curve = segment.GetCurve() });
  7.     }
  8. }
  9.  
  10. //пробегаюсь по списку и сдвигаю сегмент на половину толщины стены
  11. List<ModelCurve> modelCurves = new List<ModelCurve>();
  12. for (int i = 0; i < spaceSurroundWalls.Count; i++) {
  13.     Wall activeWall = spaceSurroundWalls[i].Wall;
  14.     Curve activeCurve = spaceSurroundWalls[i].Curve;
  15.     XYZ startPoint = activeCurve.GetEndPoint(0);
  16.     XYZ endPoint = activeCurve.GetEndPoint(1);
  17.     //случай когда пересечение стен дает сегмент принадлежности комнаты, но стены как такойвой не существует, а есть их присоединение
  18.     if (null == activeWall) {
  19.         modelCurves.Add(UtilsRevit.ModelLineCreation(commandData.Application, startPoint, endPoint, 0));
  20.         continue;
  21.     }
  22.     double offset = activeWall.WallType.Width / 2;
  23.     modelCurves.Add(UtilsRevit.ModelLineCreation(commandData.Application, startPoint, endPoint, offset));
  24. }
  25.  
  26. //соединяю сегменты
  27. for (int i = 0; i < modelCurves.Count; i++) {
  28.     if (i == modelCurves.Count - 1) {
  29.         UtilsRevit.CurvesJoin(doc, modelCurves[i], modelCurves[0]);
  30.     }
  31.     else {
  32.         UtilsRevit.CurvesJoin(doc, modelCurves[i], modelCurves[i + 1]);
  33.     }
  34. }
  35.