I need a lisp to interpolate and label elevation on arc wherever clicked when start point and end point levels are given.
I have attached a sample drawing.
Thanks,
Solved! Go to Solution.
Solved by Kent1Cooper. Go to Solution.
Solved by hak_vz. Go to Solution.
Solved by CADaSchtroumpf. Go to Solution.
Quicly try this !
(defun C:Test ( / js ename obj lg js_start js_end z_start z_end pt lg_seg)
(princ "\nSelect an arc.")
(while (null (setq js (ssget "_+.:E:S" '((0 . "ARC")))))
(princ "\nEmpty, or isn't an arc!")
)
(setq
ename (ssname js 0)
obj (vlax-ename->vla-object ename)
lg (vlax-curve-GetDistAtPoint obj (vlax-curve-GetEndPoint obj))
)
(cond
((and
(setq js_start (ssget "_C" (mapcar '- (vlax-curve-GetStartPoint obj) '(1.0 1.0 0.0)) (mapcar '+ (vlax-curve-GetStartPoint obj) '(1.0 1.0 0.0)) '((0 . "POINT"))))
(setq js_end (ssget "_C" (mapcar '- (vlax-curve-GetEndPoint obj) '(1.0 1.0 0.0)) (mapcar '+ (vlax-curve-GetEndPoint obj) '(1.0 1.0 0.0)) '((0 . "POINT"))))
)
(setq
z_start (cadddr (assoc 10 (entget (ssname js_start 0))))
z_end (cadddr (assoc 10 (entget (ssname js_end 0))))
)
(while (setq pt (getpoint "\nGive a point on the arc: "))
(cond
((setq lg_seg (vlax-curve-GetDistAtPoint obj (vlax-curve-getClosestPointTo obj pt T)))
(print (+ (* (/ (- z_end z_start) lg) lg_seg) z_start))
(command "_mleader" (vlax-curve-getClosestPointTo obj pt T) pause (rtos (+ (* (/ (- z_end z_start) lg) lg_seg) z_start) 2 3))
)
(T (princ "\nPoint is out of the arc"))
)
)
)
)
(prin1)
)
Hello
Sorry but I don't know how to use this routine !?
I select an Arc and then <Enter> and then nothing ... Not possible to CLIC somewhere outside for the Label ...
THE HEALTH, Regards, Patrice
Patrice BRAUD
As in his example drawing, there must be a point at the ends of the arc placed in 3D, it is the Z of these points that are used ...
Patrice BRAUD
Try this.
(defun c:interpArcElevations ( / *error* e eo oldosmode doc activeSpace sp ep cp co h1 h2 H pt del_p arcLength)
(defun *error* ( msg )
(if (not (member msg '("Function cancelled" "quit / exit abort")))
(princ (strcat "\nError: " msg))
)
(setvar 'osmode oldosmode)
(setvar 'cmdecho 1)
(vla-endundomark doc)
(princ)
)
(setq e (car (entsel "\nSelect arc >")))
(cond ((and e)
(setq oldosmode (getvar 'osmode))
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-endundomark doc)
(vla-startundomark doc)
(setq activeSpace (vlax-get-property doc(if (= 1 (getvar 'cvport)) 'paperspace 'modelspace )))
(setq eo (vlax-ename->vla-object e ))
(setq sp (vlax-get eo 'Startpoint))
(setq ep (vlax-get eo 'Endpoint))
(setq cp (vlax-get eo 'Center))
(setq co (vla-addCircle activeSpace (vlax-3d-point sp) 1))
(setq h1 (getreal "\nElevation at marked point >"))
(setq arcLength (vlax-get eo 'ArcLength))
(vla-delete co)
(setq co (vla-AddCircle activeSpace (vlax-3d-point ep) 1))
(setq h2 (getreal "\nElevation at marked point >"))
(setq H (abs(- h2 h1)))
(vla-delete co)
(setvar 'osmode 512)
(setvar 'cmdecho 0)
(while (and(setq pt (getpoint "\nSelect interpolation point on arc element >")))
(cond
((and (<= (abs(- (distance pt cp) (vlax-get eo 'Radius))) 1e-10)(inters cp pt sp ep))
(setq del_p (* (/ (vlax-curve-getDistAtPoint eo pt) arcLength) H))
(if (< h2 h1) (setq del_p (* -1 del_p)))
(setq co (vla-addCircle activeSpace (vlax-3d-point pt) 0.5))
(command "text" pt 1 0 (rtos (+ h1 del_P) 2 2) "")
)
)
)
(setvar 'osmode oldosmode)
(setvar 'cmdecho 1)
(vla-endundomark doc)
))
(princ)
)
Miljenko Hatlak
You are really talking about what shows as an Arc in plan view, but representing a Helix. The example Arc has its ends at the same Z coordinate [0], not at the numbers indicated. But there are an infinite number of Arcs that can have their endpoints at the drawn XY locations and at the Z elevations indicated [picture any one of them, and you can spin it around the endpoints like a jump-rope]. If it's really an Arc with endpoints at different elevations, distances along it will not be proportional to distances in the Z direction. For example, if its midpoint is at an elevation halfway between those of its endpoints, a point 1/4 of the way along it will not be at an elevation 1/4 of the way between the endpoint elevations. That kind of proportionality would happen only with a Helix. Is that what you're trying to represent?
Yes, it is actually a helix and looks like an arc in the plan,the solution should be cosidering the length of a helix and not the arc , Not sure if both the elvation output will differ. This is required for Kerb setout for roads.
Thanks.
@Kent1Cooper wrote:
.... If it's really an Arc with endpoints at different elevations, distances along it will not be proportional to distances in the Z direction. For example, if its midpoint is at an elevation halfway between those of its endpoints, a point 1/4 of the way along it will not be at an elevation 1/4 of the way between the endpoint elevations. ....
To illustrate:
The green is an actual Arc with its endpoints at different elevations, which of course looks elliptical in this WCS plan view. The midpoint is halfway between the elevations of the ends; the red Points are quarter points along the length of the Arc. Note that the 1st & 3rd quarter-points are not at elevations halfway between the end- and mid-point elevations [which would be ±0.5].
And to take it to more of an extreme:
Note that the quarter-points are at elevations farther from that of the mid-point than the end-points are! The Arc goes upward from the high end before it drops, and goes below the low end before it gets there.
@Kent1Cooper wrote:
.... The Arc goes upward from the high end before it drops, and goes below the low end before it gets there.
[That is, it goes upward in the up-off-the-page Z-axis direction as well as in the plan-view Y direction in this particular orientation of things.]
Yep, This is not proportional to the distance . In road works a calculation of the plan distance is quite okay for setting out. and that is what our colleagues are practising. Is forming the lisp for this type of arc will be bit tricky?
By the way thanks for your knowledgeable information.
Can't find what you're looking for? Ask the community or share your knowledge.