lfe011969 发表于 2022-7-6 10:34:02

使用vl目录文件进行po

我试图学习lisp编程的vl路径,但在使用“vl directory files”命令填充列表框时遇到了一个小障碍。我正在使用的示例程序运行良好,lisp文件中指定的文件夹的内容确实显示在列表框中,但列表中还有两个额外的条目,“。”和“.”我假设这与使用vl有关(见下图)。
 

 
以下是我的lisp中的代码:
(defun c:notes ()
(setq folderList (vl-directory-files "L:\\Scripts\\Notes\\" nil -1))
(setq dcl_id (load_dialog "notes1.dcl"))
(if (not (new_dialog "NOTES1" dcl_id))(exit))
(start_list "folderlist" 3)
(mapcar 'add_list folderList)
(end_list)
(action_tile "cancel" "(setq ddiag 1)(done_dialog)")
(action_tile "accept" "(setq ddiag 2)(done_dialog)")
(start_dialog)
(if (= ddiag 1)
   (princ "\n \n ...Notes Cancelled. \n ")
   )
(if (= ddiag 2)
   (foreach a retList
   (princ "\n")(princ a)
   )
   )
(princ)
)
 
 
有人知道删除“”的方法吗和“.”所以他们没有出现在列表中?据我所知,vl目录文件的唯一选项是1(仅显示文件)、0(同时显示文件夹和文件)和-1(仅显示文件夹)。
 
朗尼

rkmcswain 发表于 2022-7-6 10:38:18

“.”是当前目录,“.”是向上的一个目录,或父目录。
如果不需要,只需将其从列表中删除即可。
 

(vl-remove-if
'(lambda (x) (or (eq x ".") (eq x "..")))
(vl-directory-files "C:\\temp" nil -1)
)

lfe011969 发表于 2022-7-6 10:42:45

谢谢,效果很好!我刚才实际上在玩vl remove命令,但无法使其工作。我浏览了vl remove if和vl remove if的说明,但我对这些命令都没有经验,我想我应该先试试基本命令。
 
朗尼

Lee Mac 发表于 2022-7-6 10:46:29

嗨,朗尼,
 
也许这也会帮助你-注意我是如何构造函数的,以及使用start\u对话框返回缺少action\u tile语句的。
 

(defun c:notes ( / folders dcl_id sel flag )

(cond ( (not (setq folders (vl-remove "." (vl-remove ".." (vl-directory-files "L:\\Scripts\\Notes\\" nil -1))))))

       ( (<= (setq dcl_id (load_dialog "notes1.dcl")) 0)

         (princ "\n** Unable to Locate DCL **")
       )
       ( (not (new_dialog "NOTES1" dcl_id))

         (princ "\n** Unable to Load Dialog **")
       )
       (t
         (start_list "folderlist")
         (mapcar 'add_list folders)
         (end_list)

         (setq sel (set_tile "folderlist" "0"))
      
         (action_tile "folderlist" "(setq sel $value)")

         (setq flag (start_dialog) dcl_id (unload_dialog dcl_id))

         (if (= 1 flag)
         (princ (strcat "\nUser Selected: " (nth (atoi sel) folders)))
         (princ "\nCancelled")
         )
       )
)

(princ)
)


 
在ACAD开发帮助中

lfe011969 发表于 2022-7-6 10:52:12

所以我一直在研究代码,我想我知道你在做什么,但从编码的角度来看,当你试图让我跑马拉松时,我仍然在爬行,哈哈。
 
我的意图是从一个列表框例程开始,然后转到两个列表框例程,然后是一个三列表框程序。我有一些2列表程序的代码,但是第二个列表框的内容不会根据第一个列表框中选择的内容而改变,这也是我想要做的。
Working withProgrammable Dialog Boxes > Managing DialogBoxes > ActionExpressions and Callbacks > Action Expressions
 
 
我采用了一个列表框的原则,并尝试将其应用于两个列表框,但第二个列表框从未填充,并且错误:错误参数类型:stringp nil”在选择第一个列表框中的任何项目后,AutoCAD会立即返回。
 
如何将这两个列表链接在一起,以便在第一个列表中选择某个内容会改变第二个列表中的内容?谢谢
 
朗尼

Lee Mac 发表于 2022-7-6 10:54:14

只是猜测一下,可能是说“显示第二个列表框”有问题,但它没有什么可显示的,所以在第一次打开dcl时,只需在其中输入一个空白条目“Pick box 1 first”,然后在框3和框4中输入一个if Pick box 1 change box 2,依此类推

lfe011969 发表于 2022-7-6 11:02:04

嗨,朗尼,我在这里的某个地方贴了一个例子,完全符合你的要求,我会帮你找到的

BIGAL 发表于 2022-7-6 11:05:55

实际上,你似乎在这里找到了:
http://www.cadtutor.net/forum/showthread.php?47747-列表框如何突出显示值/页面5

Lee Mac 发表于 2022-7-6 11:08:58

是的,我确实在那个页面上看过你的代码,但我恐怕对我来说都是希腊语,哈哈,这就是为什么我试图从头开始,构建一个单列表框例程,然后逐步实现一个3列表框程序。我很沮丧,试图让两个列表框的例行工作,所以我开始工作的一些其他想法,我有。我希望从代码中抽出一两天的时间,当我回到它的时候,它会给我一个全新的视角。
 
朗尼

Lee Mac 发表于 2022-7-6 11:11:11

你好
 
还有,你可以写
(defun saveVars    ()
(setq fStr (get_tile "folderlist"))
(if (/= fStr "")
   (progn
   (setq fIndex (atoi fStr))
   (setq fName (nth fIndex folderList))
   )
   
   (progn
   (setq fIndex -1)
   (setq fName nil)
   )
)

(setq nStr (get_tile "noteslist"))
(if (/= nStr "")
   (progn
   (setq nIndex (atoi nStr))
   (setq nName (nth nIndex notesList))
   )
   (progn
   (setq nIndex -1)
   (setq nName nil)
   )
   )
)

(defun c:notes ()
(setq    folderList
    (vl-remove-if
      '(lambda (x) (or (eq x ".") (eq x "..")))
      (vl-directory-files "L:\\Scripts\\Notes\\" nil -1)
    )
)

(cond
   (= fName "Electrical")(setq folderpath "L:\\Scripts\\Notes\\Electrical\\")
   (= fName "General")(setq folderpath "L:\\Scripts\\Notes\\General\\")
   (= fName "Outfitting")(setq folderpath "L:\\Scripts\\Notes\\Outfitting\\")
   (= fName "Piping")(setq folderpath "L:\\Scripts\\Notes\\Piping\\")
   (= fName "Removal")(setq folderpath "L:\\Scripts\\Notes\\Removal\\")
   (= fName "Structure")(setq folderpath "L:\\Scripts\\Notes\\Structure\\")
   (= fName "Test")(setq folderpath "L:\\Scripts\\Notes\\Test\\")
   )

(setq notesList
    (vl-directory-files folderpath nil 1)
   )

(setq dcl_id (load_dialog "notes1.dcl"))
(if (not (new_dialog "NOTES1" dcl_id))
   (exit)
)

(start_list "folderlist" 3)
(mapcar 'add_list folderList)
(end_list)

(start_list "notelist" 3)
(mapcar 'add_list noteList)
(end_list)

(action_tile "cancel" "(setq ddiag 1)(done_dialog)")
(action_tile "accept" "(setq ddiag 2)(saveVars)(done_dialog)")
(action_tile "folderlist" "(saveVars)")

(start_dialog)
(if (= ddiag 1)
   (princ "\n \n ...Notes Cancelled. \n ")
)
(if (= ddiag 2)
   (foreach a retList
   (princ "\n")
   (princ a)
   )
)
(princ)
)
 
@+
页: [1] 2
查看完整版本: 使用vl目录文件进行po