Het grootste deel vanhet programma snap ik wel, enkel die ! daar vind ik nergens uitleg over
Alvast bedankt !
(defun vert (e v / name en ev i vl zn) ; returns position of v-th element out of pline e
(setq name (dxf 0 e)) ; haalt de naam op van de geselcteerde entity
(if (= name "POLYLINE") ; als het een polyline is
(progn ;
(setq en e) ;
(repeat v (setq en (entnext en))) ; lus voor alle punten van de polyline
(setq p! (cdr (assoc 10 (entget en)))) ; HET GAAT VOORAL HIER OM DAT !
)
)
(if (= name "LWPOLYLINE")
(progn
(setq ev (entget e) i 0 zn (cdr (assoc 38 ev)) vl (list '(0 0 0)))
(while (/= (nth i ev) nil)
(if (= (car (nth i ev)) 10)
(setq vl (append vl (list (list 10 (cadr (nth i ev)) (caddr (nth i ev)) zn))))
)
(setq i (1+ i))
)
(setq p! (cdr (nth v vl)))
)
)
(setq p! p!) ; EN DUS OOK OM DEZE ! !
)
Het uitroepteken is slechts onderdeel van de naam van een variabele. Het is niet het meest fraaie stukje Lisp code. Er is veel ruimte voor verbetering. O.a. kan de variabele p! helemaal verwijderd worden. :wink:
't is niet moeilijk dat ik het niet helemaal snap dan,...
dus wat je wil zeggen is dat het ! mag bekeken worden als een gewoon character ?
Dit stuk code komt wel regelmatig voor op het net , ook hier is het door hofcad reeds gepost...
en dus voor vereenvoudiging vatbaar ?
Sommige programmeurs weken nog met benamingen uit de middeleeuwen... (lees "BASIC tijdperk")
Moet ieder voor zich weten natuurlijk, is maar wat je gewend bent.
Ze gebruiken dan o.a. de volgende symbolen voor de variabele namen, hoewel ik niet weet of dat in jou lisp ook geld:
# = Double
$ = String
% = Integer
& = Long
! = Single
Zo kun je makkelijker in de gaten houden wat er in de var moet komen.
Ik geef de voorkeur aan een afkorting van de types als ik dat gebruik:
Xint, of Teller_int i.p.v. X% of Teller%
Voornamelijk gebruik ik dat in VB of VBA.
Hieronder een verbeterde en alternatieve versie voor de vert functie.
Let op:
i.t.t. tot de originele code retourneren de functies een punt in het WCS en de index i begint bij 0 i.p.v. 1.
(defun vert-new (enme i / elst pt tmpElst tmpEnme)
(setq elst (entget enme))
(cond
( (vl-position '(0 . "LWPOLYLINE") elst)
(if (setq pt (cdr (nth i (vl-remove-if-not '(lambda (sub) (= 10 (car sub))) elst))))
(trans (append pt (list (cdr (assoc 38 elst)))) enme 0)
)
)
(
(or
(vl-position '(100 . "AcDb2dPolyline") elst)
(vl-position '(100 . "AcDb3dPolyline") elst)
)
(setq tmpEnme (entnext enme))
(while (and (< 0 i) (setq tmpEnme (entnext tmpEnme)))
(setq i (1- i))
)
(if
(and
(zerop i)
(setq tmpElst (entget tmpEnme))
(vl-position '(0 . "VERTEX") tmpElst)
(vl-position (cons 330 enme) tmpElst)
)
(if (vl-position '(100 . "AcDb2dPolyline") elst)
(trans (cdr (assoc 10 tmpElst)) enme 0)
(cdr (assoc 10 tmpElst))
)
)
)
)
)
(defun vert-alt (obj i)
(vl-load-com)
(if (= 'ename (type obj))
(setq obj (vlax-ename->vla-object obj))
)
(if
(vl-position
(vla-get-objectname obj)
'("AcDbPolyline" "AcDb2dPolyline" "AcDb3dPolyline")
)
(vlax-curve-getpointatparam obj i)
)
)
@eddy,
aah, van daar komt dat dan ;-) weer iets bijgeleerd
en het stukje code is waarschijnlijk al redelijk oud als ik op de zoekresultaten voortga ;-)
@roy
oke vernieuwde versie, (ben ik zelf ook mee bezig op basis van de commentaren)
Ik wou eerst deze subroutine doorgronden, want je krijgt de pos van het zoveelste punt van de PL en ik gebruik dit dan in iets anders om op die pos iets te doen,...
Geloof het of niet, maar met een tellertje loop ik dan alle punten van de PL af...
Dus de tijd groeit exponetieel omdat deze routine voor x punten x keer een lijst maakt, en dat wil ik uit mijn routine halen,
Dit volledig ter zijde, maar gewoon om te situeren waarom ik om uitleg vroeg
maar waarom heb je er die VL- dinges bijgehaald,
Ik heb nog nooit VL- gebruikt, en probeer het altijd met gewoon lisp, ook om anderen te laten bijleren lijkt me dat makkelijker, lisp leest toch iets handiger...
De door mij voorgestelde code is 'gewoon Lisp'. Waarom zou je Lisp functies die al meer dan 15 jaar beschikbaar zijn in AutoCAD niet 'gewoon' gebruiken? Ik hoop i.i.g. dat je begrijpt waarom (vert-new) beter is dan (vert).
Hier heb je een verbeterde vert functie die niet gebruikmaakt van vl* functies:
(defun vert-new-no-vl (enme i / elst pt tmpElst tmpEnme)
(setq elst (entget enme))
(cond
( (member '(0 . "LWPOLYLINE") elst)
(if
(setq pt
(nth
i
(apply
'append
(mapcar
'(lambda (sub) (if (= 10 (car sub)) (list (cdr sub))))
elst
)
)
)
)
(trans (append pt (list (cdr (assoc 38 elst)))) enme 0)
)
)
(
(or
(member '(100 . "AcDb2dPolyline") elst)
(member '(100 . "AcDb3dPolyline") elst)
)
(setq tmpEnme (entnext enme))
(while (and (< 0 i) (setq tmpEnme (entnext tmpEnme)))
(setq i (1- i))
)
(if
(and
(zerop i)
(setq tmpElst (entget tmpEnme))
(member '(0 . "VERTEX") tmpElst)
(member (cons 330 enme) tmpElst)
)
(if (member '(100 . "AcDb2dPolyline") elst)
(trans (cdr (assoc 10 tmpElst)) enme 0)
(cdr (assoc 10 tmpElst))
)
)
)
)
)
Oops: Er zit een fout in de code van vert-alt. Hieronder de verbeterde code:
(defun vert-alt (obj i)
(vl-load-com)
(if (= 'ename (type obj))
(setq obj (vlax-ename->vla-object obj))
)
(if
(and
(vl-position
(vla-get-objectname obj)
'("AcDbPolyline" "AcDb2dPolyline" "AcDb3dPolyline")
)
(or
(not (vlax-curve-isclosed obj))
(< i (vlax-curve-getendparam obj))
)
)
(vlax-curve-getpointatparam obj i)
)
)
@ delangstevandestraat:
Hieronder vert-new-foreach, deze code sluit waarschijnlijk beter aan op jouw kennisniveau.
(defun vert-new-foreach (enme i / elst pt ptLst tmpElst tmpEnme)
(setq elst (entget enme))
(cond
( (member '(0 . "LWPOLYLINE") elst)
(foreach sub elst
(if (= 10 (car sub))
(setq ptLst (cons (cdr sub) ptLst))
)
)
(setq ptLst (reverse ptLst))
(if (setq pt (nth i ptLst))
(trans (append pt (list (cdr (assoc 38 elst)))) enme 0)
)
)
(
(or
(member '(100 . "AcDb2dPolyline") elst)
(member '(100 . "AcDb3dPolyline") elst)
)
(setq tmpEnme (entnext enme))
(while (and (< 0 i) (setq tmpEnme (entnext tmpEnme)))
(setq i (1- i))
)
(if
(and
(zerop i)
(setq tmpElst (entget tmpEnme))
(member '(0 . "VERTEX") tmpElst)
(member (cons 330 enme) tmpElst)
)
(if (member '(100 . "AcDb2dPolyline") elst)
(trans (cdr (assoc 10 tmpElst)) enme 0)
(cdr (assoc 10 tmpElst))
)
)
)
)
)