乐筑天下

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

使用VBScript设置AutoCAD路径

[复制链接]

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-23 11:24:10 | 显示全部楼层 |阅读模式
我正在尝试使用VBSCript(vbs)设置我的ACAD支持路径
是的,我可以在VBA中创建它,并且有,但我只是好奇设置我是否可以从ACAD外部完成这项工作。
这是我的代码的开头
  1. Dim ACADApp
  2. Set ACADApp = CreateObject("AutoCAD.application")
  3. 'Support File Search Paths:
  4.   Dim Preferences As AcadPreferences
  5.   Dim CurrPaths As String
  6.   Dim NewPath1, NewPath2, NewPath3, NewPath4, NewPath5 As String
  7.   Set Preferences = ThisDrawing.Application.Preferences
  8.   CurrPaths = Preferences.Files.SupportPath
  9.    
  10.     NewPath1 = "I:\Directory\Directory"
  11. '  'NewPath2 = "Path2"
  12. '  'NewPath3 = "Path3"
  13. '  'NewPath4 = "Path4"
  14. '  'NewPath5 = "Path5"
  15. '  'Support File Search Paths
  16.    Preferences.Files.SupportPath = CurrPaths & ";" & NewPath1 '& ";" & NewPath2 & ";" & _
  17.    NewPath3 & ";" & NewPath4 & ";" & NewPath5

我打开了AutoCAD,但随后代码出错了。
我在想我可能需要先设置对The Profile的引用,但我不确定。
可能VBA也没有被初始化,但同样,我不确定。
感谢任何帮助
谢谢
Mark

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-24 06:10:38 | 显示全部楼层
看起来你很早就结婚了。

Dim ACADApp
更改为
Dim ACADApp As AutoCAD。AcadApplication
省去了许多猜测....
这张图纸.....eeehhhhhrrr....哪幅画.....代码不在绘图中,所以没有这个绘图。
设置首选项= ACADApp。首选项会做得很好
我没有测试它(不想弄乱我的首选项),但这应该会为您指出正确的方向
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-24 09:27:01 | 显示全部楼层

谢谢Dnereb
我会试试的
我不怪你不想打乱你的偏好,所以一种解决方法是创建一个名为“测试”或类似的配置文件。这就是我所做的;通过这种方式,您可以随心所欲地将其搞糟,并在完成后恢复默认配置文件
谢谢
马克
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-24 13:48:43 | 显示全部楼层

嘿Dnereb
这是我让脚本做任何事情的唯一方法-->
它不喜欢数据类型,所以我从每个变量中删除了as String。
此外,失踪的女学生是ACADApp。Visible = True
但是,当我运行它时,它确实打开了AutoCAD,并且有效地清除了我的首选项。
不仅仅是设置,还有所有可用的选项。
在惊慌失措了几秒钟之后,我恢复了配置文件,调整了一些用户设置,然后就回来了。
我知道我的思路是正确的,但是,我不能每次测试时都出现这种情况。
你怎么看?谢谢您马克代码1]
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-24 14:06:38 | 显示全部楼层
在VB脚本中你仍然引用了acad对象:
Set Preferences as acad Preferences奇怪的语法反正不应该是:“Set Preferences = AcadPreferences”吗?
如果VBSript中存在该对象,则不希望使用该对象....
  1. Dim ACADAPP as Object
  2. Dim Preferences as Object
  3. Set ACADApp = CreateObject("AutoCAD.application")
  4. Set Preferences = ACADApp.AcadPreferences 'you need to adres the holder acadapp if you aren't in acad
  5. ACADApp.Visible = True
  6. Dim CurrPaths
  7. 'Dim NewPath1, NewPath2, NewPath3, NewPath4, NewPath5
  8. CurrPaths = Preferences.Files.SupportPath
  9. 'this is sloppy:
  10. 'NewPath1 = "I:\Path\Test"
  11. 'NewPath2 = "Path2"
  12. 'NewPath3 = "Path3"
  13. 'NewPath4 = "Path4"
  14. 'NewPath5 = "Path5"
  15. 'Support File Search Paths
  16. 'Preferences.Files.SupportPath = CurrPaths & ";" & NewPath1 '& ";" & NewPath2 & ";" & _
  17. 'NewPath3 & ";" & NewPath4 & ";" & NewPath5
  18. 'How about:
  19. Dim NewPath(5) as String
  20. Dim AllPaths as String
  21. Dim pCount as Integer
  22. NewPath(0) = "I:\Path\Test"
  23. NewPath(1) = ""
  24. NewPath(2) = ""
  25. NewPath(3) = ""
  26. NewPath(4) = ""
  27. Allpaths = Currpaths
  28. For pCount = 0 to 4
  29.     if Len NewPath(pCount) > 0 then
  30.         Allpaths = Allpaths & ";" & NewPath(pCount)
  31.     end if
  32. next
  33. Preferences.Files.SupportPath = Allpaths

顺便说一句:总是尽可能将变量划分为特定类型,这将加快代码速度并节省内存使用。
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-25 02:56:26 | 显示全部楼层
c:正如你可能猜到的,我不是VB程序员,而是VB(A)程序员。所以准确指出问题对我来说也很棘手。但是如果要我打赌的话,我会选择:
不声明为object,而是声明为variant(如果没有为变量指定类型,则为默认类型)
并声明对象的方法。
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-25 12:45:44 | 显示全部楼层

在这里也是一样,我在VBA工作了一段时间,但我对脚本也不熟悉
微软网站上免费提供VBScripting用户指南;如果你需要链接,我可以给你
无论如何,问题是我(或我们)正在尝试先打开AutoCAD,然后写入注册表。据我所知,ACAD必须关闭才能写入注册表。我可能也做了一些其他错误的事情,但它不在数据类型中。事实上,如果您查看《vbscripting用户指南》,他们并没有真正用数据类型进行声明,这是不寻常的,但对我来说很明显。
马克
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-25 15:49:46 | 显示全部楼层

我使用了您的阵列建议,但我认为Len函数没有必要,因此我更改了一些其他小细节
谢谢
  1. Dim Preferences As AcadPreferences
  2. Dim CurrPaths, NewPath(5), AllPaths As String
  3. Dim Pcount As Integer
  4. Set Preferences = ThisDrawing.Application.Preferences
  5. CurrPaths = Preferences.Files.SupportPath
  6. NewPath(0) = "Path"
  7. NewPath(1) = "Path"
  8. NewPath(2) = ""
  9. NewPath(3) = ""
  10. NewPath(4) = ""
  11. For Pcount = 0 To 4
  12. If NewPath(Pcount)  0 Then
  13.   AllPaths = AllPaths & ";" & CurrPaths & ";" & NewPath(Pcount)
  14. End If
  15. Next Pcount
  16. Preferences.Files.SupportPath = AllPaths

我还没有想出如何编写路径脚本,但我正在一点一点地努力。
标记
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-25 19:42:23 | 显示全部楼层
我在VB(A)中做的很少,但看看这段代码是否能有所帮助,我是为VB做的,启动AutoCAD并为我的一个应用程序设置路径。
  1. Option Explicit
  2. Option Compare Text
  3. Declare Function RegQueryValueEx& Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey&, ByVal lpszValueName$, ByVal lpdwRes&, lpdwType&, ByVal lpDataBuff$, nSize&)
  4. Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
  5. Private Declare Function ShellExecute Lib "shell32.dll" Alias _
  6.       "ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _
  7.       String, ByVal lpszFile As String, ByVal lpszParams As String, _
  8.       ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long
  9.       Private Declare Function GetDesktopWindow Lib "user32" () As Long
  10. Const HKEY_LOCAL_MACHINE = &H80000002
  11. Const HKEY_CLASSES_ROOT = &H80000000
  12. Const KEY_QUERY_VALUE = &H1&
  13. Const KEY_ENUMERATE_SUB_KEYS = &H8&
  14. Const KEY_NOTIFY = &H10&
  15. Const READ_CONTROL = &H20000
  16. Const STANDARD_RIGHTS_READ = READ_CONTROL
  17. Const KEY_READ = STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY
  18. Const SW_SHOWNORMAL = 1
  19. Const SE_ERR_FNF = 2&
  20. Const SE_ERR_PNF = 3&
  21. Const SE_ERR_ACCESSDENIED = 5&
  22. Const SE_ERR_OOM = 8&
  23. Const SE_ERR_DLLNOTFOUND = 32&
  24. Const SE_ERR_SHARE = 26&
  25. Const SE_ERR_ASSOCINCOMPLETE = 27&
  26. Const SE_ERR_DDETIMEOUT = 28&
  27. Const SE_ERR_DDEFAIL = 29&
  28. Const SE_ERR_DDEBUSY = 30&
  29. Const SE_ERR_NOASSOC = 31&
  30. Const ERROR_BAD_FORMAT = 11&
  31. Private Function GetAppPath(subkey As String, sAppEntry As String) As String
  32. Dim s As String * 255, sAppPath As String
  33. Dim lAppKey As Long, lType As Long, lLen As Long, lRC As Long
  34.     lLen = Len(s)
  35.     lRC = RegOpenKeyEx(HKEY_CLASSES_ROOT, sAppEntry, 0, KEY_READ, lAppKey)
  36.     If lRC  0 Then Exit Function
  37.     lRC = RegQueryValueEx( _
  38.             lAppKey, _
  39.             subkey, _
  40.             0, _
  41.             lType, _
  42.             s, _
  43.             lLen)
  44.     's = Left$(s, lLen - 6)
  45.     GetAppPath = Mid(s, 2, lLen - 8) 'Left$(s, lLen - 5)
  46. End Function
  47. Function StartDoc(DocName As String, Param As String, Dir As String) As Long
  48.           Dim Scr_hDC As Long
  49.           Scr_hDC = GetDesktopWindow()
  50.           StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _
  51.           Param, Dir, SW_SHOWNORMAL)
  52.       End Function
  53. Sub Main()
  54.    
  55.    Dim version As String
  56.    Dim result As Boolean
  57.    Dim sAcadEntry As String
  58.    
  59.    On Error Resume Next
  60.    
  61.    sAcadEntry = "AutoCAD.Drawing.16\shell\open\command"
  62.    version = GetAppPath("", sAcadEntry)
  63.    
  64.    If StrConv(version, 1) Like "*ACAD.EXE"  True Then
  65.     MsgBox ("El programa AutoCAD Ver. 2004 no se encuentra instalado. \nPor favor refiérase al Manual del Usuario.")
  66.     End
  67.    End If
  68.    
  69.    'result = Shell(version & " /b draftteam.scr", 1)
  70.    Dim r As Long, msg As String, Dir As String
  71.           Dir = App.Path
  72.           r = StartDoc(version, " /b draftteam.scr", Dir)
  73.           If r  "" Then
  74.    Dim DttPath As String
  75.    DttPath = objAcad.ActiveDocument.GetVariable("DWGPREFIX")
  76.    Dim LDttPath As Integer
  77.    LDttPath = Len(DttPath)
  78.    If Right(DttPath, 1) = "" Then
  79.         DttPath = Left(DttPath, LDttPath - 1)
  80.    End If
  81.    'Adicionar directorio donde esta instalado draftteam si no existe
  82.    If StrConv(sPath, 1) Like "*" & StrConv(DttPath, 1) & "*"  True Then
  83.         preferences.Files.SupportPath = sPath & ";" & DttPath
  84.    End If
  85.    End If
  86.    Set objAcad = Nothing
  87.    Set preferences = Nothing
  88.    
  89. End Sub

回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2007-5-29 16:44:25 | 显示全部楼层

Dnereb,
我想通了,有一点点帮助。
我现在可以通过 VBA 脚本成功更改注册表中的支持路径。
如果您仍然感兴趣,请告诉我,我将与您共享代码
Mark
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-7 22:25 , Processed in 1.012268 second(s), 73 queries .

© 2020-2025 乐筑天下

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