How can I get the closest point from a curve to a mesh?
Thank you for your response.
problem curve mesh proximity 00.gh (12.2 KB)
How can I get the closest point from a curve to a mesh?
Thank you for your response.
problem curve mesh proximity 00.gh (12.2 KB)
This would be a possibility:
Depending on your curve length, you need to crank up the resolution!
problem curve mesh proximity 01.gh (12.0 KB)
@RadovanG
Is this also possible in Python you think? I tried it in Python but it did not work.
What I am trying to do is instead of pulling a point towards a mesh finding out ‘on which height’ the closest point to the mesh is.
Doing it between a curve and a brep seems also not possible in Python.
@DavidRutten
Almost 8 years ago, is it possible to do the same of what RadovanG did in C# but than in Python?
Damn, you revived an old thread here, @ForestOwl!
Have you tried something akin to this:
# Inputs: Mesh (mesh), Lines ([line, ...])
import Rhino.Geometry as rg
def divide_line(line, step_size):
for i in xrange(int(ln.Length/step_size)):
yield ln.PointAtLength(step_size * i)
resolution = 0.01
closest_mpts = []
closest_lpts = []
for ln in Lines:
div_pts = divide_line(ln, resolution)
closest_mpt = None
closest_mdist = float("inf")
for div_pt in div_pts:
pt = Mesh.ClosestPoint(div_pt)
dist = pt.DistanceTo(div_pt)
if dist < closest_mdist:
closest_mdist = dist
closest_mpt = pt
closest_mpts.append(closest_mpt)
closest_lpt = ln.ClosestPoint(closest_mpt, True)
closest_lpts.append(closest_lpt)
a = closest_mpts
b = closest_lpts
This is much faster than the C# script from above and the result seems to be far more correct (if I’m not mistaken)! For instance, the closest point between a mesh and a line that intersects the latter in one point, must be this intersection point.
Or are you looking for something else than “the closesest point from a (line) curve to a mesh”?
for i,p in enumerate(mainMsPnts):
distanceXYva=None
distanceZva=None
closestPn=None
closestPnDistVa=None
negCopyPn=p.Clone()
posCopyPn=p.Clone()
negCopyPn.Z-=10
posCopyPn.Z+=10
measureLn=rc.Geometry.Line(negCopyPn,posCopyPn)
linePnts=divideLineToPnts(measureLn,0.1)
for j,m in enumerate(lockMshs):
for k,lp in enumerate(linePnts):
lockMshs[j].ClosestPoint(linePnts[k])
“generator object is not subscriptable”
Do you might know why it says that? It is about the last rule.
I guess you’ve renamed my function and are using it to do the line division?
It yields (returns) a generator object, not a list!
Generators are very fast by nature, but not subscriptable!
You can only iterate through them item by item, like I do in my example, and only once.
For your example, you can only do this…:
for pt in linePnts:
lockMshs[j].ClosestPoint(pt)
… and only once! After this the generator is expired.