Create a custom datatype for userdata????



  • 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.



  • 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



  • 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 ?



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


  • 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



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

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

    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  
    

Log in to reply