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

ADN Club => Revit API => Тема начата: shss от 10-05-2017, 22:35:13

Название: Получение внешних границ стен
Отправлено: shss от 10-05-2017, 22:35:13
Добрый вечер!

Пытаюсь получить внешние сегменты стен замкнутой  комнаты. Для прямоугольных стен одной толщины достаточно просто.
Но как быть в случае:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fsavepic.ru%2F13921480m.png&hash=373a823ce9106052f195f38f6eeb7c1f) (http://savepic.ru/13921480.htm)

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


Название: Re: Получение внешних границ стен
Отправлено: Виктор Чекалин от 11-05-2017, 10:19:45
Сергей, встречный вопрос, а что будет считаться внешним контуром стены, в случае, если к внешнему контуру примыкают еще стены?

(https://s13.postimg.org/c3nr0wbhv/2017-05-11_1218.png) (https://postimg.org/image/c3nr0wbhv/)
Название: Re: Получение внешних границ стен
Отправлено: shss от 11-05-2017, 10:57:13
Виктор, такой случай не возможен, потому как я создаю стены сам исходя из внутреннего контура комнаты. Ну точнее, конечно возможен, просто у меня уже будет список, созданных и соединненых стен, которые образуют комнату, без учета внешних примыкающих.
В целом я, конечно, получаю внешний контур стен, используя поверхности, но вот как получить вот этот кусочек, ума не приложу:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fsavepic.ru%2F13909000m.png&hash=1b0fb57bd4ee9d0341b6da64a46b1725) (http://savepic.ru/13909000.htm)
И это самый простой пример:)
В ручном режиме, например когда создаю Floor, выбирая стену он сам выделяет эту границу, думал может и через API можно получить контур из списка стен.

Название: Re: Получение внешних границ стен
Отправлено: Виктор Чекалин от 12-05-2017, 10:28:49
Сергей, попробовал. Вроде нет проблем с указанной ситуацией.
Быстренько накидал код по отрисовке границ.
Исходный вариант:
(https://s9.postimg.org/3x8xqvq0b/2017-05-12_1224.png) (https://postimg.org/image/3x8xqvq0b/)
Границы:
(https://s27.postimg.org/esumpdtkf/2017-05-12_1225.png) (https://postimg.org/image/esumpdtkf/)

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

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

Покопаюсь еще немного в строну улучшения и дам код. Пока стыдно выкладывать:).
Название: Re: Получение внешних границ стен
Отправлено: shss от 12-05-2017, 10:45:39
Виктор, спасибо.

Я пока бьюсь над своим алгоритмом:
- Беру сегменты соприкосновения стен с комнатой;
- Сдвигаю их на толщину стены;
- Соединяю их;
- В случае когда соединяются стены разной толщины (или если стены параллельны и невозможно найти пересечение) у них координата Х или Y одинаковая, исходя из этого делаю дополнительную границу.
Название: Re: Получение внешних границ стен
Отправлено: Виктор Чекалин от 12-05-2017, 10:55:19
А в итоге нужен именно сегмент или какой то другой объект? в моем текущем варианте - это Edge или ModelLine, который я для визуализации использовал. Можно Face еще получить.
Название: Re: Получение внешних границ стен
Отправлено: shss от 12-05-2017, 11:14:29
В итоге мне надо получить Curve, чтобы создать пол.
Но Edge и Modelline прекрасно подходят.
Название: Re: Получение внешних границ стен
Отправлено: Виктор Чекалин от 12-05-2017, 11:21:52
В итоге мне надо получить Curve, чтобы создать пол.
Но Edge и Modelline прекрасно подходят.
Забавно, но мне когда то давно приходилось решать почти точно такую же задачу, только создать пол по центру стены. Там не возникало проблем.
На всякий случай предупрежу, что в случае проемов в полу, или, скажем помещения в центре помещения, с помощью Revit API не удастся создать пол. Например такой:
(https://s10.postimg.org/mf3vx8c11/2017-05-12_1321.png) (https://postimg.org/image/mf3vx8c11/)
Только одним сегментом.
Название: Re: Получение внешних границ стен
Отправлено: shss от 12-05-2017, 11:35:03
Забавно, но мне когда то давно приходилось решать почти точно такую же задачу, только создать пол по центру стены.
Мне еще предстоит бороться с таким случаем тоже, только часть стен брать внешнюю границу, а часть середину стены.


что в случае проемов в полу, или, скажем помещения в центре помещения, с помощью Revit API не удастся создать пол
Не требуется, во всяком случае пока.
Но если мне не изменяет память, я читал статью Jeremy, где он создавал пол с проемом для лестницы.
Название: Re: Получение внешних границ стен
Отправлено: Виктор Чекалин от 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 можно создать пол с несколькими сегментами.
Название: Re: Получение внешних границ стен
Отправлено: Виктор Чекалин от 12-05-2017, 11:40:50
Вот нашел, где я писал по этому поводу - http://thebuildingcoder.typepad.com/blog/2013/07/create-a-floor-with-an-opening-or-complex-boundary.html
Название: Re: Получение внешних границ стен
Отправлено: shss от 12-05-2017, 11:51:21
Внешнюю границу таким образом не получить. Попробовал.
То есть если выбрать Finish(Spatial element finish face), то не сработает?
Название: Re: Получение внешних границ стен
Отправлено: shss от 12-05-2017, 11:58:35
Цитата: Виктор Чекалин от 12-05-2017, 11:38:39
Внешнюю границу таким образом не получить. Попробовал.
То есть если выбрать Finish(Spatial element finish face), то не сработает?
Попробовал, не получилось:) А жаль.
Название: Re: Получение внешних границ стен
Отправлено: shss от 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.