TOP PAGE > 記事閲覧
ARES LISP 直線長さの計測結果の図面上への表示
投稿日 | : 2019/08/24(Sat) 21:47 |
投稿者 | : 数学好き |
参照先 | : |
失礼します。
当方、プログラムの知識は多少あるのですが、
リストという考え方や、LISPは初めて手を出すので全然知識が無いのですが、
件名のようなことはLISPで自動化できますでしょうか?
具体的には、今は下記のようなことを繰り返してやっています。
作業1:Getdistanceで線分の距離を測定。例えば9876.543とします。
作業2:その値を頭の中で1000で割って、小数第2位で四捨五入すると9.9になります。
作業3:図面の空いているスペースにSimplenoteで9.9という文字を表示させます。
作業3のSimplenoteは、毎回文字高さ等を設定しないといけないので、
あらかじめ文字高さ・文字角度・文字幅(図面上のスペースが狭いことが多いので0.75にしています)を決めて、
"***"のような文字列をSimplenoteで作成しておき、入力したい場所へコピペして、内容を***から9.9に変更するという
感じで進めています。
下記、私が考えている案になります。
あらかじめ、上記のようなSimplenoteの設定をした"***"をコピーして、クリップボードに置いておきます。
(defun C:test()
(command "LINE" pause pause "")
(setq LastLine (entlast))
;↑最後に作成したエンティティを指定であってますか?
;getpointで2点p1・p2を選択する方法も考えたのですが、
;getdistanceのように、どの点間を測っているのか一時的にでも見えた方がうれしいのであえてこうしています。
(最後に作成したエンティティから始点x1y1と終点x2y2の取得。図面は2次元です)★
(entdel LastLine)
;コマンドで作成した線分エンティティを削除であってますか?
(setq d (sqrt (+ (expt (- x2 x1) 2)(expt (- y2 y1) 2))))
(setq d (/ d 1000)
;三平方の定理で距離を求めて、1/1000倍する。上記の例だと9.876543
(小数第2位で四捨五入、d=9.9)★
(setq p3 (getpoint))
(p3の位置に***を貼り付ける)★
(最後に編集したエンティティ、すなわち***文字を編集して、d、すなわち9.9に変更する)★
)
インターネットで色々と調べてみたりしているのですが、特に★の部分はどうしたらいいのか全然わからないです。
ご協力、よろしくお願いします。
Re: ARES LISP 直線長さの計測結果の図面上への表示
投稿日 | : 2019/08/25(Sun) 10:48 |
投稿者 | : アルサポ |
参照先 | : |
数学好きさん、こんにちは。
私なりに数学好きさんのLispを修正してみました。
文字幅の設定については、Lispで変更する方法もありますが、
文字スタイルを新規作成して対応する方が簡単ではないかと思いましたので
省略しました。
(defun C:test()
(setvar "CMDECHO" 0)
;2点間距離の計測
(setq p1 (getpoint "\n 始点を指定:"))
(setq p2 (getpoint p1 "\n 終点を指定:"))
(setq d (distance p1 p2));2点間の距離を取得
(princ (strcat "\n 距離= " (rtos d 2)));コマンドプロンプトに計測距離を表示。
;計測距離を計算
(setq dmzn (getvar"DIMZIN"));現在の0省略表記(システム変数)を取得
(setvar "DIMZIN" 0);rtosの戻り値が「.0」の場合、0を省略しないようシステム変数を変更
(setq d (/ d 1000));メートルにする為に計算と解釈
(setq d (rtos d 2 1));rtos関数は数値を文字列に変換する。「2」は十進表記。「1」は小数以下の桁数。戻り値は四捨五入された値。
(setvar "DIMZIN" dmzn);システム変数を元の設定に変更。
;文字を記入
(setq p3 (getpoint "\n 文字の位置を指示:"))
(command "-text" p3 "100" "0" d);「100」が文字高、「0」は記入角度。
(setvar "CMDECHO" 1)
(princ)
)
Re: ARES LISP 直線長さの計測結果の図面上への表示
投稿日 | : 2019/08/25(Sun) 20:21 |
投稿者 | : 数学好き |
参照先 | : |
アルサポさん
さっそくありがとうございます!!
作っていただいたコードについて
・getpoint p1 でそんなことができるとは知らなかったです!
・そうです。メートル換算で1/1000倍です。
・四捨五入のプログラムありがとうございます。
・(setvar "CMDECHO" 0)、(setvar "CMDECHO" 1)とありますが、これはどういった目的なのでしょうか?
おそらく四捨五入時と同様に、設定を変えておいて、処理後に戻しているのかなと推測しているのですが……
・文字幅について
確かに、文字スタイルでできますね……
ただ、作業が終わった後に、文字スタイルを戻すのを忘れると、
次の作業の開始時に「あ、設定変えるの忘れてた」ってなりそうなのでLISPでの作業内に、文字スタイル変更も入れられた方がうれしいです。
選択中の文字スタイルを変えるコードを追加するとかはできたりするのでしょうか?
下のイメージです。
(dufun c:test()
現行有効な文字スタイルの保存
文字幅が狭くなった文字スタイルを有効化
〜〜書いていただいた処理など〜〜
文字スタイルを元に戻す
)
作っていただいたプログラムを基に、更にコードを追加していってるのですが、
一点追加で分からないところがあります。
たとえば、点のXY座標を求めます。
(setq p3 (getpoint))
別処理の計算で、x4・y4が算出されます。
(setq x4 1.1) ←たとえば、1.1・2.2とします。
(setq y4 2.2)
(setq p4 (x4 y4 0)) として、p4のリストを作ります。
最後に
(Command "LINE" p3 p4)
として、CAD上で取得した点と、計算で取得した点を結んだ線分を作りたいのですが、
どうも、うまくリストを作れていないようです。
(princ p4)として確認してみると、リストは(1.1 2.2 0)ではなく、(x4 y4 0)と変数名が文字列としてそのまま入っているようです。
上記はどのようにすればいいでしょうか?
あと、LISPの良い参考書とかがあれば教えていただきたいです。
よろしくお願いしますm(_ _)m
Re: ARES LISP 直線長さの計測結果の図面上への表示
投稿日 | : 2019/08/26(Mon) 06:57 |
投稿者 | : アルサポ |
参照先 | : |
質問が複数ありましたので、番号を振って、それぞれ答えさせてもらいます。
(1)(setvar "CMDECHO" 0)、(setvar "CMDECHO" 1)について、
CMDECHOはcommand関数の実行時にコマンドプロンプトに表示される
エコーバック(入力情報など)の表示を設定するシステム変数です。
(0:エコーバックを表示しない、1:エコーバックを表示する。)
今回、コマンドプロンプトに表示した計測距離と記入された四捨五入をした文字の値を
確認する為に、文字を記入した時点でコマンドプロンプトに計測距離を表示したままに
しておきたかったので、不必要な表示を省略させました。
(2)文字幅の設定をLispで設定するには、Lispのソースコードで
(command "-text" p3 "100" "0" d);「100」が文字高、「0」は記入角度。
(setvar "CMDECHO" 1)
の間に
(setq en (entget (entlast)));最後に描いた図形の定義データを取得
(setq en (subst (cons 41 0.75) (assoc 41 en) en));文字のグループコード「41」が幅係数。
(entmod en);定義データの更新をする
のソースコードを追記して下さい。
(3)座標値の変数について、
リストを使った代入方法が間違っているのではないかと思います。
例に挙げられた「p4」の場合、
(setq p4 (list x4 y4 0))
のようにlist関数が必要になります。
(4)Lispの参考書について
Ares対応のLispの参考書は知らないのですが、
私は「AutoLISP with Dialog」という本のみ所有しています。
DWG互換CADにも対応しているのですが、Aresでは出来ない内容もありました。
私がよく調べる方法としては、インターネットで調べるか、
Aresのバージョンが上がる度にグレバートジャパンから
開発環境別のリファレンスを頂いて参考にさせて頂いています。
lispを含めAresの情報はまだまだ少ないので、困ることが多いのが正直なところです。