def process(self): if not any(output.is_linked for output in self.outputs): return verts_recpt_s = self.inputs['VersR'].sv_get(deepcopy=False) faces_recpt_s = self.inputs['PolsR'].sv_get(default=[[]], deepcopy=False) verts_donor_s = self.inputs['VersD'].sv_get() faces_donor_s = self.inputs['PolsD'].sv_get() zcoefs_s = self.inputs['Z_Coef'].sv_get(deepcopy=False) zoffsets_s = self.inputs['Z_Offset'].sv_get(deepcopy=False) zrotations_s = self.inputs['Z_Rotation'].sv_get(deepcopy=False) wcoefs_s = self.inputs['W_Coef'].sv_get(deepcopy=False) if 'FrameWidth' in self.inputs: frame_widths_s = self.inputs['FrameWidth'].sv_get(deepcopy=True) else: frame_widths_s = [[0.5]] if 'PolyRotation' in self.inputs: facerots_s = self.inputs['PolyRotation'].sv_get(default = [[0]], deepcopy=False) else: facerots_s = [[0]] mask_s = self.inputs['PolyMask'].sv_get(default = [[1]], deepcopy=False) output = OutputData() if self.matching_mode == 'PERFACE': verts_donor_s = [verts_donor_s] faces_donor_s = [faces_donor_s] #self.info("FW: %s", frame_widths_s) #frame_widths_s = [frame_widths_s] objects = match_long_repeat([verts_recpt_s, faces_recpt_s, verts_donor_s, faces_donor_s, frame_widths_s, zcoefs_s, zoffsets_s, zrotations_s, wcoefs_s, facerots_s, mask_s]) #self.info("N objects: %s", len(list(zip(*objects)))) for verts_recpt, faces_recpt, verts_donor, faces_donor, frame_widths, zcoefs, zoffsets, zrotations, wcoefs, facerots, mask in zip(*objects): n_faces_recpt = len(faces_recpt) fullList(zcoefs, n_faces_recpt) fullList(zoffsets, n_faces_recpt) fullList(zrotations, n_faces_recpt) if get_data_nesting_level(frame_widths) < 1: frame_widths = [frame_widths] fullList(frame_widths, n_faces_recpt) fullList(wcoefs, n_faces_recpt) fullList(facerots, n_faces_recpt) mask = cycle_for_length(mask, n_faces_recpt) new = self._process(verts_recpt, faces_recpt, verts_donor, faces_donor, frame_widths, zcoefs, zoffsets, zrotations, wcoefs, facerots, mask) output.verts_out.extend(new.verts_out) output.faces_out.extend(new.faces_out) output.verts_out = Vector_degenerate(output.verts_out) if self.join: output.verts_out, _, output.faces_out = mesh_join(output.verts_out, [], output.faces_out) output.verts_out = [output.verts_out] output.faces_out = [output.faces_out] self.outputs['Vertices'].sv_set(output.verts_out) self.outputs['Polygons'].sv_set(output.faces_out)
def process(self): if not any(output.is_linked for output in self.outputs): return verts_recpt_s = self.inputs['VersR'].sv_get(deepcopy=False) faces_recpt_s = self.inputs['PolsR'].sv_get(default=[[]], deepcopy=False) verts_donor_s = self.inputs['VersD'].sv_get() faces_donor_s = self.inputs['PolsD'].sv_get() if 'FaceDataD' in self.inputs: face_data_donor_s = self.inputs['FaceDataD'].sv_get(default=[[]]) else: face_data_donor_s = [[]] zcoefs_s = self.inputs['Z_Coef'].sv_get(deepcopy=False) zoffsets_s = self.inputs['Z_Offset'].sv_get(deepcopy=False) zrotations_s = self.inputs['Z_Rotation'].sv_get(deepcopy=False) wcoefs_s = self.inputs['W_Coef'].sv_get(deepcopy=False) if 'FrameWidth' in self.inputs: frame_widths_s = self.inputs['FrameWidth'].sv_get(deepcopy=True) else: frame_widths_s = [[0.5]] if 'PolyRotation' in self.inputs: facerots_s = self.inputs['PolyRotation'].sv_get(default = [[0]], deepcopy=False) else: facerots_s = [[0]] mask_s = self.inputs['PolyMask'].sv_get(default = [[1]], deepcopy=False) if 'Threshold' in self.inputs: thresholds_s = self.inputs['Threshold'].sv_get() else: thresholds_s = [[self.threshold]] output = OutputData() if self.matching_mode == 'PERFACE': verts_donor_s = [verts_donor_s] faces_donor_s = [faces_donor_s] face_data_donor_s = [face_data_donor_s] #self.info("FW: %s", frame_widths_s) #frame_widths_s = [frame_widths_s] objects = match_long_repeat([verts_recpt_s, faces_recpt_s, verts_donor_s, faces_donor_s, face_data_donor_s, frame_widths_s, zcoefs_s, zoffsets_s, zrotations_s, wcoefs_s, facerots_s, mask_s, thresholds_s]) #self.info("N objects: %s", len(list(zip(*objects)))) for verts_recpt, faces_recpt, verts_donor, faces_donor, face_data_donor, frame_widths, zcoefs, zoffsets, zrotations, wcoefs, facerots, mask, threshold in zip(*objects): n_faces_recpt = len(faces_recpt) fullList(zcoefs, n_faces_recpt) fullList(zoffsets, n_faces_recpt) fullList(zrotations, n_faces_recpt) if get_data_nesting_level(frame_widths) < 1: frame_widths = [frame_widths] fullList(frame_widths, n_faces_recpt) fullList(wcoefs, n_faces_recpt) fullList(facerots, n_faces_recpt) mask = cycle_for_length(mask, n_faces_recpt) if isinstance(threshold, (list, tuple)): threshold = threshold[0] new = self._process(verts_recpt, faces_recpt, verts_donor, faces_donor, face_data_donor, frame_widths, zcoefs, zoffsets, zrotations, wcoefs, facerots, mask) output.verts_out.extend(new.verts_out) output.faces_out.extend(new.faces_out) output.face_data_out.extend(new.face_data_out) output.vert_recpt_idx_out.extend(new.vert_recpt_idx_out) output.face_recpt_idx_out.extend(new.face_recpt_idx_out) output.verts_out = Vector_degenerate(output.verts_out) if self.join: output.verts_out, _, output.faces_out = mesh_join(output.verts_out, [], output.faces_out) output.face_data_out = sum(output.face_data_out, []) output.vert_recpt_idx_out = sum(output.vert_recpt_idx_out, []) output.face_recpt_idx_out = sum(output.face_recpt_idx_out, []) if self.remove_doubles: doubles_res = remove_doubles(output.verts_out, [], output.faces_out, threshold, face_data=output.face_data_out, vert_data=output.vert_recpt_idx_out) if len(doubles_res) == 4: output.verts_out, _, output.faces_out, data_out = doubles_res else: output.verts_out, _, output.faces_out = doubles_res data_out = dict() output.vert_recpt_idx_out = data_out.get('verts', []) if output.face_recpt_idx_out: output.face_recpt_idx_out = [output.face_recpt_idx_out[idx] for idx in data_out['face_init_index']] output.verts_out = [output.verts_out] output.faces_out = [output.faces_out] output.face_data_out = [output.face_data_out] output.vert_recpt_idx_out = [output.vert_recpt_idx_out] output.face_recpt_idx_out = [output.face_recpt_idx_out] self.outputs['Vertices'].sv_set(output.verts_out) self.outputs['Polygons'].sv_set(output.faces_out) if 'FaceData' in self.outputs: self.outputs['FaceData'].sv_set(output.face_data_out) if 'VertRecptIdx' in self.outputs: self.outputs['VertRecptIdx'].sv_set(output.vert_recpt_idx_out) if 'FaceRecptIdx' in self.outputs: self.outputs['FaceRecptIdx'].sv_set(output.face_recpt_idx_out)
def process(self): if not any(s.is_linked for s in self.outputs): return verts_in = self.inputs['Vertices'].sv_get() edges_in = self.inputs['Edges'].sv_get() offset_in = self.inputs['Offset'].sv_get() step_in = self.inputs['Step'].sv_get() n_connections_in = self.inputs['NConnections'].sv_get() max_rhos_in = self.inputs['MaxRho'].sv_get() count_in = self.inputs['Count'].sv_get() length_in = self.inputs['Length'].sv_get() if self.z_mode == 'CURVE': curves_in = self.inputs['Curve'].sv_get() else: curves_in = [[]] verts_out = [] edges_out = [] faces_out = [] Z = self.get_orientation_vector() if self.z_mode == 'AXIS': z_idx = 'XYZ'.index(self.orient_axis) else: z_idx = None objects = match_long_repeat([ verts_in, edges_in, offset_in, step_in, n_connections_in, max_rhos_in, count_in, length_in, curves_in ]) for verts, edges, offsets, steps, n_connections, max_rhos, counts, lengths, curves in zip( *objects): nverts = len(verts) offsets = cycle_for_length(offsets, nverts) steps = cycle_for_length(steps, nverts) n_connections = cycle_for_length(n_connections, nverts) max_rhos = cycle_for_length(max_rhos, nverts) if self.len_mode == 'COUNT': counts = cycle_for_length(counts, nverts) lengths = [None for i in range(nverts)] else: counts = [None for i in range(nverts)] lengths = cycle_for_length(lengths, nverts) if curves: curves = cycle_for_length(curves, nverts) bm = bmesh.new() bm.verts.ensure_lookup_table() verts_bm = [] for i, v in enumerate(verts): if self.z_mode == 'AXIS': verts_line = make_verts_axis(v, Z, self.make_basis, steps[i] * offsets[i], steps[i], counts[i], lengths[i]) else: verts_line = make_verts_curve(v, curves[i]) verts_line_bm = [] prev_bm_vert = None new_vert = bm.verts.new new_edge = bm.edges.new for v in verts_line: bm_vert = new_vert(v) verts_line_bm.append(bm_vert) bm.verts.ensure_lookup_table() if prev_bm_vert is not None: new_edge((prev_bm_vert, bm_vert)) prev_bm_vert = bm_vert verts_bm.append(verts_line_bm) for i, j in edges: process_edge(bm, z_idx, verts_bm[i], verts_bm[j], steps[i], steps[j], n_connections[i], n_connections[j], max_rhos[i], max_rhos[j]) verts_new, edges_new, _ = pydata_from_bmesh(bm) bm.free() verts_new, edges_new = intersect_edges_3d(verts_new, edges_new, 1e-3) verts_new, edges_new, _ = remove_doubles(verts_new, edges_new, [], 1e-3) if self.outputs['Faces'].is_linked: bm = bmesh_from_pydata(verts_new, edges_new, [], normal_update=True) if self.z_mode == 'AXIS': for i, j in edges: side_edges = [] v_i = Vector(verts[i]) v_j = Vector(verts[j]) #self.info("Check: [%s - %s]", v_i, v_j) for bm_edge in bm.edges: bm_v1 = bm_edge.verts[0].co bm_v2 = bm_edge.verts[1].co if self.is_same_edge(bm_v1, bm_v2, v_i, v_j): side_edges.append(bm_edge) #self.info("Yes: [%s - %s]", bm_v1, bm_v2) else: pass #self.info("No: [%s - %s]", bm_v1, bm_v2) bmesh.ops.holes_fill(bm, edges=side_edges, sides=4) bm.edges.ensure_lookup_table() bm.faces.ensure_lookup_table() else: bmesh.ops.holes_fill(bm, edges=bm.edges[:], sides=4) verts_new, edges_new, faces_new = pydata_from_bmesh(bm) bm.free() else: faces_new = [] verts_out.append(verts_new) edges_out.append(edges_new) faces_out.append(faces_new) self.outputs['Vertices'].sv_set(verts_out) self.outputs['Edges'].sv_set(edges_out) self.outputs['Faces'].sv_set(faces_out)