Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2011-05-25

Тонкости архитектуры

Оно конечно, у всех свои резоны делать так а не иначе. Но некоторые резоны бывают сильно неочевидны.

Вот возьмем простую функцию 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

Должно быть так, я еще не проверял.

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)