def init(self, context): n_id = node_id(self) self.width = 400 self.color = (0.5, 0.5, 1) self.use_custom_color = True self.inputs.new('StringsSocket', "Text In", "Text In") self.outputs.new('StringsSocket', "Text Out", "Text Out")
def free(self): global cache_viewer_baker n_id = node_id(self) callback_disable(n_id) cache_viewer_baker.pop(n_id+'v', None) cache_viewer_baker.pop(n_id+'ep', None) cache_viewer_baker.pop(n_id+'m', None)
def free(self): global cache_viewer_baker n_id = node_id(self) callback_disable(n_id) cache_viewer_baker.pop(n_id + 'v', None) cache_viewer_baker.pop(n_id + 'ep', None) cache_viewer_baker.pop(n_id + 'm', None)
def update(self): inputs = self.inputs n_id = node_id(self) # end early nvBGL.callback_disable(n_id) if not all([inputs[0], self.id_data.sv_show]): return in_links = inputs[0].links self.use_custom_color = True if self.activate and in_links: # gather vertices from input lines = nvBGL.parse_socket(inputs[0]) draw_data = { 'tree_name': self.id_data.name[:], 'content': lines, 'location': (self.location + Vector((self.width + 20, 0)))[:], 'color': self.text_color[:], } nvBGL.callback_enable(n_id, draw_data) self.color = READY_COLOR else: self.color = FAIL_COLOR return
def reset(self): n_id = node_id(self) self.outputs.clear() self.current_text = '' self.csv_data.pop(n_id, None) self.list_data.pop(n_id, None) self.json_data.pop(n_id, None)
def update(self): inputs = self.inputs n_id = node_id(self) # end early nvBGL.callback_disable(n_id) if not all([inputs[0], self.id_data.sv_show]): return in_links = inputs[0].links self.use_custom_color = True if self.activate and in_links: # gather vertices from input lines = nvBGL.parse_socket(inputs[0]) draw_data = { 'tree_name': self.id_data.name[:], 'content': lines, 'location': (self.location + Vector((self.width+20, 0)))[:], 'color': self.text_color[:], } nvBGL.callback_enable(n_id, draw_data) self.color = READY_COLOR else: self.color = FAIL_COLOR return
def load_csv(self): n_id = node_id(self) self.load_csv_data() if not n_id in self.csv_data: print("Error, no data loaded") else: for name in self.csv_data[n_id]: self.outputs.new('StringsSocket', name, name)
def load_sv(self): n_id = node_id(self) self.load_sv_data() if n_id in self.list_data: name_dict = {'m': 'Matrix', 's': 'Data', 'v': 'Vertices'} typ = self.socket_type new_output_socket(self, name_dict[typ], typ)
def update(self): if 'matrix' not in self.inputs: return if not (self.id_data.sv_show and self.activate): callback_disable(node_id(self)) return self.process()
def update(self): global cache_viewer_baker # node id, used as ref n_id = node_id(self) if 'matrix' not in self.inputs: return cache_viewer_baker[n_id+'v'] = [] cache_viewer_baker[n_id+'ep'] = [] cache_viewer_baker[n_id+'m'] = [] if not self.id_data.sv_show: callback_disable(n_id) return if self.activate and (self.inputs['vertices'].links or self.inputs['matrix'].links): callback_disable(n_id) if self.inputs['vertices'].links and \ type(self.inputs['vertices'].links[0].from_socket) == VerticesSocket: propv = SvGetSocketAnyType(self, self.inputs['vertices']) cache_viewer_baker[n_id+'v'] = dataCorrect(propv) else: cache_viewer_baker[n_id+'v'] = [] if self.inputs['edg_pol'].links and \ type(self.inputs['edg_pol'].links[0].from_socket) == StringsSocket: prope = SvGetSocketAnyType(self, self.inputs['edg_pol']) cache_viewer_baker[n_id+'ep'] = dataCorrect(prope) #print (prope) else: cache_viewer_baker[n_id+'ep'] = [] if self.inputs['matrix'].links and \ type(self.inputs['matrix'].links[0].from_socket) == MatrixSocket: propm = SvGetSocketAnyType(self, self.inputs['matrix']) cache_viewer_baker[n_id+'m'] = dataCorrect(propm) else: cache_viewer_baker[n_id+'m'] = [] else: callback_disable(n_id) if cache_viewer_baker[n_id+'v'] or cache_viewer_baker[n_id+'m']: callback_enable(n_id, cache_viewer_baker[n_id+'v'], cache_viewer_baker[n_id+'ep'], \ cache_viewer_baker[n_id+'m'], self.Vertex_show, self.color_view.copy(), self.transparant, self.shading) self.use_custom_color = True self.color = (1, 0.3, 0) else: self.use_custom_color = True self.color = (0.1, 0.05, 0) #print ('отражения вершин ',len(cache_viewer_baker['v']), " рёбёры ", len(cache_viewer_baker['ep']), "матрицы",len(cache_viewer_baker['m'])) if not self.inputs['vertices'].links and not self.inputs['matrix'].links: callback_disable(n_id)
def create_empty(self): n_id = node_id(self) scene = bpy.context.scene objects = bpy.data.objects empty = objects.new(self.empty_name, None) scene.objects.link(empty) scene.update() empty["SVERCHOK_REF"] = n_id self.empty_ref_name = empty.name return empty
def update(self): n_id = node_id(self) if not n_id in self.text_cache: self.format_text() if 'Text' in self.outputs and self.outputs['Text'].links: # I'm not sure that this makes sense, but keeping it like # old note right now. Would expect one value, and optional # split, or split via a text processing node, # but keeping this for now text = [[a] for a in self.text.split()] SvSetSocketAnyType(self, 'Text', [text])
def execute(self, context): global cache_viewer_baker nid = node_id(bpy.data.node_groups[self.idtree].nodes[self.idname]) if cache_viewer_baker[nid+'m'] and not cache_viewer_baker[nid+'v']: return {'CANCELLED'} vers = dataCorrect(cache_viewer_baker[nid+'v']) edg_pol = dataCorrect(cache_viewer_baker[nid+'ep']) if cache_viewer_baker[nid+'m']: matrixes = dataCorrect(cache_viewer_baker[nid+'m']) else: matrixes = [] for i in range((len(vers))): matrixes.append(Matrix()) self.makeobjects(vers, edg_pol, matrixes) return {'FINISHED'}
def load_json(self): n_id = node_id(self) self.load_json_data() json_data = self.json_data.get(n_id, []) if not json_data: self.current_text = '' return for item, data in json_data.items(): if len(data) == 2 and data[0] in {'v', 's', 'm'}: new_output_socket(self, item, data[0]) else: self.use_custom_color = True self.color = FAIL_COLOR return
def update(self): if 'Text In' in self.inputs and self.inputs['Text In'].links: self.text = str(SvGetSocketAnyType(self,self.inputs['Text In'])) n_id = node_id(self) if not n_id in self.text_cache: self.format_text() if 'Text Out' in self.outputs and self.outputs['Text Out'].links: # I'm not sure that this makes sense, but keeping it like # old note right now. Would expect one value, and optional # split, or split via a text processing node, # but keeping this for now text = [[a] for a in self.text.split()] SvSetSocketAnyType(self, 'Text Out', [text])
def process(self): n_id = node_id(self) global cache_viewer_baker vertex_ref = n_id + 'v' poledg_ref = n_id + 'ep' matrix_ref = n_id + 'm' cache_viewer_baker[vertex_ref] = [] cache_viewer_baker[poledg_ref] = [] cache_viewer_baker[matrix_ref] = [] callback_disable(n_id) # every time you hit a dot, you pay a price, so alias and benefit inputs = self.inputs vertex_links = inputs['vertices'].links matrix_links = inputs['matrix'].links edgepol_links = inputs['edg_pol'].links if (vertex_links or matrix_links): if vertex_links: if isinstance(vertex_links[0].from_socket, VerticesSocket): propv = inputs['vertices'].sv_get() if propv: cache_viewer_baker[vertex_ref] = dataCorrect(propv) if edgepol_links: if isinstance(edgepol_links[0].from_socket, StringsSocket): prope = inputs['edg_pol'].sv_get() if prope: cache_viewer_baker[poledg_ref] = dataCorrect(prope) if matrix_links: if isinstance(matrix_links[0].from_socket, MatrixSocket): propm = inputs['matrix'].sv_get() if propm: cache_viewer_baker[matrix_ref] = dataCorrect(propm) if cache_viewer_baker[vertex_ref] or cache_viewer_baker[matrix_ref]: config_options = self.get_options().copy() callback_enable(n_id, cache_viewer_baker, config_options) self.color = (1, 1, 1) else: self.color = (0.7, 0.7, 0.7)
def update_sv(self): n_id = node_id(self) if self.reload_on_update: self.reload_sv() # nothing loaded, try to load and if it doesn't work fail if n_id not in self.list_data and self.current_text: self.reload_sv() if n_id not in self.list_data: self.use_custom_color = True self.color = FAIL_COLOR return # load data into selected socket for item in ['Vertices', 'Data', 'Matrix']: if item in self.outputs and self.outputs[item].links: SvSetSocketAnyType(self, item, self.list_data[n_id])
def find_empty(self): n_id = node_id(self) def check_empty(obj): """ Check that it is the correct empty """ if obj.type == 'EMPTY': return "SVERCHOK_REF" in obj and obj["SVERCHOK_REF"] == n_id return False objects = bpy.data.objects if self.empty_ref_name in objects: obj = objects[self.empty_ref_name] if check_empty(obj): return obj for obj in objects: if check_empty(obj): self.empty_ref_name = obj.name return obj return None
def execute(self, context): global cache_viewer_baker node_group = bpy.data.node_groups[self.idtree] node = node_group.nodes[self.idname] nid = node_id(node) matrix_cache = cache_viewer_baker[nid + 'm'] vertex_cache = cache_viewer_baker[nid + 'v'] edgpol_cache = cache_viewer_baker[nid + 'ep'] if matrix_cache and not vertex_cache: return {'CANCELLED'} v = dataCorrect(vertex_cache) e = self.dataCorrect3(edgpol_cache) m = self.dataCorrect2(matrix_cache, v) self.makeobjects(v, e, m) return {'FINISHED'}
def execute(self, context): global cache_viewer_baker node_group = bpy.data.node_groups[self.idtree] node = node_group.nodes[self.idname] nid = node_id(node) matrix_cache = cache_viewer_baker[nid+'m'] vertex_cache = cache_viewer_baker[nid+'v'] edgpol_cache = cache_viewer_baker[nid+'ep'] if matrix_cache and not vertex_cache: return {'CANCELLED'} v = dataCorrect(vertex_cache) e = self.dataCorrect3(edgpol_cache) m = self.dataCorrect2(matrix_cache, v) self.makeobjects(v, e, m) return {'FINISHED'}
def load_json_data(self): json_data = {} n_id = node_id(self) # reset data if n_id in self.json_data: del self.json_data[n_id] f = io.StringIO(bpy.data.texts[self.text].as_string()) try: json_data = json.load(f) except: print("Failed to load JSON data") if not json_data: self.use_custom_color = True self.color = FAIL_COLOR return self.current_text = self.text self.json_data[n_id] = json_data
def update(self): inputs = self.inputs n_id = node_id(self) IV.callback_disable(n_id) # check if UI is populated. if not ('text' in inputs): return # end if tree status is set to not show if not self.id_data.sv_show: return self.use_custom_color = True if self.activate and inputs['vertices'].links: self.process(n_id, IV) self.color = READY_COLOR else: self.color = FAIL_COLOR
def load_sv_data(self): data = None n_id = node_id(self) if n_id in self.list_data: del self.list_data[n_id] f = bpy.data.texts[self.text].as_string() # should be able to select external file try: data = ast.literal_eval(f) except: pass if isinstance(data, list): self.list_data[n_id] = data self.use_custom_color = True self.color = READY_COLOR self.current_text = self.text else: self.use_custom_color = True self.color = FAIL_COLOR
def update_csv(self): n_id = node_id(self) if self.reload_on_update: self.reload_csv() if self.current_text and n_id not in self.csv_data: self.reload_csv() if n_id not in self.csv_data: print("CSV auto reload failed, press update") self.use_custom_color = True self.color = FAIL_COLOR return self.use_custom_color = True self.color = READY_COLOR csv_data = self.csv_data[n_id] for name in csv_data.keys(): if name in self.outputs and self.outputs[name].links: SvSetSocketAnyType(self, name, [csv_data[name]])
def update_json(self): n_id = node_id(self) if self.reload_on_update: self.reload_csv() if n_id not in self.json_data and self.current_text: self.reload_json() if n_id not in self.json_data: self.use_custom_color = True self.color = FAIL_COLOR return self.use_custom_color = True self.color = READY_COLOR json_data = self.json_data[n_id] for item in json_data: if item in self.outputs and self.outputs[item].links: out = json_data[item][1] SvSetSocketAnyType(self, item, out)
def _set_script(self, value): n_id = node_id(self) value.node = self self.script_objects[n_id] = value
def init(self, context): node_id(self) self.color = FAIL_COLOR
def copy(self, node): self.n_id = "" node_id(self)
def free(self): nvBGL.callback_disable(node_id(self))
def format_text(self): n_id = node_id(self) tl = format_text(self.text, self.width) self.text_cache[n_id] = (self.width, tl)
def reload_json(self): n_id = node_id(self) self.load_json_data() if n_id in self.json_data: self.use_custom_color = True self.color = READY_COLOR
def copy(self, node): self.n_id = '' node_id(self)
def free(self): n_id = node_id(self) self.csv_data.pop(n_id, None) self.list_data.pop(n_id, None) self.json_data.pop(n_id, None)
def free(self): IV.callback_disable(node_id(self))
def load_csv_data(self): n_id = node_id(self) csv_data = collections.OrderedDict() if n_id in self.csv_data: del self.csv_data[n_id] f = io.StringIO(bpy.data.texts[self.text].as_string()) # setup CSV options if self.csv_dialect == 'user': if self.csv_delimiter == 'CUSTOM': d = self.csv_custom_delimiter else: d = self.csv_delimiter reader = csv.reader(f, delimiter=d) elif self.csv_dialect == 'semicolon': self.csv_decimalmark = ',' reader = csv.reader(f, delimiter=';') else: reader = csv.reader(f, dialect=self.csv_dialect) self.csv_decimalmark = '.' # setup parse decimalmark if self.csv_decimalmark == ',': get_number = lambda s: float(s.replace(',', '.')) elif self.csv_decimalmark == 'LOCALE': get_number = lambda s: locale.atof(s) elif self.csv_decimalmark == 'CUSTOM': if self.csv_custom_decimalmark: get_number = lambda s: float(s.replace(self.csv_custom_decimalmark, '.')) else: # . default get_number = float # load data for i, row in enumerate(reader): if i == 0: # setup names if self.csv_header: for name in row: tmp = name c = 1 while tmp in csv_data: tmp = name+str(c) c += 1 csv_data[str(tmp)] = [] continue # first row is names else: for j in range(len(row)): csv_data["Col "+str(j)] = [] # load data for j, name in enumerate(csv_data): try: n = get_number(row[j]) csv_data[name].append(n) except (ValueError, IndexError): pass # discard strings other than first row if csv_data: # check for actual data otherwise fail. if not csv_data[list(csv_data.keys())[0]]: return self.current_text = self.text self.csv_data[n_id] = csv_data
def load_csv_data(self): n_id = node_id(self) csv_data = collections.OrderedDict() if n_id in self.csv_data: del self.csv_data[n_id] f = io.StringIO(bpy.data.texts[self.text].as_string()) # setup CSV options if self.csv_dialect == 'user': if self.csv_delimiter == 'CUSTOM': d = self.csv_custom_delimiter else: d = self.csv_delimiter reader = csv.reader(f, delimiter=d) elif self.csv_dialect == 'semicolon': self.csv_decimalmark = ',' reader = csv.reader(f, delimiter=';') else: reader = csv.reader(f, dialect=self.csv_dialect) self.csv_decimalmark = '.' # setup parse decimalmark if self.csv_decimalmark == ',': get_number = lambda s: float(s.replace(',', '.')) elif self.csv_decimalmark == 'LOCALE': get_number = lambda s: locale.atof(s) elif self.csv_decimalmark == 'CUSTOM': if self.csv_custom_decimalmark: get_number = lambda s: float( s.replace(self.csv_custom_decimalmark, '.')) else: # . default get_number = float # load data for i, row in enumerate(reader): if i == 0: # setup names if self.csv_header: for name in row: tmp = name c = 1 while tmp in csv_data: tmp = name + str(c) c += 1 csv_data[str(tmp)] = [] continue # first row is names else: for j in range(len(row)): csv_data["Col " + str(j)] = [] # load data for j, name in enumerate(csv_data): try: n = get_number(row[j]) csv_data[name].append(n) except (ValueError, IndexError): pass # discard strings other than first row if csv_data: # check for actual data otherwise fail. if not csv_data[list(csv_data.keys())[0]]: return self.current_text = self.text self.csv_data[n_id] = csv_data
def reload_csv(self): n_id = node_id(self) self.load_csv_data()
def _del_script(self): n_id = node_id(self) if n_id in self.script_objects: del self.script_objects[n_id]
def _get_script(self): n_id = node_id(self) script = self.script_objects.get(n_id) if script: script.node = self # paranoid update often safety setting return script