FastFiber

Meervoudige keuze menu

Gestart door Atwist, ma 23 05 2011, 10:47:34

Vorige topic - Volgende topic

Atwist

Hallo forumleden,

Ik heb een meervoudige keuzemenu gemaakt, maar deze doet niet wat ik wil.
In de DCL staan "toggles" zodat ik deze kan aan vinken, als ik de lisp laat draaien dan kan ik maar 1 keuze maken en deze wordt gelijk uitgevoerd.
Maar ik wil graag dat ik meer kan aan vinken en dan op de knop uitvoer drukken en dan pas de keuzes uitvoeren.
Heeft iemand een ideen hoe dit moet??
Heb al op http://web2.airmail.net/terrycad/Tutorials/MyDialogs.htm gekeken maar daar kom ik niet verder, altands ik zie het niet.


 (action_tile "puD" "(do_act $key)")
 (action_tile "puB" "(do_act $key)")
 (action_tile "puLA" "(do_act $key)")
 (action_tile "puLT" "(do_act $key)")
 (action_tile "puMA" "(do_act $key)")
 (action_tile "puSH" "(do_act $key)")
 (action_tile "puST" "(do_act $key)")
 (action_tile "puM" "(do_act $key)")
 (action_tile "puT" "(do_act $key)")
 (action_tile "puV" "(do_act $key)")
 (action_tile "puR" "(do_act $key)")
 (action_tile "puPL" "(do_act $key)")
 (action_tile "puall" "(do_act $key)")
 (action_tile "puUIT" "(do_act $key)")
 (action_tile "cancel" "(do_act $key)")
 
 (start_dialog)
 (cond
  ((= op "puD")
   (command "-purge" "D" "*" "N" ""))
  ((= op "puB")
   (command "-purge" "B" "*" "N" ""))
  ((= op "puLA")
   (command "-purge" "LA" "*" "N" ""))
  ((= op "puLT")
   (command "-purge" "LT" "*" "N" ""))
  ((= op "puMA")
   (command "-purge" "MA" "*" "N" ""))
  ((= op "puSH")
   (command "-purge" "SH" "*" "N" ""))
  ((= op "puST")
   (command "-purge" "ST" "*" "N" ""))
  ((= op "puM")
   (command "-purge" "M" "*" "N" ""))
  ((= op "puT")
   (command "-purge" "T" "*" "N" ""))
  ((= op "puV")
   (command "-purge" "V" "*" "N" ""))
  ((= op "puR")
   (command "-purge" "R" "*" "N" ""))
  ((= op "puPL")
   (command "-purge" "PL" "*" "N" ""))
  ((= op "puall")
   (command "-purge" "ALL" "*" "N" ""))
 )
)
(prin1)
Atwist

AutoCad 2008.

roy_043

Atwist: het is eigenlijk heel simpel:
Er is maar 1 variabele op.
Elke keer als je iets aanvinkt krijgt deze een nieuwe waarde en gaat de oude waarde verloren.
Je kunt geen commando's uitvoeren terwijl een DCL dialoog actief is.

Je zult het programma dus anders moeten opbouw. Het handigste is om van de op variabele een lijst te maken. M.b.v. (cons) kun je deze vullen en als de dialog afgesloten is kun je met (member) de lijst analyseren en de gewenste acties uitvoeren.

PJ

Je kan voor elke action key een variable maken die je aan/uit  'toggelt' vyia een functie. En je voegt een OK of RUN knop toe die dan je functie start aan de hand van je ingestelde variabelen.
first AutoCAD  = version 2.5 (1986), DOS, on a 80286 pc

roy_043

Atwist je zult ook gebruik moeten maken van $value naast $key.

Atwist

Roy & PJ,

Ik ben eens bezig geweest met onderstaande maar ik krijg het niet voor elkaar dat de lisp een opdracht uitvoerd,
Lisp en DCL werken wel goed
(defun c:tog (/   Dcl_Id%     Toggle1$   Toggle2$
      Toggle3$   Toggle4$    Toggle5$   Return#
     )
  (princ "\nAndre is aan het testen")
  (princ)
; Set Default Variables
  (if (not *MyToggles@) ;Unique global variable name to store dialog info
    (setq *MyToggles@ (list nil "0" "0" "0" "0" "0"))
  ) ;if
  (setq Toggle1$ (nth 1 *MyToggles@)
Toggle2$ (nth 2 *MyToggles@)
Toggle3$ (nth 3 *MyToggles@)
Toggle4$ (nth 4 *MyToggles@)
Toggle5$ (nth 5 *MyToggles@)
  ) ;setq
; Load Dialog
  (setq Dcl_Id% (load_dialog "Mytoggles.dcl"))
  (new_dialog "MyToggles" Dcl_Id%)
; Set Dialog Initial Settings
  (set_tile "Title" " My Toggles")
  (set_tile "Toggle1" Toggle1$)
  (set_tile "Toggle2" Toggle2$)
  (set_tile "Toggle3" Toggle3$)
  (set_tile "Toggle4" Toggle4$)
  (set_tile "Toggle5" Toggle5$)
; Dialog Actions
  (action_tile "Toggle1" "(setq Toggle1$ $value)")
  (action_tile "Toggle2" "(setq Toggle2$ $value)")
  (action_tile "Toggle3" "(setq Toggle3$ $value)")
  (action_tile "Toggle4" "(setq Toggle4$ $value)")
  (action_tile "Toggle5" "(setq Toggle5$ $value)")
  (setq Return# (start_dialog))
; Unload Dialog
  (unload_dialog Dcl_Id%)
  (cond
    ((= op "toggle1")
     (load "start")
     (c:tsm)
    )
    (setq
     *MyToggles@
     (list nil Toggle1$ Toggle2$ Toggle3$ Toggle4$ Toggle5$)
    )
    (princ)
  ) ;defun c:tog
)


Hebben jullie nog een tip
Atwist

AutoCad 2008.

roy_043

Atwist je gooit dingen door elkaar. De variabele op wordt nu nergens ingesteld.

Probeer dit:

  (cond
    ((= op "toggle1")
     (load "start")
     (c:tsm)
    )
    (setq
     *MyToggles@
     (list nil Toggle1$ Toggle2$ Toggle3$ Toggle4$ Toggle5$)
    )
    (princ)
  )


Te vervangen door:

(if (= Toggle1$ "1")
  (progn
    (load "start")
    (c:tsm)
  )
)
(setq *MyToggles@ (list nil Toggle1$ Toggle2$ Toggle3$ Toggle4$ Toggle5$))
(princ)

Atwist

Roy,

Dank je wel het werkt, nu ga dit in mijn eigen lisp inbouwen.
Dit moet volgens mijn nu wel lukken.

:vreegoe:
Atwist

AutoCad 2008.

Atwist

Ben nu druk bezig om de eerdere code in te bouwen maar het wil mij niet lukken.
Krijg steeds fout meldingen te veel haakjes dan weer te weinig  en dan weer te veel argumenten.
Ik ben het spoor kwijt.
(defun c:tsm (/ id op puD§ puB§ puLA§)
  (defun do_act (key_pr)
    (setq op key_pr)
    (setq dlg_pt (done_dialog))
  )
  (setq id (load_dialog "start"))
  (if (< id 0)
    (exit)
  )
  (if (not dlg_pt)
    (setq dlg_pt (list -1 -1)
    )
    (if (not *start@)
      (setq *start@
     (list nil "0" "0" "0")
  )
  (setq puD$ (nth 1 *start@)
puB$ (nth 2 *start@)
puLA$ (nth 3 *start@)
  )
  (set_tile "puD" puD$)
  (set_tile "puB" puB$)
  (set_tile "puLA" puLA$)
 

      (if (not (new_dialog "start" id "" dlg_pt))
(exit)
)
(action_tile "puD" "(setq puD$ $value)")
(action_tile "puB" "(setq puD$ $value)")
(action_tile "puLA" "(setq puD$ $value)")

)
(action_tile "retab" "(do_act $key)")
(action_tile "filedia" "(do_act $key)")
(action_tile "steal" "(do_act $key)")
(action_tile "tekst" "(do_act $key)")


Wie heeft er een tip voor mij
Atwist

AutoCad 2008.

PJ

Dit is even moeilijk te testen zonder de DCL, als je me je lsp en dcl even stuurt (of hier plaatst) kijk ik er wo naar.
De code in je post lijkt te zijn afgebroken.
Een goede tip : zoek notepad++ op internet, dat heeft een goede teksteditor die mooi je tekst tussen open en gesloten haakje toont en laat ook toe een enkele tekst in 2 verschillende vensters te editeren.

mail = pj@digitalplantservices.net
first AutoCAD  = version 2.5 (1986), DOS, on a 80286 pc

Atwist

PJ,

Hierbij de lisp en DCL
Atwist

AutoCad 2008.

EddyBeerke

Voor het teveel aan haakjes:
Dit kun je in de lispeditor van acad (commando: vlide) makkelijk controleren.
Ga neer het begin van de code bij "(defun... " en zet de cursor voor het "(" gebruik dan de toetsencomb. "Ctrl+]" om te zoeken naar het sluitende ")", dus voor naar rechts.
Voor linksom te zoeken gebruik je "Ctrl+["
En dan heb je nog de "Check editor window"-knop, in de toolbar/menu "Tools",  om de code op dergelijke fouten te controleren.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

Atwist

Eddy

Dankje voor de tip  :vreegoe: :vreegoe:
Ik heb het werkend :D

Met Notepad++ (tip van PJ) had ik al een paar fouten eruit gehaald, met check edit window kon ik de laatste 2 er uit halen.

Mijn dank
Atwist

AutoCad 2008.

Atwist

Heb er nu nog een fout in zitten

De lisp houd de vorige instelling van de toggle vast hoe zou ik dit kunnen wijzigen??
Atwist

AutoCad 2008.

roy_043

Citaat van: Atwist op wo 25 05 2011, 09:08:12
Heb er nu nog een fout in zitten

De lisp houd de vorige instelling van de toggle vast hoe zou ik dit kunnen wijzigen??
Atwist, dit is een erg vreemde vraag. Een flink deel van jouw code is er juist op gericht om deze instellingen te onthouden!

Atwist

Roy,

Ik geloof je graag, maar mijn kennis van programmeren is nog zeer gering.
Het is de bedoeling dat de toggles weer "gereset" worden, nu gaat de lisp telkens purgen als ik afsluit.

Atwist

AutoCad 2008.