明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 808|回复: 3

[源码] Vlisp的方法创建一个块,返回OBJ对象

[复制链接]
发表于 2022-9-12 16:47:48 | 显示全部楼层 |阅读模式
本帖最后由 9609759 于 2022-9-13 08:52 编辑

分享一个自己写的一个用vlisp的方法,创建块的程序。
最稳定的创建块的方法,速度比command快很多!

  1. ;测试代码
  2. ;将对象转换成块
  3. (defun c:tt ( / )
  4.   (defun ss->ename (ss / x)  ;选择集转图元名的表
  5.     (if ss
  6.       (vl-remove-if-not  ;移除空的
  7.         '(lambda (x)
  8.           (= (type x) 'ename)  ;判断类型是否是图元名
  9.         )
  10.         (mapcar
  11.           'cadr
  12.           (ssnamex ss)    ;选择集改图元名
  13.         )
  14.       )
  15.     )
  16.   )
  17.   (setq ss (ssget))
  18.   (setq lst_ename (ss->ename ss))
  19.   (setq pt (getpoint "请指定基点"))
  20.   ;命令 创建块 ,并在in_pt处插入块 删除选择集  返回插入的块对象
  21.   (setq obj (add_blocks lst_ename pt pt "*U" t))
  22.   (alert (strcat "成功创建块:"(vla-get-Name obj)))
  23.   (princ)
  24. )



;----传入参数说明-----
; 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)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
tigcat + 1 很给力!

查看全部评分

 楼主| 发表于 2022-9-27 17:04:33 | 显示全部楼层
感谢上面提供明经币的几位大哥,现在将代码直接附上!无需下载了



  1. ;----传入参数说明-----
  2. ; lst_ename : 图元名的表
  3. ; pt :块的基点
  4. ; in_pt : 创建完后,插入的块的坐标 , 设置为nil时,只创建块集合对象,不插入块。返回这个块集合的对象!
  5. ; name  : 块的名字  (名字为 "*U" 时,将创建匿名块)
  6. ; dele  ; 指定是否删除原有的对象 ,T or nil ,



  7. ;创建块 ,并在in_pt处插入块 删除选择集  返回插入后的块对象
  8. ;(add_blocks lst_ename pt in_pt "*U" t)

  9. ;创建块 ,并在in_pt处插入块 不删除选择集  返回插入后的块对象
  10. ;(add_blocks lst_ename pt in_pt "*U" nil)

  11. ;创建块 ,不删除选择集 不插入这个块,返回创建的块集合对象
  12. ;(add_blocks lst_ename pt nil "*U" nil)

  13. (defun add_blocks (lst_ename pt in_pt name dele / arr lst_var modspe obj obj_block obj_doc pt1 x y)
  14.         (if (and lst_ename pt name)
  15.                 (progn
  16.                         ;坐标转变体
  17.                         (setq pt1 (vlax-3D-point pt))
  18.                         ;图纸对象
  19.                         (setq obj_doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  20.                         ;模型空间对象
  21.                         (setq modspe (vla-get-modelspace obj_doc))
  22.                         ;创建一个空的块
  23.                         (setq obj_block (vla-Add (vla-get-Blocks obj_doc) pt1 name))
  24.                         ;获取块名
  25.                         (setq name (vla-get-Name obj_block))
  26.                         ;图元名表转变体表
  27.                         (setq lst_var (mapcar '(lambda(x)
  28.                                                                                 (setq obj (vlax-ename->vla-object x))
  29.                                                                                 (vlax-make-variant obj vlax-vbObject)
  30.                                                                         )
  31.                                                                         lst_ename
  32.                                                 )
  33.                         )
  34.                         ;创建一个空的数组
  35.                         (setq arr (vlax-make-safearray vlax-vbobject (cons 0 (- (length lst_var) 1))))
  36.                         ;表装入数组
  37.                         (setq arr (vlax-safearray-fill arr lst_var))
  38.                         ;将数组对象复制到块内
  39.                         (vla-CopyObjects obj_doc arr obj_block)
  40.                         (if dele
  41.                                 (progn
  42.                                         ;删除原有的对象
  43.                                         (mapcar '(lambda(y)
  44.                                                                 (entdel y)
  45.                                                         )
  46.                                                                 lst_ename
  47.                                         )
  48.                                 )
  49.                         )
  50.                         (if in_pt
  51.                                 (progn
  52.                                         ;插入in_pt插入这个块
  53.                                         (vla-InsertBlock modspe (vlax-3D-point in_pt) name 1 1 1 0)
  54.                                 )
  55.                                 obj_block
  56.                         )
  57.                 )
  58.         )
  59. )


发表于 2022-10-8 08:33:11 | 显示全部楼层
学习了,感谢分享,大佬
发表于 2024-7-29 21:47:01 | 显示全部楼层
厉害,感谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-24 11:26 , Processed in 0.190788 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表