我正在寻找一个jsfl函数,它可以选择一个帧上的所有项目并删除所有与特定颜色匹配的笔划,例如#0000ff
基本上我使用铅笔工具使用红色铅笔笔记做了很多笔记。但是当我完成时,我只想告诉flash从屏幕上删除我所有的红色罢工,并保留其他所有内容。任何解决方案吗?
答案 0 :(得分:1)
好问题!
查看JSFL文档中的Document对象,我看到检索Stroke的唯一方法是通过document.getCustomStroke()这很烦人。理想情况下,Shape对象会存储Stroke和Fill信息,但它不会:(
我尝试使用数组来控制选择:
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中,使用“查找和替换”,选择“颜色”而不是“文本” 并用透明的东西替换你的音符颜色。不幸 这不是一个解决方案。它只会隐藏笔记,而不是删除它们。 flash find and replace http://www.sonic.net/mnitepub/pccafe/reviews/macromedia_flash_mx2004/find_and_replace.gif
从jsfl轻松获取笔记:将所有笔记放在当前笔记中 时间轴在一个层中,并给它一个暗示名称,说'_notes',然后只是 删除该图层。
e.g。
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中执行很多操作,但can't do them from JSFL :(
HTH
答案 1 :(得分:0)
我最近需要处理一些旧的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.');