请教 是否有WBLOCK增强版的插件 可以自动命名文件?
本帖最后由 开心无惧 于 2025-4-27 17:55 编辑请教大家
wblock 对话框中文件命名每次输入感觉比较麻烦,
想文件名称和路径参考上次的执行,有没有比较好的方法或者其它软件,
下面是希望的操作过程
功能:优化WBLOCK命令,保存文件地址默认用上次的路径,
文件命名自动检测同名文件,数字后缀自动添加编号,非数字后缀自动添加编号“1”;
目的:为了更方便的从已打开的CAD图形中提取局部图形保存为独立的DWG文件
具体功能和步骤如下
1以WBLOCK命令为基础进行优化提升,
2在打开的CAD图纸中,可以先选择若干对象再输入快捷命令RR2,
也可以先输入RR2然后命令行提示选择若干对象,
这两种选择方式都支持所有标准选择方式(窗口选择、交叉选择、点选等)
3接着上一步骤后立即弹出窗口,此窗口是为了对已选择的CAD对象的保存路径进行设置和
对CAD文件名称命名进行设置(此窗口非打开dwg图形用的对话框)
3.1保存路径设置的原则
a首次情况:文件保存路径默认为与已打开的CAD图纸相同路径,也允许可以手动再改为其它路径;
b非首次情况:文件保存路径默认为与上一次文件保存路径,同理也允许可以手动再改为其它路径;
3.2CAD文件名称命名设置原则
a首次情况:第一次执行此代码,此时文件名称输入栏显示为空,此保存窗口会默认为是dwg格式的CAD图形文件;
然后按a.1和a.2两种情况处理
a.1手动输入文件名称:允许用户输入文件名,注意文件名都不包括文件格式后缀“.dwg”;
a.2自动输入文件名称:单击文件保存路径中的其它dwg图形文件后,
则在输入框中自动用刚刚单击选择的那个dwg图形文件名称,
且后缀数字序号自动加1处理,如果原文件名称后缀没有序号自动补充数字1;
使用示例1:
首次保存
输入DWG文件名称:苹果
实际DWG文件名称:苹果1
使用示例2:
首次保存
输入DWG文件名称(单击文件保存路径中的其它dwg图形文件):苹果1
实际DWG文件名称:苹果2
b非首次情况:之前使用此代码保存过其它DWG图形,
此时文件名称输入栏显示为上一次保存的dwg图形文件名称,且后缀数字序号自动加1处理;
b.1手动输入文件名称:允许用户修改文件名;
b.2自动输入文件名称:单击文件保存路径中的其它dwg图形文件后,
则在输入框中自动用刚刚单击选择的那个dwg图形文件名称,且后缀数字序号自动加1处理;
使用示例3:
非首次保存
自动建议:苹果2
非首次保存且存在同名文件时
输入名称:苹果2(已存在)
自动保存:苹果3
c文件命名原则补充:
自动编号系统自动检测同名文件
编号递增逻辑:
苹果A1 → 苹果A2,
支持纯字母名称自动添加编号(如苹果" → "苹果1")
4基点默认值为所选择图形最小外包矩形的左下角点的坐标;
5插入单位设置为毫米mm;
要求齐全,合情合理。 本帖最后由 llsheng_73 于 2025-4-27 18:26 编辑
第2点先选择后输入命令或者反过来,这个很简单,直接执行ssget就可以,比如(defun c:tt(/ s)(and(setq s(ssget))(alert(strcat"已选择"(itoa(sslength s))"个对象")))),不管先命令还是先选择都行
第3点通过getfiled可以解决,当然还需要通过一个东西比如ldata来把当前这个图运行程序后最终所选定的文件夹给记录下来,如果没有就直接使用当前图形的路径
同理最后一次所保存的文件名也需要记录下来
文件名自动加序号的的问题,可以通过VL-DIRECTORY-FILES得到文件夹下指定名字的文件列表,然后数个数就简单了
第4点肯定是多余的,因为又不另外增加图框什么的,直接通过WBLOCK命令行方式运行就行了,这时不会再出现这个命令的对话框,把第三步的得到的文件路径和文件名给写上就行了
第5点,可以通过cad后台打开刚保存的文件,对它的DOC对象执行SetVariable方法来设置系统变量。
至于能不能在当前DWG设置好这个变量后,再通过wblock导出的文件,这个系统变量是否被同步保存,需要实践,感觉是可以的 改用C#,然后只需要深度克隆,
因为C#没有跨文档限制. 本帖最后由 llsheng_73 于 2025-4-27 18:46 编辑
LISP也可以跨文档,比较有效的是另外创建一个cad进程,通过它来收拾其它文档,只是创建对象这一步通常会卡一下,不宜反复搞这一步,可以一开始搞好,然后一直使用它
(setq *ACAD1(vlax-create-object"AutoCAD.application"))
#<VLA-OBJECT IAcadApplication 109c2294>
_$ fi
"C:\\Users\\Administrator\\Desktop\\控制点.dwg"
_$ (setq doc (vlax-invoke-method(vlax-get-property *ACAD1 'documents)'open fi))
#<VLA-OBJECT IAcadDocument 10717374>
_$ (vla-SetVariable doc "insunits" 4)
nil
_$ (vla-getVariable doc "insunits")
#<variant 2 4>
_$ (vla-close doc)
nil
_$ (setq doc (vlax-invoke-method(vlax-get-property *ACAD1 'documents)'open fi))
#<VLA-OBJECT IAcadDocument 1071771c>
_$ (vla-getVariable doc "insunits")
#<variant 2 4>
_$ (vla-quit *ACAD1)
nil
_$ 全部都由程序处理的,没必要开多文档,代码不需要“看见”图形,用DBX更方便。 这个功能我可以写 qq 562860217 llsheng_73 发表于 2025-4-27 18:21
第2点先选择后输入命令或者反过来,这个很简单,直接执行ssget就可以,比如(defun c:tt(/ s)(and(setq s(ss ...
非常感谢
非常感谢
非常感谢 要求齐全,合情合理。 标记备用 kozmosovia 发表于 2025-4-27 22:36
全部都由程序处理的,没必要开多文档,代码不需要“看见”图形,用DBX更方便。
DBX无法设置系统变量,不知道在当前图形设置好系统变量INSUNIT的情况下,导出的图形或者直接通过DBX保存的dwg,这个系统变量同样有效
页:
[1]