15 from pyfbsdk_additions
import *
18 def _sliderCallback(self,control,event):
19 if event.Type == FBEventName.kFBEventChange:
20 self.value.Text =
"%3.2f" % self.slider.Value
21 self._linkedproperty.Data=self.slider.Value
23 self._isCandidate=
True
24 elif event.Type ==FBEventName.kFBEventOnClick:
26 elif event.Type ==FBEventName.kFBEventExit:
29 def _valueCallback(self, control, event):
31 self.slider.Value = float(self.value.Text)
32 self._linkedproperty.Data = float(self.value.Text)
33 self.value.Text =
"%3.2f" % float(self.value.Text)
36 self._isCandidate=
True
38 def _nameCallback(self, control, event):
41 def _keyCallback(self, control, event):
44 def _clearCallback(self, control, event):
47 def _IdleCallback(self, control, event):
48 if not self._onChange:
51 def __init__(self, Aproperty):
52 from pyfbsdk
import FBAddRegionParam
53 from pyfbsdk
import FBAttachType
56 self._linkedproperty = Aproperty
57 self._onChange =
False
58 self._isCandidate =
False
59 self.slider = pyfbsdk.FBSlider()
60 self.value = pyfbsdk.FBEdit()
61 self.name = pyfbsdk.FBLabel()
62 self.name.Justify = FBTextJustify.kFBTextJustifyRight
63 self.key = pyfbsdk.FBButton()
65 self.key.Caption =
"Key"
66 self.clear = pyfbsdk.FBButton()
67 self.clear.Caption =
"Clear"
69 if Aproperty.IsAnimatable()
and Aproperty.GetDataTypeName().lower()==
"shape":
70 self.slider.Min = Aproperty.GetMin()
71 self.slider.Max = Aproperty.GetMax()
72 self.slider.Value = Aproperty.Data
73 self.value.Text =
"%3.2f" % Aproperty.Data
74 self.name.Caption = Aproperty.GetName()
78 self.slider.OnChange.Add(self._sliderCallback)
79 self.value.OnChange.Add(self._valueCallback)
80 self.key.OnClick.Add(self._keyCallback)
81 self.OnIdle.Add(self._IdleCallback)
82 self.clear.OnClick.Add(self._clearCallback)
85 self.Add(self.slider, 150, width = 35)
88 self.Add(self.clear, 25)
91 self.Add(self.key, 25)
94 self.Add(self.name, 25)
98 self.Add(self.value, 25)
101 def add(self,name,content):
102 self.tabpanel.Items.append(name)
103 self.tabcontents.append(content)
104 self.setContent(len(self.tabpanel.Items) - 1)
106 def setContent(self,index):
107 self.tabpanel.ItemIndex = index
108 self.SetControl(
"mainlyt",self.tabcontents[index])
111 self._linkedproperty.Key()
112 self._isCandidate=
False
115 self._isCandidate=
True
116 self.value.Text=
"0.0"
117 self._valueCallback(
None,FBEventChange())
119 def ClearAnimation(self):
120 self._isCandidate=
True
121 self._linkedproperty.GetAnimationNode().FCurve.EditClear()
125 self._linkedproperty.GetAnimationNode().KeyRemove()
127 def updateView(self):
128 if not self._onChange:
130 currentvalue = float(self.value.Text)
131 if currentvalue < self._linkedproperty.Data-precision
or currentvalue > self._linkedproperty.Data+precision:
132 self.value.Text=
"%3.2f" %self._linkedproperty.Data
133 self.slider.Value = self._linkedproperty.Data
134 if not self._isCandidate
and self._linkedproperty.GetAnimationNode().IsKey():
135 if self.key.State!=1:
138 if self.key.State!=0:
140 if self._linkedproperty.IsAnimatable()
and self._linkedproperty.GetAnimationNode().KeyCount>0:
141 self.key.Caption=
"Key *"
143 self.key.Caption=
"Key"
145 def GetBlendShapeProp(aModel):
147 for prop
in aModel.PropertyList:
148 if prop !=
None and prop.IsAnimatable()
and prop.GetDataTypeName().lower()==
"shape":
149 myproplist.append(prop)
153 def _KeyAllCallBack(self,control, event):
154 for each
in self._mySliderList:
157 def _ResetAllCallBack(self,control, event):
158 for each
in self._mySliderList:
161 def _ClearAllCallBack(self,control, event):
162 for each
in self._mySliderList:
163 each.ClearAnimation()
165 def __init__(self, Amodel):
166 from pyfbsdk
import FBAddRegionParam
167 from pyfbsdk
import FBAttachType
170 self._linkedModel = Amodel
171 self._mySliderList=list()
174 self.bkeyall.Caption=
"Key All"
176 self.brstall.Caption=
"Reset All"
178 self.bclrall.Caption=
"Clear All"
182 self.Add(self._myButtonsLay, 75)
184 self.bkeyall.OnClick.Add(self._KeyAllCallBack)
185 self._myButtonsLay.Add(self.bkeyall, 25)
188 self.brstall.OnClick.Add(self._ResetAllCallBack)
189 self._myButtonsLay.Add(self.brstall, 25)
192 self.bclrall.OnClick.Add(self._ClearAllCallBack)
193 self._myButtonsLay.Add(self.bclrall, 25)
196 for prop
in GetBlendShapeProp(self._linkedModel):
197 slider = SliderControl(prop)
198 self._mySliderList.append(slider)
199 self.Add(slider, 75, space = 10)
203 def GetBlendShapeModel():
205 for component
in FBSystem().Scene.Components:
206 if str(type(component)).lower().find(
"fbmodel")>-1:
208 for prop
in component.PropertyList:
209 if not prop==
None and prop.IsAnimatable()
and prop.GetDataTypeName().lower()==
"shape":
213 modelslist.append(component)
217 def DetachFromBlendShape(control, event):
221 for region
in regions.itervalues():
222 lyt.RemoveRegion(region)
226 def AttachToBlendShape(control, event):
227 DetachFromBlendShape(
None,
None)
230 models = GetBlendShapeModel()
232 anchor = FBAttachType.kFBAttachTop
234 for i, model
in enumerate(models):
236 blendShapeEditor = ModelBlendShapeUI(model)
238 arrowName =
"ArrowName" + str( i )
243 lyt.AddRegion(arrowName ,arrowName , x, y, w, h)
246 regions[model] = arrowName
247 lyt.SetControl(arrowName ,b)
251 b.SetContent( model.Name, blendShapeEditor, 2000, 300 )
252 blendShapeEditor.Restructure(
True)
254 anchor = FBAttachType.kFBAttachBottom
255 anchorRegion = arrowName
258 def SceneChanged(scene, event):
259 if event.Type == FBSceneChangeType.kFBSceneChangeDetach
and \
260 event.ChildComponent
in models:
261 lyt.RemoveRegion(regions[event.ChildComponent])
262 models.remove(event.ChildComponent)
265 def OnToolDestroy(control,event):
268 FBSystem().Scene.OnChange.Remove(SceneChanged)
277 tool.StartSizeX = 400
278 tool.StartSizeY = 200
281 scroll.SetContentSize(2000,10000)
288 tool.AddRegion(
"main",
"main", x, y, w, h)
289 tool.SetControl(
"main",mainLyt)
293 btn.Caption =
"Attach"
294 btn.OnClick.Add(AttachToBlendShape)
298 btn.Caption =
"Detach"
299 btn.OnClick.Add(DetachFromBlendShape)
302 mainLyt.Add(btnbar, 30)
304 mainLyt.AddRelative(scroll)
309 FBSystem().Scene.OnChange.Add(SceneChanged)
312 tool.OnUnbind.Add(OnToolDestroy)