def cleanedges(splines, precision): '''cleanedges([splines],precision). Convert BSpline curves, Beziers, to arcs that can be used for cnc paths. Returns Lines as is. Filters Circle and Arcs for over 180 degrees. Discretizes Ellipses. Ignores other geometry. ''' edges = [] for spline in splines: if geomType(spline) == "BSplineCurve": arcs = spline.Curve.toBiArcs(precision) for i in arcs: edges.append(Part.Edge(i)) elif geomType(spline) == "BezierCurve": newspline = spline.Curve.toBSpline() arcs = newspline.toBiArcs(precision) for i in arcs: edges.append(Part.Edge(i)) elif geomType(spline) == "Ellipse": edges = curvetowire(spline, 1.0) #fixme hardcoded value elif geomType(spline) == "Circle": #arcs=filterArcs(spline) edges.append(spline) elif geomType(spline) == "Line": edges.append(spline) else: pass return edges
def cleanedges(splines, precision): '''cleanedges([splines],precision). Convert BSpline curves, Beziers, to arcs that can be used for cnc paths. Returns Lines as is. Filters Circle and Arcs for over 180 degrees. Discretizes Ellipses. Ignores other geometry. ''' edges = [] for spline in splines: if geomType(spline) == "BSplineCurve": arcs = spline.Curve.toBiArcs(precision) for i in arcs: edges.append(Part.Edge(i)) elif geomType(spline) == "BezierCurve": newspline = spline.Curve.toBSpline() arcs = newspline.toBiArcs(precision) for i in arcs: edges.append(Part.Edge(i)) elif geomType(spline) == "Ellipse": edges = curvetowire(spline, 1.0) # fixme hardcoded value elif geomType(spline) == "Circle": arcs = filterArcs(spline) for i in arcs: edges.append(Part.Edge(i)) elif geomType(spline) == "Line": edges.append(spline) else: pass return edges
def SortPath(wire, Side, radius, clockwise, firstedge=None, SegLen=0.5): """SortPath(wire,Side,radius,clockwise,firstedge=None,SegLen =0.5) Sorts the wire and reverses it, if needed. Splits arcs over 180 degrees in two. Returns the reordered offset of the wire. """ if firstedge: edgelist = wire.Edges[:] if wire.isClosed(): elindex = None n = 0 for e in edgelist: if isSameEdge(e, firstedge): # FreeCAD.Console.PrintMessage('found first edge\n') elindex = n n = n + 1 l1 = edgelist[:elindex] l2 = edgelist[elindex:] newedgelist = l2 + l1 if clockwise: newedgelist.reverse() last = newedgelist.pop(-1) newedgelist.insert(0, last) preoffset = [] for e in newedgelist: if clockwise: r = reverseEdge(e) preoffset.append(r) else: preoffset.append(e) sortedpreoff = DraftGeomUtils.sortEdgesOld(preoffset) wire = Part.Wire(sortedpreoff) else: sortedpreoff = DraftGeomUtils.sortEdgesOld(edgelist) wire = Part.Wire(sortedpreoff) edgelist = [] for e in wire.Edges: if geomType(e) == "Circle": arclist = filterArcs(e) for a in arclist: edgelist.append(a) elif geomType(e) == "Line": edgelist.append(e) elif geomType(e) == "BSplineCurve" or geomType(e) == "BezierCurve" or geomType(e) == "Ellipse": edgelist.append(Part.Wire(curvetowire(e, (SegLen)))) newwire = Part.Wire(edgelist) if Side == "Left": # we use the OCC offset feature offset = newwire.makeOffset(radius) # tool is outside line elif Side == "Right": offset = newwire.makeOffset(-radius) # tool is inside line else: if wire.isClosed(): offset = newwire.makeOffset(0.0) else: offset = newwire return offset
def reverseEdge(e): if geomType(e) == "Circle": arcstpt = e.valueAt(e.FirstParameter) arcmid = e.valueAt((e.LastParameter - e.FirstParameter) * 0.5 + e.FirstParameter) arcendpt = e.valueAt(e.LastParameter) arcofCirc = Part.ArcOfCircle(arcendpt, arcmid, arcstpt) newedge = arcofCirc.toShape() elif geomType(e) == "LineSegment" or geomType(e) == "Line": stpt = e.valueAt(e.FirstParameter) endpt = e.valueAt(e.LastParameter) newedge = Part.makeLine(endpt, stpt) return newedge
def SortPath(wire, Side, radius, clockwise, firstedge=None, SegLen=0.5): '''SortPath(wire,Side,radius,clockwise,firstedge=None,SegLen =0.5) Sorts the wire and reverses it, if needed. Splits arcs over 180 degrees in two. Returns the reordered offset of the wire. ''' if firstedge: edgelist = wire.Edges[:] if wire.isClosed(): elindex = None n = 0 for e in edgelist: if isSameEdge(e, firstedge): # FreeCAD.Console.PrintMessage('found first edge\n') elindex = n n = n + 1 l1 = edgelist[:elindex] l2 = edgelist[elindex:] newedgelist = l2 + l1 if clockwise: newedgelist.reverse() last = newedgelist.pop(-1) newedgelist.insert(0, last) preoffset = [] for e in newedgelist: if clockwise: r = reverseEdge(e) preoffset.append(r) else: preoffset.append(e) sortedpreoff = Part.__sortEdges__(preoffset) wire = Part.Wire(sortedpreoff) else: sortedpreoff = Part.__sortEdges__(edgelist) wire = Part.Wire(sortedpreoff) edgelist = [] for e in wire.Edges: if geomType(e) == "Circle": arclist = filterArcs(e) for a in arclist: edgelist.append(a) elif geomType(e) == "Line": edgelist.append(e) elif geomType(e) == "BSplineCurve" or \ geomType(e) == "BezierCurve" or \ geomType(e) == "Ellipse": edgelist.append(Part.Wire(curvetowire(e, (SegLen)))) newwire = Part.Wire(edgelist) if Side == 'Left': # we use the OCC offset feature offset = newwire.makeOffset(radius) #tool is outside line elif Side == 'Right': offset = newwire.makeOffset(-radius) #tool is inside line else: if wire.isClosed(): offset = newwire.makeOffset(0.0) else: offset = newwire return offset
def SortPath(wire, Side, radius, clockwise, firstedge=None, SegLen=0.5): '''SortPath(wire,Side,radius,clockwise,firstedge=None,SegLen =0.5) Sorts the wire and reverses it, if needed. Splits arcs over 180 degrees in two. Returns the reordered offset of the wire. ''' if firstedge: edgelist = wire.Edges[:] if wire.isClosed(): elindex = None n = 0 for e in edgelist: if isSameEdge(e, firstedge): # FreeCAD.Console.PrintMessage('found first edge\n') elindex = n n = n + 1 l1 = edgelist[:elindex] l2 = edgelist[elindex:] newedgelist = l2 + l1 if clockwise: newedgelist.reverse() last = newedgelist.pop(-1) newedgelist.insert(0, last) preoffset = [] for e in newedgelist: if clockwise: r = reverseEdge(e) preoffset.append(r) else: preoffset.append(e) sortedpreoff = Part.__sortEdges__(preoffset) wire = Part.Wire(sortedpreoff) #wire = findWires(sortedpreoff)[0] else: sortedpreoff = Part.__sortEdges__(edgelist) wire = Part.Wire(sortedpreoff) #wire = findWires(sortedpreoff)[0] edgelist = [] for e in wire.Edges: if geomType(e) == "Circle": arclist = filterArcs(e) for a in arclist: edgelist.append(a) elif geomType(e) == "Line": edgelist.append(e) elif geomType(e) == "BSplineCurve" or \ geomType(e) == "BezierCurve" or \ geomType(e) == "Ellipse": edgelist.append(Part.Wire(curvetowire(e, (SegLen)))) #newwire = Part.Wire(edgelist) sortededges = Part.__sortEdges__(edgelist) newwire = findWires(sortededges)[0] print "newwire is clockwise: " + str(is_clockwise(newwire)) if is_clockwise(newwire) is not clockwise: newwire.reverse() print "newwire is clockwise: " + str(is_clockwise(newwire)) if Side == 'Left': # we use the OCC offset feature offset = newwire.makeOffset(radius) # tool is outside line elif Side == 'Right': offset = newwire.makeOffset(-radius) # tool is inside line else: if wire.isClosed(): offset = newwire.makeOffset(0.0) else: offset = newwire print "offset wire is clockwise: " + str(is_clockwise(offset)) offset.reverse() print "offset wire is clockwise: " + str(is_clockwise(offset)) return offset