Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python 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

    Keyframe on visibility shows up orange

    Scheduled Pinned Locked Moved PYTHON Development
    13 Posts 0 Posters 2.3k Views
    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 Offline
      Helper
      last edited by

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

      On 16/04/2011 at 12:52, xxxxxxxx wrote:

      I've tried for hours now and ran out of ideas... basically all I want to do is make objects visible/invisible by keying their visibility attribute. The keys are being created, apparently, but they dont take effect. Instead of showing up red, the keyfram icons show up orange/yellowish, and only once I select something in the attribute editor do they turn red. I've tried a number of event messages to no avail - maybe I'm just missing the right one? Here's the code I'm using:

        
        def setKey(self,doc,o,vis=True) :  
            trac = o.GetFirstCTrack()  
            if trac == None:  
                  trackRender = c4d.CTrack(o, c4d.DescID( c4d.DescLevel(c4d.ID_BASEOBJECT_VISIBILITY_RENDER,c4d.DTYPE_LONG,0,)))  
                o.InsertTrackSorted(trackRender)  
                trackEditor = c4d.CTrack(o, c4d.DescID( c4d.DescLevel(c4d.ID_BASEOBJECT_VISIBILITY_EDITOR,c4d.DTYPE_LONG,0,)))  
                o.InsertTrackSorted(trackEditor)  
                  trackEditor.SetAfter(c4d.CLOOP_CONSTANT)  
              
            curveRender = trackRender.GetCurve()  
            key = curveRender.AddKey(c4d.BaseTime(self.frame, doc.GetFps()))['key']  
            if vis:  
                key.SetValue(curveRender,0)  
            else:  
                key.SetValue(curveRender,1)  
            key.SetInterpolation(curveRender,c4d.CINTERPOLATION_LINEAR)  
              
            curveEditor = trackEditor.GetCurve()  
            key = curveEditor.AddKey(c4d.BaseTime(self.frame, doc.GetFps()))['key']  
            if vis:  
                key.SetValue(curveEditor,0)  
            else:  
                key.SetValue(curveEditor,1)  
            key.SetInterpolation(curveEditor,c4d.CINTERPOLATION_LINEAR)  
            key.SetTime(curveEditor,doc.GetTime()) # just tried this to see if it makes a difference - it doesnt  
            print key.GetValue() # comes out as 1.0 or 0.0  
            return True  
      

      Any ideas would be much appreciated!

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

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

        On 16/04/2011 at 21:01, xxxxxxxx wrote:

        The visibility option is a combo box with three states.
        So I'm not sure that doing this from the timeline curve (with it's infinite available values) is the best way to do it.

        Here's a different approach:

        #This is an example of using Keyframe Selections to toggle an object's  on/off/default  visibility setting  
          
        import c4d  
        from c4d import gui  
          
        def main() :  
          
          fps = doc.GetFps()  
          frame = doc.GetMinTime().GetFrame(fps) #set min time  
          doc.SetTime(c4d.BaseTime(frame, fps)) #sets time slider to frame 0  
          obj = doc.GetActiveObject()  
          obj.SetEditorMode(c4d.MODE_UNDEF) #Sets the default mode for visibilty     
          id = c4d.DescID(c4d.ID_BASEOBJECT_VISIBILITY_EDITOR) #Assigns a variable to Visibilty    
          obj.SetKeyframeSelection(id, 1) #Adds a Keyframe Selection to the Visibility  
          c4d.CallCommand(12410) #Record Button  
          
          doc.SetTime(c4d.BaseTime(frame +10, fps)) #sets time slider to frame 10  
          obj.SetEditorMode(c4d.MODE_OFF) #Sets the default mode for visibilty   
          c4d.CallCommand(12410) #Record Button  
          
          doc.SetTime(c4d.BaseTime(frame +20, fps)) #sets time slider to frame 20  
          obj.SetEditorMode(c4d.MODE_ON) #Sets the default mode for visibilty   
          c4d.CallCommand(12410) #Record Button  
          
          obj.SetKeyframeSelection(id, 0) #Removes the Keyframe Selection option  
          obj.ClearKeyframeSelection() #Clears the Keyframe Selections   
          c4d.EventAdd()  
          
        if __name__=='__main__':  
          main()  
        

        Keyframe Selections seem to be most useful when you want to execute the Record button. But only wish to record specific things instead of everything. So that you don't have to resort to diving into the timeline to do it.
        But that's just a guess on my part.

        -ScottA

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

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

          On 17/04/2011 at 04:07, xxxxxxxx wrote:

          Hi Scott,

          Thanks! I think you're onto something there, I'll continue to experiment with it. The Record call works fine from within the Python Editor in the GUI, but from my tag plugin it doesn't for some reason. The setting of the editor/render mode works however, so it must be getting the correct object - it just does not set a key at that position.

          Cheers
          Michael

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

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

            On 17/04/2011 at 08:00, xxxxxxxx wrote:

            I ran a very quick little test. And c4d.CallCommand(12410) works in the python tag for me.

            However,
            Using something like the SetTime function can cause it to fail if you don't have it set up properly inside the tag to happen only once at a specific time.
            Because the code inside of the tag is constanly looping. And that's where you can easily run into trouble.

            Setting the scrubber to a frame and setting a key is a one time event. While a tag is one giant constantly running loop.
            So if you don't have those things set up so they are only triggered once while the tag is running the entire code. You can get yourself into an infinite loop situation. And that will prevent the CallCommand() from working properly.

            Tags can be tricky that way.

            -ScottA

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

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

              On 17/04/2011 at 09:25, xxxxxxxx wrote:

              Do you know what the orangeyellow keyframe icon means exactly? Because while with the command(12410) I don't get any keys at all, with the key.SetValue() approach I at least get those (even though they do not work).
              It almost feels like the keys are halfway set, but have not been properly commited?

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

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

                On 17/04/2011 at 09:53, xxxxxxxx wrote:

                Looks like FindCTrack() is also not working as expected? This (c4d.DescLevel(c4d.ID_BASEOBJECT_VISIBILITY_RENDER,c4d.DTYPE_LONG,0,)) returns TypeError: FindCTrack() takes no arguments (1 given), while with no argument at all it returns SystemError: .\source\embedding\interface\i_getargs\i_getargs.cpp:1355: bad argument to internal function

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

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

                  On 17/04/2011 at 10:06, xxxxxxxx wrote:

                  To give you a better idea what I'm talking about... as you can see with my original approach the keys are written and they do hold the correct value (see on the right where it says Visible in Editor). However also not the orange bubbles in the attribute editor - the keys take no effect, the state is still at "default".

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

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

                    On 17/04/2011 at 10:16, xxxxxxxx wrote:

                    Ok another update: in the same process I'm now setting a key for Position X - and that one shows up correctly. So it has to do specifically with the visibility tracks. Only I have no clue what....

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

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

                      On 17/04/2011 at 10:24, xxxxxxxx wrote:

                      Yellow/orange means that the object has at least one key on it. But it has been moved and C4D is waiting for you to record another key.
                      It's a visual way to let the user know he/she has forgotten to set a new key for the changes they've just made.

                      The CallCommand does work inside of a tag. But you have to make absolutely sure you're not running the code before it in an infinite loop, or else it won't work.
                      This is very easy to do. Don't assume you've got your code right...It's tricky.

                      Put this code into your python tag. Then enable the "Frame Dependent" checkbox.
                      When you drag the scrubber it should create a key on the timeline. But only if the default visibility option is selected:

                      import c4d  
                        
                      #Enable the Frame Dependent checkbox so you can keep the tag from looping  
                      #when the scrubber is not being moved  
                      #This sometimes makes it easier to test out code in a tag  
                        
                      #on = 0   
                      #off = 1  
                      #default= 2  
                        
                      def main() :  
                        obj = op.GetObject()#The object the python tag is on  
                        if obj[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] == 2:  # 2 is the "Default" visibility setting  
                         print "true"  
                         c4d.CallCommand(12410) #Record Button  
                        c4d.EventAdd()  
                      

                      *Notice how the the id numbers don't match the order in which they are listed in the combo box.
                        That might trip you up...It looks like a bug to me.

                      -ScottA

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

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

                        On 17/04/2011 at 10:38, xxxxxxxx wrote:

                        Hi Scott,
                        I'm pretty sure it's only running once since it's executed when I press a button, not automatically. I've output some debug messages and they only show up once too.
                        One thing to note is that the keyframe is not meant for the object the tag is on, that's a null. The tag creates a bunch of additional objects who then get keyframed. For position keys this works perfectly fine, it's just the visibility ones that fail.

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

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

                          On 17/04/2011 at 12:59, xxxxxxxx wrote:

                          Ok, so I've finally found out what the problem was.... :nerd: I was a bit confused by the mentioning of Data Key vs. Value Key in the GUI and started digging in the C++ documentation... and guess what, there's a special command to set those keys. Unfortunately that's missing from the Python documentation, so, note to self: always check all docs.

                          Aaanyway, for future reference this is how you set a VALUE key, e.g. position etc:
                          key.SetValue(trackX.GetCurve(),o.GetAbsPos().x)

                          and this is how you set a DATA key, e.g. visibility:
                          key.SetGeData(trackRender.GetCurve(),0L)

                          Oh and I now also know what the orange bubble means: there's a keyframe, but the data is invalid.

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

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

                            On 29/04/2011 at 23:25, xxxxxxxx wrote:

                            Use something like SetTime function can cause it to fail if you do not have it set up properly on the label in a specific time only once. Because there is a continuous cycle of the tag code. This is what you can easily run into trouble.

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

                              On 29/04/2014 at 06:27, xxxxxxxx wrote:

                              Hi guys, I am trying to figure out what the difference between a Value Key and a Data Key is, and what use cases there are for each of them. Can you please help me with this?

                              Also I noticed that between the value keys there is also a function curve displayed but there is none between the data keys. Why is that?

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