| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Blocktabelleneinträge (724 mal gelesen)
|
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 23. Aug. 2015 10:19 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich versuche externe (dwg)Blockdateien einzulesen, um sie später zu benutzen. In der Historie dieses Forums habe ich auch ein Beispiel gefunden, dass erstmal gut funktioniert: string acDwg = "C:\\Temp\\Blume.dwg"; Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; Transaction tr = doc.TransactionManager.StartTransaction(); try { string dwgName = HostApplicationServices.Current.FindFile(acDwg, Application.DocumentManager.MdiActiveDocument.Database, FindFileHint.Default); Database db = new Database(false, false); db.ReadDwgFile(dwgName, System.IO.FileShare.Read, true, ""); ObjectId BlkId; BlkId = doc.Database.Insert(dwgName, db, false); BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead, true); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); //btr.Name = "Blume"; BlockReference bref = new BlockReference(new Autodesk.AutoCAD.Geometry.Point3d(10, 10, 0), BlkId); btr.AppendEntity(bref); tr.AddNewlyCreatedDBObject(bref, true); tr.Commit(); } 2 Dinge möchte ich aber ändern. Zum einen wird der Block ohne Namen in die Blocktabelle geschrieben. Ich habe versucht, in an die BlockTableRecord zu hängen. Bekomme aber eine Fehlermeldung (invalidInput). Aber genau hier müsste es eigentlich gemacht werden, denke ich. Zum anderen möchte ich nicht gleich den Block (als Blockreference) in die Zeichnung einfügen. Der Eintrag in die Blocktabelle, wird aber erst sichtbar, wenn vorher eine Blockreference erzeugt und dann der BlockTableRecord zugewiesen wird. Wie könnte ich das umgehen? Gruß Andreas 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: 27. Aug. 2015 10:16 <-- editieren / zitieren --> Unities abgeben: Nur für AndreasM2000
|
AndreasM2000 Mitglied CAD-Projektleiter, Zeichner, Programmierer
Beiträge: 21 Registriert: 24.11.2013 https://autocaddotnetsamples.wordpress.com/
|
erstellt am: 02. Sep. 2015 16:35 <-- editieren / zitieren --> Unities abgeben:
vielen Dank für das Beispiel. Ich habe dann mit den beiden Beispielen solange experimentiert bis ich jetzt den Fehler gefunden habe und die beiden gewünschten Dinge umgesetzt bekomme. Mein entscheidender Fehler im obigen Script war hier: BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); //btr.Name = "Blume"; Hier versuche ich nicht, wie ich annahm, einen Verweis auf mein (Blume) BlockRecord zu setzen, sondern hier wird ein Verweis auf das ModelSpace-Blockrecord gesetzt. Eine Namenszuweisung wird dann natürlich abgewiesen. Hier jetzt mein Code, für den, den es interessiert. Es wird eine externe dwg eingelesen, ein Blockname gesetzt und keine Blockreferenz in die Zeichnung (ModelSpace) eingefügt. Aufbauend auf dieser Prinziplösung will ich dann die einzulesenden dwg-Dateien, deren Blocknamevergabe und das Einfügen in die Zeichnung dynamisieren. string dwgName = "C:\\Temp\\Blume.dwg"; Document doc = Application.DocumentManager.MdiActiveDocument; Transaction acTrans = doc.TransactionManager.StartTransaction(); try { Database db = new Database(false, false); db.ReadDwgFile(dwgName, System.IO.FileShare.Read, true, ""); ObjectId BlkId; BlkId = doc.Database.Insert(dwgName, db, false); BlockTable bt = (BlockTable)acTrans.GetObject(doc.Database.BlockTableId, OpenMode.ForRead, true); BlockTableRecord btr_WBlock = (BlockTableRecord)acTrans.GetObject(BlkId, OpenMode.ForWrite); btr_WBlock.Name = "Blume"; acTrans.Commit(); } Gruss Andreas
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|