强大,学习了
xyp1964 发表于 2025-1-26 17:09
(defun c:AC (/ option)
(initget 0 "S E")
(setq option (getkword "\n <S>: "))
(if (or (null option) (= option "S"))
(c:ac-start-direction)
(c:ac-start-end)
)
(princ)
)
(defun c:ac-start-direction (/ start-point dir-point rad cen sang deg min sec total-deg eang)
(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)
)
)
(setq start-point (getpoint "\n下一点或退出: "))
)
)
(defun c:ac-start-end (/ a b c)
(setq a (getpoint "\n起点: "))
(setq b (getpoint a "\n端点: "))
(setq c (getdist a "\n半径: "))
(command "_.arc" a "_E" b "_R" c "")
)
(princ "\nAC命令已加载")
(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) 加个对话框 显示命令: APPLOAD 已成功加载 绘制隧道轮廓.lsp。
命令: ; 错误: 参数类型错误: numberp: nil 不应该啊…………
页:
1
[2]