| | | 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: Filter für Dynamische Blöcke (2664 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 15. Mrz. 2013 13:47 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 15. Mrz. 2013 13:52 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
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
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 15. Mrz. 2013 14:00 <-- editieren / zitieren --> Unities abgeben:
|
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 19. Mrz. 2013 15:57 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 19. Mrz. 2013 16:18 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
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
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 / zitieren --> Unities abgeben: Nur für Theo37
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
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 19. Mrz. 2013 17:31 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für Theo37
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
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 20. Mrz. 2013 09:47 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für Theo37
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 >>)
|