magicheno 发表于 2021-8-20 23:23:48

编组内容如何通过ssget过滤

本帖最后由 magicheno 于 2021-8-21 14:19 编辑

请教大佬们,如下的图,编号的圆圈都是一个编组,圆是属性块,编号朝左的时候,属性块X比例为-110,朝右是110,想通过过滤选出朝左边的然后数字末尾位1的
(defun c:TT5()
(setq ss (ssget '((0 . "INSERT")(-4 . "<and")(-4 . "<=") (41 . -90.0)(-4 . "and>"))))
(sssetfirst nil ss)
(setvar "cmdecho" 0)
)
这段我编的只能选出所有朝左的编号,(setq ss (ssget '((1 . "*"))))这个是只能选出数字为1末尾的编号,两个不知道如何合并选出来

vitalgg 发表于 2021-8-21 07:50:34

本帖最后由 vitalgg 于 2021-8-22 01:37 编辑

看错了,不好意思。
ssget 不能操作组信息
遍历组,如果组里有3个图元对象,且块对象 x = -110.0, 文字对象内容结尾为 1。则选中。
(setq ;;常用VLA对象、集合
*ACAD*(vlax-get-acad-object)
*DOC*   (vla-get-ActiveDocument *ACAD*)
*GRPS*(vla-get-groups *DOC*))
(setq i 0)
(setq ss (ssadd))
(while (< i (vla-get-count *GRPS*))
(setq grp% (vla-item *GRPS* i))
(if (= 3 (vla-get-count grp%))
      (progn
(setq flag 0)
(setq j 0)
(while (< j 3)
    (if (and (= "AcDbBlockReference" (vla-get-ObjectName (vla-item grp% j)))
       (equal -110.0 (vla-get-XEffectiveScaleFactor (vla-item grp% j)) 0.01)) ;; 如果是 -110 ~ 0 之间,把 equal 改成 > ,去了容差 0.01.
      (setq flag (1+ flag)))
    (if (and (= "AcDbText" (vla-get-ObjectName (vla-item grp% j)))
       (wcmatch (vla-get-TextString (vla-item grp% j)) "*1"))
      (setq flag (1+ flag)))
    (setq j (1+ j)))
(if (= 2 flag)
      (progn
      (setq ss (ssadd (vlax-vla-object->ename (vla-item grp% 0)) ss))
      (setq ss (ssadd (vlax-vla-object->ename (vla-item grp% 1)) ss))
      (setq ss (ssadd (vlax-vla-object->ename (vla-item grp% 2)) ss))))
))
(setq i (1+ i))
)
(sssetfirst nil ss)

magicheno 发表于 2021-8-21 14:14:31

vitalgg 发表于 2021-8-21 07:50
(setq ss (ssget '((0 . "INSERT")(1 . "*") (-4 . "
大侠,这个试了下,过滤不出来哦

vitalgg 发表于 2021-8-21 19:55:06

ssget 不支持组。 按 visuallisp 重写了一下。

magicheno 发表于 2021-8-21 21:23:05

本帖最后由 magicheno 于 2021-8-21 21:28 编辑

vitalgg 发表于 2021-8-21 07:50
看错了,不好意思。
ssget 不能操作组信息
遍历组,如果组里有3个图元对象,且块对象 x = -110.0, 文字 ...
大侠缺少函数o2e哦,如果组里是-110 还有-100,-90该怎么加加哈

vitalgg 发表于 2021-8-22 03:15:55

@lisp 开发写法:

(setq ss (ssadd));;创建空选择集
;; 去除不符合条件的编组
(setq gs (vl-remove-if-not
          '(lambda(x / entlst)
             (setq entlst (group:to-entlist x))
             (and ; 合并以下条件
            (pickset:get-sub entlst '((1 . "*1"))); 编组中的文字结尾为1。
            (pickset:get-sub entlst '((0 . "INSERT")(-4 . "<=")(41 . -90.0))))); 编组中的块x比例小于 -90
          (group:groups-to-objlist)));将编组集转为列表
(foreach gs% gs ;将符合条件的编组加入到选择集
         (mapcar '(lambda (x) (ssadd x ss)) (group:to-entlist gs%)))
(sssetfirst nil ss);亮显选择集

以上代码需要先安装 @lisp

下载: (@).fas

magicheno 发表于 2021-8-22 11:48:45

vitalgg 发表于 2021-8-22 03:15
@lisp 开发写法:




这个好复杂,都不太会用

vitalgg 发表于 2021-8-22 21:18:39

o2e 就是把图元对象转化为图元ename
代码已修改
o2e 同vlax-vla-object->ename

magicheno 发表于 2021-8-23 20:07:50

vitalgg 发表于 2021-8-21 07:50
看错了,不好意思。
ssget 不能操作组信息
遍历组,如果组里有3个图元对象,且块对象 x = -110.0, 文字 ...

大侠给力啊,可以用不过这个是全图的,可否改为框选呢

magicheno 发表于 2021-8-25 13:39:21

vitalgg 发表于 2021-8-22 21:18
o2e 就是把图元对象转化为图元ename
代码已修改
o2e 同vlax-vla-object->ename

大侠,可以帮忙实现下框选范围内么,目前是全图的效果的,都选上了
页: [1]
查看完整版本: 编组内容如何通过ssget过滤