Beispiel #1
0
    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()
Beispiel #2
0
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
Beispiel #3
0
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