(defun c:ac ()
(entmake
        (list '(0 . "ARC")
                (cons 10 (setq cen (getpoint "\n指定圆心")))
                (cons 40 (getdist cen "\n指定半径"))
                (cons 50 (setq sang (angle cen (getpoint cen "\n指定起点"))))
                (cons 51 (+ sang (* pi (/ (getreal "\n指定角度(°)") 180.0))))
        )
)
)
(defun c:ac1()
  (setq a (getpoint "\n请指点圆弧的起点:"))
  (setq b (getpoint "\n请指定圆弧的端点:"))
  (setq c (getreal  "\n请输入你想要的半径:"))
  (command "arc" a "E" b "R" c "")
  (princ
  )
  )


网友答: ;; 加个对话框更便于理解




网友答: 强大,学习了

网友答: (defun c:AC (/ dcl_id dcl_file result deg min sec rad mode)
  ; 每次使用默认值
  (setq deg 0
        min 0
        sec 0
        rad nil
        mode "S")

  ; 加载对话框
  (setq dcl_file (vl-filename-mktemp "ac_dialog.dcl"))
  (setq dcl_handle (open dcl_file "w"))

  (write-line
    "ac_dlg : dialog {
      label = \"圆弧绘制参数设置\";
      : row {
        : boxed_radio_column {
          label = \"绘制模式\";
          : radio_button {
            label = \"起点+方向\";
            key = \"mode_s\";
            value = 1;
          }
          : radio_button {
            label = \"起点+端点\";
            key = \"mode_e\";
          }
        }
        : boxed_column {
          label = \"角度参数\";
          : edit_box {
            label = \"度:\";
            key = \"deg\";
            value = \"0\";
            edit_width = 5;
          }
          : edit_box {
            label = \"分:\";
            key = \"min\";
            value = \"0\";
            edit_width = 5;
          }
          : edit_box {
            label = \"秒:\";
            key = \"sec\";
            value = \"0\";
            edit_width = 5;
          }
        }
        : boxed_column {
          label = \"半径参数\";
          : edit_box {
            label = \"半径:\";
            key = \"rad\";
            value = \"\";
            edit_width = 8;
          }
        }
      }
      spacer;
      ok_cancel;
    }"
    dcl_handle
  )

  (close dcl_handle)
  (setq dcl_id (load_dialog dcl_file))

  (if (not (new_dialog "ac_dlg" dcl_id))
    (exit)
  )

  ; 设置初始值
  (set_tile "deg" "0")
  (set_tile "min" "0")
  (set_tile "sec" "0")
  (set_tile "rad" "")
  (set_tile "mode_s" "1")

  ; 确定按钮动作
  (action_tile "accept"
    "(setq deg (atoi (get_tile \"deg\")))
     (setq min (atoi (get_tile \"min\")))
     (setq sec (atoi (get_tile \"sec\")))
     (setq rad_txt (get_tile \"rad\"))
     (setq mode (if (= (get_tile \"mode_s\") \"1\") \"S\" \"E\"))
     (if (= rad_txt \"\")
       (progn (alert \"半径不能为空!\") (mode_tile \"rad\" 2))
       (progn (setq rad (atof rad_txt)) (done_dialog 1))
     )")

  (action_tile "cancel" "(done_dialog 0)")

  ; 显示对话框并获取结果
  (setq result (start_dialog))
  (unload_dialog dcl_id)
  (vl-file-delete dcl_file)

  ; 如果用户点击确定,则绘制圆弧
  (if (= result 1)
    (if (= mode "S")
      (ac-start-direction deg min sec rad)
      (ac-start-end rad)
    )
  )

  (princ)
)

; 起点+方向模式
(defun ac-start-direction (deg min sec rad / pt dir cen sang eang total-deg)
  (if (setq pt (getpoint "\n指定起点: "))
    (if (setq dir (getpoint pt "\n指定半径方向: "))
      (progn
        (setq cen (polar pt (angle pt dir) rad))
        (setq sang (angle cen pt))
        (setq total-deg (+ deg (/ min 60.0) (/ sec 3600.0)))
        (setq eang (+ sang (* pi (/ total-deg 180.0))))

        (entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad)
                       (cons 50 sang) (cons 51 eang)))
        (princ "\n圆弧已绘制,按空格键继续绘制...")
      )
    )
  )
)

; 起点+端点模式
(defun ac-start-end (rad / a b cen sang eang midpt chord dist)
  (if (setq a (getpoint "\n指定起点: "))
    (if (setq b (getpoint a "\n指定端点: "))
      (progn
        (setq chord (distance a b))
        (if (<= rad (/ chord 2.0))
          (alert (strcat "半径太小,至少需要 " (rtos (/ chord 2.0) 2 2)))
          (progn
            (setq midpt (polar a (angle a b) (/ chord 2.0)))
            (setq dist (sqrt (- (* rad rad) (* (/ chord 2.0) (/ chord 2.0)))))
            (setq cen (polar midpt (+ (angle a b) (/ pi 2)) dist))
            (setq sang (angle cen a))
            (setq eang (angle cen b))

            (entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad)
                           (cons 50 sang) (cons 51 eang)))
            (princ "\n圆弧已绘制,按空格键继续绘制...")
          )
        )
      )
    )
  )
)

; 设置命令可以重复执行
(princ "\nAC命令已加载,输入AC绘制圆弧,按空格键重复执行")
(princ)

网友答: 程序简洁易懂,有实用性价值。你想要的半径  加个默认值 更方便些!

网友答: 圆心、半径、起始角度和终止角度画弧
http://bbs.mjtd.com/forum.php?mo ... amp;fromuid=7316343
(出处: 明经CAD社区)


网友答: 尽量少输入参数,人为给它固定下来。效率更高。

网友答: (defun c:ac ()
    (setq start-point (getpoint "\n指定圆弧的起点 <退出>: "))
    (while start-point
        (setq dir-point (getpoint start-point "\n指定半径方向: "))
        (setq rad (getdist start-point "\n指定半径长度: "))
        (setq cen (polar start-point (angle start-point dir-point) rad)) ; 计算圆心位置
        (setq sang (angle cen start-point)) ; 起点角度
        (setq eang (+ sang (* pi (/ (getreal "\n指定角度(°): ") 180.0)))) ; 计算终点角度
        (entmake
            (list '(0 . "ARC")
                  (cons 10 cen)
                  (cons 40 rad)
                  (cons 50 sang)
                  (cons 51 eang)
            )
        )
        (princ "\n继续绘制圆弧...按任意键继续,按 'Esc' 键退出")
        (setq start-point (getpoint "\n指定下一个圆弧的起点 <按 'Esc' 退出>: "))
    )
    (princ "\n圆弧绘制完成。")
    (princ)
)

(defun c:ac1()
  (setq a (getpoint "\n请指点圆弧的起点:"))
  (setq b (getpoint "\n请指定圆弧的端点:"))
  (setq c (getreal  "\n请输入你想要的半径:"))
  (command "arc" a "E" b "R" c "")
  (princ
  )
  )
(princ "\n加载完成,可以使用 c:ac 和 c:ac1 命令。")
(princ)

网友答: 优化以后,实际应用更方便

网友答: (defun c:ac ()
    (setq start-point (getpoint "\n指定圆弧的起点 <退出>: "))
    (while start-point
        (setq dir-point (getpoint start-point "\n指定半径方向: "))
        (setq rad (getdist start-point "\n指定半径长度: "))
        (setq cen (polar start-point (angle start-point dir-point) rad)) ; 计算圆心位置
        (setq sang (angle cen start-point)) ; 起点角度
        (setq deg (getint "\n请输入角度的度数部分: "))
        (setq min (getint "\n请输入角度的分数部分: "))
        (setq sec (getint "\n请输入角度的秒数部分: "))
        (setq total-deg (+ deg (/ min 60.0) (/ sec 3600.0))) ; 将度分秒转换为十进制度数
        (setq eang (+ sang (* pi (/ total-deg 180.0)))) ; 计算终点角度
        (entmake
            (list '(0 . "ARC")
                  (cons 10 cen)
                  (cons 40 rad)
                  (cons 50 sang)
                  (cons 51 eang)
            )
        )
        (princ "\n继续绘制圆弧...按任意键继续,按 'Esc' 键退出")
        (setq start-point (getpoint "\n指定下一个圆弧的起点 <按 'Esc' 退出>: "))
    )
    (princ "\n圆弧绘制完成。")
    (princ)
)
(defun c:ac1()
  (setq a (getpoint "\n请指点圆弧的起点:"))
  (setq b (getpoint "\n请指定圆弧的端点:"))
  (setq c (getreal  "\n请输入你想要的半径:"))
  (command "arc" a "E" b "R" c "")
  (princ
  )
  )
(princ "\n加载完成,可以使用 c:ac 和 c:ac1 命令。")
(princ)

网友答: 角度输入更方便

网友答:
  1. (defun c:tt ()
  2.   "底宽和半径画圆弧"
  3.   (defun udist (bit kwd msg def bpt / inp)
  4.    (if def
  5.     (setq msg(strcat"\n"msg"<"(rtos def)">: ")
  6.           bit(* 2(fix(/ bit 2)))
  7.     )
  8.     (setq msg(strcat"\n"msg": "))
  9.   )
  10.   (initget bit kwd)
  11.   (setq inp(if bpt(getdist msg bpt)(getdist msg)))
  12.   (if inp inp def)
  13.   )
  14.   (or dd (setq dd 20.))
  15.   (or rr (setq rr 15.))
  16.   (setq dd (Udist 7 "" "底宽<输入或鼠标直接量取>" dd nil))
  17.   (setq rr (Udist 7 "" "半径<输入或鼠标直接量取>" rr nil))
  18.   (if (and (setq d1 (* dd 0.5))
  19.            (< d1 rr)
  20.            (setq p0 (getpoint "\n底部中心基点<退出>: "))
  21.       )
  22.     (setq p1 (polar  p0 pi d1)
  23.           p2 (polar  p0 0 d1)
  24.           r1 (sqrt (- (* rr rr) (* d1 d1)))
  25.           p3 (polar  p0 (* pi 0.5) (+ r1 rr))
  26.           s1 (command "arc" "non" p2 "non"p3 "non"p1)
  27.     )
  28.   )
  29.   (princ)
  30. )
  • 上一篇:标注文字避让
  • 下一篇:没有了