【AutoCAD LISP】モデル空間のすべて あるいは 特定の図形のプロパティを変更する方法

2022年1月16日

絵の具の試し書き

LISP を使って、モデル空間にあるすべての図形の色、画層、線種などのプロパティを変更したいんだけど…

あと、線分、円、ポリラインなどの特定の図形だけのプロパティを変更したいときもあるんだけど…

どうすればいいの?

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

今回は、そんなあなたに、LISPを使用して、モデル空間にある すべての図形 あるいは 特定の図形 のプロパティを一度に変更する方法を紹介します。

以前、以下の記事で、選択した図形のプロパティを変更する方法を紹介しました。

色見本 カラー見本
参考【AutoCAD LISP】図形のプロパティを取得したり変更する方法

AutoCAD で LISP を使用して、図形のプロパティを取得する方法を紹介します。また、プロパティを変更する方法も紹介します。

続きを見る

今回は、図形を選択するのではなく、モデル空間にある すべての図形 あるいは 特定の図形 のプロパティを変更する方法です。

 

モデル空間にある、すべての図形のプロパティを変更する

では、モデル空間にあるすべての図形のプロパティを変更するには、どのようにすればいいのか見ていきましょう。

 

vla-get-ModelSpace 関数を使用して、モデル空間のオブジェクトを取得

まず最初に、モデル空間のオブジェクトを取得します。

そのために、vla-get-ModelSpace 関数を使用します。

(defun C:ChangePropertiesInModelSpace ()
  ' アクティブドなキュメントのオブジェクトを取得
  (setq activeDocument (vla-get-ActiveDocument (vlax-get-Acad-Object)))

  ' モデル空間のオブジェクトを取得
  (setq modelSpace (vla-get-ModelSpace activeDocument))
)

 

vlax-for 関数を使用して、モデル空間内のすべてのオブジェクトに対して処理を行う

モデル空間のオブジェクトを取得できたら、vlax-for 関数を使用して、モデル空間内のすべてのオブジェクトに対して処理を行います。

例として、すべてのオブジェクトの色番号を 1(赤色)にしてみます。

(defun C:ChangePropertiesInModelSpace ()
  ' アクティブドなキュメントのオブジェクトを取得
  (setq activeDocument (vla-get-ActiveDocument (vlax-get-Acad-Object)))

  ' モデル空間のオブジェクトを取得
  (setq modelSpace (vla-get-ModelSpace activeDocument))
  
  ' モデル空間内のすべてオブジェクトのプロパティを変更
  ' ※ 変数 vlaObject にモデル空間のオブジェクトが順番に割り当てられる
  (vlax-for vlaObject modelSpace 
    (vlax-put-property vlaObject 'color 1)
  )
  
  (princ)
)

 

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

作業中のエンジニア
参考【AutoCAD LISP】LISP の実行方法

こんにちは、メモだよ!!管理人です。 今回は、そんなあなたに、AutoCAD で LISP を実行する方法を紹介します。   せっかく AutoLISP を勉強しようと思って、コードを書いてみても実行 ...

続きを見る

やったー。

ChangePropertiesInModelSpace コマンドを実行すると、図面中のすべての図形の色番号を 1(赤)に変更できた!!😄

すべての図形の色を赤に変更できた

たったこれだけのコードで、モデル空間内のすべての図形の色を 1(赤色)に変更することがでました。

簡単でしょ?😉

 

モデル空間にある、特定の図形のプロパティを変更する

今度は、すべての図形じゃなくて、円だけとか特定の図形のプロパティを変更したいんだけど…

どうすればいいの?

特定の図形に対してだけ、処理を実行するのも簡単にできます。

では、そのやり方を見ていきましょう。

 

vla-get-objectname 関数を使用して、オブジェクトの名前を取得

vla-get-objectname 関数を使用すると、オブジェクトの名前を取得できます。

例えば、オブジェクトが円(AcDbCircle)のときだけ、色番号を 5(青色)に変更するには、以下のようにします。

(defun C:ChangeColorOfCircle ()
  ' アクティブドなキュメントのオブジェクトを取得
  (setq activeDocument (vla-get-ActiveDocument (vlax-get-Acad-Object)))

  ' モデル空間のオブジェクトを取得
  (setq modelSpace (vla-get-ModelSpace activeDocument))
  
  ' モデル空間内のすべて円のプロパティを変更
  (vlax-for vlaObject modelSpace 
    (if (= "AcDbCircle" (vla-get-objectname vlaObject))
      (vlax-put-property vlaObject 'color 5)
    )
  )
  
  (princ)
)

「(if (= "AcDbCircle" (vla-get-objectname vlaObject))」の部分は、以下を意味します。

もし、変数 vlaObject に割り当てられている図形の名前が AcDbCircle の場合は、その後に書かれているコードを実行する。

 

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

やったー。

円だけ色番号を 5(青)に変更できた!!😄

すべての円の色を変更できた

 

オブジェクトの名前の確認方法

円が AcDbCircle というのはわかったけど…

他の図形は何になるの?

AcDbCircle のようなものを、サブクラス マーカーといいます。

主な例としては、以下になります。

オブジェクトサブクラス マーカー
線分AcDbLine
AcDbCircle
円弧AcDbArc
ポリラインAcDb2dPolyline
ハッチングAcDbHatch

上記以外のオブジェクトのサブクラス マーカーを知りたいときは、DXF の ENTITIES セクション のヘルプで確認できます。

例えば楕円のときは、DXF の ENTITIES セクション のページで ELLIPSE[楕円]をクリックします。

ELLIPSE[楕円]をクリック

表示された画面で、サブクラス マーカーが AcDbEllipse ということが確認できます。😄

サブクラス マーカーを確認

たまに、サブクラス マーカーが 2 つ表示されていることがあります。
 
円弧の DXF
 
例えば円弧の場合、AcDbCircle と AcDbArc があります。
これは、円弧は円に含まれているのでこのように表示されます。
円弧を指定したいときは、AcDbArc を指定します。

 

これで、モデル空間にある特定の図形のプロパティを、変更できるようになりましたね。😄

-API
-