ワッシャ表記だけは、仕様が分からないので、それ以外を修正してみました。
サイズ指定は最初1回、右クリックで終了です。
ワッシャの画層は「ワッシャ」、サイズは中点の円の1.2にしています。
必要に応じて変更してください。
*ワッシャの半径入力も必要なら、
(setq rlst (append rlst (list (* (cadr rlst) 1.2))))
を
(setq rlst (append rlst (list (getint "\n:ワッシャの半径を入力"))))
に変更してください。
(defun c:3cirrm (/ e en ent pt spt ept mpt laylst rlst ptlst i flg)
(setq laylst (list "先端" "中点" "根元" "ワッシャ"))
(setq rlst (list (getint "\n:先端の半径を入力")))
(setq rlst (append rlst (list (getint "\n:中点の半径を入力"))))
(setq rlst (append rlst (list (getint "\n:根元の半径を入力"))))
(setq rlst (append rlst (list (* (cadr rlst) 1.2)))) ;ワッシャの半径は中点の半径の1.2倍
(setq flg 1)
(while (= flg 1)
(while (= e nil)
(progn
(setvar 'errno 0)
(setq e (entsel "\n線分を選択(先端近くをクリック)(右クリックで終了):"))
(cond
((= 7 (getvar 'errno))
(princ "\nもう一度選択してください") ;; Stay in loop
)
((null e)(setq e 1)(setq flg 0))
((/= (cdr (assoc 0 (setq ent (entget (car e))))) "LINE")
(progn
(setq e nil)
(prompt "\n線分ではありません")
)
)
((setq flg 2))
)
)
)
(if (= flg 2)
(progn
(setq pt (osnap (cadr e) "_nea"))
(setq pt (trans pt 1 0)) ;クリックした点と近い方を先端に
(if (< (distance pt (cdr (assoc 10 ent))) (distance pt (cdr (assoc 11 ent))))
(progn
(setq spt (cdr (assoc 10 ent))
ept (cdr (assoc 11 ent))
)
)
(progn
(setq spt (cdr (assoc 11 ent))
ept (cdr (assoc 10 ent))
)
)
)
(setq mpt (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) spt ept)) ;中点算出
(command-s "ucs" "za" spt ept) ;線分に垂直に円を描画するため、ucsを変更
(setq ptlst (list spt mpt ept mpt))
(setq i 0)
(repeat (length laylst)
(if (not (tblsearch "layer" (nth i laylst)))
(command "-layer" "n" (nth i laylst) "")
)
(setq i (+ i 1))
)
(setq i 0)
(repeat (length laylst)
(command-s "circle" (trans (nth i ptlst) 0 1) (nth i rlst))
(command-s "change" "l" "" "p" "la" (nth i laylst) "")
(setq i (+ i 1))
)
(command-s "ucs" "p")
(setq e nil)
(setq flg 1)
)
)
)
(princ)
)
- LUNE
- 2024/11/19 (Tue) 10:52:58