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

ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 17-02-2024, 20:48:59

Название: Глобальная координата вложенного блока при использовании NestedEntity
Отправлено: Lemieux от 17-02-2024, 20:48:59
Всех приветствую. Кто-то решал проблему как можно глобальную координату вложенного блока при использовании NestedEntity?
Если блоки располагаются друг в друге не поворачиваясь, то задача простая. Но стоит один из родительски блоков повернуть, то координаты надо считать совсем иначе.
Прикладываю картинку - Есть блок с атрибутом А1 (Выделен красным). Пользователь щёлкает только по атрибуту. Этот блок вложен в другой блок, который вставляется в другой блок и, при этом, поворачивается. И нужно узнать хотя бы глобальные координаты синей точки. А в идеале глобальный поворот.
(https://i.postimg.cc/BtVKMtZt/Screenshot-2024-02-17-203908.png) (https://postimg.cc/BtVKMtZt)
Название: Re: Глобальная координата вложенного блока при использовании NestedEntity
Отправлено: Александр Ривилис от 17-02-2024, 23:04:12
Находишь всю цепочку вложений и используя метод BlockTransform получаешь матрицы преобразования.
Пример рекурсивного использования: https://adn-cis.org/forum/index.php?topic=2933.msg12071#msg12071
Название: Re: Глобальная координата вложенного блока при использовании NestedEntity
Отправлено: Lemieux от 18-02-2024, 14:25:03
Находишь всю цепочку вложений и используя метод 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 получать координаты вставки блоков, отслеживать поворот блока и, если блок повернулся, то пересчитывать координаты вложенных блоков через полярные координаты.
Название: Re: Глобальная координата вложенного блока при использовании NestedEntity
Отправлено: alz от 18-02-2024, 15:07:09
Ну я в свое время не перемножал, когда вылезла рекурсия просто создал список трансформаций и при новом вложении просто добавлял инвертированную матрицу в список, а в конце просто трансформировал объект в цикле foreach матрицами из получившегося списка, ну тут думаю примерно тоже самое что и перемножение, но с матрицами я не особо знаком так что в такие дебри лезть не стал. Тут кстати важную роль играет в какой последовательность идут преобразования.
Название: Re: Глобальная координата вложенного блока при использовании NestedEntity
Отправлено: Александр Ривилис от 18-02-2024, 15:24:07
Тут кстати важную роль играет в какой последовательность идут преобразования.
Именно. И соответственно перемножение матриц должно быть в определенном порядке.
Название: Re: Глобальная координата вложенного блока при использовании NestedEntity
Отправлено: Александр Ривилис от 18-02-2024, 15:26:00
Lemieux,
А ты учел, что на самом нижнем уровне матрицу BlockTransform не нужно применять? Атрибут не подчиняется этому преобразованию.
Название: Re: Глобальная координата вложенного блока при использовании NestedEntity
Отправлено: Lemieux от 18-02-2024, 16:16:40
Lemieux,
А ты учел, что на самом нижнем уровне матрицу BlockTransform не нужно применять? Атрибут не подчиняется этому преобразованию.
Да, это я учёл, но забыл свойства матриц. Всем спасибо! Всё работает. Осталось решить вопрос с определением поворота. Но тут я думаю просто буду склыдвать у всех блоков Rotation, а потом поворачивать то, что надо.

PS Так, я тут поэкспериментировал. А я правильно понимаю, что с помощью CoordinateSystem3D можно узнать поворот и "направление" куда смотрит блок?
Название: Re: Глобальная координата вложенного блока при использовании NestedEntity
Отправлено: Александр Ривилис от 18-02-2024, 16:28:35
Но тут я думаю просто буду склыдвать у всех блоков Rotation, а потом поворачивать то, что надо.
Матрица BlockTransform учитывает поворот и масштабирование блока. Только для самого атрибута следует учитывать поворот.
Название: Re: Глобальная координата вложенного блока при использовании NestedEntity
Отправлено: Lemieux от 18-02-2024, 16:45:08
Угол поворота я вычислил просто. Получил Xaxis у обоих CoordinateSystem3D (локальная и глобальная) и через GetAngleTo вычислил угол.