明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 702|回复: 14

[提问] 提取文件名称关键字

[复制链接]
发表于 2024-9-7 11:42:55 | 显示全部楼层 |阅读模式
本帖最后由 惜惜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)
)
发表于 2024-9-9 10:00:56 | 显示全部楼层
本帖最后由 lijiao 于 2024-9-9 10:02 编辑

你把下面这段代码保存为lsp文件,然后把这个lsp文件放在启动组里就行了.

每次打开文件时,它都会自动运行一次
  1. (setq filename (vl-filename-base (getvar "dwgname")))
  2. (if (setq space-pos (vl-string-search " " filename))
  3.   (progn
  4.     (setq drawing-number (substr filename 1 space-pos))
  5.     (setq part-name (substr filename (+ space-pos 2)))
  6.     (setq ss (ssget "x"
  7.         '((0 . "INSERT")
  8.           (410 . "Model")
  9.          )
  10.        )
  11.     )
  12.     (repeat (setq n (sslength ss))
  13.       (setq blockref (SSNAME SS (setq n (1- n))))
  14.       (setq blockref (vlax-ename->vla-object blockref))
  15.       (if (= (vla-get-HasAttributes blockref) :vlax-true)
  16.   (foreach attrib  (VLAX-SAFEARRAY->LIST
  17.         (VLAX-VARIANT-VALUE
  18.           (vla-getattributes blockref)
  19.         )
  20.       )
  21.     (cond
  22.       ((= (vla-get-tagstring attrib) "图号")
  23.        (vla-put-textstring attrib drawing-number)
  24.       )
  25.       ((= (vla-get-tagstring attrib) "零件名称")
  26.        (vla-put-textstring attrib part-name)
  27.       )
  28.     )
  29.   )
  30.       )
  31.     )
  32.   )
  33. )
  34. (princ)


 楼主| 发表于 2024-9-19 16:38:23 | 显示全部楼层
  1. (setq filename (vl-filename-base (getvar "dwgname")))
  2. (if (setq space-pos (vl-string-search " " filename))
  3.   (progn
  4.     (setq drawing-number (substr filename 1 space-pos))
  5.     (setq part-name (substr filename (+ space-pos 2)))
  6.     (setq ss (ssget "x" '((0 . "INSERT"))))
  7.     (repeat (setq n (sslength ss))
  8.       (setq blockref (SSNAME SS (setq n (1- n))))
  9.       (setq blockref (vlax-ename->vla-object blockref))
  10.       (if (= (vla-get-HasAttributes blockref) :vlax-true)
  11.         (foreach attrib
  12.                  (VLAX-SAFEARRAY->LIST
  13.                    (VLAX-VARIANT-VALUE (vla-getattributes blockref))
  14.                  )
  15.           (cond        ((= (vla-get-tagstring attrib) "客户图号")
  16.                  (vla-put-textstring attrib drawing-number)
  17.                 )
  18.                 ((= (vla-get-tagstring attrib) "零件名称")
  19.                  (vla-put-textstring attrib part-name)
  20.                 )
  21.                 ((= (vla-get-tagstring attrib) "设计日期")
  22.                  (vla-put-textstring attrib (rtos (getvar "CDATE") 2 0))
  23.                 )
  24.                 (IF
  25.                  (= (vla-get-tagstring attrib) "编号")
  26.                  (setq product-code (vla-get-textstring attrib))
  27.                 )
  28.                 (IF
  29.                  (= (vla-get-tagstring attrib) "客户")
  30.                  (let ((extracted-code (substr product-code 2 3)))
  31.                       (vla-put-textstring attrib extracted-code)
  32.                  )
  33.                 )
  34.           )
  35.         )
  36.       )
  37.     )
  38.   )
  39. )
  40. )
  41. (princ)
发表于 2024-9-7 13:25:26 | 显示全部楼层
惜惜2 发表于 2024-9-7 13:15
这个能放到文本里面直接进行引用吗。相当于creo里面的引用参数需要加符号&一样,cad要加什么符号

字符串连结
(STRCAT [字符串参数1 [字符串参数2]....] )        e.g.     (STRCAT "David
and " "Katy")  Result : "David and Katy"  
如果仅有一个参数,则传回该参数   
若没有提供任何参数,则传回零长度的字符串(空字符串)
发表于 2024-9-7 13:03:02 | 显示全部楼层
(setq filename "1234abc567.dwg")
(substr filename (+ (vl-string-search "abc" filename) 1) 12)

结果:"abc567.dwg"
 楼主| 发表于 2024-9-7 13:15:13 来自手机 | 显示全部楼层
i小小白i 发表于 2024-9-7 13:03
(setq filename "1234abc567.dwg")
(substr filename (+ (vl-string-search "abc" filename) 1) 12)


这个能放到文本里面直接进行引用吗。相当于creo里面的引用参数需要加符号&一样,cad要加什么符号
 楼主| 发表于 2024-9-7 13:50:32 | 显示全部楼层
i小小白i 发表于 2024-9-7 13:25
字符串连结
(STRCAT [字符串参数1 [字符串参数2]....] )        e.g.     (STRCAT "David
and " "Kat ...

这个是要写到LSP才能实现吗?第一次回复的公式是可以提取文件名以及关键字的,放入文本框依旧是文本,并不能像EXCEL单元格一样绝对引用
发表于 2024-9-7 14:05:06 | 显示全部楼层
用DIESEL字段
 楼主| 发表于 2024-9-7 20:42:46 来自手机 | 显示全部楼层
kozmosovia 发表于 2024-9-7 14:05
用DIESEL字段

我是希望做到比如当前文件名为“PRT001.dwg 门板”
自动获取.dwg前门的字符串为零件图号,判断空格之后的字符为零件名称。零件图号和零件名称分别在增强属性块里面定义好位置,自动获取更新。

发表于 2024-9-8 10:27:53 | 显示全部楼层
可以写一个程序来完成更新并不难,写完程序后,让打开文件时自动运行你的更新程序就行了
 楼主| 发表于 2024-9-8 22:31:23 | 显示全部楼层
lijiao 发表于 2024-9-8 10:27
可以写一个程序来完成更新并不难,写完程序后,让打开文件时自动运行你的更新程序就行了

大佬帮忙修正一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 20:05 , Processed in 0.193588 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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