Eine Anwendung entwickeln

Eine OpenDCL-Applikation besteht aus AutoLISP Quellcode und einem oder mehreren OpenDCL-Projekten. OpenDCL-Projekte werden im OpenDCL Studio erstellt und verändert. OpenDCL Projekte können sowohl als separate *.odcl-Dateien existieren oder im AutoLISP Quellcode integriert sein. Die Einbettung der OppenDCL-Projekte im AutoLISP-Quellcode ist ein erweitertes Thema und wird daher an anderer Stelle erläutert.

OpenDCL nutzt ein ereignisbasiertes Programmmodell, bei dem Nutzereingaben Ereignisse auslösen, in deren Funktionen die Arbeit in der Applikation gesteuert wird. Eine typische OpenDCL-Applikation beinhaltet den Programmablauf zum Laden und Anzeigen des Dialogs sowie die Ereignisfunktionen, die den Dialog steuern, wenn er angezeigt wird. Ereignisfunktionen werden in Folge von Nutzereingaben ausgelöst, z.B. wenn der Anwender auf eine Schaltfläche drückt oder einen Eintrag in einer Liste anklickt.

Der AutoLISP Code, der einen OpenDCL-Dialog anzeigt, muss auch sicherstellen, dass die OpenDCL Laufzeitumgebung geladen ist. Idealerweise nutzen Sie dafür die Demand-Loading-Funktion von AutoCAD, indem Sie den Befehl OPENDCL ausführen. Es ist nicht notwendig zu prüfen, ob die Laufzeitumgebung bereits geladen ist - es ist fast so, als mache der Befehl nichts.

(command "_OPENDCL")

Im nächsten Schritt muss das Projekt geladen werden. Ist das OpenDCL-Projekt in einer *.odcl-Datei gespeichert, kann es mit der Methode (dcl-Project-Load) geladen werden. Haben Sie sich dazu entschieden, die Projektdaten im AutoLISP-Quellcode einzubetten, können Sie das Projekt durch Aufruf der Methode (dcl-Project-Import) laden.

Sobald das Projekt geladen ist, kann der gewünschte Dialog mit der Methode (dcl-Form-Show) auf dem Bildschirm angezeigt werden. Mit der Anzeige des Dialogs auf dem Bildschirm übernehmen die AutoLISP-Ereignisfunktionen die Kontrolle über den Dialog, bis dieser geschlossen wird. Die Initialisierung des Dialogs wird in der Ereignisfunktion OnInitialize vorgenommen. Der folgende Code-Ausschnitt zeigt einen typischen Programmablauf für die Anzeige eines einfachen modalen Dialogs:

(defun c:MyCommand (/ Result c:MyProject/MyForm#OnInitialize MyProject/MyForm/CloseButton#OnClicked)
  (command "_OPENDCL") ; Load OpenDCL Runtime

  (defun c:MyProject/MyForm#OnInitialize (/)
    (dcl-Control-SetCaption MyProject/MyForm/Label1 "Hello World!")
  ); c:MyProject/MyForm#OnInitialize

  (defun c:MyProject/MyForm/CloseButton#OnClicked (/)
    (dcl-Form-Close MyProject/MyForm)
  ); c:MyProject/MyForm/CloseButton#OnClicked


  (if (dcl-Project-Load "MyProject") ; Load project data from MyProject.odcl
    (progn
      (setq Result (dcl-Form-Show MyProject/MyForm))
      ; Note that this code does not execute until *after* the
        dialog is closed!
      (if (= Result 1) (DoSomething))
    ); progn
  ); if
  (princ)
); c:MyCommand

Wie Sie sehen können, ist der Programmablauf zum Anzeigen von Dialogen ist sehr einfach. Die gesamte Arbeit des Initialisierens, Verwaltens und Steuerns von Dialogereignissen wird über separate Ereignisfunktionen realisiert, die zur Laufzeit des Dialogs ausgeführt werden. Der Dialog wird geschlossen, wenn eine der Ereignisfunktionen die Methode (dcl-Form-Close) aufruft. Beachten Sie, dass der Funktion (dcl-Form-Close) optional ein Argument mit dem finalen Dialogstatus mitgegeben werden kann, der als Rückgabewert der Methode (dcl-Form-Show) übergeben wird. Dieser Statuscode kann dazu dienen, dass etwas Bestimmtes passieren soll, sobald der Dialog geschlossen wurde.

Der folgende Code-Ausschnitt zeigt einen typischen Programmablauf für das kurzfristige Ausblenden eines einfachen modalen Dialogs zur Wahl eines Punkts oder Objekts:

(defun c:proj/form#OnInitialize ()
(princ "Hier wird der komplette Dialog mit Inhalt gefüllt.")
); c:proj/form#OnInitialize (defun c:proj/form/pb_accept () (dcl-form-close proj/form 0)
); c:proj/form/pb_accept (defun c:proj/form/pb_select () (dcl-form-close proj/form 1) ); c:proj/form/pb_select (defun c:proj/form/pb_cancel () (dcl-form-close proj/form 2) ); c:proj/form/pb_cancel (setq isSchleife T) (while isSchleife (setq isSchleife nil) ;; um Endlosschleife bei ESC zu vermeiden (setq intErgebnis (dcl-form-show proj/form)) (cond ((= intErgebnis 0) (princ "Hier passiert was.")) ((= intErgebnis 1) (princ "Hier wird ein Objekt oder Punkt gewählt.") (setq isSchleife T)) ((= intErgebnis 2) (princ "Hier passiert nichts.")) ); cond ); while