0

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

基本上我用铅笔工具用红色铅笔笔画做了很多笔记。但是当我完成后,我只想告诉闪光灯从屏幕上删除我所有的红色描边,并保持其他所有内容不变。有什么解决办法吗?

4

2 回答 2

1

好问题 !

查看 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);

但这并不是很有帮助,因为笔记可以采用任何形状,因此单击笔记的左上角可能会错过选择。循环遍历每个像素只是为了进行选择是行不通的。

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

不过有一些解决方法:

  1. 在 IDE 中,使用“查找和替换”,选择“颜色”而不是“文本”,然后将笔记颜色替换为透明的颜色。不幸的是,这不是一个很好的解决方案。它只会隐藏笔记,而不是删除它们。 (来源:sonic.net闪存查找和替换

  2. 让从 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 中完成:(

高温高压

于 2010-07-03T15:44:43.017 回答
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.');
于 2020-06-23T12:11:17.400 回答