POLYLINE

 

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 database van de POLYLINE (oude stijl)

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.

 

De database van LWPOLYLINE

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