Сделаем опять переменные локальными
private System.Windows.Forms.Label label1; private System.Windows.Forms.NumericUpDown numericUpDown1; private System.Windows.Forms.Button button1;
И создадим новое событие "Click" для кнопки button1.
Можно прописать его вручную
//Form1.Designer.cs this.button1.Click += new System.EventHandler(button1_Click); //Form1.cs public void button1_Click(object sender, EventArgs e) { }
или двойным кликом по файлу Form1.cs открыть вид Design
или же опять-таки двойным кликом по кнопке в виде Design создем такой же код автоматически.
А теперь создадим новый метод
public delegate void TeapotCreateEventHandler(object sender, TeapotCreateEventArgs ValueArgs); public event TeapotCreateEventHandler TeapotCreate;
И новый класс TeapotCreateEventArgs, наследованный от EventArgs
Подробнее о EventArgs и EventHandler вы можете прочесть на MSDN
EventArgs.
EventHandler.
public class TeapotCreateEventArgs : EventArgs { public TeapotCreateEventArgs(decimal Radius) { this.Radius = Radius; } public TeapotCreateEventArgs(decimal Radius, int Segments, bool Body, bool Handle, bool Spout, bool Lid) { this.Radius = Radius; this.Segments = Segments; this.Body = Body; this.Handle = Handle; this.Spout = Spout; this.Lid = Lid; } public decimal Radius; ////// Описываем переменные и инициализупуем сразу их /// (Это нужно , если мы захотим объявить class TeapotCreateEventArgs только с параметром Radius) /// public int Segments = 5; public bool Body = true, Handle = true, Spout = true, Lid = true; }
И теперь пропишем его в коде обработки события нажатия кнопки
private void button1_Click(object sender, EventArgs e) { // Обрабатываем событие только если оно создано: // (то есть в макскрипте должно быть прописано dotnet.AddEventHandler form "TeapotCreate" maxscriptFunction) if (TeapotCreate != null) TeapotCreate(this, new TeapotCreateEventArgs(numericUpDownRadius.Value, (int)numericUpDownSeg.Value, this.checkBoxBody.Checked, this.checkBoxHandle.Checked, this.checkBoxSpout.Checked, this.checkBoxLid.Checked )); /*ИЛИ if (TeapotCreate != null) TeapotCreate(this, new TeapotCreateEventArgs(numericUpDownRadius.Value)); */ }
Открываем maxscript editor и пишем там
( local dll_filename = "EvenHandler.dll" local Assembly = (dotNetClass "System.Reflection.Assembly").Load ((dotNetClass "System.IO.File").ReadAllBytes dll_filename) myForm = Assembly.CreateInstance "TeapotCreator.Form1" fn CreateTeapot e = ( Teapot radius:e.Radius \ segments:e.Segments \ body:e.Body \ handle:e.Handle \ spout:e.Spout \ lid:e.Lid ) dotNet.addEventHandler myForm "TeapotCreate" CreateTeapot myForm.ShowModeless() )
Таким образом, не объявляя контролы на форме как глобальные мы тем не менее можем передавать их значения для создания объектов в 3ds Max.
Ссылка на проект
https://dl.dropbox.com/u/1880100/%21Blogger/EvenHandler.zip
Комментариев нет:
Отправить комментарий