LISP でパスに沿った配列複写をしたいんだけど…
どうすればいいの?
こんにちは、メモだよ!!管理人です。
今回は、そんなあなたに、AutoCAD で LISP を使用して、パスに沿った配列複写を行う方法を紹介します。
command 関数を使用して、パスに沿った配列複写を行う
command 関数を使用して、パスに沿った配列複写を行うことができます。
サンプルコートは以下になります。
(defun c:ArrayPathObject ()
; 配列複写するオブジェクトを取得
(setq entities (ssget))
; パスのオブジェクトを取得
(setq pathEntity (car (entsel "\nパス曲線を選択:")))
; パスの長さを取得
(setq pathLength (vlax-curve-getDistAtParam pathEntity (vlax-curve-getEndParam pathEntity)))
; 配列複写する数
(setq number 8)
; 配列複写を実行
(initcommandversion)
(command "._array" entities "" "_pa" pathEntity "_as" "_y" "_i" (rtos (/ pathLength number)) number "_x")
(princ)
)
この LISP をロードして、ArrayPathObject コマンドを実行してみてください。
「オブジェクトを選択」と聞かれるので、配列複写したいオブジェクトを選択して、右クリックで確定します。
そして、「パス曲線を選択」と聞かれるので、パスにしたいオブジェクトをクリックします。
やったー!!
パスに沿って配列複写できた!!
ところで、command 関数の前にある (initcommandversion) ってなに?
initcommandversion 関数で何も引数を付けなくて実行すると、このあとに実行するコマンドのオプションが新しいものになります。
AutoCAD は、バージョンアップされるごとにいろいろ機能が追加されています。
中には、今まであったコマンドのオプションになにか追加されたり、オプションを実行するときにキーボード入力する文字が変わったりすることがあります。
(initcommandversion) を実行しないと、古いコマンドが実行されるので、そのコマンドの新しい機能が使用できなくなります。
例えば、配列複写コマンドでは、昔の AutoCAD には自動調整(配列複写したものがひとつのかたまりになる)機能がありませんでした。
なので、何もしないで実行すると、自動調整にできないですし、そもそもオプションが異なるのでコマンドが完了しません。
なるほど!!
だから (initcommandversion) を書いてるんですね!!
ところで、自動調整(配列複写したものがひとつのかたまりになる)でない配列複写を作成したいときは、どうすればいいの?
command 関数の 6 番目と 7 番目の引数が「"_as" "_y"」となっています。
ここで、自動調整に設定しています。
「"_as" "_n"」とすれば、配列複写されたオブジェクトはバラバラになります。😉
; 配列複写を実行
(initcommandversion)
(command "._array" entities "" "_pa" pathEntity "_as" "_n" "_i" (rtos (/ pathLength number)) number "_x")