Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 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; просмотров: 111; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.44.23 (0.009 с.) |