提取文件名称关键字
本帖最后由 惜惜2 于 2024-9-8 19:38 编辑CAD中可以用函数实现吗,类似EXCEL中用函数一样 (=MID(CELL("filename"),FIND("ECN-",CELL("filename")),12))
我是希望做到比如当前文件名为“PRT00001 门板”
自动获取空格前面的字符串为零件图号,判断空格之后的字符为零件名称。零件图号和零件名称分别在增强属性块里面标记定义好位置,自动获取更新。请大佬帮忙修正一下
(defun c:A12 ()
; 获取当前文件名的完整路径
(setq file (findfile (getvar "dwgname")))
(princ "\n获取的文件路径: ")
(princ file)
(if file
; 获取文件名(不带路径)
(progn
(setq filename (vl-filename-base file))
(princ "\n获取的文件名: ")
(princ filename)
; 检查文件名是否为字符串类型且不为空
(if (and (eq (type filename) 'STR) (> (strlen filename) 0))
; 查找文件名中空格的位置
(progn
(setq space-pos (vl-string-search " " filename))
(princ "\n空格位置: ")
(princ space-pos)
(if space-pos
(progn
; 检查 space - pos 的类型是否为数字
(if (numberp space-pos)
(progn
(princ "\n再次检查空格位置: ")
(princ space-pos)
(princ "\n空格位置附近的字符: ")
(if (and (numberp space-pos) (> space-pos 5))
(princ (substr filename (- space - pos 5) (+ space - pos 5)))
(princ "无法获取,因为空格位置太靠近字符串头部")
)
; 获取空格前面的部分作为图号
(setq drawing-number (substr filename 0 space-pos))
; 获取空格后面的部分作为零件名称
(setq part-name (substr filename (+ space-pos 1)))
; 遍历模型空间中的块引用
(vlax-for blockref (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
(vlax-for attrib (vla-getattributes blockref)
(if (equal (vla-get-tagstring attrib) "图号")
(vla-put-textstring attrib drawing-number)
)
(if (equal (vla-get-tagstring attrib) "零件名称")
(vla-put-textstring attrib part-name)
)
)
)
)
(princ "\nspace - pos 不是数字类型.")
)
)
(princ "\n当前文件名格式不正确,未找到空格.")
)
)
(princ "\n获取到的文件名无效.")
)
)
(princ "\n无法获取当前文件信息.")
)
(princ)
)
本帖最后由 lijiao 于 2024-9-9 10:02 编辑
你把下面这段代码保存为lsp文件,然后把这个lsp文件放在启动组里就行了.
每次打开文件时,它都会自动运行一次
(setq filename (vl-filename-base (getvar "dwgname")))
(if (setq space-pos (vl-string-search " " filename))
(progn
(setq drawing-number (substr filename 1 space-pos))
(setq part-name (substr filename (+ space-pos 2)))
(setq ss (ssget "x"
'((0 . "INSERT")
(410 . "Model")
)
)
)
(repeat (setq n (sslength ss))
(setq blockref (SSNAME SS (setq n (1- n))))
(setq blockref (vlax-ename->vla-object blockref))
(if (= (vla-get-HasAttributes blockref) :vlax-true)
(foreach attrib(VLAX-SAFEARRAY->LIST
(VLAX-VARIANT-VALUE
(vla-getattributes blockref)
)
)
(cond
((= (vla-get-tagstring attrib) "图号")
(vla-put-textstring attrib drawing-number)
)
((= (vla-get-tagstring attrib) "零件名称")
(vla-put-textstring attrib part-name)
)
)
)
)
)
)
)
(princ)
(setq filename (vl-filename-base (getvar "dwgname")))
(if (setq space-pos (vl-string-search " " filename))
(progn
(setq drawing-number (substr filename 1 space-pos))
(setq part-name (substr filename (+ space-pos 2)))
(setq ss (ssget "x" '((0 . "INSERT"))))
(repeat (setq n (sslength ss))
(setq blockref (SSNAME SS (setq n (1- n))))
(setq blockref (vlax-ename->vla-object blockref))
(if (= (vla-get-HasAttributes blockref) :vlax-true)
(foreach attrib
(VLAX-SAFEARRAY->LIST
(VLAX-VARIANT-VALUE (vla-getattributes blockref))
)
(cond ((= (vla-get-tagstring attrib) "客户图号")
(vla-put-textstring attrib drawing-number)
)
((= (vla-get-tagstring attrib) "零件名称")
(vla-put-textstring attrib part-name)
)
((= (vla-get-tagstring attrib) "设计日期")
(vla-put-textstring attrib (rtos (getvar "CDATE") 2 0))
)
(IF
(= (vla-get-tagstring attrib) "编号")
(setq product-code (vla-get-textstring attrib))
)
(IF
(= (vla-get-tagstring attrib) "客户")
(let ((extracted-code (substr product-code 2 3)))
(vla-put-textstring attrib extracted-code)
)
)
)
)
)
)
)
)
)
(princ) 惜惜2 发表于 2024-9-7 13:15
这个能放到文本里面直接进行引用吗。相当于creo里面的引用参数需要加符号&一样,cad要加什么符号
字符串连结
(STRCAT [字符串参数1 [字符串参数2]....] ) e.g. (STRCAT "David
and " "Katy")Result : "David and Katy"
如果仅有一个参数,则传回该参数
若没有提供任何参数,则传回零长度的字符串(空字符串) (setq filename "1234abc567.dwg")
(substr filename (+ (vl-string-search "abc" filename) 1) 12)
结果:"abc567.dwg" i小小白i 发表于 2024-9-7 13:03
(setq filename "1234abc567.dwg")
(substr filename (+ (vl-string-search "abc" filename) 1) 12)
这个能放到文本里面直接进行引用吗。相当于creo里面的引用参数需要加符号&一样,cad要加什么符号 i小小白i 发表于 2024-9-7 13:25
字符串连结
(STRCAT [字符串参数1 [字符串参数2]....] ) e.g. (STRCAT "David
and " "Kat ...
这个是要写到LSP才能实现吗?第一次回复的公式是可以提取文件名以及关键字的,放入文本框依旧是文本,并不能像EXCEL单元格一样绝对引用 用DIESEL字段 kozmosovia 发表于 2024-9-7 14:05
用DIESEL字段
我是希望做到比如当前文件名为“PRT001.dwg 门板”
自动获取.dwg前门的字符串为零件图号,判断空格之后的字符为零件名称。零件图号和零件名称分别在增强属性块里面定义好位置,自动获取更新。
可以写一个程序来完成更新并不难,写完程序后,让打开文件时自动运行你的更新程序就行了 lijiao 发表于 2024-9-8 10:27
可以写一个程序来完成更新并不难,写完程序后,让打开文件时自动运行你的更新程序就行了
大佬帮忙修正一下
页:
[1]
2