On 12/05/2013 at 14:24, xxxxxxxx wrote:
No worries. I've got it all worked out now.
It just didn't like the way I was using the class member variables.
Here's the working version. Just in case anyone needs it. Or is curious about it.
When the GeDialog button is clicked. The image moves to a new position properly now.
I also threw in some mouse position checking code.
import c4d,os
from c4d import gui, plugins
class MyUA(c4d.gui.GeUserArea) :
xValue = 0 #These variables will set the position of the image
yValue = 0
def __init__(self) :
dir, file = os.path.split(__file__) #Gets the plugin's directory
path = os.path.join(dir, "res") #Adds the res folder to the directory to target the res folder
image = path + "\myimage.png" #Adds the image to the path
self.bmp = c4d.bitmaps.BaseBitmap() #Create an instance of the BaseBitmap class
self.bmp.InitWith(image) #Initialize it with the image
self.xValue = 5
self.yValue = 5
def DrawMsg(self, x1, y1, x2, y2, msg) :
self.DrawSetPen(c4d.COLOR_BG) #COLOR_BG is the image we load with DrawBitmap
self.DrawRectangle(x1, y1, x2, y2) #Draws a rectangle and fills it with the image bitmap
self.SetClippingRegion(x1, y1, x2, y2)
w, h = self.bmp.GetSize() #Gets the size values of the image
self.DrawBitmap(self.bmp, x1 + self.xValue, y1 + self.yValue, w, h, 0, 0, w, h, c4d.BMP_NORMAL | c4d.BMP_ALLOWALPHA)
self.DrawBorder(c4d.BORDER_ROUND, x1+5, y1+5, x2-5, y2-5) #Draws a border around the UserArea
def InputEvent(self, msg) :
action = c4d.BaseContainer(c4d.BFM_ACTION)
action.SetLong(c4d.BFM_ACTION_ID, self.GetId())
while self.GetInputState(c4d.BFM_INPUT_MOUSE, c4d.BFM_INPUT_MOUSELEFT, msg) : #While the left mouse button is held down
if msg.GetLong(c4d.BFM_INPUT_VALUE)==0: break
if msg[c4d.BFM_INPUT_DEVICE] == c4d.BFM_INPUT_MOUSE:
x, y = msg[c4d.BFM_INPUT_X], msg[c4d.BFM_INPUT_Y]
g2l = self.Global2Local()
x += g2l['x']
y += g2l['y']
if msg[c4d.BFM_INPUT_CHANNEL] == c4d.BFM_INPUT_MOUSELEFT:
print x, y #The mouse's X & Y pos inside the user area
action.SetLong(c4d.BFM_ACTION_INDRAG, True)
self.SendParentMessage(action) #Sends a message to the parent dialog that the mouse is dragging in the UA
self.Redraw() #Redraw while the left mouse button is held down
action.SetLong(c4d.BFM_ACTION_INDRAG, False)
self.SendParentMessage(action) #Sends a message to the parent dialog that the mouse has stopped dragging in the UA
return True
class MyDialog(c4d.gui.GeDialog) :
ua = MyUA() #Create a local class instance of the UserArea
def CreateLayout(self) :
self.AddUserArea(2000, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT)
self.AttachUserArea(self.ua, 2000)
self.AddButton(1000, c4d.BFH_CENTER, 80, 15, "Click Me")
self.AddButton(1001, c4d.BFH_CENTER, 80, 15, "Close")
return True
#This method initializes things when the plugin starts
def InitValues(self) :
return True
def Command(self, id, msg) :
if id==1000:
self.ua.xValue = 100
self.ua.yValue = 100
self.ua.Redraw()
elif id==1001:
self.Close()
return True
###### This class is only used to register the plugin...Don't change!!!#######
class BitmapUaExample(c4d.plugins.CommandData) :
dlg = None
ua = None
PLUGIN_ID = 10000090 # TESTING ID ONLY!!!
ICON = None
def Execute(self, doc) :
if not self.dlg: self.dlg = MyDialog()
self.dlg.Open(c4d.DLG_TYPE_ASYNC, self.PLUGIN_ID, -1, -1, 400, 300)
return True
def RestoreLayout(self, subid) :
if not self.dlg:
self.dlg = MyDialog()
return self.dlg.Restore(self.PLUGIN_ID, subid)
@classmethod
def Register(myPlugin) :
data = {
"id": myPlugin.PLUGIN_ID,
"icon": myPlugin.ICON,
"str": "Bitmap UA Example",
"help": "Some text that shows up at the bottom of the C4D UI",
"info": c4d.PLUGINFLAG_COMMAND_HOTKEY,
"dat": myPlugin(),
}
c4d.plugins.RegisterCommandPlugin(**data)
if __name__ == "__main__":
BitmapUaExample.Register()
-ScottA