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.