明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 438|回复: 21

[提问] 寻求批量导出1000个图块不卡的方法

[复制链接]
发表于 前天 15:20 | 显示全部楼层 |阅读模式

        (vla-WBlock)
        (vla-SaveAs)
        (vla-Export)
采用传统command的方法,会卡到崩溃,无奈只能想别的招,奈何这方面经验不足,故寻求坛友帮助!

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

 楼主| 发表于 8 小时前 | 显示全部楼层

恶补了一下vl函数知识,即使摆脱了command,使用vl函数也是会弹窗,看样子只能这样了?
  1. ;---将obj图块对象导出指定文件夹
  2. (defun vla_wb(path obj / doc vla_sets vla_ss)
  3.   (vl-load-com);加载vl-lisp
  4.   (setq doc(vla-get-ActiveDocument(vlax-get-acad-object)))
  5.   (setq vla_sets(vla-get-SelectionSets doc));获取当前文档选择集合
  6.   (if(vl-catch-all-error-p(vl-catch-all-apply 'vla-item(list vla_sets "vla_ss")))
  7.     (setq vla_ss(vla-add vla_sets "vla_ss"))
  8.     (progn
  9.       (vla-delete(vla-item vla_sets "vla_ss"))
  10.       (setq vla_ss(vla-add vla_sets "vla_ss"))
  11.     )
  12.   )
  13.   (vla-AddItems  vla_ss(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbObject '(0 . 0))(list obj))));将对象数组变体加入到vla选择集
  14.   (vla-WBlock doc(strcat path "\\"(vla-get-name obj)".dwg")vla_ss)
  15.   (vla-Delete vla_ss);删除选择集
  16. )


点评

选择集不需要删除又创建,重复多了会消耗大量资源,拖累速度。只开一个选择集,先clear再Additems  发表于 4 小时前
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
kozmosovia 发表于 2025-4-30 11:13
用DBX,没那么多啰嗦,也快很多
循环选择集:
   开个DBX


是不是这样,但是我这边没法运行,缺少axdb22.dll模块,只有一个axdb.dll模块,cad2020版本的。
  1. ;---导出obj图块对象到指定文件夹
  2. ;---patch是文件夹路径,obj是图块对象名
  3. (defun saveas_dbx(patch obj / acad dbx doc var vla_block)
  4.   (vl-load-com);加载vl-lisp
  5.   (setq acad(vlax-get-acad-object));获取正在运行的CAD程序
  6.   (setq doc(vla-get-ActiveDocument acad));获取当前文档
  7.   (setq dbx(vla-GetInterfaceObject acad "ObjectDBX.AxDbDocument.22.0"))
  8.   (vla-Delete(vla-get-Blocks dbx))
  9.   (vla-Delete(vla-get-ModelSpace dbx))
  10.   (setq vla_block(vla-Item(vla-get-Blocks doc)(vla-get-Name obj)));获取块定义
  11.   (setq var(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbObject '(0 . 0))(list vla_block))));创建对象数组变体
  12.   (vla-CopyObjects doc var dbx)
  13.   (vla-SaveAs dbx(strcat patch "\\"(vla-get-Name obj)".dwg")48)
  14.   (vlax-release-object dbx)
  15.   (vlax-release-object var)
  16. )
  17. (defun c:gg()
  18.   (setq ss(ssget))
  19.   (setq desk(strcat(vla-item(vlax-get(vlax-create-object "wscript.shell")'specialfolders)"desktop")"\\文件加"));获取桌面位置
  20.   (vl-mkdir desk)
  21.   (setq obj_lst(mapcar 'vlax-ename->vla-object(vl-remove-if 'listp(mapcar 'cadr(ssnamex ss)))))
  22.   (foreach obj obj_lst
  23.     (saveas_dbx desk obj)
  24.   )
  25.   (print)
  26.   (princ)
  27. )

回复 支持 反对

使用道具 举报

发表于 前天 20:09 | 显示全部楼层
aws 发表于 2025-4-28 19:43
这个案例的图块有点过于简单了,随手创建的,我自己测试也44秒,没有卡住。不过,这不是重点,重点是寻找 ...

1,创建后台数据库.
2,深度克隆到后台数据库.
3,保存.
如果你用Lisp的话建议还是要Command,因为存在后台操作.
如果不用Command的话会引起文字偏移.
https://www.cnblogs.com/JJBox/p/10226119.html

规避文字操作是同步工作数据库.
我不知道Lisp是否有此操作?
HostApplicationServices.WorkingDatabase = _database;

所以别想了,这点速度自己适应一下就好了.
实在不行学C#
回复 支持 反对

使用道具 举报

发表于 前天 16:19 | 显示全部楼层
我在浩辰里试了一下WBLOCK命令,不卡顿呀。
回复 支持 反对

使用道具 举报

发表于 前天 16:23 | 显示全部楼层

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 16:25 | 显示全部楼层
qazxswk 发表于 2025-4-28 16:19
我在浩辰里试了一下WBLOCK命令,不卡顿呀。

我没有表达清楚,,,我意思是循环导出1000个图块,生成1000个文件。每个图块一个文件
回复 支持 反对

使用道具 举报

发表于 前天 16:26 | 显示全部楼层

你这就是导一个
回复 支持 反对

使用道具 举报

发表于 前天 16:28 | 显示全部楼层
用DBX,不过用已知的这个几个vla-,按说不应该卡的。
这么简单的需求,找Deepseek应该就能写出来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 16:34 | 显示全部楼层
kozmosovia 发表于 2025-4-28 16:28
用DBX,不过用已知的这个几个vla-,按说不应该卡的。
这么简单的需求,找Deepseek应该就能写出来。

问了,dp结合vla-saveas+dbx的方式,创建空白文档,再把块复制过去,再另存为,大概是这个思路,奈何无法运行,我也不知道该怎么修。
回复 支持 反对

使用道具 举报

发表于 前天 16:59 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-4-28 17:25 编辑

用C#写一个任务分配器.(本质和批量打印一样)
1,打开图纸,选择要分区的区域,
通常为矩形,并且是指定图层或者颜色,
并且给每个区域一个有序名称.
2,根据区域数量多开cad.
目的是为了规避深度克隆并导出存档时候必然会遇到的单线程问题.
开的数量通常是CPU核心数,然后绑定线程亲和性.
区域%核心数=>处理的区域.
3,开始并行导出矩形范围内的数据.
4,根据导出排序数据(若需要)
回复 支持 反对

使用道具 举报

发表于 前天 17:00 | 显示全部楼层
我拿你这个测了下,导出999个块,共用79秒,没有卡死,用的(command "_.WBLOCK"......),版本为autocad2014完整版,我猜测可能是精简版或者是版本的问题

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 17:03 | 显示全部楼层
wosiguwozai0830 发表于 2025-4-28 17:00
我拿你这个测了下,导出999个块,共用79秒,没有卡死,用的(command "_.WBLOCK"......),版本为autocad2014 ...

7.9秒还能接受,79秒太夸张了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-30 19:27 , Processed in 1.573033 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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