Vlisp的方法创建一个块,返回OBJ对象
本帖最后由 9609759 于 2022-9-13 08:52 编辑分享一个自己写的一个用vlisp的方法,创建块的程序。
最稳定的创建块的方法,速度比command快很多!
;测试代码
;将对象转换成块
(defun c:tt ( / )
(defun ss->ename (ss / x);选择集转图元名的表
(if ss
(vl-remove-if-not;移除空的
'(lambda (x)
(= (type x) 'ename);判断类型是否是图元名
)
(mapcar
'cadr
(ssnamex ss) ;选择集改图元名
)
)
)
)
(setq ss (ssget))
(setq lst_ename (ss->ename ss))
(setq pt (getpoint "请指定基点"))
;命令 创建块 ,并在in_pt处插入块 删除选择集返回插入的块对象
(setq obj (add_blocks lst_ename pt pt "*U" t))
(alert (strcat "成功创建块:"(vla-get-Name obj)))
(princ)
)
;----传入参数说明-----
; lst_ename : 图元名的表
; pt :块的基点
; in_pt : 创建完后,插入的块的坐标 , 设置为nil时,只创建块集合对象,不插入块。返回这个块集合的对象!
; name: 块的名字(名字为 "*U" 时,将创建匿名块)
; dele; 指定是否删除原有的对象 ,T or nil ,
;示例
;创建块 ,并在in_pt处插入块 删除选择集返回插入后的块对象
;(add_blocks lst_ename pt in_pt "*U" t)
;创建块 ,并在in_pt处插入块 不删除选择集返回插入后的块对象
;(add_blocks lst_ename pt in_pt "*U" nil)
;创建块 ,不删除选择集 不插入这个块,返回创建的块集合对象
;(add_blocks lst_ename pt nil "*U" nil)
感谢上面提供明经币的几位大哥,现在将代码直接附上!无需下载了
;----传入参数说明-----
; lst_ename : 图元名的表
; pt :块的基点
; in_pt : 创建完后,插入的块的坐标 , 设置为nil时,只创建块集合对象,不插入块。返回这个块集合的对象!
; name: 块的名字(名字为 "*U" 时,将创建匿名块)
; dele; 指定是否删除原有的对象 ,T or nil ,
;创建块 ,并在in_pt处插入块 删除选择集返回插入后的块对象
;(add_blocks lst_ename pt in_pt "*U" t)
;创建块 ,并在in_pt处插入块 不删除选择集返回插入后的块对象
;(add_blocks lst_ename pt in_pt "*U" nil)
;创建块 ,不删除选择集 不插入这个块,返回创建的块集合对象
;(add_blocks lst_ename pt nil "*U" nil)
(defun add_blocks (lst_ename pt in_pt name dele / arr lst_var modspe obj obj_block obj_doc pt1 x y)
(if (and lst_ename pt name)
(progn
;坐标转变体
(setq pt1 (vlax-3D-point pt))
;图纸对象
(setq obj_doc (vla-get-ActiveDocument (vlax-get-acad-object)))
;模型空间对象
(setq modspe (vla-get-modelspace obj_doc))
;创建一个空的块
(setq obj_block (vla-Add (vla-get-Blocks obj_doc) pt1 name))
;获取块名
(setq name (vla-get-Name obj_block))
;图元名表转变体表
(setq lst_var (mapcar '(lambda(x)
(setq obj (vlax-ename->vla-object x))
(vlax-make-variant obj vlax-vbObject)
)
lst_ename
)
)
;创建一个空的数组
(setq arr (vlax-make-safearray vlax-vbobject (cons 0 (- (length lst_var) 1))))
;表装入数组
(setq arr (vlax-safearray-fill arr lst_var))
;将数组对象复制到块内
(vla-CopyObjects obj_doc arr obj_block)
(if dele
(progn
;删除原有的对象
(mapcar '(lambda(y)
(entdel y)
)
lst_ename
)
)
)
(if in_pt
(progn
;插入in_pt插入这个块
(vla-InsertBlock modspe (vlax-3D-point in_pt) name 1 1 1 0)
)
obj_block
)
)
)
)
学习了,感谢分享,大佬 厉害,感谢分享!
页:
[1]