惜惜2 发表于 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)
)

lijiao 发表于 2024-9-9 10:00:56

本帖最后由 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)

惜惜2 发表于 2024-9-19 16:38:23

(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)

i小小白i 发表于 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"
如果仅有一个参数,则传回该参数   
若没有提供任何参数,则传回零长度的字符串(空字符串)

i小小白i 发表于 2024-9-7 13:03:02

(setq filename "1234abc567.dwg")
(substr filename (+ (vl-string-search "abc" filename) 1) 12)

结果:"abc567.dwg"

惜惜2 发表于 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要加什么符号

惜惜2 发表于 2024-9-7 13:50:32

i小小白i 发表于 2024-9-7 13:25
字符串连结
(STRCAT [字符串参数1 [字符串参数2]....] )      e.g.   (STRCAT "David
and " "Kat ...

这个是要写到LSP才能实现吗?第一次回复的公式是可以提取文件名以及关键字的,放入文本框依旧是文本,并不能像EXCEL单元格一样绝对引用

kozmosovia 发表于 2024-9-7 14:05:06

用DIESEL字段

惜惜2 发表于 2024-9-7 20:42:46

kozmosovia 发表于 2024-9-7 14:05
用DIESEL字段

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

lijiao 发表于 2024-9-8 10:27:53

可以写一个程序来完成更新并不难,写完程序后,让打开文件时自动运行你的更新程序就行了

惜惜2 发表于 2024-9-8 22:31:23

lijiao 发表于 2024-9-8 10:27
可以写一个程序来完成更新并不难,写完程序后,让打开文件时自动运行你的更新程序就行了

大佬帮忙修正一下
页: [1] 2
查看完整版本: 提取文件名称关键字