明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6982|回复: 28

[求助]用vb批量处理文件的通用程序

  [复制链接]
发表于 2004-12-6 21:00:00 | 显示全部楼层 |阅读模式
Private Sub Form_Click()

Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument On Error Resume Next
Set acadApp = GetObject(, "AutoCAD.Application")
If Err Then
Err.Clear
Set acadApp = CreateObject("AutoCAD.Application")
If Err Then End
End If
acadApp.Visible = True
Set acadDoc = acadApp.ActiveDocument
acadDoc.SendCommand ("filedia") & Chr(13) & ("0") & Chr(13)
acadDoc.SendCommand "(Load ""C:/Lhy_Leo/plot.lsp"")" & vbCr
acadDoc.SendCommand ("filedia") & Chr(13) & ("1") & Chr(13)
End Sub
以上程序是我用vb编的一个打开cad并加载一个lisp程序的命令,现在只能对一个文件操作,我想有没有那位高手能实现一个用vb作的批处理的程序,它能选择一个目录下的所有dwg文件,分别打开,加载某个lisp程序,存盘关闭,这样就可做出一个批处理用vb打开dwg文件调用lisp的通用程序,我想这个很有用的,不知那位高手可以帮助我,小弟对vb不是很熟,有急用,谢谢了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2004-12-6 21:25:00 | 显示全部楼层
调用Lisp文件有顺序么?
发表于 2004-12-6 21:37:00 | 显示全部楼层
以下是一段测试,你自己按这个格式改写一下吧 Private Sub Form_Load()
sFilename = Dir(Replace(App.Path & "\*.lsp", "\\", "\"))
Do While sFilename <> ""
sLspName = "(Load " & Replace("""" & Replace(App.Path, "\", "/") & "/" & sFilename & """", "//", "/") & ")"
MsgBox sLspName
sFilename = Dir
Loop
End Sub
发表于 2004-12-6 21:43:00 | 显示全部楼层
这种做法本身就有问题,这也是AutoCAD的BUG造成的。
注意SendCommand方法容易出现不同步,也就是说当你使用SendCommand方法后,在命令还没有执行完时,VBA会继续执行剩下的语句。所以对程序的执行会造成混乱。
解决的方法就是想办法把LISP程序改装成VBA或VB程序。
发表于 2004-12-6 22:02:00 | 显示全部楼层
有想过这个问题,:) 不过citykunan是玩Lisp的,可能对VBA不怎么熟,可以试试生成一个临时的Lisp文件,把要执行的Lisp一次全部写进去,再SendCommand
发表于 2004-12-6 22:05:00 | 显示全部楼层
那就需要把打开文件和保存文件这些操作都放到LSP文件中。只SendCommand一次。
发表于 2004-12-6 23:03:00 | 显示全部楼层
试了一下,sendcommand是容易引起程序运行混乱,不知道vlax是不是可以解决这个问题?以下一个程序是我以前编写的,用于统计某个目录下的所有图纸信息的,贴出来供citykunan参考。
  1. Private Type BrowseInfo
  2.          hWndOwner As Long
  3.          pIDLRoot As Long
  4.          pszDisplayName As Long
  5.          lpszTitle As Long
  6.          ulFlags As Long
  7.          lpfnCallback As Long
  8.          lParam As Long
  9.          iImage As Long
  10. End TypePrivate Const BIF_RETURNONLYFSDIRS = 1
  11. Private Const MAX_PATH = 260
  12. 'Public Declare Function GetVersion Lib "Kernel32" () As Integer
  13. Private Declare Function GetCommandLine Lib "Kernel32" Alias "GetCommandLineA" () As String
  14. Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
  15. Private Declare Function lstrcat Lib "Kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
  16. Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
  17. Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As LongPublic Sub qdtubl()
  18. Dim inDir As String
  19. Dim elem
  20. Dim filenom As String
  21. Dim WholeFile As String
  22. Dim newHeight As Double
  23. Dim intfilename As Integer
  24. Dim extmin1 As Double
  25. Dim extmax1 As Double
  26. Dim extmin2 As Double
  27. Dim extmax2 As Double
  28. Dim scale1 As Double
  29. Dim tufu As String
  30. Dim neirong33 As String
  31. intfilename = FreeFile()
  32. inDir = ""
  33. inDir = ThisDrawing.BrowseForFolder("请选择目录:")
  34. If inDir = "" Then Exit Sub
  35. If Right(inDir, 1) = "" Then inDir = Left(inDir, Len(inDir) - 1)
  36. filenom = Dir$(inDir & "\*.dwg")
  37. Dim tzlbzz As String
  38. tzlbzz = inDir & "\图纸幅面及比例.txt"'On Error GoTo errorcontrol
  39. Open tzlbzz For Output As intfilename
  40. Print #intfilename, inDir
  41. Print #intfilename, "---------------"
  42. Do While filenom <> ""
  43.       
  44.        WholeFile = inDir & "" & filenom
  45.        ThisDrawing.Application.Documents.Open WholeFile
  46.        extmin1 = ThisDrawing.Application.ActiveDocument.GetVariable("extmax")(0) - ThisDrawing.Application.ActiveDocument.GetVariable("extmin")(0)
  47.        extmax1 = ThisDrawing.Application.ActiveDocument.GetVariable("extmax")(1) - ThisDrawing.Application.ActiveDocument.GetVariable("extmin")(1)
  48.        scale1 = ThisDrawing.Application.ActiveDocument.GetVariable("dimscale")
  49.        If scale1 = 0 Then scale1 = 1
  50.        extmin2 = extmin1 / scale1
  51.        extmax2 = extmax1 / scale1
  52.        If extmin2 > extmax2 Then
  53.                Select Case ThisDrawing.Round(extmin2, 0)
  54.                Case 1189
  55.                        tufu = "图幅A0"
  56.                Case 841
  57.                        tufu = "图幅A1"
  58.                Case 594
  59.                        tufu = "图幅A2"
  60.                Case 420
  61.                        tufu = "图幅A3"
  62.                Case 297
  63.                        tufu = "图幅A4"
  64.                Case Else
  65.                        tufu = "图幅未知"
  66.                End Select
  67.                Else
  68.                Select Case ThisDrawing.Round(extmin2, 0)
  69.                Case 841
  70.                        tufu = "图幅A0"
  71.                Case 594
  72.                        tufu = "图幅A1"
  73.                Case 420
  74.                        tufu = "图幅A2"
  75.                Case 297
  76.                        tufu = "图幅A3"
  77.                Case 210
  78.                        tufu = "图幅A4"
  79.                Case Else
  80.                        tufu = "图幅未知"
  81.                End Select
  82.        End If
  83.        neirong33 = filenom & Chr(9) & tufu & "(" & CStr(extmin2) & "," & CStr(extmax2) & ")" & Chr(9) & "比例(1:" & CStr(scale1) & ")"
  84.        Print #intfilename, neirong33
  85.        'MsgBox ThisDrawing.GetVariable("extmax")
  86.        ThisDrawing.Application.ActiveDocument.Close False
  87.        filenom = Dir$
  88.        ThisDrawing.Utility.Prompt vbCrLf
  89. Loop
  90. Close intfilename
  91. 'MsgBox tzlbzz
  92. Dim runtemp As String
  93. runtemp = "NOTEPAD.EXE " & tzlbzz
  94. Shell runtemp, vbNormalFocus
  95. Exit Suberrorcontrol:
  96. Close intfilename
  97. MsgBox "错误,程序退出!"
  98. End SubPublic Function Round(ByVal nValue, Optional nPlaces As Integer = 2) As Double       Dim tmp As Integer
  99.        On Error GoTo errorcontrol
  100.       
  101.        nValue = CDbl(nValue)
  102.        tmp = Fix(nValue)
  103.        nValue = CInt((nValue - tmp) * 10 ^ nPlaces)
  104.        Round = tmp + nValue / 10 ^ nPlaces
  105.        Exit Function
  106.       
  107. errorcontrol:
  108.        Round = 0
  109. End FunctionPublic Function BrowseForFolder(sPrompt As String) As String
  110. 'Public Function BrowseForFolder(hWndOwner As Long, sPrompt As String) As StringDim iNull As Integer
  111. Dim lpIDList As Long
  112. Dim lResult As Long
  113. Dim sPath As String
  114. Dim udtBI As BrowseInfo
  115.        With udtBI
  116.    '           .hWndOwner = hWndOwner
  117.                .lpszTitle = lstrcat(sPrompt, "")
  118.                .ulFlags = BIF_RETURNONLYFSDIRS
  119.        End With       lpIDList = SHBrowseForFolder(udtBI)       If lpIDList Then
  120.                sPath = String$(MAX_PATH, 0)
  121.              lResult = SHGetPathFromIDList(lpIDList, sPath)
  122.                Call CoTaskMemFree(lpIDList)
  123.                iNull = InStr(sPath, vbNullChar)               If iNull Then
  124.                        sPath = Left$(sPath, iNull - 1)
  125.                End If       End If       BrowseForFolder = sPath
  126. End Function
 楼主| 发表于 2004-12-7 09:06:00 | 显示全部楼层
to mccad: 那就需要把打开文件和保存文件这些操作都放到LSP文件中。只SendCommand一次。

明总有没有什么例子,其实我是想用vb做一个.exe文件,双击此文件,可以打开cad,批量处理一批图纸,而这个处理的过程,可能是用lisp,如果能做到而没有bug的话,就可以实现一个通用的用lisp处理dwg文件的程序,这个就能把像我这样略懂vb但是平时主要是用lisp编成的人结合起来,会很有帮助的。谢谢。
发表于 2004-12-7 11:35:00 | 显示全部楼层
下面是写临时文档的代码,SendCommand你自己加吧 要引用Scripting RunTime运行库 Private Sub Form_Load()
Dim sLispCode As String
sFilename = Dir(Replace(App.Path & "\*.lsp", "\\", "\"))
Do While sFilename <> ""
sLispCode = sLispCode & "(Load " & Replace("""" & Replace(App.Path, "\", "/") & "/" & sFilename & """", "//", "/") & ")" & vbCrLf
sFilename = Dir
Loop
Dim fso As New FileSystemObject
Dim tr As TextStream
Set tr = fso.CreateTextFile("mytemp.lsp")
tr.Write sLispCode
tr.Close
End Sub
发表于 2004-12-7 21:58:00 | 显示全部楼层
不知能否利用IsQuiescent 属性检查AutoCAD状态来实现。
只是想法,但没有多试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 06:46 , Processed in 0.177382 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表