Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Управление элементами интерфейса 3dsMax.UIAccessorСодержание книги
Поиск на нашем сайте Когда в справке MaxScript нет методов управления какими-то элементами интерфейса 3dsMax, а MaxScript Listener ничего не показывает при нажатии на какой нибудь чекбокс или кнопочку и при этом есть жгучее желание скриптово управлять нужным элементом интерфейса, есть способ: Из MaxScriptHelp
< bool > UIAccessor.SendMessage < HWND > hwndDlg < integer > MessageID < integer > wParam < integer > lParam
<bool>--Возвращаемое значение UIAccessor.SendMessage --метод <HWND>hwndDlg -- дескриптор (уникальный идентификатор) элемента UI (Пользовательского Интерфейса (User Interface)) <integer>wParam -- дополнительный параметр (0 или 1) 1-включить 0-выключить <integer>lParam -- дополнительный параметр (0 или 1) 1-включить 0-выключить
/* К примеру нажмём кнопочку Attach для объекта Editable_Poly. Тестовой сценой будет Editable_Poly объект, режим панели Modify */ handleAttach --обявляем переменную, в которой будет дескриптор нужного элемента child_HWND = for c in windows.getChildrenHWND #max where c[4] == "ModifyTask" do exit with c[1] /*Получаем дескриптор нужной группы инструментов "ModifyTask"
/* Механизм управления элементами UI устроен через посылание сообщений этим элементам функцией UIAccessor.SendMessage или windows.sendMessage В этом блоке поиски воздействия на кнопку с помощью сообщений (для кнопки работает каряво, но в целях изучения тоже полезно) WM_LBUTTONDOWN = 513 -- это код низкоуровневого сообщения ссылка: https://fossies.org/linux/fpcbuild/fpcsrc/rtl/wince/wininc/messages.inc UIAccessor.SendMessage handleAttach 0x06bc 0x19 1 -- что то делает с кнопкой, что она не просто нажимается, но ещё и становится действующей UIAccessor.SendMessage handleAttach WM_LBUTTONDOWN 1 0 -- нажатие кнопки (эта строка срабатывает отдельно, весь код почему то не нажимает кнопку) --UIAccessor.SendMessage handleAttach 0x06bc 0x18 1 -- Set --UIAccessor.SendMessage handleAttach 0x06bc 0x18 0 -- Unset Эксперименты с перебором сообщений UIAccessor.SendMessage handleAttach <код сообщения> 1 0 16 -- скрытие кнопки 77 -- почему то вызывается Web help MaxScript 78, 275 -- Вылет макса (краш) 130 -- Кнопка блокируется */
/* Connect Copy (Включаем/выключаем чекбокс) Тестовой сценой будет построенный сплайн, переведённый в Editable Spline в режиме панели Modify, Включён подобъект 2 или 3 */ global handleConnect --объявляем переменную, в которой будет дескриптор нужного элемента для кнопки получаем дескриптор группы инструментов "Geometry" визуально включая чекбокс, без результата (функции не работают)*/
-- Другой способ заставить работать чекбокс
global handleUSoftSel
Ссылочки: http://www.3dcenter.ru/forum/index.php?act=Print&client=printer&f=58&t=108064 https://fossies.org/linux/fpcbuild/fpcsrc/rtl/wince/wininc/messages.inc http://forums.cgsociety.org/archive/index.php?t-1206693.html http://www.scriptspot.com/forums/3ds-max/general-scripting/press-radio-button-with-maxscript-in-command-panel _______________________________________________________________ Делаем окно роллаута “поверх определённого окна” Проблема такая: если создать окно роллаута в режиме работы, например, UVEditor-а, то когда начинаешь тыкать инструменты самого эдитора, - наш роллаут перекрывается и становится не виден. Чтобы такого не происходило, при создании диалога (функция CreateDialog) надо указать дескриптор окна-родителя для этого нашего окошка-роллаута. В результате получим наше окошко всегда над определённым окном. Более того, если закрыть родительское окно, то наш диалог тоже закроется! Вот пример:
gco=modpanel.getcurrentObject() -- переменная gco будет содержать в себе объект панели модификаторов. global Roll_uvE_child, HWND_uvE -- создаём голобальные переменные, чтобы их можно было бы вызвать в любом месте скрипта (это переменная самого нашего роллаута и переменная дескриптора (идентификатора) окна-родителя (для нас это окно-родитель будет окно редактора UVEdit)) WindowHandle = DialogMonitorOPS.GetWindowHandle() -- производим захват всех дескрипторов окон ChildWindows = UIAccessor.GetChildWindows WindowHandle -- здесь получаем массив всех дескрипторов дочерних окон всех вызванных окон, подавая на функцию UIAccessor.GetChildWindows переменную WindowHandle
for i in ChildWindows where (classof i) == Integer do -- если класс каждого элемента i есть целое число, то делать if (ClassOf (UIAccessor.GetWindowText i)) == String do -- если класс полученного текста из дескриптора есть текстовый тип данных String, то делать… На этом этапе дескриптор окна расшифровывается в понятный нам текст и отфильтровывается от других типов данных. if (findString (UIAccessor.GetWindowText i) "Edit UVWs")!= undefined do HWND_uvE=i -- если полученный текст (UIAccessor.GetWindowText), из дескриптора i-того элемента массива ChildWindows есть "Edit UVWs" (это титульное название окна UV-редактора) и результаты этих нахождений этой строки с названием не есть undefined, а результат есть и существует, тогда присвоить переменной HWND_uvE значение i, это значение i - как раз элемент массива ChildWindows, он же и есть искомый дескриптор окна UVEdit
rollout Roll_uvE_child "" width:130 height:20 -- тестовый роллаут ( slider sld1 "" range:[1,100,30] pos:[1,-10] width:137 height:25 type:#integer ) if classof gco == Unwrap_UVW -- если класс объекта панели modify есть Unwrap_UVW, то then ( try DestroyDialog Roll_uvE_child catch() CreateDialog Roll_uvE_child pos: [900,230] parent: HWND_uvE ) пробовать закрыть диалог роллаута если он открыт; Создать диалогу роллаута в такой то позиции и задать окно-родителя через найденный выше дескриптор (parent: HWND_uvE)
Вот тоже самое, но оптимизировано: --for i in ChildWindows do format "%\n" (UIAccessor.GetWindowText i) for i in ChildWindows where (UIAccessor.GetWindowText i)=="Edit UVWs" do exit with HWND_uvE=i _______________________________________________________________
|
||
|
Последнее изменение этой страницы: 2021-04-13; просмотров: 179; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.007 с.) |