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))
对话框都没出现?