【AutoCAD LISP】線種をロードする方法

2022年1月28日

道路

LISP で線種って、どうやったらロードできるの?

こんにちは、メモだよ!!管理人です。

今回は、そんなあなたに、LISP で線種をロードする方法を紹介します。

 

vla-load 関数でロード

vla-load ロード関数を使用して、線種をロードすることができます。

(setq activeDocument (vla-get-activedocument (vlax-get-acad-object)))
(setq linetypes (vla-get-linetypes activeDocument))
(vla-load linetypes "HIDDEN" "acadiso.lin")

上記コードを実行すると、acadiso.lin ファイルに定義されている HIDDEN という線種をロードすることができます。

やったー!!

線種 HIDDEN をロードできた!!

線種 HIDDEN をロードできた

 

すでに図面に HIDDEN という線種があったときは、「; エラー: オートメーション エラー。 レコード名が重複しています」と表示されます。

 

すでに HIDDEN という線種があっても、上書きしたいときはどうしたらいいの?

メモだよ!!管理人は、vla- 関数で、線種を上書きする方法がわかりません。方法は、ないのかも???

なので、command 関数でやっちゃいます。

まずは、ロードしようとしている線種が図面に存在するかどうかを確認する関数を作成します。

(defun CheckLineTypeExists (lineTypeName)
  (setq activeDocument (vla-get-activedocument (vlax-get-acad-object)))
  
  (setq exsit nil)
  
  (vlax-for item (vla-get-linetypes activeDocument)
    (if (= (strcase (vla-get-name item)) (strcase lineTypeName))
      (setq exsit T)
    )
  )
  
  exsit
)

(CheckLineTypeExists "HIDDEN") を実行すると、HIDDEN という線種がないときは nil が返されて、あるときは T が返されます。

 

では、LoadLType というコマンドを作成してみましょう。

このコマンドを実行すると、HIDDEN がないときは、vla-load 関数でロードします。

HIDDEN がすでに存在するときは、command 関数で上書きでロードします。(上書きされた内容を反映するよう REGEN コマンドで再作図もしておきます。)

(defun C:LoadLType ()
  (setq activeDocument (vla-get-activedocument (vlax-get-acad-object)))
  (setq linetypes (vla-get-linetypes activeDocument))
  
  (if (CheckLineTypeExists "HIDDEN")
    (progn
      (command "_linetype" "_load" "HIDDEN" "acadiso.lin" "_y" "")
      (command "_regen")
    )
    (progn
      (vla-load linetypes "Hidden" "acadiso.lin")
    )
  )
  (princ)
)

(defun CheckLineTypeExists (lineTypeName)
  (setq activeDocument (vla-get-activedocument (vlax-get-acad-object)))
  
  (setq exsit nil)
  
  (vlax-for item (vla-get-linetypes activeDocument)
    (if (= (strcase (vla-get-name item)) (strcase lineTypeName))
      (setq exsit T)
    )
  )
  
  exsit
)

これで、LoadLType コマンドを実行すると、HIDDEN という線種がすでにあってもなくてもロードされるようになったね。😄

-API
-