Работа со стенами

Автор Тема: Работа со стенами  (Прочитано 4977 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Работа со стенами
« : 10-09-2015, 15:42:04 »
Добрый день!

У меня есть файл с координатами точек стен, по которым я строю, собственно стены. Алгоритм достаточно прост, первая точка - вторая точка - построение Line - построение Wall.
Но все было бы хорошо, если бы не одно НО. Есть точки одной и той же стены с разных сторон. То есть я строю в Revit две стены, а по факту это одна и та же стена для разных комнат. Фактически я имею координаты не самой стены, а ее поверхности.
Ну и тут получается два варианта, либо они накладываются друг на друга (если толщина стены достаточно велика), либо они находятся на каком-то расстоянии друг от друга (если толщины не достаточно). Соответственно, надо из двух стен сделать одну с толщиной, которая равна расстоянию между поверхностями стен.
Пока у моя заключается в том чтобы построить стены, а потом перебирая все стены, найти наиболее близкие друг к другу через GetEndPoint прямой стены, но тут проблема в том, что поверхность стены с разных сторон комнат разной длины.
Если другие варианты решения задачи?

Спасибо

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Работа со стенами
« Ответ #1 : 10-09-2015, 16:37:01 »
День добрый! то есть из файла не понятно, что некая точка А - это одна поверхность стены, а точка Б - это другая поверхность той же стены?

А что если сделать так:
для каждой стены берем LocationCurve, делаем её копию (метод Clone), затем вызываем MakeUnbound() - получили бесконечную прямую.
Затем попарно их пересекаем метод Intersect(), если пересечений нет (метод возвращает SetComparisonResult.Disjoint - There is no intersection found between the two curves), значит стенки параллельны, мы можем у LocationCurve второй стены взять GetEndPoint(0), вызвать curve(первой стены).Project() - в результате определить расстояние между двумя параллельными стенами, точнее между их осевыми, а дальше можно уже просто сравнить значения и сделать нужные телодвижения

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Работа со стенами
« Ответ #2 : 10-09-2015, 17:20:41 »
Совершенно верно, нет абсолютно никакого описания точек или их принадлежности.
Идея хорошая, и скорее всего в большинстве случаев подойдет, но вы знаете какие у нас стены:) и параллельность не всегда будет между стенами. Я думал перебирать LocationCurve каждой стены и если стены не пересекаются и если расстояния между GetEndPoint(0) и (1) каждой из этих стен меньше определенного расстояния, разрезать стену и утолщать ее (созданием новой стены с новой толщиной и присоединением старых концов стен), а при пересечении использовать SolidSolidCutUtils для join geometry.
Но опять же слишком много нюансов.


Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Работа со стенами
« Ответ #3 : 10-09-2015, 17:54:11 »
Ну тогда LocationCurve одной стенки также делаем безграничным, проецируем на нее GetEndPoint-ы второй стенки, если расстояния различаются меньше, чем на заданный эпсилон, считаем стенки параллельными. Ну да, а дальше с геометрией нюансов - море