vla-get-xxxx を使うと、ActiveX図形情報から図形のプロパティをえることができます。
事前知識
VLISPを使いActiveXという形式で図形のプロパティ情報を得ることができます。
AutoLISPを使って得るDXF図形情報よりも多くの情報をカバーしています。
vla-get-xxxxx
vla-get は、ActiveX図形情報から情報を得る関数です。xxxx の部分に欲しい情報のプロパティ名を入れます。
プロパティ名は、vlax-dump-object で得ることができる一覧で確認できます。
Select object: ; IAcadCircle: AutoCAD Circle Interface ; Property values: ; Application (RO) = # ; Area = 314.159 ; Center = (500.0 1000.0 0.0) ; Circumference = 62.8319 ; Diameter = 20.0 ; Document (RO) = # ; EntityTransparency = "ByLayer" ; Handle (RO) = "41C0A" ; HasExtensionDictionary (RO) = 0 ; Hyperlinks (RO) = # ; Layer = "0" ; Linetype = "ByLayer" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Material = "ByLayer" ; Normal = (0.0 0.0 1.0) ; ObjectID (RO) = 45 ; ObjectName (RO) = "AcDbCircle" ; OwnerID (RO) = 43 ; PlotStyleName = "ByLayer" ; Radius = 10.0 ; Thickness = 0.0 ; TrueColor = # ; Visible = -1 T
vla-get-layer 図形から画層名を得る
ActiveX図形情報
例えば画層名を得たい場合。
; Layer = "0"
Layer がプロパティ名です。
vla-get-xxxxxにプロパティ名Layer を当てはめて、vla-get-layer が画層名を得る関数になります。
“選択した図形から、その図形の画層名を得る” コードはこうなります。
(setq Obj (car(entsel)))
(setq VlObj (vlax-ename->vla-object Obj))
(setq LyNm (vla-get-layer VlObj))
これで、変数LyNmに画層名が入ります。
DXF図形情報と比較
では、DXF図形情報の場合と比較してみましょう。
DXF図形情報では、グループコード(画層の場合は8)を使って
(setq Obj (car(entsel)))
(setq Ent (entget Obj))
(setq LyNm (cdr (assoc 8 Ent)))
これで、同じように変数LyNmに画層名が入ります。
どうでしょうか?
使う関数はActiveX図形情報からのの方が少ないし、簡単な感じがしますね。
vla-get-center 図形から中心点座標を得る
ActiveX図形情報
では次に、中心点の座標を見てみましょう。
(setq Obj (car(entsel)))
(setq VlObj (vlax-ename->vla-object Obj))
(setq Pt (vla-get-center VlObj))
先ほどの画層の例の要領で vla-get-center を当てはめると。。。。
#<variant 8197 ...>
点座標ではなく、不思議なコードが現れます。
リスト関係は、バリアントと呼ばれる特殊な型になってしまうので、中身を確認することができません。
中身を見るには、バリアントの値を得る関数 vlax-variant-value を使います。
(setq Pt (vlax-variant-value Pt))
vlax-variant-valueを使って、先ほど変数Ptに入れたバリアントの値を、Ptに入れなおしてみると。。。
#<safearray...>
その中身のも、セーフ配列と呼ばれる見慣れない形にになっています。
そして、セーフ配列をリストに変換する関数が、vlax-safearray->list です。
(setq Pt (vlax-safearray->list Pt))
vlax-safearray->listを使って、先ほど変数Ptに入れた、セーフ配列を変換してみると。。。
(500.0 1000.0 0.0)
やっと見慣れた、点座標のリストを得ることができました。
“選択した図形(円)から、その中心点座標を得る” このコードをまとめるとこうなります。
(setq Obj (car(entsel)))
(setq VlObj (vlax-ename->vla-object Obj))
(setq Pt (vlax-safearray->list
(vlax-variant-value
(vla-get-center VlObj)
)
)
);setq
DXF図形情報と比較
では、DXF図形情報の場合と比較してみましょう。
DXF図形情報では、グループコード(画層の場合は10)を使って
(setq Obj (car(entsel)))
(setq Ent (entget Obj))
(setq Pt (cdr (assoc 10 Ent)))
これで、同じように変数Ptに中心点座標が入ります。
どうでしょうか?
今回は、DXF図形情報の方が、画層名を得る要領でできるし、シンプルな感じがしますね。
VLisp / AutoLISP どちらを使うべき?
新しく追加された機能などを編集したいときは、VLispでしか編集できないものもありますが、VLispとAutoLISPどちらでも同じ結果を得ることができるルーティンは数多くあります。
VLispの方が新しいからといって、必ずしも常に優れているというわけではなく、今回の円の中心座標だとAutoLISPの方がシンプルでいいなと思いますし、現在画層など設定変更をする場合は、システム変数の変更でできるものだと、setvar だけで済むのでAutoLISPの方がはるかに楽だと思います。
どちらが良いというものではなく、自分で作っていて、わかりやすい方、シンプルに書ける方を、「好みと状況によって使い分ける。」のが正解なのかなと思います。
まとめ
- vla-get-xxxx で、図形のプロパティを得ることができる。
- xxxx には プロパティ名が入る。
Comments