TOP PAGE > 記事閲覧
展開図についてNO.2
投稿日 | : 2015/10/12(Mon) 10:41 |
投稿者 | : デジ |
参照先 | : |
;法面展開図・舗装展開図作業が簡単になりましたよ(笑)
;アルサポさんご協力ありがとうです。
;前回の投稿で三角形の作図スプリクトおよびリスプを投稿していました今回の投稿で展開図は完了です。
;より良いものを考えの方は改良版の投稿お待ちしています。
;三角形展開図および舗装展開図が作図されたら一気に実測値と設計値を作図しよう
;文字の高さを入力して展開図を選択(線分)線分の上下にテキスト値と寸法値が作図されます
;(アルサポより頂きました)
;作図前に寸法スタイルの設定を忘れないように!!!
(defun C:LineTxtDim (/ ss1 i ent1 ent2 new_txthi dis p1 p2 x3 y3 p3 p4)
(setq new_txthi(getdist "\n文字の高さを入力:"))
(setq dis (- 0 (* new_txthi 1.2)));離れの距離を設定 (線分より下に表示するために文字)
(prompt "\n線分を選択:")
(setq ss1 (ssget '((0 . "LINE"))));線分しか選択できない
(if (/= ss1 nil) ;「/=」等しくない
(progn
(setq num (sslength ss1))
(setq i 1)
(while (<= i num)
(setq ent1 (ssname ss1 (- i 1)));ss1の選択セットから一つずつ取り出す
(setq ent2 (entget ent1))
(setq p1(cdr (assoc 10 ent2))) ;始点座標
(setq p2(cdr (assoc 11 ent2))) ;終点座標
;p3(中点)の座標を計算 X3=X1+(X2-X1)/2 Y3=Y1+(Y2-Y1)/2
(setq x3 (+ (car p1) (/ (- (car p2) (car p1)) 2)))
(setq y3 (+ (cadr p1) (/ (- (cadr p2) (cadr p1)) 2)))
(setq p3 (list x3 y3))
;角度取得(ラジアン)
(setq ang (angle p1 p2))
;90°<ラジアン<270°文字を逆さにしないための処理
;(if (and (> ang 1.57)(< ang 4.71))
;(if (and (> ang (/ (* PI 90) 180))(< ang (/ (* PI 90) 270)))
(if (and (> ang (/ (* PI 90) 180))(< ang 4.713))
(setq ang (- ang 3.14));180°反転させる
)
;寸法を記入する
(command "dimaligned" p1 p2 0);始点、終点、寸法記入位置(今回は線分と同じ位置なので「0」)
;線分の長さ取得
(setq txt (strcat (rtos (distance p1 p2) 2 0)));「2」10進表現「4」は桁数
;中点からの離れの座標計算
(setq p4 (polar p3 (+ ang (* PI 0.5)) dis))
;文字を入力
(command "text" "J" "BC" p4 new_txthi (/ (* ang 180) PI) txt);「J」配置オプション、「BC」中心、座標、文字高、角度(°)、文字内容
;X座標が同じならば回転させる
(if (and (= (car p2) (car p1))) (command "rotate" "l" "" p3 180))
(setq i (+ i 1));カウントを1つ増やす
);while
);progn
);if
(setq ss1 nil)
(princ)
)
Re: 展開図についてNO.2
投稿日 | : 2015/10/12(Mon) 10:42 |
投稿者 | : デジ |
参照先 | : |
;展開図に距離を寸法スタイルで入力
;端数を切り捨てる
;端数処理値を入力して、寸法を選択以上
;切捨てlisp
(defun c:atai_cat_custom (/ Data0 Data1 Data2 Data3 Data4 Data5 Data6 Data7 new_obj)
;切捨て
(setq Data0 (getint "\n切捨て値を入力"));切捨て値を入力5・10等(整数に限る)
(prompt "\n図形を選択してくれ:")
(setq ss1 (ssget '((0 . "DIMENSION")))) ;寸法のみ選択させる。
(if (/= ss1 nil) ;「/=」等しくない
(progn
(setq num (sslength ss1))
(setq i 1)
(while (<= i num)
(setq ent1 (ssname ss1 (- i 1)));ss1の選択セットから一つずつ取り出す
(setq ent2 (entget ent1))
;-------------------------------------------------------------
(setq Data1 (assoc 42 ent2));寸法値情報42を取り出す
(setq Data2 (assoc 1 ent2));テキスト情報1を取り出す
(setq Data3 (cdr Data1));寸法値のみ取り出す
(setq Data4 (* (fix (/ Data3 Data0))Data0));寸法値を切捨て値で割って整数にして切捨て値で倍する。
(setq Data5 (itoa Data4));整数を文字列に変換
(setq Data6 (list Data5));文字列をリストする
(setq Data7 (cons 1 Data6));テキスト情報のペアを作成
(setq new_obj(subst Data7 Data2 ent2));入れ替える
(entmod new_obj);更新する
;-------------------------------------------------------------
(setq i (+ i 1));カウントを1つ増やす
);while
);progn
);if
(princ)
)