明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2370|回复: 17

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

  [复制链接]
发表于 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?
发表于 2011-11-21 12:55:38 | 显示全部楼层
本帖最后由 dunkel 于 2011-11-21 12:58 编辑
  1. (setq ss7 '((907.98 571.959 0.0)
  2.       (907.98 -226.468 0.0)
  3.       (986.544 -226.468 0.0)
  4.       (1818.41 -226.468 0.0)
  5.       (1818.41 -226.468 0.0)
  6.       (1818.41 479.655 0.0)
  7.       (1818.41 479.655 0.0)
  8.       (672.285 479.655 0.0)
  9.      )
  10. )
  11. (setq ss8 (length ss7))
  12. (setq q  0
  13.       p  0
  14.       d  0
  15.       b  0
  16. )
  17. (repeat  ss8        ;循环ss8等于ss7列表中的元素个数
  18.   (setq ss9 (nth q ss7))
  19.   (repeat (- ss8 q)      ;* 向后比较的话,越后面的数据比较次数递减
  20.     (setq ss10 (nth p ss7))
  21.     (if  (< (distance ss9 ss10) 1e-8)  ;* (= ss9 ss10) 这样的比较对浮点数不妥
  22.       (setq d (+ 1 d))
  23.     )          ;if
  24.     (setq p (+ 1 p))
  25.   )          ;repeat
  26.   (if (< d 2)        ;* 多于 1 个的即为有重复数据,暂时不绘制
  27.     (command "CIRCLE" ss9 50)    ;
  28.   )
  29.   (setq  q (+ 1 q)
  30.   p q
  31.   d 0
  32.   )          ;* 每个数据的查询,p 和 d 都须重置
  33. )          ;repeat
  34. (princ)

 楼主| 发表于 2011-11-22 12:08:01 | 显示全部楼层
本帖最后由 328302216 于 2011-11-22 17:04 编辑
dunkel 发表于 2011-11-21 12:55


高手  好像还是达不到最理想的目标我把代码发上来你再帮我看看可以吗?

  1. (defun c:qt33 ()
  2.   (setq ss (ssget))              
  3.   (setq i 0)
  4.   (setq ss7 '())
  5.   (repeat (sslength ss)                       
  6.     (setq ss1 (ssname ss i))               
  7.     (setq ss2 (entget ss1))               
  8.     (setq ss3 (cdr (assoc 0 ss2)))   
  9.     (setq ss4 (cdr (assoc 8 ss2)))      
  10.     (if        (and (= ss3 "LINE") (= ss4 "0"))
  11.                                     
  12.       (progn
  13.         (setq ss5 (cdr (assoc 10 ss2)))
  14.         (setq ss6 (cdr (assoc 11 ss2)))
  15.       )
  16.     )
  17.     (setq ss6_1 (list ss5 ss6))              
  18.     (setq ss7 (append ss6_1 ss7))   
  19.     (setq ss6_1 nil)                       
  20.     (setq i (+ 1 i))
  21.   )
  22.   (setq ss8 (length ss7))
  23.   (setq        q 0
  24.         p 0
  25.         d 0
  26.         b 0
  27.   )
  28.   (repeat ss8                             
  29.     (setq ss9 (nth q ss7))
  30.     (repeat (- ss8 q)                       
  31.       (setq ss10 (nth p ss7))
  32.       (if (< (distance ss9 ss10) 1e-8)        
  33.         (setq d (+ 1 d))
  34.       )                                        ;if
  35.       (setq p (+ 1 p))
  36.     )                                        ;repeat
  37.     (if        (/= d 2)                     
  38.       (command "CIRCLE" ss9 50)                ;
  39.     )
  40.     (setq q (+ 1 q)
  41.           p q
  42.           d 0
  43.     )                                       
  44.   )                                        ;repeat
  45.   (princ)
  46. )
 楼主| 发表于 2011-11-22 12:16:22 | 显示全部楼层
如这图所示的结果!

本帖子中包含更多资源

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

x
 楼主| 发表于 2011-11-22 12:18:50 | 显示全部楼层
本帖最后由 328302216 于 2011-11-22 17:10 编辑

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


  1. (defun c:qt3 ()
  2.   (setq ss (ssget))     
  3.   (setq i 0)
  4.   (setq ss7 '())
  5.   (repeat (sslength ss)   
  6.     (setq ss1 (ssname ss i))  
  7.     (setq ss2 (entget ss1))   
  8.     (setq ss3 (cdr (assoc 0 ss2)))
  9.     (setq ss4 (cdr (assoc 8 ss2)))  
  10.     (if  (and (= ss3 "LINE") (= ss4 "06"))
  11.               (progn
  12.   (setq ss5 (cdr (assoc 10 ss2)))
  13.   (setq ss6 (cdr (assoc 11 ss2)))
  14.       )
  15.     )
  16.     (setq ss6_1 (list ss5 ss6))   
  17.     (setq ss7 (append ss6_1 ss7))
  18.     (setq ss6_1 nil)   
  19.     (setq i (+ 1 i))
  20.   )
  21.   (setq ss8 (length ss7))  
  22.   )
  23. (princ )
  24. )  
  25.   

 楼主| 发表于 2011-11-22 12:20:42 | 显示全部楼层
我原来整这个在刚好相加的地方会画出两个重叠的圆!你的这种比我的那种少画了一个圆,就是在两条线刚好连接的地方少画了一个!!!
发表于 2011-11-22 13:00:39 | 显示全部楼层
你的意思是只要有重复的,就一个也不绘制?即顶楼的那组坐标只绘制 4 个圆?上面那个动画的图示,只绘制 6 个圆?这样的话,就需要每次都全表进行比较了。
  1.   ; 前面不变
  2.   (repeat ss8                                ;循环ss8等于ss7列表中的元素个数
  3.     (setq ss9 (nth q ss7))
  4.     (repeat ss8  ; 每个元素都要比较下  (- ss8 q)
  5.       (setq ss10 (nth p ss7))
  6.       (if (< (distance ss9 ss10) 1e-8)        ;* (= ss9 ss10) 这样的比较对浮点数不妥
  7.         (setq d (+ 1 d))
  8.       )                                        ;if
  9.       (setq p (+ 1 p))
  10.     )                                        ;repeat
  11.     (if        (/= d 2)                        ;* 多于 1 个的即为有重复数据,暂时不绘制
  12.       (command "CIRCLE" ss9 50)                ;
  13.     )
  14.     (setq q (+ 1 q)
  15.           p 0    ;* 从头开始比较
  16.           d 0
  17.     )                                        ;* 每个数据的查询,p 和 d 都须重置
  18.   )                                        ;repeat
  19.   (princ)
 楼主| 发表于 2011-11-22 14:14:40 | 显示全部楼层
dunkel 发表于 2011-11-22 13:00
你的意思是只要有重复的,就一个也不绘制?即顶楼的那组坐标只绘制 4 个圆?上面那个动画的图示,只绘制 6  ...

  OK了  呵呵  谢谢前辈的指导!
发表于 2011-11-22 14:30:20 | 显示全部楼层
看来你们都是高手呀,我真是感觉到望尘莫及了.
 楼主| 发表于 2011-11-22 15:53:26 | 显示全部楼层
我菜得很呢,我是新手 CAD都还不怎么熟,现在两门同时学,一边学CAD又学lisp,而且学了两个多月了,现在感觉还是什么都不会……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-1-11 04:19 , Processed in 0.225671 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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