[Closed] dotnet event handler arguments
I have a pop-up window with a bezier curve dawn and I have placed a dotnet event handler on a point that is supposed to pass the name of a poly to a function called scriptctrl, (six lines from the bottom) via a MouseMove function that sends position data.
However I get an error that I have too many arguments…
try(form.close())catch()
--clearListener()
poly = getnodebyname "basemesh"
maxHandlePointer=(Windows.GetMAXHWND())
sysPointer = DotNetObject "System.IntPtr" maxHandlePointer
maxHwnd = DotNetObject "MaxCustomControls.Win32HandleWrapper" sysPointe
form=dotNetObject "form"
form.Show (maxHwnd)
theImage = dotNetClass "System.Drawing.Image" --create an Image dotNetClass
graph=dotNetObject "label"
-- showproperties graph
graph.bounds=dotNetObject "system.drawing.rectangle" 40 40 400 400
fn bezier2D p1 p1t p2t p2 t=
(
Q1 = (p1t - p1) * t + p1
Q2 = (p2t - p1t) * t +p1t
Q3 = (p2 - p2t) * t +p2t
Q4 = (Q2 - Q1) * t + Q1
Q5 = (Q3 - Q2) * t + Q2
Q5 = (Q5 - Q4) * t + Q4
)
-- .DrawLine <System.Drawing.Pen>pen <System.Drawing.Point>pt1 <System.Drawing.Point>pt2
redCol=(dotNetClass "system.drawing.color").orange
blueCol=(dotNetClass "system.drawing.color").blue
col=(dotNetClass "system.drawing.color").blue
redPen=dotNetObject "system.drawing.pen" redCol 2
bluePen=dotNetObject "system.drawing.pen" blueCol 2
fn scriptctrl sender arg poly =
(
print poly
)
fn paintGraph sender arg =
(
g=arg.graphics
-- showMethods g
local p1=sender.controls.item[0].location
local p1t=sender.controls.item[1].location
local p2t=sender.controls.item[2].location
local p2=sender.controls.item[3].location
g.drawLine redPen p1 p1t
g.drawLine redPen p2t p2
for t = 0 to 1 by .01 do
(
dp=bezier2D [p1.x+5,p1.y+5] [p1t.x+2,p1t.y+2] [p2t.x+2,p2t.y+2] [p2.x+5,p2.y+5] t
drawPoint=dotNetObject "system.drawing.point" dp.x dp.y
if sender.tag!=undefined do
(
g.drawLine bluePen sender.tag drawPoint
)
sender.tag=drawPoint
)
sender.tag=undefined
)
fn mouseMove sender arg=
(
if arg.button==arg.button.left do
(
sender.location=(sender.parent.PointToClient sender.MousePosition)
graph.invalidate()
)
)
namelbl = dotNetObject "label"
namelbl.size=dotNetObject "system.drawing.size" 270 30
namelbl.text = "Non-Linear Morph Control"
namelbl.font = dotNetObject "System.Drawing.Font" "Arial" 16
namelbl.location = dotNetObject "system.drawing.point" 150 5
lb1=dotNetObject "label"
lb1.size=dotNetObject "system.drawing.size" 5 5
lb1.backColor=(dotNetClass "system.drawing.color").black
lb1.location=dotNetObject "system.drawing.point" 48 189
dotNet.addEventHandler lb1 "mouseMove" mouseMove
lb1t=dotNetObject "label"
lb1t.size=dotNetObject "system.drawing.size" 10 10
lb1t.backColor=(dotNetClass "system.drawing.color").blue
lb1t.location=dotNetObject "system.drawing.point" 61 85
dotNet.addEventHandler lb1t "mouseMove" mouseMove
lb2=dotNetObject "label"
lb2.size=dotNetObject "system.drawing.size" 5 5
lb2.backColor=(dotNetClass "system.drawing.color").black
lb2.location=dotNetObject "system.drawing.point" 192 47
dotNet.addEventHandler lb2 "mouseMove" mouseMove
lb2t=dotNetObject "label"
lb2t.size=dotNetObject "system.drawing.size" 10 10
lb2t.backColor=(dotNetClass "system.drawing.color").blue
lb2t.location=dotNetObject "system.drawing.point" 134 49
dotNet.addEventHandler lb2t "mouseMove" mouseMove
graph.controls.add lb1
graph.controls.add lb1t
graph.controls.add lb2t
graph.controls.add lb2
form.controls.add namelbl
form.controls.add graph
form.show()
form.size=dotNetObject "system.drawing.size" 500 500
form.backColor=(dotNetClass "system.drawing.color").fromArgb 100 100 100
form.text="Non Linear Morph Control"
dotNet.addEventHandler graph "paint" paintGraph
dotNet.addEventHandler graph "paint" scriptctrl poly
dotNet.setLifeTimeControl graph #dotNet
dotNet.setLifeTimeControl lb1 #dotNet
dotNet.setLifeTimeControl lb1t #dotNet
dotNet.setLifeTimeControl lb2 #dotNet
dotNet.setLifeTimeControl lb2t #dotNet
a mxs function subscribed to a dotnet event handler must be defined with either 1 or 2 arguments:
sender and event args,
or just event args
dotNet.addEventHandler takes 3 arguments:
a dotnetobject with a public event,
a string that is the name of the event,
and an mxs function that is defined as described above
you have tried to pass an extra argument poly to the dotNet.addEventHandler function making a total of 4. this is why you have an error
without testing, based on your code in its current state I’d say it would probably work if you just deleted the ‘poly’ from the sixth from last line and did the same from your scriptctrl function argument list.
Hi Thanks. yes I could create scriptctrl function without sender arguments but then how could I get the position of the lbl point into the function? It seems I can either get info from sender or poly argument but not both. deleting poly from that line works but doesnt pass any info about poly into scriptctrl function. Thanks for your time.
I can’t seem to get my head around this problem. What do I need to affect values on a controller as I move a label around a window according to its position? (Just roughly in pesudo code) Thanks for any help.
as i understood your problem…
at the moment of event handling a .net form control needs to know the object of editing (in your case it’s some max object – poly)
the generally used method in mxs is to assigning the max value to the control’s tag.
<control>.tag = dotnetmxsvalue [i][b]poly[/b][/i]
this trick has many samples on this forum. try to search using keyword: dotnetmxsvalue
if whole window (form) is about the editing of the poly i would assign it to the form’s tag. this way all controls of this window could get access to the poly:
fn onsomeeventhappend sender arg =
(
poly = sender.toplevelcontrol.tag.value
...
)
thanks denis. yes I tried the dotnetmxsvalue but it failed to pass on poly…I will try the other solutions you mentioned.
Running the code below yields an unknown exception error when ‘show window’ is clicked.
I’ve created a form.tag = upln (highlighted in red), which should make upln available to every function in the form window.However a problem arises in the scriptctrl function,(yellow) which gives the error. I’ve tried all variations of upln:undefined, etc but either I get the exception error or the upln value is simply not passed. Thanks for your time.
fn bezier2D p1 p1t p2t p2 t=
(
Q1 = (p1t - p1) * t + p1
Q2 = (p2t - p1t) * t +p1t
Q3 = (p2 - p2t) * t +p2t
Q4 = (Q2 - Q1) * t + Q1
Q5 = (Q3 - Q2) * t + Q2
Q5 = (Q5 - Q4) * t + Q4
)
global executeTimer =
(
global redCol=(dotNetClass "system.drawing.color").orange
global blueCol=(dotNetClass "system.drawing.color").blue
global col=(dotNetClass "system.drawing.color").blue
global redPen=dotNetObject "system.drawing.pen" redCol 2
global bluePen=dotNetObject "system.drawing.pen" blueCol 2
global graph=dotNetObject "label"
timer = dotnetobject "Timer"
timer.interval = 10
fn executeJob s e =
(
s.Stop()
s.tag.value[1] data:s.tag.value[2] upln:s.tag.value[3]
)
dotnet.addEventHandler timer "Tick" executeJob
timer
)
custAttr = attributes custAttr
(
fn showDialog data:undefined upln:undefined =
(
try(form.close())catch()
maxHandlePointer=(Windows.GetMAXHWND())
sysPointer = DotNetObject "System.IntPtr" maxHandlePointer
maxHwnd = DotNetObject "MaxCustomControls.Win32HandleWrapper" sysPointer
form=dotNetObject "form"
form.Show (maxHwnd)
theImage = dotNetClass "System.Drawing.Image"
graph=dotNetObject "label"
graph.bounds=dotNetObject "system.drawing.rectangle" 40 40 400 400
fn bezier2D p1 p1t p2t p2 t=
(
Q1 = (p1t - p1) * t + p1
Q2 = (p2t - p1t) * t +p1t
Q3 = (p2 - p2t) * t +p2t
Q4 = (Q2 - Q1) * t + Q1
Q5 = (Q3 - Q2) * t + Q2
Q5 = (Q5 - Q4) * t + Q4
)
redCol=(dotNetClass "system.drawing.color").orange
blueCol=(dotNetClass "system.drawing.color").blue
col=(dotNetClass "system.drawing.color").blue
redPen=dotNetObject "system.drawing.pen" redCol 2
bluePen=dotNetObject "system.drawing.pen" blueCol 2
fn scriptctrl sender arg upln:form.tag = (
print upln
)
fn paintGraph sender arg =
(
g=arg.graphics
-- showMethods g
local p1=sender.controls.item[0].location
local p1t=sender.controls.item[1].location
local p2t=sender.controls.item[2].location
local p2=sender.controls.item[3].location
g.drawLine redPen p1 p1t
-- g.drawLine redPen p1t p2t
g.drawLine redPen p2t p2
for t = 0 to 1 by .01 do
(
local dp=bezier2D [p1.x+5,p1.y+5] [p1t.x+2,p1t.y+2] [p2t.x+2,p2t.y+2] [p2.x+5,p2.y+5] t
drawPoint=dotNetObject "system.drawing.point" dp.x dp.y
if sender.tag!=undefined do
(
g.drawLine bluePen sender.tag drawPoint
)
sender.tag=drawPoint
)
sender.tag=undefined
)
fn mouseMove sender arg=
(
--local graph=dotNetObject "label"
if arg.button==arg.button.left do
(
sender.location=(sender.parent.PointToClient sender.MousePosition)
graph.invalidate()
)
)
namelbl = dotNetObject "label"
namelbl.size=dotNetObject "system.drawing.size" 270 30
namelbl.text = "Non-Linear Morph Control"
namelbl.font = dotNetObject "System.Drawing.Font" "Arial" 16
namelbl.location = dotNetObject "system.drawing.point" 150 5
lb1=dotNetObject "label"
lb1.size=dotNetObject "system.drawing.size" 5 5
lb1.backColor=(dotNetClass "system.drawing.color").black
lb1.location=dotNetObject "system.drawing.point" 48 189
dotNet.addEventHandler lb1 "mouseMove" mouseMove
lb1t=dotNetObject "label"
lb1t.size=dotNetObject "system.drawing.size" 10 10
lb1t.backColor=(dotNetClass "system.drawing.color").blue
lb1t.location=dotNetObject "system.drawing.point" 61 85
dotNet.addEventHandler lb1t "mouseMove" mouseMove
lb2=dotNetObject "label"
lb2.size=dotNetObject "system.drawing.size" 5 5
lb2.backColor=(dotNetClass "system.drawing.color").black
lb2.location=dotNetObject "system.drawing.point" 192 47
dotNet.addEventHandler lb2 "mouseMove" mouseMove
lb2t=dotNetObject "label"
lb2t.size=dotNetObject "system.drawing.size" 10 10
lb2t.backColor=(dotNetClass "system.drawing.color").blue
lb2t.location=dotNetObject "system.drawing.point" 134 49
dotNet.addEventHandler lb2t "mouseMove" mouseMove
graph.controls.add lb1
graph.controls.add lb1t
graph.controls.add lb2t
graph.controls.add lb2
form.controls.add namelbl
form.controls.add graph
form.show()
form.size=dotNetObject "system.drawing.size" 500 500
form.tag = dotnetmxsvalue upln
--form.tag.value2= dotnetmxsvalue 13
form.backColor=(dotNetClass "system.drawing.color").fromArgb 100 100 100
form.text="Non Linear Morph Control"
dotNet.addEventHandler graph "paint" paintGraph
dotNet.addEventHandler graph "paint" scriptctrl
dotNet.setLifeTimeControl graph #dotNet
dotNet.setLifeTimeControl lb1 #dotNet
dotNet.setLifeTimeControl lb1t #dotNet
dotNet.setLifeTimeControl lb2 #dotNet
dotNet.setLifeTimeControl lb2t #dotNet
)
local dialog
parameters params
(
)
rollout params "Edit"
(
dotnetcontrol bt "Button" text:"Show Window" width:120 height:24 align:#center
on bt MouseClick s e do
(
upln = 13
executeTimer.tag = dotnetmxsvalue #(showDialog, this,upln)
executeTimer.Start()
)
on params open do
(
)
)
)
delete objects
b = box isselected:on
custattributes.add b custAttr baseobject:on
is all of this a new reincarnation of http://forums.cgsociety.org/showthread.php?f=98&t=1019278&highlight=bezier ?
No Denis …the question is about passing arguments, not creating bezier splines…the bezier spline business is irrelevant here…if you could find time to just run the code and give me your thoughts on why its misbehaving I would be eternally grateful.
so let’s forget about bezier.
you are looking for a way to pass extra data in event handler… right?
i see you code and you do almost everything right but … it has a bug. do you want me to fix it?
Yes …forget about the bezier, and yes, I’m wanting to pass extra data in the event handler and yes I would love you to fix the bug. That would be outrageously useful.
here is a sample how to use dotnet objects with max nodes…
press button and move mouse:
try(form.close()) catch()
form = dotnetobject "MaxCustomControls.Maxform"
form.Text = "Move with denisT"
form.StartPosition = form.StartPosition.Manual
form.Location = dotnetobject "System.Drawing.Point" 600 100
form.ClientSize = dotnetobject "System.Drawing.Size" 172 52
form.MaximizeBox = form.MinimizeBox = off
form.FormBorderStyle = form.FormBorderStyle.FixedSingle
c = dotnetclass "System.Drawing.Color"
fn onMouseMove s e = if e.Button == e.Button.Left do
(
node = s.TopLevelControl.tag.value
if isvalidnode node do node.pos.controller[s.name].value = s.tag - e.y
)
fn onMouseDown s e = if e.Button == e.Button.Left do
(
node = s.TopLevelControl.tag.value
if isvalidnode node do
(
s.tag = node.pos.controller[s.name].value + e.y
node.wirecolor = color s.BackColor.R s.BackColor.G s.BackColor.B
)
s.Backcolor = s.FlatAppearance.MouseDownBackColor
)
fn onMouseUp s e =
(
node = s.TopLevelControl.tag.value
if isvalidnode node do
(
node.wirecolor = yellow
)
s.Backcolor = s.ForeColor
)
fn makeButton name: pos: backcolor: downcolor: =
(
b = dotnetobject "Button"
b.text = name
b.name = name + "_Position"
b.Location = dotnetobject "System.Drawing.Point" pos.x pos.y
b.Size = dotnetobject "System.Drawing.Size" 48 48
b.FlatStyle = b.FlatStyle.Flat
b.ForeColor = b.Backcolor = backcolor
b.FlatAppearance.MouseDownBackColor = downcolor
dotnet.addEventHandler b "MouseDown" onMouseDown
dotnet.addEventHandler b "MouseMove" onMouseMove
dotnet.addEventHandler b "MouseUp" onMouseUp
b
)
btx = makeButton name:"X" pos:[12,2] backcolor:c.Red downcolor:c.Pink
bty = makeButton name:"Y" pos:[62,2] backcolor:c.Green downcolor:c.LightGreen
btz = makeButton name:"Z" pos:[112,2] backcolor:c.Blue downcolor:c.LightBlue
form.Controls.AddRange #(btz,bty,btx)
form.showmodeless()
delete objects
form.tag = dotnetmxsvalue (box name:"moveMe" wirecolor:yellow)