明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 973|回复: 10

建块,自动块名称

[复制链接]
发表于 2023-9-27 22:13 | 显示全部楼层 |阅读模式
本帖最后由 117g 于 2023-12-12 21:35 编辑

快速建块,同时将块名称改为文字内容
感谢飞雪大佬提供的源码  (注:块名不能重复)

(整理贴)


发表于 2023-9-27 23:34 | 显示全部楼层
本帖最后由 飞雪神光 于 2023-9-27 23:36 编辑

不考虑选择的图形中是否有文字 块名是否重复
  1. (defun c:tt (/ km lm-ent-block lm-get-box mid pts ss ss-enlst)
  2.         (defun lm-Ent-Block (ss name InsertionPoint / lm-active-document lm-model-space lm-vla-list->array block)
  3.                 (defun lm-active-document nil
  4.                         (eval (list 'defun 'lm-active-document 'nil (vla-get-activedocument (vlax-get-acad-object))))
  5.                         (lm-active-document)
  6.                 )
  7.                 (defun lm-model-space nil
  8.                         (eval (list 'defun 'lm-model-space 'nil (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))))
  9.                         (lm-model-space)
  10.                 )
  11.                 (defun lm-vla-List->Array (nList arraytype)
  12.                         (vlax-SafeArray-Fill
  13.                                 (vlax-Make-SafeArray
  14.                                         arraytype
  15.                                         (cons 0 (1- (length nList)))
  16.                                 )
  17.                                 nList
  18.                         )
  19.                 )
  20.                 (setq ss (lm-vla-List->Array (mapcar 'vlax-ename->vla-object (vl-remove-if-not '(lambda(arg) (equal (type arg) 'ename)) (mapcar 'cadr (ssnamex ss)))) 9))
  21.                 (setq block (vla-add (vla-get-Blocks (lm-active-document)) (vlax-3d-point InsertionPoint) name))
  22.                 (vla-CopyObjects (lm-active-document) ss block)
  23.                 (vla-InsertBlock (lm-model-space) (vlax-3d-point InsertionPoint) (vla-get-Name block) 1 1 1 0)
  24.                 (foreach obj (vlax-safearray->list ss) (vla-delete obj))
  25.                 block
  26.         )        
  27.         (defun ss-enlst(ss / enlst)
  28.                 (cond
  29.                         ((= (type ss) 'PICKSET)
  30.                                 (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex SS)))
  31.                         )
  32.                         ((= (type ss) 'LIST)
  33.                                 (setq enlst (ssadd))
  34.                                 (last (mapcar '(lambda (x) (ssadd x enlst)) ss))
  35.                         )
  36.                 )
  37.         )
  38.         (defun lm-get-box(SS1 / get-enbox get-Extents get-ssbox)
  39.                 (defun get-ssbox (ss / boxlst maxlst minlst objlst)
  40.                         (setq objlst (mapcar 'vlax-ename->vla-object (ss-enlst ss)))
  41.                         (setq boxlst (mapcar 'get-enbox objlst))
  42.                         (setq minlst (mapcar 'car boxlst))
  43.                         (setq maxlst (mapcar 'cadr boxlst))
  44.                         (list
  45.                                 (apply 'mapcar (cons 'min minlst))
  46.                                 (apply 'mapcar (cons 'max maxlst))
  47.                         )
  48.                 )
  49.                 (defun get-enbox (obj)
  50.                         (if (= (type obj) 'ENAME) (setq obj (vlax-ename->vla-object obj)))
  51.                         (vla-getboundingbox obj 'Minp 'Maxp)
  52.                         (mapcar 'vlax-safearray->list (list Minp Maxp))
  53.                 )
  54.                 (defun get-Extents(lst);返回点表最大外框两对角点的表
  55.                         (list
  56.                                 (apply 'mapcar (cons 'min lst))
  57.                                 (apply 'mapcar (cons 'max lst))
  58.                         )
  59.                 )
  60.                 (cond
  61.                         ((= (type SS1) 'PICKSET) (get-ssbox SS1))  ;集
  62.                         ((= (type SS1) 'ENAME) (get-enbox SS1))    ;图元
  63.                         ((= (type SS1) 'LIST) (get-Extents SS1))   ;点表
  64.                         (t nil)
  65.                 )
  66.         )
  67.        (defun get-dxf(en n)
  68.         (if (not (listp en)) (setq en (entget en)))
  69.         (cdr (assoc n en))
  70. )
  71. (defun Mid (p1 p2)(mapcar '(lambda (x) (* x 0.5)) (mapcar '+ p1 p2)))
  72.         (setq ss (ssget '()))
  73.         (foreach ty (ss-enlst ss)
  74.                 (if(wcmatch (get-dxf ty 0) "*TEXT")
  75.                         (setq km(get-dxf ty 1))
  76.                 )
  77.         )
  78.         (setq pts (lm-get-box ss))
  79.         (lm-Ent-Block ss km (apply 'Mid pts))        
  80.         (princ)
  81. )

评分

参与人数 2明经币 +2 收起 理由
117g + 1 辛苦大佬了,功能方面希望再优化下
panliang9 + 1 很给力!

查看全部评分

回复 支持 3 反对 0

使用道具 举报

发表于 2023-9-28 08:03 | 显示全部楼层
飞雪神光 发表于 2023-9-27 23:34
不考虑选择的图形中是否有文字 块名是否重复

高手 能将生成的块 不含文字 ,但块名是文字吗?
发表于 2023-9-28 08:36 | 显示全部楼层
蓝天cayuer 发表于 2023-9-28 08:03
高手 能将生成的块 不含文字 ,但块名是文字吗?

这里加一句就行了
  1. (if(wcmatch (get-dxf ty 0) "*TEXT")
  2.                         (setq km(get-dxf ty 1) ss(ssdel ty ss))
  3.                 )
发表于 2023-9-28 12:44 | 显示全部楼层

大神 加在哪  我是小白
 楼主| 发表于 2023-9-28 13:14 | 显示全部楼层
飞雪神光 发表于 2023-9-27 23:34
不考虑选择的图形中是否有文字 块名是否重复

大佬,图块生成后把原图形也包含进去了,能优化下分离出原选中的图形么?

本帖子中包含更多资源

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

x
发表于 2023-9-28 13:27 | 显示全部楼层
117g 发表于 2023-9-28 13:14
大佬,图块生成后把原图形也包含进去了,能优化下分离出原选中的图形么?

这个是块名重复造成的 改下文字就可以了
发表于 2023-9-28 13:28 | 显示全部楼层
蓝天cayuer 发表于 2023-9-28 12:44
大神 加在哪  我是小白

  1. (defun c:tt (/ km lm-ent-block lm-get-box mid pts ss ss-enlst)
  2.         (defun lm-Ent-Block (ss name InsertionPoint / lm-active-document lm-model-space lm-vla-list->array block)
  3.                 (defun lm-active-document nil
  4.                         (eval (list 'defun 'lm-active-document 'nil (vla-get-activedocument (vlax-get-acad-object))))
  5.                         (lm-active-document)
  6.                 )
  7.                 (defun lm-model-space nil
  8.                         (eval (list 'defun 'lm-model-space 'nil (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))))
  9.                         (lm-model-space)
  10.                 )
  11.                 (defun lm-vla-List->Array (nList arraytype)
  12.                         (vlax-SafeArray-Fill
  13.                                 (vlax-Make-SafeArray
  14.                                         arraytype
  15.                                         (cons 0 (1- (length nList)))
  16.                                 )
  17.                                 nList
  18.                         )
  19.                 )
  20.                 (setq ss (lm-vla-List->Array (mapcar 'vlax-ename->vla-object (vl-remove-if-not '(lambda(arg) (equal (type arg) 'ename)) (mapcar 'cadr (ssnamex ss)))) 9))
  21.                 (setq block (vla-add (vla-get-Blocks (lm-active-document)) (vlax-3d-point InsertionPoint) name))
  22.                 (vla-CopyObjects (lm-active-document) ss block)
  23.                 (vla-InsertBlock (lm-model-space) (vlax-3d-point InsertionPoint) (vla-get-Name block) 1 1 1 0)
  24.                 (foreach obj (vlax-safearray->list ss) (vla-delete obj))
  25.                 block
  26.         )        
  27.         (defun ss-enlst(ss / enlst)
  28.                 (cond
  29.                         ((= (type ss) 'PICKSET)
  30.                                 (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex SS)))
  31.                         )
  32.                         ((= (type ss) 'LIST)
  33.                                 (setq enlst (ssadd))
  34.                                 (last (mapcar '(lambda (x) (ssadd x enlst)) ss))
  35.                         )
  36.                 )
  37.         )
  38.         (defun lm-get-box(SS1 / get-enbox get-Extents get-ssbox)
  39.                 (defun get-ssbox (ss / boxlst maxlst minlst objlst)
  40.                         (setq objlst (mapcar 'vlax-ename->vla-object (ss-enlst ss)))
  41.                         (setq boxlst (mapcar 'get-enbox objlst))
  42.                         (setq minlst (mapcar 'car boxlst))
  43.                         (setq maxlst (mapcar 'cadr boxlst))
  44.                         (list
  45.                                 (apply 'mapcar (cons 'min minlst))
  46.                                 (apply 'mapcar (cons 'max maxlst))
  47.                         )
  48.                 )
  49.                 (defun get-enbox (obj)
  50.                         (if (= (type obj) 'ENAME) (setq obj (vlax-ename->vla-object obj)))
  51.                         (vla-getboundingbox obj 'Minp 'Maxp)
  52.                         (mapcar 'vlax-safearray->list (list Minp Maxp))
  53.                 )
  54.                 (defun get-Extents(lst);返回点表最大外框两对角点的表
  55.                         (list
  56.                                 (apply 'mapcar (cons 'min lst))
  57.                                 (apply 'mapcar (cons 'max lst))
  58.                         )
  59.                 )
  60.                 (cond
  61.                         ((= (type SS1) 'PICKSET) (get-ssbox SS1))  ;集
  62.                         ((= (type SS1) 'ENAME) (get-enbox SS1))    ;图元
  63.                         ((= (type SS1) 'LIST) (get-Extents SS1))   ;点表
  64.                         (t nil)
  65.                 )
  66.         )
  67.         (defun get-dxf(en n)
  68.                 (if (not (listp en)) (setq en (entget en)))
  69.                 (cdr (assoc n en))
  70.         )
  71.         (defun Mid (p1 p2)(mapcar '(lambda (x) (* x 0.5)) (mapcar '+ p1 p2)))
  72.         (setq ss (ssget '()))
  73.         (foreach ty (ss-enlst ss)
  74.                 (if(wcmatch (get-dxf ty 0) "*TEXT")
  75.                         (setq km(get-dxf ty 1) ss(ssdel ty ss))
  76.                 )
  77.         )
  78.         (setq pts (lm-get-box ss))
  79.         (lm-Ent-Block ss km (apply 'Mid pts))        
  80.         (princ)
  81. )
发表于 2023-9-28 14:27 | 显示全部楼层
运行后提示以下
错误: Automation 错误。 调用方法 SetObjectId (接口 IAcadBaseObject) 失败
 楼主| 发表于 2023-11-28 10:55 | 显示全部楼层
蓝天cayuer 发表于 2023-9-28 14:27
运行后提示以下
错误: Automation 错误。 调用方法 SetObjectId (接口 IAcadBaseObject) 失败

没有,插件能正常运行 就是需要块名不能重复,会乱
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-21 17:56 , Processed in 0.261833 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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