サンプルコード

【サンプルコード】基準点からの高さと幅をマルチ引出線で表示する|AutoLISPでAutoCADを効率化

samplecode1_eyecatch
  • AutoLISPを覚えてAutoCADを効率化したい
  • サンプルコードを参考にしたいけど検索しても見つからない
  • プログラミングは苦手なので解説付きだとうれしい

AutoLISPでAutoCADの作業を楽にしたいけど、プログラミングが苦手でコード(プログラム)を作れずにお困りではないでしょうか。マイナーなプログラム言語なのでサンプルコードを検索しても見つからずにお困りの方も多いはず。

私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。

そもそもAutoLISPってなに?という方はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説

当記事ではAutoLISPのサンプルコードとして、基準点からの高さと幅をマルチ引出線で表示するコードをご紹介します。初心者向けの解説付きなので、どんな方でも参考にしやすい内容になっています。

AutoLISPを覚えて今よりもAutoCADを効率化したい方はぜひ最後までお読みください。

サンプルコードの動作解説

samplecode1_1

今回ご紹介するAutoLISPのサンプルコードは次のとおりです。

申し訳ありませんがコードの使用は自己責任でお願いします。不具合が起きないようにするため、コピーしたdwgファイルで実行することをおすすめします。

(defun c:test1
       (
        /
	    base-pt pt1 pt2 width height ml-text now-style
       )

  ;;;必要な点をユーザーに指定させる
  (setq base-pt (getpoint "基準点を指定してください。"))
  (setq pt1 (getpoint "基準点からの高さと幅を調べたい点を指定してください。"))
  (setq pt2 (getpoint "マルチ引出線を表示する点を指定してください。"))

  ;;;指定された点から高さと幅を算出
  (setq width (- (car pt1) (car base-pt)))
  (setq height (- (cadr pt1) (cadr base-pt)))

  ;;;マルチ引出線に表示する文字列を作成
  (setq width (rtos width 2 2))
  (setq height (rtos height 2 2))
  (setq ml-text (strcat "高さ:" height "\n" "幅:" width))

  ;;;マルチ引出線スタイルを指定してマルチ引出線を作成
  (setq now-style (getvar "cmleaderstyle"))
  (setvar "cmleaderstyle" "Standard")
  (command "mleader" "H" pt1 pt2 ml-text)
  (setvar "cmleaderstyle" now-style)

  ;;;終了
  (print "終了しました。")
  (princ)
)

上記のコードが書かれたlspファイルをロードして、コマンドラインに「test1」と入力すると動作が始まります。

lspファイルの使い方についてはこちらの記事を参考にしてください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方

動作の流れは以下のようになっています。

  1. 処理に必要な点をユーザーに指定させる
  2. 指定された点から高さと幅を算出する
  3. 算出した値からマルチ引出線に表示させる文字列を作成する
  4. マルチ引出線を作成して高さと幅を表示する
はこさん。
はこさん。

1つずつ順番に解説していきます。

①処理に必要な点をユーザーに指定させる

処理に必要な以下の3点をユーザーに指定させます。

  • 高さと幅の基準になる点
  • 基準点からの高さと幅を調べる点
  • マルチ引出線を表示する点

コードで示すと最初の3行(8行目~10行目)がユーザーに点を指定させる動作をします。

;;;必要な点をユーザーに指定させる
(setq base-pt (getpoint "基準点を指定してください。"))
(setq pt1 (getpoint "基準点からの高さと幅を調べたい点を指定してください。"))
(setq pt2 (getpoint "マルチ引出線を表示する点を指定してください。"))

各行で記述している「getpoint」とはユーザーに点の指定を求めるAutoLISP関数のこと。図面上でクリックした点またはキーボードで直接入力した座標を返します。

「getpoint」についてもっと知りたい方はこちらの記事をご覧ください。
>>AutoCADに情報を取り込もう!AutoLISPのユーザー入力関数8種を解説

指定した各点はローカル変数のbase-pt、pt1、pt2に格納されます。

ローカル変数

ユーザー関数の中で定義される変数。定義したユーザー関数の中でのみ値を保持できる。他の関数からは値を参照できない。
>>オリジナルの関数を作ろう!ユーザー関数を定義するAutoLISP関数「defun」

今回は例として、下図に示した円の中心を指定します。(赤丸→変数base-pt、緑丸→変数pt1、青丸→変数pt2)

samplecode1_1-1

②指定された点から高さと幅を算出する

ユーザーに指定させた点をもとに、基準点からの高さと幅を算出します。コードで示すと以下の2行(13行目~14行目)で高さと幅の算出を行います。

;;;指定された点から高さと幅を算出
(setq width (- (car pt1) (car base-pt)))
(setq height (- (cadr pt1) (cadr base-pt)))

AutoLISPではリストと呼ばれる特殊なデータ形式で点(座標)を表現します。「car」と「cadr」はリストから値を取得できる関数なので、ユーザーが指定した点のX座標とY座標がわかります。

「car」と「cadr」についてはこちらの記事をご覧ください。
>>【AutoLISP】car部とcdr部を取得する関数「car」「cdr」

取得した座標からX座標の差分(基準点からの幅)とY座標の差分(基準点からの高さ)を算出し、ローカル変数のwidthとheightに格納しています。

はこさん。
はこさん。

pt1の座標値がbase-ptよりも小さい場合、差分はマイナスの値になります。

③算出した値からマルチ引出線に表示させる文字列を作成する

マルチ引出線に表示する文字列を作成するためには、算出した高さと幅を実数→文字列に変換する必要があります。今回はそれぞれの値を見やすくしたいので、高さと幅の間には改行を入れます。

コードで示すと以下の3行(17行目~19行目)でマルチ引出線に表示する文字列を作成します。

;;;マルチ引出線に表示する文字列を作成
(setq width (rtos dx 2 2))
(setq height (rtos dy 2 2))
(setq ml-text (strcat "高さ:" width "\n" "幅:" height))

「rtos」は実数→文字列に変換するAutoLISPの関数です。今回のコードでは、小数点以下が2桁の実数形式で文字列を返すように引数を与えています。

「rtos」の引数について知りたい方はこちらの記事をご覧ください。
>>文字列を使いこなそう!文字列を操作するAutoLISP関数8選

文字列に変換した高さと幅は再度ローカル変数のdx、dyに格納しているため、変数の中身が上書きされます。

次に、高さと幅の文字列を結合して1つの文字列にします。高さと幅の間には改行を入れたいので、改行を表す制御文字の「\n」も一緒に結合する必要があります。

制御文字はこちらの記事で解説していますので、興味のある方はご覧ください。
>>コマンドラインにメッセージを表示しよう!AutoLISPの表示関数4選

はこさん。
はこさん。

「\n」だけでは文字列として認識されないので、両側に「”」を付けています。

AutoLISPで文字列を結合するときは「strcat」を使いましょう。与えた文字列を並べた順番で結合してくれます。

「strcat」などの文字列を扱う関数についてはこちらの記事をご覧ください。
>>文字列を使いこなそう!文字列を操作するAutoLISP関数8選

はこさん。
はこさん。

結合した文字列はローカル変数のml-textに格納され、次の動作に移ります。

④マルチ引出線を作成して高さと幅を表示する

①でユーザーが指定した点にマルチ引出線を作成し、③で作成した高さと幅の文字列を表示させます。コードで示すと以下の4行(22行目~25行目)でマルチ引出線を作成しています。

;;;マルチ引出線スタイルを指定してマルチ引出線を作成
(setq now-style (getvar "cmleaderstyle"))
(setvar "cmleaderstyle" "Standard")
(command "mleader" "H" pt1 pt2 ml-text)
(setvar "cmleaderstyle" now-style)

マルチ引出線スタイルを指定してマルチ引出線を作成するため、あらかじめマルチ引出線スタイルの設定を変更する必要があります。現在のマルチ引出線スタイル名はシステム変数の「cmleaderstyle」で変更できます。

システム変数って何?という方はこちらの記事をご覧ください。
>>【AutoCADの作業効率アップ】システム変数を操作するAutoLISP関数2選

今回はデフォルト設定の「Standard」を指定していますが、作成済みのスタイル名であれば自由に指定できるので用途に合わせてコードを書き換えてください。

マルチ引出線スタイルは「マルチ引出線スタイル管理」で作成できます。コマンドラインに「mleaderstyle」と入力してEnterを押すと、下記の画面が表示されます。

samplecode1_1-2

ちなみに「マルチ引出線スタイル管理」は「注釈」タブの「引出線」で、右下矢印をクリックして表示することも。

samplecode1_1-3

マルチ引出線のスタイルを変更したら、「command」で「mleader」コマンドを呼び出してマルチ引出線を作成します。「command」とはAutoCADコマンドを実行できるAutoLISPの関数です。

「command」の使い方や使用例を知りたい方はこちらの記事をご覧ください。
>>【作図を自動化】コマンドを実行するAutoLISP関数「command」を解説

高さと幅を調べる点(変数pt1)に向けて矢印を表示したいので、”H”の文字を与えて「引出線矢印を指定(H)」のモードに設定しています。

他のモードを設定したい場合は「mleader」を図面上で実行したときに表示される、下記のメッセージから対応するアルファベットを指定してください。

samplecode1_1-4

上記の「mleader」によって、変数pt1に矢印が向いたマルチ引出線が作成され、変数pt2の位置に変数ml-textの文字列(高さと幅)が表示されます。

samplecode1_1-5

ローカル変数のnow-styleには変更前のマルチ引出線スタイル名が格納されています。最後の1行で「cmleaderstyle」にnow-styleを設定することで、現在のマルチ引出線スタイル名を元に戻します。

はこさん。
はこさん。

マルチ引出線スタイル名を変更したままだと次回以降にも引き継がれてしまうので、処理が終わったら設定を元に戻しておきましょう。

サンプルコードを活かしてAutoCADを効率化しよう

samplecode1_last

今回ご紹介したサンプルコードの動作内容を以下にまとめます。

  • 処理に必要な3つの点は「getpoint」でユーザーに指定させる
  • 各点のX座標とY座標は「car」と「cadr」で取得して高さと幅を算出する
  • 算出した高さと幅を文字列に変換する
  • 文字列にした高さと幅の間に改行を表す「\n」を追加して、3つの文字列を結合する
  • 「command」で「mleader」を呼び出し、指定した各点と結合した文字列でマルチ引出線を作成する

もっと複雑な処理をさせたい方は「repeat」などの繰り返し関数で動作を繰り返したり、「if」で条件ごとに処理を分岐させたり、やりたい動作に合わせてコードを書き換えてみてください。

あなたに代わってAutoLISPプログラムを作成します

AutoLISPで作業を自動化したいけど、プログラミングに詳しくないのでツールが作れずにお悩みの方へ。5年以上のAutoLISP経験を活かしてAutoCADを自動化するツールを作成します。既にお持ちのAutoLISPプログラム修正も対応可能です。

AutoCADの面倒くさい作業から解放されたい方は下記リンクからお気軽にご相談ください。
>>AutoCADが楽になるプログラムを作成します

AutoCADが楽になるプログラムを作成します AutoCADを効率化して面倒な作業から解放されましょう!

-サンプルコード