Updated
This commit is contained in:
141
Scripts/Modeling/Select/SamePositionSelector.py
Normal file
141
Scripts/Modeling/Select/SamePositionSelector.py
Normal file
@ -0,0 +1,141 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import maya.cmds as cmds
|
||||
import maya.mel as mel
|
||||
|
||||
def save_setting():
|
||||
threshold = cmds.floatSliderGrp(SamePositionSelector_UI_Threshold_FS, q=True, v=True)
|
||||
check_bb = cmds.checkBox(SamePositionSelector_UI_CheckBB_CB, q=True, v=True)
|
||||
unselect = cmds.checkBox(SamePositionSelector_UI_UnselectBB_CB, q=True, v=True)
|
||||
cmds.optionVar(fv=("AriSamePositionS_Threshold", threshold))
|
||||
cmds.optionVar(iv=("AriSamePositionS_CheckBB", check_bb))
|
||||
cmds.optionVar(iv=("AriSamePositionS_Unselect", unselect))
|
||||
|
||||
def vector_much(val_a, val_b, gosa):
|
||||
return (val_a[0] <= val_b[0] + gosa and val_a[0] >= val_b[0] - gosa and
|
||||
val_a[1] <= val_b[1] + gosa and val_a[1] >= val_b[1] - gosa and
|
||||
val_a[2] <= val_b[2] + gosa and val_a[2] >= val_b[2] - gosa)
|
||||
|
||||
def check_bounding_box(object_list_name):
|
||||
gosa = cmds.floatSliderGrp(SamePositionSelector_UI_Threshold_FS, q=True, v=True)
|
||||
object_list_bb_min = [cmds.getAttr(obj + ".boundingBoxMin")[0] for obj in object_list_name]
|
||||
object_list_bb_max = [cmds.getAttr(obj + ".boundingBoxMax")[0] for obj in object_list_name]
|
||||
|
||||
same_obj_list = []
|
||||
for i in range(len(object_list_name)):
|
||||
bb_min_a, bb_max_a = object_list_bb_min[i], object_list_bb_max[i]
|
||||
local_counter = 0
|
||||
for j in range(i + 1, len(object_list_name)):
|
||||
if object_list_name[j] in same_obj_list:
|
||||
continue
|
||||
bb_min_b, bb_max_b = object_list_bb_min[j], object_list_bb_max[j]
|
||||
if vector_much(bb_min_a, bb_min_b, gosa) and vector_much(bb_max_a, bb_max_b, gosa):
|
||||
if local_counter == 0:
|
||||
same_obj_list.append(object_list_name[i])
|
||||
same_obj_list.append(object_list_name[j])
|
||||
local_counter += 1
|
||||
if local_counter != 0:
|
||||
same_obj_list.append(";")
|
||||
return same_obj_list
|
||||
|
||||
def select_list(obj_list):
|
||||
unselect_true = cmds.checkBox(SamePositionSelector_UI_UnselectBB_CB, q=True, v=True)
|
||||
first_true = unselect_true
|
||||
select_list = []
|
||||
for obj in obj_list:
|
||||
if obj != ";":
|
||||
if first_true:
|
||||
first_true = False
|
||||
continue
|
||||
select_list.append(obj)
|
||||
else:
|
||||
if unselect_true:
|
||||
first_true = True
|
||||
cmds.select(select_list)
|
||||
|
||||
def same_position_selector_select(*args):
|
||||
save_setting()
|
||||
bb_true = cmds.checkBox(SamePositionSelector_UI_CheckBB_CB, q=True, v=True)
|
||||
gosa = cmds.floatSliderGrp(SamePositionSelector_UI_Threshold_FS, q=True, v=True)
|
||||
object_list_name = cmds.ls(sl=True, tr=True)
|
||||
object_list_pos = [cmds.xform(obj, q=True, ws=True, piv=True)[:3] for obj in object_list_name]
|
||||
|
||||
same_obj_list = []
|
||||
for i in range(len(object_list_name)):
|
||||
pos_a = object_list_pos[i]
|
||||
local_counter = 0
|
||||
for j in range(i + 1, len(object_list_name)):
|
||||
if object_list_name[j] in same_obj_list:
|
||||
continue
|
||||
pos_b = object_list_pos[j]
|
||||
if vector_much(pos_a, pos_b, gosa):
|
||||
if local_counter == 0:
|
||||
same_obj_list.append(object_list_name[i])
|
||||
same_obj_list.append(object_list_name[j])
|
||||
local_counter += 1
|
||||
if local_counter != 0:
|
||||
same_obj_list.append(";")
|
||||
|
||||
if bb_true:
|
||||
same_bounding_box_list = []
|
||||
pair_list = []
|
||||
for obj in same_obj_list:
|
||||
if obj == ";":
|
||||
same_bounding_box_list.extend(check_bounding_box(pair_list))
|
||||
pair_list = []
|
||||
else:
|
||||
pair_list.append(obj)
|
||||
same_obj_list = same_bounding_box_list
|
||||
|
||||
select_list(same_obj_list)
|
||||
|
||||
def show():
|
||||
global SamePositionSelector_UI_Threshold_FS
|
||||
global SamePositionSelector_UI_CheckBB_CB
|
||||
global SamePositionSelector_UI_UnselectBB_CB
|
||||
|
||||
threshold = 0.01
|
||||
check_bb = True
|
||||
unselect = True
|
||||
|
||||
if cmds.optionVar(exists="AriSamePositionS_Threshold"):
|
||||
threshold = cmds.optionVar(q="AriSamePositionS_Threshold")
|
||||
if cmds.optionVar(exists="AriSamePositionS_CheckBB"):
|
||||
check_bb = cmds.optionVar(q="AriSamePositionS_CheckBB")
|
||||
if cmds.optionVar(exists="AriSamePositionS_Unselect"):
|
||||
unselect = cmds.optionVar(q="AriSamePositionS_Unselect")
|
||||
|
||||
window_name = "SamePositionSelector"
|
||||
if cmds.window(window_name, exists=True):
|
||||
cmds.deleteUI(window_name)
|
||||
|
||||
window = cmds.window(window_name, title="Same Position Selector", tlb=True,
|
||||
widthHeight=(300, 150), backgroundColor=(0.25, 0.25, 0.25),
|
||||
sizeable=True)
|
||||
|
||||
label_threshold = "Threshold"
|
||||
label_check_bb = "Check boundingbox"
|
||||
label_unselect = "Unselect first object"
|
||||
|
||||
main_layout = cmds.columnLayout(adjustableColumn=True)
|
||||
|
||||
cmds.rowLayout(numberOfColumns=2, columnWidth2=(80, 220), adjustableColumn=2, parent=main_layout)
|
||||
cmds.text(label=label_threshold)
|
||||
SamePositionSelector_UI_Threshold_FS = cmds.floatSliderGrp(field=True, minValue=0.0, maxValue=0.1, fieldMinValue=0.0, fieldMaxValue=1000, value=threshold, precision=6)
|
||||
cmds.setParent('..')
|
||||
|
||||
cmds.columnLayout(adjustableColumn=True, parent=main_layout)
|
||||
SamePositionSelector_UI_CheckBB_CB = cmds.checkBox(label=label_check_bb, value=check_bb)
|
||||
SamePositionSelector_UI_UnselectBB_CB = cmds.checkBox(label=label_unselect, value=unselect)
|
||||
cmds.setParent('..')
|
||||
|
||||
cmds.separator(height=10, style='in', parent=main_layout)
|
||||
|
||||
cmds.button(label="Select", command=same_position_selector_select, backgroundColor=(0.53, 0.81, 0.98), height=30, parent=main_layout)
|
||||
|
||||
cmds.window(window, edit=True, widthHeight=(300, 150))
|
||||
cmds.showWindow(window)
|
||||
|
||||
if __name__ == "__main__":
|
||||
show()
|
Reference in New Issue
Block a user