【脚本示例】冻结属性 表达式法

使用场景:

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();
  })();

 

给TA充电
共{{data.count}}人
人已充电
AE开发脚本开发

【脚本示例】开关选择图层所有属性的表达式

2021-9-22 15:51:50

AE开发脚本开发

【脚本示例】获取实时属性值

2021-9-22 18:35:25

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
搜索