.Net-Framework - Layer, Stile, Linientype und Blöcke -
Samstag, 29. August 2009Layer, Stile z.B. Bemaßungs- und Textstile, Linientypen und Blöcke etc. sind in Tabellen in der Zeichnung gespeichert.
Diese können in C# oder VB.Net ausgelesen und die TableRecord (der einzelne Layer oder Linientyp) bearbeitet werden.
Die Klassen dieser Tabellen gehören zum Namespace
und heißen wie folgt:
Hier ein Bespiel zur Deklaration der Variablen
private LinetypeTable hLineTypeTable;
private DimStyleTable hDimStyle;
private TextStyleTable hTextStyleTable;
Die einzelnen Layer, Stile und Linientypen etc. werden in TableRecords gespeichert.
Die Klassen dieser Records gehören ebenfalls zum Namespace
und lauten wie folgt:
private LayerTableRecord hLayer;
private TextStyleTableRecord hTextStyle;
Hier ein kleines Beispiel zum Auflisten der Layernamen.
using System.Collections.Generic;
#region Usings für AutoCAD
using Autodesk.AutoCAD;
using Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices;
using AcDB = Autodesk.AutoCAD.DatabaseServices;
using AcEd = Autodesk.AutoCAD.EditorInput;
#endregion
namespace AcadUtilty
{
public class clsAcadTables
{
Document doc =
AcAp.Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database hDB = doc.Database;
Transaction hTr = hDB.TransactionManager.StartTransaction();
using (hTr)
{
try
{
hLayerTable =
(LayerTable)hTr.GetObject(hDB.LayerTableId, OpenMode.ForRead);
//Die Layer-Tabelle wird ausgelesen
foreach (ObjectId hObId in hLayerTableTemplate)
{
LayerTableRecord hLayer =
(LayerTableRecord)hTr.GetObject(hObId, OpenMode.ForRead);
string hMessage = "\nLayername" + hLayer.Name;
ed.WriteMessage(hMessage);
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
string hMessage = "\n" + e.Message;
ed.WriteMessage(hMessage);
}
finally
{
hTr.Commit();
}
}
}
}
Sollen TableRecords geändert werden, muss die Tabelle schreibend geöffnet werden. Im obigen Bespiel ist sie lesend geöffnet, da nur Informationen herausgelesen werden sollen.
hLayerTable =
(LayerTable)hTr.GetObject(hDB.LayerTableId, OpenMode.ForRead);
//Schreibend geöffnet
hLayerTable =
(LayerTable)hTr.GetObject(hDB.LayerTableId, OpenMode.ForWrite);
Bei Änderungen an der Tabelle oder den Records dieser Tabelle, darf ein Commit des Transactions nicht vergessen werden, ansonsten finden keine Änderungen in der Zeichnung statt.
Die Bearbeitung der Tabelle und der Records findet in einem try-Block statt, um Exception in einem catch-Block abfangen zu können. Im finally-Block werden die Änderungen die innerhalb des Transactions durchgeführt wurden mit der Methode Commit() abgeschlossen.
{
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
string hMessage = "\n" + e.Message;
ed.WriteMessage(hMessage);
}
finally
{
hTr.Commit();
}
Sollen gezielt TableRecords angesprochen werden, wird über den Key - normalerweise der Name z.B. Layername dieses Records - dieser Record erstellt. Wir erhalten eine ObjectId über die wir mit Hilfe der Methode GetObject der Transaction das Objekt erhalten.
Im folgenden Beispiel wird der Layer “A_Wand” ausgelesen. Man sollte beachten, dass dieser Layer existieren muss.
LayerTableRecord hLayer =
(LayerTableRecord)hTr.GetObject(hLayerID, OpenMode.ForWrite);
Eine Überprüfung auf Vorhandensein eines Records erfolgt über die Methode Has der Tabelle.
{
//Mach etwas, vielleicht den Layer erstellen
}
Alle anderen Tabellen werden analog ausgelesen.
Viel Spaß beim Ausprobieren
Autor: Dipl.-Ing. Jürgen A. Becker
Kontakt: Juergen.Becker@CAD-Becker.de oder Juergen.Becker@AUGI.COM
- Langjährige Schulungserfahrung
- Autorisierter AutoCAD Trainer (AutoCAD, Mechanical Desktop etc.)
- Software- und Datenbankentwicklung








RSS Feed