JSFL:删除所有符合特定颜色的笔画?

时间:2010-07-02 21:47:36

标签: flash jsfl

我正在寻找一个jsfl函数,它可以选择一个帧上的所有项目并删除所有与特定颜色匹配的笔划,例如#0000ff

基本上我使用铅笔工具使用红色铅笔笔记做了很多笔记。但是当我完成时,我只想告诉flash从屏幕上删除我所有的红色罢工,并保留其他所有内容。任何解决方案吗?

2 个答案:

答案 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);

但这不是很有用,因为音符可以采取任何形状, 所以在音符的左上角点击可能是错过了 选择。 循环通过每个像素只是为了得到一个选择是行不通的。

简短回答不是因为检索笔触颜色的唯一方法 是通过文件选择。

但是有一些解决方法:

  1. 在IDE中,使用“查找和替换”,选择“颜色”而不是“文本” 并用透明的东西替换你的音符颜色。不幸 这不是一个解决方案。它只会隐藏笔记,而不是删除它们。 flash find and replace http://www.sonic.net/mnitepub/pccafe/reviews/macromedia_flash_mx2004/find_and_replace.gif

  2. 从jsfl轻松获取笔记:将所有笔记放在当前笔记中 时间轴在一个层中,并给它一个暗示名称,说'_notes',然后只是 删除该图层。

  3. 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.');