找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 697|回复: 4

[LISP函数]:帮忙看看该代码是否有bug

[复制链接]
发表于 2003-8-31 20:43:21 | 显示全部楼层 |阅读模式

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

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

×
直线与圆的交点
直线与圆弧的交点
帮忙看看该代码是否有bug,我实在很胡涂的了!


  1.   [FONT=courier new]
  2. ;直线与圆的交点
  3. (defun chengs_getpoint_inters_ln2c ( p11 p12 c1 / ce1 p0 p1 p2 angr r w w1 w2 w3 result)
  4. ;c1:圆;p11、p12:直线端点;ce1:圆心;p0:ce1到ln1的垂足
  5. ;;;a1=ce1+angr1+ angr2+r
  6.   (if (listp c1) (setq c1 (car c1)))
  7.   (setq
  8.            ce1 (cdr (assoc 10 (entget c1)))
  9.            angr (angle p11 p12)
  10.            r (cdr (assoc 40 (entget c1)))
  11.            p0 (chengs_getpoint_per ce1 p11 p12)
  12.            w (distance ce1 p0)
  13.            w1 (distance ce1 p11)
  14.            w2 (distance ce1 p12)
  15.   )
  16.   (if (equal w r 0.0000001) (setq w r))
  17.   (if (equal w1 r 0.0000001) (setq w1 r))
  18.   (if (equal w2 r 0.0000001) (setq w2 r))
  19.   (if (< w r)
  20.     (progn
  21.       (setq w3 (sqrt (- (* r r) (* w w))))
  22.       (if (>= w1 r) (setq p1 (polar p0 angr (* w3 -1))) )
  23.       (if (>= w2 r) (setq p2 (polar p0 angr w3)) )
  24.     )
  25.     (progn
  26.       (if (= w r) (setq p1 p0 p2 nil) )
  27.       (if (> w r) (setq p1 nil p2 nil) )
  28.     )
  29.   );交点p1 p2

  30.   ;判断p1 p2是否在线上
  31.   (if p1
  32.     (progn
  33.       (setq w1 (distance p1 p11)
  34.                w2 (distance p1 p12)
  35.                w (distance p11 p12)
  36.       )
  37.       (if  (> (+ w1 w2 -0.0000001) w) (setq p1 nil))
  38.     )
  39.   );endif p1
  40.   (if p2
  41.     (progn
  42.       (setq w1 (distance p2 p11)
  43.                w2 (distance p2 p12)
  44.                w (distance p11 p12)
  45.       )
  46.       (if  (> (+ w1 w2 -0.0000001) w) (setq p2 nil))
  47.     )
  48.   );endif p2
  49.   (if p1 (setq result (list p1)))
  50.   (if p2 (setq result (list p2)))
  51.   (if (and p1 p2) (setq result (list p1 p2)))
  52.   result
  53. );endfun chengs_getpoint_inters_ln2c

  54. ;;直线与圆弧的交点
  55. (defun chengs_getpoint_inters_ln2a ( p11 p12 a1  / ce1 p1 p2 p3 p4 p1_ p2_ angr1 angr2 r result)
  56. ;;p11 p12直线端点

  57.   (if (listp a1) (setq a1 (car a1)))
  58.   (setq
  59.            ce1 (cdr (assoc 10 (entget a1))) ;圆心
  60.            r (cdr (assoc 40 (entget a1))) ;弧半径
  61.            angr1 (cdr (assoc 50 (entget a1))) ;弧角度1
  62.            angr2 (cdr (assoc 51 (entget a1))) ;弧角度2
  63.            p3 (polar ce1 angr1 r) ;弧点1
  64.            p4 (polar ce1 angr2 r) ;弧点2
  65.   )

  66.   (setq p1 (chengs_getpoint_inters_ln2c p11 p12 a1)
  67.            p2 (cadr p1)
  68.            p1 (car p1)
  69.   );圆的交点p1 p2

  70.   ;判断是否优弧(大弧)
  71.   (setq r (- angr2 angr1) )
  72.   (if (< r 0.0) (setq r (+ (* 2 pi) r)))  ;弧端点连线角度

  73.   (if (or (equal p1 p3 0.00001) (equal p1 p4 0.00001)) (setq p1_ p1 p1 nil)) ;p1等于弧端点
  74.   (if (or (equal p2 p3 0.00001) (equal p2 p4 0.00001)) (setq p2_ p2 p2 nil)) ;p2等于弧端点
  75.   
  76.   (cond
  77.     ( (> r pi)
  78.       (progn  ;优弧两端点与ce1->p1有交点,则p1不在弧上
  79.         (if p1 (if (inters p3 p4 ce1 p1) (setq p1 nil)))
  80.         (if p2 (if (inters p3 p4 ce1 p2) (setq p2 nil)))
  81.       )
  82.     );endcond >180
  83.     ( (< r pi)
  84.       (progn  ;劣弧两端点与ce1->p1没有交点,则p1不在弧上
  85.         (if p1 (if (not (inters p3 p4 ce1 p1)) (setq p1 nil)))
  86.         (if p2 (if (not (inters p3 p4 ce1 p2)) (setq p2 nil)))
  87.       )
  88.     );endcond <180
  89.     ( (= r pi)
  90.       (progn  ;如果ce1->p1角度不在angr1 angr2之间,则p1不在弧上
  91.         (if (> angr2 angr1)
  92.           (progn
  93.             (setq angr (angle ce1 p1))
  94.             (if (and (> angr angr1) (< angr angr2))  ; 如果angr=angr1,angr2,则p1等于弧端点,即p1_
  95.               (princ)
  96.               (setq p1 nil)
  97.             )
  98.             (setq angr (angle ce1 p2))
  99.             (if (and (> angr angr1) (< angr angr2))  ;angr=angr1,angr2,则p2等于弧端点,即p2_
  100.               (princ)
  101.               (setq p2 nil)
  102.             )
  103.           )
  104.           (progn  ;angr1 > angr2 如果angr=angr1,angr2,则p1等于弧端点,即p1_
  105.             (if p1 (setq angr (angle ce1 p1) ))
  106.             (if (and (< angr angr1) (> angr angr2))  
  107.               (setq p1 nil)
  108.             )
  109.             (if p2 (setq angr (angle ce1 p2)))
  110.             (if (and (< angr angr1) (> angr angr2))
  111.               (setq p2 nil)
  112.             )
  113.           )
  114.         );endif angr2>angr1
  115.       )
  116.     );endcond =180
  117.   );endcond r

  118.   (if p1_ (setq p1 p1_))
  119.   (if p2_ (setq p2 p2_))
  120.   (if p1 (setq result (list p1)))
  121.   (if p2 (setq result (list p2)))
  122.   (if (and p1 p2) (setq result (list p1 p2)))

  123.   result
  124. );endfun chengs_getpoint_inters_ln2a
  125.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

发表于 2003-8-31 22:52:39 | 显示全部楼层
同意楼上说法,给一个例子

  1. ;;明经通道LISP示例-求两曲线交点
  2. (defun c:GIP ()
  3.   (c:getinterpoint)
  4. )
  5. (defun C:GetInterPoint (/        ent1     ent2     ent_1    ent_2
  6.                         ax_ent_1 ax_ent_2 intpoints         i
  7.                         j        k        disp
  8.                        )
  9.   (vl-load-com)
  10.   (setq ent1 (entsel "\n选择第一条曲线:"))
  11.   (setq ent2 (entsel "\n选择第二条曲线:"))
  12.   (setq ent_1 (car ent1)
  13.         ent_2 (car ent2)
  14.   )
  15.   (setq ax_ent_1 (vlax-ename->vla-object ent_1)
  16.         ax_ent_2 (vlax-ename->vla-object ent_2)
  17.   )
  18.   (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
  19.   (setq intpoints (vlax-variant-value intpoints))
  20.   (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
  21.     (progn
  22.       (setq i 0)
  23.       (setq j 0)
  24.       (setq k 0)
  25.       (setq disp "")
  26.       (repeat
  27.         (/ (+ 1
  28.               (- (vlax-safearray-get-u-bound intpoints 1)
  29.                  (vlax-safearray-get-l-bound intpoints 1)
  30.               )
  31.            )
  32.            3
  33.         )
  34.          (setq
  35.            disp (strcat
  36.                   disp
  37.                   "\n交点"
  38.                   (itoa (+ k 1))
  39.                   "坐标为:"
  40.                   (rtos (vlax-safearray-get-element intpoints j))
  41.                   " , "
  42.                   (rtos (vlax-safearray-get-element intpoints (+ 1 j)))
  43.                   " , "
  44.                   (rtos (vlax-safearray-get-element intpoints (+ 2 j)))
  45.                 )
  46.          )
  47.          (setq i (+ 2 i)
  48.                j (+ 3 j)
  49.                k (+ 1 k)
  50.          )
  51.       )
  52.       (princ disp)
  53.     )
  54.     (princ "\n两曲线没有交点")
  55.   )
  56.   (princ "\n明经通道LISP示例-求两曲线交点")
  57.   (princ)
  58. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-9-1 14:15:19 | 显示全部楼层
用vl 函数的确好,问题是:我到现在还不知道如何把(defun C:GetInterPoint)编译成R14下可以运行的文件,   .vlx?2000还差不多,R14运行不了。
请问如何将其编译成.arx或其他R14可执行文件?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 17:43 , Processed in 0.167130 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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