找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 845|回复: 1

[求助] [求助]:这个是lisp出错了...

[复制链接]
发表于 2008-10-24 23:18:42 | 显示全部楼层 |阅读模式

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

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

×

  1.   [FONT=courier new]
  2. ;;;;;;测试程序
  3. (defun c:ccc(/ a a2 tf)
  4.   (setq a1 '(670.759 584.45 0.0))
  5.   (setq a2 (list '(560.248 748.043 0.0) '(812.045 748.043 0.0) '(812.045 503.352 0.0) '(560.248 503.352 0.0)))
  6.   (setq tf (ER_point-in-poly a1 a2))
  7.   (princ "\n答案:")
  8.   (princ tf)
  9.   (princ)
  10.   )

  11. (defun ER_point-in-poly(xpt xdb / fhz mxb myb n i mx my nn p1 p2 p12 pxy a_line xpt1)
  12.     (vl-load-com)
  13.     (setq fhz 0
  14.           mxb nil
  15.           myb nil
  16.           n   (length xdb)
  17.           i   0
  18.           xdb (append xdb (list (car xdb)))
  19.     )
  20.     ;;(setq xpt1 (vlax-make-safearray vlax-vbdouble '(0 . 2)))
  21.         ;;(setq xpt1 (vlax-safearray-fill xpt1 xpt))

  22.   
  23. ; 判断点xpt是否在多边形上
  24.     (while(< i n)
  25.         (setq acadobject   (vlax-get-acad-object)
  26.               acadDocument (vla-get-activeDocument acadobject)
  27.               mspace           (vla-get-modelspace acaddocument)
  28.         )
  29.         (setq p1 (vlax-make-safearray vlax-vbdouble '(0 . 2)))
  30.         (setq p1 (vlax-safearray-fill p1 (nth i xdb)))
  31.         (setq p2 (vlax-make-safearray vlax-vbdouble '(0 . 2)))
  32.         (setq p2 (vlax-safearray-fill p2 (nth (1+ i) xdb)))
  33.         (setq a_line (vla-addline mspace p1 p2))

  34.         (vla-put-Color a_line 9)
  35.         ;;(setq p1 (nth i xdb) p2 (nth (1+ i) xdb))
  36.         ;;(command "line" p1 p2 "" "chprop" (entlast) "" "c" 9 "")
  37.         ;;;(princ "\nhhhhhhhhhhhhhhhh")(princ a_line )
  38.         (setq p12 (vlax-curve-getclosestpointto a_line xpt1));;;;;这里出现error: bad argument type: 2D/3D point

  39.                
  40.         (entdel a_line)
  41.         ;若xpt至某一边的距离为零,则xpt在多边形上,因计算误差,设10的-6次方为与零的比较误差
  42.         (if (equal (distance xpt1 p12) 0.0 1e-6) (setq fhz 1 i n))
  43.         (setq i (1+ i))
  44.     )
  45. (if (/= fhz 1)
  46.     ; 判断点xpt是否在多边形内
  47.         (progn
  48.         (foreach p12 xdb
  49.            (setq mxb (append mxb (list (abs (- (car xpt1) (car p12)))))
  50.                myb (append myb (list (abs (- (cadr xpt1) (cadr p12)))))
  51.            )
  52.         )
  53.            (setq pxy (mapcar '+ xpt1 (list (* 2.0 (apply 'max mxb)) (apply 'min myb)))
  54.           i 0   nn 0
  55.            )
  56.            (repeat n
  57.            (if (inters xpt1 pxy (nth i xdb) (nth (1+ i) xdb)) (setq nn (1+ nn)))
  58.            (setq i (1+ i))
  59.            )
  60.            (if (and (> nn 0) (/= nn (* (fix (/ nn 2.0)) 2.0))) (setq fhz 2))
  61.         )
  62.     )
  63.     (setq fhz fhz)
  64. )
  65.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2008-11-2 11:34:57 | 显示全部楼层
;;;;;;测试程序
(defun c:ccc( / a a2 tf)
  (vl-load-com)
  (setq acadobject (vlax-get-acad-object)
              acadDocument (vla-get-activeDocument acadobject)
              mspace           (vla-get-modelspace acaddocument)
        )
  (setq a1 '(670.759 584.45 0.0))
  (setq a2 (list '(560.248 748.043 0.0) '(812.045 748.043 0.0) '(812.045 503.352 0.0) '(560.248 503.352 0.0)))
  (setq tf (ER_point-in-poly a1 a2))
  (princ "\n答案:")
  (princ tf)
  (princ)
) ;enddefun

(defun ER_point-in-poly (xpt xdb / fhz mxb myb n i mx my nn p1 p2 p12 pxy a_line xpt1)   
  (setq fhz 0 mxb nil myb nil n (length xdb) i 0 xdb (append xdb (list (car xdb))))   
  ; 判断点xpt是否在多边形上
    (while (< i n)        
        (setq p1 (vlax-make-safearray vlax-vbdouble '(0 . 2)))
        (setq p1 (vlax-safearray-fill p1 (nth i xdb)))
        (setq p2 (vlax-make-safearray vlax-vbdouble '(0 . 2)))
        (setq p2 (vlax-safearray-fill p2 (nth (1+ i) xdb)))
        (setq a_line (vla-addline mspace p1 p2))
        (vla-put-Color a_line acred)
        ;;(setq p1 (nth i xdb) p2 (nth (1+ i) xdb))
        ;;(command "line" p1 p2 "" "chprop" (entlast) "" "c" 9 "")
        ;;;(princ "\nhhhhhhhhhhhhhhhh")(princ a_line )
        (setq p12 (vlax-curve-getclosestpointto a_line xpt))        
        ;该处错误
        ;(entdel a_line)
        ;如果要删除对象用下列语句
        ;(vla-delete a_line)
        ;若xpt至某一边的距离为零,则xpt在多边形上,因计算误差,设10的-6次方为与零的比较误差
        (if (equal (distance xpt p12) 0.0 1e-6) (setq fhz 1 i n))
        (setq i (1+ i))
    ) ;endwhile (< i n)
    (if (/= fhz 1)
    ; 判断点xpt是否在多边形内
        (progn
          (foreach p12 xdb (setq mxb (append mxb (list (abs (- (car xpt) (car p12)))))
               myb (append myb (list (abs (- (cadr xpt) (cadr p12)))))
           )
        )
           (setq pxy (mapcar '+ xpt (list (* 2.0 (apply 'max mxb)) (apply 'min myb)))
          i 0   nn 0
           )
           (repeat n
           (if (inters xpt pxy (nth i xdb) (nth (1+ i) xdb)) (setq nn (1+ nn)))
           (setq i (1+ i))
           )
           (if (and (> nn 0) (/= nn (* (fix (/ nn 2.0)) 2.0))) (setq fhz 2))
        )
    )
    (setq fhz fhz)
) ;enddefun
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 14:40 , Processed in 0.184982 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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