找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 866|回复: 9

[求助] [求助]:圆弧端点相交的切线程序

[复制链接]
发表于 2006-2-13 23:06:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
功能:分别过已知圆弧两端点作其切线,并使这两根切线相交于一点。
操作:只用鼠标点击已知圆弧两端点及其圆心就可以得出上述功能的图形。
其实,我们可以用cad里面的line ,rotate,fllet(令r=0)命令句就可以得出上述图形,但是本人一天经常做很多次这样的操作,比较繁琐。各位高手能否帮忙用lisp 编写出来啊?谢谢了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-2-13 23:20:16 | 显示全部楼层
批量操作,以后就可以经常休息了!
  1. [FONT=courier new](load "xyp_lib.vlx")                        ;版本 V.20060211(2064)
  2. ;|下载和加载通用函数(可在签名栏直接下载后放到搜索路径下)
  3. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  4. ★1·在acad.lsp中增加(load"xyp_lib.vlx")
  5. ■2·在每个程序内增加(load"xyp_lib.vlx")
  6. ■3·在command下,输入(load"xyp_lib.vlx")
  7. ■4·在菜单.mnl中增加(load"xyp_lib.vlx")
  8. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  9. [COLOR=red] ★通用函数下载地址:[/COLOR]
  10. [url]http://www.xdcad.net/forum/attachment.php?s=&postid=1606661[/url]
  11. |;

  12. ;;;圆弧端点相交切线
  13. (defun c:test ()
  14.   (CMDLA0)
  15.   (setvar "osmode" 0)
  16.   (setq        ss (ssget '((0 . "ARC")))
  17.         i  -1
  18.   )
  19.   (mkla "切线" 3)
  20.   (while (setq s1 (ssname ss (setq i (1+ i))))
  21.     (setq ps  (xyp-get-CurveStartPoint s1);圆弧起点
  22.           pe  (xyp-get-CurveEndPoint s1);圆弧终点
  23.           ps1 (xyp-get-QiexianAtPoint s1 ps 1000);圆弧起点处切线上点
  24.           pe1 (xyp-get-QiexianAtPoint s1 pe 1000);圆弧终点处切线上点
  25.           pt  (inters ps ps1 pe pe1 nil);以上四点连线延长线之交点
  26.     )
  27.     (if        pt
  28.       (progn
  29.         (command "LINE" ps pt "")
  30.         (command "LINE" pe pt "")
  31.       )
  32.     )
  33.   )
  34.   (CMDLA1)
  35. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-14 12:01:45 | 显示全部楼层
[php]
(defun c:test ()
  (setvar "cmdecho" 0)
  (setq os (getvar "osmode"))
  (command "undo" "be")
  (setvar "osmode" 0)
  (princ "\n选择圆弧...")
  (setq ss (ssget '((0 . "ARC"))))
  (setq i 0 k 0)
  (repeat (sslength ss)
    (setq obj (vlax-ename->vla-object (ssname ss i)))
    (setq r              (vla-get-radius obj)
          startpoint  (vlax-safearray->list
                        (vlax-variant-value (vla-get-startpoint obj))
                      )
          endpoint    (vlax-safearray->list
                        (vlax-variant-value (vla-get-endpoint obj))
                      )
          centerpoint (vlax-safearray->list
                        (vlax-variant-value (vla-get-center obj))
                      )
    )
    (setq midpoint (mapcar '(lambda (a b) (/ (+ a b) 2))
                           startpoint
                           endpoint
                   )
    )
    (if        (not (equal midpoint centerpoint 0.00001))
      (progn
      (setq len        (distance centerpoint midpoint)
            ang        (angle centerpoint midpoint)
      )
   
    (setq point (polar centerpoint ang (/ (* r r) len)))
    (command "LINE" startpoint point endpoint "")
    )
    (setq k (1+ k))
    )
    (setq i (1+ i))
  )
  (princ (strcat "\n有" (rtos k) "个半圆形的圆弧无法完成操作!"))
  (setvar "osmode" os)
  (command "undo" "e")
  (setvar "cmdecho" 1)
  (princ)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-14 12:49:06 | 显示全部楼层
最初由 ljpnb 发布


应避免选择集为空时的出错(属于sslength函数的bug),没有半圆时可以不出现提示,修改如下供参考:
[php]
(defun c:test ()
  (setvar "cmdecho" 0)
  (setq        os (getvar "osmode")
        i  0
        k  0
  )
  (command "undo" "be")
  (setvar "osmode" 0)
  (princ "\n选择圆弧...")
  (if (setq ss (ssget '((0 . "ARC"))))
    (repeat (sslength ss)
      (setq obj                (vlax-ename->vla-object (ssname ss i))
            r                (vla-get-radius obj)
            startpoint        (vlax-safearray->list
                          (vlax-variant-value (vla-get-startpoint obj))
                        )
            endpoint        (vlax-safearray->list
                          (vlax-variant-value (vla-get-endpoint obj))
                        )
            centerpoint        (vlax-safearray->list
                          (vlax-variant-value (vla-get-center obj))
                        )
            midpoint        (mapcar        '(lambda (a b) (/ (+ a b) 2))
                                startpoint
                                endpoint
                        )
      )
      (if (not (equal midpoint centerpoint 0.00001))
        (progn
          (setq        len   (distance centerpoint midpoint)
                ang   (angle centerpoint midpoint)
                point (polar centerpoint ang (/ (* r r) len))
          )
          (command "LINE" startpoint point endpoint "")
        )
        (setq k (1+ k))
      )
      (setq i (1+ i))
    )
  )
  (if (> k 0)
    (princ
      (strcat "\n有" (rtos k 2 0) "个半圆形的圆弧无法完成操作!")
    )
  )
  (setvar "osmode" os)
  (command "undo" "e")
  (setvar "cmdecho" 1)
  (princ)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-14 13:17:12 | 显示全部楼层
多谢xyp1964 版大的指点,记下了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-15 13:21:05 | 显示全部楼层
我正好用的上.多谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-17 00:06:30 | 显示全部楼层
加载以后出现错误: no function definition: VLAX-ENAME->VLA-OBJECT
请问如何更正?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-17 07:48:52 | 显示全部楼层
把这句(vl-load-com)加到程序前面
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-17 19:37:45 | 显示全部楼层
非常感谢各位的指点,还想请教一下,我是一个新手,如何学好lisp语言阿?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-2-18 20:57:27 | 显示全部楼层

  1. (defun c:tt (/ ss ssl e sp ep p1 p2 pt sp1 ep1)
  2.   (if (setq ss (ssget '((0 . "arc"))))
  3.     (progn
  4.       (setq ssl        (sslength ss)
  5.             i        -1
  6.       )
  7.       (repeat ssl
  8.         (setq e          (ssname ss (setq i (1+ i)))
  9.               sp  (vlax-curve-getstartpoint e)
  10.               ep  (vlax-curve-getendpoint e)
  11.               p1  (vlax-curve-getfirstderiv e (vlax-curve-getstartparam e))
  12.               p2  (vlax-curve-getfirstderiv e (vlax-curve-getendparam e))
  13.               sp1 (mapcar '+ sp p1)
  14.               ep1 (mapcar '+ ep p2)
  15.               pt  (inters sp sp1 ep ep1 nil)
  16.         )
  17.         (if pt
  18.           (command ".line" "_none" sp "_none" pt "_none" ep "")
  19.         )
  20.       )
  21.     )
  22.   )
  23.   (princ)
  24. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-29 02:54 , Processed in 0.368972 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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