| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: DBText.Visible funktioniert nicht (1143 mal gelesen)
|
kgcadmin Mitglied Konstrukteur
Beiträge: 19 Registriert: 24.11.2010 Microsoft Windows 7 Enterprise 64Bit SP1; Intel Core i5 680 3,60GHz CPU; 16GB DDR3 RAM; NVIDIA Quadro FX 580; Autodesk Inventor 2012 SP2; Autodesk AutoCAD Mechanical 2012 SP2; Autodesk AutoCAD ecsCAD 2012 SP1;
|
erstellt am: 11. Sep. 2012 09:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen In einer DWG-Zeichnung versuche ich einige Texte auszublenden. Da ich nicht den Layer ausblenden kann und die Texte auch nicht auf einen anderen Layer verschieben kann, bleibt mir nur die Möglichkeit, diese über die Visible Eigenschaft auszublenden, d.h. Code: DBText.Visible = false
Leider wird diese Eigenschaft nicht übernommen, sprich wenn ich zwar nach dem setzen der Eigenschaft den Wert abfrage, so wird dieser korrekt als "false" angezeigt. Sobald ich die Transaktion beende (Commit) geht die Eigenschaft irgendwie verloren.Hier die komplette Funktion:
Code: public void ChageTextVisibility() { // Datenbank und aktuelle Zeichnung auslesen Database oDb = HostApplicationServices.WorkingDatabase; Autodesk.AutoCAD.ApplicationServices.Document oDwg = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; // Transaction starten Transaction oTrans = oDb.TransactionManager.StartTransaction(); // Aktuelle Layout-ID auslesen ObjectId curLayoutID = LayoutManager.Current.GetLayoutId(LayoutManager.Current.CurrentLayout); // aktuelles Layout (lesender Zugriff) Layout curLayout = (Layout)curLayoutID.GetObject(OpenMode.ForWrite); try { // Zeichnung blockieren using (Autodesk.AutoCAD.ApplicationServices.DocumentLock locked = oDwg.LockDocument()) { curLayout = (Layout)curLayoutID.GetObject(OpenMode.ForRead); // Get the drawings layout dictionary DBDictionary layoutDict = (DBDictionary)oTrans.GetObject(oDb.LayoutDictionaryId, OpenMode.ForWrite); foreach (DictionaryEntry id in layoutDict) { // Layout auslesen Layout oLayout = (Layout)oTrans.GetObject((ObjectId)id.Value, OpenMode.ForWrite); BlockTableRecord oBtr = (BlockTableRecord)oTrans.GetObject(oLayout.BlockTableRecordId, OpenMode.ForWrite); if (oBtr.IsLayout == true) { // Get the enumerator BlockTableRecordEnumerator oBtre = oBtr.GetEnumerator(); // Loop through all blocks in the block table while (oBtre.MoveNext()) { Entity oEnt = (Entity)oTrans.GetObject(oBtre.Current, OpenMode.ForWrite); if (oEnt.GetType() == typeof(BlockReference)) { // Change the entity to a block reference BlockReference oBr = (BlockReference)oEnt; DBObjectCollection dBObjectCollection = new DBObjectCollection(); oBr.Explode(dBObjectCollection); foreach (Entity e in dBObjectCollection) { if (e is DBText) { DBText Text = e as DBText; // Sondertexte auf unsichtbar schalten if (Text.TextString.IndexOf("!GENTITLE-MAX") != -1) { MessageBox.Show(Text.Visible.ToString()); Text.Visible = false; MessageBox.Show(Text.Visible.ToString()); // korrekter Wert } } } } } } } } } catch(System.Exeption ex) { MessageBox.Show(ex.ToString()); } finally { oTrans.Commit(); } }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 11. Sep. 2012 11:00 <-- editieren / zitieren --> Unities abgeben: Nur für kgcadmin
|
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: 11. Sep. 2012 11:11 <-- editieren / zitieren --> Unities abgeben: Nur für kgcadmin
Oder die Transaction innerhalb des DocumentLocks machen, denn wenn zuerst das DocumentLock aufgehoben wird und erst danach die TransAction mit .Commit beendet wird, dann endet das IMHO als Exception. BTW: Das Transaction.Commit würde ich immer innerhalb eines Try-Catch machen, nicht im Finally! ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kgcadmin Mitglied Konstrukteur
Beiträge: 19 Registriert: 24.11.2010 Microsoft Windows 7 Enterprise 64Bit SP1; Intel Core i5 680 3,60GHz CPU; 16GB DDR3 RAM; NVIDIA Quadro FX 580; Autodesk Inventor 2012 SP2; Autodesk AutoCAD Mechanical 2012 SP2; Autodesk AutoCAD ecsCAD 2012 SP1;
|
erstellt am: 11. Sep. 2012 11:58 <-- editieren / zitieren --> Unities abgeben:
Zuerst einmal Danke für die raschen Antworten! @ Ingenieur Studio HOLLAUS: Das mit dem try-catch stimmt natürlich schon, jedoch würde ein Fehler (in diesem Fall) bereits beim vorherigen try-catch ausgelöst... @ Holger: Wenn ich dich richtig verstanden habe, so meinst du mit "Schliessen aller geöffneten Objekte", dass diese mit "Dispose" gelöscht werden sollen? Falls ja, so hat dies leider auch nicht geholfen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 11. Sep. 2012 12:01 <-- editieren / zitieren --> Unities abgeben: Nur für kgcadmin
Zitat: Original erstellt von kgcadmin: ... @ Holger: Wenn ich dich richtig verstanden habe, so meinst du mit "Schliessen aller geöffneten Objekte", dass diese mit "Dispose" gelöscht werden sollen? Falls ja, so hat dies leider auch nicht geholfen...
Nein, ich meine Object.Close(); - weil mit Object.Dispose() zerstörst du ja das Object. 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 |
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: 11. Sep. 2012 12:17 <-- editieren / zitieren --> Unities abgeben: Nur für kgcadmin
Zitat: Original erstellt von kgcadmin: jedoch würde ein Fehler (in diesem Fall) bereits beim vorherigen try-catch ausgelöst...
Ich sehe aber kein "voriges try-catch". Und wenn es ein Try-Catch in einer übergeordneten Funktion gäbe (sollte das so gemeint sein), dann hätte ich die weitere Möglichkeit in Betracht gezogen, dass ev. auch eine übergeordnete Transaction existiert, die dann nicht mit .Commit abgeschlossen wurde? Das mit "Transaction innerhalb von DocumentLock" ist hoffentlich nicht verloren gegangen. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kgcadmin Mitglied Konstrukteur
Beiträge: 19 Registriert: 24.11.2010 Microsoft Windows 7 Enterprise 64Bit SP1; Intel Core i5 680 3,60GHz CPU; 16GB DDR3 RAM; NVIDIA Quadro FX 580; Autodesk Inventor 2012 SP2; Autodesk AutoCAD Mechanical 2012 SP2; Autodesk AutoCAD ecsCAD 2012 SP1;
|
erstellt am: 11. Sep. 2012 17:03 <-- editieren / zitieren --> Unities abgeben:
Ich hab's! Ihr hattet beide recht, jedoch habe ich einen Anfänger-Fehler begangen. Ich habe statt der Block-Definition die Block-Referenz bearbeitet. Mit dem folgenden Code hats dann schliesslich geklappt: Code: public void ChageTextVisibility() Transaction trans = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction(); try { BlockTable blockTable = (BlockTable)Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.BlockTableId.GetObject(OpenMode.ForWrite); SymbolTableEnumerator blockTableEnumerator = blockTable.GetEnumerator(); while (blockTableEnumerator.MoveNext()) { BlockTableRecord blockDefinition = (BlockTableRecord)blockTableEnumerator.Current.GetObject(OpenMode.ForWrite); blockDefinition.Annotative = AnnotativeStates.False; foreach (ObjectId ObjectId in blockDefinition) { Entity entity = (Entity)ObjectId.GetObject(OpenMode.ForWrite); if (entity.GetType() == typeof(DBText)) { DBText dbText = (DBText)entity; string Text = dbText.TextString; switch (Text) { case "!GENTITLE-MAX": dbText.Visible = false; break; case "!GENTITLE-RU": dbText.Visible = false; break; case "!GENTITLE-INSERT": dbText.Visible = false; break; case "!GENTITLE-LL": dbText.Visible = false; break; default: // nichts tun break; } } } } trans.Commit(); } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); } finally { trans.Dispose(); } }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |