【AutoCAD LISP】LISP でオブジェクトの色、線種、線の太さを変更する方法

2022年3月10日

【AutoCAD LISP】LISP でオブジェクトの色、線種、線の太さを変更する方法

LISP でオブジェクトの 線種線の太さ を変更したいんだけど…

どうすればいいのかなぁ?

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

今回は、そんなあなたに、AutoCAD で LISP を使用して、オブジェクトの色、線種、線の太さを変更する方法を紹介します。

 

オブジェクトの色を変更する方法

LISP でオブジェクトの色を変更するには、vla-put-truecolor 関数を使用します。

サンプル コードは以下になります。

(defun c:ChangeColor ()
  ; AutoCAD のオブジェクトを取得
  (setq acadObject (vlax-get-acad-object))

  ; アクティブなドキュメントを取得
  (setq activeDocument (vla-get-activedocument acadObject))
  
  ; ドキュメントの Utilyty オブジェクトを取得
  (setq utility (vla-get-utility activeDocument))
  
  ; 選択した図形の VLA オブジェクトを取得
  (vla-getentity utility 'vlaObject 'pickedPoint "\nオブジェクトをを選択:")
  
  ; 変更後の色のオブジェクトを作成(青(カラー インデックス 5))
  (setq newcolor (vlax-create-object (strcat "AutoCAD.AcCmColor." (substr (getvar "ACADVER") 1 2))))
  (vla-put-colorindex newcolor 5)
  
  ; オブジェクトの色を変更
  (vla-put-truecolor vlaObject newcolor)
)

この LISP をロードして、ChangeColor コマンドを実行してみてください。

「オブジェクトを選択」と聞かれるので、適当なオブジェクトを選択してみてください。

やったー!!

選択したオブジェクトの色を、青色に変更できた!!

色を変更できた

 

色の指定は、AcCmColor オブジェクトを作成して、それに色番号を割り当てています。

  ; 変更後の色のオブジェクトを作成(青(カラー インデックス 5))
  (setq newcolor (vlax-create-object (strcat "AutoCAD.AcCmColor." (substr (getvar "ACADVER") 1 2))))
  (vla-put-colorindex newcolor 5)

vlax-create-object 関数でオブジェクトを取得するには、<Vendor>.<Component>.<Version> を指定します。

AutoCAD の AcCmColor オブジェクトなので、「AutoCAD.AcCmColor.」まではいいですよね。

最後の Version は、システム変数 ACADVER の最初の 2 文字から取ってきています。

例えば、AutoCAD 2022.1.1 の ACADVER の値は、"24.1s (LMS Tech)" なので、最初の 2 文字の 24 がバージョンになっているということです。

そして、vla-put-colorindex 関数で、色番号 5(青色)を割り当てています。

 

オブジェクトの線種を変更する方法

LISP でオブジェクトの線種を変更するには、vla-put-linetype 関数を使用します。

サンプル コードは以下になります。

(defun c:ChangeLinetype ()
  ; AutoCAD のオブジェクトを取得
  (setq acadObject (vlax-get-acad-object))

  ; アクティブなドキュメントを取得
  (setq activeDocument (vla-get-activedocument acadObject))
  
  ; ドキュメントの Utilyty オブジェクトを取得
  (setq utility (vla-get-utility activeDocument))
  
  ; 選択した図形の VLA オブジェクトを取得
  (vla-getentity utility 'vlaObject 'pickedPoint "\nオブジェクトをを選択:")
  
  : 変更後の線種の設定
  (setq newlinetype "DASHED")
  
  ; 図面に変更したい線種が存在するか確認し、ないときはロードする
  (setq haslinetype nil)
  (setq linetypes (vla-get-linetypes activeDocument))
  (vlax-for linetype linetypes
    (setq name (vla-get-name linetype))
    (if (= name newlinetype)
      (setq haslinetype T)
    )
  )
  
  (if (not haslinetype)
    (command "._linetype" "_l" newlinetype "" "")
  )
  
  ; 線種を変更
  (vla-put-linetype vlaObject newlinetype)
)

この LISP をロードして、ChangeLinetype コマンドを実行してみてください。

「オブジェクトを選択」と聞かれるので、適当なオブジェクトを選択してみてください。

やったー!!

選択したオブジェクトの線種を、DASHED に変更できた!!

線種が変更された

 

図面に存在しない線種をオブジェクトに割り当てようとすると、エラーになってしまいます。

そのため、事前に線種が存在するか確認して、存在しないときはロードしておく必要があります。

  ; 図面に変更したい線種が存在するか確認し、ないときはロードする
  (setq haslinetype nil)
  (setq linetypes (vla-get-linetypes activeDocument))
  (vlax-for linetype linetypes
    (setq name (vla-get-name linetype))
    (if (= name newlinetype)
      (setq haslinetype T)
    )
  )
  
  (if (not haslinetype)
    (command "._linetype" "_l" newlinetype "" "")
  )

vla-get-linetypes 関数で、図面の中の線種のテーブルを取得できます。

vlax-for 関数で、その中の線種の名前を取得して、変更したい線種があるかどうかを確認しています。

そして、もしその線種がなければ、command 関数で LINETYPE コマンドを実行して、線種をロードしています。

 

オブジェクトの線の太さを変更する方法

LISP でオブジェクトの線の太さを変更するには、vla-put-lineweight 関数を使用します。

サンプル コードは以下になります。

(defun c:ChangeLineweight ()
  ; AutoCAD のオブジェクトを取得
  (setq acadObject (vlax-get-acad-object))

  ; アクティブなドキュメントを取得
  (setq activeDocument (vla-get-activedocument acadObject))
  
  ; ドキュメントの Utilyty オブジェクトを取得
  (setq utility (vla-get-utility activeDocument))
  
  ; 選択した図形の VLA オブジェクトを取得
  (vla-getentity utility 'vlaObject 'pickedPoint "\nオブジェクトをを選択:")
  
  ; 先の太さを 2.00 に変更
  (vla-put-lineweight vlaObject acLnWt200)
)

この LISP をロードして、ChangeLineweight コマンドを実行してみてください。

「オブジェクトを選択」と聞かれるので、適当なオブジェクトを選択してみてください。

やったー!!

選択したオブジェクトの線の太さを、2.00 に変更できた!!

線の太さを変更できた

 

acLnWt200 が 2.00 の線の太さを示しています。

  ; 先の太さを 2.00 に変更
  (vla-put-lineweight vlaObject acLnWt200)

その他の線の太さは、以下のようになります。

  • acLnWt000
  • acLnWt005
  • acLnWt009
  • acLnWt013
  • acLnWt015
  • acLnWt018
  • acLnWt020
  • acLnWt025
  • acLnWt030
  • acLnWt035
  • acLnWt040
  • acLnWt050
  • acLnWt053
  • acLnWt060
  • acLnWt070
  • acLnWt080
  • acLnWt090
  • acLnWt100
  • acLnWt106
  • acLnWt120
  • acLnWt140
  • acLnWt158
  • acLnWt200
  • acLnWt211
  • acLnWtByLayer
  • acLnWtByBlock
  • acLnWtByLwDefault

-API
-