明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: cjf160204

[测绘] 绘制隧道轮廓,东拼西凑,望大神帮忙优化

[复制链接]
发表于 2025-1-27 14:00:18 | 显示全部楼层
;; 加个对话框更便于理解


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2025-2-5 09:22:26 | 显示全部楼层
强大,学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-7 09:09:28 | 显示全部楼层

(defun c:AC (/ option)
  (initget 0 "S E")
  (setq option (getkword "\n[S/E] <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)
回复 支持 反对

使用道具 举报

发表于 2025-9-7 09:19:19 | 显示全部楼层
还在更新太赞了
回复 支持 反对

使用道具 举报

发表于 2025-9-7 09:20:40 | 显示全部楼层
一般的隧道不是用一个半径的圆的,好多用的是三个圆拼接的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-7 09:56:12 | 显示全部楼层
(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)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-7 10:01:20 | 显示全部楼层
加个对话框
回复 支持 反对

使用道具 举报

发表于 2025-9-7 12:31:33 | 显示全部楼层
显示  命令: APPLOAD 已成功加载 绘制隧道轮廓.lsp。
命令: ; 错误: 参数类型错误: numberp: nil
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-9-18 17:02 , Processed in 0.252966 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表