乐筑天下

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

eNullObjectID

[复制链接]

23

主题

75

帖子

58

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
143
发表于 2018-4-16 11:42:18 | 显示全部楼层 |阅读模式
我得到了一个enullobject错误。我想我找到了答案herehttp://www.theswamp.org/index.php?topic=47128.msg521607#msg521607,但我无法让它工作。我还试图锁定绘图,但没用。它轰炸的文件已锁定其中的视口。出于某些原因,代码会编辑视口大小和位置。根据错误消息,是否是锁定的视口导致了错误
原始代码:
  1.     Public Function FindReplace(ldate As String, fn As String, strFind As List(Of String), strReplace As List(Of String))
  2.         Dim ed As Autodesk.AutoCAD.EditorInput.Editor = Core.Application.DocumentManager.MdiActiveDocument.Editor,
  3.             db As Database = New Database(False, True),
  4.             dwgDir As String = IO.Path.GetDirectoryName(fn),
  5.             dwgName As String = IO.Path.GetFileName(fn),
  6.             dwgfullname As String = dwgDir & "" & dwgName,
  7.             log As New List(Of String)
  8.         Using db
  9.             Try 'FileOpenMode.OpenForReadAndAllShare
  10.                 db.ReadDwgFile(fn, FileOpenMode.OpenForReadAndAllShare, False, Nothing)
  11.             Catch __unusedException1__ As System.Exception
  12.                 ed.WriteMessage(vbLf & "Unable to read drawing file.")
  13.             End Try
  14.             Dim lg As New List(Of String())(),
  15.                 txtClass = RXObject.GetClass(GetType(DBText)),
  16.                 mtxtClass = RXObject.GetClass(GetType(MText)),
  17.                 blkrefClass = RXObject.GetClass(GetType(BlockReference))
  18.             Using tr = db.TransactionManager.StartTransaction
  19.                 Dim loDic As DBDictionary = CType(tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead, False), DBDictionary)
  20.                 For Each entry As DBDictionaryEntry In loDic
  21.                     Dim layout = CType(tr.GetObject(entry.Value, OpenMode.ForRead), Layout)
  22.                     Dim btr As BlockTableRecord = CType(tr.GetObject(layout.BlockTableRecordId, OpenMode.ForRead), BlockTableRecord)
  23.                     For Each objID As ObjectId In btr
  24.                         If objID.ObjectClass.IsDerivedFrom(blkrefClass) Then
  25.                             Dim blkRef As BlockReference = CType(tr.GetObject(objID, OpenMode.ForRead), BlockReference),
  26.                                 acblkName As String = blkRef.Name,        '        Error is here
  27.                                 nbtr As BlockTableRecord = CType(tr.GetObject(blkRef.BlockTableRecord, OpenMode.ForRead), BlockTableRecord),
  28.                                 attCol As AttributeCollection = blkRef.AttributeCollection
  29.                             If attCol IsNot Nothing Then
  30.                                 For Each attId As ObjectId In attCol
  31.                                     Dim att As AttributeReference = CType(tr.GetObject(attId, OpenMode.ForWrite), AttributeReference),
  32.                                             wksp As String = att.BlockName.ToString,
  33.                                             hand As String = att.Handle.ToString,
  34.                                             val As String = att.TextString,
  35.                                             locX As String = att.Position.X.ToString,
  36.                                             locY As String = att.Position.Y.ToString,
  37.                                             locZ As String = att.Position.Z.ToString
  38.                                     For i = 0 To strFind.Count - 1
  39.                                         If val.Contains(strFind(i)) = True Then
  40.                                             att.TextString = val.Replace(strFind(i), strReplace(i))
  41.                                             att.RecordGraphicsModified(True)
  42.                                             att.AdjustAlignment(db)
  43.                                             log.Add(ldate & "," & att.TextString & "," & val & "," & "Attribute" & "," & dwgName & "," & wksp & "," & hand & "," & locX & "," & locY & "," & locZ)
  44.                                             Dim wbd As Database = HostApplicationServices.WorkingDatabase
  45.                                             HostApplicationServices.WorkingDatabase = db
  46.                                             att.AdjustAlignment(db)
  47.                                         End If
  48.                                     Next
  49.                                 Next
  50.                             End If
  51.                         End If
  52.                     Next
  53.                 Next
  54.                 tr.Commit()
  55.             End Using
  56.             db.SaveAs(fn, DwgVersion.AC1027)
  57.         End Using
  58.         Return log
  59.     End Function

尝试修复它:
  1.     Public Function FindReplace(ldate As String, fn As String, strFind As List(Of String), strReplace As List(Of String))
  2.         ' Using docLock As DocumentLock = Core.Application.DocumentManager.MdiActiveDocument.LockDocument()
  3.         Dim ed As Autodesk.AutoCAD.EditorInput.Editor = Core.Application.DocumentManager.MdiActiveDocument.Editor,
  4.             db As Database = New Database(False, True),
  5.             dwgDir As String = IO.Path.GetDirectoryName(fn),
  6.             dwgName As String = IO.Path.GetFileName(fn),
  7.             dwgfullname As String = dwgDir & "" & dwgName,
  8.             log As New List(Of String)
  9.         Using db
  10.             Try 'FileOpenMode.OpenForReadAndAllShare
  11.                 db.ReadDwgFile(fn, FileOpenMode.OpenForReadAndAllShare, False, Nothing)
  12.             Catch __unusedException1__ As System.Exception
  13.                 ed.WriteMessage(vbLf & "Unable to read drawing file.")
  14.             End Try
  15.             Dim lg As New List(Of String())(),
  16.                 txtClass = RXObject.GetClass(GetType(DBText)),
  17.                 mtxtClass = RXObject.GetClass(GetType(MText)),
  18.                 blkrefClass = RXObject.GetClass(GetType(BlockReference))
  19.             Using tr = db.TransactionManager.StartTransaction
  20.                 Dim loDic As DBDictionary = CType(tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead, False), DBDictionary)
  21.                 For Each entry As DBDictionaryEntry In loDic
  22.                     Dim layout = CType(tr.GetObject(entry.Value, OpenMode.ForRead), Layout)
  23.                     Dim btr As BlockTableRecord = CType(tr.GetObject(layout.BlockTableRecordId, OpenMode.ForRead), BlockTableRecord)
  24.                     For Each objID As ObjectId In btr
  25.                         If objID.ObjectClass.IsDerivedFrom(txtClass) Then
  26.                             Dim txt As DBText = CType(tr.GetObject(objID, OpenMode.ForWrite), DBText),
  27.                                 wksp As String = txt.BlockName.ToString,
  28.                                 hand As String = txt.Handle.ToString,
  29.                                 val As String = txt.TextString,
  30.                                 locX As String = txt.Position.X.ToString,
  31.                                 locY As String = txt.Position.Y.ToString,
  32.                                 locZ As String = txt.Position.Z.ToString
  33.                             For i = 0 To strFind.Count - 1
  34.                                 If val.Contains(strFind(i)) Then
  35.                                     txt.TextString = val.Replace(strFind(i), strReplace(i))
  36.                                     txt.RecordGraphicsModified(True)
  37.                                     log.Add(ldate & "," & txt.TextString & "," & val & "," & "DBText" & "," & dwgName & "," & wksp & "," & hand & "," & locX & "," & locY & "," & locZ)
  38.                                     '   Need this code in order to insure that the attributes alignment remains
  39.                                     txt.AdjustAlignment(db)
  40.                                 End If
  41.                             Next
  42.                         End If
  43.                         If objID.ObjectClass.IsDerivedFrom(mtxtClass) Then
  44.                             Dim mtxt As MText = CType(tr.GetObject(objID, OpenMode.ForWrite), MText),
  45.                                        wksp As String = mtxt.BlockName.ToString,
  46.                                        hand As String = mtxt.Handle.ToString,
  47.                                        val As String = mtxt.Contents.ToString,
  48.                                        locX As String = mtxt.Location.X.ToString,
  49.                                        locY As String = mtxt.Location.Y.ToString,
  50.                                        locZ As String = mtxt.Location.Z.ToString
  51.                             For i = 0 To strFind.Count - 1
  52.                                 If val.Contains(strFind(i)) = True Then
  53.                                     mtxt.Contents = val.Replace(strFind(i), strReplace(i))
  54.                                     mtxt.RecordGraphicsModified(True)
  55.                                     log.Add(ldate & "," & mtxt.Contents & "," & val & "," & "MText" & "," & dwgName & "," & wksp & "," & hand & "," & locX & "," & locY & "," & locZ)
  56.                                 End If
  57.                             Next
  58.                         End If
  59.                         If objID.ObjectClass.IsDerivedFrom(blkrefClass) Then
  60.                             Dim blkRef As BlockReference = CType(tr.GetObject(objID, OpenMode.ForRead), BlockReference)
  61.                             If blkRef IsNot Nothing Then
  62.                                 Dim nbtr As BlockTableRecord = CType(tr.GetObject(blkRef.BlockTableRecord, OpenMode.ForRead), BlockTableRecord), ' This is line 430
  63.                                     acblkName As String = blkRef.Name,
  64.                                     attCol As AttributeCollection = blkRef.AttributeCollection
  65.                                 If attCol IsNot Nothing Then
  66.                                     For Each attId As ObjectId In attCol
  67.                                         Dim att As AttributeReference = CType(tr.GetObject(attId, OpenMode.ForWrite), AttributeReference),
  68.                                                 wksp As String = att.BlockName.ToString,
  69.                                                 hand As String = att.Handle.ToString,
  70.                                                 val As String = att.TextString,
  71.                                                 locX As String = att.Position.X.ToString,
  72.                                                 locY As String = att.Position.Y.ToString,
  73.                                                 locZ As String = att.Position.Z.ToString
  74.                                         For i = 0 To strFind.Count - 1
  75.                                             If val.Contains(strFind(i)) = True Then
  76.                                                 att.TextString = val.Replace(strFind(i), strReplace(i))
  77.                                                 att.RecordGraphicsModified(True)
  78.                                                 att.AdjustAlignment(db)
  79.                                                 log.Add(ldate & "," & att.TextString & "," & val & "," & "Attribute" & "," & dwgName & "," & wksp & "," & hand & "," & locX & "," & locY & "," & locZ)
  80.                                                 Dim wbd As Database = HostApplicationServices.WorkingDatabase
  81.                                                 HostApplicationServices.WorkingDatabase = db
  82.                                                 att.AdjustAlignment(db)
  83.                                             End If
  84.                                         Next
  85.                                     Next
  86.                                 End If
  87.                             End If
  88.                         End If
  89.                     Next
  90.                 Next
  91.                 tr.Commit()
  92.             End Using
  93.             db.SaveAs(fn, DwgVersion.AC1027)
  94.             'db.SaveAs(fn, Autodesk.AutoCAD.DatabaseServices.DwgVersion.Current)
  95.         End Using
  96.         Return log
  97.         ' End Using
  98.     End Function

错误消息:
应用程序不支持实时(JIT)
调试。有关详细信息,请参阅此消息的结尾
**********例外文本************
Autodesk.AutoCAD.Runtime。例外:Autodesk.AutoCAD.DatabaseServices.TransactionManager中的EnulObjectId
。GetObjectInternal(AcDbTransactionManager*pTM、ObjectId、OpenMode模式、布尔openErased、布尔强制OpenOnLockedLayer)
位于Autodesk.AutoCAD.DatabaseServices.Transaction。Joshua.frmPermianBasinWellSiteFacilityGenerator上的GetObject(ObjectId,OpenMode模式)
。在E:\Joshua\16APR18\Joshua \frmPermianBasinWellSiteFacilityGenerator中查找替换(字符串ldate,字符串fn,列表'1 strFind,列表'1strReplace)。vb:Joshua.frmPermianBasinWellSiteFacilityGenerator的第430行。cmdGenerate_Click(对象发送者,事件参数e)在e:\Joshua\16APR18\Joshua \frmPermianBasinWellSiteFacilityGenerator中。vb:System.Windows.Forms.Control中的第231行
。单击System.Windows.Forms.Button上的(EventArgs e)
。单击System.Windows.Forms.Button上的(EventArgs e)
。OnMouseUp(MouseEventArgs-mevent)
位于System.Windows.Forms.Control。WmMouseUp(消息&m,鼠标按钮,Int32点击)
位于System.Windows.Forms.Control。在System.Windows.Forms.ButtonBase上的WndProc(消息和消息)
。在System.Windows.Forms.Button上显示WndProc(消息和消息)
。在System.Windows.Forms.NativeWindow上显示WndProc(消息和消息)
。回调(IntPtr hWnd、Int32 msg、IntPtr wparam、intptrLPRAM)

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

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

使用道具 举报

0

主题

10

帖子

5

银币

初来乍到

Rank: 1

铜币
11
发表于 2018-4-23 02:21:14 | 显示全部楼层
MGDDBG是你的朋友,会让你看这些有问题的实体。
我很好奇你为什么要测试rxclass isderivedfrom,你希望在这里得到什么?
我想您的意思是从objectid中获取rxclass并测试它是否等于blockreference的值
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 10:32 , Processed in 0.148072 second(s), 56 queries .

© 2020-2025 乐筑天下

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