Skip to content

Instantly share code, notes, and snippets.

@zeffii
Forked from anonymous/node_KDTreeEdges.py
Created April 27, 2014 17:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zeffii/11351267 to your computer and use it in GitHub Desktop.
Save zeffii/11351267 to your computer and use it in GitHub Desktop.
from node_s import *
from util import *
from mathutils import Vector, kdtree
import bpy
# documentation/blender_python_api_2_70_release/mathutils.kdtree.html
class SvKDTreeEdgesNode(Node, SverchCustomTreeNode):
bl_idname = 'SvKDTreeEdgesNode'
bl_label = 'Kdtree Edges'
bl_icon = 'OUTLINER_OB_EMPTY'
def draw_buttons(self, context, layout):
pass
def init(self, context):
self.inputs.new('VerticesSocket', 'Verts', 'Verts')
self.inputs.new('StringsSocket', 'minDistance', 'minDistance')
self.inputs.new('StringsSocket', 'maxDistance', 'maxDistance')
self.inputs.new('StringsSocket', 'maxNum', 'maxNum')
self.inputs.new('StringsSocket', 'skip n closest', 'skip n closest')
self.outputs.new('StringsSocket', 'Edges', 'Edges')
def update(self):
inputs = self.inputs
outputs = self.outputs
try:
verts = SvGetSocketAnyType(self, inputs['Verts'])[0]
mindist = SvGetSocketAnyType(self, inputs['minDistance'])[0][0]
maxdist = SvGetSocketAnyType(self, inputs['maxDistance'])[0][0]
maxNum = SvGetSocketAnyType(self, inputs['maxNum'])[0][0]
skip = SvGetSocketAnyType(self, inputs['skip n closest'])[0][0]
linked = outputs[0].links
except (IndexError, KeyError) as e:
return
# make kdtree
# documentation/blender_python_api_2_70_release/mathutils.kdtree.html
size = len(verts)
kd = mathutils.kdtree.KDTree(size)
for i, vtx in enumerate(verts):
kd.insert(Vector(vtx), i)
kd.balance()
# set minimum values
maxNum = max(maxNum, 1)
skip = max(skip, 0)
# makes edges
e = []
for i, vtx in enumerate(verts):
num_edges = 0
for (co, index, dist) in kd.find_range(vtx, maxdist):
if dist < mindist:
continue
if i == index or (num_edges > maxNum):
continue
if num_edges < skip:
num_edges += 1
continue
e.append([i, index])
num_edges += 1
SvSetSocketAnyType(self, 'Edges', e)
def update_socket(self, context):
self.update()
def register():
bpy.utils.register_class(SvKDTreeEdgesNode)
def unregister():
bpy.utils.unregister_class(SvKDTreeEdgesNode)
if __name__ == "__main__":
register()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment