2024年2月7日发(作者:)

在CAD中运用LISP实现批量打印

王洪杰 张海明

河北省第一测绘院 050031

关键词:CAD AUTOLISP 批量打印 脚本

CAD数字化成图已成为地形测量的主要手段,合理利用LISP文件将可以大大提高图形处理工作效率,避免一些重复性劳动,以及增加准确性。

成果资料验收中地形图资料包含的标准分幅图可能成百上千幅,如果人工打印的话可能需要一天或几天的时间,既浪费人力又浪费精力,如何才能摆脱不断的重复性劳动,使这一切更加人性化呢?使用LISP文件就是一个出路。

SP简介

AUTOLISP是由Autodesk公司开发的一种LISP程序语言。AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令未被提供。通过AutoLISP可以编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。

SP应用

打开AutoCAD命令行执行“dy”(有时加载了某些运行程序后需要全称“appload”)或者点击工具条中AutoLisp中的“加载”,选择需要加载的LISP文件,如打印.lsp(可加入启动组中,以后自动加载)。

(1)编辑脚本文件

由于AUTOLISP只能在CAD环境中运行,而且一般的LISP程序只能在一个图形中执行,如何让某文件夹下所有的图形都执行某一个LISP程序呢?我们只能建立一个脚本,把所有需要打印的图形路径、名称、所要执行的LISP程序都写在

脚本里,通过运行脚本来实现。编辑再好的LISP程序也不如CAD里自带的命令,所以通过CAD命令与LISP相结合,这样既能减少编写程序的工作量又能准确表达出编写者的意图。

下面建立一个符合CAD中SCRIPT命令执行脚本格式的文件。

第一步:选择批量打印LISP文件,生成符合SCRIPT命令可读内容;

(setq selsp (getfiled "选择lisp" "c:/" "lsp" 24))

;;;选择一个LISP程序,如下图;;;

(setq len1 (strlen selsp))

(setq n 1)

(repeat len1

(setq mm (substr selsp n 1))

(if (= mm "")

(setq selsp (strcat (substr selsp 1 (- n 1)) "/" (substr selsp (+ n 1) (- flen1 n) ))))

(setq n (1+ n))

)

(setq str1 (strcat "(load "" selsp """ ")"))

以上程序生成一个调用lisp的字符串。如:(load "E:/程序/打印.lsp")

第二步:建立脚本文件;如下图:

(setq selscr (getfiled "选择脚本" "c:/" "scr" 1))

第三步:选择需要批量打印的文件夹;

(setq ljm (xuanzewenjian))

;;;调用子程序,选择需要批量打印的文件夹。

第四步:打开脚本文件写入符合SCRIPT脚本的内容:

(setq txlist (vl-directory-files ljm "*.dwg"))

(setq i 0)

(setq len (vl-list-length txlist))

(setq neirong (open selscr "w"))

(repeat len

(setq tm (nth i txlist))

(setq str2 (strcat ljm "" tm))

(princ "open" neirong)

(princ "n" neirong)

(princ str2 neirong)

(princ "n" neirong)

(princ str1 neirong)

(princ "n" neirong)

(princ "qsave" neirong)

(princ "n" neirong)

(princ "close" neirong)

(princ "n" neirong)

(setq i (1+ i)))

(close neirong) ;;;关闭脚本文件;;;

第五步:执行脚本文件,开始批量打印;

(command "script" selscr) ;;;运行脚本;;;

;;;以下为选择需要打印的文件的子程序;;;

(defun xuanzewenjian (/ obj folder path)

(vl-load-com)

(setq obj (vlax-create-object "ation"))

(setq folder (vlax-invoke-method

obj

0

1

) )

'browseforfolder

"请指定要打印的DWG文件夹"

(if (vl-catch-all-error-p

(setq path (vl-catch-all-apply

'(lambda

()

(vlax-get-property

(vlax-get-property folder 'self)

'path

) ) ) ) )

nil

path

) )

运行子程序弹出上面对话框,选择需要打印的文件夹即可。

以上为脚本程序,此脚本程序不仅适合批量打印,所有需要批处理的图形都可以使用,只需编写一个lisp文件即可,如:批量关闭不打印图层,批量图纸、实地互转,批量线型启用等,对此脚本稍加改进亦可执行多个LISP 程序。

(2)编辑打印程序

脚本程序已经完成,根据实际情况只需要编写一个图形打印程序即可。

(setq ss (ssget "x" ' ((0 . "insert") (8 . "tk"))))

(setq len (sslength ss))

(setq nam (ssname ss 0))

(setq ent (cdr (assoc 1 (entget nam))))

(setq ent10 (cdr (assoc 10 (entget nam))))

;;获得图框插入点坐标

(setq point1(list (- (car ent10) 10) (- (cadr ent10) 17)))

(setq point2(list (+ (car ent10) 260) (+ (cadr ent10) 217)))

;;;获得打印区域的左下角和右上角坐标

(command "-plot" "y" "" "HP LaserJet 5200L PCL 5e (副本 1)" "A3" "" "l" "n" "W"

POINT1 POINT2 "FIT" "居中打印" "y" "" "y" "a" "n" "n" "y")

;;;执行打印命令,根据实际情况选择打印机名称,纸张类型,调整打印样式

3.结论

运用LISP程序在CAD中基本上可以实现化繁为简、一劳永逸的效果。而且,LISP文件可以随时用记事本编辑修改,编写和加载都非常方便。