寻求批量导出1000个图块不卡的方法
(vla-WBlock)
(vla-SaveAs)
(vla-Export)
采用传统command的方法,会卡到崩溃,无奈只能想别的招,奈何这方面经验不足,故寻求坛友帮助!
恶补了一下vl函数知识,即使摆脱了command,使用vl函数也是会弹窗,看样子只能这样了?
;---将obj图块对象导出指定文件夹
(defun vla_wb(path obj / doc vla_sets vla_ss)
(vl-load-com);加载vl-lisp
(setq doc(vla-get-ActiveDocument(vlax-get-acad-object)))
(setq vla_sets(vla-get-SelectionSets doc));获取当前文档选择集合
(if(vl-catch-all-error-p(vl-catch-all-apply 'vla-item(list vla_sets "vla_ss")))
(setq vla_ss(vla-add vla_sets "vla_ss"))
(progn
(vla-delete(vla-item vla_sets "vla_ss"))
(setq vla_ss(vla-add vla_sets "vla_ss"))
)
)
(vla-AddItemsvla_ss(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbObject '(0 . 0))(list obj))));将对象数组变体加入到vla选择集
(vla-WBlock doc(strcat path "\\"(vla-get-name obj)".dwg")vla_ss)
(vla-Delete vla_ss);删除选择集
)
命令pl32
试试C# kozmosovia 发表于 2025-4-30 11:13
用DBX,没那么多啰嗦,也快很多
循环选择集:
开个DBX
是不是这样,但是我这边没法运行,缺少axdb22.dll模块,只有一个axdb.dll模块,cad2020版本的。
;---导出obj图块对象到指定文件夹
;---patch是文件夹路径,obj是图块对象名
(defun saveas_dbx(patch obj / acad dbx doc var vla_block)
(vl-load-com);加载vl-lisp
(setq acad(vlax-get-acad-object));获取正在运行的CAD程序
(setq doc(vla-get-ActiveDocument acad));获取当前文档
(setq dbx(vla-GetInterfaceObject acad "ObjectDBX.AxDbDocument.22.0"))
(vla-Delete(vla-get-Blocks dbx))
(vla-Delete(vla-get-ModelSpace dbx))
(setq vla_block(vla-Item(vla-get-Blocks doc)(vla-get-Name obj)));获取块定义
(setq var(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbObject '(0 . 0))(list vla_block))));创建对象数组变体
(vla-CopyObjects doc var dbx)
(vla-SaveAs dbx(strcat patch "\\"(vla-get-Name obj)".dwg")48)
(vlax-release-object dbx)
(vlax-release-object var)
)
(defun c:gg()
(setq ss(ssget))
(setq desk(strcat(vla-item(vlax-get(vlax-create-object "wscript.shell")'specialfolders)"desktop")"\\文件加"));获取桌面位置
(vl-mkdir desk)
(setq obj_lst(mapcar 'vlax-ename->vla-object(vl-remove-if 'listp(mapcar 'cadr(ssnamex ss)))))
(foreach obj obj_lst
(saveas_dbx desk obj)
)
(print)
(princ)
)
我在浩辰里试了一下WBLOCK命令,不卡顿呀。
qazxswk 发表于 2025-4-28 16:19
我在浩辰里试了一下WBLOCK命令,不卡顿呀。
我没有表达清楚,,,我意思是循环导出1000个图块,生成1000个文件。每个图块一个文件 qazxswk 发表于 2025-4-28 16:23
你这就是导一个 用DBX,不过用已知的这个几个vla-,按说不应该卡的。
这么简单的需求,找Deepseek应该就能写出来。
kozmosovia 发表于 2025-4-28 16:28
用DBX,不过用已知的这个几个vla-,按说不应该卡的。
这么简单的需求,找Deepseek应该就能写出来。
问了,dp结合vla-saveas+dbx的方式,创建空白文档,再把块复制过去,再另存为,大概是这个思路,奈何无法运行,我也不知道该怎么修。 本帖最后由 你有种再说一遍 于 2025-4-28 17:25 编辑
用C#写一个任务分配器.(本质和批量打印一样)
1,打开图纸,选择要分区的区域,
通常为矩形,并且是指定图层或者颜色,
并且给每个区域一个有序名称.
2,根据区域数量多开cad.
目的是为了规避深度克隆并导出存档时候必然会遇到的单线程问题.
开的数量通常是CPU核心数,然后绑定线程亲和性.
区域%核心数=>处理的区域.
3,开始并行导出矩形范围内的数据.
4,根据导出排序数据(若需要)
我拿你这个测了下,导出999个块,共用79秒,没有卡死,用的(command "_.WBLOCK"......),版本为autocad2014完整版,我猜测可能是精简版或者是版本的问题 wosiguwozai0830 发表于 2025-4-28 17:00
我拿你这个测了下,导出999个块,共用79秒,没有卡死,用的(command "_.WBLOCK"......),版本为autocad2014 ...
7.9秒还能接受,79秒太夸张了
页:
[1]
2