代码从VB2008传输到
如果您一直在关注我的“升级”线程,您会知道,直到本周,我使用Visual Basic Express 2008构建了第一个用于AutoCAD 2011的例程。本周我使用AutoCAD 2013,从今天早上开始使用VB Express 2010。下面的例程逐步遍历文件列表,并在名为“套圈”的层上查找文本。如果文本存在,则将该文本写入另一个文件。
我在VBE 2010中启动了一个新项目,并从VBE 2008版本中复制了代码。2008年的版本运行得很好,但新版本要么是“致命错误”,要么是“如果运行”,要么是“如果通过”,需要从myDB中获得永远的信息。使用myTr作为线将DWG线读取到。
此帖子太长,因此代码位于回复帖子中。
你能看出我哪里出了错吗?
TIA 第一段代码。。。。
<CommandMethod("EFM")> _
PublicSub ExtractFromMultiple()
'this bit can open lots of drawings. Use it to print FERRULES text
Dim myOFD AsNew OpenFileDialog("Select DWG", "", "dwg", "Select DWG", _
OpenFileDialog.OpenFileDialogFlags.AllowMultiple)
If myOFD.ShowDialog = System.Windows.Forms.DialogResult.OK Then
ForEach myFileName AsStringIn myOFD.GetFilenames
Dim FileName AsString = myFileName
Dim FolderName AsString = ""
Call FindFolder(FileName, FolderName)
Dim myList AsNew List(OfString)
Dim myDB AsNew DatabaseServices.Database
If (System.IO.File.Exists(myFileName)) Then
'Big delay here.....
myDB.ReadDwgFile(myFileName, FileOpenMode.OpenForReadAndAllShare, False, "")
Using myTr As Transaction = myDB.TransactionManager.StartTransaction()
剩下的(对于一个帖子来说,这真的太长了吗?)
Dim myBT As BlockTable = myDB.BlockTableId.GetObject(OpenMode.ForRead)
Dim myBTR As DatabaseServices.BlockTableRecord = myBT(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForRead)
ForEach myObjID As ObjectId In myBTR
Dim myEntity As Entity = myObjID.GetObject(OpenMode.ForRead)
If Left(UCase(myEntity.Layer), 4) = "FERR"Then
SelectCase myEntity.ObjectId.ObjectClass.Name
Case"AcDbText"
Dim textObj As DBText = myTr.GetObject(myEntity.ObjectId, OpenMode.ForRead, False, True)
myList.Add(textObj.TextString)
textObj.Dispose()
Case"AcDbMText"
Dim mtextObj As MText = myTr.GetObject(myEntity.ObjectId, OpenMode.ForRead, False, True)
myList.Add(mtextObj.Contents)
mtextObj.Dispose()
EndSelect
EndIf
Next
EndUsing
Call PrintList(myList, FileName, FolderName)
EndIf
myDB.Dispose()
Next
MsgBox("Finished")
EndIf
EndSub
在这里自言自语(不是第一次)我似乎找到了解决办法。
'myDB.ReadDwgFile(myFileName, FileOpenMode.OpenForReadAndAllShare, False, "")
myDB.ReadDwgFile(myFileName, FileOpenMode.OpenForReadAndReadShare, False, "")
以稍微不同的方式设置文件打开模式似乎可以使其工作。
知道为什么吗?
------------------------------------
当然,如果其他人打开了该文件,例程就会失效
只是路过。。。无法对FileOpenMode进行注释,但对于正在打开的文件,要么实现适当的Try+Catch[+Finally]块来处理该异常,要么使用FileInfo。IsReadOnly属性作为代码逻辑的一部分,以完全避免异常。
编辑你的帖子,看看代码中嵌入了什么。
如果内存可用,这是一个与浏览器相关的问题(我不再有了)*不确定*。。。无论如何,我(然后)必须首先将Visual Studio中的代码粘贴到Notepad++,然后从那里粘贴到我的帖子中。
我明白你的意思。。。。
(好的,继续为您格式化…) Dave我稍微修改了你的代码,
查看如何删除新数据库
Soory没有时间测试
<CommandMethod("EFM")> _
Public Sub ExtractFromMultiple()
'this bit can open lots of drawings. Use it to print FERRULES text
Dim myOFD As New Autodesk.AutoCAD.Windows.OpenFileDialog("Select DWG", "", "dwg", "Select DWG", _
Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags.AllowMultiple)
If myOFD.ShowDialog = System.Windows.Forms.DialogResult.OK Then
For Each myFileName As String In myOFD.GetFilenames
Dim FileName As String = myFileName
Dim FolderName As String = ""
'' Call FindFolder(FileName, FolderName)
FolderName = Path.GetDirectoryName(FileName)
Dim myList As New List(Of String)
'Dim myDB As New Database
If (System.IO.File.Exists(myFileName)) Then
Using myDB As Database = New Database(False, True)
'Big delay here.....
myDB.ReadDwgFile(myFileName, FileOpenMode.OpenForReadAndAllShare, False, "")
Using myTr As Transaction = myDB.TransactionManager.StartTransaction()
Dim myBT As BlockTable = myDB.BlockTableId.GetObject(OpenMode.ForRead)
Dim myBTR As BlockTableRecord = myBT(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForRead)
For Each myObjID As ObjectId In myBTR
Dim myEntity As Entity = myObjID.GetObject(OpenMode.ForRead)
If Left(UCase(myEntity.Layer), 4) = "FERR" Then
Select Case (myEntity.ObjectId.ObjectClass.Name)
Case "AcDbText"
Dim textObj As DBText = DirectCast(myTr.GetObject(myEntity.ObjectId, OpenMode.ForRead, False, True), DBText)
myList.Add(textObj.TextString)
textObj.Dispose()
Case "AcDbMText"
Dim mtextObj As MText = DirectCast(myTr.GetObject(myEntity.ObjectId, OpenMode.ForRead, False, True), MText)
myList.Add(mtextObj.Contents)
mtextObj.Dispose()
End Select
End If
Next
End Using
End Using
Call PrintList(myList, FileName, FolderName)
End If
'' myDB.Dispose() no need Dispose coz this one is inside code block
Next
MsgBox("Finished")
End If
End Sub
您好,Oleg,您能告诉我(或者告诉我在哪里可以自己阅读)ReadDwgFile(“FileName”,fileOpenModelforReadandAllShare,…)之间的区别吗,和ReadDwgFile(“FileName”,System.IO.FileShare.ReadWrite,…)正如ADNDevBlog的Autgusto所示? 菲索,非常感谢。
我仔细地把你的修改输入到我的代码中,这样我就可以看到它们的区别了。我的原始代码是从其他几个例程复制过来的,我不确定要删除哪些部分。我会学习你的。很明显,我抄错了,虽然它不断出错,所以我现在贴了很多,它工作了!这是一条线的近似值。我不得不恢复我的FindFolder程序作为你的
FolderName = Path.GetDirectoryName(FileName)
线路给了我一个未声明错误的路径。这是你自己的函数还是我遗漏了一个引用?
页:
[1]
2