def sv_main(Points=[], SourceTri=[], TargetTri=[]): in_sockets = [ ['v', 'Points', Points], ['v', 'SourceTri', SourceTri], ['v', 'TargetTri', TargetTri] ] import mathutils from sverchok.data_structure import (match_long_cycle) out = [] if SourceTri and TargetTri and Points: Points, SourceTri, TargetTri = match_long_cycle([Points, SourceTri, TargetTri]) g = 0 while g < len(Points): st = SourceTri[g][:3] tt = TargetTri[g][:3] P = Points[g] out.append([mathutils.geometry.barycentric_transform(i, st[0], st[1], st[2], tt[0], tt[1], tt[2])[:] for i in P]) g = g+1 out_sockets = [ ['v', 'TransformedPoints', out] ] return in_sockets, out_sockets
def sv_main(Points=[], SourceTri=[], TargetTri=[]): in_sockets = [['v', 'Points', Points], ['v', 'SourceTri', SourceTri], ['v', 'TargetTri', TargetTri]] import mathutils from sverchok.data_structure import (match_long_cycle) out = [] if SourceTri and TargetTri and Points: Points, SourceTri, TargetTri = match_long_cycle( [Points, SourceTri, TargetTri]) g = 0 while g < len(Points): st = SourceTri[g][:3] tt = TargetTri[g][:3] P = Points[g] out.append([ mathutils.geometry.barycentric_transform( i, st[0], st[1], st[2], tt[0], tt[1], tt[2])[:] for i in P ]) g = g + 1 out_sockets = [['v', 'TransformedPoints', out]] return in_sockets, out_sockets
def Do_vecs(self, Vecs, Edgs, Diameter, Shape, Size, Cup): #Offset,Extrude): if Shape == 'Square': Nsides = 4 Diameter = Diameter * sqrt(2) / 2 Sides = 90 else: Nsides = 12 Diameter = Diameter / 2 Sides = 30 outv = [] outp = [] for E, V in zip(Edgs, Vecs): outv_ = [] outp_ = [] k = 0 Size, E = match_long_cycle([Size, E]) for e, S in zip(E, Size): S0, S1, S2 = S S2 = (S2 - 1) / 2 circle = [ (Vector((sin(radians(i))*S0,cos(radians(i))*S1,0))*Diameter) \ for i in range(45,405,Sides) ] v2, v1 = Vector(V[e[1]]), Vector(V[e[0]]) vecdi = v2 - v1 matrix_rot = vecdi.rotation_difference(Vector( (0, 0, 1))).to_matrix().to_4x4() verts1 = [(ve * matrix_rot + v1 - vecdi * S2)[:] for ve in circle] verts2 = [(ve * matrix_rot + v2 + vecdi * S2)[:] for ve in circle] outv_.extend(verts1) outv_.extend(verts2) pols = [[ k + i + 0, k + i - 1, k + i + Nsides - 1, k + i + Nsides ] for i in range(1, Nsides, 1)] pols.append( [k + 0, k + Nsides - 1, k + Nsides * 2 - 1, k + Nsides]) if Cup: p1 = [ k + i - Nsides for i in reversed(range(1, Nsides, 1)) ] p2 = [k + i for i in range(1, Nsides, 1)] p2.append(k) p1.append(k - Nsides) pols.append(p1) pols.append(p2) if self.close and k != 0: p = [[ k + i + 0 - Nsides, k + i - 1 - Nsides, k + i - 1, k + i ] for i in range(1, Nsides, 1)] pols.extend(p) pols.append([k + 0 - Nsides, k - 1, k + Nsides - 1, k]) outp_.extend(pols) k += Nsides * 2 outv.append(outv_) outp.append(outp_) return outv, outp
def sv_recursion(function, verts1, verts2, multiplyer, separate, level): ''' recursion itself function defined at node func - definition verts1,2 - operating verts multiplyer - as named separate - boolean to group vertices level - depth of verts1,2 ''' if not separate: if level: multiplyer, verts1, verts2 = match_long_cycle( [multiplyer, verts1, verts2]) out = [] outa = out.append oute = out.extend for v1, v2, m in zip(verts1, verts2, multiplyer): out_ = sv_recursion(function, v1, v2, m, separate, level - 1) if level > 1: outa(out_) elif level == 1: oute(out_) return out else: return function(verts1, verts2, multiplyer) else: if level: multiplyer, verts2 = match_long_cycle([multiplyer, verts2]) out = [] outa = out.append oute = out.extend if level > 1: for v1, v2, m in zip(verts1, verts2, multiplyer): out_ = sv_recursion(function, v1, v2, m, separate, level - 1) outa(out_) elif level == 1: for v2, m in zip(verts2, multiplyer): out_ = [] for v1 in verts1: out_.extend(function(v1, v2, m)) oute([out_]) return out
def sv_recursion(function, verts1, verts2, multiplyer, separate, level): ''' recursion itself function defined at node func - definition verts1,2 - operating verts multiplyer - as named separate - boolean to group vertices level - depth of verts1,2 ''' if not separate: if level: multiplyer,verts1,verts2 = match_long_cycle([multiplyer,verts1,verts2]) out = [] outa = out.append oute = out.extend for v1,v2,m in zip(verts1, verts2, multiplyer): out_ = sv_recursion(function, v1,v2,m,separate, level-1) if level > 1: outa(out_) elif level == 1: oute(out_) return out else: return function(verts1,verts2,multiplyer) else: if level: multiplyer,verts2 = match_long_cycle([multiplyer,verts2]) out = [] outa = out.append oute = out.extend if level > 1: for v1,v2,m in zip(verts1, verts2, multiplyer): out_ = sv_recursion(function, v1,v2,m,separate, level-1) outa(out_) elif level == 1: for v2,m in zip(verts2,multiplyer): out_ = [] for v1 in verts1: out_.extend(function(v1,v2,m)) oute([out_]) return out
def Do_vecs(self, Vecs,Edgs,Diameter,Shape,Size,Cup): #Offset,Extrude): if Shape == 'Square': Nsides = 4 Diameter = Diameter*sqrt(2)/2 Sides = 90 else: Nsides = 12 Diameter = Diameter/2 Sides = 30 outv = [] outp = [] for E,V in zip(Edgs,Vecs): outv_ = [] outp_ = [] k = 0 Size, E = match_long_cycle([Size,E]) for e,S in zip(E,Size): S0,S1,S2 = S S2 = (S2-1)/2 circle = [ (Vector((sin(radians(i))*S0,cos(radians(i))*S1,0))*Diameter) \ for i in range(45,405,Sides) ] v2,v1 = Vector(V[e[1]]),Vector(V[e[0]]) vecdi = v2-v1 matrix_rot = vecdi.rotation_difference(Vector((0,0,1))).to_matrix().to_4x4() verts1 = [ (ve*matrix_rot+v1-vecdi*S2)[:] for ve in circle ] verts2 = [ (ve*matrix_rot+v2+vecdi*S2)[:] for ve in circle ] outv_.extend(verts1) outv_.extend(verts2) pols = [ [k+i+0,k+i-1,k+i+Nsides-1,k+i+Nsides] for i in range(1,Nsides,1) ] pols.append([k+0,k+Nsides-1,k+Nsides*2-1,k+Nsides]) if Cup: p1 = [ k+i-Nsides for i in reversed(range(1,Nsides,1)) ] p2 = [ k+i for i in range(1,Nsides,1) ] p2.append(k) p1.append(k-Nsides) pols.append(p1) pols.append(p2) if self.close and k!=0: p = [ [k+i+0-Nsides,k+i-1-Nsides,k+i-1,k+i] for i in range(1,Nsides,1) ] pols.extend(p) pols.append([k+0-Nsides,k-1,k+Nsides-1,k]) outp_.extend(pols) k += Nsides*2 outv.append(outv_) outp.append(outp_) return outv, outp
def area_calc_setup(pols): '''Analyze pols information''' np_pols = np.array(pols) p_len = len(pols) if np_pols.dtype == np.object: np_len = np.vectorize(len) pols_sides = np_len(np_pols) pols_sides_max = np.amax(pols_sides) pols = match_long_cycle(pols) np_pols = np.array(pols) p_non_regular = True else: p_non_regular = False pols_sides = np.array(p_len) pols_sides_max = len(pols[0]) return [np_pols, pols_sides_max, pols_sides, p_len, p_non_regular]
def sv_main(V=[], P=[[]], S=[], T=[]): in_sockets = [['v', 'Points', V], ['s', 'Polys', P], ['v', 'SourceTri', S], ['v', 'TargetTri', T]] outV, outP = [], [] if V and S and T: v, p, s, t = match_long_cycle([V, P, S, T]) for v, p, s, t in zip(v, p, s, t): outV.append([ mathutils.geometry.barycentric_transform( i, s[0], s[1], s[2], t[0], t[1], t[2])[:] for i in v ]) outP.append(p) out_sockets = [['v', 'TransformedPoints', outV], ['s', 'Polygons', outP]] return in_sockets, out_sockets
def process(self): vertex_weight = self.inputs['Weights'].links if not (vertex_weight and (type(vertex_weight[0].from_socket) == StringsSocket)): return obj = bpy.data.objects[self.formula] if self.inputs['VertIND'].links: verts = SvGetSocketAnyType(self, self.inputs['VertIND'])[0] else: verts = [i.index for i in obj.data.vertices] wei = SvGetSocketAnyType(self, self.inputs['Weights'])[0] if self.Iteration == 'match_short': temp = match_short([verts, wei]) verts, wei = temp[0], temp[1] if self.Iteration == 'match_long_cycle': temp = match_long_cycle([verts, wei]) verts, wei = temp[0], temp[1] obj.data.update() if obj.vertex_groups.active and\ obj.vertex_groups.active.name.find('Sv_VGroup') != -1: if self.clear: obj.vertex_groups.active.add( [i.index for i in obj.data.vertices], self.fade_speed, "SUBTRACT") g = 0 while g != len(wei): obj.vertex_groups.active.add([verts[g]], wei[g], "REPLACE") g = g + 1 else: obj.vertex_groups.active = obj.vertex_groups.new(name='Sv_VGroup')
def sv_main(V=[], P=[[]], S=[], T=[]): in_sockets = [ ['v', 'Points', V], ['s', 'Polys', P], ['v', 'SourceTri', S], ['v', 'TargetTri', T] ] outV,outP = [],[] if V and S and T: v,p,s,t = match_long_cycle([V,P,S,T]) for v,p,s,t in zip(v,p,s,t): outV.append([mathutils.geometry.barycentric_transform(i, s[0], s[1], s[2], t[0], t[1], t[2])[:] for i in v]) outP.append(p) out_sockets = [ ['v', 'TransformedPoints', outV], ['s', 'Polygons', outP] ] return in_sockets, out_sockets
def list_matcher(a, list_match): if list_match == "Long Cycle": return match_long_cycle(a) else: return match_long_repeat(a)