| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: C# - BlockReferenzen und AttributReferenzen (2630 mal gelesen)
|
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: 22. Dez. 2004 11:00 <-- editieren / zitieren --> Unities abgeben:
Ich habe folgenden Code, warum zeigt der ModelSpace keine Blockreferenzen an, obwohl ich vorher einige Blöcke eingefügt habe? Code: public static void WriteAllAttribRefs() { try { Database db = HostApplicationServices.WorkingDatabase; Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = db.TransactionManager; CommandLinePrompts.Message("Schritt 1"); using (Transaction tr = tm.StartTransaction()) { CommandLinePrompts.Message("Schritt 2"); BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false); ObjectIdCollection blockReferences = btr.GetBlockReferenceIds(true, true); CommandLinePrompts.Message(String.Format("Schritt 3 - {0}, Anzahl Blöcke: {1}\n", btr.Name, blockReferences.Count)); foreach (ObjectId blkRefobjId in blockReferences) { CommandLinePrompts.Message("Schritt 4"); DBObject blkRefdbObj = (DBObject)tr.GetObject(blkRefobjId, OpenMode.ForRead); BlockReference blkRef = blkRefdbObj as BlockReference; if (blkRef != null) { foreach (ObjectId subobjId in blkRef) { using (DBObject subdbObj = (DBObject)tr.GetObject(subobjId, OpenMode.ForRead)) { AttributeReference attRef = subdbObj as AttributeReference; if (attRef != null) { CommandLinePrompts.Message(attRef.Tag + " " + attRef.TextString); } } } } } CommandLinePrompts.Message("Schritt ENDE"); } } catch (Autodesk.AutoCAD.Runtime.Exception) { CommandLinePrompts.Message("Fehler ist aufgetreten!"); } }
------------------ Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 03. Jan. 2005 14:36 <-- editieren / zitieren --> Unities abgeben: Nur für RoSiNiNo
|
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: 03. Jan. 2005 14:48 <-- editieren / zitieren --> Unities abgeben:
Danke, jetzt verstehe ich einiges Ich muß also jedes Objekt in btr in einer foreach-Schleife durchgehen und schaun ob es eine Blockrefernz ist. Eigentlich logisch. Es ist ja noch nicht möglich ein Selection Set zu erzeugen, stimmt doch, oder? ------------------ Roland 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: 03. Jan. 2005 16:53 <-- editieren / zitieren --> Unities abgeben:
Für alle die es interessiert, hier der Lösung: Code: [CommandMethod("WAAR", CommandFlags.Modal)] public static void WriteAllAttribRefs() { try { Database db = HostApplicationServices.WorkingDatabase; Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = db.TransactionManager; using (Transaction tr = tm.StartTransaction()) { try { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false); foreach (ObjectId blockId in btr) { DBObject blkRefdbObj = (DBObject)tr.GetObject(blockId, OpenMode.ForRead); BlockReference blkRef = blkRefdbObj as BlockReference; if (blkRef != null) { ObjectId btrBlockId = blkRef.BlockTableRecord; BlockTableRecord btrBlock = (BlockTableRecord)tr.GetObject(btrBlockId, OpenMode.ForRead); CommandLinePrompts.Message(String.Format("\nBlockname: {0}", btrBlock.Name)); btrBlock.Close(); foreach (ObjectId subobjId in blkRef) { using (DBObject subdbObj = (DBObject)tr.GetObject(subobjId, OpenMode.ForRead)) { AttributeReference attRef = subdbObj as AttributeReference; if (attRef != null) { CommandLinePrompts.Message(String.Format("\n{0} - {1}", attRef.Tag, attRef.TextString)); attRef.Close(); } subdbObj.Close(); } } blkRef.Close(); } blkRefdbObj.Close(); } btr.Close(); } finally { tr.Dispose(); } } } catch (Autodesk.AutoCAD.Runtime.Exception) { CommandLinePrompts.Message("Fehler ist aufgetreten!"); } }
Ob es nun ein schön geschriebener Code ist?!? kann ich nicht sagen, aber er funktioniert ------------------ Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|