Работа с 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

Размещено в Код LISP, Функции LISP · Метки: ,



Комментарии

Есть 3 коммент. к “Работа с ObjectID в 64- и 32-разрядных системах”
  1. VVA пишет:

    Функция _lispru-objectidtoobject не учитывает "нюанс" Автокада 2015 и выше См. функцию _kpblc-objectidtoobject здесь http://autolisp.ru/2014/09/16/objectid_x32x64_cad2015/

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

    Наверное, надо упомянуть о том, что в последних версиях ACAD началась чехарда с именами свойств и подобный подход уже не срабатывает.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (defun _kpblc-get-objectid (obj) ;|
    *    Получение 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

Трэкбэки

Узнайте, что другие говорят про эту заметку...
  1. [...] коде используются исходники из темы Работа с ObjectID в 64- и 32-разрядных системах: [...]



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


Я не робот.