Dustin11 发表于 2022-7-6 06:51:30

使用通配符获取文件p

我对通配符有点陌生,不完全了解它们是如何工作的以及何时可以使用它们。现在,我正试图在代码中使用它们,这将允许我获得有关我试图定义的文件路径的一些附加信息。下面的代码是我正在处理的代码,我遇到了问题:
 

(defun c:insdat (/ bti jobnumb firstnumb secondnumb chngnumb filepth)
(vl-load-com)
(command "-layer" "m" "G-PLAN-DATM-____-____-N" "lo" "G-PLAN-DATM-____-____-N" "")
(initget 1)
(setq jobnumb (getstring "\nEnter The 7 didgit Job Number:"))
(setq jobnumblen (strlen jobnumb))
(cond ((/= jobnumblen 7)
(print "The Job Number Must Be Exactly 7 Digits Long! Try Again.")
      (exit)
      );cond
);cond
(initget 1)
(setq chngord (getstring "\nEnter Change Order Number:"))
(setq chngordlen (strlen chngord))
(setq firstnumb (substr jobnumb 1 3)
secondnumb (substr jobnumb 4 7)
filepth (strcat "J:\\" firstnumb "\\" secondnumb "\\" chngord "\\prod\\Sheet Metal\\")
);setq
(if (vl-file-directory-p filepth)
   (progn
   (setq dept "prod")
   );progn
   (progn
   (setq dept "4-Detailing")
   );progn
   );if
(setq filepth (strcat "J:\\" firstnumb "\\" secondnumb "\\" chngord "\\" dept "\\Sheet Metal\\"))
(if
   (setq bti
   (getfiled "Select Block to Insert" filepth "dwg" 0)
);if
   (progn
   (command "._-Insert" bti "_S" 1.0 "0,0,0" 0.00 "" "")
   (while
(/= 0 (getvar "CMDACTIVE"))
(command pause)
);while
   );progn
   (princ "\nNo File picked.")
   );if
(princ)
(setvar "CLAYER" "0")
);defun

 
这是我遇到的问题。我们的文件目录是如何工作的,首先我们必须指定一个3位数的数字才能进入一个文件夹,然后你需要指定一个4位数的数字才能进入下一个文件夹,但我有一个问题。我可以很好地指定4位数字,但4位数字后面有时(通常)跟着工作的名字,所以看起来像“4***-凯悦4楼”。因此,我想知道是否有一个通配符可以用来获取与该4位数字相关联的作业名,并重新定义我试图切换到“getfield”函数的文件路径。代码现在相当草率,因为我还没有做任何清理或任何形式的重写。
 
谢谢

BlackBox 发表于 2022-7-6 07:00:30

您不能使用通配符来提取四位数字后面的项目名称/描述,但由于目录前缀为四位数字,因此您可以简单地使用SUBSTR、methinks。

Dustin11 发表于 2022-7-6 07:03:59

我不认为通配符会起作用,但我抱着一点希望,我可以像使用通配符层或块名称一样使用它。
 
我只是好奇,我如何使用substr来获得项目名称?我理解如何使用它添加到我正在定义的作业目录中,但我不确定如何使用它从我试图定义的文件路径中提取信息。

BlackBox 发表于 2022-7-6 07:09:34

 
我不确定你是否理解SUBSTR做什么。。。请参阅开发人员文档(我在之前的帖子中为您提供了一个链接)。
 
至于如何获取项目名称,以您的示例为例,假设在项目名称之前有一个四位数前缀,后跟空格连字符空格“-”:
 

(substr "4*** - Hyatt 4th Floor"

Dustin11 发表于 2022-7-6 07:13:39

对不起,我不太清楚我在以前的帖子里想要什么。项目名称总是不同的,它可能是几百个不同工作中的一个,我只是用“凯悦4楼”作为一个例子,我之前忘了提到。我的代码现在是如何工作的,它要求用户输入7位数字的作业编号,然后我使用substr将其在3位和4位文件名之间拆分。
 

(setq jobnumb (getstring "\nEnter The 7 didgit Job Number:"))
(setq chngord (getstring "\nEnter Change Order Number:"))
(setq chngordlen (strlen chngord))
(setq firstnumb (substr jobnumb 1 3)
          secondnumb (substr jobnumb 4 7))

 
问题是项目名称扩展总是不同的,因此会导致getfield函数无法读取我定义的内容,因为它只能看到,例如,当实际文件名为“4567-凯悦4th Floor”时,文件名为“4567”,因此需要看起来像“J:\\789\\4567-凯悦4th Floor\”,但看起来像这样的J:\\789\\4567\\“这将导致功能失败。我正试图找到一种方法去该文件夹,并能够返回其全名,然后我可以切分并提取我需要的信息。因此,我猜它的故障是,我正在寻找一种方法,以获得用户指定工号的项目名称。
 
谢谢你的帮助,我很感激。

BlackBox 发表于 2022-7-6 07:19:09

考虑Vl目录文件功能:
 

(vl-load-com)

(defun c:FindSubFolder (/ root prjNum primary secondary folders count)
(if (and
       (setq root "C:\\_SomeFolder\\")
       (setq prjNum (getstring "\nEnter The 7 didgit Job Number:"))
       (= 7 (strlen prjNum))
       (setq primary (substr prjNum 1 3))
       (setq secondary (substr prjNum 4 7))
       (setq folders (vl-directory-files
                     (strcat root primary)
                     (strcat secondary "*")
                     -1
                     )
       )
   )
   (cond ((= 1 (setq count (length folders)))
          (prompt "\nOne directory found: ")
          (princ (car folders))
         )
         ((< 1 count)
          (prompt "\nMultiple directories found: ")
          (princ
            (vl-string-right-trim
            ", "
            (apply 'strcat
                     (mapcar (function (lambda (x) (strcat x ", ")))
                           folders
                     )
            )
            )
          )
         )
   )
   (prompt "\n** No matching folder found ** ")
)
(princ)
)

Dustin11 发表于 2022-7-6 07:20:58

不管我输入了什么工号,它总是显示为“找不到匹配的文件夹”。我删除了代码开头的变量scrubing,然后再次运行它以查看定义了哪些变量,唯一出现“nil”的是“folders”,因为某种原因,没有定义一个。作业编号本应将其带到名为“6157 Bellevue Hyperbarics MB”的文件夹中,但由于某种原因失败了。

BlackBox 发表于 2022-7-6 07:25:12

代码在我这边有效。。。也许你应该调试它,按照你必须做的更改让它在你的终端工作?
 
我将从定义根变量的字符串开始,逐步转到提供给vl目录文件调用的参数。

Dustin11 发表于 2022-7-6 07:30:54

哎呀,我犯了个大错误。我复制并粘贴了你写的代码,没有修改“C:\\\u SomeFolder\”部分,这就是它崩溃的原因。在我更改了那个部分以匹配我们的文件结构后,代码运行得很好。再次感谢你的帮助。那些VL、VLA和VLAX函数对我来说仍然是新函数,目前我真的不知道如何使用2或3个以上的函数。

BlackBox 发表于 2022-7-6 07:36:33

 
别担心;很高兴你把它整理好了。
 
 
我们都从某个地方开始,总有一些东西需要学习。
页: [1] 2
查看完整版本: 使用通配符获取文件p