Tasks/MatchAuxiliaryEffectors.py

Tasks/MatchAuxiliaryEffectors.py
1 # Copyright 2010 Autodesk, Inc. All rights reserved.
2 # Use of this software is subject to the terms of the Autodesk license agreement
3 # provided at the time of installation or download, or which otherwise accompanies
4 # this software in either electronic or hard copy form.
5 #
6 # Topic: Auxiliary effectors
7 #
8 
9 from pyfbsdk import *
10 from pyfbsdk_additions import *
11 
12 # Function
13 def IsAuxIKPivot(pModel):
14  if pModel and pModel.Is(FBModelMarker_TypeInfo()):
15  lIKSyncProp = pModel.PropertyList.Find("IKSync",False)
16  lIKDrawLink = pModel.PropertyList.Find("DrawLink",False)
17  if lIKSyncProp and lIKDrawLink and lIKSyncProp.Data and lIKDrawLink.Data:
18  return True
19  return False
20 
21 # Clear all auxiliary on given effector
22 def ClearAuxEffectors(pCharacter, pEffectorId):
23  lAuxToClear = []
24  for lSetId in FBEffectorSetID.values.values():
25  # Default set should not be deleted.
26  if lSetId == FBEffectorSetID.FBEffectorSetDefault: continue
27 
28  lAuxEffector = pCharacter.GetEffectorModel(pEffectorId,lSetId)
29  if lAuxEffector:
30  lAuxToClear.append(lAuxEffector)
31  else: break
32 
33  # Clear the list
34  for lModel in reversed(lAuxToClear):
35  lModel.FBDelete()
36 
37 # Match auxiliary on dst to src character for given effector
38 def MatchEffector(pSrcCharacter, pDstCharacter, pEffectorId):
39  lDstEffectorModel = pDstCharacter.GetEffectorModel(pEffectorId)
40  if lDstEffectorModel:
41  ClearAuxEffectors(pDstCharacter,pEffectorId)
42  for lSetId in FBEffectorSetID.values.values():
43  if lSetId == FBEffectorSetID.FBEffectorSetDefault: continue
44 
45  lSrcAuxEffectorModel = pSrcCharacter.GetEffectorModel(pEffectorId,lSetId)
46  if lSrcAuxEffectorModel:
47  lIsAuxPivot = IsAuxIKPivot(lSrcAuxEffectorModel)
48  if pDstCharacter.CreateAuxiliary(pEffectorId,lIsAuxPivot) == False:
49  print "Error!"
50  break
51 
52  if lIsAuxPivot:
53  pDstCharacter.GetEffectorModel(pEffectorId,lSetId).IKPivot = lSrcAuxEffectorModel.IKPivot
54  else:
55  break
56 
57 # Match dst character auxiliary effectors to src character
58 def MatchAuxiliary(pSrcCharacter, pDstCharacter):
59  if pSrcCharacter and pDstCharacter:
60  for lEffectorId in FBEffectorId.values.values():
61  if pSrcCharacter.GetEffectorModel(lEffectorId):
62  MatchEffector(pSrcCharacter, pDstCharacter,lEffectorId)
63  return True
64  else:
65  print "Missing params"
66  return False
67 
68 # Tool
69 gToolName = "MatchAuxiliaries"
70 gSystem = FBSystem()
71 gScene = gSystem.Scene
72 gDevelopment = True
73 
74 class MatchAuxiliariesTool(FBTool):
75  def SrcDrop(self,pEvent,pControl):
76  if pEvent.State == FBDragAndDropState.kFBDragAndDropDrag:
77  if pEvent.Components[0].Is(FBCharacter_TypeInfo()):
78  pEvent.Accept()
79  elif pEvent.State == FBDragAndDropState.kFBDragAndDropDrop:
80  self.mSrcChar = pEvent.Components[0]
81  pControl.Items.removeAll()
82  pControl.Items.append(self.mSrcChar.Name)
83 
84  def DstDrop(self,pEvent,pControl):
85  if pEvent.State == FBDragAndDropState.kFBDragAndDropDrag:
86  if pEvent.Components[0].Is(FBCharacter_TypeInfo()):
87  pEvent.Accept()
88  elif pEvent.State == FBDragAndDropState.kFBDragAndDropDrop:
89  self.mDstChar = pEvent.Components[0]
90  pControl.Items.removeAll()
91  pControl.Items.append(self.mDstChar.Name)
92 
93  def __init__(self):
94  FBTool.__init__(self,gToolName)
95  FBAddTool(self)
96 
97  self.mSrcChar = None
98  self.mDstChar = None
99 
100  lLblSrcCharacter = FBLabel()
101  lLblDstCharacter = FBLabel()
102  lCntSrcCharacter = FBVisualContainer()
103  lCntDstCharacter = FBVisualContainer()
104  lBtnMatch = FBButton()
105 
106  lLblSrcCharacter.Caption = "Source Character:"
107  lLblDstCharacter.Caption = "Destination Character:"
108  lBtnMatch.Caption = "Match auxiliary"
109 
110  lVLt = FBVBoxLayout()
111  x = FBAddRegionParam(5,FBAttachType.kFBAttachLeft,"")
112  y = FBAddRegionParam(5,FBAttachType.kFBAttachTop,"")
113  w = FBAddRegionParam(-5,FBAttachType.kFBAttachRight,"")
114  h = FBAddRegionParam(-5,FBAttachType.kFBAttachBottom,"")
115  self.AddRegion("Main" ,"Main" , x, y, w, h)
116  self.SetControl("Main" ,lVLt)
117 
118  lHLt = FBHBoxLayout(FBAttachType.kFBAttachLeft)
119  lHLt.AddRelative(lLblSrcCharacter,0.5)
120  lHLt.AddRelative(lCntSrcCharacter,0.5)
121  lVLt.Add(lHLt,20)
122  lHLt = FBHBoxLayout(FBAttachType.kFBAttachLeft)
123  lHLt.AddRelative(lLblDstCharacter,0.5)
124  lHLt.AddRelative(lCntDstCharacter,0.5)
125  lVLt.Add(lHLt,20)
126  lVLt.Add(lBtnMatch,20)
127 
128  lCntSrcCharacter.OnDragAndDrop.Add(lambda control = None, event = None : self.SrcDrop(event,control))
129  lCntDstCharacter.OnDragAndDrop.Add(lambda control = None, event = None : self.DstDrop(event,control))
130  lBtnMatch.OnClick.Add(lambda control = None, event = None : MatchAuxiliary(self.mSrcChar,self.mDstChar))
131 
132  if len(gScene.Characters):
133  self.mSrcChar = gScene.Characters[0]
134  lCntSrcCharacter.Items.append(self.mSrcChar.Name)
135  if len(gScene.Characters)>1:
136  self.mDstChar = gScene.Characters[1]
137  lCntDstCharacter.Items.append(self.mDstChar.Name)
138 
139  self.StartSizeX = 250
140  self.StartSizeY = 115
141 
142 # Display
143 if gDevelopment:
144  FBDestroyToolByName(gToolName)
145 
146 if gToolName in FBToolList:
147  tool = FBToolList[gToolName]
148  ShowTool(tool)
149 else:
150  tool=MatchAuxiliariesTool()
151  if gDevelopment:
152  ShowTool(tool)