Node Wrangler: When doing auto-arrange, keep active node still.

Other selected nodes are arranged around the active one - I've been using this for a while and found this behavior is much more useful.
This commit is contained in:
Greg Zaal 2015-06-24 16:50:24 +02:00
parent d2aa512ae8
commit ff3f557417
1 changed files with 20 additions and 12 deletions

View File

@ -19,8 +19,8 @@
bl_info = {
"name": "Node Wrangler",
"author": "Bartek Skorupa, Greg Zaal, Sebastian Koenig",
"version": (3, 27),
"blender": (2, 74, 0),
"version": (3, 28),
"blender": (2, 75, 0),
"location": "Node Editor Toolbar or Ctrl-Space",
"description": "Various tools to enhance and speed up node-based workflow",
"warning": "",
@ -35,8 +35,9 @@ from bpy.props import FloatProperty, EnumProperty, BoolProperty, IntProperty, St
from bpy_extras.io_utils import ImportHelper
from mathutils import Vector
from math import cos, sin, pi, hypot
from os import listdir, path
from os import path
from glob import glob
from copy import copy
#################
# rl_outputs:
@ -2674,7 +2675,6 @@ class NWAlignNodes(Operator, NWBase):
margin = IntProperty(name='Margin', default=50, description='The amount of space between nodes')
def execute(self, context):
# TODO prop: lock active (arrange everything without moving active node)
nodes, links = get_nodes_links(context)
margin = self.margin
@ -2684,8 +2684,11 @@ class NWAlignNodes(Operator, NWBase):
selection.append(node)
# If no nodes are selected, align all nodes
active_loc = None
if not selection:
selection = nodes
elif nodes.active in selection:
active_loc = copy(nodes.active.location) # make a copy, not a reference
# Check if nodes should be layed out horizontally or vertically
x_locs = [n.location.x + (n.dimensions.x / 2) for n in selection] # use dimension to get center of node, not corner
@ -2717,14 +2720,19 @@ class NWAlignNodes(Operator, NWBase):
current_pos -= (current_margin * 0.3) + node.dimensions.y # use half-margin for vertical alignment
node.location.x = mid_x - (node.dimensions.x / 2)
# Position nodes centered around where they used to be
locs = ([n.location.x + (n.dimensions.x / 2) for n in selection]) if horizontal else ([n.location.y - (n.dimensions.y / 2) for n in selection])
new_mid = (max(locs) + min(locs)) / 2
for node in selection:
if horizontal:
node.location.x += (mid_x - new_mid)
else:
node.location.y += (mid_y - new_mid)
# If active node is selected, center nodes around it
if active_loc is not None:
active_loc_diff = active_loc - nodes.active.location
for node in selection:
node.location += active_loc_diff
else: # Position nodes centered around where they used to be
locs = ([n.location.x + (n.dimensions.x / 2) for n in selection]) if horizontal else ([n.location.y - (n.dimensions.y / 2) for n in selection])
new_mid = (max(locs) + min(locs)) / 2
for node in selection:
if horizontal:
node.location.x += (mid_x - new_mid)
else:
node.location.y += (mid_y - new_mid)
return {'FINISHED'}