明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 227|回复: 4

关于创建块的三种方法

[复制链接]
发表于 前天 15:58 | 显示全部楼层 |阅读模式
本帖最后由 hubeiwdlue 于 2025-4-2 17:10 编辑

关于创建块,最常用的方法是command方法,简单,实用:

  1. (command "_.block" blkname "non" pt ss "")
  2. (command "_.insert" blkname "x" 1 "y" 1 "z" 1 "r" 0 "non" inspt);插入块  
另外一种常用的方法是entmake方法创建块:
  1. (defun MAKE-BLOCK (ss pt blkName / i num)
  2.     (if (/= (getvar "HANDLES") 1)
  3.       (command "HANDLES" "ON")
  4.     ) ;_ 结束if
  5.     (entmake (list '(0 . "BLOCK")
  6.                (cons 2 blkName)
  7.                '(70 . 0)
  8.                (cons 10 PT)
  9.              ) ;_ 结束list
  10.     ) ;_ 结束entmake
  11.     (setq i -1)
  12.     (repeat (sslength ss)
  13.       (entmake (cdr (entget (ssname ss (setq i (1+ i))))))
  14.     ) ; repeat     
  15.     (setq num (entmake '((0 . "ENDBLK"))))
  16.     (entmake
  17.       (list '(0 . "INSERT")
  18.         (cons 2 num)
  19.         (cons 10 pt)
  20.       ) ;_ 结束list
  21.     ) ;_ 结束entmake
  22.     (command "erase" ss "")
  23.     (entlast)
  24.   )
  25. (setq ss (ssget))
  26. (setq pt (getpoint))
  27. (setq name (getstring))
  28. (MAKE-BLOCK ss pt name)
vla的方法创建块,论坛上没找到完整的例子,问了一下ai,整理了一个vla创建块的代码,如下:
  1. (defun CreateBlockByVLA (ss basePt blkName / acadDoc blkCol blkInsert blockObj UniqueBlockName modelSpace obj)
  2.   (vl-load-com)
  3.   ;; 生成唯一块名
  4.   (defun UniqueBlockName (name / blockTable count newname)
  5.     (setq blockTable (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
  6.     (setq count 1
  7.       newname name)
  8.     (while (not (vl-catch-all-error-p
  9.                   (vl-catch-all-apply 'vla-Item (list blockTable newname))))
  10.       (setq newname (strcat name "$" (itoa count)))
  11.       (setq count (1+ count))
  12.     )
  13.     newname
  14.   )
  15.   (setq acadDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  16.   (setq blkCol (vla-get-Blocks acadDoc))
  17.   (setq modelSpace (vla-get-ModelSpace acadDoc))
  18.   ;; 处理重命名,确保块名唯一
  19.   (setq blkName (UniqueBlockName blkName))
  20.   ;; 创建新块
  21.   (setq blockObj (vlax-invoke blkCol 'Add basePt blkName))
  22.   ;; 复制对象到块定义
  23.   (and ss (= 'pickset (type ss))
  24.     (progn
  25.       (vl-cmdf "SELECT" ss "")
  26.       (ssget "P")
  27.     )
  28.   )
  29.   (vlax-for obj (vla-get-ActiveSelectionSet acadDoc)
  30.     (vla-CopyObjects acadDoc
  31.       (vlax-make-variant
  32.         (vlax-safearray-fill
  33.           (vlax-make-safearray vlax-vbObject '(0 . 0))
  34.           (list obj)
  35.         )
  36.       )
  37.       blockObj
  38.     )
  39.     (vla-Delete obj)
  40.   )
  41.   ;; 在模型空间插入块
  42.   (setq blkInsert (vla-InsertBlock modelSpace
  43.                   (vlax-3d-point basePt) ; 插入点(与块基点相同)
  44.                   blkName                 ; 块名
  45.                   1.0 1.0 1.0              ; X/Y/Z比例
  46.                   0.0                       ; 旋转角度
  47.                 ))
  48.   blkInsert
  49. )
  50. (defun c:tt ()
  51.   (setq ss (ssget))
  52.   (if ss
  53.     (progn
  54.       (setq basePt (getpoint "\n选择块的基点: "))
  55.       (setq blkName (getstring "\n输入块名: "))
  56.       (CreateBlockByVLA ss basePt blkName)
  57.     )
  58.     (princ "\n未选择对象,操作取消。")
  59.   )
  60.   (princ)
  61. )



回复

使用道具 举报

 楼主| 发表于 前天 16:47 | 显示全部楼层
这里有一点需要注意的是,vla方法创建块,如果块重名,会往块里面添加图元,而不是替换。
回复 支持 反对

使用道具 举报

发表于 前天 18:13 | 显示全部楼层
我一般用两种方法,在位编辑和块编辑器中,用vla方法;正常情况下用command命令;
然后entmeke不好用,因为对建属性块不友好
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 18:35 | 显示全部楼层
1028695446 发表于 2025-4-2 18:13
我一般用两种方法,在位编辑和块编辑器中,用vla方法;正常情况下用command命令;
然后entmeke不好用,因 ...

请教,在位编辑应该怎么写呢?
回复 支持 反对

使用道具 举报

发表于 昨天 18:03 来自手机 | 显示全部楼层
1028695446 发表于 2025-4-2 18:13
我一般用两种方法,在位编辑和块编辑器中,用vla方法;正常情况下用command命令;
然后entmeke不好用,因 ...

属性也是可以一起entmake进去的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-4 06:37 , Processed in 0.237080 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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