【AutoCAD LISP】LISP で矩形状の配列複写を行う方法

2022年2月24日

バレンタインチョコ(ボンボンショコラ)

LISP で矩形状の配列複写をしたいんだけど…

どうすればいいの?

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

今回は、そんなあなたに、AutoCAD で LISP を使用して、矩形状の配列複写を行う方法を紹介します。

 

command 関数を使用して、矩形状の配列複写を行う

配列複写に関しては、あとでサンプルコードを紹介しますが、vla- で始まる Visual Lisp の ActiveX の関数は使用しないほうがよさそうです。

というのは、新しいひとかたまりになった(自動調整の)配列複写にできないからです。

なので、command 関数を使用して行いましょう。

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

(defun c:ArrayRectangular ()
  ; 配列複写するオブジェクトを取得
  (setq entities (ssget))
  
  ; 配列複写する行の数
  (setq row 3)
  
  ; 配列複写する列の数
  (setq column 2)
  
  ; 行の間隔
  (setq rowDist 100)
  
  ; 列の間隔
  (setq columnDist 200)
  
  ; 配列複写を実行
  (initcommandversion)
  (command "._array" entities "" "_r" "_as" "_y" "_r" row rowDist 0 "_col"column columnDist "_x")
  
  (princ)
)

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

「オブジェクトを選択」と聞かれるので、配列複写したいオブジェクトを選択して、右クリックで確定します。

やったー!!

矩形状に配列複写できた!!

ところで、command 関数の前にある (initcommandversion) ってなに?

initcommandversion 関数で何も引数を付けなくて実行すると、このあとに実行するコマンドのオプションが新しいものになります。

AutoCAD は、バージョンアップされるごとにいろいろ機能が追加されています。

中には、今まであったコマンドのオプションになにか追加されたり、オプションを実行するときにキーボード入力する文字が変わったりすることがあります。

(initcommandversion) を実行しないと、古いコマンドが実行されるので、そのコマンドの新しい機能が使用できなくなります。

例えば、配列複写コマンドでは、昔の AutoCAD には自動調整(配列複写したものがひとつのかたまりになる)機能がありませんでした。

なので、何もしないで実行すると、自動調整にできないですし、そもそもオプションが異なるのでコマンドが完了しません。

なるほど!!

だから (initcommandversion) を書いてるんですね!!

ところで、自動調整(配列複写したものがひとつのかたまりになる)でない配列複写を作成したいときは、どうすればいいの?

command 関数の 5 番目と 6 番目の引数が「"_as" "_y"」となっています。

ここで、自動調整に設定しています。

「"_as" "_n"」とすれば、配列複写されたオブジェクトはバラバラになります。😉

  ; 配列複写を実行
  (initcommandversion)
  (command "._array" entities "" "_r" "_as" "_n" "_r" row rowDist 0 "_col"column columnDist "_x")

 

Visual Lisp の ActiveX の関数を使用したときに困ること

最初に書きましたが、配列複写に関しては、vla- で始まる Visual Lisp の ActiveX の関数は使用しないほうがよさそうです。

では、サンプルコードを見てみましょう。

(defun c:ArrayRectangular2 ()
  ; 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 row 3)
  
  ; 配列複写する列の数
  (setq column 2)
  
  ; 行の間隔
  (setq rowDist 100)
  
  ; 列の間隔
  (setq columnDist 200)
  
  ; 配列複写を実行
  (setq arrayObject (vla-ArrayRectangular vlaObject row column 1 rowDist ColumnDist 0))
  
  (princ)
)

この LISP を実行して ArrayRectangular2 コマンドを実行してみてください。

「オブジェクトを選択」と聞かれるので、配列複写したい図形を選択します。

すると、たしかに配列複写できます。

でも、vla-ArrayRectangular 関数の引数には、自動調整(ひとかたまりにする)にする設定がないんです。😢

なので、配列複写したものがばらばらになってもいいのであれば、vla-ArrayRectangular で行っても構いませんが、そうでないときは command 関数を使用しましょう。😔

-API
-