セーフ配列

提供:GizmoLabs - だいたい CAD LISP なサイト

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

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

注: AutoLISP での ActiveX のサポートは Windows のみ。(AutoCAD,互換CAD共:2014.06現在)

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

  • vlax-safearray-type: セーフ配列のデータ タイプを返す。
  • vlax-safearray-get-dim: セーフ配列の次元数を返す。
  • vlax-safearray-get-l-bound: セーフ配列の次元の下限(最初のインデックス)を返す。
  • vlax-safearray-get-u-bound: セーフ配列の次元の上限(最後のインデックス)を返す。
  • vlax-safearray-get-element: セーフ配列内の要素の値を返す。


配列のデータ タイプ

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"

関連事項