Разница между vlax-invoke и vlax-invoke-method

В кодах, публикуемых на форумах, можно встретить пять вариантов записи очень похожих конструкций:

1
2
3
4
5
vlax-invoke {Object} '{Method}
vlax-invoke {Object} "{Method}"
vlax-invoke-method {Object} '{Method}
vlax-invoke-method {Object} "{Method}"
vla-{Method} {Object}

В чем между ними разница, и есть ли она вообще?

Разницы между записью vlax-invoke {Object} '{Method} и vlax-invoke {Object} "{Method}", или между vlax-invoke-method {Object} '{Method} и vlax-invoke-method {Object} "{Method}" никакой. А вот в остальном - есть. Во-первых, последний вариант доступен только для штатных примитивов AutoCAD. Попытка обработать таким образом примитив любого вертикального приложения практически обречена на провал (ну, если, конечно, определенных танцев с бубнами не выполнять).
Во-вторых, есть разница между результатами, возвращаемыми vlax-invoke и vlax-invoke-method. Допустим, у нас есть вставленный блок (блок с атрибутами) и получен на него указатель:

1
2
3
4
5
6
_$ (setq ent (vlax-ename->vla-object (ssname (ssget "_+.:S:E" '((0 . "INSERT"))) 0)))
#<VLA-OBJECT IAcadBlockReference2 0000000026b9e3e8>
_$ (vlax-invoke ent 'getattributes)
(#<VLA-OBJECT IAcadAttributeReference 00000000268cf288>)
_$ (vlax-invoke-method ent 'getattributes)
#<variant 8201 ...>

Казалось бы, все очевидно: vlax-invoke возвращает нормальный список, vlax-invoke-method существует уже как чистый ActiveX, возвращая variant.
И что, теперь плевать на vlax-invoke-method? К сожалению, так получается не всегда. В некоторых случаях vlax-invoke может не сработать.
Нарисуем "от балды" полилинию и получим на нее vla-указатель:

1
2
_$ (setq pline (vlax-ename->vla-object (car (entsel))))
#<VLA-OBJECT IAcadLWPolyline2 0000000026b00ef8>

И применяем к ней GetBoundingBox:

1
2
3
4
5
6
_$ (vlax-invoke pline 'GetBoundingBox 'minp 'maxp)
nil
_$ minp
nil
_$ maxp
nil

Как видно, в minp и maxp ничего не хранится. В то же время:

1
2
3
4
5
6
_$ (vlax-invoke-method pline 'GetBoundingBox 'minp 'maxp)
nil
_$ minp
#<safearray...>
_$ maxp
#<safearray...>

Разница? Разница!
Кроме того, официально конструкция vlax-invoke не поддерживается и может прекратить свое существование в любой момент, в отличии от vlax-invoke-method.
И, наконец, последнее. Для пользовательских СОМ-серверов вопрос "что применять - vlax-invoke или vlax-invoke-method" лично у меня однозначного ответа не имел. Сейчас мне кажется, что vlax-invoke можно использовать только в том случае, если vlax-invoke-method не срабатывает (говорят, такое тоже бывает).

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



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


Я не робот.