328302216 发表于 2011-11-21 11:26:33

高手帮忙把这个小问题解决一下!不会的也顶一下贴,到时候发程序源码给你们绝对有用!

(setq ss7 '((907.98 571.959 0.0) (907.98 -226.468 0.0) (986.544 -226.468 0.0) (1818.41 -226.468 0.0)
(1818.41 -226.468 0.0) (1818.41 479.655 0.0) (1818.41 479.655 0.0) (672.285 479.655 0.0))
)
(setq ss8 (length ss7))
(setq q 0 p 0 d 0 b 0)
(repeat ss8 ;循环ss8等于ss7列表中的元素个数
    (setq ss9 (nth q ss7))
    (repeat ss8
      (setq ss10 (nth p ss7))
      (if (= ss9 ss10)
(setq d (+ 1 d))
) ;if
      (setq p (+ 1 p))
      ) ;repeat
    (if (/= d 2)
      (command "CIRCLE" ss9 50) ;
      )
    (setq q (+ 1 q))
    ) ;repeat
(princ)
)
为什么执行结果是用所有的坐标值都当圆心画出圆了
我想用ss7中单一的(没有与其相同)的坐标画圆而已要怎么改呢?
d 的值怎么都是等于1?

dunkel 发表于 2011-11-21 12:55:38

本帖最后由 dunkel 于 2011-11-21 12:58 编辑

(setq ss7 '((907.98 571.959 0.0)
      (907.98 -226.468 0.0)
      (986.544 -226.468 0.0)
      (1818.41 -226.468 0.0)
      (1818.41 -226.468 0.0)
      (1818.41 479.655 0.0)
      (1818.41 479.655 0.0)
      (672.285 479.655 0.0)
   )
)
(setq ss8 (length ss7))
(setq q0
      p0
      d0
      b0
)
(repeatss8      ;循环ss8等于ss7列表中的元素个数
(setq ss9 (nth q ss7))
(repeat (- ss8 q)      ;* 向后比较的话,越后面的数据比较次数递减
    (setq ss10 (nth p ss7))
    (if(< (distance ss9 ss10) 1e-8);* (= ss9 ss10) 这样的比较对浮点数不妥
      (setq d (+ 1 d))
    )          ;if
    (setq p (+ 1 p))
)          ;repeat
(if (< d 2)      ;* 多于 1 个的即为有重复数据,暂时不绘制
    (command "CIRCLE" ss9 50)    ;
)
(setqq (+ 1 q)
p q
d 0
)          ;* 每个数据的查询,p 和 d 都须重置
)          ;repeat
(princ)

328302216 发表于 2011-11-22 12:08:01

本帖最后由 328302216 于 2011-11-22 17:04 编辑

dunkel 发表于 2011-11-21 12:55 http://bbs.mjtd.com/static/image/common/back.gif


高手好像还是达不到最理想的目标我把代码发上来你再帮我看看可以吗?
(defun c:qt33 ()
(setq ss (ssget))            
(setq i 0)
(setq ss7 '())
(repeat (sslength ss)                     
    (setq ss1 (ssname ss i))               
    (setq ss2 (entget ss1))               
    (setq ss3 (cdr (assoc 0 ss2)))   
    (setq ss4 (cdr (assoc 8 ss2)))      
    (if      (and (= ss3 "LINE") (= ss4 "0"))
                                    
      (progn
      (setq ss5 (cdr (assoc 10 ss2)))
      (setq ss6 (cdr (assoc 11 ss2)))
      )
    )
    (setq ss6_1 (list ss5 ss6))            
    (setq ss7 (append ss6_1 ss7))   
    (setq ss6_1 nil)                     
    (setq i (+ 1 i))
)
(setq ss8 (length ss7))
(setq      q 0
      p 0
      d 0
      b 0
)
(repeat ss8                           
    (setq ss9 (nth q ss7))
    (repeat (- ss8 q)                     
      (setq ss10 (nth p ss7))
      (if (< (distance ss9 ss10) 1e-8)      
      (setq d (+ 1 d))
      )                                        ;if
      (setq p (+ 1 p))
    )                                        ;repeat
    (if      (/= d 2)                     
      (command "CIRCLE" ss9 50)                ;
    )
    (setq q (+ 1 q)
          p q
          d 0
    )                                       
)                                        ;repeat
(princ)
)

328302216 发表于 2011-11-22 12:16:22

如这图所示的结果!

328302216 发表于 2011-11-22 12:18:50

本帖最后由 328302216 于 2011-11-22 17:10 编辑

顺便我把我原来自己编的也发上来!

(defun c:qt3 ()
(setq ss (ssget))   
(setq i 0)
(setq ss7 '())
(repeat (sslength ss)   
    (setq ss1 (ssname ss i))
    (setq ss2 (entget ss1))   
    (setq ss3 (cdr (assoc 0 ss2)))
    (setq ss4 (cdr (assoc 8 ss2)))
    (if(and (= ss3 "LINE") (= ss4 "06"))
            (progn
(setq ss5 (cdr (assoc 10 ss2)))
(setq ss6 (cdr (assoc 11 ss2)))
      )
    )
    (setq ss6_1 (list ss5 ss6))   
    (setq ss7 (append ss6_1 ss7))
    (setq ss6_1 nil)   
    (setq i (+ 1 i))
)
(setq ss8 (length ss7))
)
(princ )
)

328302216 发表于 2011-11-22 12:20:42

我原来整这个在刚好相加的地方会画出两个重叠的圆!你的这种比我的那种少画了一个圆,就是在两条线刚好连接的地方少画了一个!!!

dunkel 发表于 2011-11-22 13:00:39

你的意思是只要有重复的,就一个也不绘制?即顶楼的那组坐标只绘制 4 个圆?上面那个动画的图示,只绘制 6 个圆?这样的话,就需要每次都全表进行比较了。; 前面不变
(repeat ss8                              ;循环ss8等于ss7列表中的元素个数
    (setq ss9 (nth q ss7))
    (repeat ss8; 每个元素都要比较下(- ss8 q)
      (setq ss10 (nth p ss7))
      (if (< (distance ss9 ss10) 1e-8)      ;* (= ss9 ss10) 这样的比较对浮点数不妥
      (setq d (+ 1 d))
      )                                        ;if
      (setq p (+ 1 p))
    )                                        ;repeat
    (if      (/= d 2)                        ;* 多于 1 个的即为有重复数据,暂时不绘制
      (command "CIRCLE" ss9 50)                ;
    )
    (setq q (+ 1 q)
          p 0    ;* 从头开始比较
          d 0
    )                                        ;* 每个数据的查询,p 和 d 都须重置
)                                        ;repeat
(princ)

328302216 发表于 2011-11-22 14:14:40

dunkel 发表于 2011-11-22 13:00 static/image/common/back.gif
你的意思是只要有重复的,就一个也不绘制?即顶楼的那组坐标只绘制 4 个圆?上面那个动画的图示,只绘制 6...

OK了呵呵谢谢前辈的指导!

mokson 发表于 2011-11-22 14:30:20

看来你们都是高手呀,我真是感觉到望尘莫及了.

328302216 发表于 2011-11-22 15:53:26

我菜得很呢,我是新手 CAD都还不怎么熟,现在两门同时学,一边学CAD又学lisp,而且学了两个多月了,现在感觉还是什么都不会……
页: [1] 2
查看完整版本: 高手帮忙把这个小问题解决一下!不会的也顶一下贴,到时候发程序源码给你们绝对有用!