| (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)网友答: 角度输入更方便网友答: ![]()
|
强大,学习了
网友答:
(defun c:AC (/ dcl_id dcl_file result deg min sec rad mode)