Startseite

Über Jürgen A. Becker

Impressum

CAD-Dienstleistungen

Schulungsangebot

Archiv für März 2010

AutoCAD und .Net-Framework: Events im AutoCAD

Freitag, 12. März 2010

Im heutigen Post möchte ich die Events vorstellen, die bei der Nutzung von eigenen und von AutoCAD-Befehlen interessant sind.

Für mich als CAD-Manager ist es u.a wichtig bestimmte Befehle im AutoCAD vor und nach Ausführung abzufangen, um weiteres zu unternehmen.

Events können auch dazu genutzt werden, ganze Befehle zu verbieten oder zu blocken.

Ich möchte hier die Vorgehensweise schrittweise erläutern.

Schritt 1:
In der Initialsierungs-Klasse, sie hat das Interface Autodesk.AutoCAD.Runtime.IExtensionApplication geerbt, werden die Events

  • DocumentLockModeChanged: Wenn ein Befehl aufgerufen wird, wird die Zeichnung gesperrt. Dieses Event kann entsprechend abgefangen werden.
  • DocumentCreateStarted: Wird ein Dokument geöffnet oder neu erstellt, wird dieses Event erzeugt. Mit Abfangen dieses Events können Routinen VORM Erstellen des Dokumentes durchlaufen werden.
  • DocumentCreated: Dieses Event wird erzeugt, wenn das Dokument geladen wurde. Mit Abfangen dieses Events können Routinen NACH Erstellen des Dokumentes durchlaufen werden.

der DokumentCollection generiert.

#region Events für die DocumentsCollection
     DocumentCollection dm = AcAp.DocumentManager;
     dm.DocumentCreated +=
        new DocumentCollectionEventHandler(dm_DocumentCreated);
     dm.DocumentCreateStarted +=
        new DocumentCollectionEventHandler
                 (dm_DocumentCreateStarted);
     dm.DocumentLockModeChanged +=
        new DocumentLockModeChangedEventHandler
                 (dm_DocumentLockModeChanged);
   #endregion

Schritt 2:
Im zweiten Schritt wird definiert was vor und nach dem Laden eines Dokuments geschehen soll.
Ich möchte hier die Events des Objektes Document erläutern, die etwas mit Befehlen zu tun haben.

  • CommandEnded: Wird erzeugt nach Beenden eines Befehls.
  • CommandCancelled: Wird erzeugt, wenn der Befehl abgebrochen wurde.
  • CommandWillStart: Wird vor der Ausführung des Befehls erzeugt.
#region DocumentEvents
     hDoc.CommandEnded +=
       new CommandEventHandler(hDoc_CommandEnded);         
     hDoc.CommandCancelled +=
       new CommandEventHandler(hDoc_CommandCancelled);
     hDoc.CommandWillStart +=
       new CommandEventHandler(hDoc_CommandWillStart);
   #endregion

In den einzelnen Eventmethoden, werden die Befehlsnamen abgefragt. Der Befehlsname ist die Eigenschaft GlobalCommandName der Event-Argumente (im Beispiel weiter unten die Variable e). Der Befehlsname ist der englische und wird in einer switch-Anweisung verarbeitet.

Das Dokumenten-Objekt ist der Übergabeparameter sender und muss in das Objekt Document gecastet werden.

Beispiel für das Event CommandEnded

Document hDoc = (Document)sender;      
   switch(e.GlobalCommandName)
   {
     case "COPY":
      //Do what ever you want  
      break;
   }

Hier der vollständige Code für die Initialisierungs-Klasse

using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;

.
.
.

public class clsInitialize :
         Autodesk.AutoCAD.Runtime.IExtensionApplication
{        
 public void Initialize()
 {
   Document hDoc = AcAp.DocumentManager.MdiActiveDocument;
   Database hDb = hDoc.Database;

   #region Events für die akutelle Zeichnung
    hDoc.CommandCancelled +=
      new CommandEventHandler(hDoc_CommandCancelled);
    hDoc.CommandEnded +=
      new CommandEventHandler(hDoc_CommandEnded);  
    hDoc.CommandWillStart +=
      new CommandEventHandler(hDoc_CommandWillStart);
   #endregion
           
   #region DatabaseEvents
     hDb.BeginSave += new DatabaseIOEventHandler(hDb_BeginSave);
   #endregion          
           
   #region Events für die DocumentsCollection
     DocumentCollection dm = AcAp.DocumentManager;
     dm.DocumentCreated +=
        new DocumentCollectionEventHandler(dm_DocumentCreated);
     dm.DocumentCreateStarted +=
        new DocumentCollectionEventHandler
                 (dm_DocumentCreateStarted);
     dm.DocumentLockModeChanged +=
        new DocumentLockModeChangedEventHandler
                 (dm_DocumentLockModeChanged);
   #endregion
 }
       
 public void Terminate()
 {

 }        
       
 void dm_DocumentLockModeChanged
    (object sender, DocumentLockModeChangedEventArgs e)
 {
   DocumentCollection hDocCol = (DocumentCollection)sender;
   switch(e.GlobalCommandName)
   {
      case "":

         break;
   }
 }
       
 void dm_DocumentCreateStarted
      (object sender, DocumentCollectionEventArgs e)
 {

 }

 void dm_DocumentCreated
      (object sender, DocumentCollectionEventArgs e)
 {
   Document hDoc = AcAp.DocumentManager.MdiActiveDocument;
   Database hDb = hDoc.Database;
   #region DocumentEvents
     hDoc.CommandEnded +=
       new CommandEventHandler(hDoc_CommandEnded);         
     hDoc.CommandCancelled +=
       new CommandEventHandler(hDoc_CommandCancelled);
     hDoc.CommandWillStart +=
       new CommandEventHandler(hDoc_CommandWillStart);
   #endregion
           
   #region DatabaseEvents
      hDb.BeginSave += new DatabaseIOEventHandler(hDb_BeginSave);
   #endregion
 }

 void hDb_BeginSave(object sender, DatabaseIOEventArgs e)
 {

 }

 void hDoc_CommandWillStart(object sender, CommandEventArgs e)
 {
   Document hDoc = (Document)sender;        
   switch(e.GlobalCommandName)
   {
     case "":
                   
      break;
   }
 }

 void hDoc_CommandCancelled(object sender, CommandEventArgs e)
 {
   Document hDoc =(Document)sender;        
   switch(e.GlobalCommandName)
   {
      case"":
                   
         break;
   }
 }

 void hDoc_CommandEnded(object sender, CommandEventArgs e)
 {
   Document hDoc =(Document)sender;        
   switch(e.GlobalCommandName)
   {
      case"":
                   
         break;
   }
 }
}

Ein Beispiel zeigt der Artikel von Kean Walmsey Blocking AutoCAD commands from .NET.

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: 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