Improved precision and stability of splitting an arc

This commit is contained in:
Markus Lampert
2020-02-03 20:45:33 -08:00
parent da71719896
commit abb2865e3a
4 changed files with 46 additions and 25 deletions

View File

@@ -202,14 +202,13 @@ class Tag:
return False
def nextIntersectionClosestTo(self, edge, solid, refPt):
# ef = edge.valueAt(edge.FirstParameter)
# em = edge.valueAt((edge.FirstParameter+edge.LastParameter)/2)
# el = edge.valueAt(edge.LastParameter)
# print("-------- intersect %s (%.2f, %.2f, %.2f) - (%.2f, %.2f, %.2f) - (%.2f, %.2f, %.2f) refp=(%.2f, %.2f, %.2f)" % (type(edge.Curve), ef.x, ef.y, ef.z, em.x, em.y, em.z, el.x, el.y, el.z, refPt.x, refPt.y, refPt.z))
# debugEdge(edge, 'intersects_')
vertexes = edge.common(solid).Vertexes
if vertexes:
return sorted(vertexes, key=lambda v: (v.Point - refPt).Length)[0].Point
pt = sorted(vertexes, key=lambda v: (v.Point - refPt).Length)[0].Point
debugEdge(edge, "intersects (%.2f, %.2f, %.2f) -> (%.2f, %.2f, %.2f)" % (refPt.x, refPt.y, refPt.z, pt.x, pt.y, pt.z))
return pt
return None
def intersects(self, edge, param):
@@ -507,6 +506,7 @@ class MapWireToTag:
self.tail = None
self.finalEdge = edge
if self.tag.solid.isInside(edge.valueAt(edge.LastParameter), PathGeom.Tolerance, True):
PathLog.track('solid.isInside')
self.addEdge(edge)
else:
i = self.tag.intersects(edge, edge.LastParameter)
@@ -517,8 +517,10 @@ class MapWireToTag:
PathLog.debug('originAt: (%.2f, %.2f, %.2f)' % (o.x, o.y, o.z))
i = edge.valueAt(edge.FirstParameter)
if PathGeom.pointsCoincide(i, edge.valueAt(edge.FirstParameter)):
PathLog.track('tail')
self.tail = edge
else:
PathLog.track('split')
e, tail = PathGeom.splitEdgeAt(edge, i)
self.addEdge(e)
self.tail = tail

View File

@@ -433,22 +433,10 @@ def splitArcAt(edge, pt):
"""splitArcAt(edge, pt)
Returns a list of 2 edges which together form the original arc split at the given point.
The Vector pt has to represent a point on the given arc."""
p1 = edge.valueAt(edge.FirstParameter)
p2 = pt
p3 = edge.valueAt(edge.LastParameter)
edges = []
p = edge.Curve.parameter(p2)
#print("splitArcAt(%.2f, %.2f, %.2f): %.2f - %.2f - %.2f" % (pt.x, pt.y, pt.z, edge.FirstParameter, p, edge.LastParameter))
p12 = edge.Curve.value((edge.FirstParameter + p)/2)
p23 = edge.Curve.value((p + edge.LastParameter)/2)
#print("splitArcAt: p12=(%.2f, %.2f, %.2f) p23=(%.2f, %.2f, %.2f)" % (p12.x, p12.y, p12.z, p23.x, p23.y, p23.z))
edges.append(Part.Edge(Part.Arc(p1, p12, p2)))
edges.append(Part.Edge(Part.Arc(p2, p23, p3)))
return edges
p = edge.Curve.parameter(pt)
e0 = Part.Arc(edge.Curve.copy(), edge.FirstParameter, p).toShape()
e1 = Part.Arc(edge.Curve.copy(), p, edge.LastParameter).toShape()
return [e0, e1]
def splitEdgeAt(edge, pt):
"""splitEdgeAt(edge, pt)