马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
千里追凶--通过选组内实体求组定义组名
测试分析:

- (setq a (entget(car(entsel))))
- (setq a360 (entget(cdr(assoc 360 a))))
- ;->得实体词典定义.
- ;((-1 . <图元名: 7ef7cee8>) (0 . "DICTIONARY") (330 . <图元名: 7ef7cea8>) (5 . "A5") (100 . "AcDbDictionary")
- ;(280 . 1) (281 . 1))
- (setq b360 (entget(cdr(assoc 330 a360))))
- ;=> 与a相同!
- ;((-1 . <图元名: 7ef7cea8>) (0 . "LWPOLYLINE") (5 . "9D") (102 . "{ACAD_XDICTIONARY")
- ;(360 . <图元名: 7ef7cee8>) (102 . "}") (102 . "{ACAD_REACTORS") (330 . <图元名: 7ef7cec0>) (102 . "}")
- ;(330 . <图元名: 7ef7cc10>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline")
- ;(90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 33990.7 14713.5) (40 . 0.0) (41 . 0.0) (42 . 0.0)
- ;(10 42287.1 14713.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 42287.1 7262.24) (40 . 0.0) (41 . 0.0) (42 . 0.0)
- ;(10 33990.7 7262.24) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))
- (setq a330 (entget(cdr(assoc 330 a))))
- ;->得组定义,但无组名字.
- ;((-1 . <图元名: 7ef7cec0>) (0 . "GROUP") (5 . "A0") (102 . "{ACAD_REACTORS") (330 . <图元名: 7ef7ccc0>) (102 . "}")
- ;(330 . <图元名: 7ef7ccc0>) (100 . "AcDbGroup") (300 . "") (70 . 0) (71 . 1)
- ;(340 . <图元名: 7ef7ceb0>)(340 . <图元名: 7ef7ceb8>) (340 . <图元名: 7ef7cea8>)) ;;<-组包含的实体.
- (setq b330 (entget(cdr(assoc 330 a330))))
- ;->找到(3 . "XX")为所要找的组名.
- ;((-1 . <图元名: 7ef7ccc0>) (0 . "DICTIONARY") (5 . "18") (102 . "{ACAD_REACTORS") (330 . <图元名: 7ef7ccd0>)
- ;(102 . "}") (330 . <图元名: 7ef7ccd0>) (100 . "AcDbDictionary") (280 . 0) (281 . 1) (3 . "*A1")
- ;(350 . <图元名: 7ef7ced8>) (3 . "1") (350 . <图元名: 7ef7ce68>) (3 . "XX") (350 . <图元名: 7ef7cec0>))
- (setq groupname (cdr(car(cdr(member (cons 350 (cdr(assoc -1 a330))) (reverse b330))))))
- ;->"XX"
;结论:(注:以下方法仅对一重组有效,如实体同属于多个组,则运行结果对应最下层的组)
[php]
;1.求组定义:
;测试: (gpdef (car(entsel)))
(defun gpdef (gpe)
(entget(cdr(assoc 330 (entget gpe))))
)
;2.求组内实体:
;测试:返回-> (<图元名: 7ef7ceb0> <图元名: 7ef7ceb8> <图元名: 7ef7cea8>)
(mapcar 'cdr (vl-remove-if '(lambda(x)(/= 340 (car x))) (gpdef (car(entsel)))))
;3.求组名:
;测试:返回组名-> "xx"
(setq gpdefl (gpdef (car(entsel)))
gpdict (entget(cdr(assoc 330 gpdefl)))
gpname (cdadr(member (cons 350 (cdr(assoc -1 gpdefl))) (reverse gpdict)))
)
[/php]
转贴其它资料及方法:

- ;求组名其它方法----from autocad讨论组.
- ;(gnames (car(entsel))) -> ("XX")
- ;|Reply From: Piercey, Jason
- Date: May/01/01 - 14:41 (GMT)
- Re: Get the name of a group
- |;
- (defun gnames (ename / key dct rtn)
- (setq key (cons 340 ename)
- dct (dictsearch (namedobjdict) "acad_group")
- )
- (while (setq dct (member (assoc 3 dct) dct))
- (if (member key (entget (cdadr dct)))
- (setq rtn (cons (cdar dct) rtn))
- )
- (setq dct (cddr dct))
- )
- (reverse rtn)
- )
- ;|Re: Get the name of a group
- Hi jbryant4
- For A2k try following:
- ;
- ; -- Function VxGetGroupNames
- ; Returns a list of all Group name(s) of the object.
- ; Copyright:
- ; ©2001 MENZI ENGINEERING GmbH, Switzerland
- ; Arguments [Typ]:
- ; Obj = Object [VLA-OBJECT]
- ; Return [Typ]:
- ; > Group name(s) [LIST]
- ; Notes:
- ; Use a DrawingReactor with a 'vlr-beginClose'-event to
- ; release the Gb:AcO and Gb:AcD objects at the end of a
- ; AutoCAD session - otherwise AutoCAD maybe crashes...
- |;
- (defun VxGetGroupNames (Obj / Cur_ID NmeLst)
- (setq Gb:AcO (cond (Gb:AcO)
- (T (vlax-get-acad-object))
- )
- Gb:AcD (cond (Gb:AcD)
- (T (vla-get-activedocument Gb:AcO))
- )
- Cur_ID (vla-get-ObjectID Obj)
- )
- (vlax-for Grp (vla-get-Groups Gb:AcD)
- (vlax-for Ent Grp
- (if (equal (vla-get-ObjectID Ent) Cur_ID)
- (setq NmeLst (cons (vla-get-Name Grp) NmeLst))
- )
- )
- )
- (reverse NmeLst)
- )
- ;Use:
- (if (setq CurEnt (car (entsel)))
- (progn
- (setq CurObj (vlax-ename->vla-object CurEnt)
- GrpLst (VxGetGroupNames CurObj)
- )
- )
- )
[/code] |