Skip to content

Commit

Permalink
Added support to work with edge and face selections
Browse files Browse the repository at this point in the history
  • Loading branch information
theRussetPotato committed Nov 14, 2021
1 parent 135db8f commit e551fe8
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 39 deletions.
33 changes: 20 additions & 13 deletions scripts/weights_editor_tool/weights_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@

class WeightsEditor(QtWidgets.QMainWindow):

version = "2.1.0"
version = "2.1.1"
instance = None
cb_selection_changed = None
shortcuts = []
Expand Down Expand Up @@ -386,7 +386,7 @@ def create_gui(self):
self.smooth_strength_spinbox = QtWidgets.QDoubleSpinBox(value=1, parent=self.central_widget)
self.smooth_strength_spinbox.setToolTip("Smooth's strength.")
self.smooth_strength_spinbox.setMinimumWidth(50)
self.smooth_strength_spinbox.setDecimals(1)
self.smooth_strength_spinbox.setDecimals(2)
self.smooth_strength_spinbox.setMinimum(0)
self.smooth_strength_spinbox.setMaximum(1)
self.smooth_strength_spinbox.setSingleStep(0.1)
Expand Down Expand Up @@ -1088,7 +1088,7 @@ def recollect_table_data(
self.skin_data = utils.get_skin_data(self.skin_cluster)

if update_verts:
self.vert_indexes = utils.get_vert_indexes(current_obj)
self.vert_indexes = utils.extract_indexes(utils.get_vert_indexes(current_obj))

if update_infs:
self.collect_display_infs()
Expand Down Expand Up @@ -1261,7 +1261,7 @@ def run_smooth(self, smooth_operation):
OpenMaya.MGlobal.displayWarning("No object to operate on.")
return

selected_vertexes = utils.get_vert_indexes(current_obj)
selected_vertexes = utils.extract_indexes(utils.get_vert_indexes(current_obj))
if not selected_vertexes:
OpenMaya.MGlobal.displayWarning("No vertexes are selected.")
return
Expand All @@ -1271,7 +1271,7 @@ def run_smooth(self, smooth_operation):
weights_view = self.get_active_weights_view()
table_selection = weights_view.save_table_selection()

sel_vert_indexes = utils.get_vert_indexes(current_obj)
sel_vert_indexes = utils.extract_indexes(utils.get_vert_indexes(current_obj))

if smooth_operation == SmoothOperation.Normal:
utils.smooth_weights(
Expand Down Expand Up @@ -1357,8 +1357,15 @@ def mirror_weights(self, selection_only):
weights_view = self.get_active_weights_view()
table_selection = weights_view.save_table_selection()

vert_indexes = utils.get_vert_indexes(current_obj, selection=selection_only)
vert_components = cmds.ls("{0}.vtx[*]".format(current_obj), sl=selection_only, fl=True)
if selection_only:
vert_indexes = utils.extract_indexes(utils.get_vert_indexes(current_obj))
else:
vert_indexes = utils.extract_indexes(utils.get_all_vert_indexes(current_obj))

vert_plugs = [
"{0}.vtx[{1}]".format(current_obj, index)
for index in vert_indexes
]

mirror_mode = self.mirror_mode.currentText().lstrip("-")
mirror_inverse = self.mirror_mode.currentText().startswith("-")
Expand All @@ -1382,7 +1389,7 @@ def mirror_weights(self, selection_only):
inf_association = inf_options[self.mirror_inf.currentText()]

utils.mirror_skin_weights(
vert_components,
vert_plugs,
mirror_mode,
mirror_inverse,
surface_association,
Expand Down Expand Up @@ -1591,7 +1598,7 @@ def prune_on_clicked(self):
weights_view = self.get_active_weights_view()
table_selection = weights_view.save_table_selection()

sel_vert_indexes = utils.get_vert_indexes(current_obj)
sel_vert_indexes = utils.extract_indexes(utils.get_vert_indexes(current_obj))

is_pruned = utils.prune_weights(current_obj, self.skin_cluster, self.prune_spinbox.value())
if not is_pruned:
Expand Down Expand Up @@ -1623,7 +1630,7 @@ def copy_vertex_on_clicked(self):
if not current_obj:
return

vert_indexes = utils.get_vert_indexes(current_obj)
vert_indexes = utils.extract_indexes(utils.get_vert_indexes(current_obj))
if not vert_indexes:
OpenMaya.MGlobal.displayError("Need a vertex to be selected.")
return
Expand All @@ -1641,7 +1648,7 @@ def paste_vertex_on_clicked(self):
if not current_obj:
return

vert_indexes = utils.get_vert_indexes(current_obj)
vert_indexes = utils.extract_indexes(utils.get_vert_indexes(current_obj))
if not vert_indexes:
return

Expand Down Expand Up @@ -1703,7 +1710,7 @@ def flood_to_closest_on_clicked(self):
weights_view = self.get_active_weights_view()
table_selection = weights_view.save_table_selection()

vert_indexes = utils.get_vert_indexes(current_obj, selection=False)
vert_indexes = utils.get_all_vert_indexes(current_obj)

utils.flood_weights_to_closest(current_obj, self.skin_cluster)

Expand Down Expand Up @@ -1809,7 +1816,7 @@ def add_inf_to_vert_on_clicked(self):
OpenMaya.MGlobal.displayError("There's no active object to work on.")
return

sel_vert_indexes = utils.get_vert_indexes(current_obj)
sel_vert_indexes = utils.extract_indexes(utils.get_vert_indexes(current_obj))
if not sel_vert_indexes:
OpenMaya.MGlobal.displayError("There's no selected vertexes to set on.")
return
Expand Down
50 changes: 25 additions & 25 deletions scripts/weights_editor_tool/weights_editor_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,24 +91,23 @@ def get_selected_mesh():
Returns:
A mesh from the selection or None if nothing valid was found.
"""
sel = cmds.ls(sl=True, transforms=True)
sel = cmds.ls(sl=True, long=True, transforms=True)

if not sel:
shapes = cmds.ls(sl=True, l=True, objectsOnly=True)
shapes = cmds.ls(sl=True, long=True, objectsOnly=True)
if shapes:
sel = cmds.listRelatives(shapes[0], f=True, parent=True)

if not sel:
return

if not cmds.listRelatives(sel[0], shapes=True, type="mesh"):
if not cmds.listRelatives(sel[0], shapes=True, type="nurbsCurve"):
return
if not cmds.listRelatives(sel[0], shapes=True, type=["mesh", "nurbsCurve"]):
return

return sel[0]


def to_m_object(obj):
def to_mobject(obj):
"""
Gets an object as a MObject wrapper.
Expand Down Expand Up @@ -184,7 +183,7 @@ def lerp_color(start_color, end_color, blend_value):
return QtGui.QColor(r, g, b)


def flatten_list_to_indexes(flatten_list):
def extract_indexes(flatten_list):
"""
Converts a flattened vertex list to numbers.
Expand All @@ -200,20 +199,25 @@ def flatten_list_to_indexes(flatten_list):
]


def get_vert_indexes(obj, selection=True):
def get_all_vert_indexes(obj):
"""
Gets and returns selected vertexes from the supplied object.
Gets and returns all vertexes from the supplied object.
"""
kwargs = {"fl": True}
if selection:
kwargs["sl"] = True
if is_curve(obj):
return cmds.ls("{0}.cv[*]".format(obj), long=True, flatten=True)
else:
return cmds.ls("{0}.vtx[*]".format(obj), long=True, flatten=True)


def get_vert_indexes(obj):
"""
Gets and returns selected vertexes from the supplied object.
"""
if is_curve(obj):
flatten_list = cmds.ls("{0}.cv[*]".format(obj), **kwargs)
return cmds.ls("{0}.cv[*]".format(obj), sl=True, long=True, flatten=True)
else:
flatten_list = cmds.ls("{0}.vtx[*]".format(obj), **kwargs)

return flatten_list_to_indexes(flatten_list)
components = filter(lambda x: x.startswith(obj), cmds.ls(sl=True, long=True, type="float3"))
return cmds.ls(cmds.polyListComponentConversion(components, toVertex=True), long=True, flatten=True)


def get_skin_cluster(obj):
Expand Down Expand Up @@ -287,7 +291,7 @@ def get_influence_ids(skin_cluster):
if not has_infs:
return []

skin_cluster_node = to_m_object(skin_cluster)
skin_cluster_node = to_mobject(skin_cluster)
skin_cluster_fn = OpenMayaAnim.MFnSkinCluster(skin_cluster_node)

# Collect influences
Expand Down Expand Up @@ -318,7 +322,7 @@ def get_skin_data(skin_cluster):
{vert_index:{"weights":{inf_name:weight_value...}, "dq"float}}
"""
# Create skin cluster function set
skin_cluster_node = to_m_object(skin_cluster)
skin_cluster_node = to_mobject(skin_cluster)
skin_cluster_fn = OpenMayaAnim.MFnSkinCluster(skin_cluster_node)

# Get MPlugs for weights
Expand Down Expand Up @@ -859,17 +863,13 @@ def prune_weights(obj, skin_cluster, prune_value):
Returns:
True on success.
"""
if is_curve(obj):
flatten_list = cmds.ls("{0}.cv[*]".format(obj), sl=True, fl=True)
else:
flatten_list = cmds.ls("{0}.vtx[*]".format(obj), sl=True, fl=True)

flatten_list = get_vert_indexes(obj)
if not flatten_list:
OpenMaya.MGlobal.displayWarning("No vertexes are selected.")
return
return False

cmds.skinPercent(skin_cluster, flatten_list, prw=prune_value, nrm=True)

return True


Expand Down
2 changes: 1 addition & 1 deletion scripts/weights_editor_tool/widgets/weights_table_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ def headerData(self, column, orientation, role):
else:
# Show side labels
if self.editor_inst.vert_indexes and column < len(self.editor_inst.vert_indexes):
return self.editor_inst.vert_indexes[column]
return "vtx[{0}]".format(self.editor_inst.vert_indexes[column])
elif role == QtCore.Qt.ToolTipRole:
if orientation == QtCore.Qt.Horizontal:
if self.display_infs and column < len(self.display_infs):
Expand Down

0 comments on commit e551fe8

Please sign in to comment.