明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: feng582304

[资源] 获取打印机以及相应纸张(更新为批量打印,附件在15楼)

  [复制链接]
发表于 2014-9-19 08:20:45 | 显示全部楼层
多谢多谢,我找了好久的代码终于有了,顶
发表于 2014-9-19 08:33:56 | 显示全部楼层
但打印机和纸张有了,但如何获得纸张的具体规格呢?比如A4的具体规格为297*210,这个规格如何得到呢,打印程序需要用到这个规格来计算打印比例啊。

点评

要先用vla-put-CanonicalMediaName把纸张设为当前,再用vla-GetPaperSize获取纸张尺寸。我试了好像只能这样,不知道还没有其它方法。  发表于 2014-9-26 01:34
 楼主| 发表于 2014-9-26 01:30:22 | 显示全部楼层
clh521 发表于 2014-9-19 08:33
但打印机和纸张有了,但如何获得纸张的具体规格呢?比如A4的具体规格为297*210,这个规格如何得到呢,打印程 ...

给你个更完整可行的。
  1. (defun feng:plot ( ss / layout file dcl nameli sizeli pr w h styleli )
  2.   (setq layout (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object)))
  3.         file (open (setq dcl (VL-FILENAME-MKTEMP nil nil ".dcl")) "w")
  4.         )
  5.   (WRITE-LINE
  6.     "plot:dialog {
  7.     label = "打印配置" ;
  8.     width = 150 ;
  9.     :row {
  10.     :column {
  11.         :list_box {
  12.             label = "打印机名称:" ;
  13.             key = "name" ;
  14.             height = 30 ;
  15.         }
  16.          :list_box {
  17.         label = "样式:" ;
  18.             key = "style" ;
  19.         }
  20.         :text {
  21.                 key = "1" ;
  22.             }
  23.         :text {
  24.                 key = "2" ;
  25.             }
  26.         :text {
  27.                 key = "3" ;
  28.             }
  29.         }
  30.         :list_box {
  31.         label = "纸张:" ;
  32.             key = "size" ;
  33.             height = 50 ;
  34.         }
  35.     }
  36.     ok_cancel;
  37.     }"
  38.     file
  39.     )
  40.   (close file)
  41.   (NEW_DIALOG "plot" (LOAD_DIALOG dcl))
  42.   (START_LIST "name")
  43.   (MAPCAR 'ADD_LIST (setq nameli (vlax-safearray->list (vlax-variant-value (vla-GetPlotDeviceNames layout)))))
  44.   (END_LIST)
  45.   (START_LIST "style")
  46.   (MAPCAR 'ADD_LIST (setq styleli (vlax-safearray->list (vlax-variant-value (vla-GetPlotStyleTableNames layout)))))
  47.   (END_LIST)
  48.   (vla-RefreshPlotDeviceInfo layout)
  49.   (START_LIST "size")
  50.   (MAPCAR 'ADD_LIST (MAPCAR '(LAMBDA (x) (vla-GetLocaleMediaName layout x)) (setq sizeli (vlax-safearray->list (vlax-variant-value (vla-GetCanonicalMediaNames layout))))))
  51.   (END_LIST)
  52.   (SET_TILE "1" (strcat "打印设备:" (vla-get-ConfigName layout)))
  53.   (vla-GetPaperSize layout 'w 'h)
  54.   (SET_TILE "2" (strcat "纸张尺寸:" (vla-GetLocaleMediaName layout (vla-get-CanonicalMediaName layout)) "--(" (itoa (fix w)) "x" (itoa (fix h)) ")"))
  55.   (SET_TILE "3" (Strcat "打印样式:" (nth (atoi (GET_TILE "style")) styleli)))
  56.   (ACTION_TILE "name" "(SET_TILE "1" (strcat "打印设备:" (nth (atoi $VALUE) nameli)))(setq sizeli (feng:plot:size layout nameli $VALUE))")
  57.   (ACTION_TILE "size" "(feng:plot:paper layout sizeli $VALUE)")
  58.   (ACTION_TILE "style" "(SET_TILE "3" (strcat "打印样式:" (nth (atoi $VALUE) styleli)))")
  59.   (ACTION_TILE "accept" "(setq pr (GET_TILE "style")) (DONE_DIALOG 1)")
  60.   (if (= (START_DIALOG) 1) (feng:plot:done layout ss (nth (atoi pr) styleli)))
  61.   )
  62. (defun feng:plot:paper ( layout li nu / w h )
  63.   (vla-put-CanonicalMediaName layout (nth (atoi nu) li))
  64.   (vla-GetPaperSize layout 'w 'h)
  65.   (SET_TILE "2" (strcat "纸张尺寸:" (vla-GetLocaleMediaName layout (vla-get-CanonicalMediaName layout)) "--(" (itoa (fix w)) "x" (itoa (fix h)) ")"))
  66.   (list w h)
  67.   )
  68. (defun feng:plot:size ( layout li nu / sizeli w h )
  69.   (vla-put-ConfigName layout (nth (atoi nu) li))
  70.   (vla-RefreshPlotDeviceInfo layout)
  71.   (START_LIST "size")
  72.   (setq sizeli (vlax-safearray->list (vlax-variant-value (vla-GetCanonicalMediaNames layout))))
  73.   (MAPCAR 'ADD_LIST (MAPCAR '(LAMBDA (x) (vla-GetLocaleMediaName layout x)) sizeli))
  74.   (END_LIST)
  75.   (vla-put-CanonicalMediaName layout (nth 0 sizeli))
  76.   (vla-GetPaperSize layout 'w 'h)
  77.   (SET_TILE "2" (strcat "纸张尺寸:" (vla-GetLocaleMediaName layout (vla-get-CanonicalMediaName layout)) "--(" (itoa (fix w)) "x" (itoa (fix h)) ")"))
  78.   sizeli
  79.   )
  80. (defun feng:plot:done ( layout ss style / driver paper w h bl n li p1 p2 )
  81.   (setq driver (vla-get-ConfigName layout)
  82.         paper (vla-GetLocaleMediaName layout (vla-get-CanonicalMediaName layout))
  83.         bl (getint "\n请输入比例<布满>1=")
  84.         )
  85.   (vla-GetPaperSize layout 'w 'h)
  86.   (repeat (setq n (sslength ss))
  87.     (setq li (cons (vlax-ename->vla-object (ssname ss (setq n (1- n)))) li))
  88.     )
  89.   (setq li (MAPCAR '(LAMBDA (x) (vla-GetBoundingBox x 'p1 'p2) (MAPCAR 'vlax-safearray->list (list p1 p2))) li))
  90.   (MAPCAR '(LAMBDA (x) (command "plot" "y" "" driver paper "m"
  91.                                 (if (and (>= w h) (>= (- (car (last x)) (car (car x))) (- (cadr (last x)) (cadr (car x))))) "l" (progn (setq n w w h h w) "p"))
  92.                                 "y" "w" (car x) (last x)
  93.                                 (if (or (null bl) (<= (* bl w 0.1) (- (car (last x)) (car (car x)))) (<= (* bl h 0.1) (- (cadr (last x)) (cadr (car x)))))
  94.                                   "f"
  95.                                   (strcat "1=" (itoa bl))
  96.                                   )
  97.                                 "c" "y" style "y" "a" "n" "y" "y")) li)
  98.   )
  99. (feng:plot (ssget))
发表于 2014-9-26 16:17:50 | 显示全部楼层

多谢多谢,试了一下可以哦,抽点时间研究下你的程序,现在正想编个适合自已的打印程序呢
 楼主| 发表于 2014-11-12 01:11:09 | 显示全部楼层
本帖最后由 feng582304 于 2014-11-17 23:47 编辑

之前的代码中的横竖向判断有点问题,修改了另一种判断方式,应该说现在比较理想可靠。只提供布满比例的打印方式,因为有比例的话,有时横竖向判断就没有意义了(个人看法)。
针对可能出现因打印设备丢失而造成的错误,重新更新附件。(不知道之前下载的朋友可不可以再下载,如果不行的话请留言)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2014-11-12 08:28:37 | 显示全部楼层
本帖最后由 spp_wall 于 2014-11-12 08:34 编辑

模型状态:ActiveX 服务器返回错误: 无效索引。

布局:Automation 错误。 输入无效

点评

因为打印设置丢失造成的,已更新附件了。  发表于 2014-11-17 23:49
发表于 2014-11-13 00:51:27 来自手机 | 显示全部楼层
确实有楼上的问题

点评

已更新附件,请重新下载。  发表于 2014-11-17 23:50
 楼主| 发表于 2014-11-13 00:56:31 | 显示全部楼层
奇怪,我测试时没有出现以上问题呢。我用的是xp+cad2008,不知道你们用的是什么版本。
提醒:打印机必须是可用状态。
发表于 2014-11-13 11:39:35 | 显示全部楼层
XP+CAD2006
命令: (feng:plot (ssget))

选择对象: 找到 1 个

选择对象:
; 错误: ActiveX 服务器返回错误: 无效索引。

XP+CAD2008
命令: (feng:plot (ssget))

选择对象: 找到 1 个

选择对象:
然后一闪而过
 楼主| 发表于 2014-11-14 00:38:52 | 显示全部楼层
hao3ren 发表于 2014-11-13 11:39
XP+CAD2006
命令: (feng:plot (ssget))

对话框都没出现?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-23 11:37 , Processed in 0.184474 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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