Как получить список аргументов для функции MAXScript

Цитата из документации Autodesk 3DS MAX:

Когда вы используете что-то вроде 'fn test val = ...", значение MAXScriptFunction создается и сохраняется в переменной test. Если переменная test была передана в другой метод, например, в качестве функции фильтра, этот метод будет проверять класс значение, чтобы убедиться, что это функция MAXScriptFunction, а затем вызвать ее с помощью apply().

Мой вопрос: функции в 3DS MAX хранятся в переменных, как и любые другие значения. Вы можете хранить их в массивах, передавать их другим функциям, делать то, что вы делаете с любым другим значением. Итак, вопрос: есть ли способ получить список аргументов, ожидаемых функцией, из переменной функции?

Вот небольшое пояснение, объясняющее, почему я задаю этот вопрос.

Допустим, у меня есть большая библиотека функций, хранящаяся в структурах. Например, одна из этих структур называется «ModelingTools».

Struct ModelingTools
(
    fn tool1 arg1 agr2 arg3 = (...),
    fn tool2 arg1 agr2 arg3 = (...),
    ...
)

ModelingTools = ModelingTools() --make an istance of the struct in global scope

А потом я хочу использовать эти функции в других скриптах. Я пишу это:

ModelingTools.tool1 arg1 arg2 arg3 

А что, если внутри уже тонны этих структур и тонны функций? Во встроенном редакторе нет автозаполнения, как в Visual Studio или QT. Поэтому я решил изобрести свой собственный велосипед. К счастью, MAXScript имеет встроенный метод для вывода списка всех зарегистрированных глобальных значений в MAX: globalVars.gather(). Для определений структур это событие печатает все их элементы. Я почти доволен этим: теперь я могу быстро найти все зарегистрированные структуры MAX, щелкнуть одну из них в представлении списка и перечислить все их функции-члены, быстро скопировать и вставить вызов нужной функции в мой код.

Единственная проблема с аргументами. Как узнать, какие аргументы мне нужно предоставить для конкретной функции?


person 3dmodels    schedule 15.12.2019    source источник


Ответы (1)


К сожалению, в MAXScript нет способа получить информацию об аргументах функции из определения функции. Я могу ошибаться (и был бы рад быть исправлен), но SDK также может не иметь способа получить указанную информацию.

Поскольку нет программного способа получения этой информации, вам придется изобрести свой собственный, если вам нужен доступ к ней с помощью кода. Например, тщательная каталогизация и хранение этих дополнительных метаданных в структуре, отражающей функциональную структуру.


Я столкнулся с ситуацией, похожей на то, что вы описываете: многие библиотеки организованы в структуры. Что хорошо сработало в нашем случае, так это ручное решение: написание подробной документации по функциям в виде комментариев прямо над тем местом, где определяются наши функции. Хитрость заключается в следующем: если функция или метод структуры определены в файле maxscript, вы можете вызвать showSource <functionVariable>, чтобы открыть редактор в строке кода, где функция определена. Вы сразу видите документацию.

Однако это не помогает с функциями, определенными в C++, или другим кодом, который не принадлежит вам.

person Zhalktis    schedule 17.12.2019
comment
Эта команда showSource еще лучше, она открывает исходный файл и переходит к определению функции. Полностью решает мою проблему. Большое спасибо! - person 3dmodels; 18.12.2019