"Dictionary" "self" and old SDK sample code might be my issue, but can somebody help me and point out, why I get a key error by just adding more gui elements to this old SDK ToolData plugin liquid-painter sample code.
adding a Checkbox (Bool) worked, but adding other gui elements breaks the smaple code somehow.
Key error on line 39 & 107 (marked in the Code so you don't need to search)
Thanks in advance
R20 Visualice
import c4d
import os
from c4d import gui, plugins, bitmaps
# be sure to use a unique ID obtained from www.plugincafe.com
PLUGIN_ID = 1015073
# for GeLoadString values must match with the header file
IDS_PRIMITIVETOOL = 50000
class SettingsDialog(gui.SubDialog):
parameters = None
def __init__(self, arg):
self.parameters = arg
def CreateLayout(self):
self.GroupBegin(id=1000, flags=c4d.BFH_SCALEFIT, cols=2, rows=5)
self.GroupBorderSpace(1, 1, 1, 1)
# Bool
self.element = self.AddStaticText(id=2003, flags=c4d.BFH_SCALEFIT, initw=1, name="Extend Vector: ", borderstyle=c4d.BORDER_NONE)
self.element = self.AddCheckbox(id=2002, flags=c4d.BFH_SCALEFIT, initw=1, inith=0, name="")
#valuebool = self.parameters['extend_vector']
self.SetBool(2002, False)
# Extension Value
self.element = self.AddStaticText(id=3001, flags=c4d.BFH_SCALEFIT, initw=1, name="Extension Ratio: ", borderstyle=c4d.BORDER_NONE)
valueextension = self.parameters['extension_ratio']
self.AddEditSlider(id=3002, flags=c4d.BFH_SCALEFIT)
self.SetFloat(id=3002, value=valueextension, min=0.1, max=100, step=0.1, min2=0.0001, max2=1000, quadscale=True)
print self.parameters
self.element = self.AddStaticText(id=1001, flags=c4d.BFH_SCALEFIT, initw=1, name="Sphere Size: ", borderstyle=c4d.BORDER_NONE)
valuespheresize = self.parameters["sphere_size"]
# first key error
self.AddEditNumberArrows(id=1002, flags=c4d.BFH_SCALEFIT)
self.SetFloat(id=1002, value=valuespheresize, min=0, max=20)
self.GroupEnd()
return True
def Command(self, id, msg):
if id == 1002:
self.parameters['sphere_size'] = self.GetFloat(1002)
print "Sphere Size: ", self.GetFloat(1002)
if id == 2002:
self.parameters['extend_vector'] = self.GetBool(2002)
print "Extend Vector:", self.GetBool(2002)
if id == 3002:
self.parameters['extension_ratio'] = self.GetFloat(3002)
print "Extension Ratio: ", self.GetFloat(3002)
return True
class AVTTool(plugins.ToolData):
# Inherit from ToolData to create your own tool
def __init__(self):
self.data = {'sphere_size': 15}
self.data = {'extension_ratio': 1}
def GetState(self, doc):
if doc.GetMode() == c4d.Mpaint: return False
return c4d.CMD_ENABLED
def Debug(self, msg):
# c4d.CallCommand(13957) # Konsole loeschen
print "Konsole geloescht."
return True
def KeyboardInput(self, doc, data, bd, win, msg):
key = msg.GetLong( c4d.BFM_INPUT_CHANNEL )
cstr = msg.GetString( c4d.BFM_INPUT_ASC )
if key == c4d.KEY_ESC:
# do what you want
print "ESC Key Pressed."
# return True to signal that the key is processed
return True
return False
def MouseInput(self, doc, data, bd, win, msg):
mx = msg[c4d.BFM_INPUT_X]
my = msg[c4d.BFM_INPUT_Y]
device = 0
if msg[c4d.BFM_INPUT_CHANNEL] == c4d.BFM_INPUT_MOUSELEFT:
device = c4d.KEY_MLEFT
elif msg[c4d.BFM_INPUT_CHANNEL] == c4d.BFM_INPUT_MOUSERIGHT:
device = c4d.KEY_MRIGHT
else:
return True
null = c4d.BaseObject( c4d.Ometaball )
null[c4d.METABALLOBJECT_SUBEDITOR] = 10
null.MakeTag( c4d.Tphong )
doc.AddUndo( c4d.UNDO_NEW, null )
doc.InsertObject( null )
doc.SetActiveObject( null )
c4d.DrawViews( c4d.DA_ONLY_ACTIVE_VIEW | c4d.DA_NO_THREAD | c4d.DA_NO_ANIMATION )
rad = self.data['sphere_size']
# second key error
dx = 0.0
dy = 0.0
win.MouseDragStart( button=device, mx=int( mx ), my=int( my ),
flags=c4d.MOUSEDRAGFLAGS_DONTHIDEMOUSE | c4d.MOUSEDRAGFLAGS_NOMOVE )
result, dx, dy, channel = win.MouseDrag()
while result == c4d.MOUSEDRAGRESULT_CONTINUE:
mx += dx
my += dy
# continue if user doesnt move the mouse anymore
if dx == 0.0 and dy == 0.0:
result, dx, dy, channel = win.MouseDrag()
continue
cl = c4d.BaseObject( c4d.Osphere )
cl.SetAbsPos( bd.SW( c4d.Vector( mx, my, 500.0 ) ) )
cl[c4d.PRIM_SPHERE_RAD] = rad
cl.InsertUnder( null )
c4d.DrawViews( c4d.DA_ONLY_ACTIVE_VIEW | c4d.DA_NO_THREAD | c4d.DA_NO_ANIMATION )
result, dx, dy, channel = win.MouseDrag()
if win.MouseDragEnd() == c4d.MOUSEDRAGRESULT_ESCAPE:
doc.DoUndo( True )
c4d.EventAdd()
return True
def GetCursorInfo(self, doc, data, bd, x, y, bc):
if bc.GetId() == c4d.BFM_CURSORINFO_REMOVE:
return True
bc.SetString( c4d.RESULT_BUBBLEHELP, plugins.GeLoadString( IDS_PRIMITIVETOOL ) )
bc.SetLong( c4d.RESULT_CURSOR, c4d.MOUSE_POINT_HAND )
return True
def AllocSubDialog(self, bc):
return SettingsDialog( self.data ) # always return new instance
if __name__ == "__main__":
bmp = bitmaps.BaseBitmap()
dir, file = os.path.split(__file__)
fn = os.path.join(dir, "res", "AligntoVector.tif")
bmp.InitWith(fn)
plugins.RegisterToolPlugin( id=PLUGIN_ID, str="Py-AlignToVector",
info=0, icon=bmp,
help="Select two Points to generate a Vector. Then Click additional points to move them onto the Vector.",
dat=AVTTool() )