sinds acad 2006 kan ik meerdere hatchen selecteren & acad geeft me in de properties-bar de cummulative area.
zo kan ik gemakkelijk oppervlaktes optellen... (lui zijn doet geen zeer he)
kan ik nu hetzelfde doen met de lengtes van bv. mijn rioleringsplan?
alle leidingen (Polylines) zijn eenvoudig te selecteren, maar nu zou ik hiervan een cummulative length moeten vinden...
iemand?
Die vraag heb ik eens zien passeren op cadforum.nl
Hun oplossing is:
http://www.cadforum.nl/downloads/lengtes.lsp
na load LSP krijg ik dit
Command: lengtes
Command: *Cancel*
bad argument type: numberp: nil
Citaat van: jo-king op di 10 04 2007, 08:00:44
na load LSP krijg ik dit
Command: lengtes
Command: *Cancel*
bad argument type: numberp: nil
Beste Jo-King,
De procedure berekent alleen de totale lengte van de objecten op de aktieve laag.
Op deze aktieve laag mogen alleen objecten staan met een lengte, dus niet
bijv. een blockreference.
Bij een blockreference geeft (AGCE:LengteVanObject oObject) een nil,
en dus geeft de regel (setq dLengte (+ dLengte (AGCE:LengteVanObject oObject)))
de fout van Error: bad argument type: numberp: nil
Met vriendelijke groet,
HofCAD CSI.
PS
Als je
;Lengte van object bepalen.
(defun AGCE:LengteVanObject (oObject / sName)
(setq sName (vla-get-objectname oObject))
(cond ((eq sName "AcDbLine")(vla-get-Length oObject))
((eq sName "AcDbArc")(vla-get-ArcLength oObject))
((eq sName "AcDbCircle")(vla-get-Circumference oObject))
((or (eq sName "AcDbPolyline")(eq sName "AcDbEllipse")(eq sName "AcDbSpline"))
(VL-CMDF "AREA" "Object" (vlax-vla-object->ename oObject))
(getvar "perimeter")
)
)
);end defun
vervangt door
;Lengte van object bepalen.
(defun AGCE:LengteVanObject (oObject / sName dl)
(setq dl 0)
(setq sName (vla-get-objectname oObject))
(cond ((eq sName "AcDbLine")(setq dl (+ dl (vla-get-Length oObject))))
((eq sName "AcDbArc")(setq dl (+ dl (vla-get-ArcLength oObject))))
((eq sName "AcDbCircle")(setq dl (+ dl (vla-get-Circumference oObject))))
((or (eq sName "AcDbPolyline")(eq sName "AcDbEllipse")(eq sName "AcDbSpline"))
(VL-CMDF "AREA" "Object" (vlax-vla-object->ename oObject))
(setq dl (+ dl (getvar "perimeter")))
)
)
(setq dl dl)
);end defun
moet waarschijnlijk het probleem verholpen zijn.
Citaat van: jo-king op di 10 04 2007, 08:00:44
na load LSP krijg ik dit
Command: lengtes
Command: *Cancel*
bad argument type: numberp: nil
Beste Jo-King,
Het is eleganter om de code
;selectieset doorlopen.
(vlax-for oObject oObjects
(setq dLengte (+ dLengte (AGCE:LengteVanObject oObject)))
)
te vervangen door
;selectieset doorlopen.
(vlax-for oObject oObjects
(progn (setq dL (AGCE:LengteVanObject oObject))
(if (/= dL nil) (setq dLengte (+ dLengte DL)))
)
)
Met vriendelijke groet,
HofCAD CSI
Dan krijgen we dus:
;|******************************************************************************
Routine : Berekenen lengtes van objecten op actieve laag voor CADForum.nl
Auteur : Adri Groeneveld
AGCE : registered prefix by Autodesk.
Aangepast: HofCAD (www.cadsite.be)
********************************************************************************
|;
(vl-load-com)
(defun c:Lengtes (/ oSelectionSet oObjects sLayerName)
(setq vCmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq oSelectionSet (AGCE:MaakSelectionSet "Lengten");selectieset aanmaken
sLayerName (vla-get-name (vla-get-ActiveLayer (vla-get-activedocument (vlax-get-acad-object))))
oObjects (AGCE:AutoSelectLayerObjects oSelectionSet sLayerName);selecteset vullen
dLengte 0.0
)
;selectieset doorlopen.
(vlax-for oObject oObjects
(progn (setq dL (AGCE:LengteVanObject oObject))
(if (/= dL nil) (setq dLengte (+ dLengte DL)))
)
)
(setvar "cmdecho" vCmd)
(prompt (strcat "Totale lengte op de actieve laag " sLayerName " = " (rtos dLengte 2 2) " tekeneenheden."))
(princ)
)
;Lengte van object bepalen.
(defun AGCE:LengteVanObject (oObject / sName)
(setq sName (vla-get-objectname oObject))
(cond ((eq sName "AcDbLine")(vla-get-Length oObject))
((eq sName "AcDbArc")(vla-get-ArcLength oObject))
((eq sName "AcDbCircle")(vla-get-Circumference oObject))
((or (eq sName "AcDbPolyline")(eq sName "AcDbEllipse")(eq sName "AcDbSpline"))
(VL-CMDF "AREA" "Object" (vlax-vla-object->ename oObject))
(getvar "perimeter")
)
)
);end defun
;********************************* UTILS ***************************
(defun AGCE:MaakSelectionSet (sSelectionName / oSelectionSets)
(setq oSelectionSets (vla-get-SelectionSets (vla-get-activedocument (vlax-get-acad-object))))
(if (null (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list oSelectionSets sSelectionName))))
(vla-Delete (vla-item oSelectionSets sSelectionName))
)
(setq oSelectionSet (vla-add oSelectionSets sSelectionName))
oSelectionSet
);end defun
;subroutine voor selectieset
(defun AGCE:AutoSelectLayerObjects (oSelectionSet sLayer / saType saData lType lData)
(setq saType (vlax-make-safearray vlax-vbInteger (cons 0 0))
saData (vlax-make-safearray vlax-vbVariant (cons 0 0))
lType (append lType '(8))
lData (append lData (list sLayer))
)
(vlax-safearray-fill saType lType)
(vlax-safearray-fill saData lData)
(vla-Select oSelectionSet acSelectionSetAll nil nil (vlax-make-variant saType)(vlax-make-variant saData))
oSelectionSet
);end
mooi lispje; en werkt perfect, maar is het mogelijk om enkel de lengtes van de geselecteerde polylines (of lines) op te tellen, ipv alle polylines op de actieve laag?
Citaat van: jo-king op wo 11 04 2007, 10:50:01
mooi lispje; en werkt perfect, maar is het mogelijk om enkel de lengtes van de geselecteerde polylines (of lines) op te tellen, ipv alle polylines op de actieve laag?
Beste Jo-King,
Je zou onderstaand kunnen proberen.
(vl-load-com)
(defun c:Lengtes2 (/ oObjects dLengte dL)
(setq vCmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq oObjects (c:vlassget) ;selectieset aanmaken
dLengte 0.0
)
;selectieset doorlopen.
(vlax-for oObject oObjects
(progn (setq dL (AGCE:LengteVanObject oObject))
(if (/= dL nil)
(setq dLengte (+ dLengte DL))
)
)
)
(setvar "cmdecho" vCmd)
(prompt
(strcat "Totale lengte van geselecteerde objecten = "
(rtos dLengte 2 2)
" tekeneenheden."
)
)
(princ)
)
;Lengte van object bepalen.
(defun AGCE:LengteVanObject (oObject / sName)
(setq sName (vla-get-objectname oObject))
(cond ((eq sName "AcDbLine") (vla-get-Length oObject))
((eq sName "AcDbArc") (vla-get-ArcLength oObject))
((eq sName "AcDbCircle") (vla-get-Circumference oObject))
((or (eq sName "AcDbPolyline")
(eq sName "AcDbEllipse")
(eq sName "AcDbSpline")
)
(VL-CMDF "AREA" "Object" (vlax-vla-object->ename oObject))
(getvar "perimeter")
)
)
);end defun
;********************************* UTILS ***************************
(defun c:vlassget ()
(if VlaSet
(vla-clear VlaSet)
(setq VlaSet
(Vla-add
(vla-get-selectionsets
(vla-get-activedocument (vlax-get-acad-object))
)
"MijnSelectieSet"
)
)
)
(vla-selectonscreen VlaSet)
vlaSet
)
Met vriendelijke groet,
HofCAD CSI
PS1 Eventueel kun je ook maken dat alleen van polylijnen de totale lengte wordt gegeven.
PS2 Volgens mij moet dit onderwerp verhuizen naar AutoLisp
hofCAD,
je bent de MAX !
:mrgreen:
Beste Jo-King,
De programma's Lengtes en Lengtes2 hadden nog het nadeel, dat ze
niet de lengte berekende van het entiteitstype POLYLINE (wel van LWPOLYLINE).
Men kreeg dus geen lengte van polylijnen als bijv Plinetype op 0 stond bij het tekenen,
of van polylijnen die gefit of gesplined zijn.
In het bijgevoegde bestand Lengtes.lsp is dit gecorrigeerd.
Met vriendelijke groet,
HofCAD CSI
PS Voor een alternatief zie TOTLEN.lsp op http://www.freecadapps.com/swsearch.php