Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Entity Color abfragen und ändern

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Entity Color abfragen und ändern (1081 mal gelesen)
Dirk.B
Mitglied
Tischler / Leiter Arbeitsvorbereitung


Sehen Sie sich das Profil von Dirk.B an!   Senden Sie eine Private Message an Dirk.B  Schreiben Sie einen Gästebucheintrag für Dirk.B

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 04. Mai. 2015 13:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Dirk.B 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Dirk.B an!   Senden Sie eine Private Message an Dirk.B  Schreiben Sie einen Gästebucheintrag für Dirk.B

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 04. Mai. 2015 14:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Dirk.B 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Dirk.B an!   Senden Sie eine Private Message an Dirk.B  Schreiben Sie einen Gästebucheintrag für Dirk.B

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Holger!

Danke für die Erläuterung.

Nun funktionierts.

------------------
Gruß

Dirk

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz