Daneben ist nicht Enter - grread / Lisp
Geos 06. Sep. 2009, 20:03

Servus

Code:
(defun c:# ()
  (while
    (or (= 5 (setq #tmp (car (grread (setq #obj (entsel "\nObjekte wählen: <Ende> ")) 2 2))))
        (= 3 #tmp)
    );or
    (while (= 3 #tmp)
      (setq #tmp (car (grread (setq #obj (entsel "\nDaneben - nochmal wählen: <Ende> ")))))
    );while
    #obj
  )
)

Obiger Code sollte entweder "#obj" liefern oder nil, falls der User mit rechter MT beendet.
Bei einem Fehlklick mit der (linken) Picktaste soll die Abfrage wiederholt werden.

Das ganze funktioniert auch, allerdings ist bei einem "Fehlschuss" ein weiterer Linksklick notwendig, weil das Programm bei
"Objekte wählen: <Ende>" wartet.

Weiß jemand, wie man (grread) auch ohne diesen zusätzlichen Klick zum weiterlaufen überreden kann?

marc.scherer 07. Sep. 2009, 10:17

Hi Geos,

warum grread?

Ich hab' das in dieser Art gelöst:

Code:

;; Funktion gibt nil zurück, wenn nicht gewählt oder aber
;; mehr als einer gewählt wurde (Implizit)
;; Oder 'STR bei Rechtsklick
;; Oder Ename, wenn Objekt geklickt
(defun IMPLIZIT-ENTSEL (QUESTION / SGET)
  (if (not (setq SGET (ssget "I"))) ;_ Implizite Objektwahl!
    (progn
      (initget " ")
      (if (= (type (setq SGET (entsel (strcat "\n" QUESTION)))) 'STR)
        (setq SGET 'STR)
        (if sget
          (setq SGET (car SGET))
          )
      )
    )
    (progn
      (if (not (> (sslength SGET) 1))
        (setq SGET (ssname SGET 0))
        (setq SGET NIL)
      )
      (sssetfirst NIL NIL)
    )
  )
  SGET
)


(defun C:# (QUESTION / ENAME)
  (while (not ENAME)
    (setq ENAME (IMPLIZIT-ENTSEL QUESTION))
    (cond
      ((not ENAME)
       (setq QUESTION "NICHTS gewählt, neuer Versuch. Rechtsklick beendet die Objektwahl: "
       )
      )
      ((= ENAME 'STR)
       (princ "\nRechtsklick. Objektwahl wurde beendet.")
      )
    )
  )
  (if (not (= ENAME 'STR))
    ENAME
  )
)


Beispielaufruf:

Code:
(setq xx (C:# "Objekt wählen:"))

...

Geos 07. Sep. 2009, 13:12

Hallo Marc

Danke für Deinen Lösungsvorschlag.
Bei (grread) bin ich gelandet, weil ich für die weitere Verarbeitung auch den Pickpunkt - also die Rückgabe von (entsel) brauche/möchte.
Mir schwebt da sowas wie fortlaufendes abrunden/verschneiden vor, aber ohne mehrfach zu verwendende Linien vorher aufbrechen zu müssen.

Dorfy 07. Sep. 2009, 13:53

Hi Ernst,

Zitat:
Original erstellt von Geos:

Obiger Code sollte entweder "#obj" liefern oder nil, falls der User mit rechter MT beendet.
Bei einem Fehlklick mit der (linken) Picktaste soll die Abfrage wiederholt werden.

und wenn du mit mouse-reactor arbeitest!?

marc.scherer 07. Sep. 2009, 13:58

Zitat:
Original erstellt von Geos:
Bei (grread) bin ich gelandet, weil ich für die weitere Verarbeitung auch den Pickpunkt - also die Rückgabe von (entsel) brauche/möchte.

Hi Geos,

aber entsel gibt doch den Punkt bereits zurück!? Warum nimmst Du nicht den entsel Punkt?
Guckst Du hier:

Code:

(defun ## (QUESTION / LST-ENTSEL)
  (while (not LST-ENTSEL)
    (initget " ")
    (if
      (= (type (setq LST-ENTSEL (entsel (strcat "\n" QUESTION))))
'STR
      )
      (setq LST-ENTSEL 'STR)
    )
    (cond
      ((not LST-ENTSEL)
      (setq QUESTION
      "NICHTS gewählt, neuer Versuch. Rechtsklick beendet die Objektwahl: "
      )
      )
      ((= LST-ENTSEL 'STR)
      (princ "\nRechtsklick. Objektwahl wurde beendet.")
      )
    )
  )
  (if (= LST-ENTSEL 'STR)
    (setq LST-ENTSEL NIL)
  )
  LST-ENTSEL
)

Anwendung:

Code:
(setq xx (## "Objekt wählen: "))

...

wronzky 07. Sep. 2009, 16:32

Hallo Ernst,
ich hätt's so ähnlich wie Marc gemacht:

Code:
(defun c:# ( / #obj)
  (while (not #obj)
    (initget "Ende ,_Quit")
    (setq #obj (entsel "\nObjekt wählen: <Ende> "))
  )
  (if (member #obj '("" "Quit")) (setq #obj nil) #obj)
)

Grüsse, Henning

wronzky 07. Sep. 2009, 17:30

Hallo,
eine Weitere Möglichkeit wäre die Auswertung der Sysvar "ERRNO":

Code:
(defun c:## ( / #obj)
  (setvar "errno" 0)
  (while (and (not #obj) (not (= (getvar "errno") 52)))
    (setq #obj (entsel "\nObjekt wählen:"))
  )
  #obj
)
Allerdings kann der User dort NICHT "Ende" eingeben.

Grüsse, Henning

Geos 07. Sep. 2009, 17:38

Hallo

Hatte vorhin nicht soviel Zeit
- daher Marc's ersten Code überflogen
- (ssget "I") entdeckt (mit ssget hatte ich angefangen, bis ich drauf gekommen bin, dass ich ja den PPunkt brauche)
- Hirn hat "Punkt fehlt" gesendet
- Code ins ACAD kopiert und ausprobiert
- hat ename geliefert
- Anwort geschrieben

Jetzt hab ich genauer geschaut und festgestellt, dass ich offensichtlich nicht alle Möglichkeiten von initget kenne.

Was ich nicht durchschaue:

Code:
(setq xxx (entsel))
liefert sowohl bei Enter als auch bei einem Klick ins Leere nil,
und
Code:
(type nil)
ergibt auch nil ,
wie wird xxx also zu einem String oder kriegt "" bzw. "Quit" zugewiesen?

Geos 07. Sep. 2009, 17:57

Schon wieder eine Antwort ...

Servus Henning

Das Beenden mit der rechten MT reicht völlig.
Wo gibts denn die Fehlercodes für errno?
Wieder was gelernt!

wronzky 07. Sep. 2009, 17:58

Hallo Ernst,

Zitat:
wie wird xxx also zu einem String oder kriegt "" bzw. "Quit" zugewiesen?
über initget (F1!)
(initget " ");Leerzeichen=Optionstrenner
oder
(initget ","); Komma=Abkürzungstrenner
geben einen Leerstring zurück bei Enter oder RMT

Grüsse, Henning

wronzky 07. Sep. 2009, 18:00

Zitat:
Wo gibts denn die Fehlercodes für errno?

in Vlisp unter F1 > AutoLISP Developer's Guide > Appendixes >  AutoLISP Error Codes >

Grüsse, Henning

Geos 07. Sep. 2009, 18:21

Danke Henning

Meine F1 redet nur Englisch mit mir, deshalb nehme ich meistens mein altes "Handbuch für Benutzeranpassungen" aus ACAD 13 her.
Dort hab ich jetzt auch die Fehlercodes gefunden nicht aber Leerzeichen=Optionstrenner oder Komma=Abkürzungstrenner bei initget (gabs vielleicht damals noch nicht).
Muss mich wohl öfter durch die englische Hilfe quälen.

fuchsi 29. Sep. 2009, 13:35

siehe meine Antwort in diesem Thread
http://ww3.cad.de/foren/ubb/Forum145/HTML/000263.shtml

Geos 30. Sep. 2009, 15:03

Hallo Anton

- wäre auch eine Möglichkeit, allerdings signalisiert das Fadenkreuz eine Punktwahl.
- würde auf den "Objektwahlcursor" (Pickbox, Kasterl) nur ungern verzichten ...

Trotzdem danke