CADsite forum

AutoCAD => Autolisp => Topic gestart door: Reimer op za 19 05 2007, 10:44:53

Titel: commando herhalen
Bericht door: Reimer op za 19 05 2007, 10:44:53
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)
)
Titel: Re: commando herhalen
Bericht door: Kenny H op za 19 05 2007, 11:41:39
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
Titel: Re: commando herhalen
Bericht door: Huib op za 19 05 2007, 15:01:34
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)
)

Titel: Re: commando herhalen
Bericht door: Kenny H op za 19 05 2007, 23:31:37
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
Titel: Re: commando herhalen
Bericht door: Reimer op zo 20 05 2007, 14:53:37
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
Titel: Re: commando herhalen
Bericht door: Reimer op ma 21 05 2007, 19:44:42
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
Titel: Re: commando herhalen
Bericht door: Huib op ma 21 05 2007, 21:07:11
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/
Titel: Re: commando herhalen
Bericht door: silverster op do 31 05 2007, 07:46:01
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,