JonathanP 发表于 2022-7-5 23:20:02

更换打印机

我们有一组dwt,用于以不同格式绘制图形。dwt设置为使用定义的打印机打印,但现在我们有了一个新的打印机,每当我们需要打印旧图纸时,我们必须为每个布局选择新的打印机。
我试图在VBA中构建一个程序,该程序可以识别将使用旧打印机打印的dwt,然后更改其名称配置。结果是dwt正在使用新打印机打印,但布局大小已更改!
 
我知道我可以通过简单地更改dwt来更新打印机以备将来使用,但我们经常需要参考旧图纸,为每个图纸设置打印机是一项耗时的任务。
 
有什么帮助吗?

rkmcswain 发表于 2022-7-5 23:23:49

可以编写-PLOT命令的脚本来更改打印参数。

Lee Mac 发表于 2022-7-5 23:26:41

尝试以下操作(对于活动布局):
 

;; DvcName=Name of Plot Device

(defun PutPlotDevice (DvcNme)
(vl-load-com)
;; Lee Mac~14.01.10

(setq lay (vla-get-ActiveLayout
             (vla-get-ActiveDocument
               (vlax-get-acad-object))))

(vla-RefreshPlotDeviceinfo lay)

(if (vl-position (strcase DvcNme)
       (mapcar (function strcase)
         (vlax-safearray->list
         (vlax-variant-value
             (vla-getPlotDeviceNames lay)))))

   (not (vl-catch-all-error-p
          (vl-catch-all-apply
            (function vla-put-configname)
            (list lay DvcNme))))))

nukecad 发表于 2022-7-5 23:31:00

正如rkmcswain所说,我已经创建了一个工具栏,其中有四个不同绘图仪上不同大小的绘图按钮;这一切都是用宏而不是lisp来完成的,因此它可以与LT一起使用。(其中一组按钮必须调用服务器上打印驱动程序所在的脚本,但这不是什么大问题)。
只要点击一个按钮,就可以将正确大小的绘图发送到我想要的绘图仪,无论上一页的设置如何。
 
如果你愿意的话,我可以在明天回来工作的时候贴些例子。

JonathanP 发表于 2022-7-5 23:34:52

谢谢你们,但我真正想要的是一个VBA例程,它可以在不激活每个布局的情况下更改所有布局打印机设置。我有数百个图纸,每个图纸有40-50个布局,如果我需要单击每个布局,我也可以只键入“plot”,更改打印机,然后单击“apply to layout”。
在这里,我粘贴了我制作的VBA程序的简化版本。它确实改变了打印机设备,但不会保持原来的纸张大小。
 
 
Dim L计为整数
Dim i为整数
作为AcadLayout的Dim lay
 
lcount=此图纸。布局。计数
 
对于i=0到(lcount-1)
 
设置lay=ThisDrawing。布局(一)
 
如果铺设。ConfigName=“旧打印机”
放置ConfigName=“新打印机”
如果结束
 
下一个i

rkmcswain 发表于 2022-7-5 23:36:13

我不一定会使用VBA,尤其是如果你打算在将来使用它的话。VBA已经死了一段时间了,如果你换成64位,使VBA工作的模拟器(或任何你想叫它的东西)也会带来严重的性能损失。
 
从Lee的lisp代码开始,用循环将其包装以在所有视口上工作,然后用循环将其包装以在所有图形上工作(使用ObjectDBX)-允许您使用一个命令修改无限数量的图形。

Lee Mac 发表于 2022-7-5 23:41:59

这应该适用于所有布局,有点耗时,因为RefreshPlotDeviceInfo方法需要一段时间。
 

;; DvcNme=Name of Plot Device

(defun PutPlotDevice_AllLayouts (DvcNme)
(vl-load-com)
;; Lee Mac~15.01.10

(vlax-for lay (vla-get-layouts
               (vla-get-ActiveDocument (vlax-get-acad-object)))

   (vla-RefreshPlotDeviceInfo lay)

   (if (vl-position (strcase DvcNme)
         (mapcar (function strcase) (vlax-invoke lay 'GetPlotDeviceNames)))

   (vla-put-configname lay DvcNme)))

(princ))

Lee Mac 发表于 2022-7-5 23:42:33

 
ObjectDBX的速度非常快,但由于其中涉及(vla save dbx_doc),因此实现Arx代码以保持缩略图很麻烦。。

JonathanP 发表于 2022-7-5 23:46:51

谢谢你rkmcswain,
但我所需要的只是一个暂时问题的临时解决方案。我已经在64位上工作了,我在使用VBA的时候确实遇到了一些问题,但没什么大不了的。在所有视口上工作的lisp代码?我不知道你的意思,正如我所说的,我的问题是布局纸张大小,而不是视口。我不熟悉lisp,但如果它能让我在不激活每个布局的情况下完成这项工作,我会尝试使用李·麦克的lisp。VBA死了?我不这么认为,否则这个论坛不会提到它。我正在学习Visual Basic和其他应用程序,但我知道的还不够,这就是为什么我认为一个简单的VBA例程可以解决我暂时的问题。

Lee Mac 发表于 2022-7-5 23:49:29

 
布局是LISP中的视口
 
VBA肯定已经死了——或者正在朝着那个方向发展,2010年它不再是标准的,正如RKMcSwain所说,64位存在性能问题。
 
我上面的代码将为所有布局设置打印设备(不激活它们)-您可以在脚本中使用它来迭代图形,也可以在ObjectDBX中使用它。
 
页: [1] 2
查看完整版本: 更换打印机