On 28/09/2014 at 12:30, xxxxxxxx wrote:
Hi Pim,
doc.GetAction() is the actual tool like e.g.liveselection.
The dialog initializes the next tool, in this case the bake tool, but no action jet.
As we discussed, here a small version of the bake tool to begin with.
cheers
Martin
import c4d
from c4d import gui,utils
##### monkeytack bake script #####
def SetCTracks(self,pos,rot,scale,pla,animP) :
trpX = None
trpY = None
trpZ = None
trrX = None
trrY = None
trrZ = None
trsX = None
trsY = None
trsZ = None
trPLA = None
trs = op.GetCTracks()
if trs != None:
for tr in trs:
if tr.GetDescriptionID()[0].id == c4d.ID_BASEOBJECT_POSITION:
if tr.GetDescriptionID()[1].id == c4d.VECTOR_X:
trpX = tr
if tr.GetDescriptionID()[1].id == c4d.VECTOR_Y:
trpY = tr
if tr.GetDescriptionID()[1].id == c4d.VECTOR_Z:
trpZ = tr
if tr.GetDescriptionID()[0].id == c4d.ID_BASEOBJECT_ROTATION:
if tr.GetDescriptionID()[1].id == c4d.VECTOR_X:
trrX = tr
if tr.GetDescriptionID()[1].id == c4d.VECTOR_Y:
trrY = tr
if tr.GetDescriptionID()[1].id == c4d.VECTOR_Z:
trrZ = tr
if tr.GetDescriptionID()[0].id == c4d.ID_BASEOBJECT_SCALE:
if tr.GetDescriptionID()[1].id == c4d.VECTOR_X:
trsX = tr
if tr.GetDescriptionID()[1].id == c4d.VECTOR_Y:
trsY = tr
if tr.GetDescriptionID()[1].id == c4d.VECTOR_Z:
trsZ = tr
if tr.GetDescriptionID()[0].id == c4d.CTpla:
trPLA = tr
if animP == False:
if pos == True and trpX == None:
trpX = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0, ), c4d.DescLevel(c4d.VECTOR_X, c4d.DTYPE_REAL, 0)))
self.InsertTrackSorted(trpX)
if pos == True and trpY == None:
trpY = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0, ), c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)))
self.InsertTrackSorted(trpY)
if pos == True and trpZ == None:
trpZ = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0, ), c4d.DescLevel(c4d.VECTOR_Z, c4d.DTYPE_REAL, 0)))
self.InsertTrackSorted(trpZ)
if rot == True and trrX == None:
trrX = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_ROTATION, c4d.DTYPE_VECTOR, 0, ), c4d.DescLevel(c4d.VECTOR_X, c4d.DTYPE_REAL, 0)))
self.InsertTrackSorted(trrX)
if rot == True and trrY == None:
trrY = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_ROTATION, c4d.DTYPE_VECTOR, 0, ), c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)))
self.InsertTrackSorted(trrY)
if rot == True and trrZ == None:
trrZ = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_ROTATION, c4d.DTYPE_VECTOR, 0, ), c4d.DescLevel(c4d.VECTOR_Z, c4d.DTYPE_REAL, 0)))
self.InsertTrackSorted(trrZ)
if scale == True and trsX == None:
trsX = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_SCALE, c4d.DTYPE_VECTOR, 0, ), c4d.DescLevel(c4d.VECTOR_X, c4d.DTYPE_REAL, 0)))
self.InsertTrackSorted(trsX)
if scale == True and trsY == None:
trsY = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_SCALE, c4d.DTYPE_VECTOR, 0, ), c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)))
self.InsertTrackSorted(trsY)
if scale == True and trsZ == None:
trsZ = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_SCALE, c4d.DTYPE_VECTOR, 0, ), c4d.DescLevel(c4d.VECTOR_Z, c4d.DTYPE_REAL, 0)))
self.InsertTrackSorted(trsZ)
if pla == True and trPLA == None:
trPLA = c4d.CTrack(self, c4d.DescID(c4d.DescLevel(c4d.CTpla, c4d.CTpla, 0)))
self.InsertTrackSorted(trPLA)
trs.append(trPLA)
c4d.EventAdd()
return trs
def SetCurrentFr(FR, doc) :
doc.SetTime(c4d.BaseTime(float(FR)/doc.GetFps()))
doc.ExecutePasses(None, True, True, True, 0);
c4d.GeSyncMessage(c4d.EVMSG_TIMECHANGED)
return
def BakeObject(obj,doc,fFR,lFR,trs) :
time = doc.GetTime()
fps = doc.GetFps()
#SendModelingCommand container for PLA
settings = c4d.BaseContainer()
settings.SetBool(c4d.MDATA_CURRENTSTATETOOBJECT_INHERITANCE, True)
settings.SetBool(c4d.MDATA_CURRENTSTATETOOBJECT_KEEPANIMATION, True)
settings.SetBool(c4d.MDATA_CURRENTSTATETOOBJECT_NOGENERATE,False)
for FR in range(fFR,(lFR+1)) :
c4d.StatusSetBar(100*(FR-fFR)/(lFR-fFR))
SetCurrentFr(FR, doc)
CurrTime = c4d.BaseTime(FR,fps)
#bake
for tr in trs:
curve=tr.GetCurve()
val = curve.GetValue(CurrTime, fps)
if tr.GetDescriptionID()[0].id == c4d.CTpla:
newobjList = utils.SendModelingCommand(
command = c4d.MCOMMAND_CURRENTSTATETOOBJECT,
list= [obj.GetClone()],
mode=c4d.MODELINGCOMMANDMODE_ALL,
bc = settings,
doc = doc)
newObj = newobjList[-1]
keyPLA = curve.AddKey(CurrTime)['key']
tr.FillKey(doc,newObj,keyPLA)
else:
key = curve.AddKey(CurrTime)['key']
key.SetValue(curve, val)
#update timeline
c4d.GeSyncMessage(c4d.EVMSG_TIMECHANGED)
print "object baked"
#reset timeline
doc.SetTime(time)
c4d.EventAdd(c4d.EVENT_ANIMATE)
c4d.StatusClear()
return
def main() :
if op==None:return
doc = c4d.documents.GetActiveDocument()
#########################################
#params
fFR = 0 #firstframe
lFR = 20 #lastframe
allP = True
if allP == True:
p = True #position
r = True #rotation
s = True #scale
PLA = True #Pointlevel
#else set some values
animP = True #only animated parameters
#########################################
trs = SetCTracks(op,p,r,s,PLA,animP)
BakeObject(op,doc,fFR,lFR,trs)
c4d.EventAdd()
if __name__=='__main__':
main()