关于 group 组对象的获取,怎么像平常一样。
1.已经存在的一些组,它是像块一样存在一个单独的ENAME吗?我找到这个ENAME就能找到组里面的对象?然后通过组里面的图元信息区别再来找到我要的组?像块一样?2.我通过ssget 获得选择集 ,是包含 组的ENAME ,还有组里面图元的 ENAME 吗? 那我要找到文字包含“Z”的图元所在的组,然后把组转化成图元的选择集,但是我发现通过组的ENAME,340的图元获取不了组里面图元的信息,以致无法区别是不是要找的组,请问我该怎么选取组,以及获取组里面图元的信息。
3.是不是我得通过要找的图元找到组,然后在组里找到图元集合,但是这样图元无法获取信息?以及进行后面的操作?
4.还是我要ssget 获得选择集,然后通过图元的组名,相同的归集图元成为一个选择集?那这里面也包含组本身图元??请问有组图元类型?
讲得比较乱,,我的本意是想选择一些组,通过组里面的图元信息区别,获取想要的组的图元集合,然后对集合进行操作,??
请老师们给指点指点,,有点乱,,发现论坛比较少获取选取组的函数,,,求助下,,谢谢!!!
本帖最后由 llsheng_73 于 2023-3-13 16:10 编辑
(defun ingroup(e f / a);;如果图元e在编组里边,f为真返回编组对象及组内图元名,f为nil返回编组名及组内图元名,否则返回nil
(or(=(type e)'ename)(setq e(vlax-vla-object->ename e)))
(if(and(setq e(member'(102 . "{ACAD_REACTORS")(entget e)))
(setq e(member'(102 . "}")(reverse e))))
(vl-remove'nil(mapcar'(lambda(x / e a)(if(member'(0 . "GROUP")(setq e(entget(cdr x))))
(cons(if f(vlax-ename->vla-object(cdar e))(cdar e))(mapcar'cdr (vl-remove-if'(lambda(x)(/=(car x)340))e)))))
(vl-remove-if-not'(lambda(x)(=(car x)330))e)))))
(defun removefromgroup(ens)
(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))
(setq ens(if(listp ens)(vl-remove'nil ens)(list ens)))))
(defun addtogroup(ob ens);;;图元编组ob编组对象,ens要加入该编组的图元,ob为nil或者非编组对象时,ens加入到一个未命名编组l2arra自定义图元转对象数组函数
(or(=(VL-CATCH-ALL-APPLY'vla-get-ObjectName(list ob))"AcDbGroup")
(setq ob(vla-add(vla-get-groups(vla-get-ActiveDocument(vlax-get-acad-object)))"*")))
(vla-AppendItems ob(l2array ens)))
(defun l2array(l / A);;;图元(或对象)表转为对象数组
(vlax-safearray-fill(vlax-make-safearray 9(cons 0(1-(length l))))
(mapcar(function(lambda(x / a)(setq a(type x))(cond((='ename a)(vlax-ename->vla-object x))((='VLA-OBJECT a)x))))l)))
我个人基本就用这三个收拾组。。。
如果需要查所有组名,可以查当前文档的GROUPS对象然后获取,个人用以下函数
(defun ObjItems(Obj Sets item / l a)
(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))
(if(not(vl-catch-all-error-p(vl-catch-all-apply'vlax-get-property(list Obj Sets))))
(setq Sets(if Sets(vl-catch-all-apply'vlax-get-property(list Obj Sets))Obj))
(if(vlax-method-applicable-p obj(strcat"get"(VL-PRINC-TO-STRING sets)))
(setq sets(eval(list(read(strcat"vla-get"(VL-PRINC-TO-STRING sets)))obj)))))
(if(=(type sets)'variant)(mapcar'a(vlax-safearray->list(variant-value sets)))
(vlax-for x Sets(setq l(cons(a x)l)))))
(ObjItems(vlax-get-property(vlax-get-acad-object)'activedocument)'groups 'name)
编组虽然方便,但很脆弱,跨图复制组就散了,比较麻烦,另外,同一图元对象可能同时处于多个不同的组,出现这种情况也比较麻烦,当然可以通过
ingroup查出图元或对象所在的所有编组,再考虑怎么收拾
本帖最后由 vitalgg 于 2023-3-12 14:20 编辑
命令:
命令: (fun:search 'group:*)
; 6 functions were found.
======================
*** 函数名:group:get-by-name
---------------
说明: 获取编组名为 name 的编组对象。
用法: (group:get-by-name name)
参数: 1 name: 未明确定义;
返回值:
示例:
======================
*** 函数名:group:groups-to-objlist
---------------
说明: 将编组集转为编组对象列表.
用法: (group:groups-to-objlist )
参数: None
返回值:
示例:
======================
*** 函数名:group:list
---------------
说明: 列出图中的编组名
用法: (group:list )
参数: None
返回值:
示例:
======================
group:make
group:to-entlist
group:to-objlist
命令: (fun:search 'group:make)
; 1 functions were found.
======================
*** 函数名:group:make
---------------
说明: 将实体集编组,lst 图元列表,name 编组名,(匿名组首字为*).
用法: (group:make lst name)
参数: 1 lst: 列表;2 name: 未明确定义;
返回值:
示例:
命令: (fun:search 'group:to-entlist)
; 1 functions were found.
======================
*** 函数名:group:to-entlist
---------------
说明: 编组转图元列表, obj-g 为编组对象。
用法: (group:to-entlist obj-g)
参数: 1 obj-g: activeX 对象;
返回值:
示例:
命令: (fun:search 'group:to-objlist)
; 1 functions were found.
======================
*** 函数名:group:to-objlist
---------------
说明: 编组转图元对象列表, obj-g 为编组对象。
用法: (group:to-objlist obj-g)
参数: 1 obj-g: activeX 对象;
返回值:
示例:
本帖最后由 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>是一个组的成员,然后取得其余组成员组成这个选择集
entget组成员和非组成员
看下它们之间的区别 另外注意一下pickstyle的设置 你需要用vlisp函数面向对象函数才行。用dxf码很难处理组。直接论坛搜索组,就会有有你要的信息。我前段时间刚玩过 liuhe 发表于 2023-3-12 14:55
你需要用vlisp函数面向对象函数才行。用dxf码很难处理组。直接论坛搜索组,就会有有你要的信息。我前段时间 ...
好的,面向对象跟DXF码的与原理是不一样的是吧??了解不多。。。 vitalgg 发表于 2023-3-12 14:17
有函数没,,能共享下吗!谢谢! 本帖最后由 vitalgg 于 2023-3-12 19:17 编辑
在 CAD 上安装了 @lisp 后 。
输入
(fun:src 函数名)
即可返回函数源代码。
如
(fun:src 'group:list)
也可以在浏览器
https://gitee.com/atlisp/atlisp-lib
src/group/ 下查看源码。
vitalgg 发表于 2023-3-12 19:13
在 CAD 上安装了 @lisp 后 。
输入
(fun:src 函数名)
谢谢,,没用过这个研究下
页:
[1]
2