如何使用extendscript检查属性值是否为只读?

8

我正在编写一个针对 After Effects 的脚本,可以从图层中收集所有属性并将它们写入 XML 文件。但当我从 XML 中检索值时,某些值是只读的,这时工具包会抛出错误。

有没有办法像 File 对象的 readonly 属性一样进行检查呢?比如:layer.property().(readonly||readOnly)

如果没有,有人能告诉我应该采取哪种方法才能朝正确的方向前进吗?


我有点困惑,因为如果您已经成功将值写入XML文件中,那么它应该只是一个纯文本文件,您应该能够读取其中的任何属性。如果您正在检索属性,则只需要读取它们即可。 - ariestav
@ariestav:OP没有提到,但似乎他想让他们开始阅读。 - Jongware
糟糕。我本来想建议使用对象反射及其“属性”数组“ReflectionInfo”(它承诺告诉我它是否是“未知、只读、读写、仅创建、方法或参数”之一),但在InDesign上测试时,除了reflect之外的所有内容似乎都被标记为读/写 - 即使在对象属性中明确标记为只读的属性! - Jongware
3个回答

4

考虑到项目中的第一个元素是带有固体模块的 comp,该方法可以实现,但可能不太优雅。您需要能够按顺序构建每个字符串,但也许您已经设置好了这样做的环境:

var r;
r = testForReadability("app.project.items[1].layers[1].enabled");
alert(r);
r = testForReadability("app.project.items[1].layers[1].width");//a solid's width is NOT writable
alert(r);

function testForReadability(thisProperty) {
    var x;
    try {
        x = eval(thisProperty);
        eval(thisProperty + " = x;");
        return true;
    } catch(e) {
        return false;
    }
}

然而,这里有一个小问题,在设置"启用脚本调试器"的选项后,"false"就不能起作用了。因此,您需要通过一些变通方法来检查此设置并临时重置它(请参见http://aenhancers.com/viewtopic.php?f=8&t=189&p=554&hilit=debugger#p554)。


那正是我在寻找的。我会在假期回来后检查它。谢谢! - Miguel
请注意,在某些情况下,您的代码可能会出现问题。例如:当文本层有两行并且具有两种不同的对齐方式时,"app.project.items[1].layers[1].property('ADBE Text Properties').property('Source Text').value.justification" 代码将无法正常工作。 - Ziki
对这段代码的尝试编辑将"= x;"更改为"=" + x + ";",但这是不正确的。x应该被解析为x(脚本将x视为变量并在eval中正确解析它),而不是解析为其值,连接并进行eval。 - CRGreen
顺便提一下,关于aenhancers链接的问题:自CS6以来,AE的哪些首选项部分名称和键已经更改了几个版本。您可能需要尝试这些部分名称:“Main Pref Section”,“Main Pref Section v2”,“Extendscript”;以及这些键:“Pref_JAVASCRIPT_DEBUGGER”,“EnableExpressionsDebuggingAtYourOwnRisk”。后一个键只能与“Extendscript”部分一起使用。 - CRGreen
它运行良好。为了我的目的,我简化了它,而不使用eval try{ thisProperty = xmlProperty; return true; } catch(e) { return false; } 谢谢! - Miguel
顺便说一下,js调试器的解决方法似乎受到CC最新版本的进一步复杂化的影响。我通过脚本更改设置使AE暂时无法启动。最好(或者肯定是最安全的)只是警告用户并让他们更改设置。 - CRGreen

2
我不认为你可以从ESTK中获取这些信息。
您可以使用“After Effects Scripting Guide Book”来检查并创建一个包含所有“readonly”属性的对象,然后检查该对象是否包含此属性。
以下是脚本指南的链接: After-Effects-CS6-Scripting-Guide

我考虑过这种方法,但似乎非常繁琐。我将把它作为最后的选择。谢谢! - Miguel

1

尝试覆盖它,然后将其恢复,就像这样:

function isReadOnly(value, container) {
  var tmp = container[value];
  var tmp2;
  var coolString = "cool";
  try {
    container[value] = "cool";
  } catch (e) {
    return true
  }
  tmp2 = container[value];
  container[value] = tmp;
  return coolString != tmp2;
}

// true, navigator.platform is read only
console.log(isReadOnly("platform", navigator))

// false, window.parent is not read only
console.log(isReadOnly("parent", window))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接