Kan iemand me helpen waarom ik deze lisp routine niet kan opstarten?
Ik kan hem wel laden via "appload", maar wanneer ik vervolgens "PL_ArcPl2LinearPl" in de commande line typ (Autocad 2007) herkent hij de functie niet... :cry:
Ik heb zelf al gezien dat na 'defun' geen 'c:'staat, maar ook die wijziging helpt me niet helaas.
PS: Ik heb deze code nodig om bij honderden kilometers aan polylines, waarin ook arc segmenten zitten, alle arc segmenten om te zetten naar bv 12 (variabel) rechte lijnstukken en dan toch de polylines intact te houden. De software van mijn opdrachtgever kan hier namelijk niet mee overweg!
Of weet iemand een beter script?
Thomas
;; | ----------------------------------------------------------------------------
;; | PL_ArcPl2LinearPl
;; | ----------------------------------------------------------------------------
;; | Function : Reconstructs a polyline list by replacing only all arc segments
;; | with linear segments of specified distance.
;; | Arguments:
;; | 'ename' - Entity name of polyline
;; | 'SegLen' - Linear Segment length
;; | Returns:
;; | A list of all points forming the polyline. This list is in UCS
;; | Updated : June 15, 2004
;; | e-mail : rakesh.rao@4d-technologies.com
;; | Web : www.4d-technologies.com
;; | ----------------------------------------------------------------------------
(defun PL_ArcPl2LinearPl ( ename SegLen / vlist BlgLst nlist cnt len tmp
param1 param2 NextPt pt Blg len1 oname )
(if #Verbose
(princ "\nInside PL_ArcPl2LinearPl...")
)
(setq
vlist (PL_plist ename)
BlgLst (PL_GetBulgeLst ename)
nlist (list (car vlist))
cnt 0
len (length vlist)
oname (vlax-ename->vla-object ename)
)
(if #Verbose
(princ ".")
)
(setq tmp (strcat " of " (itoa len)))
(if #Verbose
(princ "\n")
)
(foreach pt vlist
(setq
Blg (nth cnt BlgLst)
cnt (1+ cnt)
)
(if #Verbose
(princ (strcat "\nProcessing vertices..." (itoa cnt) tmp))
)
(if (/= cnt 1)
(setq nlist (cons pt nlist))
)
(if (/= cnt len)
(progn
(if (not (zerop Blg))
(progn
(setq
NextPt (nth cnt vlist)
param1 (vlax-curve-getParamAtPoint oname pt)
len1 (vlax-curve-getDistAtParam oname param1)
len1 (+ len1 SegLen)
param1 (vlax-curve-getParamAtDist oname len1)
param2 (vlax-curve-getParamAtPoint oname NextPt)
)
(if (not param1)
(setq param1 param2)
)
(while (< param1 param2)
(setq
pt (vlax-curve-getPointAtParam oname param1)
nlist (cons pt nlist)
len1 (+ len1 SegLen)
param1 (vlax-curve-getParamAtDist oname len1)
)
(if (not param1)
(setq param1 param2)
)
)
))
))
)
(princ "..done")
(vlax-release-object oname)
(reverse nlist)
)
omdat de funtie niet als autocad commando is gedefinieerd maar als interen functie
om hem te kunnen starten moet je beginnen met
(defun c:
Citaat van: bart op di 03 03 2009, 08:02:45
omdat de funtie niet als autocad commando is gedefinieerd maar als interen functie
om hem te kunnen starten moet je beginnen met
(defun c:
Beste T. Freriks,
Je kan proberen met
(PL_ArcPl2LinearPl (car (entsel)) 0.01)
Ik kan het programma niet uitproberen omdat ik in de listing de functie
definitie van PL_PLIST mis.
Met vriendelijke groet, HofCAD CSI.
Citeer
Beste T. Freriks,
Je kan proberen met
(PL_ArcPl2LinearPl (car (entsel)) 0.01)
Ik kan het programma niet uitproberen omdat ik in de listing de functie
definitie van PL_PLIST mis.
Met vriendelijke groet, HofCAD CSI.
Dank je! ik ga het onmiddelijk proberen!
Citaat van: t.freriks op di 03 03 2009, 17:41:31
Citeer
Beste T. Freriks,
Je kan proberen met
(PL_ArcPl2LinearPl (car (entsel)) 0.01)
Ik kan het programma niet uitproberen omdat ik in de listing de functie
definitie van PL_PLIST mis.
Met vriendelijke groet, HofCAD CSI.
Dank je! ik ga het onmiddelijk proberen!
Beste T. Freriks,
Van de site www.4d-technologies.com heb je naast PL_ArcPl2LinearPl ook nodig
PL_plist, LI_item, LI_mitem en PL_GetBulgeLst.
Dan pas kun je met bijv. onderstaand programma gaan testen.
(defun c:test( / SegLen ent i)
(vl-load-com)
(setq SegLen 1.0) ;Wijzig De Lineaire Segment Lengte
(setq ent (car (entsel)))
(setq PlineLst (PL_ArcPl2LinearPl ent SegLen))
(setq i 0)
(command "_PLINE" (nth i PlineLst))
(repeat (- (length PlineLst) 1)
(setq i (1+ i))
(command (nth i PlineLst))
)
(command "")
(command "_ERASE" ent "")
)
Met vriendelijke groet, HofCAD CSI.
Citaat van: HofCAD op di 03 03 2009, 21:26:14
Beste T. Freriks,
Van de site www.4d-technologies.com heb je naast PL_ArcPl2LinearPl ook nodig
PL_plist, LI_item, LI_mitem en PL_GetBulgeLst.
Dan pas kun je met bijv. onderstaand programma gaan testen.
(defun c:test( / SegLen ent i)
(vl-load-com)
(setq SegLen 1.0) ;Wijzig De Lineaire Segment Lengte
(setq ent (car (entsel)))
(setq PlineLst (PL_ArcPl2LinearPl ent SegLen))
(setq i 0)
(command "_PLINE" (nth i PlineLst))
(repeat (- (length PlineLst) 1)
(setq i (1+ i))
(command (nth i PlineLst))
)
(command "")
(command "_ERASE" ent "")
)
Met vriendelijke groet, HofCAD CSI.
So, als jij iets tegenkomt bijt jij je er ook onmiddelijk helemaal in vast he? Much respect!
Ik heb het dankzij je tip aan de gang gekregen met alle lisps aan elkaar!
Helaas is het resultaat zo 'buggy' dat ik het niet aandurf om mijn tekeningen eraan te wagen en dit definitief te maken. Er komen, zo op het oog compleet willekeurige vertexen in de polyline te staan dat ik het op die kilometers tracé niet vertrouw dat er geen zig-zag stukken tussen zitten, waardoor ik nog verder van huis ben.
Toch enorm bedankt voor je hulp HofCAD! Je tip scheelt me uren kopzorgen, blijkbaar zonder resultaat.
Ik denk dat ik m'n geluk ga proberen met het andere script uit m'n 2e post: "Lisp: veel & lange polylines 'ont-arcen' (->uitsluitend rechte lijnsegmenten)" (http://www.cadsite.be/smf/index.php/topic,3242.0.html)
Deze lijkt veel stabieler en doet 'bijna' wat ik zoek... kijken of ik deze eerst kan 'begrijpen' en later wellicht verbouwen...
Stanx!
Thomas