LISP-intro – del 2


Vi vil gerne finde ud af, hvad der står i den udpegede tekst, så vi kan ændre bogstaverne til store bogstaver. Derfor benytter vi funktionen entget, for at få fat i en liste med objektets (tekstens) data.

(entget ename [applist])

Funktionen entget tager to argumenter, hvoraf det ene er valgfrit.
– ename = et entity name
[applist] som vi i denne forbindelse helt enkelt tillader os at ignorere

Funktionen entget returnerer en liste med entity data, som vi ser nærmere på nedenfor.

Vi bruger lige først setq for at gemme det hele i nogle variabler:

Det, vi vil gøre, er …

  1. Gemme resultatet (= en liste med to elementer) fra entsel-funktionen i en variabel, som vi kalder ES (for Entity Selected)
  2. Gemme det første element i ES i en variabel, som vi kalder EN (for Entity Name)
  3. Gemme resultatet (= en listre med mange elementer) fra funktionen entget i en variabel, som vi kalder ED (for Entity Data)

Vi gør det sådan her:

(setq ES(entsel “\nUdpeg en tekst: “))
(setq EN(car ES))
(setq ED(entget en))

og det forenkler vi lige med det samme …

(setq
… ES(entsel “\nUdpeg en tekst: “)
… EN(car ES)
… ED(entget en)
)

Lad os lige opdatere vores programkode i Visual LISP. Sådan her:

Denne kode kan optimeres, men det gør vi senere.

Det, der sker, er …

  • Brugerens input returnerer en liste med to elementer, som gemmes i variablen ES: (<Entity name: 216b8447190> (5907.15 -270.171 0.0)),
  • Det første element i listen gemmes i variablen EN: <Entity name: 216b8447190>
  • Funktionen entget returnerer entity data som en lang liste, der gemmes i variablen 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))

Listen ED indeholder en lang række data vedrørende den udpegede tekst, og alle data er organiseret i underlister af såkaldte dotted pairs.
Vi prøver lige at se listen ED på en lidt mere overskuelig måde:

(
(-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)
)

Langt de fleste af underlisterne er arrangeret i såkaldte dotted pairs som f.eks. (1 . “Facade 1:100”). Dotted pairs er lister, der består af to elementer adskilt af et punktum (dot). Det første element i listen er en gruppekode, som altid er associeret med en bestemt objektegenskab. Vi kan gætte os til, at talkoden 1 er associeret med tekstobjektets streng-værdi = “Facade 1:100”.
Andre eksempler på gruppekoder er 0 for objekttype, 8 for lagnavn, 7 for navnet på tekst stylen o.s.v.

De underlister, der ikke er dotted pairs er f.eks. (10 1868.88 -768.639 0.0) og (11 0.0 0.0 0.0), men de består stadig af en indledende gruppekode efterfulgt af tre tal værdier. Det er fordi koden 10 er associeret til objektets primære punkt, og koden 11 er associeret til objektets sekunddæfre punkt. For teksters vedkommende angiver koden 10 (alt andet lige) tekstens indsætningspunkt.
Hvis vi havde udpeget en linje, ville kode 10 angive linjens startpunkt, og kode 11 ville angive linjens slutpunkt.

Samtlige gruppekoder er tilgængelige, hvis du søger på nettet efter AutoCAD DXF-koder. Du kan se de mest almindelige gruppekoder her: Autodesk 2023 Developer Help
eller (mere omfattende) her: Autodesk 2012 dxf reference

Da vi jo vil vide, hvad tekst-objektets tekst-streng er, er det kode 1, vi skal have fat i, og til dette formål benytter vi funktionen assoc.

(assoc element alist)

Funktionen assoc gennemsøger en association list (som ovenstående entity data) for et element og returnerer den pågældende association list entry.
Funktionen tager to argumenter
element = gruppekoden
alist = den liste, vi vil søge i
Funktionen returnerer en liste me to elementer (= dotted pair)

Vi gør dette …

(setq DP (assoc 1 ED))

som returnerer listen (1 . “Facade 1:100”).

Men i dotted-pairs-lister, kan man ikke bruge cadr eller nth til at få fat i det andet element i listen. i stede skal vi benytte en funktion, der returnerer det sidste element i en liste.

(cdr list)

Funktionen cdr returnerer det sidste element i en listen

Vi skriver …

(setq TEKST(cdr DP))

og får returneret tekststrengen “Facade 1:100”, som nu er gemt i variablen TEKST. Så vidt så godt …