- Оно конечно, у всех свои резоны делать так а не иначе. Но некоторые резоны бывают сильно неочевидны.
-
- Вот возьмем простую функцию GetUCSMatrix() реализованную в ActiveX AutoCAD (дада, я все еще мудохаюсь с автокадом, вроде дело идет к победе через измор). В доках видно, что это метод интерфейса IAcadUCS, который берется из Document.ActiveUCS. Ну а документ — это интерфейс чертежа. Итого имеем:
- acad.ActiveDocument.ActiveUCS.GetUCSMatrix()
- Прекрасно. Применяем на практике — облом.
-
- Дебаг показывает, что обьекта ActiveUCS в чертеже нет. Как же так, ведь видно невооруженным глазом, что ось Х повернута вверх, чего быть не может в мировой СК (а может быть только в UCS)? Да и вызов диалога управления пользовательскими СК показывает, что в чертеже вполне конкретная UCS, и она активна. Что получается, пользовательская СК есть, но через программный интерфейс она недоступна.
-
- Бред? Бред. Дальше — больше. Чтение доступных источников приводит заключению (подтвержденному тестовым примером кода), что если UCS не имеет имени (Unnamed не в счет!), то ее как бы и нет, хотя она работает. А если имя есть, то и ActiveUCS есть.
-
- Вот и скажите мне, какой логикой руководствовался тот архитектор, который такое придумал? Почему при наличии активной UCS я не могу ее получить через API? Почему критерием доступности сделано наличие необязательного имени а не наличие обязательного влияния на координаты? Я не постигаю.
-
- Возникает логичный вопрос — а делать то чего? Источники показывают, что если ПСК есть но без имени, то ее параметры надо брать из системных переменных, например так:
m = (self.doc.GetVariable('UCSNAME'), \
self.doc.GetVariable('UCSXDIR'), self.doc.GetVariable('UCSYDIR'), \
(0.0, 0.0, 0.0), self.doc.GetVariable('UCSORG')) |
Этот код позволяет получить результат, похожий на предполагаемый:
m = ucs.GetUCSMatrix()
m = (self.doc.GetVariable('UCSNAME'), m[0], m[1], m[2], m[3]) |
- Особо отмечу — похожий, ибо нормальная матрица представляет собой четыре массива по четыре числа, в то время как из системных переменных можно получить только три массива по три числа. Где брать четвертый вектор — ну совершенно непонятно. Игнорировать.
-
- Отдельный цимес в том, что не имея доступа к UCS через API, ее невозможно поименовать, чтобы снять проблему безымянности. Только ручкаме, через GUI.
- Хотя, может я не все варианты еще проверил?
-
- На этом фоне совершенно теряется фокус с переменными типа VARIANT. Выглядит этот фокус так:
p = array.array('d', [point[0], point[1], point[2]])
norm = array.array('d', [norm[0], norm[1], norm[2]])
res = self.u.TranslateCoordinates(p, csFrom, csTo, disp, norm) |
- p и norm это «точки» в терминологии API. Просто VARIANT массивы из трех чисел.
- Фокус, видимо, связан с реализацией конструктора класса VARIANT в Python. В кишки я не залезал. Во всяком случае, так как написано — работает, иначе - нет.
-
- Да, чуть не забыл. Как использовать матрицу. Поскольку координаты примитивов я сохраняю в мировой СК (WCS) а чертежники трудились в UCS, надо иметь возможность выдать координаты, выдранные из чертежа, опять в UCS. Матрица дает пересчет координат:
(a1,a2,a3) (b1,b2,b3), (c1,c2,c3), (d1,d2,d3)
x = x*a1 + y*b1 + z*c1 + d1
y = x*a2 + y*b2 + z*c2 + d2
z = x*a3 + y*b3 + z*c3 + d3 |
- exchange.autodesk.com/autocadarchitecture
-
- Должно быть так, я еще не проверял.
-
Комментариев нет:
Отправить комментарий