Sponsored links

【AutoLISP VLISP】(vl-load-com) ってなに?

Sponsored links
AutoLISP
Sponsored links

AutoLISPには、Visual LISP(VLISP)という、新しく追加された言語があり、vl-load-comは、それを読み込む関数です。
全く別の言語ではなく、パワーアップさせるもので、同じプログラム内で使って、AutoLISPだけではできなかったことができるようになります。

Sponsored links

(vl-load-com)

AutoLISPのサンプルを探していて、プログラムの最初に

(vl-load-com)

を見かけることがあると思います。

これは、VisualLISP (VLISP)を読み込むためのものです。

Visual LISP と言えば、AutoCADに搭載されているAutoLISPエディタ?と思うかもしれませんが、ここでは、Visual LISPは、AutoLISPの力を強力にする、追加された機能のことです。

Visual LISPがAutoCADに仲間入りしたときに、恐らく、一押しのアップグレードした機能で、そのままエディタの名前になったんだと思います。

難しい説明は省きますが(知らないので)、Visual LISP関数は読み込みが必要な場合があります。

そのため、Visual LISP関数を使うコマンドには、(vl-load-com)を最初につけます。
(vl-load-com)は、既に機能拡張が読み込まれていれば何もしないので、余分についていても害はありません。

AutoLISPではできなくてVLISPにできること

開発者レベルでは、他の言語とかソフトと共有できるようになったり、大変便利で、AutoLISPとは全く違うもののようです。

が、私に理解できるのは、CADオペレーターとしてAutoCADユーザーレベル。
AutoLISPの関数が追加された。ぐらいな理解で使っています。

例)ダイナミックブロック名の取得

AutoLISP関数にはできなくて、VLISP関数ならできること。
例えば、ブロック名の取得について。

ブロック名は、DXF図形情報からも取得できます。(DXF図形情報についての記事) 

グループコード 2 がブロック名なので、AutoLISPの

(setq Obj (car (entsel)))
   (cdr (assoc 2 (entget Obj)))

で、ブロック名は取り出せます。

しかし、そのブロックがダイナミックブロックで、ダイナミックブロックの機能を使って編集していると、*U5 など、特有な名前がわり当てられてしまいます

しかし、VLISP関数なら、ダイナミックブロックで編集した後でも、正しいブロック名を得ることができます。

VLISP関数 vlax-ename->vla-object

VLで始まる関数が、VLISP関数です。
vlax-ename->vla-object は、entsel で得た要素(エンティティ)の名前を、VLISP用の名前に変更する機能があります。

(setq Obj (car (entsel)))
(setq VObj (vlax-ename->vla-object Obj)

これで、VObjに、VLISP関数で操作できる、図形のVLAオブジェクト名が入りました。

VLISP関数 vla-get-Effectivename

ブロックの名前を取得する関数 vla-get-Effectivename に先ほどのVObjを引数として渡します。

(vla-get-Effectivename VObj)

これで、ブロック名を戻り値として得ることができます。

ブロック名の取得について、AutoLISP のみの場合と、VLISPを使った場合をまとめてコマンドにしました。
ブロックを選択すると、VisualLISPで取り出した場合と、AutoLISPのみで取り出した場合のブロック名が表示されるコマンドです。


ダイナミックブロックを用意し、ダイナミックブロックの機能を使ってブロックを変えた後に試してみてください。

VisualLISPでは正しい名前が、AutoLISPでは*U5というような違う名前になっていることが確認できます。

(defun c:test ( / Obj VlNm AlNm)
(vl-load-com)

   (setq Obj (car (entsel)))
       (setq VlNm (vla-get-Effectivename (vlax-ename->vla-object Obj)))
       (setq AlNm (cdr(assoc 2 (entget Obj))))
  
  (alert (strcat "VisualLISP: " VlNm "\nAutoLISP : " AlNm))

(princ))

このように、AutoLISPだけではできなかったことが、VLISP関数ではできます。
別言語ではなく、AutoLISPプログラミング内で使っていけます。

まとめ

  • AutoLISPには、Visual LISPという追加された言語がある。
  • 別言語ではなく、AutoLISPの機能を増やすもの。
  • (vl-load-com) は、Visual LISPを読み込む関数。
  • すでに読み込まれていれば、(vl-load-com)は何もしない。

Comments