AutoLISPでのデータタイプの変換
ActiveX(COM)データ と AutoLISP データ変換
ActiveX(COM)サポート関数とコアの AutoLISP 関数を使用するときは、データ タイプ間で変換を行う必要がある。
AutoLISP での ActiveX(COM)のサポートは Windows のみに制限されているので基本 Windowsのみで利用可能なものだが、BricsCADでは、Fast-COM で Mac/Linuxでも一部サポートされている。
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 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
バイト | ✓ | |||||||||||
ブール演算数 | ✓ | ✓ | ||||||||||
整数 | ✓ | |||||||||||
長整数 | ✓ | |||||||||||
単精度浮動小数点数 | ✓ | |||||||||||
倍精度浮動小数点数型 | ✓ | ✓ | ||||||||||
オブジェクト | ✓ | |||||||||||
文字列 | ✓ | |||||||||||
バリアント | ✓ | |||||||||||
配列 | ✓ | ✓ | ||||||||||
なし | ✓ | |||||||||||
空 | ✓ |
配列とリストのデータ タイプを変換
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)
handent、entget、entsel 関数によって返され、開いた図面内のオブジェクトを識別する。
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 を取得することにより返される。図形は CAD セッション全体で保持される。
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 (Windows 版 AutoCAD および AutoCAD LT のみ)
- ObjectARX (Windows 版および Mac OS 版 AutoCAD のみ)
- Manage .NET (Windows 版 AutoCAD のみ)
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>