Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Selected Keys? Move Keys?

    PYTHON Development
    0
    31
    21.3k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 01/03/2011 at 00:42, xxxxxxxx wrote:

      Making an effort to understand what I'm seeing

      Line 14 function call within itself - seems incorrect?
             
      MoveSelectedKeys(op,offset,timeln)

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 01/03/2011 at 07:21, xxxxxxxx wrote:

        I am sorry, I may can go to my pc this weekend, but not earlier.

        Does the Console tell you this ? O.o

        If A function calls itself, everything starts again. But you may have changed some values before. (Here the timeln variable)

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

          On 02/03/2011 at 01:03, xxxxxxxx wrote:

          Can anyone tell me why this message 
          doesn't pop up if NO object is selected using the function from the code above?

          lst = GetActiveObjects(doc)
              op = lst[0]
              if not op:
                  gui.MessageDialog("No objects selected") 
                  return False #leave the script if not an object

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

            On 02/03/2011 at 02:37, xxxxxxxx wrote:

            Dunnoo .. Gonna test this this weekend. Maybe it's because op = lst[0] ist not in the right column ?

              lst = GetActiveObjects(doc)
              op = lst[0] ## here
                if not op:
                    gui.MessageDialog("No objects selected") 
                    return False #leave the script if not an object
            
            1 Reply Last reply Reply Quote 0
            • H
              Helper
              last edited by

              THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

              On 02/03/2011 at 03:03, xxxxxxxx wrote:

              Hi Nux

              nope, not that - must be forum paste incorrect
              indent is as your example

              appreciate you can't test at moment

              I think its to do with this function setting op to the first object in doc
              if nothing selected
              that way op is never NULL 
              #####################################
              def GetActiveObjects(doc) :
                  import c4d
                  lst = list()
                  op = doc.GetFirstObject()
                  while op:
                      if op.GetBit(c4d.BIT_ACTIVE) == True: lst.append(op)
                      op = GetHNext(op)
                  return lst
              #####################################

              1 Reply Last reply Reply Quote 0
              • H
                Helper
                last edited by

                THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                On 02/03/2011 at 03:22, xxxxxxxx wrote:

                the list only gets appended if op is selected.

                1 Reply Last reply Reply Quote 0
                • H
                  Helper
                  last edited by

                  THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                  On 03/03/2011 at 06:11, xxxxxxxx wrote:

                  And this is where I'm at so far

                  Ignore some Print items - just for console checks

                  Still trying to make it modular
                  ie have a function for each type of key transform - (just stagger in this one)
                  appreciate any advice on good/bad code form

                  added gui to take offset
                  count selected objects - need more than 2
                  and now first object doesnt get offset (its popped off array)

                  #####################################
                  def MoveSelectedKeys(op,offset,timeln = 1) :    # offset in frames
                      import c4d
                    
                      if (not op) or (not offset) : return False
                    
                      if timeln == 1: timeln = c4d.NBIT_TL1_SELECT
                      elif timeln == 2: timeln = c4d.NBIT_TL2_SELECT
                      elif timeln == 3: timeln = c4d.NBIT_TL3_SELECT
                      elif timeln == 4: timeln = c4d.NBIT_TL4_SELECT
                      else:
                          import math
                          timeln = math.fmod(timeln,4)
                    
                      doc = op.GetDocument()
                    
                      track = op.GetFirstCTrack()
                      if not track: return False
                    
                      fps = float(doc.GetFps())
                    
                      while track:
                          curve = track.GetCurve()
                          cnt = curve.GetKeyCount()
                          for i in xrange(cnt) :
                              key = curve.GetKey(i)
                              if key.GetNBit(int(timeln)) == True:
                                  tme = key.GetTime()
                                  key.SetTime(curve,c4d.BaseTime(offset/fps+tme.Get()))
                          track = track.GetNext()
                      c4d.EventAdd(c4d.MSG_UPDATE)
                    
                      return True
                  #####################################
                  def GetLastSelectedKey(track, timeln = 1) :
                      import c4d
                    
                      if timeln == 1: timeln = c4d.NBIT_TL1_SELECT
                      elif timeln == 2: timeln = c4d.NBIT_TL2_SELECT
                      elif timeln == 3: timeln = c4d.NBIT_TL3_SELECT
                      elif timeln == 4: timeln = c4d.NBIT_TL4_SELECT
                      else:
                          import math
                          timeln = math.fmod(timeln,4)
                    
                      curve = track.GetCurve()
                      cnt = curve.GetKeyCount()
                    
                      for i in xrange(cnt) :
                          key = curve.GetKey(cnt-i-1)
                          if key.GetNBit(int(timeln)) == True:
                              return key  
                  ####################################MINE
                  def GetFirstSelectedKey(track, timeln = 1) :
                      import c4d
                    
                    
                      if timeln == 1: timeln = c4d.NBIT_TL1_SELECT
                      elif timeln == 2: timeln = c4d.NBIT_TL2_SELECT
                      elif timeln == 3: timeln = c4d.NBIT_TL3_SELECT
                      elif timeln == 4: timeln = c4d.NBIT_TL4_SELECT
                      else:
                          import math
                          timeln = math.fmod(timeln,4)
                    
                      curve = track.GetCurve()
                      cnt = curve.GetKeyCount()
                      key = curve.GetKey(0)
                    
                      if key.GetNBit(int(timeln)) == True:
                          return key 
                  #####################################
                  def GetHNext(op) :
                      if not op: return
                      if op.GetDown() : return op.GetDown()
                      while not op.GetNext() and op.GetUp() :
                          op = op.GetUp()
                      return op.GetNext()
                  #####################################
                  def GetActiveObjects(doc) :
                      import c4d
                      lst = list()
                      op = doc.GetFirstObject()
                      while op:
                          if op.GetBit(c4d.BIT_ACTIVE) == True: lst.append(op)
                          op = GetHNext(op)
                      return lst
                  #####################################MINE
                  def Stagger(doc,op,lst,keylast,overlap) :
                      import c4d
                      print "Length of list before pop", len(lst) 
                      lst.pop(0)  #remove the first object as its not moved
                      op = lst[0] #get fist active object again, less original first object
                      print "Length of list after pop", len(lst) 
                    
                   
                      offset = keylast.GetTime().GetFrame(doc.GetFps())-overlap
                      for i in xrange(len(lst)) : #increment through allthe objects selected
                          doc.AddUndo(c4d.UNDOTYPE_CHANGE,op)
                          MoveSelectedKeys(op,offset) #moves all the selected keys on a track
                          keylast = GetLastSelectedKey(op.GetFirstCTrack())
                    
                    
                        
                          if not keylast: offset = 0
                          # the original cal moved everything # else: offset = key.GetTime().GetFrame(doc.GetFps())-overlap
                          else: 
                              print "OS1", offset
                              offset = keylast.GetTime().GetFrame(doc.GetFps())-overlap
                              print "OS2", offset
                          # object namecheck # print op.GetName()
                          if  i+1 < len(lst) : # +1 stops index going out of range ie more objects than listed
                              op = lst[i+1]# ok to get next object in list
                    
                      return 
                  #####################################
                  def main() :
                      import c4d
                      from c4d import documents
                      from c4d import gui
                      
                      c4d.CallCommand(1024314); # clear the python console
                   
                      # get a value form the user
                      guival = gui.InputDialog("Enter a value < your max keyspan","10")
                      print "Dialog Value =",guival
                      overlap = int(guival)   
                      doc = documents.GetActiveDocument()
                      doc.StartUndo()
                    
                      lst = GetActiveObjects(doc) #get selected objects
                    
                      print "List Length = ", len(lst) 
                      if len(lst)<=1:
                          c4d.gui.MessageDialog("You need to select at least two objects") 
                          return False #leave if not enough objects selected
                   
                      op = lst[0] #get fist active object
                    
                    
                      keyfirst = GetFirstSelectedKey(op.GetFirstCTrack())
                      keylast = GetLastSelectedKey(op.GetFirstCTrack())
                      
                    
                      keyfirstval = keyfirst.GetTime().GetFrame(doc.GetFps())
                      keylastval = keylast.GetTime().GetFrame(doc.GetFps())
                      keyspanval = keylastval - keyfirstval
                     
                      print "Selected Keyspan 1st track = ", keyspanval
                      print "Keytime of start key = ", keyfirstval
                      print "Keytime of end key = ", keylastval
                      
                   
                     
                      if not keylast: offset = 0
                      ##### else do the stagger
                      else: Stagger(doc,op,lst,keylast,overlap) 
                       
                      doc.EndUndo()
                    
                  if __name__=='__main__':
                      main()
                    
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • H
                    Helper
                    last edited by

                    THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                    On 06/03/2011 at 08:05, xxxxxxxx wrote:

                    Any feedback on programing 'form' would be appreciated.

                    Think it would be useful to have a couple more transformations
                    Stagger2 - enter total stagger length - x frames (rather than current overlap in frames)
                    Accelerate - gradually space out over x frames
                    Decelerate - reverse above
                    Stack - thats essentially stagger with no overlap?

                    1 Reply Last reply Reply Quote 0
                    • H
                      Helper
                      last edited by

                      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                      On 06/03/2011 at 10:29, xxxxxxxx wrote:

                      Well, works fine. If you want potential increament for eg. you need to calculate something with the offset value. 😉

                      1 Reply Last reply Reply Quote 0
                      • H
                        Helper
                        last edited by

                        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                        On 06/03/2011 at 11:09, xxxxxxxx wrote:

                        cheers Nux

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post