2016-03-21 3 views
0

У меня есть проблемы с FileIn() внутри пользовательского атрибута. Каждый раз, когда я запускаю свой скрипт в первый раз, я получаю неопределенный класс или функцию. Также я всегда получаю ошибку, когда закрываю 3ds max и снова открываю сцену с помощью моего настраиваемого атрибута в поле.Maxscript FileIn внутри пользовательского атрибута

Я надеюсь, что кто-то может помочь мне понять, что я делаю неправильно в своем коде. Я действительно надеюсь, что есть решение, потому что FileIn() очень полезно для меня, чтобы повторно использовать и организовывать мой код. Заранее спасибо за помощь :)

Вот мой код:

Global newAttrib = attributes posAttribs 
(
fn addFunction FolderName vArray= 
(
/* 
1) Get the root position of the installed position of 3ds max 
2) Get in the script file and then in the FolderName of the function 
3) Add all the function inside the vArray in a FileIn Loop 
*/ 
for i = 1 to vArray.count do 
(
FolderPosition = ((GetDir #maxroot)+"\scripts\\" +FolderName + "\\") 
FileIn(FolderPosition + vArray[i]) 
) 
) 
parameters Param0 rollout:General 
(
pPreset0 type:#String ui:ddl_Preset0 default:"..." 
pTableHeight type:#Float ui:spn_Height default:100 
)--end Param1 
parameters Param1 rollout:TopPart 
(
pPreset1 type:#String ui:ddl_Preset1 default:"..." 
defaultArray1 type:#stringTab tabSize:1 tabSizeVariable:true 
defaultExist1 type:#boolean default:False 
)--end Param1 
parameters Param2 rollout:BottomPart 
(
pPreset2 type:#String ui:ddl_Preset2 default:"..." 
pLegEndShape type:#String ui:ddl_LegEnd default:"..." 
defaultArray2 type:#stringTab tabSize:1 tabSizeVariable:true 
defaultExist2 type:#boolean default:False 
)--end Param2 
parameters Param3 rollout:Supports 
(
pPreset3 type:#String ui:ddl_Preset3 default:"..." 
defaultArray3 type:#stringTab tabSize:1 tabSizeVariable:true 
defaultExist3 type:#boolean default:False 
)--end Param3 

Local externalFn = #("UI_CaptionChange.ms", "UI_ControlVisible.ms", "UI_MoveVisible.ms") 
Local externalMod = #("MOD_Extrude.ms", "MOD_Taper.ms", "MOD_QuadChamfer.ms", "MOD_SweepModifier.ms") 
Local TableTypes = sort(#("...", "Dining", "Workbench", "Coffee", "Round")) 
Local TopTypes = sort(#("...", "Square", "Rectangle", "Round","Oval","Triangle", "NGon", "Semi Circle", "Quarter Circle")) 
Local LegTypes = sort(#("...", "Straight", "Taper", "Cross","U","MultiEnd", "X", "Curve", "T")) 
Local LegEndTypes = sort(#("...", "Square", "Rectangular", "Circle","NGon")) 
Local SupportTypes = sort(#("...", "CopyTop", "PTP")) 
Rollout General "General" 
(
dropdownlist ddl_Preset0 "Presets:" items:TableTypes 
spinner spn_Height "Height" range:[0,1000,100] type:#float 
button btn_Random "Random All" border:True 
on General open do 
(
addFunction "Mal_Functions" externalFn --Adding all the external function 
addFunction "Mal_Modifiers" externalMod --Adding all the external modifiers 
ddl_Preset0.selection = findItem ddl_Preset0.items pPreset0 
UICaptionChange General 2 "Test" 
) 
on ddl_Preset0 selected val do 
(
pPreset0 = ddl_Preset0.selected 
) 
)--end TopPart Rollout 

Rollout TopPart "Top Part" 
(
dropdownlist ddl_Preset1 "Presets:" items:TopTypes 
spinner spn_Thickness "Height" range:[0,1000,2] type:#float 
spinner spn_Length "Length" range:[0,1000,2] type:#float 
spinner spn_Width "Width" range:[0,1000,2] type:#float 
on TopPart open do 
(
ddl_Preset1.selection = findItem ddl_Preset1.items pPreset1 
if defaultExist == False then 
(
--defaultArray = UIDefault Testing 
--defaultExist = True 
) 
) 
on ddl_Preset1 selected val do 
(
pPreset1 = ddl_Preset1.selected 
) 
)--end TopPart Rollout 
Rollout BottomPart "Bottom Part" 
(
dropdownlist ddl_Preset2 "Presets:" items:LegTypes 
dropdownlist ddl_LegEnd "Leg End Shape:" items:LegEndTypes 
on BottomPart open do 
(
ddl_Preset2.selection = findItem ddl_Preset2.items pPreset2 
ddl_LegEnd.selection = findItem ddl_LegEnd.items pLegEndShape 
) 
on ddl_Preset2 selected val do 
(
pPreset2 = ddl_Preset2.selected 
) 

on ddl_LegEnd selected val do 
(
pLegEndShape = ddl_LegEnd.selected 
) 
)--end BottomPart Rollout 
Rollout Supports "Supports" 
(
dropdownlist ddl_Preset3 "Presets:" items:SupportTypes 
on Supports open do 
(
ddl_Preset3.selection = findItem ddl_Preset3.items pPreset3 
) 
on ddl_Preset3 selected val do 
(
pPreset3 = ddl_Preset3.selected 
) 
)--end Supports Rollout 
)--end posAttribs 
modPanel.addModToSelection (EmptyModifier()) ui:on 
custAttributes.add $.modifiers[1] newAttrib --add the attribute in the first modifier 
+0

Какое сообщение об ошибке? Говорит ли он, какая строка/элемент не определена? Нет ничего технически неправильного в том, что вы делаете, запуск FileIn в цикле, как это, необычно, но не невозможно. – FrozenKiwi

+0

Проблемы возникают из этой строки: UICaptionChange General 2 "Test" В первый раз, когда я оцениваю, я получаю undefiend function/class, но во второй раз, когда я оцениваю свой скрипт, он работает. – teckcloud

+0

Это точное сообщение в приемнике Maxscript: - Произошла ошибка в General.open(); имя файла: ; позиция: 2354; line: 58 - Рамка: - UICaptionИзменить: undefined >> Обработчик переноса MAXScript Исключение: - Ошибка типа: Call требует функции или класса, получил: undefined << – teckcloud

ответ

0

Функция UICaptionChange не определена в файле MAXScript, так что я думаю, его в ваших ссылочных файлах?

Я не уверен в этом на 100%, но я предполагаю, что поскольку maxscript уже разбирал «открытую» функцию перед ее исполнением, он проанализировал функционал, прежде чем он запустит команду FileIn, которая определяет новые функции , Другими словами, вы включаете в себя слишком запоздалые функции, чтобы их можно было найти.

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

Просто перенесите код, чтобы включить файлы в голову вашего файла (в глобальном масштабе), то он будет выполняться только тогда, когда сценарий оценивается, и вы должны быть хорошо

+0

Когда вы говорите о глобальной области видимости. Вы хотите добавить функцию addFunction перед глобальными атрибутами newAttrib = posAttribs? Если это то, что вы имеете в виду, то как владелец атрибута помнит функцию следующего типа, я открываю сцену 3ds max, где используется пользовательский атрибут? – teckcloud

+0

Обычно я придерживался определения в папке сценариев/стартапов – FrozenKiwi

0

Извините за мой поздний ответ я не был «Домой на пару дней. Думаю, я сделал то, что вы сказали.

Я создал файл startup.ms. Taht находится в папке сценариев 3ds max. Внутри этого файла я добавил свой addFunction, а затем назвал его righe после добавления других моих функций, которые разделяют файл maxscript. Это похоже на добавление функции librairie. Прямо сейчас, из того, что я видел, это похоже на трюк. Еще раз спасибо за помощь. Я действительно его утомляю :)

Смежные вопросы