Sponsored links

【AutoLISP VLISP】vla-get-xxxx 図形の情報を得る

Sponsored links
Visual Lisp
Sponsored links

vla-get-xxxx を使うと、ActiveX図形情報から図形のプロパティをえることができます。

Sponsored links

事前知識

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