Files
Nexus/2023/scripts/rigging_tools/ngskintools2/api/import_v1.py
2025-11-24 08:27:50 +08:00

104 lines
3.1 KiB
Python

# for same mesh, convert from v1 layers to v2
from maya import cmds, mel
from ngSkinTools2.api.log import getLogger
from ngSkinTools2.decorators import undoable
logger = getLogger("import v1")
__has_v1 = None
def has_v1():
global __has_v1
if __has_v1 is not None:
return __has_v1
__has_v1 = False
try:
cmds.loadPlugin('ngSkinTools')
__has_v1 = True
except:
pass
def can_import(target):
if not has_v1():
return False
try:
result = cmds.ngSkinLayer(target, q=True, lda=True)
return result == 1
except Exception as err:
logger.error(err)
return False
def cleanup(selection):
"""
Delete V1 data from provided list of nodes. Must be a v1 compatible target
:type selection: list[string]
"""
for s in selection:
hist = cmds.listHistory(s) or []
skinClusters = [i for i in hist if cmds.nodeType(i) in ('skinCluster')]
cmds.delete(
[
i
for skinCluster in skinClusters
for i in cmds.listHistory(skinCluster, future=True, levels=1)
if cmds.nodeType(i) in ('ngSkinLayerDisplay', 'ngSkinLayerData')
]
)
@undoable
def import_layers(target):
if not has_v1():
return False
import ngSkinTools2.api as ngst_api
layers = ngst_api.init_layers(target)
layerList = cmds.ngSkinLayer(target, q=True, listLayers=True)
layerList = [layerList[i : i + 3] for i in range(0, len(layerList), 3)]
layerIdMap = {0: None}
def get_layer_influences(layerId):
influences = mel.eval("ngSkinLayer -id {0} -q -listLayerInfluences -activeInfluences {1}".format(layerId, target)) or []
return zip(influences[0::2], map(int, influences[1::2]))
def get_layer_weights(layerId, infl):
return mel.eval("ngSkinLayer -id {0:d} -paintTarget {1} -q -w {2:s}".format(layerId, infl, target))
def copy_layer(oldLayerId, newLayer):
"""
:type oldLayerId: int
:type newLayer: ngSkinTools2.api.layers.Layer
"""
newLayer.opacity = mel.eval("ngSkinLayer -id {0:d} -q -opacity {1:s}".format(oldLayerId, target))
newLayer.enabled = mel.eval("ngSkinLayer -id {0:d} -q -enabled {1:s}".format(oldLayerId, target))
newLayer.set_weights(ngst_api.NamedPaintTarget.MASK, get_layer_weights(oldLayerId, "mask"))
newLayer.set_weights(ngst_api.NamedPaintTarget.DUAL_QUATERNION, get_layer_weights(oldLayerId, "dq"))
for inflPath, inflId in get_layer_influences(oldLayerId):
logger.info("importing influence %s for layer %s", inflPath, oldLayerId)
weights = get_layer_weights(oldLayerId, inflId)
newLayer.set_weights(inflId, weights)
with ngst_api.suspend_updates(target):
for layerId, layerName, layerParent in layerList:
layerId = int(layerId)
layerParent = int(layerParent)
newLayer = layers.add(name=layerName, force_empty=True, parent=layerIdMap[layerParent])
newLayer.index = 0
layerIdMap[layerId] = newLayer.id
copy_layer(layerId, newLayer)