Startseite

Über Jürgen A. Becker

Impressum

CAD-Dienstleistungen

Schulungsangebot

AutoCAD und .Net-Framework: Attributwerte eines Blocks auslesen

Attribute sind variable Texte eines Blocks, die vom Nutzer frei editierbar sind. Ich möchte hier eine kleine Routine vorstellen, die Attribute ausliest und editiert.


Der Block ist ein Raumstempel zur Beschriftung von Räumen in Architektur-Zeichnungen. In diesem Block befindet sich ein Attribut mit dem Namen RAUMKENNUNG, welches den Raum eindeutig identifiziert. In der hier verwalteten Liegenschaft wird es keinen Raum geben der die selbe RAUMKENNUNG besitzt.


Zunächst wird der Block ermittelt. In diesem Beispiel werden alle Block über ein SelectionFilter ermittelt. Im SelectionsFilter befinden sich nur Blockreferenzen (DXFCode = INSERT). Über die Methode SelectAll des Editors wird mit diesem Filter die gesamte Zeichnung durchsucht.

TypedValue[] hTypeValue = new TypedValue[1];
hTypeValue.SetValue(new
           TypedValue((int)DxfCode.Start, "INSERT"), 0);
hSf = new SelectionFilter(hTypeValue);
hSelRes = ed.SelectAll();



In einer foreach-Schleife wird das Blockreferenz-Objekt mit Hilfe diverser Castings ermittelt.

foreach (SelectedObject hSelObj in hSelRes.Value)
{
 Entity hEnt =
  (Entity)hTm.GetObject(hSelObj.ObjectId, OpenMode.ForWrite, true);
 if (hEnt.GetType().ToString() ==
    "Autodesk.AutoCAD.DatabaseServices.BlockReference")
 {
  BlockReference hBlock =
    (BlockReference)hTr.GetObject(hSelObj.ObjectId, OpenMode.ForWrite);
 }
}



Nachdem überprüft wurde, ob es sich um den richtigen Block handelt, werden die Attribute dieses Blockes ermittelt. Sie befinden sich in einer der AttributeCollection.
Die Methode GetObject() der Transaction erstellt das Attributobjekt anhand der ID aus der AttributCollection.
Die Eigenschaft TAG des Attributs ist die Bezeichnung und die Eigenschaft TEXTSTRING des Attributs ist der Wert des Attributs.
Der Wert kann danach weiterverarbeitet werden.

if (hBlock.Name.ToUpper() == "RAUMBEZEZEICHNUNG")
{
 AttributeCollection hAttCol = hBlock.AttributeCollection;
 foreach (ObjectId hAttId in hAttCol)
 {
  AttributeReference hAttRef =
  (AttributeReference)hTr.GetObject(hAttId, OpenMode.ForRead);
  if (hAttRef.Tag.ToUpper() == "RAUMKENNUNG")
  {
   hRaumKennung = hAttRef.TextString.ToUpper().Trim();
  }
 }
}



Hier der komplette Programmcode:

using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
.
.
.
[CommandMethod("GetAttributs")]
static public void GetAttributs()
{
 string hRaumKennung = "";
 PromptSelectionResult hSelRes;
 SelectionFilter hSf;
 Document doc = AcAp.DocumentManager.MdiActiveDocument;
 Editor ed = doc.Editor;
 Transaction hTr;

 Autodesk.AutoCAD.DatabaseServices.TransactionManager hTm =
     doc.Database.TransactionManager;
 hTr = hTm.StartTransaction();

 using (hTr)
 {
  try
  {
   TypedValue[] hTypeValue = new TypedValue[1];
   hTypeValue.SetValue(new
           TypedValue((int)DxfCode.Start, "INSERT"), 0);
   hSf = new SelectionFilter(hTypeValue);
   hSelRes = ed.SelectAll();

   if (hSelRes != null)
   {
     if (hSelRes.Value != null)
     {
      if (hSelRes.Status == PromptStatus.OK)
      {
       foreach (SelectedObject hSO in hSelRes.Value)
       {
        Entity hEnt =
         (Entity)hTm.GetObject(hSO.ObjectId, OpenMode.ForWrite, true);
        if (hEnt.GetType().ToString() ==
            "Autodesk.AutoCAD.DatabaseServices.BlockReference")
        {
         BlockReference hBlock =
          (BlockReference)hTr.GetObject(hSO.ObjectId, OpenMode.ForWrite);
         if (hBlock.Name.ToUpper() == "RAUMBEZEZEICHNUNG")
         {
          AttributeCollection hAttCol = hBlock.AttributeCollection;
          foreach (ObjectId hAttId in hAttCol)
          {
           AttributeReference hAttRef =
            (AttributeReference)hTr.GetObject(hAttId, OpenMode.ForRead);
           if (hAttRef.Tag.ToUpper() == "RAUMKENNUNG")
           {
            hRaumKennung = hAttRef.TextString.ToUpper().Trim();
           }
          }
          if (hRaumKennung.Length != 0)
          {
           hBlock.UpgradeOpen();
Do What ever you want!
          }
         }
        }
       }
      }
     }
    }
   }
   catch
   {

   }
   hTr.Commit();
 }
}

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

Kommentieren