概要 - セーフ配列の要素を取得する(AutoLISP/ActiveX)

配列は、ActiveX 関数からの複数の値を返し、ActiveX 関数に複数の値を渡すために使用します。

注: AutoLISP での ActiveX のサポートは Windows のみに制限されています。

配列内の要素に割り当てられた値の取得には、次の関数を使用します。

配列のデータ タイプ

AutoLISP 関数を使用するときは、使用するデータのタイプを知っている必要があります。各配列は、特定のタイプのデータで定義されます。vlax-safearray-type 関数は、配列がどのタイプのデータを格納する目的で作成されたのかを特定するために使用します。この関数には、1 つの引数(配列を含む変数)が必要です。この関数は、配列がどのタイプのデータを格納する目的で作成されたのかを表す整数値を返します。

たとえば、次のコードは 3 つの倍精度浮動小数点数型の 1 次元配列を作成します。

(setq point (vlax-make-safearray vlax-vbDouble '(0 . 2)))
(vlax-safearray-fill point (list 100 100 0))
#<safearray...>

たとえば、次のコードは、配列が倍精度浮動小数点数を格納すると定義されていることから、5 を返します。

(vlax-safearray-type point)
5

配列の次元

配列の値にアクセスするには、配列作成時の次元数と要素数の両方を知る必要があります。vlax-safearray-get-dim 関数は、配列作成時の次元数を表す整数を返します。

次のコードは、3 つの倍精度浮動小数点数型の 1 次元配列を作成します。

(setq point (vlax-make-safearray vlax-vbDouble '(0 . 2)))
(vlax-safearray-get-dim point)
1

次の例は、文字列の 2 次元配列を作成します。

(setq mat2 (vlax-make-safearray vlax-vbString '(0 . 1) '(1 . 3)))
(vlax-safearray-get-dim mat2)
2

配列の次元内の要素

配列内の次元数がわかると(vlax-safearray-get-dim 関数を使用)、配列の下限(vlax-safearray-get-l-bound)および上限(vlax-safearray-get-u-bound)を取得することができます。配列の上限および下限により、次元内の要素数および配列の要素が検索できるインデックス範囲を特定することができます。

配列の次元内の要素数は、vlax-safearray-get-u-bound 関数と vlax-safearray-get-l-bound 関数によって返された値を減算することによって計算できます。

たとえば、次の例は、1 次元配列内の要素数を返します。

(setq point (vlax-make-safearray vlax-vbDouble '(0 . 2)))
(setq arrayRange (1+ (- (vlax-safearray-get-u-bound point 1) (vlax-safearray-get-l-bound point 1))))
3

次のコードは、2 次元配列の 2 番目の次元内の要素数を返します。

(setq mat1 (vlax-make-safearray vlax-vbString '(0 . 1) '(2 . 5)))
(setq arrayRange (1+ (- (vlax-safearray-get-u-bound mat1 2) (vlax-safearray-get-l-bound mat1 2))))
4

配列内の要素の値の取得

配列内の次元数と要素数がわかると、vlax-safearray-get-element 関数を使用して要素の値を取得することができます。

たとえば、次のコードは 3 つの倍精度浮動小数点数型の 1 次元配列を作成します。

(setq point (vlax-make-safearray vlax-vbDouble '(0 . 2)))
(vlax-safearray-fill point (list 100 50 0))
#<safearray...>

次のコードは、配列内の 2 番目の要素の値を返します。

(vlax-safearray-get-element point 1)
50.0

次のコードは、文字列の 2 次元配列を作成し、最初の次元の 2 番目の要素を取得します。

(setq mat2 (vlax-make-safearray vlax-vbString '(0 . 1) '(1 . 3)))
(vlax-safearray-fill mat2 '(("a" "b" "c") ("d" "e" "f")))
(vlax-safearray-get-element mat2 0 2)
"b"