| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | """Provides various functions to sort lists of edges.""" |
| | |
| | |
| | |
| |
|
| | import lazy_loader.lazy_loader as lz |
| |
|
| | from draftgeoutils.general import geomType |
| | from draftgeoutils.edges import findMidpoint, isLine, invert |
| |
|
| | |
| | Part = lz.LazyLoader("Part", globals(), "Part") |
| |
|
| | |
| | |
| |
|
| |
|
| | def sortEdges(edges): |
| | """Sort edges. Deprecated. Use Part.__sortEdges__ instead.""" |
| | raise DeprecationWarning("Deprecated. Use Part.__sortEdges__ instead") |
| |
|
| | if len(edges) < 2: |
| | return edges |
| |
|
| | |
| | |
| | |
| | sdict = dict() |
| | edict = dict() |
| | nedges = [] |
| | for e in edges: |
| | if hasattr(e, "Length"): |
| | if e.Length != 0: |
| | sdict.setdefault(e.Vertexes[0].hashCode(), []).append(e) |
| | edict.setdefault(e.Vertexes[-1].hashCode(), []).append(e) |
| | nedges.append(e) |
| |
|
| | if not nedges: |
| | print("DraftGeomUtils.sortEdges: zero-length edges") |
| | return edges |
| |
|
| | |
| | |
| | |
| | startedge = None |
| | for v, se in sdict.items(): |
| | if v not in edict and len(se) == 1: |
| | startedge = se |
| | break |
| |
|
| | |
| | |
| | if not startedge: |
| | for v, se in edict.items(): |
| | if v not in sdict and len(se) == 1: |
| | startedge = se |
| | break |
| |
|
| | |
| | |
| | if not startedge: |
| | startedge = nedges[0] |
| | v = startedge.Vertexes[0].hashCode() |
| |
|
| | |
| | |
| | |
| | |
| | ret = list() |
| | |
| | eh = None |
| | for _ in range(len(nedges)): |
| | try: |
| | eset = sdict[v] |
| | e = eset.pop() |
| | if not eset: |
| | del sdict[v] |
| | if e.hashCode() == eh: |
| | raise KeyError |
| | v = e.Vertexes[-1].hashCode() |
| | eh = e.hashCode() |
| | except KeyError: |
| | try: |
| | eset = edict[v] |
| | e = eset.pop() |
| | if not eset: |
| | del edict[v] |
| | if e.hashCode() == eh: |
| | raise KeyError |
| | v = e.Vertexes[0].hashCode() |
| | eh = e.hashCode() |
| | e = invert(e) |
| | except KeyError: |
| | print("DraftGeomUtils.sortEdges failed - running old version") |
| | return sortEdgesOld(edges) |
| | ret.append(e) |
| |
|
| | return ret |
| |
|
| |
|
| | def sortEdgesOld(lEdges, aVertex=None): |
| | """Sort edges. Deprecated. Use Part.__sortEdges__ instead.""" |
| | raise DeprecationWarning("Deprecated. Use Part.__sortEdges__ instead") |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | def lookfor(aVertex, inEdges): |
| | """Look for a vertex in the list of edges. |
| | |
| | Returns count, the position of the instance |
| | the position in the instance and the instance of the Edge. |
| | """ |
| | count = 0 |
| | linstances = [] |
| | for i in range(len(inEdges)): |
| | for j in range(2): |
| | if aVertex.Point == inEdges[i].Vertexes[j - 1].Point: |
| | instance = inEdges[i] |
| | count += 1 |
| | linstances += [i, j - 1, instance] |
| | return [count] + linstances |
| |
|
| | if len(lEdges) < 2: |
| | if aVertex is None: |
| | return lEdges |
| | else: |
| | result = lookfor(aVertex, lEdges) |
| | if result[0] != 0: |
| | if aVertex.Point == result[3].Vertexes[0].Point: |
| | return lEdges |
| | else: |
| | if geomType(result[3]) == "Line": |
| | return [ |
| | Part.LineSegment(aVertex.Point, result[3].Vertexes[0].Point).toShape() |
| | ] |
| | elif geomType(result[3]) == "Circle": |
| | mp = findMidpoint(result[3]) |
| | return [Part.Arc(aVertex.Point, mp, result[3].Vertexes[0].Point).toShape()] |
| | elif ( |
| | geomType(result[3]) == "BSplineCurve" |
| | or geomType(result[3]) == "BezierCurve" |
| | ): |
| | if isLine(result[3].Curve): |
| | return [ |
| | Part.LineSegment( |
| | aVertex.Point, result[3].Vertexes[0].Point |
| | ).toShape() |
| | ] |
| | else: |
| | return lEdges |
| | else: |
| | return lEdges |
| |
|
| | olEdges = [] |
| | if aVertex is None: |
| | for i in range(len(lEdges) * 2): |
| | if len(lEdges[i / 2].Vertexes) > 1: |
| | result = lookfor(lEdges[i / 2].Vertexes[i % 2], lEdges) |
| | if result[0] == 1: |
| | olEdges = sortEdgesOld(lEdges, result[3].Vertexes[result[2]]) |
| | return olEdges |
| | |
| | |
| | return sortEdgesOld(lEdges, lEdges[0].Vertexes[0]) |
| | else: |
| | |
| | result = lookfor(aVertex, lEdges) |
| | if result[0] != 0: |
| | del lEdges[result[1]] |
| | _next = sortEdgesOld(lEdges, result[3].Vertexes[-((-result[2]) ^ 1)]) |
| | |
| | |
| | if aVertex.Point == result[3].Vertexes[0].Point: |
| | |
| | olEdges += [result[3]] + _next |
| | else: |
| | |
| | if geomType(result[3]) == "Line": |
| | newedge = Part.LineSegment(aVertex.Point, result[3].Vertexes[0].Point).toShape() |
| | olEdges += [newedge] + _next |
| | elif geomType(result[3]) == "Circle": |
| | mp = findMidpoint(result[3]) |
| | newedge = Part.Arc(aVertex.Point, mp, result[3].Vertexes[0].Point).toShape() |
| | olEdges += [newedge] + _next |
| | elif geomType(result[3]) == "BSplineCurve" or geomType(result[3]) == "BezierCurve": |
| | if isLine(result[3].Curve): |
| | newedge = Part.LineSegment( |
| | aVertex.Point, result[3].Vertexes[0].Point |
| | ).toShape() |
| | olEdges += [newedge] + _next |
| | else: |
| | olEdges += [result[3]] + _next |
| | else: |
| | olEdges += [result[3]] + _next |
| | return olEdges |
| | else: |
| | return [] |
| |
|
| |
|
| | |
| |
|