| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Autocad hängt nach .Net Funktionen (1295 mal gelesen)
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 23. Jun. 2009 09:41 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich habe jetzt schon öfter das Phänomen festgestellt, dass nach dem Ende bei .NET Funktionen im Autocad, dann beim bewegen der Maus das Fadenkreuz kopiert wird. Sprich fährt man mit der Maus hin und her wird der Bildschirm mit Fadenkreuzen zugedeckt. Was kann das für eine Ursache haben? Ein Fehler während dem Code wo dann eine Transaction die nicht richtig beendet wurde? mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Jun. 2009 09:54 <-- editieren / zitieren -->
Hi, kenn ich so nicht, nie gesehen. Greifst Du auf Bildschirm-Lib's hin, z.B. auf JIG-Funktionen? Ist das reproduzierbar, d.h. tritt nach Durchlauf eines bestimmten Codes auf? Wie verhält sich denn AutoCAD in dieser Situation, kannst Du noch Elemente anklicken bzw. grundsätzlich weiterarbeiten? Was ist nach Minimieren/Wiederherstellen des AutoCAD-App-Fensters? Dreh mal im AutoCAD die Bildschirm-Beschleunigung ab. Probiers auch mal auf einem anderen Rechner mit anderer Graphikkarte, wenn Du die Chance hast. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 23. Jun. 2009 10:22 <-- editieren / zitieren --> Unities abgeben:
Ok, ganz nachvollziehen kann ich es noch nicht. Es kam ein Fehler bei ReadDWGFile die Funktion ist beim Aufruf über try catch gehandelt.(DWG war nicht vorhanden) im catch jedoch nur ne msgbox mit Errorcode und Beschreibung Dim tAcadDocLock As ApplicationServices.DocumentLock Dim myTransMan As DatabaseServices.TransactionManager Dim myTrans As DatabaseServices.Transaction Dim myDwg As Document Dim mydb As DatabaseServices.Database Dim tBlTabRecID As ObjectId Dim OldBorder As DatabaseServices.BlockReference myDwg = ApplicationServices.Application.DocumentManager.MdiActiveDocument mydb = myDwg.Database myTransMan = myDwg.TransactionManager myTrans = myTransMan.StartTransaction Rahmenformat = AcadFunctions.GetPaperSize(lay.Rahmengroeße) tAcadDocLock = myDwg.LockDocument Dim tDB As Database = New Database(False, True) 'If IO.File.Exists("D:\RahmenSK\Format\" & Rahmenformat & ".dwg") Then tDB.ReadDwgFile("D:\RahmenSK\Format\" & Rahmenformat & ".dwg", IO.FileShare.None, True, "") tBlTabRecID = myDwg.Database.Insert(Rahmenformat, tDB, False) AcadFunctions.InsertBlock(New Geometry.Point3d(0, 0, 0), Rahmenformat, "BORDER", 1, 1, 1) ' & Rahmenformat 'Else ' MsgBox("Neuer Rahmen konnte nicht gefunden werden!") 'End If OldBorder = CType(lay.RahmenID.GetObject(OpenMode.ForWrite, True, True), DatabaseServices.BlockReference) OldBorder.Erase(True) myTrans.Commit() If tDB IsNot Nothing Then tDB.CloseInput(True) : tDB.Dispose() : tDB = Nothing If tAcadDocLock IsNot Nothing Then tAcadDocLock.Dispose() es passiert jedoch nicht immer, habs 2-3 mal probiert ohne acad zu schließen, dann kam es wieder mal. Habe die Zeichnung minimiert und dann kam im Befehlsfenster ununterbrochen folgendes sehr schnell hintereinander (da war Zeichnung1, die Standard dwg beim öffnen, offen) Befehl: _MODEL Unbekannter Objekttyp 0! Befehl: _AMMODE Unbekannter Objekttyp 0! als ich diese auch minimierte war es weg. bekam jedoch ein paar Sekunden drauf einen Autocad Error der einen Absturz und Fehlerbericht zufolge hatte. Können Objekte die angelegt und bearbeitet wurden aber dann nicht freigegeben, oder auf nothing gesetzt wurden sowas verursachen? mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Jun. 2009 10:35 <-- editieren / zitieren -->
Hi, nur geraten, weil in diesem Code leider nicht zu erkennen: Wenn Du in das 'catch' hineinfällst (von dem Du schreibst, aber ich es im Code nicht sehe), hast Du dann sichergestellt, dass alles geschlossen/disposed wurde? Die tDB, die Transaction, das DocumentLock? Und wenn er die Datei nicht finden konnte, hast Du dann trotzdem '.CloseInput' gemacht? Hast Du vorher überprüft, ob es die Blockdefinition (RahmenFormat) schon gibt, wenn's die nämlich schon gibt, dann glaube ich, könnte es Brösel geben? Unabhängig davon würde ich das immer zuvor prüfen, denn es geht tausend mal schneller, die interne Blockdefinition zu verwenden als eine externe DWG zu öffnen. Viel Erfolg, - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 23. Jun. 2009 10:48 <-- editieren / zitieren --> Unities abgeben:
Nein, das war eben noch nicht gegeben. Aber es passierte ja dann eben auch nicht immer. Ich habe das try Catch jetzt über die Funktion gelegt, und eine Abfrage ob das File existiert. Dass das File immer geladen wird hat seinen Grund, ich will dass es überschrieben wird, falls der Block erneuert werden soll. Es kommt immer wieder vor, dass ein Update kommt, und so kann ich sicherstellen, dass der neue drinnen ist. Aber das Problem trat bei anderen Funktionen die einen Fehler verursachten auch schon auf. Darum habe ich jetzt mal nachgefragt woran das liegen kann, damit die Fehlersuche schneller geht. 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: 23. Jun. 2009 10:53 <-- editieren / zitieren --> Unities abgeben:
Nein, das war eben noch nicht gegeben. Aber es passierte ja dann eben auch nicht immer. Ich habe das try Catch jetzt über die Funktion gelegt, und eine Abfrage ob das File existiert. Dass das File immer geladen wird hat seinen Grund, ich will dass es überschrieben wird, falls der Block erneuert werden soll. Es kommt immer wieder vor, dass ein Update kommt, und so kann ich sicherstellen, dass der neue drinnen ist. Aber das Problem trat bei anderen Funktionen die einen Fehler verursachten auch schon auf. Darum habe ich jetzt mal nachgefragt woran das liegen kann, damit die Fehlersuche schneller geht. mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Jun. 2009 10:55 <-- editieren / zitieren -->
Hi, Zitat: Dass das File immer geladen wird hat seinen Grund, ich will dass es überschrieben wird, falls der Block erneuert werden soll
...Glatteiswarnung!! Eine Blockdefinition ersetzt man nicht einfach so, dass man eine gleichnamige Blockdefinition in die BlockTableRecords hinzufügt. Das funktioniert zwar mit dem Benutzerinterface von AutoCAD (das in diesen Fällen auch fragt, ob diese zu ersetzen ist und sich dann entsprechend verhält), das erkennst Du schon damit, dass eine BlockReference auf eine ObjectID verweist (auf die ObjectID des BlocktableRecords it der Definition des Blocks), wenn Du jetzt aus der Externen DWG was hereinholst, wird dieses zwangsweise eine neue ObjectID. Und hat diese Blockdefinition den gleichen Namen, bin ich fast überzeugt davon, dass Du nach Ausführen Deiner Funktion nachher mit '_audit' Defekte in der Zeichnung feststellen wirst. Die richtige Vorgehensweise ist: a) prüfen, ob es einen BlockTableRecord (für diesen Blocknamen) gibt a1) gibt es diese nicht, kannst Du tun, wie es jetzt programmiert ist a2) gibt es diese bereits, dann musst Du den BlockTableRecord öffnen, die Geometrieteile daraus entfernen und die einzelnen Geometrieelemente Deiner externen Zeichnung da hineinkopieren. HTH, - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 23. Jun. 2009 11:27 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 23. Jun. 2009 11:31 <-- editieren / zitieren -->
Hi, Zitat: ist es da nicht einfacher, den alten BTR zu löschen?
...kann nicht gelöscht werden, wenn bereits BlockReferences eingesetzt sind, die auf diesen BTR verweisen. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 23. Jun. 2009 11:36 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 23. Jun. 2009 11:39 <-- editieren / zitieren -->
Hi, Zitat: ich muss aber zuerst die dwg datei einlesen oder nicht? um die elemente in den alten BTR hineinkopieren zu können oder?
...wo/wie solltest Du die Information (wie der Block aussehen sollte) sonst herbekommen? - alfred -
------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 23. Jun. 2009 12:31 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 23. Jun. 2009 12:45 <-- editieren / zitieren -->
Hi, na Du hättest es ja in Deinem Code verwendet: Zitat: tDB.CloseInput(True)
...schliesst den offenen FileHandle. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 23. Jun. 2009 12:50 <-- editieren / zitieren --> Unities abgeben:
|
Silvan01 Mitglied
Beiträge: 128 Registriert: 28.04.2009 AutoCAD Civil 2009 AutoCAD Civil 2010 Visual Studio 2008
|
erstellt am: 09. Sep. 2010 11:29 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
Hallo, ich weiß der Beitrag ist schon etwas älter aber ich stoße auf das selbe Problem! Daher die Fragen: Zitat: a) prüfen, ob es einen BlockTableRecord (für diesen Blocknamen) gibta1) gibt es diese nicht, kannst Du tun, wie es jetzt programmiert ist a2) gibt es diese bereits, dann musst Du den BlockTableRecord öffnen, die Geometrieteile daraus entfernen und die einzelnen Geometrieelemente Deiner externen Zeichnung da hineinkopieren.
Zu a) Ich habe die ObjectID von dem Neuen Block, weiß aber nicht wie ich abfragen ob es einen Blocktablerecord gibt, also wie mache ich das ? Zu a2) Wie bekomme ich den Blocktablerecord von dem bereits vorhandenen Block um diesen zu löschen? Grüße und Dank im Vorraus Silvan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Sep. 2010 12:13 <-- editieren / zitieren -->
Hi, Du kannst zuerst mal prüfen, ob ObjectID.IsValid andalso (not ObjectID.IsErased) der BlockTableRecordID gültig ist. Zu A2: Wenn Du schon die BlockTableRecordID hast, dann brauchst Du diese nur mehr mit TransAction.Getobject zum Schreiben öffnen. Löschen darfst Du diese aber erst, wenn es keine Referenz mehr gibt. - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|