FastFiber

commando herhalen

Gestart door Reimer, za 19 05 2007, 10:44:53

Vorige topic - Volgende topic

Reimer

Beste cadkenners,

ik heb onderstaad lispje gemaakt om uitleggers op een lijn te tekenen. Het gaat erom dat ik een afstand opgeef t.o.v. 0,0 (bijvoorbeeld 5.6) en dat er vervolgens een lijntje wordt gezet op 0,5.6 (met een lengte van 1). Dit werkt allemaal naar wens.
Nu moet ik voor ieder lijntje mijn lisp opnieuw starten. Kan ik de lisp ook zo maken dat deze zichzelf steeds herhaalt tot ik geen waarde meer opgeef (enter dus)?

Groeten,
Reimer

(defun c:Uitl ()
(setq afst (getdist "Geef de uitlegger afstand:    "))
(setq locatie (list 0 afst))
(command "pline" locatie "@1,0" "")
(princ)
)

Kenny H

Zoiets?

Ik gebruik dit om automatisch te nummeren.
Normaal gezien zou jij enkel (c:Uitl) moeten toevoegen onderaan.  :wink:
Om het te laten stoppen ook een if gebruiken, zoals in mijn voorbeeld men coordinaat ingevuld moet zijn.

Citeer(defun c:afschot ()
  (setq aafschot 1)
  (afschot)
)

(defun afschot (/ coafschot)
  (setvar "cmdecho" 0)
  (setq   olderr   *error*
   *error*   TekstErr
  )
  (setq   coafschot
    (getpoint "\nInsertiepunt:")
  )
  (if (/= coafschot nil)
    (progn
      (command "text" coafschot "0" aafschot)
      (setq aafschot (+ aafschot 1))
      (afschot)
    )
  )
  (princ)
)

Mvg

Kenny
8) Volvo 4 Life 8)

Huib

Is het wel een goed idee om een functie zichzelf te laten aanroepen? Er wordt dan feitelijk elke keer een copie van de functie gestart, en alle waardes
van alle versies worden door de computer onthouden totdat je helemaal uit de functie stapt.
Ik zou het liever met een while-lusje doen:

(defun c:Uitl ()
(setvar "cmdecho" 0)
(setq cont T )
(while cont
  (progn
  (initget 2)
  (if (not (setq afst (getdist "Geef de uitlegger afstand:    ")))
  (setq cont F)
  (progn
       (setq locatie (list 0 afst))
       (command "pline" locatie "@1,0" "")
   )
  ))
)
(princ)
)


Kenny H

#3
Natuurlijk kan je dit zo gebuiken.
Ik had op die while functie nog niet eens gedacht.  :oops:

Ik gebruik mijn subcommando als ik daarna wil verder nummeren.
Als ik bv al een deel heb genummerd en later direct wil verder gaan, zonder eerst nog uit te zoeken wat men laatste getal was, snap je?

Maar wat je zegt kan perfect Reimer
8) Volvo 4 Life 8)

Reimer

Bedankt Huib,

dit werkt perfect, bedankt. Ik snap echter nog niet voldoende van lisp om te volgen wat hier precies gebeurd. Kan iemand voor mij achter elke stap schrijven wat deze doet? Zo kan ik mij gaan verdiepen in de wereld van lisp.

Reimer

Reimer

Kan iemand mij misschien vooruit helpen met een paar van deze commando's? Ik snap nog niet precies hoe ik while en if moet gebruiken.

Reimer

Huib

#6
Algemene vorm WHILE.
(while (test)
         (expressie)
)
Zolang (test) "waar" is, wordt expressie uitgevoerd, en wordt de lus opnieuw doorlopen, totdat test "onwaar" oplevert.

Algemene vorm IF.
(If (test) (dan_expressie) (anders_expressie))
Als (test) waar is, wordt de (dan_expressie) uitgevoerd, is (test) "onwaar" de (anders_expressie).
De (anders_expressie) mag eventueel worden weggelaten.

Zowel (dan_expressie) als de (anders_expressie) bestaan maar uit één regel.
Moeten er meer komen dan moeten ze worden samengevat met
(progn ........
           ........
)

[edit]
Handig functie overzicht:
http://www.hyperpics.com/customization/autolisp/autolisp_functions/

silverster

volgens mij kan het ook anders en dan zonder lisp,
je zou van je lijnte van 1 een block kunnen maken, en dan met het insertionpoint in het midden.
nu pak je de lijn, waarover die liggers moeten komen, en door middel van het commando measure, kan je ook een tussenafstand opgeven, en je moet je blockname invullen, en dan krijg je volgens mij hetzelfde resultaat,

je moet wel even stoeien met die commando totdat je het doorheb,

FastFiber