Sponsored links

【AutoLISP リスト】点座標の編集

Sponsored links
AutoLISP
Sponsored links

1つの点座標からあれこれ編集して別の点座標を作りたいとき、リストから値を出して編集してまたリストにして…と、リスト操作が必要になります。

Sponsored links

予備知識

この記事ではリスト操作を行い点座標を編集します。

リストとは何か、リストの作り方

リストから各値を得る方法

点座標の編集

関数getpoint の戻り値は、(X値 Y値 Z値)のリストです。
では、コマンドラインに入力しながら点座標を編集してAutoLISPの動きを見ていきましょう。

点座標リストを作成

getpoint を使って、マウスクリックした場所の点座標を変数Pt1に入れます。

(setq Pt1 (getpoint))

上記のコードをコマンドラインに入力し、メッセージに従って点を指定(どこかをクリック)して変数Ptに値を入れてみて下さい。
!Pt1で、変数Ptの値を確認することができます。

(10.0 20.0 0.0)

というように、クリックした場所の点座標(X値 Y値 Z値)が変数Pt1に入ります。

X値 Y値を点座標から得る

X値、Y値、それぞれ別の変数に入れてみましょう。

リストの最初の要素を得るには関数car2番目の要素は関数cadrを使います。

(setq PtX (car Pt1)
      PtY (cadr Pt1)
)

見やすいように改行を入れましたが、コマンドラインに入力するときは、改行なしで
(setq PtX (car Pt1) PtY (cadr Pt1)) と入力しても大丈夫です。

これで、PtXにはX値、PtYにはY値が入ります。

X値 Y値を編集する

各値を編集します。
X値に100を足して、Y値には300を足してみましょう。
+ は後に続く引数を足す関数です。

(setq PtX (+ 100 PtX)
      PtY (+ 300 PtY)
)

X値に100、Y値に300 それぞれ足されました。
!PtX !PtY でそれぞれの値を確認してみて下さい。

編集した値から新しい点座標リストを作る

これらを点座標のリストにして、別の点座標にし、変数Pt2に入れます。
list がリストを作成する関数でしたね。

(setq Pt2 (list PtX PtY 0))

これで、新しい点座標の情報ができました。

!Pt2 で変数に入った値を確認できます。

座標点をコマンドで使う

では、実際にこれが座標点として使えるかどうか、RECTANG[長方形]コマンドで試してみましょう。

(command-s "._RECTANG" Pt1 Pt2)

上記のコードをコマンドラインに入力すると、
最初にクリックした場所(Pt1)と、そこからX方向に100Y方向に300動いた場所(Pt2)を頂点とした長方形ができます。
(オブジェクトスナップが影響するので、Pt1 Pt2の値からズレた場合はオブジェクトスナップをオフにして試してください。)

以上の操作をまとめてコマンドすると以下のようになります。

コマンド名はTESTです。
クリックした場所(Pt1)、X 300 Y 100 移動したところ(Pt2) を頂点にして長方形を描きます。

(defun c:TEST (/ Pt1 PtX PtY Pt2)

   (setq Pt1 (getpoint)) ;Pt1 にクリックしたポイントの座標を入れる

   (setq PtX (car Pt1) ;X座標の値をPtXに代入
         PtY (cadr Pt1) ;Y 座標の値をPtYに代入
    )

   (setq PtX (+ 100 PtX) ;X座標の値に100を足してPtXを上書き
         PtY (+ 300 PtY) ;Y座標の値に300を足してPtYを上書き
   )

   (setq Pt2 (list PtX PtY 0)) ;上書きした値をリストにした点座標をPt2に代入

   (command-s "._RECTANG" Pt1 Pt2) ;コマンドを実行して長方形を描く
(princ)
)

今回は2D操作を前提にしているのでZ値には触れずに0にしましたが、もちろん3DモデリングするときでもAutoLISPは使えます

Z値を得る関数は caddr です。

getpoint で得る点座標以外にも、DXF図形情報から得る円の中心点や、ブロックの挿入点も同じように3つの値がリストになった点座標です。

点座標の編集ができると、getpoint DXF図形情報などから得た1つの点座標から作図したり、今回のRECTANG[長方形]コマンドのように点を指定するときに代入したり、DXF図形情報で挿入点や円の中心点の座標を入れ替えることができます。

コマンド使用例

テキストに線分を付けて引き出し線

これはテキストに線やカッコを付けて引き出し線を入れるというコマンドです。

選択したマルチテキストの挿入点から、テキストの横幅縦幅+マージンをX値やY値に数字を足して、各座標点を計算式で出してポリラインと引き出し線を引いています。
この動画の最後の方にあるいくつものマルチテキストの位置が揃うコマンドは、選択したマルチテキストの挿入点から他のテキストの挿入点を計算して、DXF図形情報の挿入点を書き換えてマルチテキストの位置を揃えています。

選択された範囲の1/16をズームするコマンド

こちらも点座標の編集をひたすらしているサンプルコマンドです。
指定された2点の座標から全範囲を定義して、範囲を16分割した1/16のエリアをズームするための新しい2点の座標をリストで作成しています。

まとめ

  • 点座標は3つの値のリスト。
  • car はX値、cadrはY値、caddrはZ値が戻り値。
  • list を使って数値を3つ並べたリストは点座標として使える。
  • 点座標リストは、コマンドで1点を指定するときや、DXF図形情報の中心点挿入点などを入れ替えるときに使える。

関連記事

Visual LISPを使って点座標を編集する場合

関数setqを使って変数に値を代入する方法について

リストについて

練習問題

点座標を編集する練習問題です。

Comments