| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Zeichnung aktualisieren (5368 mal gelesen)
|
coLami Mitglied
Beiträge: 52 Registriert: 26.07.2011 AutoCad Mechanical 2011, .net 3.5 C#
|
erstellt am: 13. Dez. 2011 07:47 <-- editieren / zitieren --> Unities abgeben:
Ich hab das Problem, wenn ich mit meinem .net Programm etwas zeichne, die Zeichnunug manchmal nicht sofort aktualisiert wird, sondern erst, nachdem ich den Dialog von meinem Programm geschlossen habe oder die Zeichnunug nocheinmal zeichne. Alle Blöcke, die gezeichnet werden sollen sind also schon beim ersten Mal Zeichnen vorhanden, aber die Zeichnung wird nicht aktualisiert. Ein Aufruf von Editor.Regen(); oder Editor.UpdateScreen(); schafft auch keine Abhilfe. Momentan fällt mir nur ein, meinem Dialog kurz auszublenden (habs noch nicht ausprobiert), aber gibt es da keine weitere Möglichkeit? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 13. Dez. 2011 07:53 <-- editieren / zitieren --> Unities abgeben: Nur für coLami
... versuche es mal damit, dass das Zeichnen in einer extra Transaction stattfindet und auch keine weitere, übergeordnete Transaction offen ist. Ich habe zwar auch einen Kunden, bei dem nicht einmal das zum gewünschten Ergebnis führt, aber bei allen anderen funzt das. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
coLami Mitglied
Beiträge: 52 Registriert: 26.07.2011 AutoCad Mechanical 2011, .net 3.5 C#
|
erstellt am: 13. Dez. 2011 08:29 <-- editieren / zitieren --> Unities abgeben:
Danke, werd ich mal ausprobieren. Kann es sein, dass schon beim Progammstart in Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.TransactionManager.NumberOfActiveTransactions eine aktive Transaktion drin steht?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 13. Dez. 2011 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für coLami
... aus dem Bauch heraus würde ich sagen: Nein. -- ich weiß aber auch nicht, wie sich das bei einem transparenten Befehl verhält. Du kannst das ja aber leicht prüfen, wenn du im TransactionManager die TopTransaction abfragst. Ist die !=null, dann war wohl eine Transaction aktiv. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
coLami Mitglied
Beiträge: 52 Registriert: 26.07.2011 AutoCad Mechanical 2011, .net 3.5 C#
|
erstellt am: 13. Dez. 2011 16:18 <-- editieren / zitieren --> Unities abgeben:
Mittlerweile konnte ich das Problem eingrenzen: Zuerstmal: Ich zeichne nach dieser Art mehrere Polylines http://docs.autodesk.com/ACD/2011/CHT/filesMDG/WS73099cc142f48755f2fc9df120970276f72063.htm aber nicht direkt in die Blocktable, sondern neben anderen Objekten in einen separaten Block. Code:
// objID ist der Block, in den gezeichnet wird public Polyline AddLightweightPolyline(ObjectId objID, ArrayList arPoints, double dBulgeSteigung) { // Get the current document and database Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; Polyline acPoly = new Polyline(); try { // Start a transaction using (Transaction acTrans = acDoc.TransactionManager.StartTransaction()) { using (DocumentLock loc = acDoc.LockDocument()) { BlockTableRecord acBlkTblRec = (BlockTableRecord)acTrans.GetObject(objID, OpenMode.ForWrite); // Open the Block table for write acPoly.SetDatabaseDefaults(acCurDb); int iIndex = 0; for (int I = 0; I < arPoints.Count; I = I + 2) { acPoly.AddVertexAt(iIndex++, new Point2d(Convert.ToDouble(arPoints[I]), Convert.ToDouble(arPoints[I + 1])), 0, 0, 0); } if (dBulgeSteigung != -1000) acPoly.SetBulgeAt(1, dBulgeSteigung); acPoly.LineWeight = LineWeight.LineWeight100; // Add the new object to the block table record and the transaction ObjectId IdDummy = acBlkTblRec.AppendEntity(acPoly); acTrans.AddNewlyCreatedDBObject(acPoly, true); // Save the new object to the database acTrans.Commit(); } } } catch (System.Exception ex) { log.Error("AddLightweightPolyline " + ex.Message); } return acPoly; }
Jetzt wirds mysteriös... Ich habe ab Programmstart eine offene Transaktion, von der ich nicht weiß, wo sie herkommt. Lasse ich diese Transaktion offen, wird meine Zeichnung nicht beim ersten Mal zeichnen aktualisiert, erst beim 2ten Mal oder beim Schließen meiner Applikation wird sie komplett gezeichnet. Schließe ich die Transaktion gleich nach Programmstart absichtlich mit Commit oder Abort, wird meine Zeichnung jedes Mal aktualisiert, nur die Polylines werden überhaupt nicht mehr gezeichnet (alle anderen Objekte aus dem 'Polyline'-Block werden gezeichnet) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredPS Mitglied
Beiträge: 118 Registriert: 23.08.2011 ..
|
erstellt am: 14. Dez. 2011 08:36 <-- editieren / zitieren --> Unities abgeben: Nur für coLami
DocumentLock darf nicht innerhalb, es muss ausserhalb der TransAction erstellt werden. Bei einem CommandStart (so nicht transparent) darf auch keine TransAction aktiv sein, dein Code zeigt aber auch keinen CommandStart, das ist eine Sub die von irgendwo aufgerufen wird und ich nehme an "irgendwo" hat sich seine TransAction gemacht oder zumindest zu diesem Zeitpunkt noch nicht disposed. Und für Aktualisierung am Monitor wären da noch TransActionManager.FlushGraphics oder auch acPoly.Draw zwei Versuche wert. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
coLami Mitglied
Beiträge: 52 Registriert: 26.07.2011 AutoCad Mechanical 2011, .net 3.5 C#
|
erstellt am: 14. Dez. 2011 10:45 <-- editieren / zitieren --> Unities abgeben:
Danke für die Tipps. DocumentLock habe ich geändert. Von den beiden anderen hat leider keiner geholfen. Die Transaktion besteht schon wenn ich mit einer leeren Zeichnung mein Programm starte. Wenn ich im Konstruktor meines Programms Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.TransactionManager.NumberOfActiveTransactions auslese, steht da ne 1. TopTransaction ist auch gefüllt. Beende ich diese absichtlich, werden die Polylines nicht mehr gezeichnet. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredPS Mitglied
Beiträge: 118 Registriert: 23.08.2011 ..
|
erstellt am: 14. Dez. 2011 14:25 <-- editieren / zitieren --> Unities abgeben: Nur für coLami
Zitat: Die Transaktion besteht schon wenn ich mit einer leeren Zeichnung mein Programm starte. Wenn ich im Konstruktor meines Programms Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.TransactionManager.NumberOfActiveTransactions auslese, steht da ne 1.
Wo prüfst du denn? In der Initialize-Ableitung? Oder wenn du ein Command definiert hast und dieses startest? Wie lädst du deine Applikation (netload oder Registry)? Was für ein AutoCAD setzt du denn ein (vertikales Produkt + Version). Kannst du den Code zeigen? Kleines Beispiel machen wo das genau so ersichtlich ist? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
coLami Mitglied
Beiträge: 52 Registriert: 26.07.2011 AutoCad Mechanical 2011, .net 3.5 C#
|
erstellt am: 14. Dez. 2011 15:22 <-- editieren / zitieren --> Unities abgeben:
Ich verwende AutoCAD Mechanical 2011 Mein Programm starte ich über einen Button mit folgendem MAkro ^C^Cnetload;"D:/Projekte/ACadDll 2010/ACadDll/bin/Debug/ACadDll.dll";dw; dw ist der MethodenName und die sieht so aus
Code:
[CommandMethod("dw", CommandFlags.Session)] public void dwFunktion() { System.Windows.Forms.Form F1 = new fACADtoExcel(); Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(F1); }
Das ganze ist unter .net 3.5 entwickelt und ich binde acdbm und acmgd als Verweis ein. fACADtoExcel ist eine normale Windows Form, die modal angezeigt wird Code:
public partial class fACADtoExcel : Form { ... public fACADtoExcel() { // bereits hier steht in // Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.TransactionManager // 1 aktive Transaktion } }
[Diese Nachricht wurde von coLami am 14. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredPS Mitglied
Beiträge: 118 Registriert: 23.08.2011 ..
|
erstellt am: 14. Dez. 2011 18:57 <-- editieren / zitieren --> Unities abgeben: Nur für coLami
Und beim Befehlsstart ist noch keine Transaction aktiv? Hab leider wenig Zeit grad zu probieren, und auch kein Mech. Hast du Zugriff auf AutoCAD pur (ohne Mech) um es zu versuchen? Oder zumindest ein anders Gerät um es auch dort zu verifizieren. Vom Code ansehen her hätt ich mal nicht verstanden, wieso eine TransAction vorhanden sein sollte. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
coLami Mitglied
Beiträge: 52 Registriert: 26.07.2011 AutoCad Mechanical 2011, .net 3.5 C#
|
erstellt am: 15. Dez. 2011 09:22 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von ManfredPS:
-Und beim Befehlsstart ist noch keine Transaction aktiv?Wie stell ich das fest? Ich mach AutoCAD auf, eine leere Zeichnung1.dwg wird angezeigt und drück auf meinen Button -Hab leider wenig Zeit grad zu probieren, und auch kein Mech. Hast du Zugriff auf AutoCAD pur (ohne Mech) um es zu versuchen?
leider nein. -Oder zumindest ein anders Gerät um es auch dort zu verifizieren.
bin ich grad drüber, noch ne Entwicklungskiste aufzusetzen. -Vom Code ansehen her hätt ich mal nicht verstanden, wieso eine TransAction vorhanden sein sollte.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredPS Mitglied
Beiträge: 118 Registriert: 23.08.2011 ..
|
erstellt am: 15. Dez. 2011 09:32 <-- editieren / zitieren --> Unities abgeben: Nur für coLami
Zitat: Wie stell ich das fest?
Indem du unmittelbar bei der Befehlsdefinition den Check mit aktiven TransActions machst. (also gleich als erstes in void dwFunktion ). Und weils grad so schön ist, probier bitte gleich noch zwei Dinge: Test1: Starte die Funktion unmittelbar nach AutoCAD Start UND nicht über Menüicon, sondern über Befehlszeile. Test2: Probier mal das Flag .Session rauszunehmen. Wenn alles nicht geht, siehst Du eine Chance ein kleines Musterprojekt zu machen? Nur diesen Befehl definieren. Wenn dann der Fehler reproduzierbar ist, dann lad es hier rauf. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
coLami Mitglied
Beiträge: 52 Registriert: 26.07.2011 AutoCad Mechanical 2011, .net 3.5 C#
|
erstellt am: 15. Dez. 2011 11:11 <-- editieren / zitieren --> Unities abgeben:
Danke für die Tipps, leider gibt es sowohl mit Session als auch ohne Session und sowohl über Button als auch Konsole immer eine Transaction. Ich schau mal, dass ich ein Projekt zusammenbastel und hoffe, dass da der Fehler auch auftritt Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
coLami Mitglied
Beiträge: 52 Registriert: 26.07.2011 AutoCad Mechanical 2011, .net 3.5 C#
|
erstellt am: 15. Dez. 2011 11:35 <-- editieren / zitieren --> Unities abgeben:
So, ein altes Projekt ausgemistet. Ich hab mal in Class1.cs zwei Variablen definiert und die zeigen jeweils eine 1 an, egal, ob ich das Projekt per netload lade oder die Funktion test1 starte. Visual Studio 2010 .net 3.5 AutoCAD 2011 Mechanical [Diese Nachricht wurde von coLami am 15. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredPS Mitglied
Beiträge: 118 Registriert: 23.08.2011 ..
|
erstellt am: 15. Dez. 2011 12:52 <-- editieren / zitieren --> Unities abgeben: Nur für coLami
Leider, mit Civil 3D 2011 64bit, VS2010, Framework3.5, Win7 64bit bekomme ich in beiden Fällen (init und command) 0 offene TransActions in deinem x. Beim öffnen der csproj stand bei mir aber, dass du ein Sourcecode-Plugin verwendest, damit sehe ich gesamt 2 Unterschiede: ich verwende Civil und nicht Mech (Mech kann ich auch nicht verwenden, leider) ich verwende keine Sourcecodeverwaltung (ausser mich selbst) Mangels Reproduzierbarkeit bin ich damit draussen, vielleicht kann wer anderer mit Mech hinsehen, vielleicht kannst Du alles an Tools, das bei Dir sonst noch geladen wird, mal in einem eigenen Profil rausschmeissen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
coLami Mitglied
Beiträge: 52 Registriert: 26.07.2011 AutoCad Mechanical 2011, .net 3.5 C#
|
erstellt am: 16. Dez. 2011 09:39 <-- editieren / zitieren --> Unities abgeben:
|