Сообщество программистов Autodesk в СНГ
ADN Club => Revit API => Тема начата: shss от 10-09-2015, 15:42:04
-
Добрый день!
У меня есть файл с координатами точек стен, по которым я строю, собственно стены. Алгоритм достаточно прост, первая точка - вторая точка - построение Line - построение Wall.
Но все было бы хорошо, если бы не одно НО. Есть точки одной и той же стены с разных сторон. То есть я строю в Revit две стены, а по факту это одна и та же стена для разных комнат. Фактически я имею координаты не самой стены, а ее поверхности.
Ну и тут получается два варианта, либо они накладываются друг на друга (если толщина стены достаточно велика), либо они находятся на каком-то расстоянии друг от друга (если толщины не достаточно). Соответственно, надо из двух стен сделать одну с толщиной, которая равна расстоянию между поверхностями стен.
Пока у моя заключается в том чтобы построить стены, а потом перебирая все стены, найти наиболее близкие друг к другу через GetEndPoint прямой стены, но тут проблема в том, что поверхность стены с разных сторон комнат разной длины.
Если другие варианты решения задачи?
Спасибо
-
День добрый! то есть из файла не понятно, что некая точка А - это одна поверхность стены, а точка Б - это другая поверхность той же стены?
А что если сделать так:
для каждой стены берем LocationCurve, делаем её копию (метод Clone), затем вызываем MakeUnbound() - получили бесконечную прямую.
Затем попарно их пересекаем метод Intersect(), если пересечений нет (метод возвращает SetComparisonResult.Disjoint - There is no intersection found between the two curves), значит стенки параллельны, мы можем у LocationCurve второй стены взять GetEndPoint(0), вызвать curve(первой стены).Project() - в результате определить расстояние между двумя параллельными стенами, точнее между их осевыми, а дальше можно уже просто сравнить значения и сделать нужные телодвижения
-
Совершенно верно, нет абсолютно никакого описания точек или их принадлежности.
Идея хорошая, и скорее всего в большинстве случаев подойдет, но вы знаете какие у нас стены:) и параллельность не всегда будет между стенами. Я думал перебирать LocationCurve каждой стены и если стены не пересекаются и если расстояния между GetEndPoint(0) и (1) каждой из этих стен меньше определенного расстояния, разрезать стену и утолщать ее (созданием новой стены с новой толщиной и присоединением старых концов стен), а при пересечении использовать SolidSolidCutUtils для join geometry.
Но опять же слишком много нюансов.
-
Ну тогда LocationCurve одной стенки также делаем безграничным, проецируем на нее GetEndPoint-ы второй стенки, если расстояния различаются меньше, чем на заданный эпсилон, считаем стенки параллельными. Ну да, а дальше с геометрией нюансов - море