智能批量打印程序
本帖最后由 w245272914 于 2018-1-17 17:56 编辑各位大神走过路过,请不要错过!!进来看一看瞧一瞧,吃不了亏上不了当,啦啦啦~~~~
不良原因:附件是lisp程序与模版DWG
该程序有一个缺点不能智能识别打印纵向或者横向的图纸
在程序中设置了 ( "p" ; 輸入圖形方向(縱向:P 橫向:L)
只能縱向打印,而有些图纸是有纵向与横向的
所以:
跪求改一批量打印程序:'(
可以帮忙优化该程序吗,那些不合理的函数,那些重复的函数,那些可以简化的函数:(
可以帮忙优化成更智能吗?智能打印縱向:P 橫向:L,并自动保存PDF到该文件目录就更好了
war32
首先感谢这位大神帮忙修模程序,可以智能打印縱向:P 橫向:L
见程序源码:智能判斷模型空間橫縱_批量打印(源码共享给大家使用)
一、不过问题又来了,能在请大神帮忙实现智能打印縱向:P 橫向:L(已经实现 ),并自动保存PDF到该文件目录就更好了(程序没实现)
二、可以实现多dwg自动打印PDF到工作目录(程序没实现)
lostbalance
又来感谢 :$:$:$~~~
不厌其烦是教导我一步步调试,太感谢了。最终程序测试OK
程序:智能判斷模型空間橫縱_批量打印(DWG To PDF.pc3)
说明:目前只适用CAD本身打印机DWG To PDF.pc3,读取模型空间中的一张张图纸,自动保存为一张张图纸到该文件目录。
顺带问题点:
我喜欢用pdfFactory Pro 打机印,打印质量好,可以用什么函数自动保存到该文件目录吗?
ygp820601 发表于 2017-12-26 10:58
注释的中文都是乱码?
注释,我以为你们可以直接看的懂。55 我们公司是台资产。所以乱码。你试着改改,不行的话,我想办法上传简体的。 w245272914 发表于 2018-1-8 08:51
哥们,你上次也说过该段代码只适用于DWG To PDF.pc3打印机,而不适用pdfFactory Pro打印机
(if ( ...
你说的是合成一个PDF文件吗,那自带的那个好像是不可以吧。不过个人习惯一张图一个PDF,所以对这个就不了解了。ps,公司买了正版Adobe PDF,那个带有做合集功能,偶尔要用也没关系,哈哈。
如果用第三方那个打印机,那我改的代码就基本不能用了。command前面的都可以删了。然后后面打印到文件那个恢复成["n"]。
以为是Adobe PDF打印机的示例:
1. AutoCAD的添加打印机,添加一个Adobe PDF打印机的pc3副本,然后配置这个pc3副本,自定义特性里面把查看PDF结果关闭,然后输出文件夹改为默认Documents\*.pdf。然后用自带的打印功能随便打印一张,看看出来的pdf文件名称是什么,比如["e://desktop//1model.pdf"]。
2. 用上述修改完的代码。然后在后面加上pdf改名的代码,
(vl-file-rename "e://desktop//1model.pdf" "e://desktop//new.pdf")
(vl-file-copy "e://desktop//new.pdf" "e://work//new.pdf")
(vl-file-delete "e://desktop//new.pdf")
然后如果批量的,考虑加入序号之类的。
大概是这样的代码吧,我没用过,你可以测试下。
不过个人感觉兼容性比较差,至少默认的pdf文件名,中英文环境下就不一致,知道的还可以多加几组判断,不知道的就没办法了。 ygp820601 发表于 2017-12-26 10:58
注释的中文都是乱码?
;;需建立打印每幅图范围多段线图框及编号,并且令其处同一图层
;;主程序
(defun c:sxdy ( / cmd doc e2 el2 i i2 itm lst lst1 lst2 msg n os p1 p3 sgel ss1 ss2 tc xy)
(defun *error* (msg)
(setvar "cmdecho" cmd) ;_ 恢复cmdecho系统变量
(setvar "osmode" os) ;_ 恢复osmode系统变量
(princ "error: ")
(princ msg) ;_ 打印错误信息
(princ)
)
(setq cmd (getvar "cmdecho")) ;_ 保存系统变量cmdecho值
(setq os (getvar "osmode"))
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-StartUndoMark doc)
(setvar "osmode" 0)
(setq tc (assoc 8 (entget (car (entsel "\n 请选任选一打印序号==>> ")))))
(command "-layer" "p" "n" (cdr tc) "")
(print "\n 请选择需要打印的范围的图框==>>")
;同时获取图框选择集ss1 文字选择集ss2
(setq ss1 nil ss2 nil)
(if (setq ss1 (ssget (list (cons 0 "TEXT,LWPOLYLINE") tc)))
(foreach itm (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss1)))
(if (= (cdr (assoc 0 (entget itm))) "TEXT")
(progn
(or ss2 (setq ss2 (ssadd)))
(ssadd itm ss2)
(ssdel itm ss1)
)
)
)
)
(setq i2 0)
(setq lst2 nil)
(repeat (sslength ss2)
(setq e2 (ssname ss2 i2))
(setq el2 (entget e2))
(setq lst2 (append lst2 (list (list (read (cdr (assoc 1 el2))) (assoc 10 el2)))))
(setq i2 (1+ i2))
)
(setq lst2 (sort lst2)) ;;已经按图框内数字1,2,3,4进行排序的表lst2 ((序号1 (10 三维点)) (序?2 (10 三号)))
(setq lst2 (vl lst2)) ;;去掉lst2中的序号,重组序号表 lst2
(lstlw ss1) ;; 得到图框角点坐标表lst1
(setq n 0)
(setq lst nil)
(repeat (length lst2)
(setq sgel (nth n lst2)) ;;获取单个序号坐坐标
(setq lst (append lst(pp sgel lst1)));;得到对应图框坐标表
(setq n (1+ n))
)
(setq i 0)
(repeat (length lst)
(setq xy (nth i lst))
(setq p1 (car xy))
(setq p3 (cadr (cdr xy)))
(command "zoom" "w" p1 p3)
(command "-plot" "y" ; 是否需要详细打印配置
"模型" ; 输入布局、模型名称
"pdfFactory Pro" ; 输入输出设备的名称此处举例虚拟打印机 pdfFactory Pro
; (lisp语言中的一个 \ 符号需要用 \\符号表示,即\=>\\)
; 例如:共享打印机 \\Adminstractor\Kyocera KM-2560 KX应该表示为\\\\Adminstractor\\Kyocera KM-2560 KX
"A4" ; 输入图纸尺寸A4
"m" ; 输入图纸单位(I:英寸 M:毫米)
"p" ; 输入图形方向(纵向:P 横向:L)
"n" ; 是否反向打印
"w" ; 输入打印区域(显示:D范围:E图形界限:L 视图:V 窗口:W)
p1 ; 打印图框左下角点坐标
p3 ; 打印图框右上角点坐标
"f" ; 输入打印比例(F:布满)
"c" ; 输入打印偏移(居中打印:C)
"y" ; 是否按样式打印
"monochrome.ctb" ; 输入打印样式名称
"y" ; 是否打印线宽
"a" ; 输入着色打印设置置(按显示:A线框:W
; 消隐:H 渲染:R)
"n" ; 是否打印到文件
"n" ; 是否保存页面设置的修改
"y" ; 是否继续打印
)
(setq i (+ i 1))
)
(setvar "cmdecho" cmd) ;_ 恢复cmdecho系统变量
(setvar "osmode" os) ;_ 恢复osmode系统变量
(vla-EndUndoMark doc)
(vlax-release-object doc)
(princ)
)
;获取图框集合多段点表总表
(defun lstlw (ss)
(setq i1 0)
(setq lst1 nil)
(repeat (sslength ss)
(setq e1 (ssname ss i1))
(setq el1 (LWPL e1))
(setq lst1 (append lst1 (list el1)))
(setq i1 (1+ i1))
)
)
;获取多段线点表函数
(defun LWPL (x /)
(vl-remove-if
'not
(mapcar
'(lambda (x)
(if (= (car x) 10)
(append (cdr x) '(0))
)
)
(entget x)
)
)
)
;;?((1 (10 1117.07 581.131 0.0)) (2 (10 1693.6 596.47 0.0)))中的序号1 2去掉
(defunvl (lst)
(mapcar '(lambda (x)
(cdr (car (cdr x)))
)
lst
)
)
;;提取出对应单个图框的坐标表
(defun pp (pt lst)
(vl-remove-if
'not
(mapcar
'(lambda (x)
(if (= T (isPtinPM pt x))
x
)
)
lst
)
)
)
;;根据文字内容进行表排序
(defun sort (LST / REC)
(defun REC (A B)
;;递归
(cond ((equal (car A) (car B) 1E-4)
(REC (cdr A) (cdr B))
)
(T (< (car A) (car B)))
)
)
(vl-sort LST '(lambda (P1 P2) (REC P1 P2)))
)
;;eg:((1 (10 1117.07 581.131 0.0)) (2 (10 1693.6 596.47 0.0)) (3 (10 2284.33 603.215 0.0)))
;;;******************************************************************************
;;; No.51判断点是否在多边形内(狂刀程序)
;;;xPt是要判断的点坐标(x y z ), Points是多边形顶点列表((x1 y1 z1) (x2 y2 z2)...)
;;;******************************************************************************
(defun isPtinPM(xPt Points)
(equal
PI
(abs
(apply
'+
(mapcar'(lambda (x y) (rem (- (angle xPt x) (angle xPt y)) PI))
(reverse (cdr (reverse (cons (last Points) Points))))
Points
)
)
)
1e-6
) ;end_equal
) ;end_defun
翻译了一下
自古帖子楼主顶~~~~~
水吉空 发表于 2017-12-22 18:07
可以分享LISP吗? 谢谢哥们 没有源码,你让别人怎么给你修改?? 水吉空 发表于 2017-12-22 18:07
这个应该不是lisp hnzkhyyl 发表于 2017-12-22 23:15
没有源码,你让别人怎么给你修改??
上面 的附件就是源码啊~~~ 有一个lisp 有一个测试文件的。 200多个查看,就是没有人大神来帮忙下555 注释的中文都是乱码?