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
    • Recent
    • Tags
    • Users
    • Login

    Create a custom datatype for userdata????

    Scheduled Pinned Locked Moved PYTHON Development
    6 Posts 0 Posters 630 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

      On 21/09/2015 at 08:55, xxxxxxxx wrote:

      Hello.
      Im wondering if its possible to create my own datatype for userdata with python.
      I would like to create my own spline datatype if possible.

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

        On 22/09/2015 at 02:20, xxxxxxxx wrote:

        Hello,

        it is only possible to create custom Datatypes or custom GUIs using the C++ SDK with CustomDataTypeClass and iCustomGui. See also you other thread "How to create a cutom data type for UserData? ".

        Best wishes,
        Sebastian

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

          On 22/09/2015 at 04:22, xxxxxxxx wrote:

          Hello.
          Thanks for your reply.
          Yes that my thread over at c4dcafe.

          Im not that much into c++.

          Since its not possible to create a custom data type with python.

          Would it be possible to manipulate the Spline datatype in the userdata using python then?
          As you saw in my other thread i want to restrict/clamp the points on the spline.

          Basically i want.
          clamp point 1's X axis to a range of -2 to 0.5, Y axis -2 to 2
          clamp point 2's X axis to a range of -0.5 to 0.5, Y axis -2 to 2
          clamp point 3's X axis to a range of 0.5 to 2, Y axis -2 to 2

          Is this possible then ?

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

            On 22/09/2015 at 08:29, xxxxxxxx wrote:

            So after messing around a bit i see that there is a python node in the expresso editor.
            i tried adding a python node to my expresso which drives the lip splines.

            i can see that the python script reads the spline values fine when i change them.
            however it will not clamp like i want to. is there somethign wrong with my SetKnot ?

              
            import c4d  
            from c4d import documents, utils, internals  
            LIP_UPPER_ID = 14 # upper lip spline  
              
            def main() :  
              obj = doc.GetActiveObject()  
              uls = obj[c4d.ID_USERDATA, LIP_UPPER_ID]  
              knots = uls.GetKnots()  
              if len(knots) == 3:  
                  k1 = knots[0]['vPos']  
                  k2 = knots[1]['vPos']  
                  k3 = knots[2]['vPos']  
                  k1X = k1[0]  
                  k1Y = k1[1]  
                  if k1X < -0.5:  
                      k1X = -0.5  
                  uls.SetKnot(index = 0, vPos = c4d.Vector(k1X, k1Y, 0))  
            
            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              On 22/09/2015 at 10:21, xxxxxxxx wrote:

              Hello,

              if I understand correctly you want to create individual constraints for each point? That is not possible with the existing Spline GUI.

              Best wishes,
              Sebastian

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

                On 22/09/2015 at 11:04, xxxxxxxx wrote:

                Yes thats exactly what i want to do.
                I also refused to belive you 😛

                After hours of messing around i finally got it to work.
                seeing that the SetKnot way did not do anything.

                By feeding the output of a Python node back into the obj "anim crtl face" i managed to clamp the values.
                The 3 outputs are floats.

                EDIT: the wrong spline is set in the input to the python node.
                But this ibput isnt realy used so it doesnt matter.

                This method is not perfect but does the job for me.

                The Python code i used:

                  
                import c4d  
                from c4d import documents, utils, internals  
                  
                LIP_UPPER_ID = 14 # upper lip spline  
                LIP_LOWER_ID = 15 # lower lip spline   
                  
                def main() :  
                  global Output1  
                  global Output2  
                  global Output3  
                  obj = doc.GetActiveObject()  
                  uls = obj[c4d.ID_USERDATA, LIP_UPPER_ID]  
                  knots = uls.GetKnots()  
                  if len(knots) == 3:  
                      k1 = knots[0]['vPos']  
                      k2 = knots[1]['vPos']  
                      k3 = knots[2]['vPos']  
                        
                      k1X = k1[0]  
                      k1Y = k1[1]  
                        
                      k2X = k2[0]  
                      k2Y = k2[1]  
                        
                      k3X = k3[0]  
                      k3Y = k3[1]  
                        
                      print k1X, k1Y  
                      if k1X > -0.51:  
                          k1X = -0.51  
                            
                            
                      if k2X < -0.49:  
                          k2X = -0.49  
                        
                      if k2X > 0.49:  
                          k2X = 0.49  
                  
                      if k3X < 0.51:      
                          k3X = 0.51  
                            
                  Output1 = k1X  
                  Output2 = k2X  
                  Output3 = k3X  
                
                1 Reply Last reply Reply Quote 0
                • First post
                  Last post