- 积分
- 14013
- 明经币
- 个
- 注册时间
- 2013-9-7
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 荒野孤行 于 2017-8-15 21:10 编辑
一份CAD图中包含有多份图档需打印,将每份图档布局后设置打印窗口后运用“发布”功能为PDF文件,将PDF档发给工厂去自行打印,这样方便你我他。
看了秋枫早期公布的批量打印源码,功能挺多的,看着代码犯晕,由于只需要布局功能,故依其源码借鉴出部分功能的实现。
关于选图块图框生成布局的功能,考虑的思路如下:
(1)通过viewsize获取视窗区的高度
(2)通过screensize获取屏幕像素的宽度/高度尺寸
(3)通过viewctr获取视窗区的中心坐标点
(4)计算得出视窗区的左下角、右上角坐标点
(5)批量图块类的图框
(6)获取模型空间的打印设备名称、图纸尺寸、打印样式
(7)新建布局并清空视口
(8)根据前面(1)~(4)步得到的信息设置视口 ,导致布局里面的图框大小&位置与模型里面的有微小偏差 ←这里还是有点问题,在模型空间中所有对象布满后其实在上/下左/右是有空余的,需要知道空余边框宽度是多少,请大神帮忙
(9)计算图框的左下角、右上角坐标点,将打印范围→窗口里面的坐标点设置为此
(10)循环次数...
其它待优化:图块图框的排序
;;;***批量布局 程序开始***
(defun c:bpt ()
(setvar "osmode" 15359)
(setvar "cmdecho" 0)
(princ "\n★批量布局功能的调用命令:bpt;制作者:荒野孤行")
(if (< (atof (getvar "acadver")) 15.0)
(progn
(alert
"此程序为AutoCAD 2000以上的版本设计。不支持AutoCAD R14及以下版本!"
)
(exit)
)
)
(if (= (getvar "tilemode") 0)
(setvar "tilemode" 1)
)
(vl-load-com)
(setq acadobj (vlax-get-acad-object)
doc (vla-get-activedocument acadobj)
active_layout (vla-get-activelayout doc) ;获取当前布局名称
layout_lst (vla-get-layouts doc) ;获取所有布局名称
model_layout (vla-item layout_lst "Model") ;模型空间
)
(vla-refreshplotdeviceinfo active_layout) ;刷新打印设备信息
(setq PlotterLabel
(vla-get-configname active_layout)
) ;获取当前打印设备名称
(if (vl-catch-all-error-p PlotterLabel)
(progn
(vl-catch-all-error-message PlotterLabel)
(princ
"\n请在“打印机/绘图仪→名称”中设置打印设备后,再执行此程序!"
)
(alert
"\n请在“打印机/绘图仪→名称”中设置打印设备后,再执行此程序!"
)
(exit)
)
)
(setq PaperLabel
(vla-GetLocaleMediaName
active_layout
(vla-get-CanonicalMediaName active_layout)
)
) ;获取当前纸张设定选型
(setq PlotStyleLabel
(vla-get-stylesheet active_layout)
) ;获取当前打印样式
(vl-cmdf "_.zoom" "_all")
(setq h (/ (getvar "viewsize") 2.0)) ;获取视窗区的高度
(setq sc (getvar "screensize")) ;获取屏幕的宽度/高度尺寸
(setq w (* h (/ (car sc) (cadr sc)))) ; 计算得出视窗区的宽度
(setq vpctr (getvar "viewctr")) ; 获取视窗区的中心坐标点
(setq vpmin (mapcar '- vpctr (list w h)))
;计算得出视窗区的左下角坐标点
(setq vpmax (mapcar '+ vpctr (list w h)))
;计算得出视窗区的右上角坐标点
(princ "\n请选择图块:")
(if (not (setq ssblock (ssget '((0 . "INSERT")))))
(progn (princ "\n提示:未选中图块,程序退出\n") (exit))
)
(setq i 0)
(repeat (sslength ssblock)
(setq entnam (ssname ssblock i))
(setq obj (vlax-ename->vla-object entnam))
(vla-getboundingbox
obj
'leftdown
'rightup
) ;获取图块的包围盒大小
(setq ptlst (mapcar 'vlax-safearray->list (list leftdown rightup)))
(setq x1 (caar ptlst)
y1 (cadar ptlst)
x2 (caadr ptlst)
y2 (cadadr ptlst)
pt1 (list x1 y1)
pt2 (list x2 y2)
) ;转换后的图块包围盒左下角和右上角坐标点
(if (< (abs (- x1 x2)) (abs (- y1 y2)))
(setq upsidedown T)
(setq upsidedown nil)
) ;判断横向或竖向
(setq laynewnam (strcat "wdy_" (itoa (+ 1 i))))
(vl-cmdf "_.layout"
"_new"
laynewnam
)
(setvar "ctab" laynewnam) ;将布局设为当前
(vl-cmdf "_.ERASE" "_all" "") ;删除布局内所有对象
(vl-cmdf "_.MVIEW" vpmin vpmax) ;新建视口
(layoutset)
(vl-cmdf "_.Zoom" "_all")
(setq i (+ i 1))
)
(setvar "tilemode" 1)
(princ)
)
;;布局设置
(defun layoutset ()
(setq acadobj (vlax-get-acad-object)
active_doc (vla-get-activedocument acadobj)
active_layout (vla-get-activelayout active_doc)
) ;获取当前布局名称
(vla-put-configname active_layout PlotterLabel) ;设置:打印设备名称
(vla-put-stylesheet active_layout PlotStyleLabel) ;设置:打印样式
(vla-put-showplotstyles active_layout :vlax-false)
;设置:不按打印样式
(setq target (getvar "target"))
(vla-SetWindowToPlot
active_layout
(2DPoint (mapcar '- (car ptlst) target))
(2DPoint (mapcar '- (cadr ptlst) target))
) ;设置打印窗口,需放在vla-put-plotType前步执行,否则会出错
(vla-put-PlotType active_layout acWindow) ;打印范围-设置为窗口
(vla-put-CenterPlot active_layout :vlax-true)
;打印偏移-设置为:居中打印
(vla-put-standardscale active_layout acScaleToFit)
;打印比例-设置为:布满图纸
(vla-put-paperunits active_layout acMilliMeters) ;设置图纸单位
(vla-put-plotrotation
active_layout
(if upsidedown
ac270degrees
ac90degrees
)
) ;设置横向或竖向
)
;;2维点列程
(defun 2DPoint (pt)
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray vlax-vbdouble '(0 . 1))
(list (car pt) (cadr pt))
)
)
)
;;;***批量布局 程序结束***
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
评分
-
查看全部评分
|