LWPOLYLINE (light
weight polyline) is de nieuwe versie van POLYLINE.
De database is anders
opgebouwd. Het lastige punt hierbij is dat de data niet meer per segment staan
opgeslagen, maar dat dit een lange lijst is, waarin meerdere keren dezelfde dxf
voorkomt.
Je kunt beide soorten
Polylijnen gebruiken. De standaardsetting van PLINE is LWPOLYLINE
Als de
systeemvariabele PLINETYPE op 0 staat krijg je de oude POLYLINE
Als PLINETYPE op 1 of
2 staat wordt het een LWPOLYLINE
Waarom LWPOLYLINE? Wat
is de reden dat de POLYLINE een andere database heeft gekregen? Ik heb dat tot
nu toe niet kunnen ontdekken.
Je kunt een POLYLINE omzetten naar LWPOLYLINE en omgekeerd. Hiervoor gebruik
je het commando CONVERTPOLY.
Voor het
omzetten van POLYLINE naar LWPOLYLINE: CONVERTPOLY-Light
Voor het
omzetten van LWPOLYLINE naar POLYLINE: CONVERTPOLY-Heavy
De oude POLYLINE heeft
een complexe database. De afzonderlijke stukken (segmenten) van de Polyline
worden behandeld als subentities. Als je met entsel een Polyline pakt,
zie je alleen de hoofdentity. Met entnext kun je de subentities vinden.
Een subentity wordt een vertex (meervoud ‘vertices’) genoemd. De laatste
subentity is de zgn. SEQUEND.
Het zoeken van de
subentities (vertices) gaat als volgt:
Zorg dat er een
POLYLINE-oude stijl op je tekening staat met tenminste twee segmenten.
Typ op de commandline: (setq en (car (entsel)))
Antwoord: Select
objects:
Je selecteert de
Polyline
Antwoord:
<Entity name: 7ffff610940>
Typ (setq ed
(entget en))
Antwoord:
((-1 . <Entity name: 7ffff610940>) (0 .
"POLYLINE")
(330 . <Entity name:
7ffff6039f0>) (5 . "8BAC") (100 .
"AcDbEntity") (67 . 0) (410 .
"Model") (8 .
"0") (100 .
"AcDb2dPolyline") (66 . 1) (10 0.0 0.0 0.0) (70 . 0) (40 . 0.0) (41
. 0.0) (210 0.0 0.0
1.0) (71 . 0) (72 . 0) (73 . 0) (74 . 0) (75 . 0))
Je hebt nu de database
van de hoofdentity te pakken.
Typ op de commandline:
(setq en (entnext en))
Antwoord: <Entity
name: 7ffff610990>
Typ op de commandline:
(setq ed (entget en))
Antwoord:
((-1 . <Entity name: 7ffff610960>) (0 .
"VERTEX") (330 . <Entity name:
7ffff610940>) (5 . "8BAE") (100 .
"AcDbEntity") (67 . 0) (410 .
"Model") (8 .
"0") (100 .
"AcDbVertex") (100 . "AcDb2dVertex") (10 -14605.6 -40422.6
0.0) (40
. 0.0) (41 . 0.0) (42
. 0.0) (91 . 0) (70 . 0) (50 . 0.0))
Je hebt nu de eerste
subentity te pakken.
door steeds opnieuw (setq
en (entnext (dxf –1 ed))) in te
typen, krijg je alle volgende subentities.
Met (setq ed
(entget en)) krijg je de database.
De laatste die je
vindt is de SEQEND:
((-1 . <Entity name: 7ffff610950>) (0 .
"SEQEND") (330 . <Entity name:
7ffff610940>) (5 . "8BAD") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 .
"0") (-2 . <Entity name:
7ffff610940>))
Het begrip vertex is enigszins
verwarrend. Het betekent eigenlijk knooppunt, terwijl de database van de
subentity informatie bevat over het stuk tussen twee hoekpunten. De database
van een subentity bevat alleen het beginpunt van het betreffende stuk polylijn.
Er is daarom een extra vertex nodig voor het laatste punt. Tot slot is er nog
de sequend.
nentsel
Dit is een speciale
LISP-functie waarmee je direct de database van een vertex (subentity) kunt
vinden.
Hij werkt als entsel.
nentselp
Dit is het zusje van nentsel.
nentsel verwacht een actie van de tekenaar. Bij nentselp kun je
de lisp-routine het werk laten doen door het selectiepunt toe te voegen:
Bijvoorbeeld:
(setq enp (entsel)) ; je selecteert de
polyline
(setq venp (nentselp
(cadr enp))) ; je pakt daaruit de subentity van de Vertex
Je kunt nu weer de
volgende Vertex vinden met entnext:
naam van de eerste
Vertex:
(setq en1 (entget (car venp)))
(setq en2 (entnext
en1))
NB
nentsel
en nentselp werken ook bij de nieuwe POLYLINE, maar je hebt er niets
aan, behalve dan dat je je geen zorgen hoeft te maken over de vraag of je een
oude dan wel een nieuwe POLYLINE te pakken hebt.
Bij de LWPOLYLINE is
de database eenvoudiger dan bij oude POLYLINE, maar het is nu lastig geworden
om de afzonderlijke vertices te identificeren.
Met dxf 10 pak je
steeds het eerste punt wat je tegenkomt.
dxf 91 is de ‘vertex identifier’. Het zou handig
zijn als hij de vertexen nummerde, maar de waarde staat altijd op 0.
dxf 90 is de vertex-teller. Dat is tenminste
iets. Je hoeft het aantal niet meer zelf te tellen, maar dat was minder een
probleem dan het identificeren van de vertices.
Met (dxf 10 ed) of (cdr (assoc 10 ed)) vind je de coördinaten van het eerste punt.
Je kunt die veranderen
met:
(entmod (subst (cons 10 new) (cons 10 old) ed))
Heb je de oude en de
nieuwe waarde van een punt, dan kun je elk punt van de LWPOLYLINE op deze
manier veranderen.
‘subst’ kun je
loslaten op een datalist. Het zoekt dxf-codes aan de hand van de dxf-sleutel
(bij coordinaatwaarden is dat 10) en de waarde van de dxf-code. De
onderscheidene 10-codes zijn identificeerbaar doordat ze allemaal verschillend.
Andere codes zijn
lastiger. Bij een LWPOLYLINE met meerdere rechte vertices staat de bulgefactor
bij al die vertices op 0.0. De bulgefactor die je wilt hebben is daardoor niet
zondermeer te identificeren. Met
(entmod (subst (cons 40 new) (cons 40 old) ed))
verander je alle
bulgefactors in een keer.
Je zult zelf moeten
testen tussen welke punten van de LWPOLYLINE je selectiepunt ligt. Ik heb dit
toegepast in RELIMIT.LSP.
Bij de waarde voor de
‘width’ gaat het een beetje anders. Voor de zgn. ‘constant width’ (width die
geldt voor alle vertices) verander je dxf-code 43. Wil je de width-factor voor
de afzonderlijke vertices veranderen, dan moet code 43 verwijderd worden.
Als een soort
equivalent van nentselp heb ik de Lisp-routine LWPOLYAN.LSP gemaakt.
Met lwpolyan kun je de dxf 10 van een
geselecteerde vertex vinden en die van de eerstvolgende. (Je hebt dan dus begin
en eindpunt van dat segment.)
Toepassing: CORNER.LSP