Node Wrangler: Improved accuracy on Align Nodes operator #104551
@ -2359,49 +2359,57 @@ class NWAlignNodes(Operator, NWBase):
|
|||||||
|
|
||||||
# Check if nodes should be laid out horizontally or vertically
|
# Check if nodes should be laid out horizontally or vertically
|
||||||
# use dimension to get center of node, not corner
|
# use dimension to get center of node, not corner
|
||||||
x_locs = [n.location.x + (n.dimensions.x / 2) for n in selection]
|
x_locs = [n.location.x + (0.5 * n.dimensions.x) for n in selection]
|
||||||
y_locs = [n.location.y - (n.dimensions.y / 2) for n in selection]
|
y_locs = [n.location.y - (0.5 * n.dimensions.y) for n in selection]
|
||||||
x_range = max(x_locs) - min(x_locs)
|
x_range = max(x_locs) - min(x_locs)
|
||||||
y_range = max(y_locs) - min(y_locs)
|
y_range = max(y_locs) - min(y_locs)
|
||||||
mid_x = (max(x_locs) + min(x_locs)) / 2
|
mid_x = 0.5 * (max(x_locs) + min(x_locs))
|
||||||
mid_y = (max(y_locs) + min(y_locs)) / 2
|
mid_y = 0.5 * (max(y_locs) + min(y_locs))
|
||||||
horizontal = x_range > y_range
|
horizontal = x_range > y_range
|
||||||
|
|
||||||
# Sort selection by location of node mid-point
|
# Sort selection by location of node mid-point
|
||||||
if horizontal:
|
if horizontal:
|
||||||
selection = sorted(selection, key=lambda n: n.location.x + (n.dimensions.x / 2))
|
selection.sort(key=lambda n: n.location.x + (n.dimensions.x / 2))
|
||||||
else:
|
else:
|
||||||
selection = sorted(selection, key=lambda n: n.location.y - (n.dimensions.y / 2), reverse=True)
|
selection.sort(key=lambda n: n.location.y - (n.dimensions.y / 2), reverse=True)
|
||||||
|
|
||||||
# Alignment
|
# Alignment
|
||||||
current_pos = 0
|
current_pos = 0
|
||||||
for node in selection:
|
|
||||||
current_margin = margin
|
|
||||||
current_margin = current_margin * 0.5 if node.hide else current_margin # use a smaller margin for hidden nodes
|
|
||||||
|
|
||||||
if horizontal:
|
if horizontal:
|
||||||
|
for node in selection:
|
||||||
|
current_margin = (0.5 * margin) if node.hide else margin
|
||||||
|
|
||||||
node.location.x = current_pos
|
node.location.x = current_pos
|
||||||
|
node.location.y = mid_y + (0.5 * node.dimensions.y)
|
||||||
current_pos += current_margin + node.dimensions.x
|
current_pos += current_margin + node.dimensions.x
|
||||||
node.location.y = mid_y + (node.dimensions.y / 2)
|
|
||||||
else:
|
else:
|
||||||
|
for node in selection:
|
||||||
|
current_margin = (0.5 * margin) if node.hide else margin
|
||||||
|
|
||||||
node.location.y = current_pos
|
node.location.y = current_pos
|
||||||
|
node.location.x = mid_x - (0.5 * node.dimensions.x)
|
||||||
current_pos -= (current_margin * 0.3) + node.dimensions.y # use half-margin for vertical alignment
|
current_pos -= (current_margin * 0.3) + node.dimensions.y # use half-margin for vertical alignment
|
||||||
node.location.x = mid_x - (node.dimensions.x / 2)
|
|
||||||
|
|
||||||
# If active node is selected, center nodes around it
|
# If active node is selected, center nodes around it
|
||||||
if active_loc is not None:
|
if active_loc is not None:
|
||||||
active_loc_diff = active_loc - active_node.location
|
active_loc_diff = active_loc - active_node.location
|
||||||
for node in selection:
|
for node in selection:
|
||||||
node.location += active_loc_diff
|
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]
|
elif horizontal: # Position nodes centered around where they used to be
|
||||||
) if horizontal else ([n.location.y - (n.dimensions.y / 2) for n in selection])
|
new_locs = [n.location.x + (0.5 * n.dimensions.x) for n in selection]
|
||||||
new_mid = (max(locs) + min(locs)) / 2
|
new_mid = 0.5 * (max(new_locs) + min(new_locs))
|
||||||
|
x_diff = mid_x - new_mid
|
||||||
|
|
||||||
for node in selection:
|
for node in selection:
|
||||||
if horizontal:
|
node.location.x += x_diff
|
||||||
node.location.x += (mid_x - new_mid)
|
|
||||||
else:
|
else:
|
||||||
node.location.y += (mid_y - new_mid)
|
new_locs = [n.location.y - (0.5 * n.dimensions.y) for n in selection]
|
||||||
|
new_mid = 0.5 * (max(new_locs) + min(new_locs))
|
||||||
|
y_diff = mid_y - new_mid
|
||||||
|
|
||||||
|
for node in selection:
|
||||||
|
node.location.y += y_diff
|
||||||
|
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user