воскресенье, 15 июля 2012 г.

EventHandler или новый чайник это просто!

Давайте создадим свое событие в котором будем передавать параметры для создания нового чайника.

Сделаем опять переменные локальными
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

Комментариев нет:

Отправить комментарий