| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: ReadDwgFile --- eSelfReference Error (2848 mal gelesen)
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2010 11:28 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich bekomme jetzt wenn ich von einer externen Dwg den Rahmen und SK einlese einen eSelfReference Fehler(eingefügt werden sie aber teilweise trotzdem) was bedeutet so ein Fehler? Code:
"HEAD" ist der Name des Blocks, so wie er in der Datei "NewTitleBlockFile" heißt.ReadFromDWGFile(NewTitleBlockFile, "HEAD") Public Function ReadFromDWGFile(ByVal dwgfile As String, ByVal Blockname As String) As ObjectId Dim newSKID = Nothing Dim tAcadDocLock As ApplicationServices.DocumentLock = Nothing Dim myTransMan As DatabaseServices.TransactionManager = Nothing Dim myTrans As DatabaseServices.Transaction = Nothing Dim myDwg As Document = Nothing Dim mydb As DatabaseServices.Database = Nothing Dim tBlTabRecID As ObjectId = Nothing Dim OldBorder As DatabaseServices.BlockReference = Nothing Dim tDB As Database = Nothing Try 'Schriftkopf aus Datei laden If IO.File.Exists(dwgfile) Then myDwg = ApplicationServices.Application.DocumentManager.MdiActiveDocument tAcadDocLock = myDwg.LockDocument myTransMan = myDwg.TransactionManager myTrans = myTransMan.StartTransaction mydb = myDwg.Database
tDB = New Database(False, True) tDB.ReadDwgFile(dwgfile, IO.FileShare.None, True, "") tBlTabRecID = myDwg.Database.Insert(Blockname, tDB, False) Else MsgBox("file: " & dwgfile & " could not be found!") End If Catch ex As Exception MsgBox("ReadFromDWG:" & ex.Message & vbNewLine & ex.StackTrace) Finally If myTrans IsNot Nothing Then myTrans.Commit() : myTrans.Dispose() : myTrans = Nothing If myTransMan IsNot Nothing Then myTransMan.Dispose() : myTransMan = Nothing If tAcadDocLock IsNot Nothing Then tAcadDocLock.Dispose() End Try Return tBlTabRecID End Function
Zitat:
Hi,>> eSelfReference Fehler Normalerweise bedeutet das, dass Du versuchst, eine Zeichnung 'X' als Block einzufügen, die ihrerseites eine (gleichnamige) Blockdefinition 'X' enthält. Dann dürfte aber auch nichts eingefügt werden, er müsste crashen dabei. Bei welcher Zeile kommt denn der Fehler? Gibt es die entsprechenden Zeichnungen dazu, womit der Fehler für uns reproduzierbar ist? - alfred -
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2010 11:31 <-- editieren / zitieren --> Unities abgeben:
Beim Rahmen war eine unterschiedliche Benennung von Datei und Block erfolgreich, beim Schriftkopf nicht, er wird aber trotzdem eingefügt.Es existiert vorher kein Block der so heißt wie der neue Schriftkopf. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 08. Feb. 2010 11:51 <-- editieren / zitieren -->
Hi, wie schon per PM, ohne Zeichnungen, mit denen dieses auftritt, ist's schwer bis unmöglich, was stichhaltiges auszusagen. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2010 13:44 <-- editieren / zitieren --> Unities abgeben:
So ich wollte gerade den Schriftkopf bereinigen(alle Attribute und Texte raus) und nochmal testen, ob der Fehler jetzt auch noch kommt,Fehler kam wieder UND es wurde wieder der Schriftkopf mit den Attributen und Texten eingefügt, obwohl er unter _insert nicht mehr auswählbar war und ich vorher _purge ausgeführt habe. Kann ich da noch etwas vergessen haben, wo kann er das gespeichert haben? SK ist angehängt... edit: Habe eine andere Lösung, Ursprünglich waren Rahmen und Sk in einer Datei, ich habe dass wieder so belassen und einfach diese Zeichung eingelesen. Dann per .explodeToOwnerSpace gesprengt. Was ist da der unterschied zum normalen .explode(dbojectcollection) ? mfg [Diese Nachricht wurde von veydan am 08. Feb. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Feb. 2010 21:18 <-- editieren / zitieren -->
Hi Silvan, spät aber doch mal zum Code: Ich habe Deinen Code soweit reduziert, dass das Problem auftauchen sollte, tut es aber nicht. Hier mein Code:
Code: Public Shared Sub CADde_Silvan03() Dim tDoc As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim tDocDB As DatabaseServices.Database = tDoc.Database Dim tDocLock As ApplicationServices.DocumentLock = Nothing Dim tTrAct As DatabaseServices.Transaction = Nothing Dim tDwgFileName As String = "C:\TEMP\TB.dwg" Dim tBlockName As String = "TB" Dim tBlTabRecID As ObjectId = Nothing
Dim tDB As DatabaseServices.Database = Nothing Try 'Schriftkopf aus Datei laden If IO.File.Exists(tDwgFileName) Then tDocLock = tDoc.LockDocument tTrAct = tDoc.TransactionManager.StartTransaction tDB = New Database(False, True) tDB.ReadDwgFile(tDwgFileName, IO.FileShare.None, True, "") tBlTabRecID = tDocDB.Insert(tBlockName, tDB, False) 'wenn bisher keine Exception aufgetreten ist, dann bestätigen tTrAct.Commit() Else MsgBox("File: " & tDwgFileName & " could not be found!") End If Catch ex As Exception MsgBox("ReadFromDWG:" & ex.Message & vbNewLine & ex.StackTrace) Finally If tTrAct IsNot Nothing Then tTrAct.Dispose() : tTrAct = Nothing If tDocLock IsNot Nothing Then tDocLock.Dispose() : tDocLock = Nothing End Try End Sub
Einzige strukturelle 'echte' Änderung von mir ist, dass ich TrAct.Commit an die Stelle gesetzt habe, von der ich weiss, dass alles bis dahin ohne Exception abgelaufen ist. Du hast in Deinem Code das Commit in den Finally-Teil von Try-Catch gesetzt, damit wird das Commit auch durchgeführt, wenn Fehler aufgetreten sind. Dass der Fehler bei mir nicht reproduzierbar ist, kann aber auch daran liegen, dass ich nicht die gleiche Zeichnung wie Du habe, in welche der Block TB importiert wird. Ich hab's nur mit einer leeren Zeichnung probieren können. >> Was ist da der unterschied zum normalen .explode(dbojectcollection)
Aus der Hilfe: Explodes the block reference into individual components. It appends the resulting entities to the BlockTableRecord that owns the BlockReference on which this method was called Bedeutet, wenn die Blockreference im Modellbereich eingefügt ist, dann werden die aus dem 'explode' resultierenden Elemente dem Modellbereich hinzugefügt. .explode(DbObjColl) erstellt explodierte Elemente nur in der Collection, wird aber nicht einem Modellbereich/Papierbereich/... zugeordnet. Es sind also nur temporäre Objekte, jedenfalls nicht in der Database. - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|