Communication between ToolData and SubDialog



  • On 20/12/2015 at 09:47, xxxxxxxx wrote:

    Hello everbody,

    in the following purified ToolDataCode two number fields of the subdialog are live-updated with the current mouse position (x,y) by the ToolData... if the mouse is over the editor, of course. After some attempts Ive found the setter-way. So thats fine.
    Now I want the position of a drawn circle live-updated by these two number fields, but I have no ideas how to call the tooldata from the subdialog.

    Any ideas?

    import c4d  
    import os  
    import math  
    from math import pi as pi  
      
    from c4d import gui, plugins, bitmaps  
      
    #be sure to use a unique ID obtained from www.plugincafe.com  
    PLUGIN_ID = 548721  
      
    class SettingsDialog(gui.SubDialog) :  
      
      def __init__(self, arg) :  
          self.opts = arg  
      
      def CreateLayout(self) :  
          self.GroupBegin(10000, c4d.BFH_LEFT, 2, 1)  
          self.GroupBorderSpace(5,5,5,5)  
      
          self.AddStaticText(10001, c4d.BFH_LEFT, initw=100, inith=0, name='Mouse X')  
          self.AddEditNumberArrows(10002, c4d.BFH_MASK, initw=100, inith=0)  
      
          self.AddStaticText(10003, c4d.BFH_LEFT, initw=100, inith=0, name='Mouse Y')  
          self.AddEditNumberArrows(10004, c4d.BFH_MASK, initw=100, inith=0)  
          self.GroupEnd()  
          return True  
      
      def InitValues(self) :  
          self.SetLong(10002, self.opts["x"])  
          self.SetLong(10004, self.opts["y"])  
          return True  
      
      
      def SetMousePosition(self, x, y) :  
          self.opts['x'] = x  
          self.opts['y'] = x  
          self.SetLong(10002, x)  
          self.SetLong(10004, y)  
      
      
      def Command(self, id, msg) :  
          if id==10002: self.opts["x"] = self.GetLong(10002)  
          if id==10004: self.opts["y"] = self.GetLong(10004)  
          return True  
      
      
    class TDTest(plugins.ToolData) :  
      x = y = 0  
      subdialog = None  
      
      def __init__(self) :  
          self.data = dict(x=0, y=0)  
        
      def Draw(self, doc, data, bd, bh, bt, flags) :  
          bd.SetPen(c4d.Vector(1,1,1))  
          bd.DrawHandle2D(c4d.Vector(self.x,self.y,0), c4d.DRAWHANDLE_BIG)  
          bd.DrawCircle2D(self.x, self.y, 20)  
          return c4d.TOOLDRAW_HANDLES|c4d.TOOLDRAW_AXIS  
      
      def GetCursorInfo(self, doc, data, bd, x, y, bc) :  
          print x,y  
          if x!=-1 and y!=-1:   
              self.x = int(x)  
              self.y = int(y)  
              if self.subdialog: self.subdialog.SetMousePosition(self.x, self.y)  
      
          c4d.DrawViews(c4d.DA_ONLY_ACTIVE_VIEW|c4d.DA_NO_THREAD|c4d.DA_NO_ANIMATION)  
          return True  
      
      def AllocSubDialog(self, bc) :  
          self.subdialog = SettingsDialog(self.data)  
          return self.subdialog #always return new instance  
      
        
      
    if __name__ == "__main__":  
      bmp = bitmaps.BaseBitmap()  
      dir, file = os.path.split(__file__)  
      fn = os.path.join(dir, "res", "")  
      bmp.InitWith(fn)  
      plugins.RegisterToolPlugin(id=PLUGIN_ID, str="TDTest",  
                                  info=c4d.PLUGINFLAG_TOOL_HIGHLIGHT|c4d.PLUGINFLAG_TOOL_SNAPSETTINGS, icon=bmp,   
                                  help="This string is shown in the statusbar",  
                                  dat=TDTest())
    

    greetings
    rown



  • On 20/12/2015 at 10:21, xxxxxxxx wrote:

    Ok, sorry for open new topic... Ive solved my trouble.

    import c4d  
    import os  
    import math  
    from math import pi as pi  
      
    from c4d import gui, plugins, bitmaps  
      
    #be sure to use a unique ID obtained from www.plugincafe.com  
    PLUGIN_ID = 548721  
      
    class SettingsDialog(gui.SubDialog) :  
      
      def __init__(self, arg) :  
          self.opts = arg  
      
      def CreateLayout(self) :  
          self.GroupBegin(10000, c4d.BFH_LEFT, 2, 1)  
          self.GroupBorderSpace(5,5,5,5)  
      
          self.AddStaticText(10001, c4d.BFH_LEFT, initw=100, inith=0, name='Mouse X')  
          self.AddEditNumberArrows(10002, c4d.BFH_MASK, initw=100, inith=0)  
      
          self.AddStaticText(10003, c4d.BFH_LEFT, initw=100, inith=0, name='Mouse Y')  
          self.AddEditNumberArrows(10004, c4d.BFH_MASK, initw=100, inith=0)  
          self.GroupEnd()  
          return True  
      
      def InitValues(self) :  
          self.SetLong(10002, self.opts["x"])  
          self.SetLong(10004, self.opts["y"])  
          return True  
      
      
      def SetMousePosition(self, x, y) :  
          self.opts['x'] = x  
          self.opts['y'] = y  
          self.SetLong(10002, x)  
          self.SetLong(10004, y)  
      
      
      def Command(self, id, msg) :  
          if id in (10002,10004) :  
              self.opts["x"] = self.GetLong(10002)  
              self.opts["y"] = self.GetLong(10004)  
              c4d.DrawViews(c4d.DA_ONLY_ACTIVE_VIEW|c4d.DA_NO_THREAD|c4d.DA_NO_ANIMATION)  
          return True  
      
      
    class TDTest(plugins.ToolData) :  
      subdialog = None  
      
      def __init__(self) :  
          self.data = dict(x=0, y=0)  
        
      def Draw(self, doc, data, bd, bh, bt, flags) :  
          bd.SetPen(c4d.Vector(1,1,1))  
          bd.DrawHandle2D(c4d.Vector(self.data['x'],self.data['y'],0), c4d.DRAWHANDLE_BIG)  
          bd.DrawCircle2D(self.data['x'], self.data['y'], 20)  
          return c4d.TOOLDRAW_HANDLES|c4d.TOOLDRAW_AXIS  
      
      def GetCursorInfo(self, doc, data, bd, x, y, bc) :  
          if x!=-1 and y!=-1:   
              self.data['x'] = int(x)  
              self.data['y'] = int(y)  
              if self.subdialog: self.subdialog.SetMousePosition(self.data['x'], self.data['y'])  
      
          c4d.DrawViews(c4d.DA_ONLY_ACTIVE_VIEW|c4d.DA_NO_THREAD|c4d.DA_NO_ANIMATION)  
          return True  
      
      def AllocSubDialog(self, bc) :  
          self.subdialog = SettingsDialog(self.data)  
          return self.subdialog #always return new instance  
      
        
      
    if __name__ == "__main__":  
      bmp = bitmaps.BaseBitmap()  
      dir, file = os.path.split(__file__)  
      fn = os.path.join(dir, "res", "")  
      bmp.InitWith(fn)  
      plugins.RegisterToolPlugin(id=PLUGIN_ID, str="TDTest",  
                                  info=c4d.PLUGINFLAG_TOOL_HIGHLIGHT|c4d.PLUGINFLAG_TOOL_SNAPSETTINGS, icon=bmp,   
                                  help="This string is shown in the statusbar",  
                                  dat=TDTest())
    

    I just add c4d.DrawViews(c4d.DA_ONLY_ACTIVE_VIEW|c4d.DA_NO_THREAD|c4d.DA_NO_ANIMATION) to the CommandMethod and the position is now written directly into the dictionary.


Log in to reply