LISP-intro – del 2

Vi vil oprette en ny dotted-pair-liste (1 . “FACADE 1:100”) og gemme denne i variablen DP_NY, og det gør vi med funktionen cons.

(cons new-first-element list-or-atom)

Funktionen tager to argumenter
-new-first-element = nyt første element i listen
– list-or-atom = den liste, vi vil manipulere
Funktionen returnerer den nydannede liste.

Eksempler:

(cons 1 (list 2 3 4))
returnerer listen (1 2 3 4)

(cons (1 “En tekst”))
returnerer listen (1 . “En tekst”)
Bemærk, at det første eksempel (cons 1 (list 2 3 4)) returnerer en “alminelig” liste, mens det andet eksempel (cons (1 “En tekst”)) returnerer et dotted pair. Når funktionen cons bruges på to elementer, som hver for sig ikke er en liste, returneres altid et dotted pair.

Derfor definerer vi DP_NY sådan her:

(setq DP_NY (cons 1 TEKST_NY))

DP_NY repræsenterer nu dotted-pair-listen (1 . “FACADE 1:100”).

Dermed kan vi generere en liste, der svarer til listen ED med én forskel, nemlig elementet (1 – “FACADE 1:100”). Vi gør det med funktionen subst.

(subst newitem olditem lst)

Funktionen subst erstatter et element i en liste med et andet.
– newitem = det nye element
– olditem = det gamle element, som skal erstattes
– lst = den liste, vi vil bruge funktionen på
Funktionen returnerer den nygenererede liste.

Det nye element er DP_NY, det gamle element er DP, og den liste, vi vil manipulere er ED. Vi vil gemme den returnerede liste i variablen ED_NY.
Altså …

(setq ED_NY (subst DP_NY DP ED))

Det får vi nedenatående liste ud af. Bemærk, at kun (1 . “FACADE 1:100”) adskiller sig fra den entity-data-liste, vi gemte i ED.

(
(-1 . )
(0 . “TEXT”)
(5 . “15A91”)
(102 . “{ACAD_XDICTIONARY”)
(360 . )
(102 . “}”)
(330 . )
(100 . “AcDbEntity”)
(67 . 0)
(410 . “Model”)
(8 . “0”)
(100 . “AcDbText”)
(10 1868.88 -768.639 0.0)
(40 . 500.0)
(1 . “FACADE 1:100”)
(50 . 0.0)
(41 . 1.0)
(51 . 0.0)
(7 . “Grenov”)
(71 . 0)
(72 . 0)
(11 0.0 0.0 0.0)
(210 0.0 0.0 1.0)
(100 . “AcDbText”)
(73 . 0)
)

Det sidste, vi skal gøre er at foretage selve opdateringen af tekst-objektet. Det gør vi med funktionen entmod.

(entmod elist)

Læs mere om entmod-funktionen her.
Funktionen tager et argument
– elist = liste med entity data for det objekt, der skal opdateres.
Funktionen returnerer den nye entity data liste. Hvis der er fejl i koden, eller operationen af anden årsag fejler, returnerer funktionen nil.

Vi gør dette:

(entmod ED_NY)

og dermed opdateres teksten.
Koden ser sådan her ud i Visual LISP:

og den kan, som nævnt et par gange ovenfor, optimeres, så det gør vi lige

Prøv at loade denne kode ind i en AutoCAD-tegning med tekst. Det kan du gøre via Visual LISPs toolbar-> Load active edit window.

Du kan selv forvisse dig om, at den valgte tekst nu står med store bogstaver. Åbn AutoCADs dokumentvindue og tjek.

Vi er ikke færdige med vores kode endnu, men hermed lukker vi del 2 af introduktionen til AutoLISP. I del tre vil vi se nærmere på Visual LISPs programmeringsinterface, og vi vil udvikle koden, så den bliver anvendelig i praksis for enhver AutoCAD-bruger.