明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2590|回复: 11

[已解答] 如何将下面程序改了删除同心圆的大圆 留住小圆

  [复制链接]
发表于 2015-1-12 14:59:01 | 显示全部楼层 |阅读模式
如何将下面程序改了删除同心圆的大圆   留住小圆
能力有限,实在读不懂了
望大师出手
国际惯例    原作者为YOYOHO
  1. ;;;同心圆删除大圆保留最小的圆 O.K.
  2. (defun c:cd (/ ss nss en ent cnt st1 st2 )
  3. (setq ss1 (ssadd))
  4.   (if (setq ss (ssget '((0 . "CIRCLE"))))
  5.     (progn
  6.       (repeat (setq nss (sslength ss))
  7.         (setq en  (ssname ss (setq nss (1- nss)))
  8.               ent (entget en)
  9.               cnt (cdr (assoc 10 ent))
  10.               r      (vl-catch-all-apply
  11.                     '(lambda ()
  12.                        (foreach    p st1
  13.                          (if (equal cnt p 1e-6)
  14.                            (exit)
  15.                          )
  16.                        )
  17.                      )
  18.                   )
  19.         )
  20.         (if    (not (vl-catch-all-error-p r))
  21.                 (setq    st1 (cons cnt st1)
  22.                 st2 (cons (cdr (assoc 10 ent)) st2))
  23.                (PROGN
  24.                  (ssadd en ss1)
  25.                  (vla-Delete (vlax-ename->vla-object en))
  26.                )
  27.         )

  28.       )
  29.       
  30.     )

  31.   )
  32. (alert (strcat "已删除" (rtos (- (sslength ss1) nss))"个同心圆"))
  33. (reverse st2)
  34. )
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-1-12 16:27:37 | 显示全部楼层
(defun c:cdx ( / CNT DATA EN HDL HHH IDX II RRR SS)
  (if (setq ii -1
            ss (ssget '((0 . "CIRCLE")))
      )
    (repeat (sslength ss)
      (setq en        (ssname ss (setq ii (1+ ii)))
            hdl        (cdr (assoc 5 (entget en)))
            cnt        (cdr (assoc 10 (entget en)))
            rrr        (cdr (assoc 40 (entget en)))
            idx        (strcat (rtos (car cnt) 2 3) "#" (rtos (cadr cnt) 2 3))
      )
      (if (null (setq hhh (cdr (assoc idx data))))
        (setq data (cons (cons idx hdl) data))
        (if (> (cdr (assoc 40 (entget (handent hhh))))
               rrr
            )
          (setq        hhh  (entdel (handent hhh))
                data (subst (cons idx hdl) (assoc idx data) data)
          )
          (entdel en)
        )
      )
    )
  )
)
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-27 14:36:41 | 显示全部楼层
mmmmmm 发表于 2015-1-12 16:27
(defun c:cdx ( / CNT DATA EN HDL HHH IDX II RRR SS)
  (if (setq ii -1
            ss (ssget '((0 . "CIRCL ...

非常好用。但我只需筛选出同心大圆,不删除只高亮识别出来,改怎么改呢?谢谢
 楼主| 发表于 2015-1-12 14:59:38 | 显示全部楼层
说明为   删除同心圆的大圆   留住小圆
实际刚好相反
 楼主| 发表于 2015-1-12 15:03:45 | 显示全部楼层
汗。。实测中。。。还是随机删大或删小圆的  
 楼主| 发表于 2015-1-12 17:02:30 | 显示全部楼层
mmmmmm 发表于 2015-1-12 16:27
(defun c:cdx ( / CNT DATA EN HDL HHH IDX II RRR SS)
  (if (setq ii -1
            ss (ssget '((0 . "CIRCL ...

非常给力。。。可以批量。。
顶一个
 楼主| 发表于 2015-1-12 17:41:29 | 显示全部楼层
mmmmmm 发表于 2015-1-12 16:27
(defun c:cdx ( / CNT DATA EN HDL HHH IDX II RRR SS)
  (if (setq ii -1
            ss (ssget '((0 . "CIRCL ...

刚优化好。。。极好的程序   
可以加个同心容差就好了。。有时会差0。02--0。05
 楼主| 发表于 2015-1-12 18:07:51 | 显示全部楼层
mmmmmm 发表于 2015-1-12 16:27
(defun c:cdx ( / CNT DATA EN HDL HHH IDX II RRR SS)
  (if (setq ii -1
            ss (ssget '((0 . "CIRCL ...

解读了半天还是不得要领
为什么要用到句柄??
具体思是怎么样的??
大神能给讲解一下吗?
发表于 2015-1-12 21:19:03 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-1-12 21:28 编辑
ysq101 发表于 2015-1-12 14:59
说明为   删除同心圆的大圆   留住小圆
实际刚好相反


  1. (defun SstoEs(ss / a en lst)
  2.   (if ss(progn(setq a -1)
  3.          (while(setq en(ssname ss(setq a(1+ a))))
  4.            (setq lst(cons en lst)))))
  5.   lst)
  6. (defun subtotals(lst m ns / myfun a b c)
  7.   (cond((=(type ns)'LIST)(defun myfun(x)(list(mapcar'(lambda(y)(nth y x))ns))))
  8.        ((=(type ns)'INT)(defun myfun(x)(list(nth ns x))))
  9.        (t(defun myfun(x)(list(vl-remove c x)))))
  10.   (foreach x lst
  11.     (setq a(if(setq c(nth m x)b(assoc c a))
  12.        (subst(append b(myfun x))b a)
  13.        (append a(list(append(list c)(myfun x))))))))
  14. (defun c:tt()
  15.   (foreach x(mapcar'(lambda(x)(vl-sort(cdr x)'(lambda(a b)(<(car a)(car b)))))
  16.                    (subtotals(mapcar'(lambda(x)(setq e(entget x))(list(cdr(assoc 40 e))(cdr(assoc 10 e))x))(sstoes(ssget'((0 . "circle")))))1'nil))
  17.     (foreach y(cdr x)
  18.       (entdel(last y))))
  19.   )

容差没加上,那个得改造分类程序subtotals
嵌套表分类统计http://bbs.mjtd.com/forum.php?mo ... 9843&fromuid=202795
 楼主| 发表于 2015-1-13 11:04:37 | 显示全部楼层
llsheng_73 发表于 2015-1-12 21:19
容差没加上,那个得改造分类程序subtotals
嵌套表分类统计http://bbs.mjtd.com/forum.php?mo ... 98 ...

这个也很好。。。网址为什么不是贴子??是不是发错了?
有空再解读一下
 楼主| 发表于 2015-1-13 11:07:41 | 显示全部楼层
llsheng_73 发表于 2015-1-12 21:19
容差没加上,那个得改造分类程序subtotals
嵌套表分类统计http://bbs.mjtd.com/forum.php?mo ... 98 ...

哈哈。。。搜索subtotals就出来了。。。果然是网址不对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-27 04:23 , Processed in 0.237325 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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