Startseite

Über Jürgen A. Becker

Impressum

CAD-Dienstleistungen

Schulungsangebot

AutoCAD 2011: Debugging .Net-Applikationen innerhalb Visual Studio 2010

26. August 2010

Seit ein paar Wochen programmiere ich mit Visual Studio 2010 Professional. Heute habe ich eine laufendes Projekt auf AutoCAD 2011 und Visual Studio 2010 umgestellt und habe dabei festgestellt, dass kein Debuggen möglich ist. Visual studio hält bei keinem Breakpoint an.

Nach sehr frustrierten Stunden mit Debug-Versuchen einer Applikation für AutoCAD 2011 mit Visual Studio 2010 haben ich die Lösung auf Kean Walmsey’s Blog Through the Interface gefunden.

Das Probelm liegt nicht an AutoCAD sondern am VS 2010, weil VS 2010 nicht die richtige Version auswählt um Klassenbibliotheken aus früheren Versionen des .Net-Frameworks zu debuggen. Es wird immer die Deafult-Version, die V4 des .Net-Frameworks gewählt. Diese Version ignoriert Breakpoint in Projekten aus früheren Versionen des .Net.

Kean hat in seinem Blog drei verschiedene Möglichkeiten ausgezeigt, dieses Problem zu lösen.

Ich habe die dritte Möglichkeit ausgewählt:

Fügen Sie die exe-Datei die Ihre Applikation lädt - das ist in diesem Falle AutoCAD -  als existierendes Projekt ihrem Projekt hinzu.

Schritt 1:

AutoCAD als bestehendes Projekt hinzufügen

AutoCAD als bestehendes Projekt hinzufügen

 Schritt 2:

AutoCAD als Startprojekt definieren.

AutoCAD als Startprojekt festlegen

AutoCAD als Startprojekt festlegen

 

Schritt 3:

Die Debug-Version in den Eigenschaften des ACAD-Projektes festlegen.

Debug-Eigenschaft einstellen

Debug-Eigenschaft einstellen

Debug-Version einstellen

Debug-Version einstellen

Danach funktionierte das Debuggen - Setzen eines Breakpoints und Anhalten an dieser Stelle - wunderbar.
Vielen Dank Kean.
Viel Spaß beim AusprobierenAutor: 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: Attributwerte eines Blocks auslesen

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

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

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

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

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: Objektwahl und eigene Keywords

16. Mai 2010

Eine Objektwahl eines einzelnen Objektes ist einfach zu realisieren.
Das Editor-Objekt stellt mit “GetEntity” eine Methode zur Verfügung, welche ein einzelnes Objekt auswählt.
Dazu wird das Objekt “PromptEntityOptions” instanziert und mit der Methode “Add” des Objekts “Keywords” Eingabeoptionen definiert. Die Eigenschaft “Default” definiert ein Default-Schlüsselwort, welches nut mit der Eingabetaste bestätigt werden muss.

Das PromptEntityResult beinhaltet das Ergabeergebnis.

Zunächst wird in einer switch-Anweisung über die Eigenschaft “Status” die Eingabe überprüft.

PromptStatus.Keyword
Die Eingabe war ein Schlüsselwort. In einer weiteren switch-Anweisung wird das eingegebene Schlüsselwort analysiert. Vorteilhaft ist das Umwandeln in Großbuchstaben damit eine Groß- und Kleinschreibung nicht berücksichtigt werden muss.

PromptStatus.OK
Die Eingabe war ein Objekt.

PromptStatus.Cancel
Die Eingabe wurde abgebrochen.

PromptEntityOptions hOpt = new PromptEntityOptions("\n Objekt wählen:");
hOpt.Keywords.Add("Länge");
hOpt.Keywords.Add("Breite");
hOpt.AllowNone = true;
hOpt.Keywords.Default = "Länge";

PromptEntityResult hResult = ed.GetEntity(hOpt);

switch (hResult.Status)
{
    case PromptStatus.Keyword:
       switch (hResult.StringResult.ToUpper())
       {
            case "LÄNGE":

               break;
            case "BREITE":

               break;
       }
       break;
    case PromptStatus.OK:

       break;
    case PromptStatus.Cancel:

      break;
}

 

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: Werkzeugkästen - Symbol für Flyouts definieren

15. Mai 2010

Heute erhilet ich ein eMail mit diversen Fragen. Eine Frage bezog sich auf Flyoutsymbole. Beim AutoCAD wechselt das Symbol immer zum letzen benutzten Befehl, dieses möchte der Fragesteller ändern.

Ich möchte hier die Einstellung vorstellen, die in der CUI vorgenommen werden muss um ein Wechsel der Symbole zu verhindern.

Nach dem im Editor zur Benutzeranpassung ein Flyout eingefügt wurde, muss die Eigenschaft “Eigenes Symbol verwenden” auf JA gestellt werden.

Flyout-Symbol
Flyout-Symbol

Ein passendes Bild muss ebenfalls ausgewählt werden.

Viel Spaß beim Ausprobieren
Ihr Jürgen A. Becker

.Net-Framework: Umwandlung von Strings in Zahlenwerten

26. April 2010

Sollen Zahlenwerte aus Datenbanken oder XML-Dateien ausglesen werden, stehen diese Zahlenwerte als Datentype string zur Verfügung. Eine Umwandlung ist somit erforderlich.

Ich möchte hier Möglichkeiten vorstellen, wie dieses mit Hilfe von DotNet-Methoden möglich ist.

Möglichkeit 1:

Die Convert-Klasse stellt Methoden zur Umwandlung zur Verfügung.

Beipiel einer Umwandlung in einen Double-Wert.

Convert.ToDouble("1234,45");

Diese Methode birgt eine Gefahr. .Net wirft eine Exception, wenn eine Umwandlung nicht möglich ist.

Möglichkeit 2:
Die Datentyp double besitzt die Methode “TryParse”, die eine Umwandlung versucht. Sie gibt als Ergebnis den umgewandelten Wert und den Erfolg der Umwandlung als boolscher Wert true oder false zurück.
Die Enummerierung System.Globalization.NumberStyles definiert die Art der gewünschten Zahlendarstellung.
Der Ausgabewert als letzter Parameter ist das Ergebnis der Umwandlung.

Jeder weitere Datentyp besitzt diese Methode zur Umwandlung, wobei darauf zu achten ist, dass der NumberStyle und der Ausgabewert dem Datentyp entspricht.

using System.Globalization;


private string hValue = "";
private double doubleVal;
private bool result;
   
Gegebenenfalls ein Komma in einen Punkt oder umgekehrt umwandeln
hValue = hValue.Replace(',', '.');

result =
  double.TryParse(hValue, NumberStyles.Number, null, out doubleVal);
if (result == true)
{
  hString.Wechselrichter.Preis = doubleVal;
}
else
{
  hString.Wechselrichter.Preis = 0.0;
}

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-Framework: ADO.Net - Datenbankverbindung aufbauen -

25. April 2010

Nach langer Zeit ohne Blogging möchte ich einige Artikel zum Thema Nutzung von Datenbank in .Net mit Hilfe von ADO.Net.
Dieses Thema hat nicht unmittelbar mit AutoCAD zu tun, ich stelle aber bei vielen Projekten fest, dass eine Nutzung einer SQL-Datenbank z.B. um Stammdaten zu verwalten auch im Umfeld von AutoCAD hilfreich ist.

Der erste Artikel befasst sich mit dem Aufbau einer Datenbankverbindung.

Die Klasse SqlConnection des Namespaces System.Data.SqlClient stellt die Methoden und Eigenschaften ein Datenbankverbindung zur Verfügung.
Um eine Datenbankverbindung aufzubauen, wird ein ConnectionString zusammengesetzt.
Dieser ConnectionString beinhaltet folgende Definition:

Server SQL-Server
Der Datenbank-Servername bestehend aus Computername des Servers auf dem die Datenbank läuft und der Name des SQL-Server.

Microsoft-Access
Wird nicht benötigt.
Data Source SQL-Server
Der Name der Datenbank

Microsoft-Access
Name der Datei
Integrated Security Definiert Art der Anmeldung des Benutzers fest. Ist nur beim SQL-Server anzugeben, da der SQL-Server selbst eine Benutzerberechtigung besitzt. Die Angabe SSPI bedeutet, dass der SQL-Server der Windows-Anmeldung vertraut.

Hier der Code, der eine Datenbankverbindung aufbaut. Er ist Bestandteil einer umfangreichen Datenverbindungklassse, somit ist eine vollständige Anzeige nicht möglich.

switch (hProvider) {
  case "SQLOLEDB":
   if (hServer != null) {
     hConnectionString =
        "Data Source=" + hServer +
        "; Initial Catalog=" + hDataSource +
        "; Integrated security=SSPI";                      
     hSqlConnection = new SqlConnection(hConnectionString);
     hSqlConnection.Open();
     hFehler = 0;                          
  }
  else {
    hFehler = 1;
  }                            
  break;
 case "Microsoft.Jet.OLEDB.4.0":
   hConnectionString =
      "Provider=" + hProvider +
      "; Data Source=" + hDataSource + "; ";
   hConnectionString = hConnectionString +
     "Persist Security Info=False; Mode=ReadWrite;";
   string hCOn = hConnectionString;
   hOleDBConnection =
       new System.Data.OleDb.OleDbConnection(hConnectionString);
   hOleDBConnection.Open();
   hFehler = 0;                            
  break;
}

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