nanoCAD преобразовать ObjectId в McObjectId
Автор: Кулик Алексей aka kpblc | Дата: 31 Октябрь 2024 · 2 коммент.
Время от времени то на форуме, то в чате, то самому мне надо преобразовать ObjectId в McObjectId - т.е. "нативный" Id в "мультикадовский". Штатных средств ни в NET, ни в лиспе не существует. Но это не означает, что подобного уже кто-то где-то не делал!
Начну с .NET, поскольку он на данный момент в большем приоритете.
Конечно, можно играться с выбором примитивов, но выглядит такая затея откровенно бледно. Особенно учитывая, что
Андрей Разыграев уже давно все придумал:
решение на dwg.ru.
Основная идея заключена (как мне кажется) всего в одной строке:
1
| McObjectId mcsId = Multicad.McObjectId.FromOldIdPtr(objID.OldIdPtr); |
Ну и в обратном порядке
1
| ObjectId newId = new ObjectId (mcsId .ToOldIdPtr()); |
Почему подобный код не был включен в SDK в качестве расширений для ObjectId / McObjectId,- тайна.
lisp, но только преобразование в сторону MultiCAD
На лиспе была задача только “из нативного в мультикад”, обратного преобразования не требовалось. Так что привожу код ровно в том виде, как он был в чате:
1 2 3 4 5 6 7 8 9
| (vl-load-com)
(setq spds (vlax-get-or-create-object "mccom2.server"))
; Select entity
(setq ename-table (car (entsel "\nSelect entity")))
(setq ss (ssadd))
(ssadd ename-entity ss)
(sssetfirst ss ss)
(setq selection (vlax-invoke spds 'select "Select"))
(setq spds-table (vla-item selection 1)) |
Так-то в чате требовалось получать и обрабатывать таблицы, так что вот и код для них:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| (defun get-table-by-handle (spds handle / ename_table ss spds_table selection)
;|
(setq spds (vlax-get-or-create-object "mccom2.server"))
(setq lst (get-table-by-handle spds "ABCEF"))
|;
(vl-load-com)
; Select entity
(setq ename_table (handent handle)
ss (ssadd)
)
(ssadd ename_table ss)
(sssetfirst ss ss)
(setq selection (vlax-invoke spds 'select "")
spds_table (vla-item selection 1)
)
(list (cons "ename" ename_table)
(cons "spds" spds_table)
)) |
ИМХО код даже особо переделывать не надо, он по идее должен отработать для любого примитива – достаточно знать его хендл.
Похожее
реализация передачи нативного объекта в мультикад и получение свойств
https://t.me/nanoCADAPI/5654
Один из участников чата по nanoCAD API (просил не называть его имени) предоставил еще один вариант лиспового преобразования:
2
3
4
(setq spds (vlax-get-or-create-object "mccom2.server"))
(if spds (vlax-get-property spds "Object" (vlax-ename->vla-object e_obj )))
)
Естественно, что перед использованием надо прогрузить ActiveX. Ну и передавать в функцию ename-указатель на примитив.