AutoCAD自动批量打印Autolisp程序

最近经常性的出电气图纸,有时候一个项目会出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

发表评论