「AutoLISPでのデータタイプの変換」の版間の差分

提供:GizmoLabs - だいたい CAD LISP なサイト
 
(同じ利用者による、間の3版が非表示)
12行目: 12行目:
これらの引数は、Center および Radius と呼ばれています。Center は バリアント型(3 要素の倍精度浮動小数点数型配列)として定義され、Radius は倍精度浮動小数点数型として定義されている。
これらの引数は、Center および Radius と呼ばれています。Center は バリアント型(3 要素の倍精度浮動小数点数型配列)として定義され、Radius は倍精度浮動小数点数型として定義されている。


(setq RetVal (vla-AddCircle aMSpace Center Radius))
<pre class="brush:autolisp;">
(setq RetVal (vla-AddCircle aMSpace Center Radius))
</pre>


  要素
  要素
31行目: 33行目:
! !! 実数  
! !! 実数  
!実数
!実数
!文字列!! 図形名 !! VLA オブジェクト !! バリアント !! リスト !! :Safe-array !! ブール型 !! :vlax-true,
!文字列!! 図形名 !! VLA
オブジェクト
! バリアント !! リスト !! :Safe-array !! ブール型 !! :vlax-true,
<nowiki>:</nowiki>vlax-false
<nowiki>:</nowiki>vlax-false
! nil !! :vlax-null
! nil !! :vlax-null
183行目: 187行目:
|✓
|✓
|
|
|}
|}
 


=== 配列とリストのデータ タイプを変換 ===
=== 配列とリストのデータ タイプを変換 ===
198行目: 200行目:
===バリアント型データ タイプを変換する ===
===バリアント型データ タイプを変換する ===


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


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


==== VLA オブジェクト ====
=== VLA オブジェクト ===
 
ActiveX 関数によって返される。
ActiveX 関数によって返される。


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


<pre class="brush:autolisp;">
  (setq MSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
  (setq MSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
  #<VLA-OBJECT IAcadModelSpace 0000000030434638>
  #<VLA-OBJECT IAcadModelSpace 0000000030434638>
217行目: 221行目:
  (vlax-vla-object->ename circObj)
  (vlax-vla-object->ename circObj)
  <Entity name: 7ffffb05de0>
  <Entity name: 7ffffb05de0>
</pre>


=== 図形名(ename) ===


==== 図形名(ename) ====
handent、entget、entsel 関数によって返され、開いた図面内のオブジェクトを識別する。


handent、entget、entsel 関数によって返され、開いた図面内のオブジェクトを識別する。
==== 図形名を VLA オブジェクトに変換する ====


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


  (setq en (handent handle-circle))
<pre class="brush:autolisp;">
<Entity name: 27f0538>
; 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 en (car (entsel "\nSelect circle: ")))
  (setq new-ename-circle (vlax-vla-object->ename vlaobject-circle)) と入力し、[Enter]を押す。
  <Entity name: 27f0538>
  <Entity name: 27f0538>
</pre>
(vlax-ename->vla-object en)
#<VLA-OBJECT IAcadCircle 00000000303b3718>




==== ハンドル ====
=== ハンドル ===


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


  (vla-get-handle vla-circle)
==== ハンドルを VLA オブジェクトに変換する ====
  "4F"
 
handent 関数は、指定されたハンドルに基づいて図形名(ename)を返す。その後、図形名を ActiveX サポート関数で使用できる VLA オブジェクトに変換することができる。
 
<pre class="brush:autolisp;">
; CAD の作図領域で、円を描く。
  ; コマンド プロンプトに対して (vl-load-com) と入力し、[Enter]を押す。
(setq ename-circle (handent (cdr (assoc 5 (entget (car (entsel "¥n円をクリック:"))))))) ; と入力し、[Enter]を押す。
  <Entity name: 27f0538>
   
   
  (setq handle-circle (cdr (assoc 5 (entget ename-circle))))
  (setq vlaobject-circle (vlax-ename->vla-object ename-circle)) ; と入力し、[Enter]を押す。
  "4F"
  #<VLA-OBJECT IAcadCircle 03642c24>
   
   
  (setq vla-circle (vla-handleToObject acadDocument handle-circle))
  (setq new-ename-circle (vlax-vla-object->ename vlaobject-circle)) ; と入力し、[Enter]を押す。
  #<VLA-OBJECT IAcadCircle 03642c24>
  <Entity name: 27f0538>
</pre>




==== オブジェクト ID ====


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


* ActiveX (Windows 版 AutoCAD および AutoCAD LT のみ)
* ActiveX (Windows 版 AutoCAD、AutoCAD LT、BricsCAD、IJCAD(GstarCAD)で利用可能。BricsCAD は Mac、Linux も一部対応)
* ObjectARX (Windows 版および Mac OS AutoCAD のみ)
* ObjectARX (Windows 版 AutoCAD、AutoCAD LT)、BRX(BricsCAD)、GRX(IJCAD,GstrCAD)ZRX(ZWCAD)などARX互換APIでも利用可能
* Manage .NET (Windows 版 AutoCAD のみ)
* Manage .NET (Windows 版 AutoCAD、BricsCAD)
 
==== オブジェクト ID を VLA オブジェクトに変換する ====


vla-ObjectIDToObject 関数を使用してオブジェクト ID を VLA オブジェクトに変換するか、vla-get-ObjectID 関数を使用して VLA オブジェクトをオブジェクト ID に変換する。
vla-get-ObjectID 関数は、関数に渡されたオブジェクト ID に対応する VLA オブジェクトを返す。


(setq objid-Circle (vla-get-objectid vla-circle))
指定した VLA オブジェクトのオブジェクト ID を取得するには、vla-ObjectIDtoObject を使用する。
41878840
(vla-ObjectIDtoObject acadDocument objid-circle)
#<VLA-OBJECT IAcadCircle 03642c24>


<pre class="brush:autolisp;">
; 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>
</pre>






[[Category:AutoLISP]]
[[Category:AutoLISP]]

2023年11月20日 (月) 07:17時点における最新版

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>