找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2069|回复: 6

[已解决] 求删除相邻块之间插入点距离小于300的右边的块参照

[复制链接]
发表于 2014-2-3 10:10:03 | 显示全部楼层 |阅读模式
悬赏100D豆已解决
本帖最后由 清风明月10 于 2014-2-3 12:35 编辑

求删除相邻块之间插入点距离小于300的右边的块参照
图上有一行块参照(只有一行),有些块是重叠了半个块的,即它们的插入点之间的距离小于300(块的长度是500)
我的要求就是先将选定的块从左到右排序,再将相邻块之间插
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:求删除相邻块之间插入点距离小于300的右边的块参照.rar 
下载次数:2  文件大小:45.12 KB 
下载权限: 不限 以上  [免费赚D豆]



入点距离小于300的右侧那个块删除。最后得到的块参照,相邻块插入点的距离大于300。



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

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-2-3 10:10:04 | 显示全部楼层
  1. (defun c:tt (/ ss el e1 e2)
  2.   (if (setq ss (ssget '((0 . "insert"))))
  3.     (progn
  4.       (setq el (mapcar '(lambda        (x)
  5.                           (list        (xdrx_getpropertyvalue x "Position")
  6.                                 x
  7.                           )
  8.                         )
  9.                        (xdrx_pickset->ents ss)
  10.                )
  11.             el (vl-sort        el
  12.                         '(lambda (e1 e2)
  13.                            (< (caar e1) (caar e2))
  14.                          )
  15.                )
  16.       )
  17.       (while el
  18.         (setq e1 (car el)
  19.               e2 (cadr el)
  20.         )
  21.         (if (< (abs (- (caar e2) (caar e1))) 300)
  22.           (progn
  23.             (entdel (cadr e2))
  24.             (setq el (cdr el))
  25.           )
  26.           (setq el (cdr el))
  27.         )
  28.       )
  29.     )
  30.   )
  31.   (princ)
  32. )

点评

我在你的基础上改了一点点,代码如下: (defun c:tt (/ ss el e1 e2) (if (setq ss (ssget '((0 . "insert")))) (progn (setq el (mapcar '(lambda (x) (list  详情 回复 发表于 2014-2-4 09:22
朋友,不对啊,除了一个块参照外,其它都被代码删除了啊。你用我发的文件试试。  发表于 2014-2-4 08:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-2-3 10:31:39 来自手机 | 显示全部楼层
用xd:: list: tablesort 排行列,用xd:: list: groupbyindex分组
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2014-2-4 09:22:57 | 显示全部楼层

我在你的基础上改了一点点,代码如下:
(defun c:tt (/ ss el e1 e2)
  (if (setq ss (ssget '((0 . "insert"))))
    (progn
      (setq el (mapcar '(lambda        (x)
                          (list        (xdrx_getpropertyvalue x "Position")
                                x
                          )
                        )
                       (xdrx_pickset->ents ss)
               )
            el (vl-sort        el
                        '(lambda (e1 e2)
                           (< (caar e1) (caar e2))
                         )
               )
      )
      (while el
        (setq e1 (car el)
              e2 (cadr el)
        )
        (if (< (abs (- (caar e2) (caar e1))) 300)
          (progn
            (entdel (cadr e2))
            (setq el (cDdr el))
          )
          (setq el (cdr el))
        )
      )
    )
  )
  (princ)
)

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

使用道具 举报

 楼主| 发表于 2014-2-4 09:49:23 | 显示全部楼层
(defun c:tt (/ ss EL e1 e2)
;;;来源:4楼 【新提醒】晓东CAD家园-论坛-技术问答【悬赏求助】-求删除相邻块之间插入点距离小于300的右边的块参照 - Powered by Discuz!
;;;http://www.xdcad.net/forum/forum ... 1&extra=#pid3505549
;;;就是如果有两个或两个以上的块和第1个块在距离300以内,也可以正确运行
  (if (setq ss (ssget '((0 . "insert"))))
    (progn
      (setq EL (mapcar '(lambda        (x)
                          (list        (xdrx_getpropertyvalue x "Position")
                                x
                          )
                        )
                       (xdrx_pickset->ents ss)
               )
            EL (vl-sort        EL
                        '(lambda (e1 e2)
                           (< (caar e1) (caar e2))
                         )
               )
      )
      (while EL
        (setq e1 (car EL)
              e2 (cadr EL)
        )
        (if (< (abs (- (caar e2) (caar e1))) 300)
          (progn
            (entdel (cadr e2))
            (setq EL(vl-remove e2 EL))
                        ; (setq EL (cDdr EL))
          )
          (setq EL (cdr EL))
        )
      )
    )
  )
  (princ))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-2-4 11:09:12 来自手机 | 显示全部楼层
里面应该也用while
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 07:17 , Processed in 0.372627 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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