AEJoy —— 表达式之显示当前层的源名称【JS】

189 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

效果图

098.gif

想法

在某些情况下,将每个镜头的源镜头名称渲染到画面中是很有用的。如果我们可以对单层这样做(最终渲染也可以关闭),这将是很有利的。所以我们的设计目标是想出一种方法来显示当前剪辑的源名称。如果当前剪辑没有源(例如一个纯色层或文本层),我们就显示层名。如果当前没有可见层,则不希望显示任何内容。

设计

我们将使用一个文本层,并将表达式应用到 Source text 属性。我们将让表达式从上到下在层堆栈中移动,直到它找到一个当前可见的层。当然,我们希望表达式忽略它自己的文本层。3D 层会把事情搞糟(因为任意的堆叠顺序),所以我们在这个设计中不会担心它们。

表达式

txt = "";
for (i = 1; i <= thisComp.numLayers; i++) { ///< 遍历合成中的所有层
    if (i == index) continue; ///< 跳过文本层
    L = thisComp.layer(i); ///< 当前层
    if (!(L.hasVideo && L.active)) continue; ///< 如果其中没有可见内容则跳过
    
    /// @note 如果存在,则使用层的源名称
    /// 否则使用层名
    try {
        txt = L.source.name;
    } catch (err) {
        txt = L.name
    }
    break; ///< 找到则退出循环
}
txt  ///< 显示源名或层名(如果当前没有可见层则不显示)

注意 JavaScript 的 try / catch 构造的使用。这允许捕获表达式中的条件,这些条件通常会生成错误并导致表达式被禁用。构造的 catch(err) 部分是您声明在发生错误时希望发生什么的地方。在我们的例子中,如果我们试图引用一个没有源的层,它将产生一个错误。在这里,我们捕获错误,只是使用图层名称代替。

(完)