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

    SplineData Callbacks

    SDK Help
    0
    12
    985
    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

      On 30/07/2013 at 08:09, xxxxxxxx wrote:

      Thanks Nik,

      I gave it a shot. But I'm getting a similar error.
      Only this time it's this:
      Error: cannot convert parameter 1 from 'Bool (__cdecl * )(LONG,void * )' to 'SplineDataCallback'

        
      //The CallBack method  
      Bool mySplineCallBack(LONG id, void *p_data)  
      {  
        switch (id)  
        {  
            case SPLINE_CALLBACK_CURSORINFO:  
                {  
                auto data = (SplineDataCallbackCursorInfo* ) p_data;  
                if (!data) return FALSE;  
        
                GePrint("Mouse Pos: " + LongToString(data->x) + ", " + LongToString(data->y));  
                break;  
               }   
        }  
        return TRUE;  
      }  
        
      .........  
        
      //Calling the callback method  
      EXECUTIONRESULT SplineTag::Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags)  
      {  
        GeData d;                                                          //Create a variable to hold the data we will get using GetParameter() below  
        if (tag->GetParameter(DescLevel(MY_SPLINE), d, DESCFLAGS_GET_0))   //If the tag with the spline GUI exists  
        {  
            SplineData *myspline = (SplineData* )d.GetCustomDataType(CUSTOMDATATYPE_SPLINE); //Assign a variable to the spline's container so we can access & edit them later on  
            if(myspline)  
             {   
               CustomSplineKnot *knot1 = myspline->GetKnot(0);      //Get the first spline's knot in the spline GUI  
               CustomSplineKnot *knot2 = myspline->GetKnot(1);      //Get the second spline's knot in the spline GUI  
               if (knot2)  
                {  
                 Vector knot1pos = knot1->vPos;                     //Get the position of the first spline's knot and assign it to a variable      
                 Vector knot2pos = knot2->vPos;                     //Get the position of the second spline's knot and assign it to a variable  
        
                 myspline->SetUserCallback(mySplineCallBack, NULL);   
                }  
         }  
          
        return EXECUTIONRESULT_OK;  
      }
      

      -ScottA

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

        On 30/07/2013 at 08:27, xxxxxxxx wrote:

        is MySplineCallback / mySplineCallback intentional ?

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

          On 30/07/2013 at 08:32, xxxxxxxx wrote:

          ^LoL. You caught me before I could update my post. You guys are too quick. 😂
          I fixed it. But still I'm having problems getting it to work.

          -ScottA

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

            On 30/07/2013 at 08:52, xxxxxxxx wrote:

            1. Why do you only test for knot2 but not knot1? It could be NULL too.
            2. What are the new problems you are facing?
            3. I think you should only call SetUserCallback() once in SplineTag::Init() where you initialize the Spline GUI

            Cheers,
            -Nik

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

              On 30/07/2013 at 08:59, xxxxxxxx wrote:

              My problem is getting the callback code to complie and work.
              It doesn't work for me as  a Bool type either.

              Error: cannot convert parameter 1 from 'Bool (__cdecl * )(LONG,void * )' to 'SplineDataCallback'

              -ScottA

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

                On 30/07/2013 at 09:37, xxxxxxxx wrote:

                I overlooked this as well: The docs say that the second argument is const void* not void*.

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

                  On 30/07/2013 at 10:00, xxxxxxxx wrote:

                  Thanks. That fixed it.

                  It compiles now. However I'm not getting any results from it.
                  I wonder if we have to use GetUserCallback() in combination with this to get a result?

                  -ScottA

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

                    On 30/07/2013 at 10:52, xxxxxxxx wrote:

                    Never mind. I've got it working.

                    Apparently you have to call to your spline callback from within the Init() method.
                    In my mind that seem rather strange. Because it should make it run only once when the tag is created. Then not run anymore.
                    That's how using the Init() method usually works.

                    But in this case. I guess the callback uses the Init() method to start it up.
                    And then once it's been started, it will keep on running in the background. And feedback the mouse positions.

                    Thanks a lot for your help Niklas,
                    -ScottA

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

                      On 30/07/2013 at 11:23, xxxxxxxx wrote:

                      Originally posted by xxxxxxxx

                      Apparently you have to call to your spline callback from within the Init() method.
                      In my mind that seem rather strange. Because it should make it run only once when the tag is created. Then not run anymore.
                      That's how using the Init() method usually works.

                      By "call to your spline callback from within the Init() method", do you mean the following?

                      myspline->SetUserCallback(mySplineCallBack, NULL);
                      

                      You do not call your function here. You only pass it as a parameter and the SplineGUI will call
                      this method at a later point. Calling your function would look like

                      SplineDataCallbackDraw data;
                      // fill the data
                      mySplineCallBack(SPLINE_CALLBACK_DRAW, &data);
                      

                      but you should not do this. The SplineGUI is doing this, but doing this yourself makes no sense.

                      -Nik

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

                        On 30/07/2013 at 11:35, xxxxxxxx wrote:

                        Originally posted by xxxxxxxx

                        By "call to your spline callback from within the Init() method", do you mean the following?

                        myspline->SetUserCallback(mySplineCallBack, NULL);
                        

                        Yes.

                        The other Callbacks I've used don't work this way.
                        I have to place them within an Execute, or Message method so that they will continuously update.
                        But this one acts more a like a windows service. Where once you start it. It will continue to run and update on it's own.

                        CallBacks in general always trip me up.
                        I'm not very good with them.

                        -ScottA

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