最近经常性的出电气图纸,有时候一个项目会出N多张图,常常是出图的时候点鼠标点到手抽筋。而且我们电气跟机械出图有些习惯不太一样,比如,机械设计师们喜欢每一个DWG文件中只保存一个图纸,而电气设计则喜欢把所有的电气图纸存放于一个DWG文件中。所以网络上的打印程序基本上都不能用,于是研究了一下Autolisp语言,自己编写了一个相当于批处理一样的小程序,用来批量打印同一文件中的图纸。
当然若想打印的时候省些力气,之前绘制电气图纸的时候,应当将图纸规则排列。
源码如下:
(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张图纸需要打印,则根据提示依次输入响应的参数即可。
命令: 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的程序,当然你可以自己更改相关变量值,以达到打印其他纸张大小的目的。
版权声明:本文内容来源于网络搜集无法获知原创作者,仅供个人学习用途,若侵犯到您的权益请联系我们及时删除。邮箱:1370723259@qq.com