diff --git a/__init__.py b/__init__.py index 19763922f7949cc61977d19a2d4ee07be7ed27ed..2909edaad42a1a8654f674e1b34b80b752eb76a4 100755 --- a/__init__.py +++ b/__init__.py @@ -45,7 +45,7 @@ bl_info = { "AgustinJB, Zeffii, Kosvor, " "Portnov, Elfnor" ), - "version": (0, 5, 8, 1), + "version": (0, 5, 8, 2), "blender": (2, 7, 8), "location": "Nodes > CustomNodesTree > Add user nodes", "description": "Parametric node-based geometry programming", diff --git a/nodes/scene/objects_mk2.py b/nodes/scene/objects_mk2.py index 3729ef902c00af5c9487914f43f25c782c56e2c0..1395d00dc60989f3b71d62fe738dd7cf11d32c14 100644 --- a/nodes/scene/objects_mk2.py +++ b/nodes/scene/objects_mk2.py @@ -62,49 +62,62 @@ class SvObjSelected(bpy.types.Operator): bl_label = "Sverchok object selector" bl_options = {'REGISTER', 'UNDO'} - node_name = StringProperty( - name='name node', description='it is name of node', default='') - - tree_name = StringProperty( - name='name tree', description='it is name of tree', default='') + node_name = StringProperty() + tree_name = StringProperty() - grup_name = StringProperty( - name='grup tree', description='it is name of group', default='') + def enable(self, node, handle): + groups = bpy.data.groups + + name_no = node.name + name_tr = node.id_data.name + group_name = node.groupname - sort = BoolProperty( - name='sort objects', description='to sort objects by name or not', default=True) - - def enable(self, name_no, name_tr, handle, sorting): objects = [] - if self.grup_name and bpy.data.groups[self.grup_name].objects: - objs = bpy.data.groups[self.grup_name].objects + if group_name and groups[group_name].objects: + objs = groups[group_name].objects elif bpy.context.selected_objects: objs = bpy.context.selected_objects else: self.report({'WARNING'}, 'No object selected') + self.disable(node, handle) return + for o in objs: objects.append(o.name) - if sorting: + + if node.sort: objects.sort() handle_write(name_no + name_tr, objects) if bpy.data.node_groups[name_tr]: handle = handle_read(name_no + name_tr) - bpy.data.node_groups[name_tr].nodes[name_no].objects_local = str(handle[1]) + node.objects_local = str(handle[1]) - def disable(self, name, handle): + + def disable(self, node, handle): + node.objects_local = '' + bpy.ops.node.sverchok_update_current(node_group=node.id_data.name) if not handle[0]: return - handle_delete(name) + handle_delete(node.name + node.id_data.name) + def execute(self, context): - name_no = self.node_name - name_tr = self.tree_name - sorting = self.sort + + if self.node_name and self.tree_name: + ng = bpy.data.node_groups[self.tree_name] + node = ng.nodes[self.node_name] + else: + node = context.node + + name_no = node.name + name_tr = node.id_data.name + + handle = handle_read(name_no + name_tr) + self.disable(node, handle) + self.enable(node, handle) handle = handle_read(name_no + name_tr) - self.disable(name_no + name_tr, handle) - self.enable(name_no, name_tr, handle, sorting) + print('end of execute', handle) print('have got {0} items from scene.'.format(handle[1])) return {'FINISHED'} @@ -116,10 +129,13 @@ class ObjectsNodeMK2(bpy.types.Node, SverchCustomTreeNode): bl_icon = 'OUTLINER_OB_EMPTY' def hide_show_versgroups(self, context): - if self.vergroups and not ('Vers_grouped' in self.outputs): - self.outputs.new('StringsSocket', "Vers_grouped", "Vers_grouped") - elif not self.vergroups and ('Vers_grouped' in self.outputs): - self.outputs.remove(self.outputs['Vers_grouped']) + outs = self.outputs + showing_vg = 'Vers_grouped' in outs + + if self.vergroups and not showing_vg: + outs.new('StringsSocket', 'Vers_grouped') + elif not self.vergroups and showing_vg: + outs.remove(outs['Vers_grouped']) objects_local = StringProperty( name='local objects in', description='objects, binded to current node', @@ -127,30 +143,46 @@ class ObjectsNodeMK2(bpy.types.Node, SverchCustomTreeNode): groupname = StringProperty( name='groupname', description='group of objects (green outline CTRL+G)', - default='', - update=updateNode) + default='', update=updateNode) + modifiers = BoolProperty( name='Modifiers', description='Apply modifier geometry to import (original untouched)', - default=False, - update=updateNode) + default=False, update=updateNode) + vergroups = BoolProperty( name='Vergroups', description='Use vertex groups to nesty insertion', - default=False, - update=hide_show_versgroups) + default=False, update=hide_show_versgroups) + sort = BoolProperty( name='sort by name', description='sorting inserted objects by names', - default=True, - update=updateNode) + default=True, update=updateNode) def sv_init(self, context): - self.outputs.new('VerticesSocket', "Vertices", "Vertices") - self.outputs.new('StringsSocket', "Edges", "Edges") - self.outputs.new('StringsSocket', "Polygons", "Polygons") - self.outputs.new('MatrixSocket', "Matrixes", "Matrixes") - self.outputs.new('SvObjectSocket', "Object", "Object") + self.outputs.new('VerticesSocket', "Vertices") + self.outputs.new('StringsSocket', "Edges") + self.outputs.new('StringsSocket', "Polygons") + self.outputs.new('MatrixSocket', "Matrixes") + self.outputs.new('SvObjectSocket', "Object") + + def draw_obj_names(self, layout): + # display names currently being tracked, stop at the first 5.. + handle = handle_read(self.name + self.id_data.name) + if self.objects_local and handle[0]: + + remain = len(handle[1]) - 5 + + for i, obj_name in enumerate(handle[1]): + layout.label(obj_name) + if i > 4 and remain > 0: + postfix = ('' if remain == 1 else 's') + more_items = '... {0} more item' + postfix + layout.label(more_items.format(remain)) + break + else: + layout.label('--None--') def draw_buttons(self, context, layout): #row.prop(self, 'groupname', text='') @@ -167,36 +199,21 @@ class ObjectsNodeMK2(bpy.types.Node, SverchCustomTreeNode): row.scale_y = 1 op_text = "Get selection" - opera = row.operator('node.sverchok_object_insertion', text=op_text) - opera.node_name = self.name - opera.tree_name = self.id_data.name - opera.grup_name = self.groupname - opera.sort = self.sort + row.operator('node.sverchok_object_insertion', text=op_text) col = layout.column(align=True) row = col.row(align=True) row.prop(self, 'sort', text='Sort', toggle=True) row.prop(self, "modifiers", text="Post", toggle=True) - # row = layout.row(align=True) row.prop(self, "vergroups", text="VeGr", toggle=True) row = col.row(align=True) opera = row.operator('node.sverchok_object_in_selector', text='Select') opera.node_name = self.name opera.tree_name = self.id_data.name + + self.draw_obj_names(layout) - handle = handle_read(self.name + self.id_data.name) - if self.objects_local: - if handle[0]: - for i, o in enumerate(handle[1]): - if i > 4: - layout.label('. . . more ' + str(len(handle[1]) - 5) + ' items') - break - layout.label(o) - else: - handle_write(self.name + self.id_data.name, literal_eval(self.objects_local)) - else: - layout.label('--None--') def update(self): pass @@ -207,75 +224,95 @@ class ObjectsNodeMK2(bpy.types.Node, SverchCustomTreeNode): handle_write(name, literal_eval(self.objects_local)) def process(self): + scene = bpy.context.scene name = self.name + self.id_data.name handle = handle_read(name) + # reload handle if possible if self.objects_local and not handle[0]: handle_write(name, literal_eval(self.objects_local)) handle = handle_read(name) if handle[0]: - objs = handle[1] + + objs = [o for o in bpy.data.objects if o.name in handle[1]] + edgs_out = [] vers_out = [] vers_out_grouped = [] pols_out = [] mtrx_out = [] - objs_out = [] - for obj_ in objs: # names of objects + + # iterate through references + for obj in objs: + edgs = [] vers = [] vers_grouped = [] pols = [] mtrx = [] - obj = bpy.data.objects[obj_] # objects itself - if obj.type == 'EMPTY': - for m in obj.matrix_world: - mtrx.append(m[:]) - - else: - scene = bpy.context.scene - settings = 'PREVIEW' - # create a temporary mesh - obj_data = obj.to_mesh(scene, self.modifiers, settings) - - for m in obj.matrix_world: - mtrx.append(list(m)) - for k, v in enumerate(obj_data.vertices): - if self.vergroups and v.groups.values(): - vers_grouped.append(k) - vers.append(list(v.co)) - edgs = obj_data.edge_keys - for p in obj_data.polygons: - pols.append(list(p.vertices)) - # remove the temp mesh - bpy.data.meshes.remove(obj_data) - edgs_out.append(edgs) + self.id_data.freeze(hard=True) + + try: + if obj.type == 'EMPTY': + for m in obj.matrix_world: + mtrx.append(m[:]) + + else: + # create a temporary mesh + obj_data = obj.to_mesh(scene, self.modifiers, 'PREVIEW') + edgs = obj_data.edge_keys + + for m in obj.matrix_world: + mtrx.append(list(m)) + + for k, v in enumerate(obj_data.vertices): + if self.vergroups and v.groups.values(): + vers_grouped.append(k) + vers.append(list(v.co)) + + for p in obj_data.polygons: + pols.append(list(p.vertices)) + + bpy.data.meshes.remove(obj_data, do_unlink=True) + except: + print('failure in process between frozen area', self.name) + + self.id_data.unfreeze(hard=True) + vers_out.append(vers) - vers_out_grouped.append(vers_grouped) + edgs_out.append(edgs) pols_out.append(pols) mtrx_out.append(mtrx) - objs_out.append(obj) - if vers_out[0]: + vers_out_grouped.append(vers_grouped) + + if vers_out and vers_out[0]: + + Vertices = self.outputs['Vertices'] + Edges = self.outputs['Edges'] + Polygons = self.outputs['Polygons'] + Matrixes = self.outputs['Matrixes'] + Objects = self.outputs['Object'] - if self.outputs['Vertices'].is_linked: - SvSetSocketAnyType(self, 'Vertices', vers_out) + if Vertices.is_linked: + Vertices.sv_set(vers_out) - if self.outputs['Edges'].is_linked: - SvSetSocketAnyType(self, 'Edges', edgs_out) + if Edges.is_linked: + Edges.sv_set(edgs_out) - if self.outputs['Polygons'].is_linked: - SvSetSocketAnyType(self, 'Polygons', pols_out) + if Polygons.is_linked: + Polygons.sv_set(pols_out) - if self.vergroups and self.outputs['Vers_grouped'].is_linked: - SvSetSocketAnyType(self, 'Vers_grouped', vers_out_grouped) + if 'Vers_grouped' in self.outputs: + Vers_grouped = self.outputs['Vers_grouped'] + if self.vergroups and Vers_grouped.is_linked: + Vers_grouped.sv_set(vers_out_grouped) - if self.outputs['Matrixes'].is_linked: - SvSetSocketAnyType(self, 'Matrixes', mtrx_out) - if self.outputs['Object'].is_linked: - #print(objs_out) - SvSetSocketAnyType(self, 'Object', objs_out) + if Matrixes.is_linked: + Matrixes.sv_set(mtrx_out) + if Objects.is_linked: + Objects.sv_set(objs) def register(): diff --git a/ui/sv_panels.py b/ui/sv_panels.py index 7e2556eb480f4c2503e15b5a1f6b686bad5ab2e5..9d5ef564d8c5f0ac6c6901877fda894c19a3679f 100644 --- a/ui/sv_panels.py +++ b/ui/sv_panels.py @@ -80,6 +80,7 @@ class Sv3DViewObjInUpdater(bpy.types.Operator, object): nodes = [] for n in ng.nodes: if n.bl_idname in {'ObjectsNode','ObjectsNodeMK2'}: + print('adding', n.name, 'to process_from_nodes') nodes.append(n) if nodes: obj_nodes.append(nodes) @@ -201,10 +202,9 @@ class Sv3DPanel(bpy.types.Panel): no = item.node_name ver = item.prop_name node = tree.nodes[no] - if node.label: - tex = node.label - else: - tex = no + + tex = node.label if node.label else no + if node.bl_idname == "ObjectsNodeMK2": row = col.row(align=True) row.label(text=node.label if node.label else no) @@ -213,8 +213,7 @@ class Sv3DPanel(bpy.types.Panel): op = colo.operator("node.sverchok_object_insertion", text="Get") op.node_name = node.name op.tree_name = tree.name - op.grup_name = node.groupname - op.sort = node.sort + elif node.bl_idname in {"IntegerNode", "FloatNode"}: row = col.row(align=True) row.prop(node, ver, text=tex)