Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Filter für Dynamische Blöcke

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:  Filter für Dynamische Blöcke (2649 mal gelesen)
Theo37
Mitglied
Techniker


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

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 15. Mrz. 2013 13:47    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 an Alle,

ich möchte mir einen Filter erstellen, der mir sowohl normale als auch dynamische Blöcke eines Namens sucht.
Leider finde ich keine Beschreibung in der steht welchen DXF-Code der Effektivname eines Dynamischen Blocks hat.
Bin für jeden Tip dankbar.
Unten meine kläglichen Versuche.

Gruß, Theo

  MyFilterData.SetValue(New TypedValue(0, "INSERT"), 0)
        MyFilterData.SetValue(New TypedValue(DxfCode.Operator, "<or"), 1)
        MyFilterData.SetValue(New TypedValue(2, OldBlock), 2) 'bis hierher klappts, dann wird es Quatsch
        MyFilterData.SetValue(New TypedValue(3, OldBlock), 3)
        MyFilterData.SetValue(New TypedValue(1000, OldBlock), 4)
        MyFilterData.SetValue(New TypedValue(DxfCode.Operator, "or>"), 5)

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: 15. Mrz. 2013 13:52    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 Theo37 10 Unities + Antwort hilfreich

Hallo Theo,

da hast du einen falschen Ansatz. Es gibt keinen DXF-Code für den EffectiveName.

Du musst aus der BlockTable alle *U-Blöcke checken, ob diese den EffectiveName des gesuchetn Blockes besitzen. Die so ermittelten Namen der *U-Blöcke musst du in der Filterliste verarbeiten.

Grüße!
Holger

------------------
Holger Brischke
FREIE SCHULUNGSPLÄTZE -- C#.NET-Schulung im Mai 2013 Bei Interesse bitte melden!
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

Theo37
Mitglied
Techniker


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

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 15. Mrz. 2013 14:00    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

Hi Holger,

da hab ich mal wieder zu einfach gedacht. Klarer Fall das mach ich so.
Danke und schönes Wochenende.
Gruß, Theo

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

Theo37
Mitglied
Techniker


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

Beiträge: 423
Registriert: 08.10.2008

ACAD 2019
WIN 7 64bit
Intel Xenon CPU E5-1620 3.60GHz
16GB RAM

erstellt am: 19. Mrz. 2013 15:57    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

Falls es jemand brauchen kann. Oder auch wenn jemand nen Verbesserungsvorschlag hat.
Gruß, Theo

        Using acTrans As Transaction = Mydb.TransactionManager.StartTransaction()
            UnBlockname = New Collection
            MyBlocktable = acTrans.GetObject(Mydb.BlockTableId, OpenMode.ForRead)
            For Each MyId In MyBlocktable
                Myblockdef = acTrans.GetObject(MyId, OpenMode.ForRead)
                Myids = Myblockdef.GetBlockReferenceIds(False, False)
                If Myids.Count > 0 Then
                    MyBlockref = acTrans.GetObject(Myids(0), OpenMode.ForRead)
                    Myblockdef2 = acTrans.GetObject(MyBlockref.DynamicBlockTableRecord, OpenMode.ForRead)
                    If Myblockdef2.Name.ToUpper = OldBlock.ToUpper Then
                        UnBlockname.Add("`" & Myblockdef.Name)
                    End If
                End If
            Next
        End Using
        MyFilterData.SetValue(New TypedValue(0, "INSERT"), 0)
        MyFilterData.SetValue(New TypedValue(DxfCode.Operator, "<or"), 1)
        MyFilterData.SetValue(New TypedValue(2, OldBlock), 2)
        a = 3
        For Each UnBlock In UnBlockname
            ReDim Preserve MyFilterData(a)
            MyFilterData.SetValue(New TypedValue(2, UnBlock), a)
            a = a + 1
        Next
        ReDim Preserve MyFilterData(a)
        MyFilterData.SetValue(New TypedValue(DxfCode.Operator, "or>"), a)

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: 19. Mrz. 2013 16:18    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 Theo37 10 Unities + Antwort hilfreich

Hallo Theo,
ich habe einen Verbesserungsvorschlag.
Du kannst in der Filterliste die ermittelten Namen auch durch Komma getrennt eintragen. Dann brauchst du nicht mit <or .. und einer unbestimmten Anzahl an Blocknamen arbeiten.
Beispiel: (2 . "Name1,Name2,name3")

Grüße!
Holger

------------------
Holger Brischke
FREIE SCHULUNGSPLÄTZE -- C#.NET-Schulung im Mai 2013 Bei Interesse bitte melden!
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


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

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: 19. Mrz. 2013 16:24    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 Theo37 10 Unities + Antwort hilfreich

Von dem BlockTable-Objekt kann man aber auch die Funktion BT.GetBlockReferenceIds(directOnly As Boolean, forceValidity As Boolean) verwenden. Der erste Parameter ist speziell dafür gebaut, wie mit dynamischen Blöcken umgegangen wird.

------------------


www.cars4fun.at

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

Theo37
Mitglied
Techniker


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

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 19. Mrz. 2013 17:31    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:
Das machts einfacher, wußte ich nicht,daß das geht.

Ingenjeur Studio
HOLLAUS

Da sitz ich ein bischen auf der Leitung. Können Sie das ein bischen genauer erklären. Der erste Parameter ist doch direct only. wenn ich den auf true setze, dann werden nur direkt eingefügte Blöcke gefunden.
Also Blöcke die in einem Layout sind und nicht verschachtelt in einer Blockdef. Oder, steckt da mehr dahinter.

Gruß, Theo

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

Ingenieur Studio HOLLAUS
Mitglied
CAD / CAFM / GIS Beratung-Programmierung-Schulung


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

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: 19. Mrz. 2013 19:26    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 Theo37 10 Unities + Antwort hilfreich

Oha, verwechselt.
Die richtige Antwort wäre gewesen, wenn der BlockTableRecord zeigt, dass es ein dynamischer Block ist, dann kann man zum einen mit .GetBlockReferenceIDs die Blockreferenzen bekommen, die direkt ansprechbar sind (noch nicht "unnamed blocks" sind), mit der Funktion .GetAnonymousBlockIds bekommt man die BlockTableRecords der von dieser Blockdefinition abgeleitete BlockTableRecords der unnamed blocks.
Beispiel wäre hier zu finden.
Sorry nochmals!

------------------


www.cars4fun.at

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

Theo37
Mitglied
Techniker


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

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 20. Mrz. 2013 09:47    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

  Using acTrans As Transaction = Mydb.TransactionManager.StartTransaction()
            UnBlockname = New Collection
            MyBlocktable = acTrans.GetObject(Mydb.BlockTableId, OpenMode.ForRead)
            MyblockdefId = MyBlocktable(OldBlock)
            Myblockdef = acTrans.GetObject(MyblockdefId, OpenMode.ForRead)
            If Myblockdef.IsDynamicBlock Then
                For Each MyId In Myblockdef.GetAnonymousBlockIds
                    Myblockdef2 = acTrans.GetObject(MyId, OpenMode.ForRead)
                    UnBlockname.Add("`" & Myblockdef2.Name)
                Next
            End If
        End Using
        MyFilterData.SetValue(New TypedValue(0, "INSERT"), 0)
        MyFilterData.SetValue(New TypedValue(DxfCode.Operator, "<or"), 1)
        MyFilterData.SetValue(New TypedValue(2, OldBlock), 2)
        a = 3
        For Each UnBlock In UnBlockname
            ReDim Preserve MyFilterData(a)
            MyFilterData.SetValue(New TypedValue(2, UnBlock), a)
            a = a + 1
        Next
        ReDim Preserve MyFilterData(a)
        MyFilterData.SetValue(New TypedValue(DxfCode.Operator, "or>"), a)

Das wäre dann so? Funktioniert auf den ersten Blick wunderbar.
Komisch, daß das zB Jerry Winter nicht verwendet. Ist "GetAnonymousBlockIds" vielleicht ne neue Funktion.

Gruß, Theo

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

RoSiNiNo
Mitglied
Konstrukteur


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

Beiträge: 1126
Registriert: 09.10.2002

Revit Structure 2011
Acad 2011-deutsch, Express Tools
3ds Max 2011
Win 7-Professional
HP Workstation Z400, 6GB
GeForce GTX 470

erstellt am: 04. Apr. 2013 14:53    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 Theo37 10 Unities + Antwort hilfreich

Vielleicht hilft ja dieser Code weiter. Ist nicht von mir sondern von Tony Tanzillo, ist mir aber immer eine große Hilfe.
Code:
        /// Based on code from Tony Tanzillo http://www.caddzone.com
        /// Pass ObjectId of a block (BlockTableRecord), and this
        /// returns the Names of all Names to the block,
        /// including all dynamic block names. This method
        /// provides a uniform way to get the names of all blockrefs,
        /// regardless of whether the block is dynamic or not.

        public string GetBlockReferenceNames(ObjectId btrId)
        {
            if (btrId.IsNull)
                throw new ArgumentException("null object id");
            string result = "";
            using (Transaction trans = btrId.Database.TransactionManager.StartTransaction())
            {
                try
                {
                    /// open the BlockTableRecord:

                    BlockTableRecord btr = trans.GetObject(btrId, OpenMode.ForRead) as BlockTableRecord;
                    if (btr != null)
                    {
                        // Add the ids of all references to the BTR. Some dynamic blocks may
                        // reference the dynamic block directly rather than an anonymous block,
                        // so this will get those as well:

                        result = btr.Name;


                        // if this is not a dynamic block, we're done:

                        if (!btr.IsDynamicBlock)
                            return result;


                        // Get the ids of all anonymous block table records for the dynamic block

                        ObjectIdCollection anonBtrIds = btr.GetAnonymousBlockIds();
                        if (anonBtrIds != null)
                        {
                            foreach (ObjectId anonBtrId in anonBtrIds)
                            {
                                // get all references to each anonymous block:

                                BlockTableRecord rec = trans.GetObject(anonBtrId, OpenMode.ForRead) as BlockTableRecord;
                                if (rec != null)
                                {
                                    result += ",`" + rec.Name;
                                }
                            }
                        }
                    }
                }
                finally
                {
                    trans.Commit();
                }
            }
            return result;
        }


------------------
Roland Feletic
PCD ZT-GmbH

Autodesk Building Design Suite Premium 2013
Win 7-Professional
HP Workstation Z400, 6GB
GeForce GTX 470

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