2016-03-21 6 views
0

Ich habe ein Problem mit FileIn() in einem benutzerdefinierten Attribut. Jedes Mal, wenn ich mein Skript zum ersten Mal ausführe, erhalte ich eine undefinierte Klasse oder Funktion. Auch bekomme ich immer den Fehler, wenn ich 3ds Max schließe und die Szene mit meinem benutzerdefinierten Attribut auf einer Box wieder öffne.Maxscript FileIn in einem benutzerdefinierten Attribut

Ich hoffe, jemand kann mir helfen zu verstehen, was ich in meinem Code falsch mache. Ich hoffe wirklich, dass es eine Lösung gibt, weil FileIn() sehr nützlich ist, um meinen Code wiederzuverwenden und zu organisieren. Vielen Dank im Voraus für die Hilfe :)

Hier ist mein 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

Was ist die eigentliche Fehlermeldung? Gibt es an, welche Zeile/Element nicht definiert ist? Es gibt nichts technisch falsches mit dem, was Sie tun, das Ausführen von FileIn in einer Schleife wie dieser ist ungewöhnlich, aber nicht unmöglich. – FrozenKiwi

+0

Die Probleme kommen von dieser Zeile: UICaptionChange Allgemein 2 "Test" Das erste Mal, wenn ich auswerte, bekomme ich undefiend Funktion/Klasse, aber das zweite Mal, wenn ich mein Skript auswerte, funktioniert es. – teckcloud

+0

Das ist die genaue Nachricht in dem Maxscript Listener: - Fehler trat in General.open() auf; Dateiname: ; Position: 2354; Zeile: 58 - Frame: - UICaptionChange: undefined >> MAXScript Rollout Handler Ausnahme: - Typ Fehler: Aufruf benötigt Funktion oder Klasse, hat: undefined << – teckcloud

Antwort

0

Die Funktion UICaptionChange ist in Ihrer MaxScript-Datei definiert, also würde ich sein in Ihren referenzierten Dateien erraten?

Ich bin mir nicht 100% sicher, aber meine Vermutung ist, dass, weil Maxscript bereits die "open" -Funktion vor der Ausführung geparst hat, das functino geparst hat, bevor es den FileIn-Befehl ausführt, der die neuen Funktionen definiert . Mit anderen Worten, Ihre Funktionen sind zu spät, um sie zu finden.

Ich würde vorschlagen, Ihre addFunction Aufrufe auf den globalen Bereich nur auf allgemeine Prinzipien zu verschieben. Es ist sehr verwirrend, Code zu finden, der sich mitten in der Ausführung schreibt. Außerdem werden Sie diese enthaltenen Dateien jedes Mal neu analysieren, wenn Sie die Attribute erstellen/öffnen, sodass Sie jedes Mal die Kosten für die Neukompilierung tragen müssen.

einfach den Code bewegen, um die Dateien auf den Kopf der Datei enthält (in globalem Bereich), wird es nur ausgeführt werden, wenn das Skript ausgewertet wird, und Sie sollen für meine späte Antwort, die ich bin nicht in Ordnung

+0

Wenn Sie über globale Reichweite sprechen. Wollen Sie die Funktion addFunction vor den Global newAttrib = Attribute posAttribs setzen? Wenn das ist, was Sie meinen, dann, wie wird der Attributhalter sich erinnern, die Funktion der nächste Typ Ich öffne die 3ds Max-Szene, wo das benutzerdefinierte Attribut verwendet wird? – teckcloud

+0

Normalerweise würde ich die Definition in den Ordner scripts/startups stecken – FrozenKiwi

0

Entschuldigung sein Nach Hause für ein paar Tage. Ich glaube, ich habe getan, was du gesagt hast.

Ich habe eine startup.ms-Datei erstellt, die im Ordner 3ds max scripts gespeichert ist. Innerhalb dieser Datei fügte ich meine addFunction hinzu und nannte sie danach righe, indem ich ally meine anderen Funktionen addierte, die die getrennte maxscript Datei sind. Es ist, als würde man eine Funktionsbibliothek hinzufügen. Gerade jetzt von dem, was ich gesehen habe, scheint es zum Trick. Danke nochmal mit der Hilfe. Ich schätze es wirklich :)

Verwandte Themen