Een van de
interessantste mogelijkheden van AutoLISP is het veranderen van de database van
een getekend element. De zgn. drawing database kun je beschouwen als het
DNA van een LINE, ARC of ander element dat in je tekening staat.
Het werkt als volgt:
Zorg dat er een cirkel
op je tekening staat met straal van 2 en typ op de command-line:
(setq enp (entsel))
Je selecteert de
cirkel en de command-line reageert met:
(<Entity name: 7ffff723ae0> (6.54474 3.67101
0.0))
(6.54474 3.67101 0.0)
is het selectiepunt. De database zit verborgen achter de Entity name.
We halen eerst de entity
name uit de list die we aan enp hebben toegewezen:
(setq en (car enp))
De database krijg je
te pakken met entget:
(setq ed (entget en))
op de command-line
verschijnt:
((-1 . <Entity name: 7ffff723ae0>) (0 .
"CIRCLE") (330 . <Entity
name: 7ffff7059f0>) (5 . "1A6") (100 .
"AcDbEntity") (67 . 0) (410 . "Model")
(8 . "0")
(100 . "AcDbCircle") (10 5.0 5.0 0.0) (40 . 2.0) (210 0.0 0.0 1.0))
Je ziet een samengestelde
list. We kijken nu alleen even naar de een-na-laatste sublist:
(40 . 2.0)
Hier vind je de straal
die je hebt opgegeven toen je de cirkel tekende.
Je kunt die waarde als
volgt uit de datalist pakken:
(setq rad (cdr (assoc 40 ed)))
Stel, je wilt die
straal veranderen van 2 naar 4. Typ dan de volgende code:
(entmod (subst (cons
40 4)(cons 40 rad) ed))
Je zult zien dat de
straal van de cirkel verandert.
Met cons maak
je een sublist
(cons 40 4)
geeft als resultaat: (40 . 4.0)
Met subst heb je
de nieuwe sublist in de plaats gezet van de oude.
Met entmod geef
je een update aan de datalist.
Van dit hele verhaal
kun je een AutoLISP-routine maken die er als volgt uitziet:
(defun c:straal (/ enp
ed ed rad newrad)
(setq enp (entsel "\nSelecteer een
cirkel: ")
en (car enp)
ed (entget en)
rad
(dxf 40 ed)
newrad (getreal "\nNieuwe
straal: ")
)
(entmod
(subst (cons 40 newrad)(cons 40 rad) ed))
(princ)
)
Je ziet bovenaan
achter de slash de variabelen staan die in deze routine gebruikt worden.
Variabelen achter de slash zijn zogenaamde local variabelen. Ze gelden
alleen binnen de routine. Wanneer je ze niet achter de slash zet, worden
het global variabelen. Ze behouden hun waarde na het beëindigen van de routine,
zolang de tekening open blijft staan.
Je kunt de waarde van
een global opvragen door hem in te typen op de command-line, vooraf
gegaan door een ‘!’.
Dus bijvoorbeeld: !enp
Je ziet dat je met één
setq een hele reeks variabelen kunt toewijzen.
Met getreal kun
je een getal met decimalen invoeren.
Er is ook nog getint.
Daarmee kan alleen een integer, een getal zonder decimalen, worden
ingevoerd.