Set LinkBox to Pick Mode

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.

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

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.

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.

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.