def update(self): if self.inputs['Data'].links: # адаптивный сокет inputsocketname = 'Data' outputsocketname = ["Middl", 'First', 'Last'] changable_sockets(self, inputsocketname, outputsocketname) if 'First' in self.outputs and self.outputs['First'].links or \ 'Last' in self.outputs and self.outputs['Last'].links or \ 'Middl' in self.outputs and self.outputs['Middl'].links: data = SvGetSocketAnyType(self, self.inputs['Data']) # blocking too height values of levels, reduce levels = levelsOflist(data) - 2 if levels >= self.level: levels = self.level - 1 elif levels < 1: levels = 1 # assign out if self.outputs['First'].links: out = self.count(data, levels, 0) SvSetSocketAnyType(self, 'First', out) if self.outputs['Middl'].links: out = self.count(data, levels, 1) SvSetSocketAnyType(self, 'Middl', out) if self.outputs['Last'].links: out = self.count(data, levels, 2) SvSetSocketAnyType(self, 'Last', out)
def update(self): if 'data' in self.inputs and self.inputs['data'].links: # get any type socket from input: data = SvGetSocketAnyType(self, self.inputs['data']) # Process data leve = min((levelsOflist(data) - 2), self.level) result = self.beat(data, leve, leve) # multisocket - from util(formula node) multi_socket(self, min=1, start=2, breck=True, output=len(result)) # adaptive socket - from util(mask list node) # list to pack and change type of multysockets in output... maybe not so quick outputsocketname = [name.name for name in self.outputs] changable_sockets(self, 'data', outputsocketname) self.multi_socket_type = get_socket_type_full(self, 'data') # how to assign correct property to adaptive output: # in nearest future with socket's data' dictionary we will send # only node_name+layout_name+socket_name in str() format # and will make separate definition to easyly assign and # get and recognise data from dictionary for i, out in enumerate(result): SvSetSocket(self.outputs[i], out) if i >= 32: break
def update(self): if 'data' in self.inputs and self.inputs['data'].links: # get any type socket from input: data = SvGetSocketAnyType(self, self.inputs['data']) # Process data leve = min((levelsOflist(data)-2), self.level) result = self.beat(data, leve, leve) # multisocket - from util(formula node) multi_socket(self, min=1, start=2, breck=True, output=len(result)) # adaptive socket - from util(mask list node) # list to pack and change type of multysockets in output... maybe not so quick outputsocketname = [name.name for name in self.outputs] changable_sockets(self, 'data', outputsocketname) self.multi_socket_type = get_socket_type_full(self, 'data') # how to assign correct property to adaptive output: # in nearest future with socket's data' dictionary we will send # only node_name+layout_name+socket_name in str() format # and will make separate definition to easyly assign and # get and recognise data from dictionary for i, out in enumerate(result): SvSetSocket(self.outputs[i], out) if i >= 32: break
def update(self): # inputs multi_socket(self, min=2, start=-1, breck=True) if 'X' in self.inputs and len(self.inputs['X'].links) > 0: # адаптивный сокет inputsocketname = 'X' outputsocketname = ['Result'] changable_sockets(self, inputsocketname, outputsocketname) vecs = SvGetSocketAnyType(self, self.inputs['X']) else: vecs = [[0.0]] # outputs if 'Result' in self.outputs and len(self.outputs['Result'].links) > 0: list_mult = [] if 'n[0]' in self.inputs and len(self.inputs['n[0]'].links) > 0: i = 0 for socket in self.inputs: if socket.links and i != 0: list_mult.append(SvGetSocketAnyType(self, socket)) else: i = 1 #print(list_mult) code_formula = parser.expr(self.formula).compile() # finding nasty levels, make equal nastyness (canonical 0,1,2,3) levels = [levelsOflist(vecs)] for n in list_mult: levels.append(levelsOflist(n)) maxlevel = max(max(levels), 3) diflevel = maxlevel - levels[0] if diflevel: vecs_ = dataSpoil([vecs], diflevel-1) vecs = dataCorrect(vecs_, nominal_dept=2) for i, lev in enumerate(levels): if i == 0: continue diflevel = maxlevel-lev if diflevel: list_temp = dataSpoil([list_mult[i-1]], diflevel-1) list_mult[i-1] = dataCorrect(list_temp, nominal_dept=2) #print(list_mult) r = self.inte(vecs, code_formula, list_mult, 3) result = dataCorrect(r, nominal_dept=min((levels[0]-1), 2)) SvSetSocketAnyType(self, 'Result', result)
def update(self): # inputs multi_socket(self, min=2, start=-1, breck=True) if 'X' in self.inputs and len(self.inputs['X'].links) > 0: # адаптивный сокет inputsocketname = 'X' outputsocketname = ['Result'] changable_sockets(self, inputsocketname, outputsocketname) vecs = SvGetSocketAnyType(self, self.inputs['X']) else: vecs = [[0.0]] # outputs if 'Result' in self.outputs and len(self.outputs['Result'].links) > 0: list_mult = [] if 'n[0]' in self.inputs and len(self.inputs['n[0]'].links) > 0: i = 0 for socket in self.inputs: if socket.links and i != 0: list_mult.append(SvGetSocketAnyType(self, socket)) else: i = 1 #print(list_mult) code_formula = parser.expr(self.formula).compile() # finding nasty levels, make equal nastyness (canonical 0,1,2,3) levels = [levelsOflist(vecs)] for n in list_mult: levels.append(levelsOflist(n)) maxlevel = max(max(levels), 3) diflevel = maxlevel - levels[0] if diflevel: vecs_ = dataSpoil([vecs], diflevel - 1) vecs = dataCorrect(vecs_, nominal_dept=2) for i, lev in enumerate(levels): if i == 0: continue diflevel = maxlevel - lev if diflevel: list_temp = dataSpoil([list_mult[i - 1]], diflevel - 1) list_mult[i - 1] = dataCorrect(list_temp, nominal_dept=2) #print(list_mult) r = self.inte(vecs, code_formula, list_mult, 3) result = dataCorrect(r, nominal_dept=min((levels[0] - 1), 2)) SvSetSocketAnyType(self, 'Result', result)
def update(self): if 'vers' in self.outputs and len(self.outputs['vers'].links) > 0: # get any type socket from input: vers = SvGetSocketAnyType(self, self.inputs['vers']) # Process data levs = levelsOflist(vers) result = self.remdou(vers, levs) SvSetSocketAnyType(self, 'vers', result)
def update(self): # inputs multi_socket(self, min=1) if 'vertices' in self.outputs and self.outputs['vertices'].links or \ 'data' in self.outputs and self.outputs['data'].links: slots = [] for socket in self.inputs: if socket.links and type(socket.links[0].from_socket) == VerticesSocket: slots.append(SvGetSocketAnyType(self, socket)) if len(slots) == 0: return if levelsOflist(slots) <= 4: lev = 1 else: lev = self.JoinLevel result = self.connect(slots, self.dir_check, self.cicl_check, lev, self.polygons, self.slice_check) if self.outputs['vertices'].links: SvSetSocketAnyType(self, 'vertices', result[0]) if self.outputs['data'].links: SvSetSocketAnyType(self, 'data', result[1])
def update(self): inputs = self.inputs outputs = self.outputs operation = self.items_ self.label = self.items_ if self.nothing_to_process(): return # this input is shared over both. vector1 = [] if 'U' in inputs and inputs['U'].links: if isinstance(inputs['U'].links[0].from_socket, VerticesSocket): vector1 = SvGetSocketAnyType(self, inputs['U'], deepcopy=False) if not vector1: return # reaches here only if we have vector1 u = vector1 leve = levelsOflist(u) scalars = ["SCALAR", "1/SCALAR", "ROUND"] result = [] # vector-output if 'W' in outputs and outputs['W'].links: func = vector_out[operation][0] if len(inputs) == 1: try: result = self.recurse_fx(u, func, leve - 1) except: print('one input only, failed') return elif len(inputs) == 2: ''' get second input sockets content, depending on mode ''' b = [] if operation in scalars: socket = ['S', StringsSocket] msg = "two inputs, 1 scalar, " else: socket = ['V', VerticesSocket] msg = "two inputs, both vector, " name, _type = socket if name in inputs and inputs[name].links: if isinstance(inputs[name].links[0].from_socket, _type): b = SvGetSocketAnyType(self, inputs[name], deepcopy=False) # this means one of the necessary sockets is not connected if not b: return try: result = self.recurse_fxy(u, b, func, leve - 1) except: print(self.name, msg, 'failed') return else: return # fail! SvSetSocketAnyType(self, 'W', result) # scalar-output if 'out' in outputs and outputs['out'].links: vector2, result = [], [] func = scalar_out[operation][0] num_inputs = len(inputs) try: if num_inputs == 1: result = self.recurse_fx(u, func, leve - 1) elif all([num_inputs == 2, ('V' in inputs), (inputs['V'].links)]): if isinstance(inputs['V'].links[0].from_socket, VerticesSocket): vector2 = SvGetSocketAnyType(self, inputs['V'], deepcopy=False) result = self.recurse_fxy(u, vector2, func, leve - 1) else: print('socket connected to V is not a vertices socket') else: return except: print('failed scalar out, {} inputs'.format(num_inputs)) return if result: SvSetSocketAnyType(self, 'out', result)
def update(self): # vertices socket global cache_viewer_slot1 global cache_viewer_slot2 global cache_viewer_slot3 if 'vertices' in self.inputs and 'edg_pol' in self.inputs and 'matrix' in self.inputs: if self.inputs['vertices'].links: if type(self.inputs['vertices'].links[0].from_socket ) == bpy.types.VerticesSocket: evaverti = SvGetSocketAnyType(self, self.inputs['vertices']) #evaverti = eval(verti) deptl = levelsOflist(evaverti) #print(str(evaverti)) #print (deptl, ' text viewer') if deptl and deptl > 2: a = self.readFORviewer_sockets_data( evaverti, deptl, len(evaverti)) elif deptl: a = self.readFORviewer_sockets_data_small( evaverti, deptl, len(evaverti)) else: a = 'None \n' cache_viewer_slot1['veriable' + self.name] = a #print ('viewer text input1') else: cache_viewer_slot1['veriable' + self.name] = 'None \n' # edges/faces socket if self.inputs['edg_pol'].links: if type(self.inputs['edg_pol'].links[0].from_socket ) == bpy.types.StringsSocket: evaline_str = SvGetSocketAnyType(self, self.inputs['edg_pol']) #print (line_str) if evaline_str: cache_viewer_slot2['type' + self.name] = str( self.edgDef(evaline_str)) deptl = levelsOflist(evaline_str) #print(str(evaline_str)) #print (deptl, ' text viewer') if deptl and deptl > 2: b = self.readFORviewer_sockets_data( evaline_str, deptl, len(evaline_str)) elif deptl: b = self.readFORviewer_sockets_data_small( evaline_str, deptl, len(evaline_str)) else: b = 'None \n' cache_viewer_slot2['veriable' + self.name] = str(b) #print ('viewer text input2') else: cache_viewer_slot2['veriable' + self.name] = 'None \n' cache_viewer_slot2['type' + self.name] = '\n\ndata \n' # matrix socket if self.inputs['matrix'].links: if type(self.inputs['matrix'].links[0].from_socket ) == bpy.types.MatrixSocket: eva = SvGetSocketAnyType(self, self.inputs['matrix']) deptl = levelsOflist(eva) #print (deptl, ' text viewer') if deptl and deptl > 2: c = self.readFORviewer_sockets_data( eva, deptl, len(eva)) elif deptl: c = self.readFORviewer_sockets_data_small( eva, deptl, len(eva)) else: c = 'None \n' cache_viewer_slot3['veriable' + self.name] = str(c) #print ('viewer text input3') else: cache_viewer_slot3['veriable' + self.name] = 'None \n' if self.inputs['matrix'].links or self.inputs['vertices'].links or \ self.inputs['edg_pol'].links: self.use_custom_color = True self.color = (0.5, 0.5, 1) else: self.use_custom_color = True self.color = (0.05, 0.05, 0.1)
def update(self): inputs = self.inputs outputs = self.outputs operation = self.items_ self.label = self.items_ if self.nothing_to_process(): return # this input is shared over both. vector1 = [] if 'U' in inputs and inputs['U'].links: if isinstance(inputs['U'].links[0].from_socket, VerticesSocket): vector1 = SvGetSocketAnyType(self, inputs['U'], deepcopy=False) if not vector1: return # reaches here only if we have vector1 u = vector1 leve = levelsOflist(u) scalars = ["SCALAR", "1/SCALAR", "ROUND"] result = [] # vector-output if 'W' in outputs and outputs['W'].links: func = vector_out[operation][0] if len(inputs) == 1: try: result = self.recurse_fx(u, func, leve - 1) except: print('one input only, failed') return elif len(inputs) == 2: ''' get second input sockets content, depending on mode ''' b = [] if operation in scalars: socket = ['S', StringsSocket] msg = "two inputs, 1 scalar, " else: socket = ['V', VerticesSocket] msg = "two inputs, both vector, " name, _type = socket if name in inputs and inputs[name].links: if isinstance(inputs[name].links[0].from_socket, _type): b = SvGetSocketAnyType(self, inputs[name], deepcopy=False) # this means one of the necessary sockets is not connected if not b: return try: result = self.recurse_fxy(u, b, func, leve - 1) except: print(self.name, msg, 'failed') return else: return # fail! SvSetSocketAnyType(self, 'W', result) # scalar-output if 'out' in outputs and outputs['out'].links: vector2, result = [], [] func = scalar_out[operation][0] num_inputs = len(inputs) try: if num_inputs == 1: result = self.recurse_fx(u, func, leve - 1) elif all([num_inputs == 2, ('V' in inputs), (inputs['V'].links)]): if isinstance(inputs['V'].links[0].from_socket, VerticesSocket): vector2 = SvGetSocketAnyType(self, inputs['V'], deepcopy=False) result = self.recurse_fxy(u, vector2, func, leve - 1) else: print('socket connected to V is not a vertices socket') else: return except: print('failed scalar out, {} inputs'.format(num_inputs)) return if result: SvSetSocketAnyType(self, 'out', result)
def update(self): # vertices socket global cache_viewer_slot1 global cache_viewer_slot2 global cache_viewer_slot3 if 'vertices' in self.inputs and 'edg_pol' in self.inputs and 'matrix' in self.inputs: if self.inputs['vertices'].links: if type(self.inputs['vertices'].links[0].from_socket) == bpy.types.VerticesSocket: evaverti = SvGetSocketAnyType(self, self.inputs['vertices']) #evaverti = eval(verti) deptl = levelsOflist(evaverti) #print(str(evaverti)) #print (deptl, ' text viewer') if deptl and deptl > 2: a = self.readFORviewer_sockets_data(evaverti, deptl, len(evaverti)) elif deptl: a = self.readFORviewer_sockets_data_small(evaverti, deptl, len(evaverti)) else: a = 'None \n' cache_viewer_slot1['veriable'+self.name] = a #print ('viewer text input1') else: cache_viewer_slot1['veriable'+self.name] = 'None \n' # edges/faces socket if self.inputs['edg_pol'].links: if type(self.inputs['edg_pol'].links[0].from_socket) == bpy.types.StringsSocket: evaline_str = SvGetSocketAnyType(self, self.inputs['edg_pol']) #print (line_str) if evaline_str: cache_viewer_slot2['type'+self.name] = str(self.edgDef(evaline_str)) deptl = levelsOflist(evaline_str) #print(str(evaline_str)) #print (deptl, ' text viewer') if deptl and deptl > 2: b = self.readFORviewer_sockets_data(evaline_str, deptl, len(evaline_str)) elif deptl: b = self.readFORviewer_sockets_data_small(evaline_str, deptl, len(evaline_str)) else: b = 'None \n' cache_viewer_slot2['veriable'+self.name] = str(b) #print ('viewer text input2') else: cache_viewer_slot2['veriable'+self.name] = 'None \n' cache_viewer_slot2['type'+self.name] = '\n\ndata \n' # matrix socket if self.inputs['matrix'].links: if type(self.inputs['matrix'].links[0].from_socket) == bpy.types.MatrixSocket: eva = SvGetSocketAnyType(self, self.inputs['matrix']) deptl = levelsOflist(eva) #print (deptl, ' text viewer') if deptl and deptl > 2: c = self.readFORviewer_sockets_data(eva, deptl, len(eva)) elif deptl: c = self.readFORviewer_sockets_data_small(eva, deptl, len(eva)) else: c = 'None \n' cache_viewer_slot3['veriable'+self.name] = str(c) #print ('viewer text input3') else: cache_viewer_slot3['veriable'+self.name] = 'None \n' if self.inputs['matrix'].links or self.inputs['vertices'].links or \ self.inputs['edg_pol'].links: self.use_custom_color = True self.color = (0.5, 0.5, 1) else: self.use_custom_color = True self.color = (0.05, 0.05, 0.1)
def connect(self, vers, dirn, cicl, clev, polygons, slice): vers_ = [] lens = [] # for joinvers to one object def joinvers(ver): joinvers = [] for ob in ver: fullList(list(ob), ml) joinvers.extend(ob) return joinvers # we will take common case of nestiness, it is not flatten as correctData is, # but pick in upper level bottom level of data. could be automated in future # to check for levelsOflist() and correct in recursion lol = levelsOflist(vers) # print(lol) if lol == 4: # was clev - manually defined, but it is wrong way for ob in vers: for o in ob: vers_.append(o) lens.append(len(o)) elif lol == 5: for ob in vers: for o in ob: for v in o: vers_.append(v) lens.append(len(v)) else: print('wrong level in UV connect') lenvers = len(vers_) #print(lenvers, lens) edges = [] ml = max(lens) if dirn == 'U_dir': if polygons: # joinvers to implement length_ob = [] newobject = [] for k, ob in enumerate(vers_): length_ob.append(len(ob)) newobject.extend(ob) # joinvers to implement curr = 0 objecto = [] indexes__ = [] if slice: indexes__ = [[j*ml+i for j in range(lenvers)] for i in range(ml)] objecto = [a for a in zip(*indexes__)] else: for i, ob in enumerate(length_ob): indexes_ = [] for w in range(ob): indexes_.append(curr) curr += 1 if i == 0 and cicl: cicle_firstrow = indexes_ if i > 0: indexes = indexes_ + indexes__[::-1] quaded = [(indexes[k], indexes[k+1], indexes[-(k+2)], indexes[-(k+1)]) for k in range((len(indexes)-1)//2)] objecto.extend(quaded) if i == len(length_ob)-1 and cicl: indexes = cicle_firstrow + indexes_[::-1] quaded = [(indexes[k], indexes[k+1], indexes[-(k+2)], indexes[-(k+1)]) for k in range((len(indexes)-1)//2)] objecto.extend(quaded) indexes__ = indexes_ vers_ = [newobject] edges = [objecto] elif not polygons: for k, ob in enumerate(vers_): objecto = [] for i, ve in enumerate(ob[:-1]): objecto.append([i, i+1]) if cicl: objecto.append([0, len(ob)-1]) edges.append(objecto) # not direction: elif dirn == 'V_dir': objecto = [] # it making not direction order, but one-edged polygon instead of two rows # to remake - yet one flag that operates slicing. because the next is slicing, # not direction for polygons if polygons: if slice: joinvers = joinvers(vers_) for i, ve in enumerate(vers_[0][:]): inds = [j*ml+i for j in range(lenvers)] objecto.append(inds) else: # flip matrix transpose: vers_flip = [a for a in zip(*vers_)] vers_ = vers_flip # flip matrix transpose: joinvers = joinvers(vers_) for i, ob in enumerate(vers_[:-1]): for k, ve in enumerate(ob[:-1]): objecto.append([i*lenvers+k, (i+1)*lenvers+k, (i+1)*lenvers+k+1, i*lenvers+k+1]) if i == 0 and cicl: objecto.append([k+1, (ml-1)*lenvers+k+1, (ml-1)*lenvers+k, k]) elif not polygons: joinvers = joinvers(vers_) for i, ve in enumerate(vers_[0][:]): inds = [j*ml+i for j in range(lenvers)] for i, item in enumerate(inds): if i == 0 and cicl: objecto.append([inds[0], inds[-1]]) elif i == 0: continue else: objecto.append([item, inds[i-1]]) edges.append(objecto) vers_ = [joinvers] return vers_, edges