明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3644|回复: 12

[源码] 已知圆弧的弧长及弦长、弧长及弓高、弦长及弓高,求半径及画圆弧, 请高手帮忙调试...

[复制链接]
发表于 2015-11-23 14:23 | 显示全部楼层 |阅读模式
已知圆弧的弧长及弦长、弧长及弓高、弦长及弓高,求半径及画圆弧,
请高手帮忙调试这个lsp




;========arcL========
;已知同弧的弧长及弦长、弧长及弓高、弦长及弓高,求半径及画圆弧
(defun C:arcL()
        (setq xtblm '("cmdecho" "osmode")
        xtblz (mapcar 'getvar xtblm) ;获取系统变量的原始值
        )
        (mapcar 'setvar xtblm '(0 33));对系统变量初始化
        (command "_undo" "de") ;设置撤消命令的起点
        ;设置选择画弧方式的关健字
        ;L为按“弧长弦长”方式画圆弧(默认方式)
        ;H为按“弧长弓高”方式画国弧
        ;C为按 "弦长弓高"方式画圆弧
        (initget "L H C")
        (setq htbz(getkword "\n画弧方式〔L一弧长弦长/H一弧长弓高/C一弦长弓高〕<L>:"))
        (if(= htbz nil)(setq htbz "L"))
        (if(wcmatch htbz "L,H")(setq L(getreal "\n弧长:")))
        (if(wcmatch htbz "L,C")(setq C(getdist "\n弦长:")))
        (if(wcmatch htbz "H,C")(setq h(getdist "\n弓高:")))         
        ;当“弧长弓高”方式画圆弧时,询问是劣弧还是优弧
        ;将圆心角<l.5pi的圆弧都视为劣孤
        (initget "Y N")
        (if(= htbz "H")
        (if(= (setq yh(getkword "\n 劣弧[Yes/No]<Y>:"))nil)
        (setq yh "Y")
        )
        )
        (setq eps le-10;设定迭代精度e=10^-10(即10的负10次方)
        x 0
        xi (* 1.0 pi);初值
        )
        (if (and (= htbz "H")(= yh "N"))(setq xi (* 2.0 pi)))       
        (if(wcmatch htbz "L,C")(setq xi (* 2.0 pi)))
        ;牛顿迭代法求圆心角
        (while(>(abs(- xi x)) eps)
        (setq x xi)
        (if(= htbz "L")
        ;已知圆弧长度及弦长的迭代
        (setq fx(-(* 2.0 L (sin(/ x 2.0)))(* c x))
                dfx(-(* L (cos(/ x 2.0)))c)
        )
        (if(= htbz "H")
                ;已知圆弧长度及弓高的迭代
                (setq fx (- L (* L (cos(* 0.5 x)))(* h x))
                        dfx(-(* 0.5 L (sin(* 0.5 x)))h)
        )
        ;已知圆弦长度及弓高的迭代
        (setq fx (-(* 2.0 h (sin(* 0.5 x)))(* -1.0 c (cos(* 0.5 x)))c)
                dfx(-(* h (cos(* 0.5 x)))(* 0.5 c (sin(* 0.5 x))))

        )
        )
        )
        (setq xL (- x (/ fx dfx)))
        )
        ;由圆心角计算出半径       
        (if(wcmatch htbz "L,H")
                (setq r (/ L xL))
                (setq r (/ c 2.0 (sin(* 0.5 xL))))
        )
        (princ "\n解算出的半径R=")(princ(rtos r 2 10))
        ;根据已知数据及解算出的圆心角、半径计算弓高
        (if(= htbz "L")(setq h (* r (1-(cos(* 0.5 xL))))))
        (if(= htbz "H")
                (progn
                        (setq c(* 2.0 r (sin(*0.5 xL))))
        (if(<(abs(- xL (* 2.0 pi))) 1e-6)(setq c(* 2.0 r)))))
        )
        ;根据指定的点、已知及解算出的数据计算圆弧的中点、止点
        (setq pt (getpoint "\n 起点:")
        pt3 (polar pt1 0 c)
        ptm (polar pt1 0 (* 0.5 c))
        pt2 (polar ptm(* 0.5 pi) h)
        )
        (setvar "osmode" 0);关闭对象捕捉功能
        ;调用CAD已有的三点画圆弧命令画圆弧
        (command "_arc" pt1 pt2 pt3)
        (setvar "osmode" 33);设置对象捕捉(捕捉端点和交点)
        (princ "\n止点方向:")
        ;动态将固弧旋转到指定方向
        (command "_rotate" (entlast) "" pt1 "r" pt1 pt3 pause)
        (command "_undo" "e") ;设置撤消命令的止点
        (mapcar 'setvar xtblm xtblz);恢复系统变量的原始值
        (princ)
)








本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-11-23 14:54 | 显示全部楼层
能为AUTOCAD增加功能
感谢你对CAD事业的支持
发表于 2015-11-23 15:18 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2015-11-23 15:19 编辑

难点在于要应用高数知识,我都忘了。lisp知识是次要的,如图,你格式化一下,就会发现少括号。
注意:一个分号,二个分号,三个分号,作用是不同的

本帖子中包含更多资源

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

x
发表于 2015-11-23 15:26 | 显示全部楼层
应该是多了一个回括,
你试试看:
  1. ;========arcL========
  2. ;已知同弧的弧长及弦长、弧长及弓高、弦长及弓高,求半径及画圆弧
  3. (defun C:arcL()
  4.         (setq xtblm '("cmdecho" "osmode")
  5.         xtblz (mapcar 'getvar xtblm) ;获取系统变量的原始值
  6.         )
  7.         (mapcar 'setvar xtblm '(0 33));对系统变量初始化
  8.         (command "_undo" "de") ;设置撤消命令的起点
  9.         ;设置选择画弧方式的关健字
  10.         ;L为按“弧长弦长”方式画圆弧(默认方式)
  11.         ;H为按“弧长弓高”方式画国弧
  12.         ;C为按 "弦长弓高"方式画圆弧
  13.         (initget "L H C")
  14.         (setq htbz(getkword "\n画弧方式〔L一弧长弦长/H一弧长弓高/C一弦长弓高〕<L>:"))
  15.         (if(= htbz nil)(setq htbz "L"))
  16.         (if(wcmatch htbz "L,H")(setq L(getreal "\n弧长:")))
  17.         (if(wcmatch htbz "L,C")(setq C(getdist "\n弦长:")))
  18.         (if(wcmatch htbz "H,C")(setq h(getdist "\n弓高:")))         
  19.         ;当“弧长弓高”方式画圆弧时,询问是劣弧还是优弧
  20.         ;将圆心角<l.5pi的圆弧都视为劣孤
  21.         (initget "Y N")
  22.         (if(= htbz "H")
  23.         (if(= (setq yh(getkword "\n 劣弧[Yes/No]<Y>:"))nil)
  24.                         (setq yh "Y")
  25.                 )
  26.         )
  27.         (setq eps le-10   ;设定迭代精度e=10^-10(即10的负10次方)
  28.         x 0
  29.         xi (* 1.0 pi);初值
  30.         )
  31.         (if (and (= htbz "H")(= yh "N"))(setq xi (* 2.0 pi)))        
  32.         (if(wcmatch htbz "L,C")(setq xi (* 2.0 pi)))
  33.         ;牛顿迭代法求圆心角
  34.         (while(>(abs(- xi x)) eps)
  35.         (setq x xi)
  36.         (if(= htbz "L")
  37.                         ;已知圆弧长度及弦长的迭代
  38.                         (setq fx(-(* 2.0 L (sin(/ x 2.0)))(* c x))
  39.                 dfx(-(* L (cos(/ x 2.0)))c)
  40.                         )
  41.                         (if(= htbz "H")
  42.                 ;已知圆弧长度及弓高的迭代
  43.                 (setq fx (- L (* L (cos(* 0.5 x)))(* h x))
  44.                                         dfx(-(* 0.5 L (sin(* 0.5 x)))h)
  45.                                 )
  46.                                 ;已知圆弦长度及弓高的迭代
  47.                                 (setq fx (-(* 2.0 h (sin(* 0.5 x)))(* -1.0 c (cos(* 0.5 x)))c)
  48.                                         dfx(-(* h (cos(* 0.5 x)))(* 0.5 c (sin(* 0.5 x))))
  49.                                        
  50.                                 )
  51.                         )
  52.                 )
  53.         (setq xL (- x (/ fx dfx)))
  54.         )
  55.         ;由圆心角计算出半径        
  56.         (if(wcmatch htbz "L,H")
  57.                 (setq r (/ L xL))
  58.                 (setq r (/ c 2.0 (sin(* 0.5 xL))))
  59.         )
  60.         (princ "\n解算出的半径R=")(princ(rtos r 2 10))
  61.         ;根据已知数据及解算出的圆心角、半径计算弓高
  62.         (if(= htbz "L")(setq h (* r (1-(cos(* 0.5 xL))))))
  63.         (if(= htbz "H")
  64.                 (progn
  65.                         (setq c(* 2.0 r (sin(*0.5 xL))))
  66.                         (if(<(abs(- xL (* 2.0 pi))) 1e-6)(setq c(* 2.0 r)))
  67.                 )
  68.         )
  69.         ;根据指定的点、已知及解算出的数据计算圆弧的中点、止点
  70.         (setq pt (getpoint "\n 起点:")
  71.                 pt3 (polar pt1 0 c)
  72.                 ptm (polar pt1 0 (* 0.5 c))
  73.                 pt2 (polar ptm(* 0.5 pi) h)
  74.         )
  75.         (setvar "osmode" 0);关闭对象捕捉功能
  76.         ;调用CAD已有的三点画圆弧命令画圆弧
  77.         (command "_arc" pt1 pt2 pt3)
  78.         (setvar "osmode" 33);设置对象捕捉(捕捉端点和交点)
  79.         (princ "\n止点方向:")
  80.         ;动态将固弧旋转到指定方向
  81.         (command "_rotate" (entlast) "" pt1 "r" pt1 pt3 pause)
  82. (command "_undo" "e") ;设置撤消命令的止点
  83. (mapcar 'setvar xtblm xtblz);恢复系统变量的原始值
  84. (princ)
  85. )

评分

参与人数 1明经币 +1 收起 理由
zgzzsn + 1

查看全部评分

 楼主| 发表于 2015-11-23 15:34 | 显示全部楼层
还是不能通过

命令: _appload 已成功加载 arcl2.lsp。
命令: ; 错误: 输入的字符串有缺陷
发表于 2015-11-23 16:14 | 显示全部楼层
zgzzsn 发表于 2015-11-23 15:34
还是不能通过

命令: _appload 已成功加载 arcl2.lsp。

问题点还蛮多
  1.                                         ;========arcL========
  2.                                         ;已知同弧的弧长及弦长、弧长及弓高、弦长及弓高,求半径及画圆弧
  3. (defun C:arcL ()
  4.   (setq        xtblm '("cmdecho" "osmode")
  5.         xtblz (mapcar 'getvar xtblm)        ;获取系统变量的原始值
  6.   )
  7.   (mapcar 'setvar xtblm '(0 33))        ;对系统变量初始化
  8.   (command  "_undo" "be")                ;设置撤消命令的起点
  9.                                         ;设置选择画弧方式的关健字
  10.                                         ;L为按“弧长弦长”方式画圆弧(默认方式)
  11.                                         ;H为按“弧长弓高”方式画国弧
  12.                                         ;C为按 "弦长弓高"方式画圆弧
  13.   (initget "L H C")
  14.   (setq        htbz (getkword
  15.                "\n画弧方式〔L一弧长弦长/H一弧长弓高/C一弦长弓高〕<L>:"
  16.              )
  17.   )
  18.   (if (= htbz nil)
  19.     (setq htbz "L")
  20.   )
  21.   (if (wcmatch htbz "L,H")
  22.     (setq L (getreal "\n弧长:"))
  23.   )
  24.   (if (wcmatch htbz "L,C")
  25.     (setq C (getdist "\n弦长:"))
  26.   )
  27.   (if (wcmatch htbz "H,C")
  28.     (setq h (getdist "\n弓高:"))
  29.   )
  30.                                         ;当“弧长弓高”方式画圆弧时,询问是劣弧还是优弧
  31.                                         ;将圆心角<l.5pi的圆弧都视为劣孤
  32.   (initget "Y N")
  33.   (if (= htbz "H")
  34.     (if        (= (setq yh (getkword "\n 劣弧[Yes/No]<Y>:")) nil)
  35.       (setq yh "Y")
  36.     )
  37.   )
  38.   (setq        eps le-10                        ;设定迭代精度e=10^-10(即10的负10次方)
  39.         x   0
  40.         xi  (* 1.0 pi)                        ;初值
  41.   )
  42.   (if (and (= htbz "H") (= yh "N"))
  43.     (setq xi (* 2.0 pi))
  44.   )
  45.   (if (wcmatch htbz "L,C")
  46.     (setq xi (* 2.0 pi))
  47.   )
  48.                                         ;牛顿迭代法求圆心角
  49.   (while (> (abs (- xi x)) eps)
  50.     (setq x xi)
  51.     (if        (= htbz "L")
  52.                                         ;已知圆弧长度及弦长的迭代
  53.       (setq fx        (- (* 2.0 L (sin (/ x 2.0))) (* c x))
  54.             dfx        (- (* L (cos (/ x 2.0))) c)
  55.       )
  56.     )
  57.     (if        (= htbz "H")
  58.                                         ;已知圆弧长度及弓高的迭代
  59.       (setq fx        (- L (* L (cos (* 0.5 x))) (* h x))
  60.             dfx        (- (* 0.5 L (sin (* 0.5 x))) h)
  61.       )
  62.     )
  63.     (if        (= htbz "C")
  64.                                         ;已知圆弦长度及弓高的迭代
  65.       (setq fx        (- (* 2.0 h (sin (* 0.5 x))) (* -1.0 c (cos (* 0.5 x))) c)
  66.             dfx        (- (* h (cos (* 0.5 x))) (* 0.5 c (sin (* 0.5 x))))

  67.       )
  68.     )
  69.     (setq xL (- x (/ fx dfx)))
  70.   )
  71.                                         ;由圆心角计算出半径        
  72.   (if (wcmatch htbz "L,H")
  73.     (setq r (/ L xL))
  74.     (setq r (/ c 2.0 (sin (* 0.5 xL))))
  75.   )
  76.   (princ "\n解算出的半径R=")
  77.   (princ (rtos r 2 10))
  78.                                         ;根据已知数据及解算出的圆心角、半径计算弓高
  79.   (if (= htbz "L")
  80.     (setq h (* r (1- (cos (* 0.5 xL)))))
  81.   )
  82.   (if (= htbz "H")
  83.     (progn
  84.       (setq c (* 2.0 r (sin (*0.5 xL))))
  85.       (if (< (abs (- xL (* 2.0 pi))) 1e-6)
  86.         (setq c (* 2.0 r))
  87.       )
  88.     )
  89.   )
  90.                                         ;根据指定的点、已知及解算出的数据计算圆弧的中点、止点
  91.   (setq        pt  (getpoint "\n 起点:")
  92.         pt3 (polar pt1 0 c)
  93.         ptm (polar pt1 0 (* 0.5 c))
  94.         pt2 (polar ptm (* 0.5 pi) h)
  95.   )
  96.   (setvar "osmode" 0)                        ;关闭对象捕捉功能
  97.                                         ;调用CAD已有的三点画圆弧命令画圆弧
  98.   (command "_arc" pt1 pt2 pt3)
  99.   (setvar "osmode" 33)                        ;设置对象捕捉(捕捉端点和交点)
  100.   (princ "\n止点方向:")
  101.                                         ;动态将固弧旋转到指定方向
  102.   (command "_rotate" (entlast) "" pt1 "r" pt1 pt3 pause)
  103.   (command  "_undo" "e")                ;设置撤消命令的止点
  104.   (mapcar 'setvar xtblm xtblz)                ;恢复系统变量的原始值
  105.   (princ)
  106. )
发表于 2015-11-23 19:57 | 显示全部楼层
本帖最后由 yshf 于 2015-11-23 22:33 编辑

对照检查一下:
  1. ;=====================   arc1  ==============================
  2. ;已知圆弧的弧长及弦长、弧长及弓高、弦长及弓高,求半径及画圆弧
  3. (defun c:arc1()
  4.     (setq xtblm '("cmdecho" "osmode")
  5.           xtblz  (mapcar 'getvar xtblm);获取系统变量的原始值
  6.     )
  7.     (mapcar 'setvar xtblm '(0 33));对系统变量初始化
  8.     (command "_undo" "be");设置撤消命令的起点
  9.     ;设置选择画弧方式的关键字
  10.     ;L-按“弧长弦长”方式画圆弧 (默认方式)
  11.     ;H-按“弧长弓高”方式画圆弧
  12.     ;C-按“弦长弓高”方式画圆弧
  13.     (initget "L H C")
  14.     (setq htbz (getkword "\n画弧方式[L-弧长弦长/H-弧长弓高/C-弦长弓高]<L>:"))
  15.     (if (= htbz nil)(setq htbz "L"))
  16.     (if (wcmatch htbz "L,H") (setq l (getreal "\n弧长:")))
  17.     (if (wcmatch htbz "L,C") (setq c (getdist "\n弦长:")))
  18.     (if (wcmatch htbz "H,C") (setq h (getdist "\n弓高:")))
  19.     ;当“弧长弓高”方式画圆弧时,询问是劣弧还是优弧
  20.     ;将圆心角<1.5π的圆弧都视为劣弧
  21.     (initget "Y N")
  22.     (if (= htbz "H")
  23.         (if (= (setq yh (getkWord "\n劣弧[Yes/No]<Y>:")) nil)
  24.             (setq yh "Y")
  25.         )
  26.     )
  27.     (setq eps 1e-10 ;设定迭代精度ε=10^-10(即10的负10次方)
  28.           x   0
  29.           x1  (* 1.0 pi) ;初值
  30.     )
  31.     (if (and (= htbz "H") (= yh "N")) (setq x1 (* 2.0 pi)))
  32.     (if (= htbz "L") (setq x1 (* 2.0 pi)))
  33.     ;(if (wcmatch htbz "L,C") (setq x1 (* 2.0 pi)))
  34.     ;牛顿迭代法求圆心角
  35.     (while (> (abs (- x1 x)) eps)
  36.        (setq x x1)
  37.        (if (= htbz "L" )
  38.            ;已知圆弧长度及弦长的迭代
  39.            (setq fx  (- (* 2.0 l (sin (/ x 2.0))) (* c x))
  40.                  dfx (- (*     l (cos (/ x 2.0))) c)
  41.            )
  42.            (if (= htbz "H")
  43.                ;已知圆弧长度及弓高的迭代
  44.                (setq fx  (- l (* l (cos (* 0.5 x))) (* h x))
  45.                      dfx (-   (* 0.5 l (sin (* 0.5 x))) h)
  46.                )
  47.                ;已知圆弦长及弓高的迭代
  48.                (setq fx  (- (* 2.0 h (sin (* 0.5 x)))  (* -1.0 c (cos (* 0.5 x))) c)
  49.                      dfx (- (*     h (cos (* 0.5 x)))  (*  0.5 c (sin (* 0.5 x))))
  50.                )
  51.            )
  52.        )
  53.        (setq x1 (- x (/ fx dfx)))
  54.     )
  55.     ;由圆心角计算出半径
  56.     (if (wcmatch htbz "L,H")
  57.         (setq r (/ l x1))
  58.         (setq r   (/ c 2.0 (sin (* 0.5 x1))))
  59.     )
  60.     (princ "\n解算出的半径R=")(princ (rtos r 2 10))
  61.     ;根据已知数据及解算出的圆心角、半径计算弓高
  62.     (if (= htbz "L") (setq h (* r (1- (cos (* 0.5 x1))))))
  63.     (if (= htbz "H")
  64.         (progn
  65.            (setq c (* 2.0 r (sin (* 0.5 x1))))
  66.            (if (< (abs (- x1 (* 2.0 pi))) 1e-6) (setq c (* 2.0 r)))
  67.         )
  68.     )
  69.     ;根据指定的点、已知及解算出的数据计算圆弧的中点、止点
  70.     (setq pt1 (getpoint "\n起点:")
  71.           pt3  (polar pt1 0 c)
  72.           ptm  (polar pt1 0 (* 0.5 c))
  73.           pt2  (polar ptm (* 0.5 pi) h)
  74.     )
  75.     (setvar "osmode" 0);关闭对象捕捉功能
  76.     ;调用CAD已有的三点画圆弧命令画圆弧
  77.     (command "_arc" pt1 pt2 pt3)
  78.     (setvar "osmode" 33);设置对象捕捉(捕捉端点和交点)
  79.     (princ "\n止点方向:")
  80.     ;动态将圆弧旋转到指定方向
  81.     (command "_rotate" (entlast) "" pt1 "r" pt1 pt3 pause)
  82.     (command "_undo" "e");设置撤消命令的止点
  83.     (mapcar 'setvar xtblm xtblz);恢复系统变量的原始值
  84.     (princ)
  85. )

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 赞一个!

查看全部评分

发表于 2015-11-23 21:04 | 显示全部楼层
yshf 发表于 2015-11-23 19:57
对照检查一下:

这个计算有误吧:
弦长:20
弓高:5
解算出的半径R=1.1797576798E+17

半径应是R12.5才对
发表于 2015-11-23 22:36 | 显示全部楼层
本帖最后由 yshf 于 2015-11-23 22:44 编辑

将:
  1. ;(if (= htbz "L") (setq x1 (* 2.0 pi)))
  2.     (if (wcmatch htbz "L,C") (setq x1 (* 2.0 pi)))
改为:
  1. (if (= htbz "L") (setq x1 (* 2.0 pi)))
  2.     ;(if (wcmatch htbz "L,C") (setq x1 (* 2.0 pi)))
试一试。

命令: arc1
画弧方式[L-弧长弦长/H-弧长弓高/C-弦长弓高]<L>:c
弦长:20
弓高:5
初值=3.141592653589793
解算出的半径R=12.5000000000
起点:
止点方向:
 楼主| 发表于 2015-11-24 08:35 | 显示全部楼层
本帖最后由 zgzzsn 于 2015-11-24 08:36 编辑

可算遇到高手了。而且忙到深更半夜。
谢谢楼上各位帮忙。
请把您最后调试成功的lsp传上来,好吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 23:59 , Processed in 0.572302 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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