| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Verschachteln von Dialogfenstern (1310 mal gelesen)
|
snafu Mitglied Techniker
Beiträge: 16 Registriert: 06.10.2004
|
erstellt am: 06. Okt. 2004 10:56 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe folgendes Problem: Ich möchte über ein Dialogfeld ein weiteres Dialogfeld aufrufen um von dort verschiedene Blöcke einfügen zu können. Grundsätzlich funktioniert das auch fast. Also das zweite Dialogfeld ist fertig, und funktioniert alleine Problemlos. Wenn ich dieses aber über ein Dialogfeld vorher aufrufen will, geht das neue zwar auf, aber wenn ich dann hier einen Button anklicke wird das dialogfeld nicht beendet, AutoCAD hängt sich auf! Hier ein Ausschnitt aus dem ersten Dialogfeld (aus dem Lisp-Programm zum Dialogfeld): (setq v11 (dimx_tile "s39") v12 (dimy_tile "s39")) (start_image "s39") (slide_image 0 0 v11 v12 "s39") (end_image) (setq v11 (dimx_tile "s40") v12 (dimy_tile "s40")) (start_image "s40") (slide_image 0 0 v11 v12 "s40") (end_image) ;************************************************** (setq v11 (dimx_tile "vert1") v12 (dimy_tile "vert1")) (start_image "vert1") (slide_image 50 0 v11 v12 "vert1") (end_image) (action_tile "s16" "(c:san2)") (action_tile "s17" "(setq B $key)") (action_tile "s18" "(setq B $key)") (action_tile "s22" "(setq B $key)") (action_tile "s6" "(setq B $key)") (action_tile "s5" "(setq B $key)") (action_tile "s68" "(setq B $key)") (action_tile "s64" "(setq B $key)") (action_tile "s10" "(setq B $key)") (action_tile "s15" "(setq B $key)") (action_tile "s21" "(setq B $key)") (action_tile "s9" "(setq B $key)") (action_tile "s39" "(setq B $key)") (action_tile "s40" "(setq B $key)") (action_tile "s1" "(setq B $key)") (action_tile "s20" "(setq B $key)") (action_tile "s62" "(setq B $key)") (action_tile "s2" "(setq B $key)") (action_tile "s69" "(setq B $key )") (action_tile "accept" "(done_dialog)")
(start_dialog) (unload_dialog dcl_id) Bei (action_tile "s16" "(c:san2)") möchte ich nun den Dialog san2 aufrufen, wie schon gesagt funktioniert das auch, aber ich komme dann nicht mehr aus san2 raus, und Programm hängt sich auf! Ich hoffe dass jemand versteht was ich machen möchte. Wäre schön wenn mir jemand helfen könnte! Danke
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 06. Okt. 2004 11:30 <-- editieren / zitieren --> Unities abgeben: Nur für snafu
Hallo Snafu, Herzlich Willkommen auf CAD.DE Wenn jetzt das 2 Dialogfenster nicht funktioniert, warum schickst du dann hier nur das erste? Ich denke dein Problem lässt sich am ehesten lösen, wenn du hier die Dateien zur Verfügung stellst. Es kostet eben doch einiges an Zeit, bis man sich eine Testumgebung aufgebaut hätte. Bei Fragen ... Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
snafu Mitglied Techniker
Beiträge: 16 Registriert: 06.10.2004
|
erstellt am: 06. Okt. 2004 11:43 <-- editieren / zitieren --> Unities abgeben:
Danke erstmal für die Willkommensgrüße, sehr schönes Forum ist das hier! OK, hab die Dateien jetzt mal hochgeladen, ich weis nicht ob das was bringt, denn die ganzen sld`s und blöcke die ich in den Dateien Verwende habt ihr ja nicht. Wäre auch zu viel, die alle hier hochzuladen. Ich hoffe trotzdem dass mir jemand helfen kann. Nochmal in aller kürze was ich vorhabe: erste Dialogbox aufrufen, dort eine Schaltfläche wählen die die entsprechende zweite Dialogbox aufruft, und von der zweiten Dialogbox aus dann über eine der Schaltflächen einen Block einfügen. Danke schon im Vorraus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 06. Okt. 2004 12:00 <-- editieren / zitieren --> Unities abgeben: Nur für snafu
Hallo snafu, habe reingesehen, folgendes: Du hast ein Diafenster geöffnet, öffnest ein 2tes dazu, beendest das 2te und versuchst dann, dass erste ist noch offen, irgendwelche commands abzuschicken. Das geht nicht, so lange noch eines offen ist. Du solltest dir unbedingt jedoch auch mal das Variablenhandling Lokal/Global näher ansehen. Bei dir sind alle global, was im Hinblick auf die dcl_id zu Problemen führen wird! (defun c:NAME (/ lokal_Variablen) (defun NAME (parameter / lokal_Variablen) Du kannst dir auch gerne von meiner Seite mal den Vortrag zum Anwendertreffen in Steyer runterziehen, darin wird dies beschrieben. Bei Fragen ...
Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
snafu Mitglied Techniker
Beiträge: 16 Registriert: 06.10.2004
|
erstellt am: 06. Okt. 2004 12:12 <-- editieren / zitieren --> Unities abgeben:
Danke für die schnelle Antwort!! Genau das scheint mein Problem zu sein, aber ich bekomme es nicht hin. Ich hatte gedacht mit diesem Ausdruck: (action_tile "accept" "(done_dialog)") (start_dialog) (unload_dialog dcl_id) in der ersten lsp wäre das erste Dialogfenster geschlossen? Ist es aber offensichtlich nicht. wenn ich z.B. (start_dialog) raus nehme geht das erste Dialogfenster zwar auf, aber es geht garnichts, lässt sich auch nicht mehr schließen, kann anklicken was ich will, und passiert nix! Wie kann ich das also realisieren? Oder lässt sich das nicht so einfach sagen? Den Vortrag lade ich mir gerade runter, und werde ihn gleich mal lesen.
Vielen Dank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 06. Okt. 2004 12:23 <-- editieren / zitieren --> Unities abgeben: Nur für snafu
Hallo snafu, sorry für meinen Ausdruck, aber was fummelst du denn am (start_dialog) rum? Das hat damit überhaupt nichts zu tun. Wenn der erste Dialog direkt zugehen soll, wenn du etwas gewählt hast, dann ist die Herangehensweise ganz anders. folgendes schreibe ich hier aus dem Hut, ist also ungetestet und somit auch nicht 1:1 zu übernehmen.
Code:
(action_tile "KEY_1" "(done_dialog 2)") (action_tile "KEY_2" "(done_dialog 3)") (action_tile "KEY_3" "(done_dialog 4)") ... (setq ns (start_dialog)) (unload_dialog dcl_id) (cond ((= ns 2) (aufrufdes2tenDialogs) ) ((= ns 3) (aufrufdes3tenDialogs) ) ((= ns 4) (aufrufdes4tenDialogs) )
Hintergrund: Durch den Aufruf des Dialogs mit der Zeile (setq ns (start_dialog)) wird der Variablen ns der Wert zugewiesen, der dem (done_dialog #) mitgegeben wird. Mit diesem Wert kann man dann im Anschluß, wenn also der Dialog bereits beendet ist, unterscheiden, wie der Dialog beendet wurde. Was z.B auch sinnvoll ist, wenn man unterscheiden möchte, ob der Dialog mit [ok] oder [Abbrechen] beendet wurde. Bei Fragen ... Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
snafu Mitglied Techniker
Beiträge: 16 Registriert: 06.10.2004
|
erstellt am: 06. Okt. 2004 14:07 <-- editieren / zitieren --> Unities abgeben:
Hallo Brischke, keine Hemmungen, mit "rummfumeln" kann ich gut leben. Also ich habe jetzt ne weile rumprobiert, und mir ist noch ein bischen was unklar: (action_tile "KEY_1" "(done_dialog 2)") => was bedeutet die "2", ist das der Dialog den ich beenden möchte? Wo rufe ich den neuen Dialog auf? Hier: (aufrufdes2tenDialogs)? Denn an der Stelle wo jetzt (done_dialog 2) steht hatte ich bisher den nächsten Dialog aufgrufen. Ich denke das geht jetzt schon ganz schön weit, ich bin auf jeden fall sehr dankbar dass du mir schonmal bis hier hin geholfen hast, ich verstehs also wenn du jetzt genug haben solltest, du hast bestimmt noch wichtigeres zu tun. Trotzdem hoffe ich natürlich ein bischen dass du mir auch auf die Fragen noch eine Antwort gibst. mfG Snafu Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 06. Okt. 2004 14:20 <-- editieren / zitieren --> Unities abgeben: Nur für snafu
Zitat: Original erstellt von snafu: (action_tile "KEY_1" "(done_dialog 2)") => was bedeutet die "2", ist das der Dialog den ich beenden möchte?
Die 2 ist nicht mit einem Flag zu verwechseln. Das ist einfach nur ein Wert, genau wie die 3 oder 4. Der Dialog ist mit dem (start_dialog) gestartet. Von da an kannst du auch nicht mehr debuggen, da hat ACAD, die Oberhand über die zuvor geladenen (action_tiles ..) Der Dialog wird dann irgendwann über ein (done_dialog #) beendet. Womit, also welcher Button wurde zum beenden gedrückt? Das zu unterscheiden macht die Zahl am (done_dialog #) Wie kommst du nun an die Zahl? Ganz einfach, das (start_dialog gibt genau die Zahl des zum Beenden herangezogenen (done_dialog #) zurück. Deshalb kannst du also, auch wenn das Fenster bereits geschlossen ist, unterscheiden, womit das Dialogfenster beendet wurde. Die Unterscheidung macht man also nach dem Beenden mit der (cond ..) -Anweisung. Zitat: Original erstellt von snafu: Wo rufe ich den neuen Dialog auf? Hier: (aufrufdes2tenDialogs)? Denn an der Stelle wo jetzt (done_dialog 2) steht hatte ich bisher den nächsten Dialog aufgrufen.
Richtig, in der (cond..)-Anweisung wird dann das Programm aufgerufen, welches eigentlich beim Drücken des Buttons gestartet werden hätte sollen. Probier es mal aus, dann wird es klarer! Mir scheint als würdest du nicht debuggen, das heißt den Programmablauf Zeile für Zeile mitverfolgen können. Bekommst du das AutoCAD Magazin? Darin wird gerade die VL-IDE beschrieben. Wenn du's bekommst, dann schau dort mal rein. oder eben [F1] Bei Fragen ... Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
snafu Mitglied Techniker
Beiträge: 16 Registriert: 06.10.2004
|
erstellt am: 06. Okt. 2004 14:52 <-- editieren / zitieren --> Unities abgeben:
OK, ich probier jetzt einfach mal weiter, habs zwar jetzt auf anhieb nicht hinbekommen, bekomme auch keine Fehlermeldung, aber die Zweite Dialogbox geht auch nicht auf, eigentlich passiert jetzt garnichts wenn ich auf die entsprechende Schaltfläche drücke. Aber probieren geht wohl über Studieren. In diesem Sinne danke bis hierhin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 06. Okt. 2004 15:04 <-- editieren / zitieren --> Unities abgeben: Nur für snafu
Hallo snafu, hole dir den Code in den VLisp-Editor, setze mit [F9] einen Haltepunkt in die (cond-Zeile und schau dir dann mal den Wert der Variablen ns im Überwachungsfenster an. Du hast auch (setq ns (start_dialog))stehen? Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
snafu Mitglied Techniker
Beiträge: 16 Registriert: 06.10.2004
|
erstellt am: 06. Okt. 2004 15:47 <-- editieren / zitieren --> Unities abgeben:
Hallo Brischke, du bist der beste, hab den halben Krieg jetzt schon gwonnen, glaube ich. ES FUNKTIONIERT, naja zumindest der einen Schaltfläche bei der ichs getestet habe! Vielen Dank. Jetzt geht zwar im Moment bei allen Scahltflächen der eine Dialog auf, aber da hab ich mich jetzt noch nicht drum gekümmert, aber das bekomme ich sicherlich hin, hab auch schon ne Idee wie es gehen könnte! Ich schreib dann morgen mal ob ichs geschafft habe!! Aber trotzdem BigUp an dieses Forum und Brischke!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
snafu Mitglied Techniker
Beiträge: 16 Registriert: 06.10.2004
|
erstellt am: 07. Okt. 2004 16:39 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe jetzt alles soweit hinbekommen, und zwar so: Code: (action_tile "s16" "(done_dialog 0)") (action_tile "s17" "(done_dialog 1)") ..... (setq ns (start_dialog)) (unload_dialog dcl_id) (cond ((= ns 0) (c:san2) ) ((= ns 1) (c:san3) )) Soweit finktioniert das wunderbar, es git nur einen sagen wir mal Schönheitsfehler, und zwar beim Abbrechen, denn wenn ich den ersten Dialog abbrechen möchte, öffnet sich zuerst noch der zweite Dialog, und dieser muß dann ebenfalls nochmal abgebrochen werden. Wie kann ich das so lösen dass ich nur einmal abbrechen muß? Und wieder einmal vielen Dank im Vorraus Gruß Snafu Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 07. Okt. 2004 16:48 <-- editieren / zitieren --> Unities abgeben: Nur für snafu
|
snafu Mitglied Techniker
Beiträge: 16 Registriert: 06.10.2004
|
erstellt am: 08. Okt. 2004 11:17 <-- editieren / zitieren --> Unities abgeben:
Super, jetzt funktioniert alles so wie ich mir das vorstelle! Dank diesem Forum!! Ich werde euch aufjedenfall weiterempfehlen!! Vielleicht kann ich auch dem ein oder anderen helfen, auch wenn mein wissen nicht so fundiert ist wie das einiger Moderatoren hier! Eine letzte kleine Frage hätte ich alerdings noch: Ich habe gelesen, dass AutoCAD eine Verschachtelung von max 8 Dialogfeldern zulässt, heißt das dass ich so wie in meinem Programm nur acht Felder verschachteln kann? Oder bezieht sich das nur auf das Verschachtel hintereinander (ich meine z.B. in meinem Programm vom zweiten Dialog auf einen weiteren dritten, von da auf einen vierten usw.; was ich ja gernicht brauche). Ich hoffe das ist einigermassen klar ausgedrückt! Vielen Vielen dank an Brischke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 08. Okt. 2004 11:48 <-- editieren / zitieren --> Unities abgeben: Nur für snafu
Hallo snafu, mit diesem Konstrukt sind die Dia-Fenster nicht mehr verschachtelt, sondern es kommt eines nach dem anderen. Somit besteht da keine Gefahr (aus dieser Richtung). ;-) Bei Fragen ... Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|