FastFiber

lisp met variabele oproepen ? [opgelost]

Gestart door delangstevandestraat, ma 18 11 2013, 11:10:05

Vorige topic - Volgende topic

delangstevandestraat

Ik heb een werkende routine om een tekst een bepaald aantal eenheden te laten optellen.  bvb 10 dit zit ingeprogrammeerd in de lisp (laat ons deze "plus" noemen voor het gemak).
Deze lisp wordt opgeroepen met een knopje uit een toolbar, en elk tekstveld wat ik daarna aanklik wordt met 10 verhoogd.

Ik heb nu ook enkele ander routine's die elk een ander getal hebben, bvb 95 en 4500 (ik zeg maar iets)

nu had ik graag één lisp daarvoor gebruikt, en deze dan op laten oproepen door het
klikken op knop "+5" en dan zou "plus 5" opgeroepen worden, elk tekstveld wat ik aanklik wordt met 5 verhoogd
klikken op knop "+13" en dan zou "plus 13" opgeroepen worden, elk tekstveld wat ik aanklik wordt met 13 verhoogd

op deze manier heb ik maar één lisp die moet ingeladen worden, en per getal dat ik wil gerbuiken één knopje in de toolbar...

dit alles om met zo weinig mogelijk klik's te kunnen werken :-)

Alvast bedankt voor hulp.
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

EddyBeerke

Citaat van: delangstevandestraat op ma 18 11 2013, 11:10:05
...
dit alles om met zo weinig mogelijk klik's te kunnen werken :-)
...

Dit willen wij ook... Zo min mogelijk doen. :lachen:

Als je de lisp met ons wil delen kunnen we je verder helpen.
Ik had namelijk in gedachten dan het een functie is die je dan kunt aanroepen.
Als voorbeeld krijg je dan dit in de macro van de knop:
(plus 5)
of
(plus 105)
of
(plus 13)
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

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

delangstevandestraat

haja,
hieronder de werkende lisp, ergens halfweg staat 96 dat is het getal dat ik zou willen invoegen vanuit een knop-commando

; This routine will take the numeric part of en entity
; increment it by 96
; until the user break's
; 08.11.2013

(defun c:plus96
(/ cntr str ch numpart strpart numstr ent oldtext atortxt modtxt txtormtxt el mt selatt )
  (setq cntr 0)
  (while (< cntr 1)
    (setq ent (nentselp "Select source Text: " ))
    (if ent
      (progn ;1
        (setq str (cdr(assoc 1 (entget (car ent ))))) 
        (setq strPart "" numPart "" chkStr str flag T)
          (while(/= chkStr "") ;zolang chkstr niet leeg is doe
            (setq ch(substr chkStr (strlen chkStr))) ;Get the last character in the string
            (if(= flag T)
              (progn ;6
                (if(member ch (list "1" "2" "3" "4" "5" "6" "7" "8" "9" "0"))
                  (setq numPart(strcat ch numPart));als ch=cijfer voeg samen met het numgedeelte
                  (setq flag nil strPart chkStr) ;Else flag false want rest is letters
                );if
              );progn6
            );if flag
            (setq chkStr(substr chkStr 1 (- (strlen chkStr) 1)));laatste letter er af en next while loop
          );while chkstr
        (setq numLen(strlen numPart));bepaal lengte van numgedeelte




        (setq numStr (itoa(+ (atoi numPart) 96))) ;str to int +X-FACTOR en int to str





          (while(< (strlen numStr) numLen);aanvullen met 0-en mochten er minder char zijn dan origineel
            (setq numStr(strcat "0" numStr))
          );while
        (setq str(strcat strPart numStr)) ;voeg alles weer samen
        (setq txtormtxt (cdr(assoc 0 (entget (car ent ))))) 
          (cond                                             ;afvraging
            ((or (= txtormtxt "TEXT")(= txtormtxt "MTEXT")) ;optie 1 is het text of is het mtext
              (progn ;3
                (setq dimormtxt (cdr(assoc 42 (entget (car ent ))))) 
                (if (/= dimormtxt nil)                                       ;if
                  (progn                                                     ;then 4   
                    (setq seldimt (cdr (assoc -1 (entget (car ent )))))
                    (setq strdimedit (substr str 5 (strlen str)))
                    (command "dimedit" "n" strdimedit seldimt "")
                  )                                                          ;progn4
                  (progn                                                     ;else 5
                    (setq el (entget (car ent )))         
                    (setq mt (subst (cons 1 str) (assoc 1 EL) EL))
                    (entmod mt)
                  ) ;progn5
                ) ;if
      ) ;progn3
    ) ;cond or optie1
            ((= txtormtxt "ATTRIB")                         ;optie 2 is het attrib
              (progn ;6
                (setq selatt (cdr (assoc -1 (entget (car ent ))))) ;naam van de geselecteerde entity uithalen
        (command "-attedit" "" "" "" "" selatt "v" "r" str "");om de waarde in te voegen in deze entity
              ) ;progn6
            ) ;cond or optie 2
          (T (princ "\n Invalid Selection... "))
          ) ;cond
        ) ;progn1
        (setq cntr 10) ;else clean exit
      ) ;if ent
    ) ;while cntr<1
(princ)
) ;defun

Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

sschevers

Een input variable in je lisp en je bent er


; This routine will take the numeric part of en entity
; increment it by 96
; until the user break's
; 08.11.2013

(defun plus( number / cntr str ch numpart strpart numstr ent oldtext atortxt modtxt txtormtxt el mt selatt )
  (setq cntr 0)
  (while (< cntr 1)
    (setq ent (nentselp "Select source Text: " ))
    (if ent
      (progn ;1
        (setq str (cdr(assoc 1 (entget (car ent ))))) 
        (setq strPart "" numPart "" chkStr str flag T)
          (while(/= chkStr "") ;zolang chkstr niet leeg is doe
            (setq ch(substr chkStr (strlen chkStr))) ;Get the last character in the string
            (if(= flag T)
              (progn ;6
                (if(member ch (list "1" "2" "3" "4" "5" "6" "7" "8" "9" "0"))
                  (setq numPart(strcat ch numPart));als ch=cijfer voeg samen met het numgedeelte
                  (setq flag nil strPart chkStr) ;Else flag false want rest is letters
                );if
              );progn6
            );if flag
            (setq chkStr(substr chkStr 1 (- (strlen chkStr) 1)));laatste letter er af en next while loop
          );while chkstr
        (setq numLen(strlen numPart));bepaal lengte van numgedeelte




        (setq numStr (itoa(+ (atoi numPart) number))) ;str to int +X-FACTOR en int to str





          (while(< (strlen numStr) numLen);aanvullen met 0-en mochten er minder char zijn dan origineel
            (setq numStr(strcat "0" numStr))
          );while
        (setq str(strcat strPart numStr)) ;voeg alles weer samen
        (setq txtormtxt (cdr(assoc 0 (entget (car ent ))))) 
          (cond                                             ;afvraging
            ((or (= txtormtxt "TEXT")(= txtormtxt "MTEXT")) ;optie 1 is het text of is het mtext
              (progn ;3
                (setq dimormtxt (cdr(assoc 42 (entget (car ent ))))) 
                (if (/= dimormtxt nil)                                       ;if
                  (progn                                                     ;then 4   
                    (setq seldimt (cdr (assoc -1 (entget (car ent )))))
                    (setq strdimedit (substr str 5 (strlen str)))
                    (command "dimedit" "n" strdimedit seldimt "")
                  )                                                          ;progn4
                  (progn                                                     ;else 5
                    (setq el (entget (car ent )))         
                    (setq mt (subst (cons 1 str) (assoc 1 EL) EL))
                    (entmod mt)
                  ) ;progn5
                ) ;if
      ) ;progn3
    ) ;cond or optie1
            ((= txtormtxt "ATTRIB")                         ;optie 2 is het attrib
              (progn ;6
                (setq selatt (cdr (assoc -1 (entget (car ent ))))) ;naam van de geselecteerde entity uithalen
        (command "-attedit" "" "" "" "" selatt "v" "r" str "");om de waarde in te voegen in deze entity
              ) ;progn6
            ) ;cond or optie 2
          (T (princ "\n Invalid Selection... "))
          ) ;cond
        ) ;progn1
        (setq cntr 10) ;else clean exit
      ) ;if ent
    ) ;while cntr<1
(princ)
) ;defun


vervolgens achter je button de aanroep plaatsen die eddy al aangaf en je bent er

(plus 5)


Als je het heel netjes doet dan check je wel even of je input waarde inderdaad een getal is. Heb ik nu niet gedaan.

groeten

stephan

delangstevandestraat

Ja...

Dat dacht ik ook, en had dat ook geprobeerd, maar ik doe waarschijnlijk nog iets fout want het oproepen lukt me niet

"plus 5" krijg ik niet ingetikt want bij de spatie krijg ik al "too few arguments"
(plus 5) geeft me "no function definition : plus"
plus(5) resulteert in "unknown command"

alvast bedankt...
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

EddyBeerke

De code van Stephan werkt bij mij goed.

Heb je de code op de juiste manier geladen?
Sla de code op als .lsp
Sleep deze dan vanuit verkenner naar acad (of laad het op één van de andere manieren)
Type dan (plus 5).

Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

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

delangstevandestraat

JIHA

zegt dat genoeg ?

ik heb de code nog eventjes bekeken en mijn oog viel op een verschil
in mijn "niet werkende lsp" had ik (defun c:plus( number /
in de "wel werkende lsp" staat (defun plus( number /

en dat is de oorzaak...

Nu snap ik alleen niet waarom...?
Ik dacht dat die "C:" er moest staan om de functie te kunnen oproepen vanuit autocad, en heb dat in al mij lsp die ik al heb geschreven ook gedaan, met succes.

Graag wat meer uitleg over het hoe en waarom van die "c:"

Natuurlijk hartstikke bedankt om me naar de oplossing te leiden :-)


Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

delangstevandestraat

#7
WERKENDE CODE MET WAT UITLEG

Omdat ik zelf ook graag begrijp wat er staat en graag leer van een ander, deel ik ook graag mijn kennis.

; Deze routine telt een getal wat meegegeven wordt vanuit autocad op bij elke tekst die geselecteerd wordt
; ideaal om bvb component nummers aan te passen
; de routine is bedoel in combinatie met een aantal knoppen in een toolbar die de verschillende optelwaarden bepalen
; tot er iets anders dan tekst geselecteerd wordt
; 20.11.2013

(defun plus( xfactor / cntr str ch numpart strpart numstr ent oldtext atortxt modtxt txtormtxt el mt selatt )
  (setq cntr 0)                                     ;om clean te kunnen exiten
  (while (< cntr 1)                                 ;eindeloze lus instellen
    (setq ent (nentselp "Select source Text: " ))    ;brontekst mag alles zijn, doch met een numprt op het einde
    (if ent                                          ;als er tekst geselecteerd is
      (progn                                          ;progn1
        (setq str (cdr(assoc 1 (entget (car ent )))))  ;brontekst ophalen
        (setq strPart "" numPart "" chkStr str flag T) ;variabelen initialiseren
          (while(/= chkStr "")                         ;zolang chkstr niet leeg is doe
            (setq ch(substr chkStr (strlen chkStr)))   ;Get the last character in the string
            (if(= flag T)                                   
              (progn                                    ;progn2
                (if(member ch (list "1" "2" "3" "4" "5" "6" "7" "8" "9" "0"))
                  (setq numPart(strcat ch numPart))     ;als ch=cijfer voeg samen met het numgedeelte
                  (setq flag nil strPart chkStr)        ;Else flag false want rest is letters
                )                                       ;end if member
              )                                         ;progn2
            )                                          ;end if flag
            (setq chkStr(substr chkStr 1 (- (strlen chkStr) 1)));laatste letter er af en next while loop
          )                                            ;while chkstr
        (setq numLen(strlen numPart));bepaal lengte van numgedeelte
        (setq numStr (itoa(+ (atoi numPart) xfactor))) ;str to int +xfactor en int to str
          (while(< (strlen numStr) numLen)             ;aanvullen met 0-en mochten er minder char zijn dan origineel
            (setq numStr(strcat "0" numStr))           
          )                                            ;while
        (setq str(strcat strPart numStr))              ;voeg alles weer samen
        (setq txtormtxt (cdr(assoc 0 (entget (car ent ))))) 
          (cond                                            ;afvraging
            ((or (= txtormtxt "TEXT")(= txtormtxt "MTEXT")) ;optie 1 is het text of is het mtext
              (progn                                         ;progn3       
                (setq dimormtxt (cdr(assoc 42 (entget (car ent ))))) 
                (if (/= dimormtxt nil)                                  ;if
                  (progn                                                ;then 4   
                    (setq seldimt (cdr (assoc -1 (entget (car ent )))))
                    (setq strdimedit (substr str 5 (strlen str)))       
                    (command "dimedit" "n" strdimedit seldimt "")       
                  )                                                     ;progn4
                  (progn                                                ;else 5
                    (setq el (entget (car ent )))             
                    (setq mt (subst (cons 1 str) (assoc 1 EL) EL))
                    (entmod mt)                             
                  )                                                     ;progn5
                )                                                       ;if
      )                                              ;progn3
    )                                               ;end cond or optie1
            ((= txtormtxt "ATTRIB")                         ;optie 2 is het attrib
              (progn                                         ;progn6
                (setq selatt (cdr (assoc -1 (entget (car ent )))))      ;naam van de geselecteerde entity uithalen
        (command "-attedit" "" "" "" "" selatt "v" "r" str "")  ;om de waarde in te voegen in deze entity
              )                                              ;progn6
            )                                               ;end cond or optie 2
          (T (princ "\n Invalid Selection... "))            ;user kiest iets anders dan tekst om te exiten
          )                                                 ;cond end
        )                                             ;progn1
        (setq cntr 10)                                ;else clean exit activeren
      )                                              ;end if ent
    )                                               ;while cntr<1
(princ)
) ;defun
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

EddyBeerke

Met de "C:" ervoor zeg je tegen acad dat het een commando is.
Zonder is het een lisp functie.
Als je op commando regel "plus" zou typen dan roep je een commando aan.
Als je op commando regel "(plus 5)" zou typen dan roep je een lisp functie aan.

Hier een stukje uit de Help 2013:
Citeer
About Adding Commands (AutoLISP)
 
Using the C:XXX feature, you can define a command that displays a simple message.
(defun C:HELLO () (princ "Hello world. \n") (princ))

C:HELLO
HELLO is now defined as a command, in addition to being an AutoLISP function. This means you can issue the command from the AutoCAD Command prompt.
Command: hello
Hello world.
This new command can be issued transparently because it does not call the command function itself. At the AutoCAD Command prompt, you could do the following:
Command: line
From point: 'hello
Hello world.
From point:
Remember: to run this function from the VLISP Console window, you need to issue the function call with the parentheses because VLISP does not recognize AutoCAD commands.
(c:hello)

Hello world.
If you follow your function definition with a call to the setfunhelp function, you can associate a Help file and topic with a user-defined command. When help is requested during execution of the user-defined command, the topic specified by setfunhelp displays.
You cannot usually use an AutoLISP statement to respond to prompts from an AutoLISP-implemented command. However, if your AutoLISP routine makes use of the initget function, you can use arbitrary keyboard input with certain functions. This allows an AutoLISP-implemented command to accept an AutoLISP statement as a response. Also, the values returned by a DIESEL expression can perform some evaluation of the current drawing and return these values to AutoLISP. See About Keyword Options (AutoLISP) for more information on using initget.

Citeer
defun (AutoLISP)

Defines a function

(defun sym ([arguments] [/ variables...]) expr...)
Arguments
sym
A symbol naming the function.
arguments
The names of arguments expected by the function.
/ variables
The names of one or more local variables for the function.
The slash preceding the variable names must be separated from the first local name and from the last argument, if any, by at least one space.
expr
Any number of AutoLISP expressions to be evaluated when the function executes.
If you do not declare any arguments or local symbols, you must supply an empty set of parentheses after the function name.
If duplicate argument or symbol names are specified, AutoLISP uses the first occurrence of each name and ignores the following occurrences.
Return Values
The result of the last expression evaluated.
Warning Never use the name of a built-in function or symbol for the sym argument to defun . This overwrites the original definition and makes the built-in function or symbol inaccessible. To get a list of built-in and previously defined functions, use the atoms-family function.
Examples
(defun myfunc (x y) ...)         Function takes two arguments
(defun myfunc (/ a b) ...)       Function has two local variables
(defun myfunc (x / temp) ...)    One argument, one local variable
(defun myfunc () ...)            No arguments or local variables
See Also
The Symbol and Function Handling topic in the AutoLISP Developer's Guide.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

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

delangstevandestraat

Bedankt voor de les,

Ik ben blij dat ik hier terecht kan :-)
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

yoin