def circleFrom3LineTangents(edge1, edge2, edge3): """Return a list of circles from three edges. It calculates up to 6 possible centers. """ def rot(ed): geo = Part.LineSegment(v1(ed), v1(ed).add(DraftVecUtils.rotate(vec(ed), math.pi/2))) return geo.toShape() bis12 = angleBisection(edge1, edge2) bis23 = angleBisection(edge2, edge3) bis31 = angleBisection(edge3, edge1) intersections = [] intsec = findIntersection(bis12, bis23, True, True) if intsec: radius = findDistance(intsec[0], edge1).Length intersections.append(Part.Circle(intsec[0], NORM, radius)) intsec = findIntersection(bis23, bis31, True, True) if intsec: radius = findDistance(intsec[0], edge1).Length intersections.append(Part.Circle(intsec[0], NORM, radius)) intsec = findIntersection(bis31, bis12, True, True) if intsec: radius = findDistance(intsec[0], edge1).Length intersections.append(Part.Circle(intsec[0], NORM, radius)) intsec = findIntersection(rot(bis12), rot(bis23), True, True) if intsec: radius = findDistance(intsec[0], edge1).Length intersections.append(Part.Circle(intsec[0], NORM, radius)) intsec = findIntersection(rot(bis23), rot(bis31), True, True) if intsec: radius = findDistance(intsec[0], edge1).Length intersections.append(Part.Circle(intsec[0], NORM, radius)) intsec = findIntersection(rot(bis31), rot(bis12), True, True) if intsec: radius = findDistance(intsec[0], edge1).Length intersections.append(Part.Circle(intsec[0], NORM, radius)) circles = [] for intsec in intersections: exists = False for cir in circles: if DraftVecUtils.equals(cir.Center, intsec.Center): exists = True break if not exists: circles.append(intsec) if circles: return circles else: return None
def circleFrom3LineTangents(edge1, edge2, edge3): """circleFrom3LineTangents(edge,edge,edge)""" def rot(ed): return Part.LineSegment( v1(ed), v1(ed).add(DraftVecUtils.rotate(vec(ed), math.pi / 2))).toShape() bis12 = angleBisection(edge1, edge2) bis23 = angleBisection(edge2, edge3) bis31 = angleBisection(edge3, edge1) intersections = [] int = findIntersection(bis12, bis23, True, True) if int: radius = findDistance(int[0], edge1).Length intersections.append(Part.Circle(int[0], NORM, radius)) int = findIntersection(bis23, bis31, True, True) if int: radius = findDistance(int[0], edge1).Length intersections.append(Part.Circle(int[0], NORM, radius)) int = findIntersection(bis31, bis12, True, True) if int: radius = findDistance(int[0], edge1).Length intersections.append(Part.Circle(int[0], NORM, radius)) int = findIntersection(rot(bis12), rot(bis23), True, True) if int: radius = findDistance(int[0], edge1).Length intersections.append(Part.Circle(int[0], NORM, radius)) int = findIntersection(rot(bis23), rot(bis31), True, True) if int: radius = findDistance(int[0], edge1).Length intersections.append(Part.Circle(int[0], NORM, radius)) int = findIntersection(rot(bis31), rot(bis12), True, True) if int: radius = findDistance(int[0], edge1).Length intersections.append(Part.Circle(int[0], NORM, radius)) circles = [] for int in intersections: exists = False for cir in circles: if DraftVecUtils.equals(cir.Center, int.Center): exists = True break if not exists: circles.append(int) if circles: return circles else: return None
def circleFrom2LinesRadius(edge1, edge2, radius): """Retun a list of circles from two edges and one radius. It calculates 4 centers. """ intsec = findIntersection(edge1, edge2, True, True) if not intsec: return None intsec = intsec[0] bis12 = angleBisection(edge1, edge2) bis21 = Part.LineSegment(bis12.Vertexes[0].Point, DraftVecUtils.rotate(vec(bis12), math.pi/2.0)) ang12 = abs(DraftVecUtils.angle(vec(edge1), vec(edge2))) ang21 = math.pi - ang12 dist12 = radius / math.sin(ang12 * 0.5) dist21 = radius / math.sin(ang21 * 0.5) circles = [] cen = App.Vector.add(intsec, vec(bis12).multiply(dist12)) circles.append(Part.Circle(cen, NORM, radius)) cen = App.Vector.add(intsec, vec(bis12).multiply(-dist12)) circles.append(Part.Circle(cen, NORM, radius)) cen = App.Vector.add(intsec, vec(bis21).multiply(dist21)) circles.append(Part.Circle(cen, NORM, radius)) cen = App.Vector.add(intsec, vec(bis21).multiply(-dist21)) circles.append(Part.Circle(cen, NORM, radius)) return circles
def circlefrom2Lines1Point(edge1, edge2, point): """Return a list of circles from two edges and one point.""" bis = angleBisection(edge1, edge2) if not bis: return None mirrPoint = mirror(point, bis) return circlefrom1Line2Points(edge1, point, mirrPoint)
def circleFrom2LinesRadius(edge1, edge2, radius): """circleFrom2LinesRadius(edge,edge,radius)""" int = findIntersection(edge1, edge2, True, True) if not int: return None int = int[0] bis12 = angleBisection(edge1, edge2) bis21 = Part.LineSegment(bis12.Vertexes[0].Point, DraftVecUtils.rotate(vec(bis12), math.pi / 2.0)) ang12 = abs(DraftVecUtils.angle(vec(edge1), vec(edge2))) ang21 = math.pi - ang12 dist12 = radius / math.sin(ang12 * 0.5) dist21 = radius / math.sin(ang21 * 0.5) circles = [] cen = Vector.add(int, vec(bis12).multiply(dist12)) circles.append(Part.Circle(cen, NORM, radius)) cen = Vector.add(int, vec(bis12).multiply(-dist12)) circles.append(Part.Circle(cen, NORM, radius)) cen = Vector.add(int, vec(bis21).multiply(dist21)) circles.append(Part.Circle(cen, NORM, radius)) cen = Vector.add(int, vec(bis21).multiply(-dist21)) circles.append(Part.Circle(cen, NORM, radius)) return circles
def circlefrom2Lines1Point(edge1, edge2, point): """circlefrom2Lines1Point(edge, edge, Vector)""" bis = angleBisection(edge1, edge2) if not bis: return None mirrPoint = mirror(point, bis) return circlefrom1Line2Points(edge1, point, mirrPoint)