问题描述
我今天早些时候使用JSon发布了与此类似的内容,但是放弃了,我改用了XML。有人可以告诉我我在做什么错吗?我有一个XML文件,正在通过After Effects中的脚本进行解析,但不确定如何访问XML元素。
我的XML文件是:
<?xml version="1.0" encoding="utf-8"?>
<root>
<f>
<accelX>0.4682</accelX>
<accelY>-0.0352</accelY>
<accelZ>-0.9247</accelZ>
<gyroX>0.0555</gyroX>
<gyroY>0.004</gyroY>
<gyroZ>-0.0684</gyroZ>
</f>
<f>
<accelX>-0.4682</accelX>
<accelY>-0.0219</accelY>
<accelZ>-0.9186</accelZ>
<gyroX>0.0049</gyroX>
<gyroY>0.0851</gyroY>
<gyroZ>-0.046</gyroZ>
</f>
</root>
我的jsx文件是这样的:
var file = new File;
var check = 0;
var mainWindow = new Window("palette","File Reader",undefined);
mainWindow.orientatizzaaq1on = "column";
var groupOne = mainWindow.add("group",undefined,"groupOne");
groupOne.orientation = "row";
var fileLocBox = groupOne.add("edittext","Selected File Location");
fileLocBox.size = [150,20];
var getFileButton = groupOne.add("button","File...");
getFileButton.helpTip = "Select a .json file to change the comp";
var groupTwo = mainWindow.add("group","groupTwo");
groupTwo.orientation = "row";
var applyButton = groupTwo.add("button","Apply");
mainWindow.center();
mainWindow.show();
getFileButton.onClick = function() {
file = file.openDlg("Open a file","Acceptable Files:*.xml");
fileLocBox.text = file.fsName;
check = 1;
}
applyButton.onClick = function() {
if(check == 0) {
alert("Please select a file");
return false;
} else {
//app.beginUndoGroup("Comp Changes");
var fileExtension = fileLocBox.text;
var fileData;
if(fileExtension.substring(fileExtension.length-4,fileExtension.length) == "json") {
fileData = readJson();
} else {
switch(fileExtension.substring(fileExtension.length-3,fileExtension.length)) {
case "txt":
//fileData = readTxt();
break;
case "xml":
fileData = readxml();
break;
}
}
changeComp(fileData);
}
alert("done");
}
function readxml() {
file.open("r");
var xmlString = file.read();
var myXml = new XML(xmlString);
file.close();
return myXml;
}
function changeComp(data) {
var nullz = app.project.activeItem.layers.addNull();
nullz.threeDLayer = true;
nullz.name = "parent to me";
for (i = 0; i < 20; i++) {
var temp = data.f[0].accelX;
var t =i/25;
nullz.xRotation.setValueAtTime(t,temp);
}
}
这条线在末端附近不起作用:
var temp = data.f[0].accelX;
我写错了吗? After Effects将创建一个值为“ 0”的关键帧,但不会完成for ...循环,也不会完成脚本。 我是否错误地访问了这些元素?
解决方法
我认为核心问题是data.f[0].accelX
的值是字符串而不是数字(例如,"4.6"
而不是4.6
),所以setValueAtTime
最终以非数字值结尾,该值不起作用 1 。
解决方案是在其上使用parseFloat
:
var temp = parseFloat(data.f[0].accelX);
有了这个,再加上laayers
中的错字,我就能使它起作用。我认为。我不知道该怎么做,但是最后我得到了一个新的null层,该层在x上有20个旋转关键帧,感觉像是进步。
我认为育儿和命名方面可能仍然存在一些问题,但是我认为以上内容会让您陷入困境,并遇到下一个问题。
干杯。
1 我认为它可能会使脚本崩溃并在某处发出错误消息,但我真的不记得AE脚本的工作原理,并且(显然)我没有安装ESTK,所以我可以打开脚本编辑器。