ADN Club => Revit API => Тема начата: bronx от 07-01-2022, 19:24:15
Название: Поворот элемента в соответствии с другим элементом
Отправлено: bronx от 07-01-2022, 19:24:15
Приветствую. Просьба подсказать , как можно повернуть элемент - большой круг(смотри вложение), чтобы он был в той же плоскости, что и маленький. Т.е. чтобы получилось, как на второй пикче.
Название: Re: Поворот элемента в соответствии с другим элементом
Отправлено: Александр Игнатович от 07-01-2022, 19:40:44
Берем нормали плоскостей большого и малого кружков, вычисляем их векторное произведение (CrossProduct). Если получился нулевой вектор, то значит плоскости либо параллельны, либо совпадают. Если нет, то получившийся вектор - ось вращения. Дальше считаем угол в плоскости, определенной нормалью получившегося вектора (AngleOnPlaneTo). Поворачиваем вокруг рассчитанной оси на заданный угол. Круги на параллельных плоскостях, дальше перемещаем к заданной, это, вроде, совсем просто
Название: Re: Поворот элемента в соответствии с другим элементом
Отправлено: bronx от 08-01-2022, 19:33:14
не работал с AngleOnPlaneTo. Приведу пример кода, поправте, если будут недочёты.
Название: Re: Поворот элемента в соответствии с другим элементом
Отправлено: Александр Игнатович от 10-01-2022, 11:40:44
Неплохо было бы проверить, а ну как твои круги уже в одной плоскости или параллельных лежат (crossProduct.IsAlmostEqualTo(XYZ.Zero)) Неправильная ось поворота. Тут вообще говоря, возможны 2 способа:
1) Способ посложнее, но зато позволяет решить задачу за один поворот. Описываешь обе плоскости в каноническом виде Ax+By+Cz + D = 0, решаешь систему уравнений - получаешь уравнение прямой, выбираешь произвольную точку на ней
2) Способ попроще, возьми центр круга, который хочешь повернуть, но тогда дополнительно к Rotate ещё нужен Move, чтобы переместить в одну плоскость
В любом случае, нужно переделать создание оси поворота. Для этой оси можно задать unbound: