![]() |
3DCoat
3D-COAT 4.9.xx
3DCoat is the one application that has all the tools you need to take your 3D idea from a block of digital clay all the way to a production ready, fully textured organic or hard surface model.
|
Например, надо посмотреть, как работает меню "Define Measurement Units" в комнате "Sculpt". Для этого нам необходим идентификатор. Два способа его найти:
MClick+RClick и получаем идентификатор в буфер обмена.В нашем случае обнаруживаем идентификатор DefineScaleCorrespondance. Находим его в коде проекта и видим с какой функцией он связан. Ставим точки останова и отслеживаем работу меню.
Много примеров можем найти в коде проекта. Общий синтаксис:
Чтобы меню стало доступным из скриптов, его необходимо зарегистрировать *до показа* UI. Для регистрации используем макрос ui_reg_pitem.
Помещаем в папку Scripts/ui файл с именем mainmenu.cpp. Пример кода в файле:
Когда появлятся необходимость вызвать окно свойств по R-Click, можем использовать BaseWidget::AssignPropPanel():
К сожалению, для "простыни" это плохой способ, т.к. формирование большого меню блокирует 3DCoat. С тяжёлыми меню лучше работать так.
Мы просто ловим событие WM_ONDROP в виджете, которого хотим научить ловить другие виджеты.
Для персонализации виджета пользуемся полем BaseWidget::UserInt.
Любой виджет, у которого свойство BaseWidget::Moveable = true, можно перемещать.
Большинство графических контролов обитают в файле SimpleWidgets.h.
Этот класс хранит все виджеты 3DCoat в Widgets::ActiveWidgets.
Также здесь находится набор свойств для определения положения мыши (Widgets::MouseX), размеров рабочей области (Widgets::WorkArea), где был сделан последний клик (Widgets::LastRmbX) и множество других характеристик, касающихся расположения элементов UI на экране (см. комментарии в коде).
Widgets::ActiveWidgets. Для этой цели аккуратно используем PenInterface::Root.Все виджеты 3DCoat лежат в PenInterface::Root.
Для поиска виджета по имени пользуемся функцией Find() или одним из методов:
BaseWidget::Find() Для поиска по ID и возврата *первого* подходящего виджета.BaseWidget::Look() Для получения *подборки* виджетов по любым свойствам.Для этой цели необходимо дать виджету имя, заполнив поле Name. Причём имя должно начинаться с символа $. В коде, по завершении инициализации своего виджета, вызываем RefreshHotkeysAssignment().
Если хотим назначить хоткей прямо в коде, воспользуемся макросом def_hotkey().
В методе Init() инициализируем свойства виджета и цепляем некоторые события:
WM_PAINT - для рисования виджетаWM_BUTTONDOWN - реакция виджета на прикосновениеWM_PRESS_BTN - реакция виджета на кликTextWidget::Init().Реакции виджета на события реализованы с помощью коллбэков.
Названия событий начинаются с префикса WM_ и размещены они в файле SimpleWidgets.
В качестве коллбэков для виджета может быть использована любая функция без параметров или принимающая в качестве параметров от 1 до 5 типов cPtrDiff.
Параметры для коллбэков всегда передаются через cPtrDiff.
Пример регистрации коллбэка WM_PRESS_BTN:
Для показа модального окна с некоторым набором кнопок используем ShowModalMessageBox().
Для не модального окна (управление сразу возвращается коду) находим ShowNormalMessageBox(). Но если нам необходимо просто окно, в котором каждый тик будем что-то перерисовывать, лучше перегрузить BaseClass::ProcessInEditor().
Когда нам необходимо надоедливое окно, появление которого художник захочет отменить, работаем с DontShowAgainDialog().
Магические окна для выполнения цепочки действий вызываем по ShowWizardBox(). Магическое окно - не модальное.
English.xml, в коде указываем только уникальные ID.