我正在寻找一个 jsfl 函数,它可以选择框架上的所有项目并删除与特定颜色匹配的所有笔画,例如 #0000ff
基本上我用铅笔工具用红色铅笔笔画做了很多笔记。但是当我完成后,我只想告诉闪光灯从屏幕上删除我所有的红色描边,并保持其他所有内容不变。有什么解决办法吗?
好问题 !
查看 JSFL 文档中的 Document 对象,我发现检索 Stroke 的唯一方法是通过令人讨厌的 document.getCustomStroke()。理想情况下,形状对象会存储描边和填充信息,但它不会:(
我尝试使用数组来控制选择:
var doc = fl.getDocumentDOM();
doc.selectAll();
var s = new Array().concat(doc.selection);
var sl = s.length;
doc.selectNone();
for(var i = 0; i < sl ; i++){
doc.selection = s[i];
stroke = doc.getCustomStroke('selection')
fl.trace(stroke.color)
}
那没有用。
然后我尝试使用选择每个对象
doc.mouseClick({x:s[i].x, y:s[i].y}, false, false);
但这并不是很有帮助,因为笔记可以采用任何形状,因此单击笔记的左上角可能会错过选择。循环遍历每个像素只是为了进行选择是行不通的。
简短的回答不是因为检索笔触颜色的唯一方法是通过文档选择。
不过有一些解决方法:
在 IDE 中,使用“查找和替换”,选择“颜色”而不是“文本”,然后将笔记颜色替换为透明的颜色。不幸的是,这不是一个很好的解决方案。它只会隐藏笔记,而不是删除它们。
(来源:sonic.net)
让从 jsfl 中获取笔记变得容易:将当前时间轴中的所有笔记放在一个图层中,并给它一个暗示性的名称,比如“_notes”,然后删除该图层。
例如
var doc = fl.getDocumentDOM();
if(!doc) alert('Pardon me! There is no document open to work with.');
fl.trace(deleteLayerByName('_notes'))
/*Returns true if the layer was found and deleted, otherwise returns false*/
function deleteLayerByName(name){
var timeline = doc.getTimeline();
var frame = timeline.currentFrame;
var layers = timeline.layers;
var layersNum = layers.length;
for(var i = 0 ; i < layersNum; i++){
if(layers[i].name == name){
timeline.deleteLayer(i)
return true;
}
}
return false;
}
希望有人可以提供一个很好的技巧来在 jsfl 中按颜色选择对象。您可以在 IDE 中做很多事情,但不能从 JSFL 中完成:(
高温高压
我最近需要处理一些旧的 FLA 文件并且不得不做类似的事情。下面的代码将在当前文档的所有图层和框架中找到所有匹配的笔画。
在 Flash CS6 中测试。
请注意,这不会将文档标记为已修改,因此您需要以某种方式修改文档才能保存。
var dom = fl.getDocumentDOM();
var timeline = dom.getTimeline();
/*
MODIFY THE KEYS IN THIS TABLE.
*/
var coloursToDelete = {
'FF0000': true,
'FFFF00': true,
};
var replacements;
var srcColour;
var layerName;
// Make sure all colours are lowercase and start with a #
for(var colour in coloursToDelete)
{
var val = coloursToDelete[colour];
delete coloursToDelete[colour];
if(colour[0] !== '#')
colour = '#' + colour;
coloursToDelete[colour.toLowerCase()] = val;
}
// Make sure to clear the selection, or the script will crash?
dom.selectNone();
fl.outputPanel.clear();
var deleteCount = 0;
// ----------------------------------------------------
// Loop through all layers
for(var layerIndex in timeline.layers)
{
var layer = timeline.layers[layerIndex];
if(!layer.visible)
continue;
// ----------------------------------------------------
// Loop through all frames of the current layer
for(var frameIndex = 0; frameIndex < timeline.frameCount; frameIndex++)
{
var frameDeleteCount = 0;
var frame = layer.frames[frameIndex];
if(!frame)
continue;
// ----------------------------------------------------
// Loop through all elements in the current frame
for(var elementIndex in frame.elements)
{
var element = frame.elements[elementIndex];
if(!element)
continue;
if(element.elementType !== 'shape')
continue;
// ----------------------------------------------------
// Check each edge in the current shape
for(var edgeIndex in element.edges)
{
var edge = element.edges[edgeIndex];
var stroke = edge.stroke;
var fill = stroke ? stroke.shapeFill : null;
if(!fill)
continue;
if(fill.color in coloursToDelete)
{
stroke.shapeFill = null;
edge.stroke = fill;
deleteCount++;
frameDeleteCount++;
}
}
}
// A quirk of deleting strokes like this is that shapes won't automatically merge like they would when deleting a stroke in the editor.
// Selecting then deselecting will force this to happen
if(frameDeleteCount > 0)
{
dom.selectAll();
dom.selectNone();
}
}
}
fl.trace('-- ' + dom.name + ': Deleted ' + (deleteCount) + ' strokes.');