clh521 发表于 2014-9-19 08:20:45

多谢多谢,我找了好久的代码终于有了,顶

clh521 发表于 2014-9-19 08:33:56

但打印机和纸张有了,但如何获得纸张的具体规格呢?比如A4的具体规格为297*210,这个规格如何得到呢,打印程序需要用到这个规格来计算打印比例啊。

feng582304 发表于 2014-9-26 01:30:22

clh521 发表于 2014-9-19 08:33 static/image/common/back.gif
但打印机和纸张有了,但如何获得纸张的具体规格呢?比如A4的具体规格为297*210,这个规格如何得到呢,打印程 ...

给你个更完整可行的。(defun feng:plot ( ss / layout file dcl nameli sizeli pr w h styleli )
(setq layout (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object)))
        file (open (setq dcl (VL-FILENAME-MKTEMP nil nil ".dcl")) "w")
        )
(WRITE-LINE
    "plot:dialog {
    label = \"打印配置\" ;
    width = 150 ;
    :row {
    :column {
      :list_box {
            label = \"打印机名称:\" ;
            key = \"name\" ;
            height = 30 ;
      }
         :list_box {
      label = \"样式:\" ;
            key = \"style\" ;
      }
      :text {
                key = \"1\" ;
            }
      :text {
                key = \"2\" ;
            }
      :text {
                key = \"3\" ;
            }
      }
      :list_box {
      label = \"纸张:\" ;
            key = \"size\" ;
            height = 50 ;
      }
    }
    ok_cancel;
    }"
    file
    )
(close file)
(NEW_DIALOG "plot" (LOAD_DIALOG dcl))
(START_LIST "name")
(MAPCAR 'ADD_LIST (setq nameli (vlax-safearray->list (vlax-variant-value (vla-GetPlotDeviceNames layout)))))
(END_LIST)
(START_LIST "style")
(MAPCAR 'ADD_LIST (setq styleli (vlax-safearray->list (vlax-variant-value (vla-GetPlotStyleTableNames layout)))))
(END_LIST)
(vla-RefreshPlotDeviceInfo layout)
(START_LIST "size")
(MAPCAR 'ADD_LIST (MAPCAR '(LAMBDA (x) (vla-GetLocaleMediaName layout x)) (setq sizeli (vlax-safearray->list (vlax-variant-value (vla-GetCanonicalMediaNames layout))))))
(END_LIST)
(SET_TILE "1" (strcat "打印设备:" (vla-get-ConfigName layout)))
(vla-GetPaperSize layout 'w 'h)
(SET_TILE "2" (strcat "纸张尺寸:" (vla-GetLocaleMediaName layout (vla-get-CanonicalMediaName layout)) "--(" (itoa (fix w)) "x" (itoa (fix h)) ")"))
(SET_TILE "3" (Strcat "打印样式:" (nth (atoi (GET_TILE "style")) styleli)))
(ACTION_TILE "name" "(SET_TILE \"1\" (strcat \"打印设备:\" (nth (atoi $VALUE) nameli)))(setq sizeli (feng:plot:size layout nameli $VALUE))")
(ACTION_TILE "size" "(feng:plot:paper layout sizeli $VALUE)")
(ACTION_TILE "style" "(SET_TILE \"3\" (strcat \"打印样式:\" (nth (atoi $VALUE) styleli)))")
(ACTION_TILE "accept" "(setq pr (GET_TILE \"style\")) (DONE_DIALOG 1)")
(if (= (START_DIALOG) 1) (feng:plot:done layout ss (nth (atoi pr) styleli)))
)
(defun feng:plot:paper ( layout li nu / w h )
(vla-put-CanonicalMediaName layout (nth (atoi nu) li))
(vla-GetPaperSize layout 'w 'h)
(SET_TILE "2" (strcat "纸张尺寸:" (vla-GetLocaleMediaName layout (vla-get-CanonicalMediaName layout)) "--(" (itoa (fix w)) "x" (itoa (fix h)) ")"))
(list w h)
)
(defun feng:plot:size ( layout li nu / sizeli w h )
(vla-put-ConfigName layout (nth (atoi nu) li))
(vla-RefreshPlotDeviceInfo layout)
(START_LIST "size")
(setq sizeli (vlax-safearray->list (vlax-variant-value (vla-GetCanonicalMediaNames layout))))
(MAPCAR 'ADD_LIST (MAPCAR '(LAMBDA (x) (vla-GetLocaleMediaName layout x)) sizeli))
(END_LIST)
(vla-put-CanonicalMediaName layout (nth 0 sizeli))
(vla-GetPaperSize layout 'w 'h)
(SET_TILE "2" (strcat "纸张尺寸:" (vla-GetLocaleMediaName layout (vla-get-CanonicalMediaName layout)) "--(" (itoa (fix w)) "x" (itoa (fix h)) ")"))
sizeli
)
(defun feng:plot:done ( layout ss style / driver paper w h bl n li p1 p2 )
(setq driver (vla-get-ConfigName layout)
        paper (vla-GetLocaleMediaName layout (vla-get-CanonicalMediaName layout))
        bl (getint "\n请输入比例<布满>1=")
        )
(vla-GetPaperSize layout 'w 'h)
(repeat (setq n (sslength ss))
    (setq li (cons (vlax-ename->vla-object (ssname ss (setq n (1- n)))) li))
    )
(setq li (MAPCAR '(LAMBDA (x) (vla-GetBoundingBox x 'p1 'p2) (MAPCAR 'vlax-safearray->list (list p1 p2))) li))
(MAPCAR '(LAMBDA (x) (command "plot" "y" "" driver paper "m"
                                (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"))
                                "y" "w" (car x) (last x)
                                (if (or (null bl) (<= (* bl w 0.1) (- (car (last x)) (car (car x)))) (<= (* bl h 0.1) (- (cadr (last x)) (cadr (car x)))))
                                  "f"
                                  (strcat "1=" (itoa bl))
                                  )
                                "c" "y" style "y" "a" "n" "y" "y")) li)
)
(feng:plot (ssget))

clh521 发表于 2014-9-26 16:17:50


多谢多谢,试了一下可以哦,抽点时间研究下你的程序,现在正想编个适合自已的打印程序呢

feng582304 发表于 2014-11-12 01:11:09

本帖最后由 feng582304 于 2014-11-17 23:47 编辑

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

spp_wall 发表于 2014-11-12 08:28:37

本帖最后由 spp_wall 于 2014-11-12 08:34 编辑

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

布局:Automation 错误。 输入无效

hao3ren 发表于 2014-11-13 00:51:27

确实有楼上的问题

feng582304 发表于 2014-11-13 00:56:31

奇怪,我测试时没有出现以上问题呢。我用的是xp+cad2008,不知道你们用的是什么版本。
提醒:打印机必须是可用状态。

hao3ren 发表于 2014-11-13 11:39:35

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

选择对象: 找到 1 个

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

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

选择对象: 找到 1 个

选择对象:
然后一闪而过

feng582304 发表于 2014-11-14 00:38:52

hao3ren 发表于 2014-11-13 11:39 static/image/common/back.gif
XP+CAD2006
命令: (feng:plot (ssget))



对话框都没出现?
页: 1 [2] 3 4
查看完整版本: 获取打印机以及相应纸张(更新为批量打印,附件在15楼)