2016-03-21 2 views
0

J'ai un problème avec FileIn() dans un attribut personnalisé. Chaque fois que j'exécute mon script pour la première fois, j'obtiens une classe ou une fonction indéfinie. Aussi, je reçois toujours l'erreur quand je ferme 3ds max et rouvre la scène avec mon attribut personnalisé sur une boîte.Fichier MaxIncript dans un attribut personnalisé

J'espère que quelqu'un peut m'aider à comprendre ce que je fais de mal dans mon code. J'espère vraiment qu'il y a une solution parce que FileIn() est très utile pour moi pour réutiliser et organiser mon code. Merci d'avance pour l'aide :)

Voici mon code:

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

Quel est le message d'erreur réel? Est-ce qu'il dit quelle ligne/article est indéfini? Il n'y a rien de techniquement faux avec ce que vous faites, exécuter FileIn dans une boucle comme celle-ci est inhabituel mais pas impossible. – FrozenKiwi

+0

Les problèmes proviennent de cette ligne: UICaptionChange Général 2 "Test" La première fois que j'évalue, j'obtiens une fonction/classe non déficiente mais la deuxième fois que j'évalue mon script cela fonctionne. – teckcloud

+0

Ceci est le message exact dans le port d'écoute Maxscript: - Une erreur s'est produite dans General.open(); nom de fichier: ; position: 2354; ligne: 58 - Cadre: - UICaptionChange: undefined >> Exception de gestionnaire de déploiement MAXScript: - Erreur de type: appel nécessite fonction ou classe, a obtenu: undefined << – teckcloud

Répondre

0

La fonction UICaptionChange n'est pas définie dans votre fichier MaxScript, donc je suppose que son dans vos fichiers référencés? Je ne suis pas sûr à 100% de cela, mais je suppose que parce que maxscript a déjà analysé la fonction "open" avant de l'exécuter, il aura analysé le functino avant d'exécuter la commande FileIn qui définit les nouvelles fonctions . En d'autres termes, vous incluez les fonctions trop tard pour les trouver.

Je suggère de déplacer vos appels addFunction à la portée globale uniquement sur les entités générales. C'est très déroutant de trouver du code qui s'écrit au milieu de l'exécution. De plus, vous allez ré-analyser ces fichiers inclus chaque fois que vous créez/ouvrez les attributs, vous payez donc le coût de la recompilation à chaque fois.

Il suffit de déplacer le code pour inclure les fichiers à la tête de votre dossier (dans le contexte global), il exécute uniquement lorsque le script est évalué, et vous devriez être bien

+0

Lorsque vous parlez de portée globale. Voulez-vous dire de mettre la fonction addFunction avant les attributs newAttrib globaux = posAttribs? Si c'est ce que vous voulez dire, alors comment le détenteur d'attribut se souviendra-t-il de la fonction le type suivant J'ouvre la scène 3ds max où l'attribut personnalisé est utilisé? – teckcloud

+0

Normalement, je collerais la définition dans le dossier scripts/startups – FrozenKiwi

0

Désolé pour ma réponse tardive, je n'étais pas de maison pour quelques jours. Je pense que j'ai fait ce que tu as dit.

J'ai créé un fichier startup.ms situé dans le dossier des scripts 3ds max. A l'intérieur de ce fichier, j'ai ajouté ma fonction addFunction, puis l'ai appelée righe après en ajoutant ally mes autres fonctions qui sont séparées par un fichier maxscript. C'est comme ajouter une librairie de fonction. En ce moment, d'après ce que j'ai vu, cela semble être un truc. Merci à l'aide. Je l'apprecie vraiment :)