Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 17-02-2024, 20:48:59
-
Всех приветствую. Кто-то решал проблему как можно глобальную координату вложенного блока при использовании NestedEntity?
Если блоки располагаются друг в друге не поворачиваясь, то задача простая. Но стоит один из родительски блоков повернуть, то координаты надо считать совсем иначе.
Прикладываю картинку - Есть блок с атрибутом А1 (Выделен красным). Пользователь щёлкает только по атрибуту. Этот блок вложен в другой блок, который вставляется в другой блок и, при этом, поворачивается. И нужно узнать хотя бы глобальные координаты синей точки. А в идеале глобальный поворот.
(https://i.postimg.cc/BtVKMtZt/Screenshot-2024-02-17-203908.png) (https://postimg.cc/BtVKMtZt)
-
Находишь всю цепочку вложений и используя метод BlockTransform получаешь матрицы преобразования.
Пример рекурсивного использования: https://adn-cis.org/forum/index.php?topic=2933.msg12071#msg12071
-
Находишь всю цепочку вложений и используя метод BlockTransform получаешь матрицы преобразования.
Пример рекурсивного использования: https://adn-cis.org/forum/index.php?topic=2933.msg12071#msg12071
У меня почему-то через матрицы трансформаций не получается найти правильные координаты.
Ведь я правильно понимаю, что если у меня вложенные блоки, то я для всех блоков беру BlockTransform и переумножаю их?
https://help.autodesk.com/view/OARX/2022/ENU/?guid=GUID-4F71D4FB-FBF4-4EB3-B546-24B8858FBB94
Вот по этому способу я так же получил результат, что и простое умножение матриц.
Единственное решение, которое я нашёл это через Position получать координаты вставки блоков, отслеживать поворот блока и, если блок повернулся, то пересчитывать координаты вложенных блоков через полярные координаты.
-
Ну я в свое время не перемножал, когда вылезла рекурсия просто создал список трансформаций и при новом вложении просто добавлял инвертированную матрицу в список, а в конце просто трансформировал объект в цикле foreach матрицами из получившегося списка, ну тут думаю примерно тоже самое что и перемножение, но с матрицами я не особо знаком так что в такие дебри лезть не стал. Тут кстати важную роль играет в какой последовательность идут преобразования.
-
Тут кстати важную роль играет в какой последовательность идут преобразования.
Именно. И соответственно перемножение матриц должно быть в определенном порядке.
-
Lemieux,
А ты учел, что на самом нижнем уровне матрицу BlockTransform не нужно применять? Атрибут не подчиняется этому преобразованию.
-
Lemieux,
А ты учел, что на самом нижнем уровне матрицу BlockTransform не нужно применять? Атрибут не подчиняется этому преобразованию.
Да, это я учёл, но забыл свойства матриц. Всем спасибо! Всё работает. Осталось решить вопрос с определением поворота. Но тут я думаю просто буду склыдвать у всех блоков Rotation, а потом поворачивать то, что надо.
PS Так, я тут поэкспериментировал. А я правильно понимаю, что с помощью CoordinateSystem3D можно узнать поворот и "направление" куда смотрит блок?
-
Но тут я думаю просто буду склыдвать у всех блоков Rotation, а потом поворачивать то, что надо.
Матрица BlockTransform учитывает поворот и масштабирование блока. Только для самого атрибута следует учитывать поворот.
-
Угол поворота я вычислил просто. Получил Xaxis у обоих CoordinateSystem3D (локальная и глобальная) и через GetAngleTo вычислил угол.