Exemplo n.º 1
0
    def process(self):

        if not any(s.is_linked for s in self.outputs):
            return
        params_in = [s.sv_get(deepcopy=False) for s in self.inputs[:4]]
        params_in.append(self.inputs['Fill / Stroke'].sv_get(deepcopy=False,
                                                             default=[[None]]))
        get_curves = self.outputs['Curves'].is_linked
        shapes_out = []
        curves_out = []
        for params in zip(*mlr(params_in)):
            shapes = []
            for loc, rad_x, rad_y, angle, atts in zip(*mlr(params)):
                shapes.append(SvgCircle(rad_x, rad_y, loc, angle, atts))

                if get_curves:
                    center = curve_matrix(loc, angle, rad_x, rad_y)
                    curve = SvCircle(center, rad_x)
                    curve.u_bounds = (0, 2 * pi)
                    curves_out.append(curve)
            if self.ungroup:
                shapes_out.extend(shapes)
            else:
                shapes_out.append(SvgGroup(shapes))
        self.outputs[0].sv_set(shapes_out)
        self.outputs[1].sv_set(curves_out)
Exemplo n.º 2
0
    def process(self):

        if not self.outputs[0].is_linked:
            return
        if self.mode == "CURVE":
            curves_in = self.inputs['Curve'].sv_get(deepcopy=False)
            atts_in = self.inputs['Fill / Stroke'].sv_get(deepcopy=False,
                                                          default=[[None]])
            if isinstance(curves_in[0], SvCurve):
                curves_in = [curves_in]

            groups = []
            for curves, atts in zip(*mlr([curves_in, atts_in])):
                curves_out = []
                for c, att in zip(*mlr([curves, atts])):
                    curves_out.append(SvgCurve(c, att, self))
                groups.append(SvgGroup(curves_out))
            self.outputs[0].sv_set(groups)
        else:
            verts_in = self.inputs['Vertices'].sv_get(deepcopy=True)
            commands_in = self.inputs['Commands'].sv_get(deepcopy=True)
            shapes = []
            atts_in = self.inputs['Fill / Stroke'].sv_get(deepcopy=False,
                                                          default=[[None]])
            for verts, commands, atts in zip(
                    *mlr([verts_in, commands_in, atts_in])):
                shapes.append(SvgPath(verts, commands, atts, self))
            self.outputs[0].sv_set(shapes)
Exemplo n.º 3
0
def perspective_projection(verts_in, plane_in, distance):
    verts_out = []
    z_coord_out = []
    for verts, plane in zip(*mlr([verts_in, plane_in])):
        origin = plane.decompose()[0]
        normal = ((plane @ Vector((0, 0, 1))) - origin).normalized()
        plane_point = origin
        focal_point = origin + normal * distance
        inverted_matrix = plane.inverted()

        vs = []
        zs = []
        for v in verts:
            v_v = Vector(v)
            ray = v_v - focal_point
            line_dir = ray.normalized()
            normal_dot_line_dir = normal.dot(line_dir)
            if normal_dot_line_dir == 0:
                new_v = v
            else:
                t = (normal.dot(plane_point) - normal.dot(v)) / normal_dot_line_dir
                new_v = v_v + (line_dir * t)

            point_2d = inverted_matrix @ new_v
            vs.append([point_2d[0], point_2d[1], 0])

            zs.append(ray.length)
        verts_out.append(vs)
        z_coord_out.append(zs)

    return verts_out, z_coord_out
Exemplo n.º 4
0
 def process(self):
     OutV, OutP = self.outputs
     if not OutV.is_linked:
         return
     VertA, PolA, VertB, PolB, VertN, PolN = self.inputs
     SMode = self.selected_mode
     out = []
     recursionlimit = sys.getrecursionlimit()
     sys.setrecursionlimit(10000)
     if not self.nest_objs:
         for v1, p1, v2, p2 in zip(*mlr(
             [VertA.sv_get(),
              PolA.sv_get(),
              VertB.sv_get(),
              PolB.sv_get()])):
             out.append(Boolean(v1, p1, v2, p2, SMode))
     else:
         vnest, pnest = VertN.sv_get(), PolN.sv_get()
         First = Boolean(vnest[0], pnest[0], vnest[1], pnest[1], SMode)
         if not self.out_last:
             out.append(First)
             for i in range(2, len(vnest)):
                 out.append(
                     Boolean(First[0], First[1], vnest[i], pnest[i], SMode))
                 First = out[-1]
         else:
             for i in range(2, len(vnest)):
                 First = Boolean(First[0], First[1], vnest[i], pnest[i],
                                 SMode)
             out.append(First)
     sys.setrecursionlimit(recursionlimit)
     OutV.sv_set([i[0] for i in out])
     if OutP.is_linked:
         OutP.sv_set([i[1] for i in out])
Exemplo n.º 5
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            solids_in = self.inputs[0].sv_get()
            points = self.inputs[1].sv_get()

            inside_mask = []
            inside_verts_out = []
            outside_verts_out = []
            for solid, points, in zip(*mlr([solids_in, points])):
                verts_inside = []
                verts_outside = []
                is_inside = []
                for v in points:
                    v_is_inside = solid.isInside(Base.Vector(v),
                                                 self.tolerance,
                                                 self.in_surface)
                    is_inside.append(v_is_inside)
                    if v_is_inside:
                        verts_inside.append(v)
                    else:
                        verts_outside.append(v)
                inside_mask.append(is_inside)
                inside_verts_out.append(verts_inside)
                outside_verts_out.append(verts_outside)

            self.outputs['Mask'].sv_set(inside_mask)
            self.outputs['Inside Vertices'].sv_set(inside_verts_out)
            self.outputs['Outside Vertices'].sv_set(outside_verts_out)
Exemplo n.º 6
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            verts_s = self.inputs[0].sv_get(deepcopy=False)
            faces_s = self.inputs[1].sv_get(deepcopy=False)
            solids = []
            faces = []
            for verts, faces in zip(*mlr([verts_s, faces_s])):
                tri_faces = ensure_triangles(verts, faces, True)
                faces_t = []
                for f in tri_faces:
                    faces_t.append([verts[c] for c in f])

                mesh = Mesh.Mesh(faces_t)
                shape = Part.Shape()
                shape.makeShapeFromMesh(mesh.Topology, self.precision)
                if self.refine_solid:
                    shape = shape.removeSplitter()
                solid = Part.makeSolid(shape)

                solids.append(solid)


            self.outputs['Solid'].sv_set(solids)
Exemplo n.º 7
0
        def standard_mesher(self):
            solids = self.inputs[self["shape_type"]].sv_get()
            surface_deviation = self.inputs["Surface Deviation"].sv_get()[0]
            angle_deviation = self.inputs["Angle Deviation"].sv_get()[0]
            verts = []
            faces = []
            for solid, s_dev, ang_dev in zip(
                    *mlr([solids, surface_deviation, angle_deviation])):
                if self.shape_type == 'Solid':
                    shape = solid
                else:
                    shape = solid.face

                mesh = MeshPart.meshFromShape(
                    Shape=shape,
                    LinearDeflection=s_dev,
                    AngularDeflection=math.radians(ang_dev),
                    Relative=self.relative_surface_deviation)

                verts.append([v[:] for v in mesh.Topology[0]])

                b_faces = mesh.Topology[1]
                b_faces = clean(b_faces).tolist() if is_triangles_only(
                    b_faces) else b_faces
                faces.append(b_faces)

            return verts, faces
Exemplo n.º 8
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            solids_in = self.inputs[0].sv_get(deepcopy=False)
            matrixes = self.inputs[1].sv_get(deepcopy=False)
            slices = []
            slices_face = []
            faces_add = slices_face.extend if self.flat_output else slices_face.append
            slices_add = slices.extend if self.flat_output else slices.append

            for solid, matrix in zip(*mlr([solids_in, matrixes])):

                location = matrix.decompose()[0]
                norm = (matrix @ Vector((0, 0, 1))) - location
                dist = norm.dot(location)

                wires = solid.slice(Base.Vector(norm), dist)
                edges_curves = []
                faces = []
                for wire in wires:
                    for edge in wire.Edges:
                        curve = SvSolidEdgeCurve(edge)
                        edges_curves.append(curve)

                if wires:
                    face = Part.Face(wires)
                    faces.append(SvSolidFaceSurface(face).to_nurbs())
                if faces:
                    faces_add(faces)
                if edges_curves:
                    slices_add(edges_curves)

            self.outputs['Edges'].sv_set(slices)
            self.outputs['Faces'].sv_set(slices_face)
Exemplo n.º 9
0
    def process(self):

        if not self.outputs[0].is_linked:
            return

        verts_in = self.inputs['Vertices'].sv_get(deepcopy=True)
        pols_in = self.inputs['Polygons / Edges'].sv_get(deepcopy=True)
        planes_in = self.inputs['Projection Plane'].sv_get(deepcopy=True,
                                                           default=[Matrix()])
        offset_in = self.inputs['Offset'].sv_get(deepcopy=True,
                                                 default=[Matrix()])
        atts_in = self.inputs['Fill / Stroke'].sv_get(deepcopy=False,
                                                      default=None)

        shapes = []
        verts_to_project = []
        if self.projection_mode == 'Orthogrphic':
            projection_func = ortho_projection_func_dict[self.projection_plane]
        else:
            projection_func = perspective_proyection

        for verts, pols, p_plane, offset, atts in zip(
                *mlr([verts_in, pols_in, planes_in, offset_in, atts_in])):

            verts_p = projection_func(verts, p_plane, offset)
            verts_to_project.append(verts_p)
            shapes.append(SvgMesh(verts_p, pols, atts, self))

        self.outputs[0].sv_set(shapes)
        self.outputs[1].sv_set(verts_to_project)
Exemplo n.º 10
0
 def process(self):
     OutV, OutP = self.outputs
     if not OutV.is_linked:
         return
     VertA, PolA, VertB, PolB, VertN, PolN = self.inputs
     SMode = self.selected_mode
     out = []
     if not self.nest_objs:
         for v1, p1, v2, p2 in zip(*mlr([VertA.sv_get(), PolA.sv_get(), VertB.sv_get(), PolB.sv_get()])):
             out.append(Boolean(v1, p1, v2, p2, SMode))
     else:
         vnest, pnest = VertN.sv_get(), PolN.sv_get()
         First = Boolean(vnest[0], pnest[0], vnest[1], pnest[1], SMode)
         if not self.out_last:
             out.append(First)
             for i in range(2, len(vnest)):
                 out.append(Boolean(First[0], First[1], vnest[i], pnest[i], SMode))
                 First = out[-1]
         else:
             for i in range(2, len(vnest)):
                 First = Boolean(First[0], First[1], vnest[i], pnest[i], SMode)
             out.append(First)
     OutV.sv_set([i[0] for i in out])
     if OutP.is_linked:
         OutP.sv_set([i[1] for i in out])
Exemplo n.º 11
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            solids_in = self.inputs[0].sv_get()
            radius_start_s = self.inputs[1].sv_get()[0]
            radius_end_s = self.inputs[2].sv_get()[0]
            mask_s = self.inputs[3].sv_get(default=[[1]])
            solids = []
            for solid, r_s, r_e, mask in zip(*mlr([solids_in, radius_start_s, radius_end_s, mask_s])):

                selected_edges = []
                fullList(mask, len(solid.Edges))

                for edge, m in zip(solid.Edges, mask):
                    if m:
                        selected_edges.append(edge)
                if selected_edges:
                    solid_o = solid.makeFillet(r_s, r_e, selected_edges)
                else:
                    solid_o = solid
                solids.append(solid_o)


            self.outputs['Solid'].sv_set(solids)
Exemplo n.º 12
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            solids_in = self.inputs[0].sv_get(deepcopy=False)
            offsets = self.inputs[1].sv_get(deepcopy=False)[0]

            solids = []
            for solid_base, offset in zip(*mlr([solids_in, offsets])):

                shape = solid_base.makeOffsetShape(offset,
                                                   self.tolerance,
                                                   inter=self.intersection,
                                                   join=self['join_type'])
                if self.refine_solid:
                    shape = shape.removeSplitter()
                try:
                    valid = shape.isValid()
                    solid = Part.makeSolid(shape)
                except Exception as e:
                    self.warning("Shape is not valid: %s: %s", shape, e)
                    continue

                solids.append(solid)

            self.outputs['Solid'].sv_set(solids)
Exemplo n.º 13
0
def draw_sorted_pols(verts, polygons, attributes, document, z_func):
    v_pols = []
    z_key = []
    svg = ''

    for p in polygons:
        v_pol = []
        z_c = []
        for c in p:
            v_pol.append(verts[c])
            z_c.append(verts[c][2])
        v_pols.append(v_pol)
        # z_key.append(sum(z_c)/len(z_c))
        z_key.append(z_func(z_c))
    sorted_v_pols = [x for _, x in sorted(zip(z_key, v_pols))]

    func = draw_edge if len(polygons[0]) < 3 else draw_pol
    scale = document.scale
    height = document.height
    for p, atts in zip(*mlr([sorted_v_pols, attributes])):
        svg += func(p, scale, height)

        if atts:
            svg += atts.draw(document)
        svg += '/>\n'
    return svg
Exemplo n.º 14
0
 def single_intersect(self):
     solids_a = self.inputs[0].sv_get()
     solids_b = self.inputs[1].sv_get()
     solids = []
     for solid_a, solid_b in zip(*mlr([solids_a, solids_b])):
         solids.append(solid_a.common(solid_b))
     self.outputs[0].sv_set(solids)
Exemplo n.º 15
0
    def process(self):

        if not self.outputs[0].is_linked:
            return
        params_in = [s.sv_get(deepcopy=False) for s in self.inputs[:4]]
        texts_out = []
        params_in.append(self.inputs['Fill / Stroke'].sv_get(deepcopy=False, default=None))

        font_family = self.user_font if self.font_family == 'user' else self.font_family
        print("process")
        for params in zip(*mlr(params_in)):
            svg_texts = []
            for loc, text, size, angle, atts  in zip(*mlr(params)):
                svg_texts.append(SvgText(loc, text, size, angle, self.weight, atts, font_family, self.font_alignment))

            texts_out.append(SvgGroup(svg_texts))

        self.outputs[0].sv_set(texts_out)
Exemplo n.º 16
0
        def single_difference(self):
            solids_a = self.inputs[0].sv_get()
            solids_b = self.inputs[1].sv_get()
            solids = []
            for solid_a, solid_b in zip(*mlr([solids_a, solids_b])):
                shape = solid_a.cut(solid_b)

                solids.append(shape)
            self.outputs[0].sv_set(solids)
Exemplo n.º 17
0
    def process(self):

        if not self.outputs[0].is_linked:
            return
        params_in = [
            s.sv_get(deepcopy=False, default=[[None]]) for s in self.inputs
        ]
        attributes_out = []
        for params in zip(*mlr(params_in)):
            attributes = []
            dash_pattern = params[-1]
            for fill_color, stroke_color, stroke_width in zip(
                    *mlr(params[:-1])):
                attributes.append(
                    SvgAttributes(fill_color, stroke_width, stroke_color,
                                  dash_pattern, self))
            attributes_out.append(attributes)
        self.outputs[0].sv_set(attributes_out)
Exemplo n.º 18
0
    def process(self):

        if not self.outputs[0].is_linked:
            return
        params_in = [s.sv_get(deepcopy=False) for s in self.inputs[:6]]
        texts_out = []
        params_in.append(self.inputs['Text Fill / Stroke'].sv_get(deepcopy=False, default=[[None]]))
        params_in.append(self.inputs['Lines Fill / Stroke'].sv_get(deepcopy=False, default=[[None]]))
        font_family = self.user_font if self.font_family == 'user' else self.font_family

        for params in zip(*mlr(params_in)):
            svg_texts = []

            for local_params in zip(*mlr(params)):
                svg_texts.append(SvgDimension(*local_params, font_family, self))

            texts_out.append(SvgGroup(svg_texts))

        self.outputs[0].sv_set(texts_out)
Exemplo n.º 19
0
 def single_union(self):
     solids_a = self.inputs[0].sv_get()
     solids_b = self.inputs[1].sv_get()
     solids = []
     for solid_a, solid_b in zip(*mlr([solids_a, solids_b])):
         solid_out = solid_a.fuse(solid_b)
         if self.refine_solid:
             solid_out = solid_out.removeSplitter()
         solids.append(solid_out)
     self.outputs[0].sv_set(solids)
Exemplo n.º 20
0
 def process(self):
     V1, V2, N, R = [i.sv_get() for i in self.inputs]
     out = []
     Co, ind, dist = self.outputs
     find_n = self.mode == "find_n"
     for v, v2, k in zip(V1, V2, (N if find_n else R)):
         kd = mathutils.kdtree.KDTree(len(v))
         for idx, co in enumerate(v):
             kd.insert(co, idx)
         kd.balance()
         if find_n:
             out.extend([kd.find_n(vert, num) for vert, num in zip(*mlr([v2, k]))])
         else:
             out.extend([kd.find_range(vert, dist) for vert, dist in zip(*mlr([v2, k]))])
     if Co.is_linked:
         Co.sv_set([[i[0][:] for i in i2] for i2 in out])
     if ind.is_linked:
         ind.sv_set([[i[1] for i in i2] for i2 in out])
     if dist.is_linked:
         dist.sv_set([[i[2] for i in i2] for i2 in out])
Exemplo n.º 21
0
def mefisto_mesher(solids, max_edge_length):

    verts = []
    faces = []
    for solid, max_edge in zip(*mlr([solids, max_edge_length])):
        mesh = MeshPart.meshFromShape(Shape=solid, MaxLength=max_edge)

        verts.append([v[:] for v in mesh.Topology[0]])
        faces.append(mesh.Topology[1])

    return verts, faces
Exemplo n.º 22
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            params = [s.sv_get()[0] for s in self.inputs]

            solids = []
            for rad, height, origin, direc, angle  in zip(*mlr(params)):
                cylinder = Part.makeCylinder(rad, height, Base.Vector(origin), Base.Vector(direc), angle)
                solids.append(cylinder)

            self.outputs['Solid'].sv_set(solids)
Exemplo n.º 23
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            solids_in = self.inputs[0].sv_get()
            matrixes = self.inputs[1].sv_get()
            solids = []
            for solid, matrix in zip(*mlr([solids_in, matrixes])):
                solid_o = transform_solid(matrix, solid)
                solids.append(solid_o)

            self.outputs['Solid'].sv_set(solids)
Exemplo n.º 24
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            p = [s.sv_get()[0] for s in self.inputs]

            solids = []
            for l, w, h, o, d in zip(*mlr(p)):
                box = Part.makeBox(l, w, h, Base.Vector(o), Base.Vector(d))
                solids.append(box)

            self.outputs['Solid'].sv_set(solids)
Exemplo n.º 25
0
def draw_pols(verts, polygons, attributes, document):
    svg = ''
    scale = document.scale
    height = document.height
    func = draw_edge if len(polygons[0]) < 3 else draw_pol
    for p, atts in zip(*mlr([polygons, attributes])):
        svg += func(verts_pol(p, verts), scale, height)

        if atts:
            svg += atts.draw(document)
        svg += '/>'

    return svg
Exemplo n.º 26
0
    def process(self):

        if not self.outputs[0].is_linked:
            return
        verts_in = self.inputs['Vertices'].sv_get(deepcopy=True)
        commands_in = self.inputs['Commands'].sv_get(deepcopy=True)
        shapes = []
        atts_in = self.inputs['Fill / Stroke'].sv_get(deepcopy=False,
                                                      default=None)
        for verts, commands, atts in zip(
                *mlr([verts_in, commands_in, atts_in])):
            shapes.append(SvgPath(verts, commands, atts, self))
        self.outputs[0].sv_set(shapes)
Exemplo n.º 27
0
        def mefisto_mesher(self):
            solids = self.inputs[0].sv_get()
            max_edge_length = self.inputs['Max Edge Length'].sv_get()[0]

            verts = []
            faces = []
            for solid, max_edge in zip(*mlr([solids, max_edge_length])):
                mesh = MeshPart.meshFromShape(Shape=solid, MaxLength=max_edge)

                verts.append([v[:] for v in mesh.Topology[0]])
                faces.append(mesh.Topology[1])

            return verts, faces
Exemplo n.º 28
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            params = [s.sv_get()[0] for s in self.inputs]

            solids = []
            for rad, rad_small, origin, direc, angle in zip(*mlr(params)):
                solid = Part.makeTorus(rad, rad_small, Base.Vector(origin),
                                       Base.Vector(direc), 0, 360, angle)
                solids.append(solid)

            self.outputs['Solid'].sv_set(solids)
Exemplo n.º 29
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            solids_in = self.inputs[0].sv_get()
            matrixes = self.inputs[1].sv_get()
            solids = []
            for solid, matrix in zip(*mlr([solids_in, matrixes])):
                mat = Base.Matrix(*[i for v in matrix for i in v])
                solid_o = solid.transformGeometry(mat)
                solids.append(solid_o)

            self.outputs['Solid'].sv_set(solids)
Exemplo n.º 30
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            p = [s.sv_get()[0] for s in self.inputs]

            solids = []
            for rad, ang1, ang2, ang3, origin, direc in zip(*mlr(p)):
                sphere = Part.makeSphere(rad, Base.Vector(origin),
                                         Base.Vector(direc), ang1, ang2, ang3)
                solids.append(sphere)

            self.outputs['Solid'].sv_set(solids)
Exemplo n.º 31
0
        def process(self):
            if not any(socket.is_linked for socket in self.outputs):
                return

            objects_a = self.inputs[self["mode"]].sv_get()
            objects_b = self.inputs[self["mode_b"] + 3].sv_get()

            distances_out = []
            closest_points_out_a = []
            infos_out_a = []
            closest_points_out_b = []
            infos_out_b = []

            for object_a, object_b, in zip(*mlr([objects_a, objects_b])):
                distances = []
                closest_points_a = []
                infos_a = []
                closest_points_b = []
                infos_b = []
                shape = get_shape(self.mode, object_a)

                if self.mode_b == 'Vertex':
                    for v in object_b:
                        vertex = Part.Vertex(Base.Vector(v))

                        dist = shape.distToShape(vertex)
                        distances.append(dist[0])
                        closest_points_a.append(dist[1][0][0][:])
                        infos_a.append(dist[2][0][0:3])
                else:
                    shape_b = get_shape(self.mode_b, object_b)

                    dist = shape.distToShape(shape_b)
                    distances.append(dist[0])
                    closest_points_a.append(dist[1][0][0][:])
                    infos_a.append(dist[2][0][0:3])
                    closest_points_b.append(dist[1][0][1][:])
                    infos_b.append(dist[2][0][3:])

                    closest_points_out_b.append(closest_points_b)
                    infos_out_b.append(infos_b)

                distances_out.append(distances)
                closest_points_out_a.append(closest_points_a)
                infos_out_a.append(infos_a)

            self.outputs['Distance'].sv_set(distances_out)
            self.outputs['Closest Point A'].sv_set(closest_points_out_a)
            self.outputs['Info A'].sv_set(infos_out_a)
            self.outputs['Closest Point B'].sv_set(closest_points_out_b)
            self.outputs['Info B'].sv_set(infos_out_b)
Exemplo n.º 32
0
 def process(self):
     BML, Verts, Edges, Polys, vermask, edgmask, angllim = self.inputs
     o1,o2,o3,o4,o5 = self.outputs
     angle = angllim.sv_get()[0]
     ret = []
     bmlist = BML.sv_get([])
     if Verts.is_linked:
         bmlist.extend([bmesh_from_pydata(verts, edges, faces, normal_update=True) for verts, edges, faces in zip(*mlr([Verts.sv_get(), Edges.sv_get([[]]), Polys.sv_get([[]])]))])
     if vermask.is_linked:
         verm = [np.array(bm.verts[:])[ma] for bm,ma in zip(bmlist,vermask.sv_get())]
     else:
         verm = [bm.verts for bm in bmlist]
     if edgmask.is_linked:
         edgm = [np.array(bm.edges[:])[ma] for bm,ma in zip(bmlist,edgmask.sv_get())]
     else:
         edgm = [bm.edges for bm in bmlist]
     udb, dlm = self.use_dissolve_boundaries, self.delimit
     for bm, ang, vm, em in zip(bmlist, safc(bmlist, angle), verm, edgm):
         # it's a little undocumented..
         ret.append(dissolve_limit(bm, angle_limit=ang, use_dissolve_boundaries=udb, verts=vm, edges=em, delimit=dlm)['region'])
     if o1.is_linked:
         o1.sv_set([[v.co[:] for v in bm.verts]for bm in bmlist])
     if o2.is_linked:
         o2.sv_set([[[i.index for i in e.verts] for e in bm.edges]for bm in bmlist])
     if o3.is_linked:
         o3.sv_set([[[i.index for i in p.verts] for p in bm.faces]for bm in bmlist])
     if o4.is_linked:
         o4.sv_set(ret)
     if o5.is_linked:
         o5.sv_set(bmlist)