def trimObjects(self, objectslist): """Attempt to trim two objects together.""" import Part import DraftGeomUtils wires = [] for obj in objectslist: if not utils.getType(obj) in ["Wire", "Circle"]: _err( translate( "draft", "Unable to trim these objects, " "only Draft wires and arcs are supported.")) return if len(obj.Shape.Wires) > 1: _err( translate( "draft", "Unable to trim these objects, " "too many wires")) return if len(obj.Shape.Wires) == 1: wires.append(obj.Shape.Wires[0]) else: wires.append(Part.Wire(obj.Shape.Edges)) ints = [] edge1 = None edge2 = None for i1, e1 in enumerate(wires[0].Edges): for i2, e2 in enumerate(wires[1].Edges): i = DraftGeomUtils.findIntersection(e1, e2, dts=False) if len(i) == 1: ints.append(i[0]) edge1 = i1 edge2 = i2 if not ints: _err(translate("draft", "These objects don't intersect.")) return if len(ints) != 1: _err(translate("draft", "Too many intersection points.")) return v11 = wires[0].Vertexes[0].Point v12 = wires[0].Vertexes[-1].Point v21 = wires[1].Vertexes[0].Point v22 = wires[1].Vertexes[-1].Point if DraftVecUtils.closest(ints[0], [v11, v12]) == 1: last1 = True else: last1 = False if DraftVecUtils.closest(ints[0], [v21, v22]) == 1: last2 = True else: last2 = False for i, obj in enumerate(objectslist): if i == 0: ed = edge1 la = last1 else: ed = edge2 la = last2 if utils.getType(obj) == "Wire": if la: pts = obj.Points[:ed + 1] + ints else: pts = ints + obj.Points[ed + 1:] obj.Points = pts else: vec = ints[0].sub(obj.Placement.Base) vec = obj.Placement.inverse().Rotation.multVec(vec) _x = App.Vector(1, 0, 0) _ang = -DraftVecUtils.angle(vec, obj.Placement.Rotation.multVec(_x), obj.Shape.Edges[0].Curve.Axis) ang = math.degrees(_ang) if la: obj.LastAngle = ang else: obj.FirstAngle = ang self.doc.recompute()
def connect(edges, closed=False): """Connect the edges in the given list by their intersections.""" nedges = [] v2 = None for i in range(len(edges)): curr = edges[i] # print("debug: DraftGeomUtils.connect edge ", i, " : ", # curr.Vertexes[0].Point, curr.Vertexes[-1].Point) if i > 0: prev = edges[i - 1] else: if closed: prev = edges[-1] else: prev = None if i < (len(edges) - 1): _next = edges[i + 1] else: if closed: _next = edges[0] else: _next = None if prev: # print("debug: DraftGeomUtils.connect prev : ", # prev.Vertexes[0].Point, prev.Vertexes[-1].Point) # If the edge pairs has intersection and if there is prev v2 # (prev v2 was calculated intersection), do not calculate # again, just use it as current v1 - avoid chance of slight # difference in result. And, if edge pairs # has no intersection (parallel edges, line # - arc do no intersect, etc.), so just just current # edge endpoints as v1 and connect these 2 non-intersecting # edges # Seem have chance that 2 parallel edges offset same width, # result in 2 colinear edges - Wall / DraftGeomUtils # seem make them 1 edge and thus 1 vertical plane i = findIntersection(curr, prev, True, True) if i: if v2: v1 = v2 else: v1 = i[DraftVecUtils.closest(curr.Vertexes[0].Point, i)] else: v1 = curr.Vertexes[0].Point nedges.append(Part.LineSegment(v2, v1).toShape()) else: v1 = curr.Vertexes[0].Point if _next: # print("debug: DraftGeomUtils.connect _next : ", # _next.Vertexes[0].Point, _next.Vertexes[-1].Point) i = findIntersection(curr, _next, True, True) if i: v2 = i[DraftVecUtils.closest(curr.Vertexes[-1].Point, i)] else: v2 = curr.Vertexes[-1].Point else: v2 = curr.Vertexes[-1].Point if geomType(curr) == "Line": if v1 != v2: nedges.append(Part.LineSegment(v1, v2).toShape()) elif geomType(curr) == "Circle": if v1 != v2: nedges.append(Part.Arc(v1, findMidpoint(curr), v2).toShape()) try: return Part.Wire(nedges) except: print("DraftGeomUtils.connect: unable to connect edges") for e in nedges: print(e.Curve, " ", e.Vertexes[0].Point, " ", e.Vertexes[-1].Point) return None
def connect(edges, closed=False): """Connect the edges in the given list by their intersections.""" inters_list = [] # List of intersections (with the previous edge). for i, curr in enumerate(edges): if i > 0: prev = edges[i - 1] elif closed: prev = edges[-1] else: inters_list.append(None) continue curr_inters_list = (findIntersection(prev, curr, True, True)) if len(curr_inters_list) == 0: inters_list.append(None) elif len(curr_inters_list) == 1: inters_list.append(curr_inters_list[0]) else: inters = curr_inters_list[DraftVecUtils.closest( curr.Vertexes[0].Point, curr_inters_list)] inters_list.append(inters) new_edges = [] for i, curr in enumerate(edges): curr_sta = inters_list[i] if i < (len(edges) - 1): curr_end = inters_list[i + 1] elif closed: curr_end = inters_list[0] else: curr_end = None if curr_sta is None: curr_sta = curr.Vertexes[0].Point if i > 0: prev = edges[i - 1] elif closed: prev = edges[-1] else: prev = None if prev is not None: prev_end = prev.Vertexes[-1].Point new_edges.append( Part.LineSegment(prev_end, curr_sta).toShape()) if curr_end is None: curr_end = curr.Vertexes[-1].Point if curr_sta != curr_end: if geomType(curr) == "Line": new_edges.append( Part.LineSegment(curr_sta, curr_end).toShape()) elif geomType(curr) == "Circle": new_edges.append( Part.Arc(curr_sta, findMidpoint(curr), curr_end).toShape()) try: return Part.Wire(new_edges) except Part.OCCError: print("DraftGeomUtils.connect: unable to connect edges") for edge in new_edges: print(edge.Curve, " ", edge.Vertexes[0].Point, " ", edge.Vertexes[-1].Point) return None