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

    catch BFM_INPUT_DOUBLECLICK in GeUserArea [SOLVED]

    SDK Help
    0
    11
    903
    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 13/01/2015 at 04:51, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   13+ 
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      I don't know how to catch BFM_INPUT_DOUBLECLICK in a GeUserArea using GetParameter(DescLevel)) , here is the code:

        
      Bool nodeUserArea::InputEvent(const BaseContainer& msg)
      {
          GeData data;
        
          // check if mouse event
          msg.GetParameter(DescLevel(BFM_INPUT_DEVICE), data);
          if (data.GetInt32() == BFM_INPUT_MOUSE)
          {
              // check if left mouse button
              msg.GetParameter(DescLevel(BFM_INPUT_CHANNEL), data);
        
      		if (data.GetInt32() == BFM_INPUT_MOUSELEFT)
      		{
      			// now get the coordinates
      			msg.GetParameter(DescLevel(BFM_INPUT_X), data);
      			const Int32 xCoordiante = data.GetInt32();
        
      			msg.GetParameter(DescLevel(BFM_INPUT_Y), data);
      			const Int32 yCoordiante = data.GetInt32();
        
      			GePrint("UserArea hit at " + String::IntToString(xCoordiante) + " : " + String::IntToString(yCoordiante));
      		}
        
      		msg.GetParameter(DescLevel(BFM_INPUT_CHANNEL), data);
      		if (data.GetBool() == BFM_INPUT_DOUBLECLICK)
      		{
      			// now get the coordinates
      			msg.GetParameter(DescLevel(BFM_INPUT_X), data);
      			const Int32 xCoordiante = data.GetInt32();
        
      			msg.GetParameter(DescLevel(BFM_INPUT_Y), data);
      			const Int32 yCoordiante = data.GetInt32();
        
      			GePrint("UserArea double click at " + String::IntToString(xCoordiante) + " : " + String::IntToString(yCoordiante));
        
      			addNode(xCoordiante, yCoordiante);
      			Redraw();
      		}
          }
        
          return true;
      };
        
      
      
      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 13/01/2015 at 09:56, xxxxxxxx wrote:

        I think, you got the BFM_INPUT_DOUBLECLICK wrong (you are comparing the container ID to a bool).
        Try it like so:

        Bool nodeUserArea::InputEvent(const BaseContainer& msg)
        {
            GeData data;
          
            // check if mouse event
            msg.GetParameter(DescLevel(BFM_INPUT_DEVICE), data);
            if (data.GetInt32() == BFM_INPUT_MOUSE)
            {
                // check if left mouse button
                msg.GetParameter(DescLevel(BFM_INPUT_CHANNEL), data);
                if (data.GetInt32() == BFM_INPUT_MOUSELEFT)
                {
        	    // now get the coordinates
        	    msg.GetParameter(DescLevel(BFM_INPUT_X), data);
        	    const Int32 xCoordiante = data.GetInt32();
        	    msg.GetParameter(DescLevel(BFM_INPUT_Y), data);
        	    const Int32 yCoordiante = data.GetInt32();
          
        	    GePrint("UserArea hit at " + String::IntToString(xCoordiante) + " : " + String::IntToString(yCoordiante));
          
                    msg.GetParameter(DescLevel(BFM_INPUT_DOUBLECLICK), data);
                    if (data.GetBool())
                    {
                        GePrint("UserArea double click at " + String::IntToString(xCoordiante) + " : " + String::IntToString(yCoordiante));
                        addNode(xCoordiante, yCoordiante);
                        Redraw();
                    }
                }
            }
            return true;
        };
        
        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          On 13/01/2015 at 10:05, xxxxxxxx wrote:

          hi Andreas,

          thanks for the reply, I guess what you did should work "will test soon" , but at the same time it is kinda weird!!

          I assume all BFM_INPUT_............ should work the same way, so BFM_INPUT_MOUSELEFT and BFM_INPUT_DOUBLECLICK should be called the same way "regardless of comparing with GetInt32 or GetBool!!"

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

            On 13/01/2015 at 10:09, xxxxxxxx wrote:

            Mohamed,
            I'm sorry, I don't understand. There's nothing special about BFM_INPUT_...
            You are retrieving values from the message BaseContainer. And the values stored in there have different types. You need to retrieve them correctly. And comparing a boolean value to an container ID (which is most likely not zero or one) is bound to have false as a result.

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

              On 13/01/2015 at 10:12, xxxxxxxx wrote:

              well, tell me if those 2 snippets are doing the same thing:

                
              msg.GetParameter(DescLevel(BFM_INPUT_CHANNEL), data); if (data.GetInt32() == BFM_INPUT_MOUSELEFT) 
              
              msg.GetParameter(DescLevel(BFM_INPUT_MOUSELEFT), data); if(data.GetInt32()) 
              
              1 Reply Last reply Reply Quote 0
              • H
                Helper
                last edited by

                On 13/01/2015 at 10:19, xxxxxxxx wrote:

                No, they are not.

                a) This is correct. The comparison is only true, if the value stored at container ID (or rather description ID) BFM_INPUT_CHANNEL is equal to BFM_INPUT_MOUSELEFT.

                b) Wrong. BFM_INPUT_MOUSELEFT is not a container ID, but rather a define for one of the values, that may be stored at container ID BFM_INPUT_CHANNEL. You should actually get false as return value from msg.GetParameter(DescLevel(BFM_INPUT_MOUSELEFT), data); as the value was not found in the container.

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

                  On 13/01/2015 at 10:22, xxxxxxxx wrote:

                  I see!! , so container IDs are strings in the header??
                  BFM_INPUT_CHANNEL = 'ipca'
                  BFM_INPUT_DOUBLECLICK = 'ipdb'

                  also 1 last thing, which versions of the SDK support Get/Set parameter? 13+?

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

                    On 13/01/2015 at 10:35, xxxxxxxx wrote:

                    Hehe 😉
                    No, they are not. Container IDs are 32-Bit integer values. The notation shown in your post is just another way to write these integer values by composing them from four bytes. Instead of writing the bytes in decimal or hexadecimal, characters are used instead. In this way you get "meaningful" integer values, which can be printed (don't try to put the defines directly into a GePrint though, this won't show you the text you expect).
                    This is done, as it is simply easier to recognize for humans...

                    Like so (for 'ipca') :
                    ip short for "input" and ca short for "channel"
                    i - ASCII or byte value 0x69
                    p - 0x70
                    c - 0x63
                    a - 0x61
                    So you get: 0x69706361 (1768973153 decimal) as container ID.
                    The decimal value is what you get, if you use GePrint(String::IntToString(BFM_INPUT_CHANNEL)).

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

                      On 13/01/2015 at 10:39, xxxxxxxx wrote:

                      so how can I identify container IDs then? lots of definitions in the header.
                      also does this Get/Set parameter work for R13 SDK?

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

                        On 13/01/2015 at 10:51, xxxxxxxx wrote:

                        Hm? What do you want to identify? You shouldn't care for the ID values anyway. You should use the defines instead.

                        Yes, Get/SetParameter() was available in R13 as well.

                        If you wanted to print the container ID value in a way like it is noted in the definition, you could use a function like this:

                        void printMsg(UInt32 id)
                        {
                          char v[5];
                          v[0] = (char)((id & 0xFF000000) >> 24);
                          v[1] = (char)((id & 0x00FF0000) >> 16);
                          v[2] = (char)((id & 0x0000FF00) >> 8);
                          v[3] = (char)(id & 0x000000FF);
                          v[4] = 0; // zero termination of string
                          GePrint(String(v));
                        }
                        

                        So printMsg(BFM_INPUT_CHANNEL) prints ipca

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

                          On 13/01/2015 at 10:54, xxxxxxxx wrote:

                          thanks a lot Andreas for the help Tongue

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