AutoCAD自动批量打印Autolisp程序
最近经常性的出电气图纸,有时候一个项目会出N多张图,常常是出图的时候点鼠标点到手抽筋。而且我们电气跟机械出图有些习惯不太一样,比如,机械设计师们喜欢每一个DWG文件中只保存一个图纸,而电气设计则喜欢把所有的电气图纸存放于一个DWG文件中。所以网络上的打印程序基本上都不能用,于是研究了一下Autolisp语言,自己编写了一个相当于批处理一样的小程序,用来批量打印同一文件中的图纸。
当然若想打印的时候省些力气,之前绘制电气图纸的时候,应当将图纸规则排列。
源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
(defun C:tmp ( / RowNo LineNo RowSpace LineSpace PrintOrtt) (setq RowNo (getint "n请输入每行图框数:")) (while (<= RowNo 0) (setq RowNo (getint "n*无效输入* n请输入每行图框数:") ) ) (setq LineNo (getint "n请输入每列图框数:")) (while (<= LineNo 0) (setq LineNo (getint "n*无效输入* n请输入每列图框数:") ) ) (setq RectW (getreal "n请输入图框宽度:")) (while (< RectW 0) (setq RectW (getreal "n*无效输入* n请输入图框宽度:") ) ) (setq RectH (getreal "n请输入图框高度:")) (while (< RectH 0) (setq RectH (getreal "n*无效输入* n请输入图框高度:") ) ) (setq LineSpace (getreal "n请输入列间距:")) (while (< LineSpace 0) (setq LineSpace (getreal "n*无效输入* n请输入列间距:") ) ) (setq RowSpace (getreal "n请输入行间距:")) (while (< RowSpace 0) (setq RowSpace (getreal "n*无效输入* n请输入行间距:") ) ) (setq mmmm (getpoint "n请选择打印部分左上角点:")) (print mmmm) (setq PrintOrtt (getstring "n请输入打印方向[横向(L)/纵向(P)]:")) (while (AND (/= PrintOrtt "L") (/= PrintOrtt "P") (/= PrintOrtt "l") (/= PrintOrtt "p") (/= PrintOrtt "横向") (/= PrintOrtt "纵向")) (setq PrintOrtt (getstring "n*无效选择* n请输入打印方向[横向(L)/纵向(P)]:")) ) (if (= PrintOrtt "横向")(setq PrintOrtt "L")) (if (= PrintOrtt "纵向")(setq PrintOrtt "P")) (setq l nil x0 3 y0 RowNo z0 LineNo x 1 y 1 z 1 vlx '() vly '() vlz '() ) (Repeat z0 (Repeat y0 ; (Repeat x0 (setq xx0 (+ (car mmmm) (* (+ RectW LineSpace) (1- y))) yy0 (- (cadr mmmm) (* (+ RectH RowSpace) (1- z))) zz0 (caddr mmmm) vlx (Cons (list xx0 yy0 zz0) vlx ) vlx (Cons (list (- xx0 0.0001) (- (- yy0 RectH) 0.0001) zz0) vlx ) vlx (Cons (list (+ (+ xx0 RectW) 0.0001) (+ yy0 0.0001) zz0) vlx ) x 3 ) ; ) (setq vly (Cons (Reverse vlx) vly) y (1+ y) vlx '() x 1 ) ) (setq vlz (Cons (Reverse vly) vlz) z (1+ z) vly '() y 1 ) ) (setq l (Reverse vlz)) (setq PrintDevic (getstring 1 "n请输入打印设备名[?]:")) (while (eq PrintDevic "?") (setvar "CMDECHO" 0) (command "-PLOT" "Y" "模型" "?" nil) (setvar "CMDECHO" 1) (setq PrintDevic (getstring 1 "n请输入打印设备名[?]:") ) ) (setq mtmp (ver) CadSysVer (substr mtmp 13 4) ) (if (eq CadSysVer "2004") (setq CadSysVer "居中打印" PaperSpcfc "A4")) (if (eq CadSysVer "2006") (setq CadSysVer "C" PaperSpcfc "A4")) (if (eq CadSysVer "2008") (setq CadSysVer "C" PaperSpcfc "ISO A4 (297.00 x 210.00 毫米)")) (While (Progn (InitGet 7 "Exit Print ") (setq k (GetKWord "nExit(退出)/Print(打印): ")) (/= k "Exit") ) (setq y 0 z 0 ) (Repeat z0 (Repeat y0 (command "-PLOT" "Y" "模型" PrintDevic PaperSpcfc "M" PrintOrtt "N" "W" (PrinC(Nth 1 (Nth y (Nth z l)))) (PrinC(Nth 2 (Nth y (Nth z l)))) "F" CadSysVer "Y" "acad.ctb" "N" "W" "N" "N" "Y") (princ y) (princ z) (setq y (1+ y)) ) (setq y 0 z (1+ z)) ) ) (princ) ) |
可能对CAD有点了解的同学们发现了,我用的是plot这个系统自带打印函数,只不过我采用的是命令行的方式”-plot”。如果对AutoLisp不熟悉也不要紧,只要按照以下步骤做就可以了。
1.将上面的源程序复制下来,另存为tmp.lsp文件
2.打开CAD,在CAD命令行中输入ap按下回车,或者点击菜单“工具”-“AutoLisp”-“加载应用程序..”,加载刚才保存的tmp.lsp文件,加载后命令行处会提示“APPLOAD 已成功加载 tmp.lsp。”
3.在CAD命令行中输入tmp,回车后就可以执行这个小程序了。
程序使用说明:
若有如下图所示的12张图纸需要打印,则根据提示依次输入响应的参数即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
命令: tmp 请输入每行图框数:3 请输入每列图框数:4 请输入图框宽度:297 请输入图框高度:210 请输入列间距:22 请输入行间距:20 请选择打印部分左上角点: (1086.93 539.391 0.0) 请输入打印方向[横向(L)/纵向(P)]:L 请输入打印设备名[?]:? 可用打印设备。 "Microsoft XPS Document Writer" "Fax" "Default Windows System Printer.pc3" "DWF6 ePlot.pc3" "DWG To PDF.pc3" "PublishToWeb JPG.pc3" "PublishToWeb PNG.pc3" 请输入打印设备名[?]:DWG To PDF.pc3 Exit(退出)/Print(打印): Print |
其中”获取左上角点”一项可以通过鼠标点击。若不清楚当前可用打印机的名称,在输入打印设备名时输入“?”,则可以调出当前可用的打印设备。
注:本程序只在CAD2004,CAD2006,CAD2008环境下测试过,均可以实现批量打印。且只是给出了A4的程序,当然你可以自己更改相关变量值,以达到打印其他纸张大小的目的。
这篇文章在首页好长啊
改了,以后养成添加more标签的良好习惯~
可悲哦,CAD菜鸟。。。