Kartei-Kästen

Started by Arcuso, February 15, 2010, 06:37:50 AM

Previous topic - Next topic

Arcuso

Späten Dank für die Infos, Fred !

Da es schließlich auf's Befinden des Anwenders ankommt, hat sich für unseren Bedarf der Einsatz von Paletten als weniger praktisch herauskristallisiert. Durch die Möglichkeit nicht-modale Dialoge zu minimieren, erscheinen die Kartei-Kästen flexibler. Mir fallen in diesem Zusammenhang ein paar Fragen/Anregungen ein:

1.)
Als 3.Zustand von andockbaren Dialogen, sollte es zum schwebenden Modus eben auch den minimierten geben, bei dem er sich automatisch in die Statusleiste von AutoCAD an einer freien Stelle eingliedert. Ohne Klick sollte dabei das Skalieren und Positionieren beim Umschalten der Zustände auch mit Lisp möglich sein.

2.)
Wenn man einen Dialog mit den benötigten Steuerelementen samt zugehörigen Funktionen erstellt hat, wäre es praktisch, ihn so wie er ist (quasi als neutral lauffähiges Mudul mit zugehörigen Lisp-Funktionen, nur einmal vorhanden und daher leicht zu warten), jeweils in einen anderen modalen, nicht-modalen Dialog oder in eine Karteikarte mit einem einfachen Verweis einblenden zu können. Wegen der Objekt-Instanzen und deren Namens-Kaskaden würde das aber wahrscheinlich das ganze Konzept von OpenDLC über den Haufen schmeißen.

3.)
Manchmal möchte man in einem Dialog mit mehreren Eingabe-Feldern, Listen, etc. durch einen Vor-/Zurück-Mechanismus ganze Daten-Sätze und Dialog-Zustände restaurieren. Das kann man zwar jetzt durch Auswerten der Eigenschaften aller Elemente und Speichern in einer Assoziatons-Liste.
Ein Hindernis ist aber dabei z.B. so eine Funktion wie dcl_Control_GetPos, die eine Daten-Liste retourniert, das Pendant dcl_Control_SetPos jedoch 4 Einzel-Argumente erwartet.
Praktisch wäre es, wenn man quasi in einer Moment-Aufnahme des aktuellen Dialoges den ganzen Dump in einer Liste speichern und ihn genauso mit einer Funktion wieder restaurieren könnte.

Fred Tomke

Hallo, vielen Dank für die Rückmeldung.

Quote from: Arcuso on February 15, 2010, 06:37:50 AM
Da es schließlich auf's Befinden des Anwenders ankommt, hat sich für unseren Bedarf der Einsatz von Paletten als weniger praktisch herauskristallisiert.

Kann ich so nicht unbedingt unterstreichen. Ich bin gerade dabei, eine ganze Reihe andockbarer Dialoge und nicht-modaler Dialoge in Paletten zu wandeln. Für das derzeit noch bestehende Manko der nicht steuerbaren Positionierung und Dockingzustände und des Automatisch-Ausblenden-Zustandes will ich kurzfristig Abhilfe schaffen lassen, da Lösungsvorschläge bereits extistieren.

Quote from: Arcuso on February 15, 2010, 06:37:50 AM
Als 3.Zustand von andockbaren Dialogen, sollte es zum schwebenden Modus eben auch den minimierten geben, bei dem er sich automatisch in die Statusleiste von AutoCAD an einer freien Stelle eingliedert. Ohne Klick sollte dabei das Skalieren und Positionieren beim Umschalten der Zustände auch mit Lisp möglich sein.

Hast Du dafür mal ein Beispiel eines AutoCAD/Map/Civil-Befehls, bei dem ich mir das anschauen kann? Ich kann mir das grad nicht vorstellen. Insbesondere der letzte Satz ist mir fremd  :-\

Quote from: Arcuso on February 15, 2010, 06:37:50 AM
jeweils in einen anderen modalen, nicht-modalen Dialog oder in eine Karteikarte mit einem einfachen Verweis einblenden zu können.

That's right. Dialog-Vererbungen und -instanzen sind derzeit nicht möglich. Da diese Frage aber bereits mehrfach aufgetaucht ist, bitte ich Dich dies im New feature tracker einzutragen.

Quote from: Arcuso on February 15, 2010, 06:37:50 AM
Ein Hindernis ist aber dabei z.B. so eine Funktion wie dcl_Control_GetPos, die eine Daten-Liste retourniert, das Pendant dcl_Control_SetPos jedoch 4 Einzel-Argumente erwartet.

Versuchs doch mal mit Lisp  ;)

Code (autolisp) Select
(setq lstPos (dcl_control_getpos MyProj_MyForm_MyControl))
(apply 'dcl_control_setpos (cons MyProj_MyForm_MyControl lstPos))


Quote from: Arcuso on February 15, 2010, 06:37:50 AM
Praktisch wäre es, wenn man quasi in einer Moment-Aufnahme des aktuellen Dialoges den ganzen Dump in einer Liste speichern und ihn genauso mit einer Funktion wieder restaurieren könnte.

Ich weiß nicht, ob es das trifft, aber versuch mal folgendes:

Code (autolisp) Select

(dcl_Form_Hide signothek_sc_signothek T)
;; jetzt passiert was
(dcl_Form_Hide signothek_sc_signothek nil)


VG, Fred
Fred Tomke
Dipl.-Ing. (FH) Landespflege

[ landscaper - landscape developer - digital landscape and urban design]

Arcuso

Quote from: Fred Tomke on February 16, 2010, 12:01:25 AM

Hast Du dafür mal ein Beispiel eines AutoCAD/Map/Civil-Befehls, bei dem ich mir das anschauen kann? Ich kann mir das grad nicht vorstellen. Insbesondere der letzte Satz ist mir fremd  :-\


Beispiel hab ich keines, gemeint habe ich folgendes:
Wenn nun der minimierte Dialog passiv in der Statusleiste ruht, würde ich ihn gern aus irgendeiner Lisp-Anwendung heraus in den geöffneten Zustand (schwebend oder gedockt) schalten, ohne mit der Maus auf den dafür vorgesehenen Button klicken zu müssen. Nach Gebrauch soll die Anwendung den Dialog wieder minimiert in die Status-Leiste zurück schicken können. Im Prinzip wäre das eine 3.Option zu 'dcl_Form_Hide', soll lediglich den Bedarf von Funktionen zum Skalieren/Positionieren erübrigen und vorallem die korrekte Eingliederung in AutoCAD's Statusleiste übernehmen (es könnten dann dort ja auch mehrere minimierte Dialoge abgelegt werden).

Quote from: Fred Tomke on February 16, 2010, 12:01:25 AM

Versuch's doch mal mit Lisp:
(setq lstPos (dcl_control_getpos MyProj_MyForm_MyControl))
(apply 'dcl_control_setpos (cons MyProj_MyForm_MyControl lstPos))


Das hab ich ohnehin auch so gelöst. Um aber alle aktuellen Eigenschaften von allen aktuellen Steuer-Elementen abzuspeichern, müsste man die Werte explizit einzeln abfragen und sie in einer Assoziazions-Liste zusammenfassen, die wiederum Bestandteil einer übergeordneten Liste ist. Jetzt könnte man mit einem Vor- und Zurück-Button von einem zum nächsten Datensatz blättern und den gespeicherten Zustand wieder restaurieren. Weil ja nicht nur Inhalte von Daten-Feldern, sondern auch Eigenschaften der Steuer-Elemente (Farbe, Textstil, etc.) relevant sein können, entsteht das Bedürfnis, alle Dialog-Daten als Paket von einer implementierten Funktion sammeln bzw. wieder herstellen zu lassen.

Vorläufig vielen Dank für deine Hilfe!

arcuso


Fred Tomke

Quote from: Arcuso on February 19, 2010, 01:12:06 AM
Nach Gebrauch soll die Anwendung den Dialog wieder minimiert in die Status-Leiste zurück schicken können. Im Prinzip wäre das eine 3.Option zu 'dcl_Form_Hide', soll lediglich den Bedarf von Funktionen zum Skalieren/Positionieren erübrigen und vorallem die korrekte Eingliederung in AutoCAD's Statusleiste übernehmen (es könnten dann dort ja auch mehrere minimierte Dialoge abgelegt werden).

Da kann ich Dir nur raten, bei den OpenDCL-Samples nach dem FormMover-Beispiel zu fahnden.
Damit kann man genau das erreichen. Prinzipiell wirst Du das wohl per Hand nachbauen müssen.
Aber grundsätzlich machbar wäre es mit den verfügbaren OpenDCL-Boardmitteln.

Quote from: Arcuso on February 19, 2010, 01:12:06 AM
Um aber alle aktuellen Eigenschaften von allen aktuellen Steuer-Elementen abzuspeichern, müsste man die Werte explizit einzeln abfragen und sie in einer Assoziazions-Liste zusammenfassen, die wiederum Bestandteil einer übergeordneten Liste ist.

Ich bin mir noch nicht sicher, ob ich verstanden habe, WANN es konkret erforderlich wird, alle Steuerelementeigenschaften wiederherzustellen:
1. Willst Du nicht-modale Dialoge zwischenzeitlich ausblenden, würde ich die dcl_form_hide methode verwenden und so bleiben alle Einstellungen für die aktuelle AutoCAD-Sitzung beibehalten, solange Du sie nicht änderst.
2. Willst Du Dialoge generell schließen und sie sollen beim erneuten Ãâ€"ffnen immer noch genauso gefüllt sein, wie im Augeblick des Schließens, sollte es eigentlich nur nötig sein, Inhalte komplexer Steuerelemente (Baum, ListView, Grid) zu speichern und beim Ãâ€"ffnen wieder zuzuweisen. Alle geometrischen Eigenschaften (z.B. mit SetPos geändert) bleiben für die komplette AutoCAD-Sitzung erhalten auch über das Schließen und wieder Ãâ€"ffnen hinaus, solange Du sie nicht änderst.
3. Ich lese aber was vom Springen zwischen den Datensätzen und vermute daher, dass GetPos nur ein Beispiel für einen Rückgabewert war. Ich persönlich baue Inhalte von Steuerelementen beim Springen zwischen Datensätzen immer explizit auf und speichere sie nicht. Denn wer sagt mir, ob in einer MultiUser-Umgebung nich bereits jemand einen Datensatz geändert hat...
4. Aber es gibt vielleicht eine andere Variante, die man in Betracht ziehen sollte: Alle Eigenschaften speichern und danach wieder zuweisen.
Ich habe das mal ausprobiert. Vielleicht hilft das zumindest vom Ansatz her. Bitte beachte, dass GetPos die Summe der Eigenschaften Width, Height, Top und Left sind, die neben der Methode GetPos/SetPos über die Eigenschaften aus einzeln abfragbar und zuweisbar sind.

Code (autolisp) Select

(defun get_dump (oForm)
  (mapcar '(lambda (oControl) (cons oControl (mapcar '(lambda (strProp) (cons strProp (dcl_Control_GetProperty oControl strProp)))
     (vl-remove-if '(lambda (x) (= (substr x 1 1) "(")) (dcl_control_getproperties oControl)))))
  (cons oForm (dcl_Form_GetControls oForm)))
); get_dump

(defun set_dump (lstProps)
  (mapcar '(lambda (lstControl / oControl)
     (setq oControl (car lstControl))
     (mapcar '(lambda (lstProp)
(dcl_control_setproperty oControl (car lstProp) (cdr lstProp))
      ); lambda
     (cdr lstControl))
   ); lambda
  lstProps)
); set_dump

(setq lstDump (get_dump MyProj_MyForm))
(set_dump lstDump)


VG, Fred
Fred Tomke
Dipl.-Ing. (FH) Landespflege

[ landscaper - landscape developer - digital landscape and urban design]