Startseite

Über Jürgen A. Becker

Impressum

CAD-Dienstleistungen

Schulungsangebot

Archiv für die Kategorie „Allgemeines“

AutoCAD und .Net-Framework: Attributwerte eines Blocks auslesen

Dienstag, 20. Juli 2010

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

AutoCAD und .Net-Framework: Umrechnung Bogenmaß in Dezimalgrad und zurück

Montag, 14. Juni 2010

Jeder Programmieren auch der, der mit Visual-Lisp programmiert, wird sich irgendwann einmal mit der Umrechnung der Winkel von Bogenmaß in Dezimalgrad oder umgekehrt befassen müssen, da AutoCAD intern immer mit Bogenmaß rechnet.
Hier die zwei Methoden, die diese Umrechnung tätigen.

public double RadAngle(double DecimalAngle)
{
  return DecimalAngle * Math.PI / 180;
}

public double DecAngle(double RadAngle)
{
  return RadAngle * 180 / Math.PI;
}

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

AutoCAD und .Net-Framework: Winkel zwischen zwei Punkten

Montag, 14. Juni 2010

Eine schöne kleine Funktion ist das Berechnen des Winkel zwischen zwei Punkten. Hier wird eine ähnliche Methode genutzt wie bei der Berechnung der Distanz. Der Unterschied: Es wird nicht die Längeneigenschaft sondern die Angle-Eigenschaft des Vektors zurückgegeben.

public void GetAngle (Point2d Point1, Point2d Point2)
{
  Autodesk.AutoCAD.Geometry.Vector2d Vec = Point2 - Point1;
  return Vec.Angle;
}

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

AutoCAD und .Net-Framework: Distanze zwischen zwei Punkten

Montag, 14. Juni 2010

Die Berechnung einer Distanze zwischen zwei Punkten erfolgt mit Hilfe eines Vektors. Dieser Vektor wird ermittelt anhand der Differenz zweier Punkte, deren Distanze ermittelt werden soll.

Da die Länge zwischen zwei Punkten aus beiden Richtungen identisch ist, ist es egal welcher Punkt vom anderen abgezogen wird.

public void GetDistance (Point2d Point1, Point2d Point2)
{
  Autodesk.AutoCAD.Geometry.Vector2d Vec = Point2 - Point1;
  return Vec.Length;
}

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

AutoCAD und .Net-Framework: Objektwahl mehrerer Objekte und eigene Keywords

Sonntag, 16. Mai 2010

Die Objektwahl mit der Editor-Methode “GetSelection” wählt mehrere Objekte aus, wird allerdings angewandt als GetEntity.

Bei der Auswahl der Schlüsselwörter muss unbedingt darauf geachtet werden, dass die Objektwahl selber eigene Schlüsselwörter z.B. Fenster oder Kreuzen hat. Diese Schlüsselwörter oder deren Shortcuts können nicht für eigene Zwecke genutzt werden.

Des Weiteren erzeugt die Definition der Schlüsselwörter mit Keywords.Add keine Anzeige der Schlüsselwörter. Dieses muss mit der Eigenschaft “MessageForAdding” selber realisiert werden.

hOpt.MessageForAdding = "Fehlstellen wählen oder [HÖhe /Alle wählen]";

Wird ein Schlüsselwort eingegeben eine Event-Methode aufgerufen, die vorher definiert werden muss. In dieser Methode werden in einer switch-Anweisung die Schlüsselwörter analysiert.

hOpt.KeywordInput +=
   new SelectionTextInputEventHandler( OnMPMakeKeywordInput );
hOpt = new PromptSelectionOptions();
hOpt.MessageForAdding =
      "Fehlstellen wählen oder [HÖhe /Alle wählen]";
hOpt.AllowDuplicates = false;
hOpt.Keywords.Add("Höhe");
hOpt.Keywords.Add("Alle wählen");
hOpt.KeywordInput +=
   new SelectionTextInputEventHandler( OnMPMakeKeywordInput );                 
                   
PromptSelectionResult hResult = ed.GetSelection(hOpt);
switch (hResult.Status)
{                          
  case PromptStatus.OK:

    break;
  case PromptStatus.Cancel:

    break;
}

Die Event-Methode, die aufgerufen wird, wenn ein Schlüsselwort eingegeben wurde.

static void OnMPMakeKeywordInput
    ( object sender, SelectionTextInputEventArgs e )
{
  switch (e.Input.ToUpper())
  {

  }
}

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.)

AutoCAD und .Net-Framework: Sichern von Zeichnungsdateien

Sonntag, 7. März 2010

Das Speichern von Zeichnungsdateien kann auf unterschiedlichste Art gelöst werden.

1. Variante: Nutzung des .Net

Die Methode SaveAs des Objekts DataBase speichert die Zeichnung. Diese Methode kann in anderen in C# oder VB.Net programmierten Funktionen genutzt werden.

using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
.
.
.
public void SaveAS(string Name)
{
 Document hDoc =  AcAp.DocumentManager.MdiActiveDocument;
 object hCmd = AcAp.GetSystemVariable("CMDECHO");
 hDoc.Database.SaveAs
   (Name, true, DwgVersion.Current, hDoc.Database.SecurityParameters);
}

2. Variante: Als COM-Objekt

AcadDocument hdoc = (AcadDocument)doc.AcadDocument;
hDoc.SaveAs(dwgPath, AcSaveAsType.acNative, null);

3. Variante: Methode SendStringToExecute
Hierbei wird der Commandbefehl als String in Form einer Lisp-Anweisung zusammengesetzt und der SendStringToExecute-Methode des Objektes MdiActiveDocument übergeben.

Diese Methode kann NICHT in anderen eigenen Methoden genutzt werden, da innerhlab eines aktiven Befehls kein Command-Befehl aufgerufen werden kann, außer er ist transparent. Da der SaveAs-befehl nicht transparent ist, kann diese Methode innerhalb eigener Methoden nicht genutzt werden.

using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
.
.
.
public void SaveAS(string Name)
{
 Document hDoc =  AcAp.DocumentManager.MdiActiveDocument;
 object hCmd = AcAp.GetSystemVariable("CMDECHO");

 hDoc.SendStringToExecute("(setvar \"CMDECHO\" 0)");
 hDoc.SendStringToExecute
  ("(command \"_.SAVEAS\" \"\" \"" + Name + "\")", false, false, false);
 hDoc.SendStringToExecute
  ("(setvar \"CMDECHO\" " + hCmd.ToString() + ")", false, false, false );
 hDoc.SendStringToExecute
  ("(princ)", false, false, false );           
}

Eine 4. Variante die Nutzung der Methode Save des Objektes DataBase hat bisher nicht funktioniert.

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

Follow me on Twitter

Sonntag, 7. März 2010

Nun habe ich mir doch einen Twitter-Account eingerichtet.
Sie erreichen mich dort über twitter (http://twitter.com/CADBeckerde).
Ihr Jürgen A. Becker

Galileo Computing : Aktuelle IT-Fachbücher online lesen und herunterladen

Freitag, 5. März 2010


Galileo Computing stellt IT-Fachbücher online zum Lesen zur Verfügung, u.a. auch ein Buch zu C#.

 

Mit  gehts los.

Viel Spaß beim Lernen

Ihr Jürgen A. Becker

.Net-Framework: Bitweise arbeiten

Freitag, 5. März 2010

In vielen Programmier-Projekten speichere ich Zustände von Programmteilen oder Objekten bitcodoert ab.

Autodesk hat diese Möglichkeit z.B. bei der Systemvariable OSMODE, die die Objektfang-Einstellung speichert ebenfalls genutzt. Diese Variable ist bitcodiert.

Diese Systemvariable kann u.a. folgende Werte beinhalten (die vollständige Liste entnehmen Sie bitte aus der AutoCAD-Hilfe):

0 KEIner
1 ENDPunkt
2 MITtelpunkt
4 ZENtrum
8 PUNkt
16 QUADrant
32 SCHnittpunkt
64 BASispunkt

Sind mehrere Objektfänge aktiv, werden die Werte der einzelnen aktiven Objektfänge addiert. Möchte man nun feststellen welcher Objektfang aktiviert ist, muss nur überprüft werden welche Bits gesetzt sind und welche nicht.

Ein Beispiel:

Wir nehmen an, dass die Objektfänge ENDPunkt, SCHnittpunkt und ZENtrum aktiv sind. Addieren wir die Werte, so erhalten wir 37 (Addition von 1 + 4 + 32). Der Inhalt der Systemvariable OSMODE ist somit 37.

Müssen im Programm Objektfänge aktiviert oder aktiviert werden, können wir die Systemvariable nach obigen Muster einstellen.

Im Folgenden wir deine Konsolenanwendung vorgestellt, die das Arbeiten mit bitcodierten Variablen erläutert.

Die Methode “SetBit” setzt das gewünschte Bit und gibt den neuen bitcodierten Wert zurück. Die Methode “ToggleBits” löscht ein Bit und gibt ebenfalls den neuen bitcodierten Wert zurück.
Um zu Überprüfen ob ein Bit gesetzt ist oder nicht, wird die Methode “TestBit” benötigt. Diese Methode gibt true bei gesetzten und false bei nicht gesetzten Bit zurück.

using System;

namespace BitTest
{
 class Program
 {
  public static void Main(string[] args)
  {
    UInt32 hByte = 0;
    UInt32 hBit = Convert.ToUInt32(1);
    hByte = SetBit(hBit, hByte);

    hBit = Convert.ToUInt32(2);
    hByte = SetBit(hBit, hByte);   
           
    hBit = Convert.ToUInt32(4);
    hByte = SetBit(hBit, hByte);
           
    hBit = Convert.ToUInt32(8);
    hByte = SetBit(hBit, hByte);           
           
    hBit = Convert.ToUInt32(16);
           
    if (TestBit(hBit, hByte))
    {
      Console.Write("\nbit 16 ist gesetzt. Ofang QUADrant");
    }
    else
    {
      Console.Write("\nbit 16 ist gesetzt. Ofang QUADrant");
    }
    hBit = Convert.ToUInt32(8);
    hByte = ToggleBits(hBit, hByte);
           
    if (TestBit(hBit, hByte))
    {
      Console.Write("\nbit 8 ist gesetzt. Ofang PUNkt");
    }
    else
    {
      Console.Write("\nbit 8 ist nicht gesetzt. Ofang PUNkt");
    }
           
    Console.ReadKey(true);
  }
       
  private static bool TestBit(UInt32 bit, uint mask)  
  {
     return (mask & bit) == bit ? true : false;  
  }    
       
  private static UInt32 SetBit(UInt32 bit, uint mask)  
  {  
    return mask = (mask | bit);  
  }    
       
  private static UInt32 ToggleBits(UInt32 bit, uint mask)  
  {
     return mask &= ~bit;
  }    
 }
}

Ergebnis:

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

.Net-Beispiele auf Codeproject.com

Donnerstag, 28. Januar 2010

Codeproject ist ein Plattform die uns Entwicklern Codebeispiel in C#, ASP.Net, VB.Net und C++ aus aller Welt zur Verfügung stellt.

Ich habe dort .Net Programmierung Beispiele für AutoCAD gefunden.

Hier der Link: Samples for DOTNETARX (a tool for AutoCAD .NET programming).

Weiteres finden Sie mit der Suche nach dem Begriff: AutoCAD.

Ihr Jürgen A. Becker