ActiveX 対応関数を使うときの概要
ActiveX 対応関数を使う場合の図面データベース各要素の操作は AutoLISP の【図形名】の代わりに VLA オブジェクトをハンドラとして使用します。ActiveX 対応関数と VLA オブジェクトを使用すると、図面データベース内の要素を、AutoLISP からプロパティやメソッドを備えたオブジェクトとして操作できます。VLA オブジェクトは、LISP のシンボルに代入できる AutoLISP のデータタイプの一つです。
ActiveX 対応関数を使用するにあたって、ActiveX のデータタイプであるバリアント型とセーフ配列を使用する必要が出てきます。しかし、実際に必要となる手間はごくわずかです。なぜなら、計算のほとんどを LISP 由来のデータタイプで行い、ActiveX 対応関数を使うときだけ、これらを対応する型に変換すればよいからです。そして、変換するパターンは多くありません。主に必要になるのは、セーフ配列を格納したバリアント型変数と LISP のリストの相互変換です。AutoLISP 備え付けの変換関数を使用する以外に、いくつか必要に応じて変換関数を作る必要が出てきますが、一度書いてしまえば、それを通してやればよいだけです。
VLA オブジェクト
VLA オブジェクトは、ActiveX で AutoCAD の図面データベースにアクセスする際 AutoLISP の【図形名】の代わりに使用する図形要素やその他のオブジェクトを指すハンドラです。VLA オブジェクトと【図形名】は互いに変換することができる関係にあります。しかし、ハンドラですので、指している図形そのものではありません。
atom 関数で VLA オブジェクトを判定するとアトムである T が返りますが、VLA オブジェクトはハンドラですので、同一のオブジェクトを指していても、別のハンドラということが起こりえます。つまり、厳密には LISP で言うところのアトムではありません。ですので、二つのハンドラが同一のものを指しているか検査する際は、eq 関数や = 関数では判別できません。同じオブジェクトを指しているかは、LISP のリストのようにequal 関数を使用します。
_$ (setq obj1 (vlax-ename->vla-object (car (entsel)))) ⏎ ; 円を選択
#<VLA-OBJECT IAcadCircle2 00000000417cd3c8>
_$ (setq obj2 (vlax-ename->vla-object (car (entsel)))) ⏎ ; 同じ円を選択
#<VLA-OBJECT IAcadCircle2 00000000417cd3c8>
_$ (eq obj1 obj2) ⏎
nil
_$ (equal obj1 obj2) ⏎
T
_$ (= obj1 obj2) ⏎
nil
また、同じオブジェクトタイプで別々のオブジェクトが、同じプロパティ値を持っていることを確認するためには、リストのように equal 関数は使えません。プロパティの種類にしたがって、一つ一つ取り出して確認するようにプログラムを書かなければなりません。
AutoLISP関数 |
---|
(vlax-ename->vla-object ename) |
ename:【図形名】 |
【図形名】をVLAオブジェクトに変換します。 |
戻り値:VLAオブジェクト |
vlax-ename->vla-object 関数は、entsel 関数などを使って得られた【図形名】を、VLA オブジェクトへ変換します。
ename引数は、変換する【図形名】を指定します。
戻り値は、対応するVLAオブジェクトです。
AutoLISP関数 |
---|
(vlax-vla-object->ename obj) |
obj:VLAオブジェクト |
VLA オブジェクトを【図形名】に変換します。 |
戻り値: 【図形名】 |
vlax-vla-object->ename 関数は、VLA オブジェクトを【図形名】に変換します。
obj 引数には、変換する VLA オブジェクトを指定します。
戻り値は、対応する【図形名】です。
セーフ配列とバリアント型の概要
ここではセーフ配列とバリアント型について、さしあたって必要となる概要について触れます。詳しい話は後ほど項を改めて行います。
バリアント型は、実際の値に加えて型情報を持っており、整数や実数、文字列、セーフ配列といった値を代入できます。バリアント型の変数は、一度値を決めて作成したら、後から値を変更することはできません。ちなみに、LISP のシンボルもさまざまな型を代入できましたが、シンボルも内部では型情報を持っています。しかしシンボルほど手軽に使用できるわけではなく、バリアント型から型情報を取り出す関数、値を取り出す関数がそれぞれ用意されて、それを介して扱います。
ActiveX 対応関数 | 説明 |
---|---|
vlax-make-variant | バリアント型変数を作成します。 |
vlax-variant-type | バリアント型変数の型情報を調べます。 |
vlax-variant-value | バリアント型変数の値を返します。 |
セーフ配列も型情報をもった配列で、こちらも整数や実数、文字列を配列に格納できます。セーフ配列は、複数要素を扱うのに使用されますが、LISP のリストのように異なる型を混在させることはできません。また、一度サイズを指定して作成されたセーフ配列の大きさを変更することはできません。内部の値を変更することはできます。
セーフ配列にも型情報を取り出す関数、値を取り出す関数がそれぞれ用意されています。
ActiveX 対応関数 | 説明 |
---|---|
vlax-make-safearray | セーフ配列を作成します(領域を確保します)。 |
vlax-safearray-type | セーフ配列の型情報を調べます。 |
vlax-safearray-get-element | セーフ配列から、インデックスで指定した位置の値を返します。 |
AutoLISP の ActiveX 対応関数では、セーフ配列をバリアント型でラップしたものを、LISP のリストに対応するものとして、主に使用します。ここではこれを「セーフ配列バリアント型」と呼ぶことにします。そして、LISP のリストとセーフ配列バリアント型の相互変換の仕方を覚えれば、さしあたって多くの場合 ActiveX 対応関数を使用する上で困ることはありません。
リストからセーフ配列バリアント型へ
LISP のリストからセーフ配列バリアント型の一部の形式へ、簡単に変換を行うサポート関数が二つほど用意されています。これら以外のものは変換関数を作成してやる必要があります。
AutoLISP関数 |
---|
(vlax-3D-point list) (vlax-3D-point x y [z]) |
list:リスト x,y,z:数値 |
3次元の座標を表すリストを、セーフ配列のバリアント型に変換します。 |
戻り値:バリアント型 |
vlax-3D-point 関数は、3次元の座標を格納するセーフ配列バリアント型を作成します。

vlax-3D-point 関数の引数には二つのスタイルがあります。一つは3次元座標を格納したリストを与えるスタイルで、もう一つは xyz 座標をそれぞれ指定するスタイルです。list 引数ではリスト形式で、x,y,z では各要素を個別に指定します。z 要素は省略することができ、その場合は 0.0 の値が割り当てられます。
一般的な使用例は以下のとおりです。
_$ (setq point (vlax-3D-point '(100.0 100.0 100.0))) ⏎
#<variant 8197 ...>
_$ (vlax-safearray->list (vlax-variant-value point)) ⏎
(100.0 100.0 100.0)
_$ (setq point (vlax-3D-point 200.0 200.0)) ⏎
#<variant 8197 ...>
_$ (vlax-safearray->list (vlax-variant-value point)) ⏎
(200.0 200.0 0.0)
AutoLISP関数 |
---|
(vlax-tmatrix list) |
list:リスト |
変換マトリックスを表すリストを、セーフ配列のバリアント型に変換します。 |
戻り値:バリアント型 |
vlax-tmatrix 関数は、変換マトリックスを表すリストをセーフ配列バリアント型に変換します。変換マトリックスは 4×4 の行列で、詳細は稿を改めて述べます。

list 引数には、変換マトリックスを格納するリストを指定します。4×4 の行列を表していないなど不正なリストの場合はエラーが発生します。
戻り値には、変換マトリックスの内容を2次元のセーフ配列に収めたバリアント型が返ります。
基本的な使用例は以下のとおりです。
_$ (setq *m-e* '((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0)))⏎ ((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
_$ (setq matrix (vlax-tmatrix *m-e*))⏎
#<variant 8197 ...>
_$ (vlax-safearray->list (vlax-variant-value matrix)) ⏎
((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))