К сожалению скрипт из поста #7 работает некорректно. Причины две. (1) Перебираются только материалы
сцены (т.е. материалы, которые уже назначены объектам), но игнорируются неназначенные материалы в редакторе материалов и библиотеках материалов. Но это мелочь. (2) Скриптом будут изменены
только материалы, имеющие
первичный тип VRayMtl. Материалы типа VRayMtl, которые выступают в роли
подматериалов, изменены не будут. Например подматериалы в материале типа Multi/Sub-Object или VRayOverrideMtl. Что есть совсем нехорошо.
Я попробовал накидать усовершенствованную версию скрипта, лишённого этих недостатков.
Код:
mat_ary = #()
fn searchMat a_mat a_mary = (
if classOf a_mat == VRayMtl then (
append a_mary a_mat
)
else (
if ((isKindOf a_mat material) or (isKindOf a_mat ArrayParameter) or (isKindOf a_mat Array)) do (
props = getPropNames a_mat
for p in props do (
prop_value = getProperty a_mat p
case of (
(isKindOf prop_value material): searchMat prop_value a_mary
((isKindOf prop_value ArrayParameter) or (isKindOf prop_value Array)): for par in prop_value do (searchMat par a_mary)
)
)
)
)
)
for mat in sceneMaterials do (
searchMat mat mat_ary
)
for mat in meditMaterials do (
searchMat mat mat_ary
)
for mat in currentMaterialLibrary do (
searchMat mat mat_ary
)
for mat in mat_ary do (
format "\"%\"(%)\n" mat.name ((classOf mat) as string)
--
-- сюда надо добавить осмысленное действие, выполняемое для каждого материала mat, например
-- mat.reflection_subdivs = 20
--
)
Не могу гарантировать, что скрипт будет корректно обрабатывать абсолютно все случаи - на тщательное тестирование просто нет времени, но, чисто идейно, должен работать
Скрипт собирает в массив mat_ary все найденные материалы типа VRayMtl (возможно наличие нескольких инстансов одного материала!) и в последнем цикле
for обрабатывает найденные материалы. Сейчас скрипт просто выводит в окно Listener'а для каждого найденного материала его имя и класс.
Материалы ищутся среди материалов сцены (sceneMaterials), материалов в редакторе материалов (meditMaterials) и в текущей библиотеке материалов (currentMaterialLibrary). Если в каком-то из этих мест искать не надо, то можно просто закомментировать нужный цикл.