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

    "Do something when a value is changed" in Python Node?

    Cinema 4D SDK
    r20 python
    2
    6
    711
    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.
    • B
      bentraje
      last edited by

      Hi,

      Is there a way to perform an action if a value is changed?
      The logic would be something like this:

      If new value != with the existing value:
           do something: 
      

      Here is the existing code (inside of a Python node in an Expresso)

      import c4d
      #Welcome to the world of Python
      
      
      def main():
          store_value = 0 # The value ranges from 0 or 1
          if Input1 != store_value:
              print "Something changed"
              store_value = Input1
          else:
              print "Nothing changed"
      

      The problem is at next draw/redraw/refresh the store_value stays at zero even though the Input is already at 1. This means the store_value = Input1 is not working.

      You can check the illustration file here:
      https://www.dropbox.com/s/y5ujqcp6ziecos3/c4d123_do_something_if_something_is_chang.c4d?dl=0

      Upon opening the file, you'll see in the console printing "Nothing Changed" repeatedly. Now if you change the user data. It prints "Something Changed" but then it continuously prints "Something is changed".
      The result should be something like

      Nothing Changed
      # Changes user data
      Something changed
      # Back to 
      Nothing Changed
      Nothing Changed
      

      Is there a way around this? Thank you for looking at the problem

      1 Reply Last reply Reply Quote 0
      • M
        m_adam
        last edited by m_adam

        Hi @bentraje the way to go is to use a global variable. This will define a variable in the global space of the current node that will be frame independent and will live as long as the node itself live.

        import c4d
        global store_value
        store_value = 0
        
        def main():
            if not c4d.threading.GeIsMainThread():
                return
            
            global store_value
            
            if Input1 != store_value:
                print "Something changed"
                store_value = Input1
            else:
                print "Nothing changed"
        

        Cheers,
        Maxime.

        MAXON SDK Specialist

        Development Blog, MAXON Registered Developer

        1 Reply Last reply Reply Quote 1
        • B
          bentraje
          last edited by

          Hi @m_adam

          Thanks for the response. I tried the code but I still get the same result.

          Nothing changed first.
          Something changed.
          Then something changed all throughout.

          You can see the revised file here:
          https://www.dropbox.com/s/8e8gk0ptsksyztc/c4d123_do_something_if_something_is_chang_v1.2.c4d?dl=0

          1 Reply Last reply Reply Quote 0
          • M
            m_adam
            last edited by

            Sorry, I edited the code, the main issue is that you defined each time the new value to 0.

            Cheers,
            Maxime.

            MAXON SDK Specialist

            Development Blog, MAXON Registered Developer

            1 Reply Last reply Reply Quote 1
            • B
              bentraje
              last edited by

              @m_adam

              No worries. Thanks again for the reply!

              Just one last thing:
              Is there a way to save the store_value when closing and then reopening the file?

              The current set-up is user_data value = 0.
              When you change the value from 0 to 1. It works perfectly (i.e. prints something is changed)

              However, when the set-up is the user_data value = 1 (the user changed it in the last session),
              and change the value from 1 to 0, it prints "Nothing changed" where it should be "Something changed".

              Not sure if this is possible since store_value=0 is hard coded. Or do you have any alternative to the set-up? I'm all ears! Thank you

              1 Reply Last reply Reply Quote 0
              • M
                m_adam
                last edited by

                Hi sorry I overlooked your answers.

                If you want to have something more consistent you should store it into the scene. So the things that make more sense is to store it into the basecontainer of the current GvNode. Like so

                import c4d
                
                def main():
                    if not c4d.threading.GeIsMainThread():
                        return
                
                    bc = op.GetDataInstance()
                
                    # Get an unique ID at https://developers.maxon.net/forum/pid
                    store_value = bc[1000001]
                
                    if Input1 != store_value:
                        print "Something changed"
                        bc[1000001] = Input1
                    else:
                        print "Nothing changed"
                

                Cheers,
                Maxime.

                MAXON SDK Specialist

                Development Blog, MAXON Registered Developer

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