3

親子関係、制約、または別のオブジェクトへの接続を介してオブジェクトが依存しているかどうかを確認する方法はありますか? オブジェクトをペアレント化する前にこのチェックを行い、依存関係のサイクルが発生するかどうかを確認したいと思います。

3DsMax には、これを正確に実行するためのコマンドがあったことを覚えています。確認OpenMayaしましたが、何も見つかりませんでした。ありますがcmds.cycleCheck、これは現在サイクルがある場合にのみ機能し、使用するには遅すぎます。

注意が必要なのは、これら 2 つのオブジェクトがシーン階層のどこにでもある可能性があるため、直接の親子関係がある場合とない場合があることです。


編集

階層が問題を引き起こすかどうかを確認するのは比較的簡単です。

children = cmds.listRelatives(obj1, ad = True, f = True)
if obj2 in children:
    print "Can't parent to its own children!"

ただし、制約または接続を確認することは別の話です。

4

2 に答える 2

1

これは最もエレガントなアプローチではありませんが、これまでのところ問題なく機能しているように見える、迅速で汚れた方法です。サイクルが発生した場合は、操作を元に戻し、残りのスクリプトを停止するという考え方です。リグでテストすると、接続がどれほど複雑であっても問題なくキャッチされます。

# Class to use to undo operations
class UndoStack():
    def __init__(self, inputName = ''):
        self.name = inputName

    def __enter__(self):
        cmds.undoInfo(openChunk = True, chunkName = self.name, length = 300)

    def __exit__(self, type, value, traceback):
        cmds.undoInfo(closeChunk = True)

# Create a sphere and a box
mySphere = cmds.polySphere()[0]
myBox = cmds.polyCube()[0]

# Parent box to the sphere
myBox = cmds.parent(myBox, mySphere)[0]

# Set constraint from sphere to box (will cause cycle)
with UndoStack("Parent box"):
    cmds.parentConstraint(myBox, mySphere)

# If there's a cycle, undo it
hasCycle = cmds.cycleCheck([mySphere, myBox])
if hasCycle:
    cmds.undo()
    cmds.warning("Can't do this operation, a dependency cycle has occurred!")
于 2015-10-30T02:44:24.870 に答える