群组(group)-帮忙补充_子函数
本帖最后由 alexmai 于 2019-3-23 11:28 编辑我在这里找到关于群组(group)的资料
http://bbs.xdcad.net/thread-712340-1-1.html,
发现缺失子函数_GROUPADDORDEL
有能力的大侠可否补上,谢谢!
快捷群组:
(vl-load-com)
(DEFUN c:GGG(/ E EL N SS)
(or *ACAD* (setq *ACAD* (vlax-get-acad-object)))
(or *DOC* (setq *DOC* (vla-get-ActiveDocument *ACAD*)))
;;清理空组
(C:DelEmptyGroup)
;;显示当有组数量
(princ (strcat "\n 当前有 "(itoa (c:GroupsCount))" 个组" ))
;;显示所有组名
(princ (C:AllGroups))
(_StartUndo *DOC*)
(SETQ E (CAR (ENTSEL "\n 组[创建或增减成员/分解]<分解所有组>")))
(if e
(if (_GROUPNAMES e);是组
(_GroupAddOrDel e)
;;选择对象创建组
(if (setq ss (LM:ssget "\n 选择对象创建无名组" nil))
(progn
(ssadd e ss)
(IF (> (SSLENGTH SS) 1)
(PROGN
(repeat (setq n (sslength ss))
(setq eL (cons (ssname ss (setq n (1- n))) eL))
)
(_CreateGroup (mapcar 'vlax-ename->vla-object eL))
(princ "\n 成功创建无名组")
)
(princ "\n 只有一个对象,不能创建组")
)
)
(princ "\n 没有选择对象,不能创建组")
)
)
;;空选时, 分解有的组
(C:DelAllGroups)
)
(_EndUndo *DOC*)
(gc)
(princ "\n 组操作命令 GGG")
(princ)
)
(princ "\n 组操作命令 GGG")
;;1 带提示的ssget
(defun LM:ssget (msg arg / sel )
(princ msg)
(setvar 'nomutt 1)
(setq sel (vl-catch-all-apply 'ssget arg))
(setvar 'nomutt 0)
(if (not (vl-catch-all-error-p sel)) sel)
)
;;2 创建组
(defun _CreateGroup (Objlst)
(or *ACAD* (setq *ACAD* (vlax-get-acad-object)))
(or *DOC* (setq *DOC* (vla-get-ActiveDocument *ACAD*)))
(vla-appenditems
(vla-add (vla-get-groups *DOC*) "*")
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray
vlax-vbobject
(cons 0 (1- (length objlst)))
)
objlst
)
)
)
)
;;3 统计组定义个数
(defun c:GroupsCount ()
(or *ACAD* (setq *ACAD* (vlax-get-acad-object)))
(or *DOC* (setq *DOC* (vla-get-ActiveDocument *ACAD*)))
(vla-get-count (vla-get-groups *DOC*))
)
;;4 删除所有组定义
(defun c:DelAllGroups ()
(or *ACAD* (setq *ACAD* (vlax-get-acad-object)))
(or *DOC* (setq *DOC* (vla-get-ActiveDocument *ACAD*)))
(vlax-for obj (vla-get-groups *DOC*)
(vla-delete obj)
)
)
;;5 删除空组
(defun c:DelEmptyGroup ()
(or *ACAD* (setq *ACAD* (vlax-get-acad-object)))
(or *DOC* (setq *DOC* (vla-get-ActiveDocument *ACAD*)))
(vlax-for obj (vla-get-groups *DOC*)
(if (< (vla-get-count obj) 2)
(vla-delete obj)
)
)
)
;;7 求所有组名 -> ("*A1" "*A2" "2")
(defun C:AllGroups (/ LST)
(setq lst (dictsearch (namedobjdict) "ACAD_GROUP"))
(mapcar 'cdr
(vl-remove-if '(lambda (x) (/= (car x) 3)) lst)
)
)
;;8 实体所在组名 => ("*A4")
;;(_GROUPNAMES (car(entsel)))
(defun _GROUPNAMES (ENAME / KEY DICT RESULT)
(setq KEY(cons 340 ENAME)
DICT (dictsearch (namedobjdict) "acad_group")
)
(while (setq DICT (member (assoc 3 DICT) DICT))
(if (member KEY (entget (cdadr DICT)))
(setq RESULT (cons (cdar DICT) RESULT))
)
(setq DICT (cddr DICT))
)
(reverse RESULT)
)
;;9 分解特定组名的组
;;(_DelOneGroup "*A4")
(defun _DelOneGroup (N)
(or *ACAD* (setq *ACAD* (vlax-get-acad-object)))
(or *DOC* (setq *DOC* (vla-get-ActiveDocument *ACAD*)))
(vlax-for obj (vla-get-groups *DOC*)
(if (= (vla-get-name obj) N)
(vla-delete obj)
)
)
)
群组的好处是,是可以和块(动态块)结合一起使用,检查和修改更方便
群组增加物体,群组减物体,炸特定组,全图删除组,点选显示组名
全搞定了,源码在明经和晓东找的,再总结组合,收个币
本帖最后由 alexmai 于 2021-4-18 17:01 编辑
群组,要配合快捷键使用,才有效率
类似word里的组合,常用地方: 引线+材料号,引线+文字,图框内容组合,列表组合....等等
ctrl + A 是群组的开关
不过要提前设置一下: cui详细设置如下
attach://112944.jpg
attach://112945.jpg
设置后就可以完美使用: ctrl + A 群组开关
lllllja 发表于 2019-3-28 15:17
有没有什么办法,可以往已有组里添加图素,像块一样的操作
组增加物体,组减物体,都已经有了
特别是组减物体,明经,晓东都找过了,也没找到好用的原码。
最后自己编的,但也有小毛病(第一次点选带动态块的组时,组是不认动态块的物体,点其它就没问题) 谢谢! alexmai 分享程序!!!! 有没有什么办法,可以往已有组里添加图素,像块一样的操作 alexmai 发表于 2019-3-29 08:46
组增加物体,组减物体,都已经有了
特别是组减物体,明经,晓东都找过了,也没找到好用的原码。
感谢回复,我再研究一下 alexmai 发表于 2019-3-29 08:46
组增加物体,组减物体,都已经有了
特别是组减物体,明经,晓东都找过了,也没找到好用的原码。
多个物体框选之后 能否批量各自成组 另外 组合物体 能否批量各自成组 依然小小鸟 发表于 2019-3-29 09:01
多个物体框选之后 能否批量各自成组 另外 组合物体 能否批量各自成组
不能,只能单选一个组增加物体,多几个组一起点选,只会变为一个大组合 alexmai 发表于 2019-3-29 09:05
不能,只能单选一个组增加物体,多几个组一起点选,只会变为一个大组合
恩 希望大神攻克这个难关 谢谢分享,正需要
页:
[1]
2