概要 - AutoLISP と ActiveX 間でデータ タイプを変換する(AutoLISP/ActiveX)

ActiveX サポート関数とコアの AutoLISP 関数を使用するときは、データ タイプ間で変換を行う必要があります。

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

AddCircle メソッドを使用して図面に円を追加するには、円の中心点と半径を指定する必要があります。これらの引数は、Center および Radius と呼ばれています。Center は バリアント型(3 要素の倍精度浮動小数点数型配列)として定義され、Radius は倍精度浮動小数点数型として定義されています。

(setq RetVal (vla-AddCircle aMSpace Center Radius))

要素

RetVal

オブジェクト; 出力のみ。AddCircle メソッドで作成される円オブジェクト。

aMSpace

オブジェクト; 入力のみ。AddCircle メソッドの対象となるオブジェクト。

Center

バリアント型(3 要素の倍精度浮動小数点数型配列)。入力のみ。円の中心を指定する 3D WCS 座標。

バリアント型は基本的に、自己定義構造体で、異なるタイプのデータを含めることができます。たとえば、文字列、整数、配列はすべてバリアント型で表現できます。バリアント型には、データと一緒にデータのタイプを識別する情報が格納されます。この自己定義機能により、バリアント型は ActiveX サーバにパラメータを渡すときに役に立ちます。それは、バリアント型により、任意の言語に基づくサーバがデータの値を解釈できるようになるからです。

Radius

倍精度浮動小数点数型。入力のみ。円の半径。正の数値でなければなりません。

AutoLISP のデータ タイプから ActiveX のデータ タイプへ

ActiveX では AutoLISP でサポートされているデータ タイプと類似する多数のデータ タイプがサポートされていますが、一部の ActiveX 固有のデータ タイプは AutoLISP でサポートされているデータ タイプに直接マッピングできません。次に、データ タイプを変換する方法を説明します。

ActiveX のデータ タイプの代わりに受け入れられる AutoLISP のデータ タイプ

整数

実数

文字列

図形名

VLA オブジェクト

バリアント

リスト

:Safe-array

ブール型

:vlax-true

:vlax-false

nil

:vlax-null

バイト

X

ブール型

X

X

整数

X

長整数

X

単精度浮動小数点数

X

倍精度浮動小数点数型

X

X

オブジェクト

X

文字列

X

バリアント

X

配列

X

なし

X

X

配列とリストのデータ タイプを変換する

ActiveX の配列データ タイプは AutoLISP のリストと似ています。これらには、さまざまなデータ構造を表す複数の要素が含まれています。配列は、一般的には座標値を表すために使用します。vlax-safearray->list 関数を使用して、配列をリストに変換することができます。リストを配列に変換するには、vlax-make-safearray 関数で配列に含めるデータのタイプと要素の数を定義し、vlax-safearray-fill 関数を使用してリストの値を配列の要素に割り当てる必要があります。

バリアント型データ タイプを変換する

バリアント型データ タイプは、メソッドが複数のタイプのデータを返すまたはメソッドで複数のタイプのデータが使用される可能性がある場合に使用されます。vlax-make-variant 関数を使用して、バリアント型を作成することができます。バリアント型を作成するときは、格納するデータのタイプと値を指定します。メソッドまたはプロパティによってバリアント型が返される場合は、vlax-variant-type 関数と vlax-variant-value 関数を使用することができます。

VLA オブジェクト、ハンドル、図形名のデータ タイプを変換する

AutoLISP で AutoCAD 図面オブジェクトを参照する方法は多数あります。次の方法を使用できます。

VLA オブジェクト

ActiveX 関数によって返されます。vlax-vla-object->ename 関数を使用して、データ タイプを VLA オブ ェクトから ename (図形名)に変換します。

(setq MSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
#<VLA-OBJECT IAcadModelSpace 0000000030434638>

(setq circObj (vla-AddCircle MSpace (vlax-3d-point '(5.0 5.0 0.0)) 3))
#<VLA-OBJECT IAcadCircle 00000000303b2698>

(vlax-vla-object->ename circObj)
<Entity name: 7ffffb05de0>
図形名(ename)

handententgetentsel 関数によって返され、開いた図面内のオブジェクトを識別します。vlax-ename->vla-object 関数を使用して、データ タイプを ename (図形名)から VLA オブジェクトに変換します。

(setq en (handent handle-circle))
<Entity name: 27f0538>

(setq en (car (entsel "\nSelect circle: ")))
<Entity name: 27f0538>

(vlax-ename->vla-object en)
#<VLA-OBJECT IAcadCircle 00000000303b3718>
ハンドル

vla-get-handle 関数によってまたは図形名の連想リストから DXF グループコード 5 を取得することにより返されます。図形は AutoCAD セッション全体で保持されます。vla‑handleToObject 関数を使用して、ハンドルに関連付けられている VLA オブジェクトを返します。

(vla-get-handle vla-circle)
"4F"

(setq handle-circle (cdr (assoc 5 (entget ename-circle))))
"4F"

(setq vla-circle (vla-handleToObject acadDocument handle-circle))
#<VLA-OBJECT IAcadCircle 03642c24>
オブジェクト ID

ActiveX、ObjectARX、Manage .NET プログラムによって、オブジェクトを識別するために使用されます。vla-ObjectIDToObject 関数を使用してオブジェクト ID を VLA オブジェクトに変換するか、 vla-get-ObjectID 関数を使用して VLA オブジェクトをオブジェクト ID に変換します。

(setq objid-Circle (vla-get-objectid vla-circle))
41878840

(vla-ObjectIDtoObject acadDocument objid-circle)
#<VLA-OBJECT IAcadCircle 03642c24>