找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1142|回复: 9

[求助] 求教一个问题

[复制链接]

已领礼包: 8个

财富等级: 恭喜发财

发表于 2017-6-8 13:32:53 | 显示全部楼层 |阅读模式

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

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

×
6-9.jpg 如图所示意。
图纸中有很多同心圆,大大小小的。
比如:框选A里面的后,自动选择图纸中,2个同心的,且直径和A区的相同的图元。
(setq ss1 (ssget "X"
                   '((-4 . "<OR")
                     (-4 . "<AND")
                     (0 . "CIRCLE")
                     (40 . r1)
                     (-4 . "AND>")
                     (-4 . "<AND")
                     (0 . "CIRCLE")
                     (40 . r2)
                     (-4  . "AND>")
                     (-4 . "OR>")
                     ))
  )

这样子做的话,选择的是R1,R2半径的圆、就是说,一个单独的圆半径符合的话,也选择上了。
我是做机械的,别人给的图,大大小小的同心圆,一堆一堆的,看着晕。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 604个

财富等级: 财运亨通

发表于 2017-6-8 13:44:57 | 显示全部楼层
是不是这个意思???
  1. (if (ssget '((0 . "CIRCLE")
  2.              (-4 . "<OR")
  3.              (40 . r1)
  4.              (40 . r2)
  5.              (-4 . "OR>")
  6.             )
  7.     )
  8.   (setq        ss (ssget "X"
  9.                   '((0 . "CIRCLE")
  10.                     (-4 . "<OR")
  11.                     (40 . r1)
  12.                     (40 . r2)
  13.                     (-4 . "OR>")
  14.                    )
  15.            )
  16.   )
  17. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-6-8 13:45:01 | 显示全部楼层
同心肯定要进一步处理,选择相同半径倒是可以

  1. (defun c:tt (/ ss sl i e el lst filter)
  2.   (if (setq ss (ssget '((0 . "circle"))))
  3.     (progn
  4.       (setq sl (sslength ss)
  5.             i  0
  6.       )
  7.       (while (setq e (ssname ss i))
  8.         (setq el  (entget e)
  9.               lst (cons (assoc 40 el) lst)
  10.               i (1+ i)
  11.         )
  12.       )
  13.       (if lst
  14.         (progn
  15.           (setq filter '((-4 . "<or") (0 . "circle")))
  16.           (foreach x lst
  17.             (setq filter (cons x filter))
  18.           )
  19.           (setq filter (cons '(-4 . "or>") filter))
  20.           (if (setq s (ssget "x" (reverse filter)))
  21.             (sssetfirst nil s)
  22.           )
  23.         )
  24.       )
  25.     )
  26.   )
  27.   (princ)
  28. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

 楼主| 发表于 2017-6-8 13:47:44 | 显示全部楼层

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

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

 楼主| 发表于 2017-6-8 13:53:55 | 显示全部楼层

嗯。没有好的方法的话,看起来要全部重新判断了。
如果是这样的话,
1:先选同心圆.
2:求一个半径 R!即可。
3:同心圆半径列表( R1  R2 R...............)。
4:选择R1半径的圆集合---sss。
5:repeat sss ,
      看和它同心的圆有没有,没有pass,
      有的话,且半径列表均有的话,---->放到sssnew新的选择集中

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

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

 楼主| 发表于 2017-6-8 13:56:42 | 显示全部楼层

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-6-8 14:06:01 | 显示全部楼层

选完了用 xd::list:groupbyindex 代码就简单了,也可以像下面这样

  1. (defun c:tt (/ ss sl i e el lst filter pts p1 l elst s1 s)
  2.   (if (setq ss (ssget '((0 . "circle"))))
  3.     (progn
  4.       (setq i     0
  5.         slen (sslength ss)
  6.       )
  7.       (while (setq e (ssname ss i))
  8.     (setq el  (entget e)
  9.           lst (cons (assoc 40 el) lst)
  10.           i      (1+ i)
  11.     )
  12.       )
  13.       (if lst
  14.     (progn
  15.       (setq filter '((-4 . "<or") (0 . "circle")))
  16.       (foreach x lst
  17.         (setq filter (cons x filter))
  18.       )
  19.       (setq filter (cons '(-4 . "or>") filter))
  20.       (if (setq s (ssget "x" (reverse filter)))
  21.         (progn
  22.           (setq i 0)
  23.           (while (setq e (ssname s i))
  24.         (setq pts (cons (list (cdr (assoc 10 (entget e))) e) pts)
  25.               i      (1+ i)
  26.         )
  27.           )
  28.           (setq pts    (vl-sort pts
  29.                  (function (lambda (x1 x2)
  30.                          (if (= (caar x1) (caar x2))
  31.                            (< (cadar x1) (cadar x2))
  32.                            (< (caar x1) (caar x2))
  33.                          )
  34.                        )
  35.                  )
  36.             )
  37.           )
  38.           (while pts
  39.         (setq p1 (caar pts)
  40.               l     (vl-remove-if-not
  41.                (function (lambda (x) (equal (car x) p1 1e-6)))
  42.                (cdr pts)
  43.              )
  44.         )
  45.         (if (= (1+ (length l)) slen)
  46.           (progn
  47.             (setq elst (cons (cadar pts) (append (mapcar 'cadr l) elst)))
  48.             (mapcar '(lambda (x) (setq pts (vl-remove x pts))) l)
  49.           )
  50.         )
  51.         (setq pts (cdr pts))
  52.           )
  53.           (if elst
  54.         (progn
  55.           (setq s1 (ssadd))
  56.           (foreach x elst (ssadd x s1))
  57.           (sssetfirst nil s1)
  58.         )
  59.           )
  60.         )
  61.       )
  62.     )
  63.       )
  64.     )
  65.   )
  66.   (princ)
  67. )


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-6-8 14:13:57 | 显示全部楼层
本帖最后由 st788796 于 2017-6-8 14:24 编辑

使用 xd::list:groupbyindex 后面代码就简化如下

  1. (defun c:tt (/ ss sl i e el lst filter pts p1 l elst s1 s)
  2.   (if (setq ss (ssget '((0 . "circle"))))
  3.     (progn
  4.       (setq i         0
  5.             slen (sslength ss)
  6.       )
  7.       (while (setq e (ssname ss i))
  8.         (setq el  (entget e)
  9.               lst (cons (assoc 40 el) lst)
  10.               i          (1+ i)
  11.         )
  12.       )
  13.       (if lst
  14.         (progn
  15.           (setq filter '((-4 . "<or") (0 . "circle")))
  16.           (foreach x lst
  17.             (setq filter (cons x filter))
  18.           )
  19.           (setq filter (cons '(-4 . "or>") filter))
  20.           (if (setq s (ssget "x" (reverse filter)))
  21.             (progn
  22.               (setq i 0)
  23.               (while (setq e (ssname s i))
  24.                 (setq el   (entget e)
  25.                       elst (cons (list (cdr (assoc 10 el)) e) elst)
  26.                       i           (1+ i)
  27.                 )
  28.               )
  29.               (setq elst (xd::list:groupbyindex elst 1e-6)
  30.                     s1         (ssadd)
  31.               )
  32.               (foreach x elst
  33.                 (if (= (length (cdr x)) slen)
  34.                   (mapcar '(lambda (x) (ssadd x s1)) (cdr x))
  35.                 )
  36.               )
  37.               (sssetfirst nil s1)
  38.             )
  39.           )
  40.         )
  41.       )     
  42.     )
  43.   )
  44.   (princ)
  45. )

不同写法

  1. (defun c:tt (/ ss slen lst filter s elst s1)
  2.   (if (setq ss (ssget '((0 . "circle"))))
  3.     (progn
  4.       (setq slen (sslength ss)
  5.             lst         (mapcar '(lambda (x) (assoc 40 (entget x)))
  6.                          (xdrx_pickset->ents ss)
  7.                  )
  8.       )
  9.       (if lst
  10.         (progn
  11.           (setq filter '((-4 . "<or") (0 . "circle")))
  12.           (foreach x lst
  13.             (setq filter (cons x filter))
  14.           )
  15.           (setq filter (cons '(-4 . "or>") filter))
  16.           (if (setq s (ssget "x" (reverse filter)))
  17.             (progn
  18.               (setq elst (mapcar '(lambda (x) (list (xdrx_getpropertyvalue x "center") x))
  19.                                  (xdrx_pickset->ents s)
  20.                          )
  21.                     elst (xd::list:groupbyindex elst 1e-6)
  22.                     elst (apply        'append
  23.                                 (vl-remove-if-not
  24.                                   '(lambda (x) (= (length x) slen))
  25.                                   (mapcar 'cdr elst)
  26.                                 )
  27.                          )
  28.                     s1         (ssadd)
  29.               )
  30.               (foreach x elst (ssadd x s1))
  31.               (sssetfirst nil s1)
  32.             )
  33.           )
  34.         )
  35.       )
  36.     )
  37.   )
  38.   (princ)
  39. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

 楼主| 发表于 2017-6-8 15:15:38 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-6-8 15:41:58 | 显示全部楼层

有现成的,还要自己写?

xd::list:groupbyindex 搜索 开源函数库论坛,纯LISP的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 12:50 , Processed in 0.180549 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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