明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 947|回复: 11

[讨论] 关于 group 组对象的获取,怎么像平常一样。

[复制链接]
发表于 2023-3-12 12:30 | 显示全部楼层 |阅读模式
1.已经存在的一些组,它是像块一样存在一个单独的ENAME吗?我找到这个ENAME就能找到组里面的对象?然后通过组里面的图元信息区别再来找到我要的组?像块一样?

2.我通过ssget 获得选择集 ,是包含 组的ENAME ,还有组里面图元的 ENAME 吗? 那我要找到文字包含“Z”的图元所在的组,然后把组转化成图元的选择集,但是我发现通过组的ENAME,340的图元获取不了组里面图元的信息,以致无法区别是不是要找的组,请问我该怎么选取组,以及获取组里面图元的信息。
3.是不是我得通过要找的图元找到组,然后在组里找到图元集合,但是这样图元无法获取信息?以及进行后面的操作?
4.还是我要ssget 获得选择集,然后通过图元的组名,相同的归集图元成为一个选择集?那这里面也包含组本身图元??请问有组图元类型?
讲得比较乱,,我的本意是想选择一些组,通过组里面的图元信息区别,获取想要的组的图元集合,然后对集合进行操作,??
请老师们给指点指点,,有点乱,,发现论坛比较少获取选取组的函数,,,求助下,,谢谢!!!
发表于 2023-3-13 15:55 | 显示全部楼层
本帖最后由 llsheng_73 于 2023-3-13 16:10 编辑

  1. (defun ingroup(e f / a);;如果图元e在编组里边,f为真返回编组对象及组内图元名,f为nil返回编组名及组内图元名,否则返回nil
  2.         (or(=(type e)'ename)(setq e(vlax-vla-object->ename e)))
  3.         (if(and(setq e(member'(102 . "{ACAD_REACTORS")(entget e)))
  4.                (setq e(member'(102 . "}")(reverse e))))
  5.           (vl-remove'nil(mapcar'(lambda(x / e a)(if(member'(0 . "GROUP")(setq e(entget(cdr x))))
  6.                                                   (cons(if f(vlax-ename->vla-object(cdar e))(cdar e))(mapcar'cdr (vl-remove-if'(lambda(x)(/=(car x)340))e)))))
  7.                                (vl-remove-if-not'(lambda(x)(=(car x)330))e)))))
  8.       (defun removefromgroup(ens)
  9.         (vl-some(function(lambda(x)(vl-some(function(lambda(y)(VL-CATCH-ALL-APPLY'vla-RemoveItems(list(car y)(l2array(list x))))nil))(INGROUP x t))nil))
  10.                 (setq ens(if(listp ens)(vl-remove'nil ens)(list ens)))))
  11.       (defun addtogroup(ob ens);;;图元编组ob编组对象,ens要加入该编组的图元,ob为nil或者非编组对象时,ens加入到一个未命名编组l2arra自定义图元转对象数组函数
  12.         (or(=(VL-CATCH-ALL-APPLY'vla-get-ObjectName(list ob))"AcDbGroup")
  13.            (setq ob(vla-add(vla-get-groups(vla-get-ActiveDocument(vlax-get-acad-object)))"*")))
  14.         (vla-AppendItems ob(l2array ens)))


  15. (defun l2array(l / A);;;图元(或对象)表转为对象数组
  16.       (vlax-safearray-fill(vlax-make-safearray 9(cons 0(1-(length l))))
  17.         (mapcar(function(lambda(x / a)(setq a(type x))(cond((='ename a)(vlax-ename->vla-object x))((='VLA-OBJECT a)x))))l)))


我个人基本就用这三个收拾组。。。


如果需要查所有组名,可以查当前文档的GROUPS对象然后获取,个人用以下函数
  1. (defun ObjItems(Obj Sets item / l a)
  2.   (if item(defun a(x)(if(vl-catch-all-error-p(setq x(vl-catch-all-apply'vlax-get-property(list x item))))nil x))(defun a(x)x))
  3.   (if(not(vl-catch-all-error-p(vl-catch-all-apply'vlax-get-property(list Obj Sets))))
  4.     (setq Sets(if Sets(vl-catch-all-apply'vlax-get-property(list Obj Sets))Obj))
  5.     (if(vlax-method-applicable-p obj(strcat"get"(VL-PRINC-TO-STRING sets)))
  6.       (setq sets(eval(list(read(strcat"vla-get"(VL-PRINC-TO-STRING sets)))obj)))))
  7.   (if(=(type sets)'variant)(mapcar'a(vlax-safearray->list(variant-value sets)))
  8.       (vlax-for x Sets(setq l(cons(a x)l)))))

(ObjItems(vlax-get-property(vlax-get-acad-object)'activedocument)'groups 'name)

编组虽然方便,但很脆弱,跨图复制组就散了,比较麻烦,另外,同一图元对象可能同时处于多个不同的组,出现这种情况也比较麻烦,当然可以通过
ingroup查出图元或对象所在的所有编组,再考虑怎么收拾
发表于 2023-3-12 14:17 | 显示全部楼层
本帖最后由 vitalgg 于 2023-3-12 14:20 编辑
  1. 命令:
  2. 命令: (fun:search 'group:*)
  3. ; 6 functions were found.
  4. ======================
  5. *** 函数名:  group:get-by-name
  6. ---------------
  7. 说明: 获取编组名为 name 的编组对象。
  8. 用法: (group:get-by-name name)
  9. 参数: 1 name  : 未明确定义;
  10. 返回值:
  11. 示例:
  12. ======================
  13. *** 函数名:  group:groups-to-objlist
  14. ---------------
  15. 说明: 将编组集转为编组对象列表.
  16. 用法: (group:groups-to-objlist )
  17. 参数: None
  18. 返回值:
  19. 示例:
  20. ======================
  21. *** 函数名:  group:list
  22. ---------------
  23. 说明: 列出图中的编组名
  24. 用法: (group:list )
  25. 参数: None
  26. 返回值:
  27. 示例:
  28. ======================
  29. group:make
  30. group:to-entlist
  31. group:to-objlist
复制代码

  1. 命令: (fun:search 'group:make)
  2. ; 1 functions were found.
  3. ======================
  4. *** 函数名:  group:make
  5. ---------------
  6. 说明: 将实体集编组,lst 图元列表,name 编组名,(匿名组首字为*).
  7. 用法: (group:make lst name)
  8. 参数: 1 lst  : 列表;  2 name  : 未明确定义;
  9. 返回值:
  10. 示例:
  11. 命令: (fun:search 'group:to-entlist)
  12. ; 1 functions were found.
  13. ======================
  14. *** 函数名:  group:to-entlist
  15. ---------------
  16. 说明: 编组转图元列表, obj-g 为编组对象。
  17. 用法: (group:to-entlist obj-g)
  18. 参数: 1 obj-g  : activeX 对象;
  19. 返回值:
  20. 示例:
  21. 命令: (fun:search 'group:to-objlist)
  22. ; 1 functions were found.
  23. ======================
  24. *** 函数名:  group:to-objlist
  25. ---------------
  26. 说明: 编组转图元对象列表, obj-g 为编组对象。
  27. 用法: (group:to-objlist obj-g)
  28. 参数: 1 obj-g  : activeX 对象;
  29. 返回值:
  30. 示例:
复制代码

发表于 2023-3-12 20:04 | 显示全部楼层
本帖最后由 wzg356 于 2023-3-12 20:22 编辑

这种情况根据经验试一下就行了
组我认为只是一个图面明确表示的选择集
执行ssget,点击一个组成员就等于选上这个组,选择集里的成员就是这个组成员
执行entsel,点击一个组成员,结果(car(entsel))还是这个组成员
(setq a(entsel))(command "copy" (car a) "" pause pause),结果是复制全部组成员并新编成组
(setq a(entsel))(command "erase" (car a) "" pause pause),结果是删除全部组成员
因为copy,erase执行的是选择集模式,即相当于点选(car (entsel))后的结果

(setq a(entsel))(entdel (car a)),结果是仅删除这个组成员,组还在

例如
(ssnamex(ssget))点击一个组成员,显示如下选择集信息
((9 <图元名: 7ffff605ad0> 0) (9 <图元名: 7ffff605ac0> 0) (9 <图元名: 7ffff605ab0> 0) (9
<图元名: 7ffff605aa0> 0) (9 <图元名: 7ffff605a90> 0) (9 <图元名: 7ffff605a80> 0) (9
<图元名: 7ffff605a70> 0) (1 <图元名: 7ffff605a60> 3 (0 (2251.42 1482.87 0.0))))

我理解的选择集信息为:这个选择集图元数量8个,无任关于组的信息。选择集是通过拾取框点击(2251.42 1482.87 0.0)---获得<图元名: 7ffff605a60>,这个图元<图元名: 7ffff605a60>是一个组的成员,然后取得其余组成员组成这个选择集
发表于 2023-3-12 12:45 | 显示全部楼层
entget组成员和非组成员
看下它们之间的区别
发表于 2023-3-12 12:47 | 显示全部楼层
另外注意一下pickstyle的设置
发表于 2023-3-12 14:55 来自手机 | 显示全部楼层
你需要用vlisp函数面向对象函数才行。用dxf码很难处理组。直接论坛搜索组,就会有有你要的信息。我前段时间刚玩过
 楼主| 发表于 2023-3-12 16:44 | 显示全部楼层
liuhe 发表于 2023-3-12 14:55
你需要用vlisp函数面向对象函数才行。用dxf码很难处理组。直接论坛搜索组,就会有有你要的信息。我前段时间 ...

好的,面向对象跟DXF码的与原理是不一样的是吧??了解不多。。。
 楼主| 发表于 2023-3-12 16:49 | 显示全部楼层

有函数没,,能共享下吗!谢谢!
发表于 2023-3-12 19:13 | 显示全部楼层
本帖最后由 vitalgg 于 2023-3-12 19:17 编辑

在 CAD 上安装了 @lisp 后 。
输入
(fun:src 函数名)
即可返回函数源代码。

(fun:src 'group:list)


也可以在浏览器
https://gitee.com/atlisp/atlisp-lib
src/group/ 下查看源码。



本帖子中包含更多资源

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

x
 楼主| 发表于 2023-3-13 13:07 | 显示全部楼层
vitalgg 发表于 2023-3-12 19:13
在 CAD 上安装了 @lisp 后 。
输入
(fun:src 函数名)

谢谢,,没用过这个研究下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 23:11 , Processed in 0.175193 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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