删除当前活动合成中的错误表达式。
复制下面代码到文本txt中,更改扩展名为 DelErrorExps.jsx
(function () {
app.beginUndoGroup("DelErrorExps");
// 为了确保不会错误地处理项目面板中的一个项目,暂时将查看器设为活动状态。
app.activeViewer.setActive();
var mAi = app.project.activeItem;
var mLyrs = mAi.layers;
var mAllValProps = [];
//检查是否隐藏的常规表达式。
var mRegExpHdn = new RegExp("hidden");
// 从所有的图层中收集带有"value"属性。
for (var i = 1; i <= mLyrs.length; i++) {
mAllValProps = mAllValProps.concat(mGetValProps(mLyrs[i]));
}
//将其中具有可应用表达式且错误消息不为空(即存在错误)的表达式设置为""(空字符串)。
for (var i = 0; i < mAllValProps.length; i++) {
var mProp = mAllValProps[i];
if (mProp.canSetExpression && mProp.expressionError !== "" && !(mIsHidden(mProp, mRegExpHdn))) {
mProp.expression = "";
}
}
app.endUndoGroup();
//--------------------------------------------------
//--------------------------------------------------
// 从图层中收集具有"value"属性的属性。
function mGetValProps(aLyr) {
var mRstProps = [];
mFunc(aLyr);
function mFunc(aProp) {
if (aProp.propertyType === PropertyType.PROPERTY) {
mRstProps.push(aProp);
} else {
for (var i = 1; i <= aProp.numProperties; i++) {
mFunc(aProp(i));
}
}
}
return mRstProps;
}
//检查属性是否为隐藏状态。请注意关键帧被全部选择的情况。
function mIsHidden(aProp, aRegExpHdn) {
try {
aProp.selected = aProp.selected;
return false;
} catch (e) {
return aRegExpHdn.test(e.message);
}
}
})();
用法
当执行这段 JSX 代码时,它将从当前活动合成中提取所有图层的所有属性。然后删除其中存在表达式错误的属性的表达式。
- 没有用户界面(UI)。
- 不适用于整个项目。如果要应用于整个项目,这可能会有些麻烦。您需要单击错误消息下方的放大镜图标,在打开的错误合成中逐个执行此 JSX。
- 如果存在"存在错误但未显示的属性",它们将不会被处理。例如,如果您将图层先设置为3D图层,并对"方向"属性应用表达式,然后出现表达式错误,但将3D开关重新设置为2D,以便消除错误,这种情况将不会被处理。这也可能在图层样式中发生。
解释
目前,您正在从合成中收集所有图层,并使用递归函数收集它们的所有属性。然后,您将对这些属性中的表达式错误不为空的属性(即存在错误的属性)的表达式进行清空处理。第一个空字符串("")用于检查是否存在错误消息,第二个空字符串("")是用于清空表达式的空字符串,请注意它们是不同的。
我也尝试创建了适用于整个项目的版本,但似乎检查表达式错误是否为空字符串(即是否存在错误)的功能在未打开的合成中的行为似乎是不确定的。我认为这与打开的合成中没有在查看器中显示错误警告有关,即使合成中存在具有错误表达式的合成,如果未打开合成,可能不会在查看器中显示错误警告。
另外,关于hidden属性,例如2D图层的"方向"属性或未应用的图层样式等,这些都是"实际上图层已经具有但被隐藏的属性",除非将其显示出来,否则脚本无法处理它们。严格来说,虽然可以处理它们,但无法更改其值等。由于缺乏能够检查hidden属性的方法,您正在使用以下判断函数来处理此类情况。如果出现错误并且错误消息中包含"hidden",则返回true,否则返回false。对于这些函数返回true的属性,您将省略处理。