nanoCAD преобразовать ObjectId в McObjectId

Время от времени то на форуме, то в чате, то самому мне надо преобразовать 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)
  ))

ИМХО код даже особо переделывать не надо, он по идее должен отработать для любого примитива – достаточно знать его хендл.



Комментарии

Есть 2 коммент. к “nanoCAD преобразовать ObjectId в McObjectId”
  1. drz пишет:

    реализация передачи нативного объекта в мультикад и получение свойств
    https://t.me/nanoCADAPI/5654

  2. Кулик Алексей aka kpblc пишет:

    Один из участников чата по nanoCAD API (просил не называть его имени) предоставил еще один вариант лиспового преобразования:

    1
    2
    3
    4
    (defun ename->m-object (  e_obj / spds)  
    (setq spds (vlax-get-or-create-object "mccom2.server"))
    (if spds (vlax-get-property spds "Object" (vlax-ename->vla-object e_obj )))
      )

    Естественно, что перед использованием надо прогрузить ActiveX. Ну и передавать в функцию ename-указатель на примитив.

Поделитесь своим мнением


Я не робот.