Пример #1
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        vertices_s = self.inputs['Vertices'].sv_get()
        edges_s = self.inputs['Edges'].sv_get(default=[[]])
        faces_s = self.inputs['Faces'].sv_get(default=[[]])
        masks_s = self.inputs['FaceMask'].sv_get(default=[[1]])
        max_angle_s = self.inputs['MaxAngle'].sv_get()
        face_data_s = self.inputs['FaceData'].sv_get(default=[[]])

        verts_out = []
        edges_out = []
        faces_out = []
        face_data_out = []

        meshes = match_long_repeat(
            [vertices_s, edges_s, faces_s, masks_s, max_angle_s, face_data_s])
        for vertices, edges, faces, masks, max_angle, face_data in zip(
                *meshes):
            if self.split_mode == 'NONPLANAR':
                if isinstance(max_angle, (list, tuple)):
                    max_angle = max_angle[0]

            fullList(masks, len(faces))
            if face_data:
                fullList(face_data, len(faces))

            bm = bmesh_from_pydata(vertices,
                                   edges,
                                   faces,
                                   normal_update=True,
                                   markup_face_data=True)
            bm_faces = [face for mask, face in zip(masks, bm.faces[:]) if mask]

            if self.split_mode == 'NONPLANAR':
                new_geom = bmesh.ops.connect_verts_nonplanar(
                    bm, angle_limit=radians(max_angle), faces=bm_faces)
            else:
                new_geom = bmesh.ops.connect_verts_concave(bm, faces=bm_faces)

            new_verts, new_edges, new_faces = pydata_from_bmesh(bm)
            #new_edges, new_faces = get_bm_geom(new_geom)
            if not face_data:
                new_face_data = []
            else:
                new_face_data = face_data_from_bmesh_faces(bm, face_data)

            verts_out.append(new_verts)
            edges_out.append(new_edges)
            faces_out.append(new_faces)
            face_data_out.append(new_face_data)

        self.outputs['Vertices'].sv_set(verts_out)
        self.outputs['Edges'].sv_set(edges_out)
        self.outputs['Faces'].sv_set(faces_out)
        self.outputs['FaceData'].sv_set(face_data_out)
Пример #2
0
def remove_doubles(vertices,
                   faces,
                   distance,
                   face_data=None,
                   find_doubles=False,
                   mask=[],
                   output_mask=False):

    if faces:
        edge_mode = (len(faces[0]) == 2)
    else:
        edge_mode = False
    if face_data:
        mark_face_data = True
    else:
        mark_face_data = False

    bm = bmesh_from_pydata(vertices,
                           faces if edge_mode else [],
                           [] if edge_mode else faces,
                           markup_face_data=mark_face_data,
                           markup_vert_data=output_mask)
    bm_verts = bm.verts

    if mask:
        mask_full = chain(mask, repeat(mask[-1]))
        bm_verts = [v for v, m in zip(bm_verts, mask_full) if m]

    if find_doubles:
        res = bmesh.ops.find_doubles(bm, verts=bm_verts, dist=distance)
        doubles = [vert.co[:] for vert in res['targetmap'].keys()]
    else:
        doubles = []

    bmesh.ops.remove_doubles(bm, verts=bm_verts, dist=distance)
    edges = []
    faces = []
    face_data_out = []
    bm.verts.index_update()
    verts = [vert.co[:] for vert in bm.verts[:]]

    bm.edges.index_update()
    bm.faces.index_update()
    for edge in bm.edges[:]:
        edges.append([v.index for v in edge.verts[:]])
    for face in bm.faces:
        faces.append([v.index for v in face.verts[:]])
    if face_data:
        face_data_out = face_data_from_bmesh_faces(bm, face_data)
    if mask and output_mask:
        mask_out = vert_data_from_bmesh_verts(bm, mask)
    else:
        mask_out = []

    bm.clear()
    bm.free()
    return (verts, edges, faces, face_data_out, doubles, mask_out)
Пример #3
0
    def process(self):
        if not any(socket.is_linked for socket in self.outputs):
            return

        vertices_s = self.inputs['Vertices'].sv_get()
        edges_s = self.inputs['Edges'].sv_get(default=[[]])
        faces_s = self.inputs['Faces'].sv_get(default=[[]])
        masks_s = self.inputs['FaceMask'].sv_get(default=[[1]])
        face_data_s = self.inputs['FaceData'].sv_get(default=[[]])
        offset_s = self.inputs['Offset'].sv_get()

        verts_out = []
        edges_out = []
        faces_out = []
        face_data_out = []

        meshes = zip_long_repeat(vertices_s, edges_s, faces_s, offset_s,
                                 masks_s, face_data_s)
        for vertices, edges, faces, offset, masks, face_data in meshes:
            if isinstance(offset, (list, tuple)):
                offset = offset[0]
            masks = repeat_last_for_length(masks, len(faces))
            if face_data:
                face_data = repeat_last_for_length(face_data, len(faces))

            bm = bmesh_from_pydata(vertices,
                                   edges,
                                   faces,
                                   normal_update=True,
                                   markup_face_data=True)
            bm_faces = [face for mask, face in zip(masks, bm.faces[:]) if mask]

            bmesh.ops.poke(bm,
                           faces=bm_faces,
                           offset=offset,
                           center_mode=self.mode,
                           use_relative_offset=self.offset_relative)

            new_verts, new_edges, new_faces = pydata_from_bmesh(bm)
            if not face_data:
                new_face_data = []
            else:
                new_face_data = face_data_from_bmesh_faces(bm, face_data)
            bm.free()

            verts_out.append(new_verts)
            edges_out.append(new_edges)
            faces_out.append(new_faces)
            face_data_out.append(new_face_data)

        self.outputs['Vertices'].sv_set(verts_out)
        self.outputs['Edges'].sv_set(edges_out)
        self.outputs['Faces'].sv_set(faces_out)
        self.outputs['FaceData'].sv_set(face_data_out)