| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Entity Color abfragen und ändern (1117 mal gelesen)
|
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2019/2020 CAD+T 2020 HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 04. Mai. 2015 12:58 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen! Ich habe ein Problem und Hoffe, dass mir da kurzfristig jemand bei helfen kann. Wir haben eine Unmenge an DWG Zeichnungen bekommen, die überarbeiten muß. Kernproblem ist die Farbe 0,0,0 (schwarz) verschachtelter Objekte, die sich auch in Blöcken befinden können. Diese Objekte möchte ich in einem Schleifendurchlauf auf den Farbindex 7 (weiß) ändern. Habe auf die Schnelle mal etwas brobiert, funktioniert aber nicht.
Code:
Dim MyDoc As Document = DocumentManager.MdiActiveDocument Dim MyDB As Database = MyDoc.Database Using tr As Transaction = MyDB.TransactionManager.StartTransaction() Dim MyBlkTbl As BlockTable = MyDoc.Database.BlockTableId.GetObject(OpenMode.ForRead) Dim ent As Entity = DirectCast(tr.GetObject(MyBlkTbl.ObjectId, OpenMode.ForRead), Entity) Dim MyBR As BlockReference = TryCast(ent, BlockReference) Dim btr As BlockTableRecord = DirectCast(tr.GetObject(MyBR.BlockTableRecord, OpenMode.ForRead), BlockTableRecord) For Each id As ObjectId In btr Dim ent2 As Entity = DirectCast(tr.GetObject(id, OpenMode.ForWrite), Entity) ent2.Color = Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.None, 7) Next tr.Commit() End Using
Kann mir da jemand bei helfen? Vielen Dank. ------------------ Gruß Dirk 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: 04. Mai. 2015 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Hallo Dirk, dein Programmaufbau ist nicht der Zeichnungsstruktur entsprechend. Du brauchst 2 Foreach-Schleifen -Database -->BlockTable ----> foreach ObjectId in BlockTable -----> BlockTablerecord -------> foreach ObjectId in BlockTableRecord -------->Entity.Color = .. ColorMethod ist ACI.
Du solltest dir auch angewohnen, die Objekte, die du öffnest, auch wieder zu schließen, besser gleich mit using verwenden.
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 |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2019/2020 CAD+T 2020 HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 04. Mai. 2015 13:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger! Vielen Dank für die Info. Leider komme ich auf die Schnelle nicht damit klar. Könntest du mir dabei im Dteail weiterhelfen, dass wäre super nett. Code:
Dim MyDoc As Document = DocumentManager.MdiActiveDocument Dim MyDB As Database = MyDoc.Database Using MyTrans As Transaction = MyDB.TransactionManager.StartTransaction() Dim MyBlkTbl As BlockTable = MyTrans.GetObject(MyDB.BlockTableId, OpenMode.ForRead) For Each MyObID As ObjectId In MyBlkTbl Dim MyBTRek As BlockTableRecord = MyTrans.GetObject(MyBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForRead) For Each MyID As ObjectId In MyBTRek Dim MyChangeEnt As Entity = CType(MyTrans.GetObject(MyID, OpenMode.ForRead, True), Entity) MyChangeEnt.Color = Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.None, 7) Next Next MyTrans.Commit() End Using
------------------ Gruß Dirk 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: 04. Mai. 2015 14:20 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Hallo Dirk, zum Aufbau der Zeichnungsdatenbank: In der BlockTabelle befinden sich alle BlockTableRecords. BlockTableRecords sind alle Objekte, die Zeichnungselemente zusammenfassen: Blöcke, Modellbereich, Layouts, XRefs. Diese BlockTableRecords beinhalten die Zeichnungselemente (Entity). Wenn du also alle Zeichnungselemente auf die Farbe prüfen willst, genügt es, wenn du die BlockTabelle einmal durchläufst. Und jeweils für jedes Element des Records die Farbprüfung vollziehst. (doppelte Foreach-Schleife) ich gehe nicht auf denen VB.net-Code ein, weil ich a) selbst mit c#.Net zugange binn und b) dein Code insich nicht logisch ist (Doppelte Schleife, dann aber direkter Zugriff auf ModelSpace?? -- das passt nicht). Da ist's für mich einfacher, dir (zwar ungetesteten) c#Code zur Verfügung zu stellen, aus dem die Logik auch hervor gehen sollte. Grüße! Holger Code:
public static void AllColor7(Boolean _ModelSpaceOnly) { _db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase; using (Transaction _tr = _db.TransactionManager.StartTransaction()) { using (BlockTable _bt = (BlockTable)_tr.GetObject(_db.BlockTableId, OpenMode.ForRead)) { foreach (ObjectId _btrid in _bt) { using (BlockTableRecord _btr = (BlockTableRecord)_tr.GetObject(_btrid, OpenMode.ForRead)) { if ((!_ModelSpaceOnly && !(_btr.IsFromExternalReference | | _btr.IsFromOverlayReference))| | (_ModelSpaceOnly && _btr.Name.ToUpper() == BlockTableRecord.ModelSpace.ToUpper())) { foreach (ObjectId _entid in _btr) { using (Entity _ent = (Entity)_tr.GetObject(_entid, OpenMode.ForRead, false, true)) { ToColor7(_ent); if (_ent.GetType() == typeof(BlockReference)) { foreach (ObjectId _aId in ((BlockReference)_ent).AttributeCollection) { using (AttributeReference _ar = (AttributeReference)_tr.GetObject(_aId, OpenMode.ForRead)) { ToColor7(_ent); } } } } } } } } } _tr.Commit(); } } private static void ToColor7(Entity _ent) { Autodesk.AutoCAD.Colors.Color _cColor = _ent.Color; if (_cColor.Red == 0 && _cColor.Green == 0 && _cColor.Blue == 0) { _ent.UpgradeOpen(); _ent.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, (short)7); } }
------------------ 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 |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2019/2020 CAD+T 2020 HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 04. Mai. 2015 17:39 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|