forked from nortikin/sverchok
-
Notifications
You must be signed in to change notification settings - Fork 0
/
node_VectorMove.py
85 lines (68 loc) · 2.88 KB
/
node_VectorMove.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import bpy
from node_s import *
from util import *
from mathutils import Vector, Matrix
class VectorMoveNode(Node, SverchCustomTreeNode):
''' Vector Move vectors '''
bl_idname = 'VectorMoveNode'
bl_label = 'Vectors Move'
bl_icon = 'OUTLINER_OB_EMPTY'
def init(self, context):
self.inputs.new('VerticesSocket', "vertices", "vertices")
self.inputs.new('VerticesSocket', "vectors", "vectors")
self.inputs.new('StringsSocket', "multiplier", "multiplier")
self.outputs.new('VerticesSocket', "vertices", "vertices")
def update(self):
# inputs
if 'vertices' in self.inputs and self.inputs['vertices'].links and \
type(self.inputs['vertices'].links[0].from_socket) == VerticesSocket:
vers_ = SvGetSocketAnyType(self,self.inputs['vertices'])
vers = Vector_generate(vers_)
else:
vers = []
if 'vectors' in self.inputs and self.inputs['vectors'].links and \
type(self.inputs['vectors'].links[0].from_socket) == VerticesSocket:
vecs_ = SvGetSocketAnyType(self,self.inputs['vectors'])
vecs = Vector_generate(vecs_)
else:
vecs = []
if 'multiplier' in self.inputs and self.inputs['multiplier'].links and \
type(self.inputs['multiplier'].links[0].from_socket) == StringsSocket:
mult = SvGetSocketAnyType(self,self.inputs['multiplier'])
else:
mult = [[1.0]]
# outputs
if 'vertices' in self.outputs and self.outputs['vertices'].links:
mov = self.moved(vers, vecs, mult)
SvSetSocketAnyType(self,'vertices',mov)
def moved(self, vers, vecs, mult):
r = len(vers) - len(vecs)
rm = len(vers) - len(mult)
moved = []
if r > 0:
vecs.extend([vecs[-1] for a in range(r)])
if rm > 0:
mult.extend([mult[-1] for a in range(rm)])
for i, ob in enumerate(vers): # object
d = len(ob) - len(vecs[i])
dm = len(ob) - len(mult[i])
if d > 0:
vecs[i].extend([vecs[i][-1] for a in range(d)])
if dm > 0:
mult[i].extend([mult[i][-1] for a in range(dm)])
temp = []
for k, vr in enumerate(ob): # vectors
#print('move',str(len(ob)), str(len(vecs[i])), str(vr), str(vecs[i][k]))
v = ((vr + vecs[i][k]*mult[i][k]))[:]
temp.append(v) #[0]*mult[0], v[1]*mult[0], v[2]*mult[0]))
moved.append(temp)
#print ('move', str(moved))
return moved
def update_socket(self, context):
self.update()
def register():
bpy.utils.register_class(VectorMoveNode)
def unregister():
bpy.utils.unregister_class(VectorMoveNode)
if __name__ == "__main__":
register()