使用场景:
K了参数的关键帧动画,希望关键帧临时不生效,但又不想删掉关键帧
/**
* Freezes (or unfreezes) selected properties
* 冻结/取消冻结所选属性 不选择则冻结当前图层的所有属性
*
* @author Zack Lovatt <zack@zacklovatt.com>
* @version 0.2.0
*/
(function freezeSelectedProperties() {
var frozenText = "// FROZEN";
function freezeProp(property) {
if (!property.canSetExpression) {
return;
}
var expression = property.expression;
if (expression === "") {
try {
property.expression = generateExpression(property);
} catch (e) {
throw new Error(
[
"当前属性“ " + property.name + " 不支持!",
"请截图并联系zack@zacklovatt.com",
e
].join("\n")
);
}
} else {
if (expression.indexOf(frozenText) > -1) {
property.expression = "";
} else {
// prop has expression; skip!
}
}
}
/**
* Freezes a given property
* 冻结给出的属性
*
* @param {Property | Layer | PropertyGroup} property Property to freeze
*/
function freeze(property) {
if (skipProperty(property)) {
return;
}
if (property instanceof Property) {
freezeProp(property);
} else if (
property instanceof PropertyGroup ||
property.matchName.indexOf("Layer") > -1
) {
for (var ii = 1; ii <= property.numProperties; ii++) {
var prop = property.property(ii);
freeze(prop);
}
}
}
/**
* Check whether to skip a given property
* 检查需要跳过的属性
*
* @param {Property} property Property to check
* @returns {boolean} Whether to skip this prop
*/
function skipProperty(property) {
var depth = property.propertyDepth;
if (depth > 1) {
var layer = property.propertyGroup(depth);
var rootGroup = property.propertyGroup(depth - 1);
switch (rootGroup.matchName) {
// skip any layer style data if not present
// 如果不存在,则跳过图层样式数据
case "ADBE Layer Styles":
if (!layer.layerStyle.canSetEnabled) {
return true;
}
// Handle style groups we can't see
// 处理不可见样式组
if (property instanceof PropertyGroup && !property.canSetEnabled) {
return true;
}
break;
// 2d layer? Skip Geometry and Materials groups
// 二维层? 跳过几何和材料组
case "ADBE Plane Options Group":
case "ADBE Material Options Group":
case "ADBE Extrsn Options Group":
if (!layer.threeDLayer) {
return true;
}
break;
// Check audio
// 检查音频
case "ADBE Audio Group":
if (!layer.hasAudio) {
return true;
}
break;
default:
break;
}
}
return false;
}
/**
* Generates freeze expression based on property type
* 生成冻结帧表达式
*
* @param {Property} property Property to generate expr for
* @returns {string} Freeze expression
*/
function generateExpression(property) {
var expression = [frozenText, "posterizeTime(0);"];
switch (property.propertyValueType) {
case PropertyValueType.ThreeD_SPATIAL:
case PropertyValueType.ThreeD:
case PropertyValueType.TwoD_SPATIAL:
case PropertyValueType.TwoD:
case PropertyValueType.COLOR:
expression.push("[" + property.value.toString() + "];");
break;
case PropertyValueType.NO_VALUE:
case PropertyValueType.CUSTOM_VALUE:
case PropertyValueType.SHAPE:
case PropertyValueType.TEXT_DOCUMENT:
var compTime = property.propertyGroup(property.propertyDepth).time;
expression.push("valueAtTime(" + compTime + ");");
break;
case PropertyValueType.OneD:
expression.push(property.value.toString() + ";");
break;
}
return expression.join("\n");
}
/**
* Gets selected properties, else all comp layers
* 获取选择的属性,不然则是
*
* @returns {Property|PropertyGroup[]} Items to freeze
*/
function getTarget(comp) {
var props = comp.selectedProperties;
if (props.length > 0) {
return props;
}
return comp.selectedLayers;
}
app.beginUndoGroup("Freeze Selected Properties");
var comp = app.project.activeItem;
if (!(comp && comp instanceof CompItem)) {
alert("Open a comp!");
return;
}
var props = getTarget(comp);
try {
for (var ii = 0, il = props.length; ii < il; ii++) {
var prop = props[ii];
freeze(prop);
}
} catch (e) {
alert(e);
}
app.endUndoGroup();
})();