Menu

Toon bijdragen

Deze sectie stelt je in staat om alle bijdragen van dit lid te bekijken. Je kunt alleen de bijdragen zien waar je op dit moment toegang toe hebt.

Toon bijdragen Menu

Berichten - delangstevandestraat

#196
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
#197
Autolisp / Re: lisp met variabele oproepen ?
wo 20 11 2013, 08:36:42
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 :-)


#198
Autolisp / Re: lisp met variabele oproepen ?
di 19 11 2013, 08:44:08
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...
#199
Autolisp / Re: lisp met variabele oproepen ?
ma 18 11 2013, 14:00:53
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

#200
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.
#201
ik heb een voorbeeld meegestuurd alsook hetgeen ik al heb kunnen bekomen... (je moet maar enkele kopies maken van het voorbeeld om te simuleren)

Dit werkt... maar niet helemaal, ttz er wordt maar één file goed gedaan dan stopt het kreng en vraag me niet waarom,
ik vermoed dat het iets te maken heeft met het closen van de file, want als ik deze twee regels weglaat dan doet ze wel alles. maar staan alle tekeningen nog open, met een 10-tal kan dit nog maar uiteindelijk moet dit runnen op honderden files. ik vrees dat ze dan zal crashen.

de bedoeling : in de block titelsid wil ik iets wijzigen aan attrib 7000, nl ipv "12&13/" moet er "10...." komen.

aanvaardbaar zou ook zijn dat ik gewoon de volledige waarde van attrib 7000 vervang want er zijn enkele dwg's waar "12&13" anders geschreven staat, (met een - bvb of een extra spatie)

help, (als je wil)
#202
joop, alvast bedankt voor de info, doch het stuk om in 200 dwg iets te doen heb ik al, nu nog het stuk om in een dwg een waarde v/e attribuut v/e block aan te passen.
#203
De titel zegt het eigenlijk al hé,
ik weet hoe ik een lisp script kan maken om 200 dwg's af te drukken in één keer,
want -plot in een functie zonder diabox
echter : find en replace >>> hoe geef ik dit in in lisp ??? want de diabox hiervan krijg ik niet uit...
ter nfo : autocad 2007