
有时会遇到需要把几十几百甚至几千张图纸拼到一起,或者把这些图纸中的某个图层拼到一起的应用场景;笔者就遇到过需要把3000张地形图的高程点拼到一起然后分析地形的任务。
可以通过CAD二次开发,写一段小程序来应对这种重复无意义的劳动。插件关注本公众号后回复“CAD拼图”获取。

每次使用前根据自己的需要修改以下两个地方:
1、修改文件夹位置
2、修改图层

直接使用文本修改代码中的对应位置,代码另存为.lsp文件。
打开CAD,拖入或者appload(快捷键:ap)加载到CAD中,使用pintu命令启动即可。
注:有底色的那部分保留就是指定图层拼接。删除掉该部分就是CAD所有图层完全拼接。
CAD提供了多种二次开发工具来实现处理自动化,提高生产力。当前AutoCAD的二次开发工具主要有:VisualLisp、VBA、ObjectARX和.NET API等。
AutoLisp是CAD自带的一种代码语言。代码可以在任意的文本编辑器中创建。不过AutoCAD也提供了Visual Lisp编辑器,可以支持语法高亮,调试编译什么的.打开Visual Lisp编辑器有两种方式:1.AutoCAD2008及之前的版本,在菜单栏“工具(Tools)"下面,选择”AutoLisp"---->"Visual Lisp编辑器"。(”AutoLisp"---->"导入应用"这个命令是用来加载AutoLisp脚本的)2.AutoCAD2009及之后的版本,在功能区的”管理“选项卡里可以直接打开Visual Lisp编辑器。
打开Visual Lisp编辑器之后新建一个文件,并另存为Lisp源文件。然后就可以在编辑窗口里输你的代码了。代码编辑并调试确认无错误后,就可以在AutoCAD中使用了。

程序代码
. ;程序用来提取某个文件夹下所有dwg文件中某一个图层,组合起来。
. ;使用程序前需确认待拼接的dwg插入比例相同,否则会导致坐标出问题;
. ;可使用cad批处理工具,使用(setvar "insunits" 4)处理统一比例后再拼接。
. (defun c:pintu (/ path layer files len num dwgname fulldwgname )
. (vl-load-com)
. (setvar "cmdecho" 0)
. (setvar "insunits" 4)
. ;要操作的文件夹路径D:我的文档Desktoptest
. (setq path "D:我的文档Desktoptest")
. (setq files (VL-DIRECTORY-FILES
. path
. "*.dwg"
. 1
. )
. )
. (setq len (length files)
. num 1)
. (foreach dwgname files
. (progn
. (print (strcat "正在拼接第" (itoa num) "张图,共" (itoa len) "张;当前图名" dwgname))
. (setq fulldwgname (strcat path "" dwgname))
. (setvar "clayer" "0") ;设当前层为0层
. (command "-insert" fulldwgname "B" "0,0" "0,0" "1" "" "0")
. ;;;处理动作
. (command "explode" (entlast))
. (setq mm (ssget "X"
. '((-4 . "<NOT")
. (8 . "terp") ;输入要提取的图层名
. (-4 . "NOT>")
. )
. )
. )
. (command "erase" mm "")
. (setq num (+ 1 num))
. )
. )
. (print "拼图完成")
. (princ)
. )
如果只想使用程序,下面代码解释的内容可以不用看了。

代码解析
程序的原理很简单,打开一张空白的CAD图纸,启动程序,程序就一张张的把目标文件夹里的图纸以块的形式插入当前的空白图纸中,然后炸开;如果是只提取其中一个图层,那么就把其他图层删掉,然后插入下一张图纸直到结束。
程序运行起来可能会比较卡,数量多的话最好分几次完成。
由于每张图纸插入比例可能不同,直接使用程序可能会造成坐标不匹配,可以百度下“cad批处理工具”,使用(setvar "insunits" 4)处理统一比例后再拼接。
下面解释下代码每句的作用:
. (defun c:pintu (/ path layer files len num dwgname fulldwgname )
定义了一个程序,使用命令是“pintu”,这里命令可以自己改;整个程序就一个命令。
. (vl-load-com)
. (setvar "cmdecho" 0)
. (setvar "insunits" 4)
一些设定,不用理;
. ;要操作的文件夹路径D:我的文档Desktoptest
. (setq path "D:我的文档Desktoptest")
这里比较重要,把要拼的图放到一个文件夹里,这里的path对应修改成这个文件夹的路径。
. (setq files (VL-DIRECTORY-FILES
. path
. "*.dwg"
. 1
. )
. )
获取目标文件夹下所有的dwg文件名;
. (setq len (length files)
. num 1)
统计要拼接的文件的数量,用来计数;
. (foreach dwgname files
开始对每一张图纸循环操作;
. (progn
. (print (strcat "正在拼接第" (itoa num) "张图,共" (itoa len) "张;当前图名" dwgname))
. (setq fulldwgname (strcat path "" dwgname))
给出进度提示;
组成每一张图纸的完整路径,用来插入块操作;
. (command "-insert" fulldwgname "B" "0,0" "0,0" "1" "" "0")
根据完整路径,插入图纸,"B" "0,0" "0,0" "1" "" "0"这些都是插入块操作需要的参数,在CAD中输入-insert回车,就可以不弹窗使用命令。很多命令前面加个-就可以不弹窗使用了。
. (command "explode" (entlast))
把刚插入的块炸开。
. (setq mm (ssget "X"
. '((-4 . "<NOT")
. (8 . "terp") ;输入要提取的图层名
. (-4 . "NOT>")
. )
. )
. )
创建选择集,为所有的非目标图层对象;如果(8 . "terp")改为(8 . "地形"),那么就会选择所有的“地形”图层以外的对象。
. (command "erase" mm "")
不需要的图层删掉。
. (setq num (+ 1 num))
. )
. )
. (print "拼图完成")
. (princ)
. )
计数,以及结束程序。
如果对CAD二次开发感兴趣的比较多,可以介绍些入门的内容。