我正在尝试编写一个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);
}
}
答案 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