Работа с ObjectID в 64- и 32-разрядных системах
Благодаря показанному в статье Программное создание поля, я немного был готов к тому, что получение и преобразование ObjectID будет отличаться в 32 и 64-разрядных системах. Сегодня "в лоб" столкнулся с тем, что известные PLTools отказываются работать на 64-разрядных AutoCAD'ах.
А решение элементарное...
Сначала напишем код получения ObjectID. Причем получать его будем не в строковом варианте, а в полноценном.
1 2 3 4 5 6 7 8 9 10 | (defun _lispru-get-objectid (obj) (vlax-get-property obj (strcat "ObjectID" (if (> (vl-string-search "x64" (getvar "platform")) 0) "32" "" ) ;_ end of if ) ;_ end of strcat ) ;_ end of vlax-get-property ) ;_ end of defun |
И обратная задача - по ObjectID получить указатель на объект:
1 2 3 4 5 6 7 8 9 10 11 | (defun _lispru-objectidtoobject (doc id) (vlax-invoke-method doc (strcat "ObjectIDToObject" (if (> (vl-string-search "x64" (getvar "platform")) 0) "32" "" ) ;_ end of if ) ;_ end of strcat id ) ;_ end of vlax-invoke-method ) ;_ end of defun |
Для упрощения примера я позволил себе исключить некоторые проверки. В частности, передаваемые объекты обязательно должны быть нормального типа. Для первого кода - vla-object, для второго - vla-object и id нормальный.
Исходники:
_lispru-get-objectid
_lispru-objectidtoobject
Функция _lispru-objectidtoobject не учитывает "нюанс" Автокада 2015 и выше См. функцию _kpblc-objectidtoobject здесь http://autolisp.ru/2014/09/16/objectid_x32x64_cad2015/
Наверное, надо упомянуть о том, что в последних версиях ACAD началась чехарда с именами свойств и подобный подход уже не срабатывает.
2
3
4
5
6
7
8
9
10
11
* Получение ObjectID независимо от версии AutoCAD
* Параметры вызова:
obj ; vla-указатель на обрабатывамый объект
|;
(cond ((vlax-property-available-p obj "objectid")
(vla-get-objectid obj)
)
((vlax-property-available-p obj "objectid32") (vla-get-objectid32 obj))
) ;_ end of cond
) ;_ end of defun