替换JSFL中的填充颜色

时间:2014-06-05 18:27:56

标签: javascript flash adobe jsfl

我正在尝试编写一个JSFL脚本,它将替换所选帧上与给定颜色匹配的所有轮廓填充。

我的问题是,如果我按照JSFL文档的指定调用shape.beginEdit()和shape.endEdit(),那么只要我访问轮廓上的fill属性(甚至只读访问),脚本就会崩溃。错误消息是"发生以下JavaScript错误:"没有其他信息。

如果省略shape.begin / endEdit()调用,脚本不会崩溃但颜色实际上没有更新。

我尝试在Flash CS5.5,CS6和CC中运行此脚本,结果相同。

如果有人能指出我错过的东西,我将不胜感激。

剧本:

var replaceFills = {
    '#ff0000': '#33cccc',
    '#33cccc': '#ff0000',
    '#66ff00': '#00ffff',
    '#00ffff': '#66ff00',

    '#2173a6': '#ff00ff',
    '#ff00ff': '#2173a6',

    '#195480': '#ff00ff',
    '#ff00ff': '#195480',
};

function recolor(element) {
    if (element.elementType == "shape") {
        element.beginEdit();

        for (var j = 0; j < element.contours.length; j++) {
            var c = element.contours[j];
            if (c.interior && c.fill) {
                if (c.fill.style == 'solid') {
                    if (c.fill.color in replaceFills) {
                        c.fill.color = replaceFills[c.fill.color];
                    }
                }
            }
        }
        element.endEdit();
    }
}

function recolorFrame(frame) {
    var elements = frame.elements;
    for (var i = 0; i < elements.length; i++)
        recolor(elements[i]);
}


var curSelected = fl.getDocumentDOM().getTimeline().getSelectedFrames();

for (var i = 0; i < curSelected.length; i += 3) {
    var layerIndex = curSelected[i];
    var startIndex = curSelected[i + 1];
    var endIndex = curSelected[i + 2];

    var layer = fl.getDocumentDOM().getTimeline().layers[layerIndex];

    for (var j = startIndex; j < endIndex; j++) {
        var frame = layer.frames[j];
        if (j == frame.startFrame)
            recolorFrame(frame);
    }
}

3 个答案:

答案 0 :(得分:2)

编辑你的功能就像这样:

function recolor(element) {
if (element.elementType == "shape") {
//del   element.beginEdit();

    for (var j = 0; j < element.contours.length; j++) {
        var c = element.contours[j];
        if (c.interior && c.fill) {
            if (c.fill.style == 'solid') {
                if (c.fill.color in replaceFills) {
//del                   c.fill.color = replaceFills[c.fill.color];
//add this
                        var fill = element.getCustomFill();
                        fill.style = "solid";
                        fill.color = replaceFills[c.fill.color];
                        element.setCustomFill(fill);
//end
                    }
                }
            }
        }
//del   element.endEdit();
     }
  }

答案 1 :(得分:0)

FWIW,还可以使用位于Find & Replace下的Edit面板替换颜色。

答案 2 :(得分:0)

迈克的答案的确改变了颜色,但不幸的是,如果形状是由具有不同颜色的多个轮廓组成的,则它们都会被改变。

取而代之的是获取填充,更改颜色以及将填充重新分配到轮廓上。

General:
-Run with highest privileges
Trigger:
-Program/Script: powershell
-Arguments: -noprofile -executionpolicy bypass -file F:\ps\WatchFiles.ps1