[分享]批量打开文件批量查找替换【更新第2.1版】
本帖最后由 作者 于 2010-9-1 23:53:50 编辑 <br /><br /> <p></p><p></p>
<p>使用方法:<br/>1.确保你的电脑上面装有AutoCAD 和 excel 程序。<br/>2.在“TT_AutoCAD文字自动替代.xls”文件里面设置好你要替换的数据,A列是查找项,B列是替换项。注意查找项不能为空,否则后面的查找项将读取不到。<br/>3.点击“批量查找替换”程序,程序会打开配置文件(TT_AutoCAD文字自动替代),如果AutoCAD未启动,程序将打开“TT_AutoCAD启动页.dwg”文件启动AutoCAD。<br/>4.等待一会后,将出现批量查找程序界面。<br/>5.先添加文件,如果添加文件夹,程序会搜索此文件夹(包括子目录)里面dwg图形文件。<br/>6.点击“确定”,等待一会,你的所有添加的文件都将被查找替换。</p>
<p></p>
<p>-----------------------------------------------</p>
<p> 更新第二版,更新内容</p>
<p> 1.这次用的vb做的一个dll组件,界面更漂亮了,增加了CAD应该是所有显示的文字的替换,可以修改被替代对象的颜色。</p>
<p> 如下图。</p>
<p></p>
<p></p>
<p> 2.启动更方便了,直接点击“<font style="BACKGROUND-COLOR: #ffffff" face="Verdana">批量查找替换</font>”的CAD文件启动(启动后记得点启用宏)。</p>
<p> 3.上一个版本做的很不成功,在好些人的电脑上面不能直接运行,需要调试后才能运行,这次试了好几个电脑没有发现问题。</p>
<p> 4..其它小细节方面。</p>
<p> </p>
<p>欢迎试用,有什么问题可以去我的空间说一下,呵呵!</p>
<p> </p>
<p> </p>
<p> </p>
<p>更新第2.1版,更新内容<br/>1.增加了表格内容替换选项。<br/>2.增加了一个状态栏,有了好些提示,而且可以显示系统时间。<br/>3.其它小细节。</p>
<p> </p>
<p></p>
<p> </p>
<p></p>
<p> </p>
<p> </p>
<p></p> 希望能改进,06版,或者更高版本都不行
命令: netload
无法加载程序集。错误详细信息: System.BadImageFormatException:
未能加载文件或程序集“file:///D:\SOFT\CAD批量替换\PiLiangTiHuan.dll”或它的某一
个依赖项。该模块应包含一个程序集清单。
文件名:“file:///D:\SOFT\CAD批量替换\PiLiangTiHuan.dll”
在 System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase,
Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark,
Boolean throwOnFileNotFound, Boolean forIntrospection)
在 System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase,
Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark,
Boolean throwOnFileNotFound, Boolean forIntrospection)
在 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,
Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
在 System.Reflection.Assembly.InternalLoadFrom(String assemblyFile, Evidence
securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm,
Boolean forIntrospection, StackCrawlMark& stackMark)
在 System.Reflection.Assembly.LoadFrom(String assemblyFile)
在 Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName)
在 loadmgd()
警告: 程序集绑定日志记录被关闭。
要启用程序集绑定失败日志记录,请将注册表值
(DWORD)设置为 1。
注意: 会有一些与程序集绑定失败日志记录关联的性能损失。
要关闭此功能,请移除注册表值 。 作者您好!一直在用您编写的“批量查找与替换”插件,感觉非常好!现在系统更换成64位的Win7,无法运行,还请您抽出宝贵的时间测试一下!联系方式:lwb@jns.net.cn 我的是CAD 2006,2.1和2.3版本都不能正常工作,点击确定后直接跳出完成对话榵,替换报告不出来,是不支持我的版本吗? <p>“批量查找替换.exe”程序代码。</p><p></p><p> Option Explicit<br/>'-------------------打开文件-------------<br/>Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long<br/>Private Const SW_SHOW = 5<br/>'-------------------打开文件-------------<br/>'-------------------切换线程-------------<br/>Private Declare Function GetWindowThreadProcessId Lib "user32" _<br/> (ByVal hwnd As Long, lpdwProcessId As Long) As Long<br/>Private Declare Function AttachThreadInput Lib "user32" _<br/> (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long<br/>Private Declare Function GetForegroundWindow Lib "user32" () As Long<br/>Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long<br/>Private Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long<br/>Private Declare Function ShowWindow Lib "user32" _<br/> (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long</p><p>'Private Const SW_SHOW = 5 '与打开文件里面的重复了,这里取消<br/>Private Const SW_RESTORE = 9<br/>'-------------------切换线程-------------</p><p>Private Sub Form_Load()<br/> Dim App As Object<br/> Dim AppDoc As Object<br/> Dim xlApp As Object 'Excel.Application<br/> Dim xlSheet As Object ' Worksheet<br/> <br/> Dim XPath As String<br/> <br/> Dim VBAProjectPath As String<br/> Dim i As Integer<br/> <br/> On Error Resume Next<br/> <br/> XPath = VB.App.Path<br/> <br/> DoEvents<br/> <br/> Set App = GetObject(, "autocad.Application")<br/> <br/> If Err.Number <> 0 Then<br/> Err.Clear<br/> ShellExecute Me.hwnd, "open", XPath & "\TT_AutoCAD启动页.dwg", vbNullString, vbNullString, SW_SHOW<br/> If Err Then<br/> MsgBox "没有发现正在运行中的AutoCAD,请先启动AutoCAD软件!", vbInformation, "提示"<br/> Err.Clear<br/> <br/> End<br/> End If<br/>DengDai:</p><p> Set App = GetObject(, "autocad.Application")<br/> 'MsgBox "没有发现正在运行中的AutoCAD,请先启动AutoCAD软件!", vbInformation, "提示"<br/> ' End<br/> End If<br/> <br/> If App.Documents.Count = 0 Then<br/> App.Documents.Add<br/> End If<br/> <br/> Set AppDoc = App.ActiveDocument<br/> If Err Then<br/> Err.Clear<br/> GoTo DengDai<br/> End If<br/> <br/> <br/> For i = 1 To Len(XPath)<br/> If Mid(XPath, i, 1) = "\" Then<br/> VBAProjectPath = VBAProjectPath & "/"<br/> Else<br/> <br/> VBAProjectPath = VBAProjectPath & Mid(XPath, i, 1)<br/> <br/> End If<br/> Next i<br/> <br/> Set xlApp = GetObject(, "Excel.Application")<br/> Set xlSheet = xlApp.Workbooks("TT_AutoCAD文字自动替代").ActiveSheet<br/> <br/> If Err Then<br/> <br/> Err.Clear<br/> ShellExecute Me.hwnd, "open", XPath & "\TT_AutoCAD文字自动替代.xls", vbNullString, vbNullString, SW_SHOW<br/> <br/> End If<br/> ForceForegroundWindow Me.hwnd<br/> DoEvents<br/> <br/> ForceForegroundWindow App.hwnd<br/> AppDoc.SendCommand "-vbarun " & VBAProjectPath & "/批量打开文件文字替代.dvb!ThisDrawing.PiLiangTiHuan "<br/> <br/> <br/> <br/> ForceForegroundWindow App.hwnd<br/> End<br/> <br/>End Sub<br/>Public Function ForceForegroundWindow(ByVal hwnd As Long) As Boolean<br/> Dim ThreadID1 As Long ' 线程ID<br/> Dim ThreadID2 As Long ' 线程ID<br/> Dim nRet As Long<br/> <br/> ' 如果指定的窗体已经在前台,不做任何操作<br/> If hwnd = GetForegroundWindow() Then<br/> ForceForegroundWindow = True<br/> Else<br/> ' 首先获得指定窗体相关的线程和当前前台窗口所在的线程<br/> ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0&)<br/> ThreadID2 = GetWindowThreadProcessId(hwnd, ByVal 0&)<br/> <br/> ' 通过共享输入状态,两个线程分享当前窗口<br/> If ThreadID1 <> ThreadID2 Then<br/> Call AttachThreadInput(ThreadID1, ThreadID2, True)<br/> nRet = SetForegroundWindow(hwnd)<br/> Call AttachThreadInput(ThreadID1, ThreadID2, False)<br/> Else<br/> nRet = SetForegroundWindow(hwnd)<br/> End If<br/> <br/> ' 恢复和重画<br/> If IsIconic(hwnd) Then<br/> Call ShowWindow(hwnd, SW_RESTORE)<br/> Else<br/> Call ShowWindow(hwnd, SW_SHOW)<br/> End If<br/> <br/> ' 精确地返回函数执行结果<br/> ForceForegroundWindow = CBool(nRet)<br/> End If<br/>End Function</p> 谢谢 试用了一下 就是老爱出现“内存溢出”的错误 欢迎试用第二版,呵呵!! <p>高手,佩服</p> <p><font style="BACKGROUND-COLOR: #ffffff" face="Verdana"></font></p>
<p> </p>
<p><font style="BACKGROUND-COLOR: #ffffff" face="Verdana">更新第2.2版,更新内容<br/> 1.增加了批量移出,批量保留功能。本版本没有上传到网络。<br/> </font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" face="Verdana">-----------------------------------------------------------------<br/>更新第2.3版,更新内容<br/> 1.增加了图纸空间替换,但是只能替换默认图纸空间,如果你的一个图里面有两个布局的话,第二个布局就替换不了,由于水平有限没有好的办法解决,如果你有方法,请去我的空间留言吧,谢谢。。<br/> 2.增加了公差的文字替换。<br/> 3.在替换报告里面增加了为你节省了多少时间,然后换算成金钱有多少,呵呵,让你切实感受到本软件的好处。<br/> 4.其它小细节吧。</font></p>
<p> </p>
<p></p> 下来试一试 下来试一试,谢谢楼主 俺以前也做过类似的程序,http://bbs.mjtd.com/forum.php?mod=viewthread&tid=32200&highlight=%B6%E0%D6%D8
几点建议:
1. 能完成dtext的替换
2. 能完成mtext的替换
3. 能完成块属性的替换
4. 能完成块内text的替换
5. 替换的规则是什么,只修改一次还是每次对修改后的文本重新进行替换?(“AA”替换成“AA+”是死循环么?“AA”替换成“A”会导致“AAAA”变成“AA”还是“A”?) 回复 mikewolf2k 的帖子
只替换一次,不是死循环