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

    Set LinkBox to Pick Mode

    Scheduled Pinned Locked Moved PYTHON Development
    5 Posts 0 Posters 506 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 04/11/2015 at 13:23, xxxxxxxx wrote:

      Hi all, have a ToolData plugin that I am building. The SubDialog has a Link Box which I want to have the Pick Mode activated for the user when the tool is launched. I can not for the life of me figure out how to do this?? Any idea on how to do this in python? I don't want the user to have to go to and click on the mouse cursor button.

      Thank you for the help.

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

        On 05/11/2015 at 02:29, xxxxxxxx wrote:

        Hi,

        The Pick Mode can be activated by code but this relies on the internal ID for the LinkBoxGui Pick Object button:

        def InitValues(self) :
          msg = c4d.BaseContainer(c4d.BFM_ACTION)
          msg.SetInt32(c4d.BFM_ACTION_ID, 1005)
          self.SendMessage(LINKBOX_ID, msg)
          
          return True
        

        Note this code has to be run in the SubDialog InitValues(), not the CreateLayout() because it crashes the application there!

        A better solution is to use ViewportSelect helper class in the ToolData::MouseInput() to pick yourself an object and set it in the LinkBoxGui.
        Here's some code:

        def MouseInput(self, doc, data, bd, win, msg) :
          mouse_x = int(msg[c4d.BFM_INPUT_X])
          mouse_y = int(msg[c4d.BFM_INPUT_Y])
          viewport_select = c4d.utils.ViewportSelect()
          
          # Pick objects
          objects = viewport_select.PickObject(bd, doc, mouse_x, mouse_y, rad=10, flags=c4d.VIEWPORT_PICK_FLAGS_0)
          if not len(objects)>=1:
            return True
          
          # Get first picked object
          obj = objects[0]
          if obj:
            self.dialog.SetObjectLink(obj)
          
          return True
        

        self.dialog is the SubDialog for the ToolData
        SetObjectLink() is a method defined in the SubDialog overriden class that simply calls LinkBoxGui.SetLink() with the picked object

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

          On 05/11/2015 at 13:32, xxxxxxxx wrote:

          Yannick Thanks so much! I was able to get both techniques working! I really appreciate your help. I did not know you could control the subdialog instance inside the ToodData Class this makes things easier for me :).

          Now I am just trying to replicate the highlight effect that the Pick Mode does.... I feel I am close just don't know what to do next to draw the highlight mode in the viewport.  I having trouble finding a good explanation of how highlight mode works. This is what I have so far by using the ToodData::GetCursorInfo() I can figure out which object my mouse is over and can print out the name of the object, now I just need to draw it in highlight mode. But not sure how to do that...

          def GetCursorInfo(self, doc, data, bd, x, y, bc) :
              if bc.GetId() == -1:
                  print "SCAN FOR CURSOR OJBECT"
                  op = c4d.utils.ViewportSelect().PickObject(bd, doc, x, y, rad=int(10), flags=c4d.VIEWPORT_PICK_FLAGS_0)
          #This will print the name of the object my mosue is over
          #print op[0]
          # Not sure what do do next... inable highlight handle or something...
                  highlightHandle = op[0].GetHighlightHandle(bd)

          return True

          Anyone have any tips on how do get highlight mode working? Sorry if these are noob questions, I was looking on the forums for a similar question and documentation and could not figure it out.

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

            On 06/11/2015 at 06:31, xxxxxxxx wrote:

            The highlight effect that the Pick Mode does can be obtain starting a PickSession in the active document.
            Unfortunately this cannot be done with the Python API as BaseDocument.StartPickSession()/StopPickSession() and PickSessionDataStruct are missing.

            So far the best and shortest solution is to send an action message to the LinkBox as shown in the first code I posted in my previous message.

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

              On 06/11/2015 at 09:06, xxxxxxxx wrote:

              OK thanks for that explanation I appreciate your time. That is a bummer that it can not be done simply with PythonAPI but that is ok. You have helped me make good progress on my first plugin.

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