my funeral week

少しでも日々の生活に変化を。

MayaScripts_AttachTransform : TransformのAttach

Maya2023からですかね?ようやく任意のTransformノード同士の位置合わせが標準で出来るようになったっぽいですね。 ・・・いや、遅いだろて!

もう作ってるて!

AttachTransform

# encoding=utf8
import pymel.core as pm

VERSION = "0.1"

print("\n*import {0}.{1}".format(__name__,VERSION))

def getTranslate (target):
    # type(pm.PyNode) -> list[float, float, float]
    return pm.xform(target, q = True, ws = True, t = True)

def getRotate (target):
    # type(pm.PyNode) -> list[float, float, float]
    return pm.xform(target, q = True, ws = True, ro = True)

def setTranslate (target, vector):
    # type(pm.PyNode, list[float, float, float]) -> None
    pm.xform(target, ws = True, t = vector)
    
def setRotate (target, angle):
    # type(pm.PyNode, list[float, float, float]) -> None
    pm.xform(target, ws = True, ro = angle)
    
def attachTranslate (master, slave):
    # type(pm.PyNode, pm.PyNode) -> None
    vector = getTranslate(master)
    setTranslate(slave, vector)
    
def attachRotate (master, slave):
    # type(pm.PyNode, pm.PyNode) -> None
    angle = getRotate(master)
    setRotate(slave, angle)
    
def attachTransform (master, slave):
    # type(pm.PyNode, pm.PyNode) -> None
    attachTranslate(master, slave)
    attachRotate(master, slave) 
    
def getMasterAndSlavesFromSelected ():
    # type() -> list[pm.PyNode]
    target = pm.selected()
    
    if len(target) < 2:
        return None
    
    return target
    
def main ():
    
    target = getMasterAndSlavesFromSelected()
    if not target : return
    
    master = target[-1]
    
    modifier = pm.getModifiers()

    attachFuncs = {
        0:attachTransform,#none
        4:attachTranslate,#ctrl
        8:attachRotate#alt
    }
    
    for i in target[:-1]:
        attachFuncs[modifier](master,i)
        
    pm.headsUpMessage("*{0}* AttachTransform done *{0}*".format("-"*50))

使い方

Attachしたいノードを選択し、実行すると、最後に選択されたノードをターゲットとして、位置と回転を合わせます。

Ctrlを押しながら実行すると、位置のみをAttachします。

Altを押しながら実行すると、回転のみをAttachします。

以上。