AutoLISPでのデータタイプの変換

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

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 関数によって返され、開いた図面内のオブジェクトを識別する。

図形名を VLA オブジェクトに変換する

vlax-ename->vla-object 関数を使用すると、entget や ssname などの関数を使用して取得した図形名(ename)を、ActiveX サポート関数で使用できる VLA オブジェクトに変換することができる。

 ; CAD の作図領域で、円を描く。
 ; コマンド プロンプトに対して (vl-load-com) と入力し、[Enter]を押す。
 (setq ename-circle (car (entsel "¥n円をクリック:"))) と入力し、[Enter]を押す。
  <Entity name: 27f0538>
 
 (setq vlaobject-circle (vlax-ename->vla-object ename-circle)) と入力し、[Enter]を押す。
 #<VLA-OBJECT IAcadCircle 03642c24>
 
 (setq new-ename-circle (vlax-vla-object->ename vlaobject-circle)) と入力し、[Enter]を押す。
 <Entity name: 27f0538>


ハンドル

vla-get-handle 関数によってまたは図形名の連想リストから DXF グループコード 5 を取得することにより返される。図形は CAD セッション全体で保持される。

vla‑handleToObject 関数を使用して、ハンドルに関連付けられている VLA オブジェクトを返す。

ハンドルを VLA オブジェクトに変換する

handent 関数は、指定されたハンドルに基づいて図形名(ename)を返す。その後、図形名を ActiveX サポート関数で使用できる VLA オブジェクトに変換することができる。

 ; CAD の作図領域で、円を描く。
 ; コマンド プロンプトに対して (vl-load-com) と入力し、[Enter]を押す。
 (setq ename-circle (handent (cdr (assoc 5 (entget (car (entsel "¥n円をクリック:"))))))) ; と入力し、[Enter]を押す。
 <Entity name: 27f0538>
 
 (setq vlaobject-circle (vlax-ename->vla-object ename-circle)) ; と入力し、[Enter]を押す。
 #<VLA-OBJECT IAcadCircle 03642c24>
 
 (setq new-ename-circle (vlax-vla-object->ename vlaobject-circle)) ; と入力し、[Enter]を押す。
 <Entity name: 27f0538>


オブジェクト ID 

次のプログラミング ライブラリで、オブジェクトを識別するために使用される。

  • ActiveX (Windows 版 AutoCAD、AutoCAD LT、BricsCAD、IJCAD(GstarCAD)で利用可能。BricsCAD は Mac、Linux も一部対応)
  • ObjectARX (Windows 版 AutoCAD、AutoCAD LT)、BRX(BricsCAD)、GRX(IJCAD,GstrCAD)ZRX(ZWCAD)などARX互換APIでも利用可能
  • Manage .NET (Windows 版 AutoCAD、BricsCAD)

オブジェクト ID を VLA オブジェクトに変換する

vla-get-ObjectID 関数は、関数に渡されたオブジェクト ID に対応する VLA オブジェクトを返す。

指定した VLA オブジェクトのオブジェクト ID を取得するには、vla-ObjectIDtoObject を使用する。

 ; AutoCAD の作図領域で、円を描く。
 ; コマンド プロンプトに対して (vl-load-com) と入力し、[Enter]を押す。
 (setq aDoc (vlax-get-property (vlax-get-acad-object) 'ActiveDocument)) ; と入力し、[Enter]を押す。
 #<VLA-OBJECT IAcadDocument 0000000029430508>

 (setq aMSpace (vlax-get-property aDoc 'ModelSpace)) ; と入力し、[Enter]を押す。
 #<VLA-OBJECT IAcadModelSpace 00000000304d7308>
 
 (setq aObjId (vla-get-ObjectID aMSpace)) ; と入力し、[Enter]を押す。
 48
 
 (setq aObj (vla-ObjectIDToObject aDoc aObjId)) ; と入力し、[Enter]を押す。
 #<VLA-OBJECT IAcadModelSpace 00000000304d7308>