乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 57|回复: 8

[编程交流] 创建目录Visual Lisp

[复制链接]

31

主题

107

帖子

76

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
155
发表于 2022-7-6 10:18:44 | 显示全部楼层 |阅读模式
大家好。
我有点困在这里了。
 
我开始打字:
  1. (if (not (vl-file-directory-p "U:\\Project1\\CAD_Xref_Files\"))
  2. (vl-mkdir "U:\\Project1\\CAD_Xref_Files\"))

 
这适用于一个名为project1的项目。
 
如果我想在Project2中使用相同的lisp呢。我可以让它选择“主路径”吗?它可以是U:\\ProjectX\\n然后继续使用CAD\U Xref\U文件或我放在那里的任何文件。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:27:49 | 显示全部楼层
这是我用来创建目录结构的内容:
 
  1. ;;-------------------=={ Make Directory }==-------------------;;
  2. ;;                                                            ;;
  3. ;;  Creates a directory structure                             ;;
  4. ;;------------------------------------------------------------;;
  5. ;;  Author: Lee McDonnell, 2010                               ;;
  6. ;;                                                            ;;
  7. ;;  Copyright © 2010 by Lee McDonnell, All Rights Reserved.   ;;
  8. ;;  Contact: Lee Mac @ TheSwamp.org, CADTutor.net             ;;
  9. ;;------------------------------------------------------------;;
  10. ;;  Arguments:                                                ;;
  11. ;;  dir - the directory to create                             ;;
  12. ;;------------------------------------------------------------;;
  13. ;;  Returns:  T if directory creation is successful, else nil ;;
  14. ;;------------------------------------------------------------;;
  15. (defun LM:MakeDirectory ( dir / MakeDirectory folders )
  16. ;; © Lee Mac 2010
  17. ;; (LM:MakeDirectory "C:\\Folder\\Subfolder")
  18. (vl-load-com)
  19. (defun MakeDirectory ( root folders )
  20.    (if folders
  21.      (
  22.        (lambda ( dir ) (vl-mkdir dir)
  23.          (MakeDirectory dir (cdr folders))
  24.        )
  25.        (strcat root "\" (car folders))
  26.      )
  27.    )
  28. )
  29. (if (setq folders (LM:str->lst (vl-string-translate "/" "\" dir) "\"))
  30.    (MakeDirectory (car folders) (cdr folders))
  31. )
  32. (vl-file-directory-p dir)
  33. )
  34. ;;-------------------=={ String -> List }==-------------------;;
  35. ;;                                                            ;;
  36. ;;  Separates a string into a list of strings using a         ;;
  37. ;;  specified delimiter string                                ;;
  38. ;;------------------------------------------------------------;;
  39. ;;  Author: Lee McDonnell, 2010                               ;;
  40. ;;                                                            ;;
  41. ;;  Copyright © 2010 by Lee McDonnell, All Rights Reserved.   ;;
  42. ;;  Contact: Lee Mac @ TheSwamp.org, CADTutor.net             ;;
  43. ;;------------------------------------------------------------;;
  44. ;;  Arguments:                                                ;;
  45. ;;  str - string to process                                   ;;
  46. ;;  del - delimiter by which to separate the string           ;;
  47. ;;------------------------------------------------------------;;
  48. ;;  Returns:  A list of strings                               ;;
  49. ;;------------------------------------------------------------;;
  50. (defun LM:str->lst ( str del / pos )
  51. ;; © Lee Mac 2010
  52. (if (setq pos (vl-string-search del str))
  53.    (cons (substr str 1 pos) (LM:str->lst (substr str (+ pos 1 (strlen del))) del))
  54.    (list str)
  55. )
  56. )
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 10:38:17 | 显示全部楼层
您必须一次验证/创建一级路径:
 
  1. ;;; STR2LST
  2. ;;; Transforms a string with separator into a list of strings
  3. ;;; Author: Gile
  4. ;;; Arguments
  5. ;;; str = the string
  6. ;;; sep = the separator pattern
  7. (defun  str2lst(str sep / pos)
  8. (if (setq pos (vl-string-search sep str))
  9.    (cons (substr str 1 pos)
  10.      (str2lst (substr str (+ (strlen sep) pos 1)) sep)
  11.    )
  12.    (list str)
  13. )
  14. )
  15. (setq MyPath "U:\\Project1\\CAD_Xref_Files"
  16.      MyPath (str2lst MyPath "\")
  17.      thePath (car MyPath))
  18. (foreach PathItem (cdr MyPath)
  19. (if (not (vl-file-directory-p (setq thePath (strcat thePath "\" PathItem))))
  20. (vl-mkdir thePath)
  21. )
  22. )

 
 
当做
米尔恰
回复

使用道具 举报

31

主题

107

帖子

76

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
155
发表于 2022-7-6 10:45:13 | 显示全部楼层
好吧,但我可能不太清楚。很抱歉
我想要的是让用户选择主路径。然后lisp继续生成CAD\U外部参照或路径\\to\\CAD\U外部参照\\
回复

使用道具 举报

4

主题

327

帖子

324

银币

初来乍到

Rank: 1

铜币
19
发表于 2022-7-6 10:55:19 | 显示全部楼层
看看getfield函数。这将显示一个对话框,以便用户可以导航到路径或文件。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 11:00:29 | 显示全部楼层
 
使用什么标准来确定根路径(如果有)?
 
例如,如果所需的标准与激活图形相关,则可以使用(或提取部分)dwgprefix系统变量。
回复

使用道具 举报

31

主题

107

帖子

76

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
155
发表于 2022-7-6 11:03:44 | 显示全部楼层
是的,我尝试使用dwgprefix,然后我从dwg文件的位置创建了文本文件的相对路径。
我认为这是更好的解决方案。由于文件夹结构必须始终相同,因此它对用户是锁定的。在这种情况下,所有内容都存储在管理fodler中。
所以,这个问题至少解决了我的需要。
 
但问题是如何让用户选择一个项目路径,然后让lisp生成其他路径,例如:
用户选择其项目文件夹,lisp生成文件夹结构,即,
因此,如果用户选择文件夹,lisp会生成其他文件夹,因此完整路径将为P3/admin/cad,或者在第一种情况下为P1/admin/cad。
 
尽管我最终发现它在cad管理员问题上不是很好。因此,getvar dwgprefix对我帮助很大。
谢谢
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 11:16:15 | 显示全部楼层
很乐意帮忙。
 
 
 
... 我是beleieve,JohnM已经回答了这个问题:
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:21:30 | 显示全部楼层
 
GetField(iLog)适合选择文件(顾名思义),我发现它更适合选择路径:
 
  1. ;;-------------------=={ Directory Dialog }==-----------------;;
  2. ;;                                                            ;;
  3. ;;  Displays a dialog prompting the user to select a folder   ;;
  4. ;;------------------------------------------------------------;;
  5. ;;  Author: Lee McDonnell, 2010                               ;;
  6. ;;                                                            ;;
  7. ;;  Copyright © 2010 by Lee McDonnell, All Rights Reserved.   ;;
  8. ;;  Contact: Lee Mac @ TheSwamp.org, CADTutor.net             ;;
  9. ;;------------------------------------------------------------;;
  10. ;;  Arguments:                                                ;;
  11. ;;  msg  - message to display at top of dialog                ;;
  12. ;;  dir  - root directory (or nil)                            ;;
  13. ;;  flag - bit coded flag specifying dialog display settings  ;;
  14. ;;------------------------------------------------------------;;
  15. ;;  Returns:  Selected folder filepath, else nil              ;;
  16. ;;------------------------------------------------------------;;
  17. (defun LM:DirectoryDialog ( msg dir flag / Shell HWND Fold Self Path ac )
  18. ;; © Lee Mac 2010
  19. (setq Shell (vla-getInterfaceObject (setq ac (vlax-get-acad-object)) "Shell.Application")
  20.        HWND  (vl-catch-all-apply 'vla-get-HWND (list ac))
  21.        Fold  (vlax-invoke-method Shell 'BrowseForFolder (if (vl-catch-all-error-p HWND) 0 HWND)  msg flag dir))
  22. (vlax-release-object Shell)
  23. (if Fold
  24.    (progn
  25.      (setq Self (vlax-get-property Fold 'Self) Path (vlax-get-property Self 'Path))
  26.      (vlax-release-object Self)
  27.      (vlax-release-object Fold)      
  28.      
  29.      (and (= "\" (substr Path (strlen Path)))
  30.           (setq Path (substr Path 1 (1- (strlen Path)))))
  31.    )
  32. )
  33. Path
  34. )

 
呼叫使用(或类似):
 
  1. (LM:DirectoryDialog "Select Directory" nil 0)

 
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 21:15 , Processed in 0.624845 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表