ssget得到的选择集,转为vla集合,谁有好办法?------总结
本帖最后由 自贡黄明儒 于 2013-6-21 14:14 编辑根据各位高手的帮忙,现总结如下:
;;161.1 [功能] 选择集->VlaSS集合
;;(vlax-map-Collection (ss->vlass ss) 'vla-delete)
(defun ss->vlass (ss)
(command "_.select" ss "")
(vla-get-activeselectionset
(vla-get-ActiveDocument (vlax-get-acad-object))
)
)
;;161.2 [功能] lisp选择集或图元转为vla选择集 By namezg
;;(vlax-map-Collection (SS->vlaSS ss) 'vla-delete)
(defun SS->vlaSS1 (ss / *DOC* I OBJLST SARRAY SSET VLA)
(setq *DOC* (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq SSet (vla-get-ActiveSelectionSet *DOC*))
(vla-Clear SSet) ;清空选择集
;;得到VLA物体列表
(repeat (setq i (sslength ss))
(setq vla (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
(setq objlst (cons vla objlst))
)
(setqsArray (vlax-make-safearray
vlax-vbobject
(cons 0 (1- (length objlst)))
)
) ;在数组 SArray 的元素中存储数据
(vlax-safearray-fill sArray objlst)
(vla-AddItems SSet sArray)
SSet
)
;;161.3 [功能] 将一个选择集转化为VLA选择集 By 裸奔的花猫
(defun ss->vlass2 (ss / *DOC* I OBJLST SSET VLA)
(setq*DOC*(vla-get-activedocument (vlax-get-acad-object))
sset (vla-get-SelectionSets *DOC*)
)
;;有选择集$Set,则先删除,或者(vla-Clear $Set)
(if (vl-catch-all-error-p
(vl-catch-all-apply 'vla-item (list sset "$Set"))
)
nil
(vla-delete (vla-item sset "$Set"))
)
(setq SSet (vla-add sset "$Set"));新建一个VLA选择集
;;得到VLA物体列表
(repeat (setq i (sslength ss))
(setq vla (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
(setq objlst (cons vla objlst))
)
(vlax-invoke SSet 'additems objlst)
SSet
)
转集合没必要吧,真的想的话,我知道的只能用AddLine AddCircle...等等
就想在模型空间里添加图元一样,模型空间就是一个集合 本帖最后由 namezg 于 2013-6-16 15:55 编辑
;lisp选择集或图元转为vla选择集
;ss--lisp选择集或图元
;(setq SSet (zg-SS->vla-SSet (ssget)));#<VLA-OBJECT IAcadSelectionSet 0e697004>
;方法一
(defun zg-SS->vla-SSet (ss / AcadObject AcadDocument SSet)
(command "_.select" ss "")
(setq AcadObject (vlax-get-acad-object))
(setq AcadDocument (vla-get-ActiveDocument Acadobject))
(setq SSet (vla-get-ActiveSelectionSet AcadDocument))
;(vla-Highlight SSet "true");亮显选择集
SSet
) 本帖最后由 namezg 于 2013-6-16 15:56 编辑
;lisp选择集或图元转为vla选择集
;ss--lisp选择集或图元
;(setq SSet (zg-SS->vla-SSet (ssget)))
;方法二
(defun zg-SS->vla-SSet (ss / AcadObject AcadDocument SelectionSets SSet SSetName objlst sArray index item)
;功能:lisp选择集或图元转换为vla对象列表
;参数:ss--lisp选择集或图元
;返回:vla对象列表,ss为nil时,返回nil
;(setq objlst (zg-ss->vla-objectlist (ssget)))
;(#<VLA-OBJECT IAcadLine 1fab0e04> #<VLA-OBJECT IAcadLine 1fab0e64> #<VLA-OBJECT IAcadLine 1fab1b84> #<VLA-OBJECT IAcadLine 1fab1044> #<VLA-OBJECT IAcadLine 1fab1164>)
(defun zg-ss->vla-objectlist (ss / i objlst)
(setq objlst '())
(cond
((= (type ss) 'ENAME)
(setq objlst (cons (vlax-ename->vla-object ss) objlst))
)
((= (type ss) 'PICKSET)
(setq i -1)
(repeat (sslength ss)
(setq objlst (cons (vlax-ename->vla-object (ssname ss (setq i (1+ i)))) objlst))
)
)
)
objlst
)
(setq AcadObject (vlax-get-acad-object))
(setq AcadDocument (vla-get-ActiveDocument Acadobject))
;建立一个选择集
(setq SSet (vla-get-ActiveSelectionSet AcadDocument))
(vla-Clear SSet);清空选择集
(setq objlst (zg-ss->vla-objectlist ss))
(setq sArray (vlax-make-safearray vlax-vbobject (cons 0 (1- (length objlst)))))
;在数组 SArray 的元素中存储数据
(vlax-safearray-fill sArray objlst)
(vla-AddItems SSet sArray)
SSet
) 今天在考虑这个问题。如果是vLa阵列选择集用这个就好]。来取经了。 今天在考虑这个问题。如果是vLa阵列选择集用这个就好]。来取经了。 做个记号,;lisp选择集或图元转为vla选择集
不错的程序做个记号 用得到 想知道转了之后的好处 如何不用ssget直接构建VLA选择集呢?最好是也能带有过滤功能的
页:
[1]
2