| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Database.saveas erzeugt fehlerhafte Dateien (1526 mal gelesen)
|
Andreas Widmann Mitglied ATHENA Support/Training
Beiträge: 218 Registriert: 24.08.2005 Windows 10 Autocad 2015 - 2018 Athena 2015 - 2017 Aufsatz
|
erstellt am: 12. Sep. 2013 18:02 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich kämpfe arg mit einem Batchprogramm das ich geschrieben habe und leider drängt es. Das Programm öffnet eine DWG, welche nur Linien, Bögen und Kreise sowie einen Mtext enthält, spiegelt dort alle Elemente ausser dem enthaltenen Text, verschiebt den Text an den Rand der Geometrie und speichert, nach einer Überprüfung ob der Text Geometrie schneidet, die Datei in einem anderen Ordner ab. Ich bin der Meinung alles richtig gemacht zu haben, aber wenn ich anschließend die gespeicherten DWG öffne, kommt die Meldung dass Fehler enthalten sind und ich diese doch besser Wiederherstellen soll. Die Meldung kommt beim Original nicht. Problem dabei ist, es handelt sich um 7000 Dateien und ich muss Sie danach in DXF konvertieren.... dieser Batchprozess steigt mir bei diesen Dateien aber leider aus. hier der Code: Code: Public Function doesDWGFilehasIntersectWithText(fi As FileInfo) As String Dim IntersectingResult As String = "Gueltig" Dim versuch As Integer = 0 NOCHMAL: Dim dbase As Database = New Database() Dim txt As MText = Nothing Dim ents As New List(Of Entity) Try versuch += 1 dbase.ReadDwgFile(fi.FullName, FileOpenMode.OpenForReadAndWriteNoShare, True, "") dbase.CloseInput(True) 'Den Text suchen und alle Elemente sammeln 'Finde die geringsten und höchsten X-Werte der Linien 'Wird für die Berechnung der Spiegelung und der Textverschiebung benötigt Dim minx As Double = 50000000 Dim maxx As Double = -500000000 Using actrans As Transaction = dbase.TransactionManager.StartTransaction Dim mid As ObjectId = Autodesk.AutoCAD.DatabaseServices.SymbolUtilityServices.GetBlockModelSpaceId(dbase) Dim modspace As BlockTableRecord = CType(mid.GetObject(OpenMode.ForRead), BlockTableRecord) For Each ent As ObjectId In modspace If TypeOf (ent.GetObject(OpenMode.ForRead)) Is MText Then txt = CType(ent.GetObject(OpenMode.ForWrite), MText) Else If TypeOf (ent.GetObject(OpenMode.ForRead)) Is Entity Then ents.Add(CType(ent.GetObject(OpenMode.ForWrite), Entity)) If TypeOf (ent.GetObject(OpenMode.ForRead)) Is Line Then Dim lin As Line = CType(ent.GetObject(OpenMode.ForRead), Line) If minx > lin.StartPoint.X Then minx = lin.StartPoint.X If minx > lin.EndPoint.X Then minx = lin.EndPoint.X If maxx < lin.StartPoint.X Then maxx = lin.StartPoint.X If maxx < lin.EndPoint.X Then maxx = lin.EndPoint.X End If End If End If Next Using mirrline As New Line3d(New Point3d(minx + (maxx - minx) / 2, 0, 0), New Point3d(minx + (maxx - minx) / 2, 50, 0)) Dim mir As Matrix3d = Matrix3d.Mirroring(mirrline) For Each ent As Entity In ents 'ent.UpgradeOpen() ent.TransformBy(mir) Next End Using 'actrans.Commit() 'End Using 'Using actrans As Transaction = dbase.TransactionManager.StartTransaction If txt Is Nothing Then IntersectingResult = "Ueberschneidung" Else 'Textposition ermitteln und Distanz zur jeweiligen X-Aussengrenze ermitteln 'Der Text wird dann in Richtung der näheren Kante verschoben um die Distanz -2mm verschoben Dim txtbounding As Point3dCollection = txt.GetBoundingPoints Dim movement As Double = 500 For Each pnt As Point3d In txtbounding Dim disttomin As Double = minx - pnt.X + 1 Dim disttomax As Double = maxx - pnt.X - 1 If Math.Abs(disttomin) < Math.Abs(movement) Then movement = disttomin If Math.Abs(disttomax) < Math.Abs(movement) Then movement = disttomax Next If movement = 500 Then movement = 0 Dim mov As Matrix3d = Matrix3d.Displacement(New Vector3d(movement, 0, 0)) 'txt.UpgradeOpen() txt.TransformBy(mov) actrans.Commit() 'Gültigkeitsprüfung ob der Text noch mit Elementen schneidet For Each ent As Entity In ents Dim intpts As New Autodesk.AutoCAD.Geometry.Point3dCollection() txt.IntersectWith(ent, Intersect.OnBothOperands, intpts, 0, 0) If intpts.Count > 0 Then IntersectingResult = "Ueberschneidung" Exit For End If Next End If End Using dbase.UpdateExt(True) 'dbase.CloseInput(True) Select Case IntersectingResult Case "Gueltig" dbase.SaveAs(ValidDir.FullName & "\" & fi.Name, DwgVersion.Current) Case "Ueberschneidung" dbase.SaveAs(IntersectDir.FullName & "\" & fi.Name, DwgVersion.Current) Case "Fehler" 'Dateien bei denen ein Fehler aufgetreten ist werden nicht gespeichert 'Grund: Fehler beim speichern können so nicht abgefangen werden, und dann 'wäre nur ein Teil der Fehlerdateien im Fehlerordner End Select ents.Clear() 'txt.Dispose() 'dbase.Dispose() Catch ex As System.Exception Try If Not dbase Is Nothing Then dbase.CloseInput(True)
ents.Clear() If Not txt Is Nothing Then txt.Dispose() 'If Not dbase Is Nothing Then dbase.Dispose() Catch Beep() End Try If Not versuch > 2 Then GoTo Nochmal Else IntersectingResult = "Fehler" End Try Return IntersectingResult End Function
Wie ihr vielleicht am Code sehen könnt, passieren auch manchmal Fehler beim Speichern... warum ist mir schleierhaft. Alles befindet sich lokal auf der Platte. Ich bitte um Hilfe! Verwendetes System: Visual Studio und AutoCAD 2013 ------------------ Gruß Andreas ------------------------------------------------------------------------------------------------------------------------------------ Die Antwort ist 42! Die Antwort ist 42! Die Antwort ist 42! ...wenn ich nur die Frage wüsste... [Diese Nachricht wurde von Andreas Widmann am 12. Sep. 2013 editiert.] [Diese Nachricht wurde von Andreas Widmann am 12. Sep. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 12. Sep. 2013 18:23 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Widmann
|
Andreas Widmann Mitglied ATHENA Support/Training
Beiträge: 218 Registriert: 24.08.2005
|
erstellt am: 12. Sep. 2013 18:29 <-- editieren / zitieren --> Unities abgeben:
dbase.dispose war auch schon drin, hat keinen Unterschied gemacht. Aber mach ich wieder rein. Welche Parameterwerte schlägst du für buildDefaultDrawing und noDocument vor? Hilft es weiter zu sagen, dass ich nur über Datenbankzugriff arbeite und die Zeichnung nicht im Editor geöffnet ist? Edit: Screenshot der beiden Fehlermeldungen angehängt: der zweite, ePermanentlyErased, kommt wenn ich mit dem zweiten Batchprogramm (VBA und tausendfach getestet) die DWG in DXF konvertieren will. ------------------ Gruß Andreas ------------------------------------------------------------------------------------------------------------------------------------ Die Antwort ist 42! Die Antwort ist 42! Die Antwort ist 42! ...wenn ich nur die Frage wüsste... [Diese Nachricht wurde von Andreas Widmann am 12. Sep. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 12. Sep. 2013 18:32 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Widmann
Noch was: ich habe noch nicht mit DB.UpdateExt gearbeitet, letztlich verändert dies aber die Datenbank und Datenbankveränderungen benötigen i.d.R. eine gültige TransAction ... die war aber vorher schon mit .Commit und End Using vertan. Probier vielleicht mal diese Zeile rauszunehmen nur um zu wissen, ob's was bessert. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 12. Sep. 2013 18:36 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Widmann
Zitat: dbase.dispose war auch schon drin, hat keinen Unterschied gemacht.
Die Garbage-Collection macht einiges gut, aber gerade wenn Du mit 7000 DWG's durchfahren willst, dann hilft und wirkt .Dispose jedenfalls vorteilhaft. Zitat: Welche Parameterwerte schlägst du für buildDefaultDrawing und noDocument vor?
Für das Öffnen einer DWG ohne den Editor zu benutzen: New Database(False, True)Zitat: Hilft es weiter zu sagen, dass ich nur über Datenbankzugriff arbeite und die Zeichnung nicht im Editor geöffnet ist?
Hätte ich schon angenommen, sonst hätte das Öffnen der DWG im Code anders ausgesehen ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Widmann Mitglied ATHENA Support/Training
Beiträge: 218 Registriert: 24.08.2005
|
erstellt am: 12. Sep. 2013 18:55 <-- editieren / zitieren --> Unities abgeben:
Ich hatte grad ein OH MEIN GOTT Erlebnis folgende Änderungen: Geändert: Dim dbase As Database = New Database(False, True) Innerhalb die Transaktion verschoben: dbase.UpdateExt(True) Wieder drin: dbase.dispose Irgendwas hat sich getan, ja, es rennt jetzt wie blöd. Bei den jetzt erzeugten DWG taucht auch der Wiederherstellenfehler nicht mehr auf. Allerdings habe ich jetzt haufenweise Dateien die nicht verarbeitet werden können da bereits die Zeile: Dim dbase As Database = New Database(False, True) scheitert. Die Exception sagt: ex = {"eFileSharingViolation"} ------------------ Gruß Andreas ------------------------------------------------------------------------------------------------------------------------------------ Die Antwort ist 42! Die Antwort ist 42! Die Antwort ist 42! ...wenn ich nur die Frage wüsste... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 12. Sep. 2013 19:04 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Widmann
Zitat: Allerdings habe ich jetzt haufenweise Dateien die nicht verarbeitet werden können da bereits die Zeile: Dim dbase As Database = New Database(False, True) scheitert.
Eine FileLocking-/FileSharing-Violation kann eigentlich erst beim .Open vorkommen ... oder Dein TEMP-Verzeichnis ist wegen Überfüllung geschlossen? Zur weiteren Eingrenzung: tritt dies immer bei den gleichen Dateien auf oder unterschiedlich: mal bei der 15.ten, beim nächsten Durchlauf schon bei der 12.ten? Was sagt im TaskManager die Speicherauslastung? ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Widmann Mitglied ATHENA Support/Training
Beiträge: 218 Registriert: 24.08.2005
|
erstellt am: 12. Sep. 2013 19:08 <-- editieren / zitieren --> Unities abgeben:
tut mir leid, du hast völlig recht, es ist diese Zeile: dbase.ReadDwgFile(fi.FullName, FileOpenMode.OpenForReadAndWriteNoShare, True, "") ------------------ Gruß Andreas ------------------------------------------------------------------------------------------------------------------------------------ Die Antwort ist 42! Die Antwort ist 42! Die Antwort ist 42! ...wenn ich nur die Frage wüsste... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 12. Sep. 2013 19:13 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Widmann
|
Andreas Widmann Mitglied ATHENA Support/Training
Beiträge: 218 Registriert: 24.08.2005
|
erstellt am: 12. Sep. 2013 19:47 <-- editieren / zitieren --> Unities abgeben:
Hab den Rechner neu gestartet und das Tempverzeichnis geleert. Keine Änderung Es sind auch nicht immer diese Dateien, nach einem Neustart von AutoCAD gehen wieder ein paar der vorher fehlgeschlagenen Dateien. Wenn ich das mache, krieg ich Stück für Stück alle Dateien durch. Manchmal sogar ohne AutoCAD neu zu starten und nur einen zweiten Durchlauf zu machen. Zur Info: das Programm ist auf wiederaufnahme nach Absturz ausgelegt, die bereits bearbeiteten werden bei einer Wiederaufnahme nicht angefasst. ------------------ Gruß Andreas ------------------------------------------------------------------------------------------------------------------------------------ Die Antwort ist 42! Die Antwort ist 42! Die Antwort ist 42! ...wenn ich nur die Frage wüsste... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Widmann Mitglied ATHENA Support/Training
Beiträge: 218 Registriert: 24.08.2005 Windows 10 Autocad 2015 - 2018 Athena 2015 - 2017 Aufsatz
|
erstellt am: 12. Sep. 2013 19:54 <-- editieren / zitieren --> Unities abgeben:
Hallo, sehr interessante Info: je mehr Dateien ich im Verzeichnis habe desto besser scheint es zu laufen. Habe gerade einen Satz von 300 Dateien durchgenudelt (meine Testdateien waren daraus entnommen) und es hat einwandfrei funktioniert!!! Danke dir vielmals, das spart nun Tage!
Hast du auch schon mal DXF rausgespeichert? Weil das Programm läuft so viel schneller als VBA, das würd nochmal nen Tag rausreisen. Aber auch da hab ich wohl was falsch gemacht, es kam beim Speichern immer ein Fehler so dass ich entschieden hatte auf das "Alte" Programm zurückzugreifen. nochmals Vielen Dank!! ------------------ Gruß Andreas ------------------------------------------------------------------------------------------------------------------------------------ Die Antwort ist 42! Die Antwort ist 42! Die Antwort ist 42! ...wenn ich nur die Frage wüsste... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 12. Sep. 2013 19:55 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Widmann
lokale HD oder Netzwerk oder in beiden Fällen? Zitat: Zur Info: das Programm ist auf wiederaufnahme nach Absturz ausgelegt, ...
Kann es sein, dass die Fehler bei genau den Dateien kommen, wo ein Absturz aufgetreten ist? Dann sind die vielleicht wirklich von System gesperrt. Eine Probe dazu: zuerst Datei von Quellverzeichnis in TEMP-Folder mit einem temporären Namen kopieren, dann diese bearbeiten und die gespeicherte Version zurückkopieren. Stirbt AutoCAD während eines solchen Vorgangs, dann ist nix blockiert ausser etwas im TEMP-Folder (welcher natürlich am Ende Deines Gesamtablaufs zu bereinigen wäre). ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Widmann Mitglied ATHENA Support/Training
Beiträge: 218 Registriert: 24.08.2005
|
erstellt am: 12. Sep. 2013 20:05 <-- editieren / zitieren --> Unities abgeben:
es sind alles Lokale Dateien, ich will doch schließlich von meiner SSD profitieren Die Aussage mit dem Absturz war jetzt vielleicht verwirrend, denn es passiert kein Absturz Dass das Programm auf Wiederaufnahme ausgelegt ist, kommt noch von vorherigen Programmierfehlern die tatsächlich zum Absturz geführt haben Den Nutzen den ich daraus jetzt ziehe ist halt, dass ich das Programm zumachen und wieder aufmachen kann und es dann eben nur die noch fehlenden angeht. Abstürze von AutoCAD sind jetzt schon länger keine mehr gewesen. Ich bin auch jetzt ziemlich zufrieden mit der Performance, wer weis ob da wegen den vielen Tests nicht auch was an den Testdateien war. Der 300er durchlauf ging ohne einen Fehler. Sehr interessant wäre nun noch der DXF-Export im Format DXF2000 Du hast mir nicht zufällig nen getesteten Codeschnipsel? ------------------ Gruß Andreas ------------------------------------------------------------------------------------------------------------------------------------ Die Antwort ist 42! Die Antwort ist 42! Die Antwort ist 42! ...wenn ich nur die Frage wüsste... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 12. Sep. 2013 20:29 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Widmann
|
| Innen- / Architekt als Planer (w/m/d) Innovative Arbeitswelten | Als führendes europäisches Beratungs-, Planungs- und Projektmanagementunternehmen bietet Drees & Sommer Lösungen für erfolgreiche Gebäude, renditestarke Portfolios, leistungsfähige Infrastruktur und lebenswerte Städte. In interdisziplinären Teams unterstützen unsere über 5.100 Mitarbeiterinnen und Mitarbeiter an 59 internationalen Standorten Auftraggeber unterschiedlichster Branchen. Bei uns gestalten Sie Ihren individuellen Karriereweg aktiv mit.... | Anzeige ansehen | Architektur |
|
Andreas Widmann Mitglied ATHENA Support/Training
Beiträge: 218 Registriert: 24.08.2005
|
erstellt am: 12. Sep. 2013 20:50 <-- editieren / zitieren --> Unities abgeben:
Du bistn Gott für heute Ist zwar erstaunlich wie das den Prozess ausbremst, aber es erspart mir den separaten Durchlauf. Danke ------------------ Gruß Andreas ------------------------------------------------------------------------------------------------------------------------------------ Die Antwort ist 42! Die Antwort ist 42! Die Antwort ist 42! ...wenn ich nur die Frage wüsste... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |