明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 19835|回复: 49

如何用lisp分别保存多个打印设置为打印页面设置

  [复制链接]
发表于 2011-7-7 20:23 | 显示全部楼层 |阅读模式
  1. ;修改多图档的打印配置示例 By carrot1983 12/1/09
  2. ;xiaoyingzi 修改

  3. (defun ChangePlotConfig (configName styleSheet papersize PlotRotation Plotscale / acApp acDocs layouts)
  4.   (vl-load-com)
  5.   (setq acApp (vlax-get-acad-object))
  6.   (setq acDocs (vla-get-documents acApp))
  7.   (vlax-for doc acDocs
  8.     (setq layouts (vla-get-layouts doc))
  9.     (vlax-for layout layouts
  10.       (vla-put-configname layout configName)           ;打印机
  11.       (vla-put-stylesheet layout styleSheet)           ;打印样式
  12.       (vla-put-CanonicalMediaName layout papersize)    ;图纸尺寸
  13.       (if (= "纵向" PlotRotation)
  14.           (vla-put-PlotRotation layout ac0Degrees)     ;图形方向  纵向
  15.           (vla-put-PlotRotation layout ac90Degrees)    ;图形方向  横向
  16.       )
  17.       (if (= "按图纸空间缩放" Plotscale)
  18.           (vla-put-standardscale layout acScaleToFit)  ;比例      按图纸空间缩放
  19.           (vla-put-standardscale layout ac1_100)       ;比例      1:100
  20.       )
  21.       (vla-put-paperunits layout acMillimeters)        ;单位      米
  22.     )
  23.   )
  24. )


  25. (defun c:a1 ()
  26.   (ChangePlotConfig "\\\\夏秀兰\\HP DesignJet 430" "蜡纸.ctb" "A3" "过大尺寸:ISO A1  (纵向)" "纵向" "1:100" )
  27.   (princ "\n当前打印机Generic 16BW-5,纸张A4,白纸,横向进纸,按图纸空间缩放打印! ")
  28.   (princ)
  29. )

  30. (defun c:a2 ()
  31.   (ChangePlotConfig "\\\\夏秀兰\\HP DesignJet 430" "蜡纸.ctb" "A4" "过大尺寸:ISO A1  (横向)" "横向" "1:100" )
  32.   (princ "\n当前打印机Generic 16BW-5,纸张A4,白纸,横向进纸,按图纸空间缩放打印! ")
  33.   (princ)
  34. )


  35. (defun c:a3 ()
  36.   (ChangePlotConfig "\\\\打印机\\Generic 16BW-5" "白纸.ctb" "A3" "纵向" "按图纸空间缩放" )
  37.   (princ "\n当前打印机Generic 16BW-5,纸张A4,白纸,横向进纸,按图纸空间缩放打印! ")
  38.   (princ)
  39. )

  40. (defun c:a4 ()
  41.   (ChangePlotConfig "\\\\打印机\\Generic 16BW-5" "白纸.ctb" "A4" "横向" "按图纸空间缩放" )
  42.   (princ "\n当前打印机Generic 16BW-5,纸张A4,白纸,横向进纸,按图纸空间缩放打印! ")
  43.   (princ)
  44. )

如上代码,完成了以上4种设置后,如何用lisp实现分别保存这四种设置为四种页面设置,页面设置名默认设置为A1(白纸)、A2(白纸)、A3(蜡纸)、A4(蜡纸)
如果能实现,接下来再用秋枫的批量打印就很爽了
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2015-5-8 14:44 | 显示全部楼层
怎么增加自定义图纸尺寸的设定,比如一些加长图纸

点评

在CAD新建一个纸张尺寸,比如命名“abc"然后在此代码调用“abc"纸张  发表于 2024-1-11 13:10
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-30 09:31 来自手机 | 显示全部楼层
简易的多文件批量打印 1.预先设置好页面设置ps1 2.按照ps1打印打开的几个dwg文件 问题是,程序只能打印当前的dwg文件,求网友查错。  (defun ax:2dpoint (pt)   (vlax-make-variant     (vlax-safearray-fill       (vlax-make-safearray vlax-vbdouble '(0 . 1))       (list (car pt) (cadr pt))     )   ) )  (defun objs-lst        (objs)   (setq obj-lst nil)   (vlax-for obj objs (setq obj-lst (cons obj obj-lst)))   (reverse obj-lst) )  (defun getblock_name-yf        (str var)   (princ str)   (if (and (/= var nil) (/= var ""))     (progn (princ "<") (princ var) (princ ">"))   )   (princ ":")   (if (setq in (entsel ""))     (setq var (cdr (assoc 2 (entget (car in)))))     (eval var)   ) )   ;;;获取打印文件存储位置 (defun qf_getfolder (msg / winshell shfolder path catchit)   (vl-load-com)   (setq winshell (vlax-create-object "Shell.Application"))   (setq shfolder (vlax-invoke-method winshell 'browseforfolder 0 msg 1))   (setq     catchit (vl-catch-all-apply               '(lambda ()                  (setq shfolder (vlax-get-property shfolder 'self))                  (setq path (vlax-get-property shfolder 'path))                )             )   )   (if (vl-catch-all-error-p catchit)     nil     path   ) )  ;;;边界函数AX:GETBOUNDINGBOX (ENT) (defun ax:getboundingbox2 (obj)   (vla-getboundingbox obj 'll 'ur)   (mapcar 'vlax-safearray->list (list ll ur)) )  (defun dwj-plot                 (path doc layout plotcfg drawingframe-blkname) ;;;根据图框块名过滤出某个布局中的图框   (setq drawingframe_lst nil)   (vlax-for block (vla-get-block layout)     (if        (and (= (vla-get-objectname block) "AcDbBlockReference")              (= (vla-get-name block) drawingframe-blkname)         )       (setq drawingframe_lst (cons block drawingframe_lst))     )   )    (setq llurs nil)   (foreach obj drawingframe_lst     (setq llur (ax:getboundingbox2 obj))     (setq ll (reverse (cdr (reverse (car llur)))))     (setq ur (reverse (cdr (reverse (cadr llur))))) ;;;    获取属性变量     (setq var (vla-getattributes obj)) ;;;    属性变量转为属性表     (setq attr-lst (vlax-safearray->list (vlax-variant-value var))) ;;;    根据属性标签,寻找属性文字     (foreach attr attr-lst       (setq tagstring (vla-get-tagstring attr))       (cond         ((= tagstring "图号")          (setq tuhao (vla-get-textstring attr))         )         ((= tagstring "图纸名称")          (setq tuming (vla-get-textstring attr))         )         ((= tagstring "图纸名称1")          (setq tuming1 (vla-get-textstring attr))         )         (t t)       )     )     (setq filename (strcat tuhao "_" tuming tuming1))     (setq llur (list ll ur filename))     (setq llurs (cons llur llurs))   )    (setq llurs (sxzy llurs 10))    (foreach x llurs     (setq ll (car x))     (setq ur (cadr x))     (setq filename (last x)) ;;;设置打印范围     (vla-setwindowtoplot       plotcfg       (ax:2dpoint ll)       (ax:2dpoint ur)     ) ;;;指定页面设置为当前     (vla-copyfrom layout plotcfg) ;;;获取当前页面设置     (setq plot (vla-get-plot doc)) ;;;打印     (vla-plottofile       plot       (strcat path "\\" filename)     )   ) )   (defun c:mp ()   (vl-load-com)   (load "_lib-yf.lsp")   (princ     "\nmp-批量打印-多文件,预设页面设置,打开的文件都将被打印"   )   (setq old (getvar "OSMODE"))   (setvar "OSMODE" 0) ;;;cad     (setq app (vlax-get-acad-object)) ;;;文档   (setq docs (vla-get-documents app)) ;;;当前文档   (setq *doc* (vla-get-activedocument app)) ;;;当前布局   ;;;  (setq *lay* (vla-get-activelayout *doc*)) ;;;页面设置   (setq *plotcfgs* (vla-get-plotconfigurations *doc*))   (setq tmp2 (nth 2 (objs-lst *plotcfgs*))) ;;;页面设置名表   (setq pagesetup_name-lst nil)   (vlax-for *plotcfg* *plotcfgs*     (setq pagesetup_name (vla-get-name *plotcfg*))     (setq modeltype (vla-get-modeltype *plotcfg*))     (setq pagesetup_name-lst (cons pagesetup_name pagesetup_name-lst))   )   (setq pagesetup_name-lst (reverse pagesetup_name-lst))   (setq index 1)   (setq tmp nil)   (foreach x pagesetup_name-lst     (setq tmp (cons (itoa index) tmp))     (setq tmp (cons "->" tmp))     (setq tmp (cons x tmp))     (setq tmp (cons ";" tmp))     (setq index (+ 1 index))   )   (setq tmp (reverse tmp))   (setq string (apply 'strcat tmp))   (setq string (strcat "\n选择页面设置名称<" string ">"))   (setq index2 (getint-yf string index2)) ;;;页面设置名称   (setq pagesetup_name (nth (- index2 1) pagesetup_name-lst)) ;;;页面设置,用户要用的   (setq *plotcfg* (vla-item *plotcfgs* pagesetup_name))    (setq *windowtitle* (vla-get-windowtitle *doc*))   (vlax-for doc        docs ;;;;;;当前文档的页面设置复制到其他文档     (if        (/= (strcase (vla-get-windowtitle doc))             (strcase *windowtitle*)         )       (progn ;;;        在其他文档创建页面设置名为pagesetup_name的页面设置         (setq plotcfg (vla-add                         (vla-get-plotconfigurations doc)                         pagesetup_name                         :vlax-false                       )         ) ;;;将*plotcfg*复制进plotcfg         (vla-copyfrom plotcfg *plotcfg*)         (vlax-for layout (vla-get-layouts doc)           (if (/= (vla-get-name layout) "Model")             (vla-copyfrom               layout               plotcfg             )           )         )       )     )   )    (setq        drawingframe-blkname          (getblock_name-yf            "\n选择图框,获取图框块名"            drawingframe-blkname          )   )   (princ drawingframe-blkname)    (setq path (qf_getfolder "选择打印文件保存位置"))    (vlax-for doc        docs     (setq doc doc)     (setq plotcfgs (vla-get-plotconfigurations doc))     (setq plotcfg (vla-item plotcfgs pagesetup_name)) ;;;    (vla-put-activedocument app doc) ;;;    (vla-activate doc)     (vlax-for layout (vla-get-layouts doc)       (setq name (vla-get-name layout))       (if (/= name "Model")         (dwj-plot path doc layout plotcfg drawingframe-blkname)       )     )   )  ;;;  (setq docs (vla-get-documents (vlax-get-acad-object)))   ;;;  (setq doc (vla-item docs 0)) ;;;  (setq plotcfgs (vla-get-plotconfigurations doc)) ;;;  (setq plotcfg (vla-item plotcfgs "yf-dwg to pdf-A2")) ;;;  (setq layout (vla-get-activelayout doc))   ;;;  (dwj-plot path doc layout plotcfg drawingframe-blkname)    (princ) )
 楼主| 发表于 2019-8-28 10:05 | 显示全部楼层
更新下两个:以前只能获取打印机,不能获取pc3的打印设备,现在可以了

;;; 取得系统默认打印机GetActivePlotDevice
(defun getcurrentprinter ( / app docs)
  (setq app (vlax-get-acad-object))
  (setq docs (vla-get-activedocument app))
  (vla-get-ConfigName
  (vla-get-ActiveLayout docs))
)

;;; 取得系统全部打印设备GetPlotDevices,包括pc3设备
(defun getallprinters ( / app docs)
  (setq app (vlax-get-acad-object))
  (setq docs (vla-get-activedocument app))
  (vla-RefreshPlotDeviceInfo (vla-get-activelayout docs))
  (vlax-safearray->list
    (vlax-variant-value
      (vla-getplotdevicenames
        (vla-item (vla-get-layouts docs) "Model")
       )
     )
   )
)
 楼主| 发表于 2011-8-21 19:06 | 显示全部楼层
本帖最后由 xiaoyingzi 于 2011-8-21 19:11 编辑

花了不少时间,终于自己解决了,最后配上秋枫的批量打印,自己用得很方便了
  1. ;;;xiaoyingzi 2011.08.21

  2. ;;; 修改当前图档的打印配置
  3. (defun ChangePlotConfig (configName styleSheet PlotRotation PaperSize Plotscale CenterPlot / app doc layout newOrigin)
  4.   (vl-load-com)
  5.   (setq app (vlax-get-acad-object)
  6.         doc (vla-get-activedocument app)
  7.         layout (vla-get-activelayout doc)
  8.   )
  9.   (vla-RefreshPlotDeviceInfo layout)
  10.   (vla-put-configname layout configName)           ;打印机
  11.   (vla-put-stylesheet layout styleSheet)           ;打印样式

  12.   (if (= "纵向" PlotRotation)
  13.       (vla-put-PlotRotation layout ac0Degrees)     ;图形方向  纵向
  14.       (vla-put-PlotRotation layout ac90Degrees)    ;图形方向  横向
  15.   )

  16.   (setq index                                      ;开始修改纸张
  17.        (vl-position (strcase PaperSize)
  18.                     (mapcar (function strcase)
  19.                             (GetPaperList1 configName)
  20.                     )
  21.       )
  22.   )
  23.   (vla-put-CanonicalMediaName layout (nth index (GetPaperList2 configName)))
  24.   (princ)

  25.   (if (= "按图纸空间缩放" Plotscale)               ;比例      按图纸空间缩放
  26.       (vla-put-standardscale layout acScaleToFit)
  27.       (progn
  28.       (vla-put-standardscale layout acVpCustomScale)
  29.       (vla-SetCustomScale layout 1 Plotscale)      ;比例      自定义比例1:Plotscale
  30.       )
  31.   )

  32.   (if (= "居中打印" CenterPlot)
  33.       (vla-put-CenterPlot layout :vlax-true)       ;居中打印
  34.       (progn
  35.       (vla-put-CenterPlot layout :vlax-false)      ;不居中打印
  36.       (setq newOrigin (vlax-make-safearray vlax-vbDouble '(0 . 1)))
  37.       (vlax-safearray-fill newOrigin (list 0 0))   ;设定打印偏移x为0,y为0
  38.       (vla-put-PlotOrigin Layout newOrigin)
  39.       )
  40.   )
  41.   ;(vla-SetWindowToPlot layout newOrigin newOrigin)
  42.   ;(vla-put-PlotType layout acWindow)               ;打印范围  窗口

  43.   (vla-put-paperunits layout acMillimeters)        ;单位      米
  44.   (vla-put-PlotWithLineweights layout :vlax-true)  ;true: 使用打印型式中的线宽来打印 false: 使用图形文件中的线宽来打印
  45. )

  46. ;;; 获得某打印机纸张类型列表, 返回形如 "过大尺寸:ISO A2  (纵向)" "过大尺寸:ISO A2  (横向)".... 的列表
  47. ;;; 例:  (setq PaperSizes (GetPaperList1 "HP DesignJet 430 (E/A0) by HP" ))
  48. (defun GetPaperList1 (configName / app canpapersizearr canpapersizelist canpapersizevar app doc index layout papersize)
  49.   (vl-load-com)
  50.   (setq app (vlax-get-acad-object)
  51.         doc (vla-get-activedocument app)
  52.         layout (vla-get-activelayout doc)
  53.   )
  54.   (vla-put-configname layout configName)  ;将打印机设为当前打印机
  55.   (vla-RefreshPlotDeviceInfo layout)
  56.   (setq CanPaperSizeVar (vla-GetCanonicalMediaNames layout)
  57.         CanPaperSizeArr (vlax-variant-value CanPaperSizeVar)
  58.         CanPaperSizeLIst (vlax-safearray->list CanPaperSizeArr)
  59.         PaperSize '()
  60.         index 0
  61.   )
  62.   (repeat (length CanPaperSizeList)
  63.           (setq Papersize (cons (vla-GetLocaleMediaName layout (nth index CanPaperSizeList)) Papersize)
  64.                 index (1+ index)
  65.           )
  66.   )
  67.   (reverse PaperSize)
  68. )

  69. ;;; 获得某打印机纸张类型列表, 返回形如 "User620" "User1644".... 的列表
  70. ;;; 例:  (setq PaperSizes (GetPaperList2 "HP DesignJet 430 (E/A0) by HP" ))
  71. (defun GetPaperList2 (configName / app canpapersizearr canpapersizelist canpapersizevar app doc layout)
  72.   (vl-load-com)
  73.   (setq app (vlax-get-acad-object)
  74.         doc (vla-get-activedocument app)
  75.         layout (vla-get-activelayout doc)
  76.   )
  77.   (vla-put-configname layout configName);将打印机设为当前打印机
  78.   (vla-RefreshPlotDeviceInfo layout)
  79.   (setq CanPaperSizeVar (vla-GetCanonicalMediaNames (vla-item (vla-get-layouts doc) "Model"))
  80.         CanPaperSizeArr (vlax-variant-value CanPaperSizeVar)
  81.         CanPaperSizeLIst (vlax-safearray->list CanPaperSizeArr)
  82.   )
  83. )

  84. ;;; 在当前布局,把当前打印设置添加到一个新的页面设置,并置为当前
  85. ;;; (addPageSetup <PageSetupName>)
  86. ;;; 例: (AddPageSetup ("PageSetupName")
  87. (defun AddPageSetup (name / space pc lay PlotConfig)
  88.   (setq app (vlax-get-acad-object)
  89.         doc (vla-get-activedocument app)
  90.         layout (vla-get-activelayout doc)
  91.   )
  92.   ; 删除已有的打印页面设置
  93.   (vlax-for pc (vla-get-plotconfigurations doc)
  94.     (if (= (strcase (vla-get-name pc)) (strcase name))
  95.         (vla-delete pc)
  96.     )
  97.   )
  98.   ; 添加到新的页面设置
  99.   (if (= (getvar "ctab") "Model")
  100.     (setq space :vlax-true
  101.           lay (vla-get-Layout (vla-get-ModelSpace
  102.                 (vla-get-activedocument (vlax-get-acad-object)))))
  103.     (setq space :vlax-false
  104.           lay (vla-get-ActiveLayout (vla-get-activedocument
  105.                 (vlax-get-acad-object))))
  106.   )
  107.   (setq pc (vla-add
  108.              (vla-get-plotconfigurations doc)
  109.              name
  110.              space))
  111.   (vla-CopyFrom pc lay)
  112.   (vla-put-name pc name)
  113.   ; 把新添加的页面设置置为当前
  114.   (setq PlotConfig (vl-catch-all-apply
  115.          'vla-item
  116.          (list
  117.            (vla-get-PlotConfigurations
  118.        doc
  119.            )
  120.            name
  121.          )
  122.        )
  123.   )
  124.   (if (not (vl-catch-all-error-p PlotConfig))
  125.       (vla-copyfrom layout PlotConfig)
  126.   )
  127. (princ)
  128. )

  129. (defun c:a1 ()
  130.   (ChangePlotConfig "\\\\hp430\\hp designJet 430 (e/a0) by hp"  "蜡纸.ctb" "纵向" "过大尺寸:ISO A1  (纵向)" 100 "不居中打印")
  131.   (AddPageSetup "蜡纸A1")
  132.   (princ "\n当前打印机HP DesignJet 430,蜡纸,纵向进纸,纸张A1,1:100打印比例,居中打印! ")
  133.   (princ "\n当前打印页面设置名为蜡纸A1! ")
  134.   (princ)
  135. )

  136. (defun c:a2 ()
  137.   (ChangePlotConfig "\\\\hp430\\hp designJet 430 (e/a0) by hp"  "蜡纸.ctb" "横向" "过大尺寸:ISO A2  (横向)" 100 "不居中打印")
  138.   (AddPageSetup "蜡纸A2")
  139.   (princ "\n当前打印机HP DesignJet 430,蜡纸,纵向进纸,纸张A2,1:100打印比例,居中打印! ")
  140.   (princ "\n当前打印页面设置名为蜡纸A2! ")
  141.   (princ)
  142. )

  143. (defun c:a3 ()
  144.   (ChangePlotConfig "\\\\打印机\\Generic 16BW-5" "白纸.ctb" "纵向" "A3" "按图纸空间缩放" "居中打印")
  145.   (AddPageSetup "白纸A3")
  146.   (princ "\n当前打印机Generic 16BW-5,白纸,纵向进纸,纸张A3,按图纸空间缩放,居中打印! ")
  147.   (princ "\n当前打印页面设置名为纸张A3! ")
  148.   (princ)
  149. )

  150. (defun c:a4 ()
  151.   (ChangePlotConfig "\\\\打印机\\Generic 16BW-5" "白纸.ctb" "横向" "A4" "按图纸空间缩放" "居中打印")
  152.   (AddPageSetup "白纸A4")
  153.   (princ "\n当前打印机Generic 16BW-5,白纸,横向进纸,纸张A4,按图纸空间缩放,居中打印! ")
  154.   (princ "\n当前打印页面设置名为纸张A4! ")
  155.   (princ)
  156. )

就是其中  
;(vla-SetWindowToPlot layout newOrigin newOrigin)
;(vla-put-PlotType layout acWindow)  
还是有问题,想设置打印范围为窗口模式,SetWindowToPlot 中的那两个点没什么用,因为后面还要用到秋枫的批量打印,
所以随便设了下,但还是不行,不知道什么问题

评分

参与人数 3明经币 +2 金钱 +30 收起 理由
tigcat + 1 很给力!
纳铭m + 1 很给力!
xiaxiang + 30 好帖!

查看全部评分

发表于 2011-8-26 12:42 | 显示全部楼层
支持楼主创新
 楼主| 发表于 2011-8-26 13:25 | 显示全部楼层
本帖最后由 xiaoyingzi 于 2011-8-26 13:26 编辑

大部分代码都是复制来的,只是东拼西凑组装了下而已
发表于 2011-8-27 20:58 | 显示全部楼层
不知楼主这个能不能打印指定文件夹下的全部文件。
发表于 2011-8-28 20:03 | 显示全部楼层
用什么命令调用呀?
 楼主| 发表于 2011-8-29 08:35 | 显示全部楼层
本程序只是打印设置用,调用命令A1,A2,A3,A4,但要改成自己的打印机和相应设置,否则是无法运行的
发表于 2011-10-10 20:09 | 显示全部楼层
好东西引用了。谢谢了。雪中送炭的感觉
发表于 2011-10-16 22:53 | 显示全部楼层
嗯  做个记号 过几天正要编类似程序 这下好了
谢谢楼主
发表于 2012-3-8 12:57 | 显示全部楼层
xiaoyingzi 发表于 2011-8-21 19:06
花了不少时间,终于自己解决了,最后配上秋枫的批量打印,自己用得很方便了
就是其中  
;(vla-SetWindowT ...

我的打印机是局域网的打印机,请问要怎样特别设置吗?我改成了自己的打印机名字和打印样式,但运行程序没有变化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-21 21:14 , Processed in 0.473879 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表