【Gu_xl】原创实用工具:Block 自动转为Lisp源代码
本帖最后由 Gu_xl 于 2021-9-23 10:36 编辑程序下载 :
我们在编写AutoCAD应用程序时,经常会使用到符号库,在程序分发时必须将符号库随程序一起分发,一般符号库的图形很多,拷贝分发不是很方便,而且符号库都暴露在任何人面前。为了避免这种情况,将符号在程序中用代码生成是一种很好的办法,但是这么多符号,一句一句用代码来写,好像不太现实!
好了,我这提供一个程序,能够自动将符号转成源代码,成百上千个符号,转瞬间即可全部转为lisp源代码,实现符号库的封装!
请下载附件,加载“图块代码生成器.VLX”调用命令:BlockToLisp.
使用方法:
1、假设符号库文件存放在“c:\符号库\”目录下,新建图形,加载图块代码生成器.VLX,键入命令:blockin,选择“c:\符号库\”目录,将符号库内DWG文件以块全部插入该图形。
2、键入命令:blocktolisp,将刚才插入的图块全部自动生成MakeBlock.Lsp程序文件源码.
3、将MakeBlock.Lsp打包到你的程序文件中,每次插入符号前调用(gxl-Blk-Check 图块名)函数,该函数自动创建图块并返回图块名,如果创建不成功,也返回图块名,即可实现图块的自动定义,如符号库中有符号名为:路灯.dwg文件,则程序自动生成的图块定义函数名为:MakeBlock-路灯 ,块名为:“路灯”,使用如下方法,即可实现图块“路灯”的自动创建和插入:
(command "_insert" (gxl-Blk-Check"路灯") (getpoint "\n图块插入点:") 1 1 0)
gxl-Blk-Check函数代码:
(defun gxl-Blk-Check (B_Name / curlay B_Name1 gxl-Str-Subst)
(defun gxl-Str-Subst (new-str pattern string / s)
(while (/= string
(setq s (vl-string-subst new-str pattern string))
)
(setq string s)
)
string
)
;;替换块名称中括号
(setq B_Name1 (gxl-Str-Subst "]" ")" (gxl-Str-Subst "[" "(" B_Name)))
(setq curlay (getvar "Clayer"))
(if (not (TBLSEARCH "block" B_Name))
(progn
(if
(or (= 'USUBR
(type (eval (read (strcat "MakeBlock-" B_Name1))))
)
(= 'SUBR (type (eval (read (strcat "MakeBlock-" B_Name1)))))
)
(eval (read (strcat "(MakeBlock-" B_Name1 ")")))
)
)
)
(setvar "clayer" curlay)
B_Name
)
版主能不能提供一个 (foo blockname) --> 返回文件句柄或者路径而不是打开文件的接口。我现在想做一个带块预览的GUI的导入同名块工具。核心是你另外一个贴中的用objectdbx导入同名块函数。刚刚翻这个帖子的时候意识到,要是这个生成的文本是稳定的话(主要是顺序稳定),那文本相同块定义就可以认为没有变化,可是这个vlx封装成了生成txt打开了,无法直接使用,如果能提供一个输入块名生成临时文件并返回临时文件路径,这样后续就可以读取文件比较两个块定义了 stonedesign 发表于 2022-9-10 09:48
是的 希望版主更修改下支持动态块就好了,完美
想用代码自动做动态块就可以洗洗睡了。
最好的支持一切的方式是块WBLOCK成DWG再转换成文本格式的TXT作为资源文件打包到VLX中。执行时读取资源文件转TXT为DWG再插入。 MUSIC-DIE 发表于 2021-12-16 15:49
对属性块也可以使用,但是动态块就不行了,我试着做了一个拉伸的动态块 生成代码,代码不能生成动态块 ...
是的 希望版主更修改下支持动态块就好了,完美 本帖最后由 自贡黄明儒 于 2011-2-12 21:59 编辑
版主太有才了!!!我来先尝尝。谢谢啦!!!!
版主太有才了!!! 我也来尝鲜啦 太有才了,太给力了。 谢谢版主的分享。
下载不了 给钱了,又下载不了 版主厉害。这样。我们的图块就不会轻易被借用了。