Beste,
In onderstaand stukje lisp wordt het commando copy herhaald.
Helaas sluit hij hem niet goed af waardoor de OSNAP settings niet worden teruggezet. Wat doe ik fout? :?
Groet,
Adrianus.
(defun c:k()
(setvar "cmdecho" 0)
(setq antw "")
(while (= antw "")
(command
"copy" "l" "" "@" pause
) ;Afsluiten command
(setq antw "")
) ;Afsluiten while
(princ)
(command "OSNAP" "INT,PER")
) ;Afsluiten k.lsp
Wat is precies het doel van de routine? Het laatste object van het vorige copy commando wordt gekopieerd. Je kunt dan net zo goed het eerste object meerdere keren kopiëren.
Het instellen van de objectsnap valt buiten het copy commando. Waar is dit voor bedoeld?
Groeten,
Reimer
Goedenavond Reimer,
Het doel van deze routine is om een beetje meer thuis te raken in het LISP verhaal aangezien ik er nog niet zo
bekend mee ben. Het leek me dus verstandig om maar eenvoudig te beginnen. Het is dus niet dat ik deze routine persé nodig heb. Het gaat mij dus meer om het begrip LISP.
Groet,
Adrianus
Er kloppen een aantal dingen niet in de routine. Omdat je geen specifiek doel hebt kan ik niet veel zeggen over het copy commando. Deze zorgt er echter voor dat de routine niet goed wordt afgerond en dat de objectsnap aan het einde niet wordt ingesteld op de opgegeven waarden. Het is ook wel wat vreemd om voor het afsluiten van de routine de objectsnap op een bepaalde waarde in te willen stellen.
In het begin zet je CMDECHO op 0. Dat is prima, maar aan het einde zet je deze niet terug op de oorspronkelijke waarde. Daarvoor moet je voordat je begint vastleggen wat de waarde van CMDECHO is voordat je deze op 0 zet. Gebruik (setq OLDECHO (getvar "cmdecho")). Aan het einde van je routine zet je dan weer (setvar "cmdecho" OLDECHO).
Hetzelfde doe je met de objectsnap, wanneer je deze in je routine op een specifieke waarde wilt hebben.
Met een beetje zoeken op internet vindt je erg veel uitleg over LISP-routines. Wat ook goed helpt is om bestaande routines uit te pluizen. Hierdoor leer je de structuur beter kennen.
Groeten,
Reimer.
Als je dan toch wil beginnen lispen, pluis het onderstaande eens uit,
en wandel erdoor met de debugger, watch naar de verschillende variabelen,
een simpel progje, het allereerste waar ik me heb in verdiept, en wat ik nog dagelijks gebruik...
aan de hoeveelheid uitleg erbij kan je zien dat het een van de eerste prog's was, tegenwoordig laat ik veel commentaar achterwege ;-)
veel plezier...
; This routine will take the numeric part of en entity
; increment it by 1 en make the next selected text this string
; until the user break's
; versie 2 : aangepast voor tailpart
(defun c:numopt (/ ent str cntr strpart numpart chkstr str flag tailpart num cnt ch numlen numstr
modtxt txtormtxt dimormtxt seldimt strdimedit el mt selatt)
(setq ent (nentselp "Select source Text: " ))
(if ent
(progn ;1
(setq str (cdr(assoc 1 (entget (car ent )))))
(setq cntr 0)
(while (< cntr 1)
(setq strPart "" numPart "" chkStr str flag T ;variabelen initialiseren
tailpart "" num nil cnt 0) ;extra voor tailprt
(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 ;2
(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 numgedeelte
num T) ;set vlag numgedeelte gevonden
(progn ;3
(if(= num T) ;als numgedeelte gevonden
(setq flag nil strPart chkStr) ;then flag false want rest is letters
(setq tailpart (strcat ch tailpart) ;else staartstuk onthouden
cnt (+ 1 cnt)) ;staartstuk meten
) ;end if num T
(if(= cnt (strlen str))
(setq flag nil strpart tailpart
tailpart "") ;geen numpart aanwezig
) ;end if cnt
) ;progn3
) ;end if member
) ;progn2
) ;if flag
(setq chkStr(substr chkStr 1 (- (strlen chkStr) 1)));laatste letter er af en next while loop
) ;end while chkstr
(setq numLen(strlen numPart)) ;bepaal lengte van numgedeelte
(setq numStr (itoa(+ (atoi numPart) 1))) ;str to int +1 en int to str
(while(< (strlen numStr) numLen) ;aanvullen met 0-en tot lengte orig
(setq numStr(strcat "0" numStr))
) ;end while numlen
(setq str(strcat strPart numStr tailpart)) ;voeg alles weer samen
(setq modtxt (nentselp "\n Select Text to modify: "))
(if modtxt
(progn ;4
(setq txtormtxt (cdr(assoc 0 (entget (car modtxt )))))
(cond ;afvraging
((or (= txtormtxt "TEXT")(= txtormtxt "MTEXT")) ;optie 1 is het text of is het mtext
(progn ;5
(setq dimormtxt (cdr(assoc 42 (entget (car modtxt )))))
(if (/= dimormtxt nil) ;if
(progn ;then 6
(setq seldimt (cdr (assoc -1 (entget (car modtxt )))))
(setq strdimedit (substr str 5 (strlen str)))
(command "dimedit" "n" strdimedit seldimt "")
) ;progn6
(progn ;else 7
(setq el (entget (car modtxt )))
(setq mt (subst (cons 1 str) (assoc 1 EL) EL))
(entmod mt)
) ;progn7
) ;if dimortxt
) ;progn5
) ;cond or optie1
((= txtormtxt "ATTRIB") ;optie 2 is het attrib
(progn ;8
(setq selatt (cdr (assoc -1 (entget (car modtxt ))))) ;naam van de geselecteerde entity
(command "-attedit" "" "" "" "" selatt "v" "r" str "");de waarde in voegen in deze entity
) ;progn8
) ;cond or optie 2
(T (princ "\n Invalid Selection... "))
) ;end cond
(setq cntr 0)
) ;progn4
(setq cntr (+ cntr 1))
) ;if modtxt
) ;while <1
) ;progn1
) ;if
(princ)
) ;defun
Hoi,
Bedankt voor juliie reactie. En natuurlijk de bijlage van het voorbeeld.
Ik ga me er eens wat meer in verdiepen.
Met vriendelijke groet,
Adrianus.