2点から角度を得る関数 angle を紹介します。
予備知識
AutoCADで作図をするとき、「点」は、通常、POINT[点]コマンドで作成する図形の点のことを言いますが、AutoLISPでプログラミングをするとき、「点」と言えば、通常、座標情報 (X Y Z)のことを言います。( X Y Z ) はリストと呼ばれる形式です。
ユーザーがクリックした場所の点(座標情報)を得る方法はコチラの記事を。
関数 angle
AutoLISP関数 angle は、2 つの端点で定義される線分の角度を得る機能があります。
引数は2つの点(座標)Z値は省略可。
戻り値は角度(ラジアン単位)です。
例えば
関数getpoint は、ユーザークリックで点情報を取得できます。
まず、点の情報を変数Pt1 Pt2 に入れてください。
(setq Pt1 (getpoint) Pt2 (getpoint))
そして、この2点を関数 angle の引数として渡します。
(setq Rad (angle Pt1 Pt2))
すると、Pt1からPt2に直線を引いた場合の角度がラジアン単位で戻ります。
(setq を使って変数Radに戻り値を入れました。)
この図の場合だと、angleの戻り値は0.785398です。
これを馴染みの度(度数法)で表したいときは180/piを掛けます。
(setq Deg (* Rad (/ 180 pi)))
これで、0.785398ラジアンが45度に変換されます。
使用例
この関数angle を使って、2点で指定した角度にテキストやブロックを回転させる。というコマンドを作ります。
2つの点とその角度を求めるコードです。これで、変数Angに角度がラジアン値で入ります。
(setq
Pt1 (getpoint)
Pt2 (getpoint)
Ang (angle Pt1 Pt2)
)
ここでは角度が欲しいだけなので、
(setq Ang (angle (getpoint) (getpoint)))
とひとまとめにしてもいいよ。
わかりやすい方で。
そして、DXF図形情報を編集して図形の回転角度を変更するコードがこちらです。
DXF図形情報でも角度はラジアン値なので変換する必要はありません。
(setq Ent (entget (car(entsel))))
(setq Ent (subst (cons 50 Ang) (assoc 50 Ent) Ent))
(entmod Ent)
上で例にあげた2点をPt1 PT2にいれて、テキストのDXF図形情報を修正すると、テキストがPt1→Pt2の角度になります。
DXF図形情報を書き換える方法について、詳しくは下の参考記事にあります。
これらをコマンドにまとめるとこうなります。
コマンド名はtest です。
(defun c:test ( / Pt1 Pt2 Ang Ent)
(setq
Pt1 (getpoint "点1を選択:") ; Pt1に点情報
Pt2 (getpoint "点2を選択:") ; Pt2に点情報
Ang (angle Pt1 Pt2) ; AngにPt1とPt2にの角度を入れる
)
(setq Ent (entget (car(entsel "ブロック/(マルチ)テキストを選択:/n")))) ; 図形を選択してDXF図形情報をEntに入れる
(setq Ent (subst (cons 50 Ang) (assoc 50 Ent) Ent)) ; 50(回転角度)の情報をAngに書き換える
(entmod Ent) ; 書き換えたDXF図形情報に沿って図形を編集
(progn))
まとめ
- AutoLISP で点は、通常、座標 (X Y Z) のリストのことを言う。
- angle は、2 つの端点で定義される線分の角度が欲しい時に使う。
- angle の引数は2つの点。
- angle の戻り値はラジアン値での角度。
- 度数法に変換したい場合は180/piを掛ける。
参考記事
コマンド例では、テキストのDXF図形情報を書き換えました。
それについて詳しく知りたいかたはコチラの記事を。
記事内に出てきたテキストやブロックの回転角度を変更するコマンド。
エラー処理を付けたり、1度の角度設定で連続で図形を選択していけるようにまとめたサンプルコマンドです。