Bake object

On 25/09/2014 at 15:48, xxxxxxxx wrote:

Is there a way to access / use the Bake Object function in the Timeline using Python?
So, set variables in the Bake Object Dialog and simulate the OK button?

c4d.CallCommand(465001219) # Bake Objects...
    tool=doc.GetAction()
    tool=c4d.plugins.FindPlugin(tool, c4d.PLUGINTYPE_TOOL)

will open the dialog, but how proceed?
Also the tool returned is not Bake Object...

-Pim

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()  
  

On 29/09/2014 at 00:45, xxxxxxxx wrote:

Great, thank you.

-Pim

On 29/09/2014 at 06:50, xxxxxxxx wrote:

you´re welcome.

I guess the baking tool is´nt even a normal tool.
I can´t find something about it in the docs.

Anyway there is a lot to do to make it a full version.
Baking expressions , clean up the tracks and make a copy.

good luck
Martin