Hello, World :)


Писать большой сложный интерфейс на макскрипте дело неблагодарное, а многие моменты слишком сложно реализовать или вообще невозможно.
Например в Project Manager около 200 элементов, некоторые из которых написаны специально для Project Manager.
Но начиная с 9й версии 3ds max поддерживает .Net и теперь можно создавать интерфейсы в Visual Studio, что просто невероятно облегчает работу.
Итак, приступим.
Открываем VS (Visual Studio) и создаем новый проект.


Выбираем первый в списке Windows Forms Application.
Ok!

Чтобы такого полезного сделать?
Ну например сделаем утилиту для создания чайников!



Список доступных элементов находится на панели Toolbox (слева)
Перетягиваем на форму NumericUpDown и Button
С 3d max поставляется несколько библиотек, в которых есть классы контролов, оптимизированных для использования с 3dmax.
Давайте используем MaxCustomControls.dll и заменим System.Windows.Forms.Form на MaxCustomControls.MaxForm
Для этого надо добавить MaxCustomControls.dll в проект.
На панели Solution Explorer (справа) эсть папка References.
Вызовите меню для этой папки кликом правой кнопки и выберите Add Reference
Далее на вкладке Browse укажите путь к файлу  MaxCustomControls.dll (он находится в корне папки 3ds max)
Теперь чтобы заменить System.Windows.Forms.Form на MaxCustomControls.MaxForm выберите в Solution Explorer файл Form1.cs и выберите в меню View code.


В строке "public partial class Form1 : Form" заменим Form на "MaxCustomControls.MaxForm"

public partial class Form1 : MaxCustomControls.MaxForm

Также для того чтобы мы могли вызвать из скрипта обработку события клика по кнопке и получить значение спиннера(NumericUpDown ) надо сделать эти элементы глобальными
Открываем файл Form1.Designer.cs и в конце находим строки


        private System.Windows.Forms.NumericUpDown numericUpDown1;
        private System.Windows.Forms.Button button1;
меняем private на public.
Ну вот почти все готово.
Разве что теперь нам нужно в свойствах проекта выставить Output type как Class Library чтобы скомпилировать библиотеку .dll (Последний пункт в меню Project)


Также для того, чтобы можно было использовать новую библиотеку для макса любой битности надо изменить настройки в Configuration Manager

Затем в меню Build выбираем Build Solution.
В поле Output (внизу) появляются строки



------ Rebuild All started: Project: WindowsFormsApplication2, Configuration: Debug Any CPU ------
  WindowsFormsApplication2 -> D:\My Documents\Visual Studio 2010\Projects\!_Test\WindowsFormsApplication2\WindowsFormsApplication2\bin\Debug\WindowsFormsApplication2.dll
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========



Копируем путь к проекту (у меня это D:\My Documents\Visual Studio 2010\Projects\!_Test\WindowsFormsApplication2\WindowsFormsApplication2\bin\Debug\WindowsFormsApplication2.dll) и открываем 3ds max.
И создаем скрипт



(
    dotNet.loadAssembly @"D:\My Documents\Visual Studio 2010\Projects\!_Test\WindowsFormsApplication2\WindowsFormsApplication2\bin\Debug\WindowsFormsApplication2.dll"

    myForm = dotNetObject "WindowsFormsApplication2.Form1"

    fn CreateTeapot =
        (
            Teapot radius:myForm.numericUpDown1.Value
        )
    dotNet.addEventHandler myForm.Button1 "Click" CreateTeapot
    myForm.ShowModeless()
)


Ну а для большинства скриптов удобнее загружать dll таким способом.
В случае, если нам понадобится перекомпилировать библиотеку не придется перезагружать 3ds max


(
    local dll_filename = @"D:\My Documents\Visual Studio 2010\Projects\!_Test\WindowsFormsApplication2\WindowsFormsApplication2\bin\Debug\WindowsFormsApplication2.dll"
    local Assembly = (dotNetClass "System.Reflection.Assembly").Load ((dotNetClass "System.IO.File").ReadAllBytes dll_filename)

    myForm = Assembly.CreateInstance "WindowsFormsApplication2.Form1"

    fn CreateTeapot =
        (
            Teapot radius:myForm.numericUpDown1.Value
        )

    dotNet.addEventHandler myForm.Button1 "Click" CreateTeapot

    myForm.ShowModeless()
)


Итак все готово - кликаем по кнопке и вот он наш чайник!


Ссылка на проект
http://dl.dropbox.com/u/1880100/%21Blogger/TeapotCreator.zip

В следующем посте расскажу как создавать свое событие (EventHandler) с параметрами и вызывать его из maxscript.






1 комментарий: