检查Adobe Illustrator中的锁定/隐藏图层

时间:2016-11-10 17:26:15

标签: javascript adobe-illustrator

我正在使用Adobe Illustrator(AI)中的脚本,我遇到了一个我无法理解的问题。这可能是由于AI工作的基本方式,但我想知道是否有办法解决这个问题。好的,我的问题是:

如何在未直接锁定时检查AI中的子图层是否被锁定/隐藏(当子图层继承状态时,最顶层图层被锁定/隐藏)。

我目前有一个脚本可以执行一个过程(循环遍历图层),只要图层不是锁定/隐藏就可以。问题是当顶层(父层)设置为锁定或隐藏时,其所有子层/对象都继承该特征(锁定或隐藏)。我对我的脚本遇到的问题是这些锁定/隐藏的子图层被分类为可见和未锁定(或可见未定义)。还有另一种方法可以确定吗?

脚本:

// JavaScript Document
if (app.documents.length > 0) {
    var docRef = app.activeDocument;
    var docLayers = docRef.layers;
    var searchText = "";
    var replaceText = "";
    var found = false;

    function recurseLayers(currLayers) {
        var length = currLayers.length;
        var currentLayer = null;
        var searchtext = searchText;
        var replacetext = replaceText;

        try {
            for (var i = length; i--;) {
                currentLayer = currLayers[i];

                replaceName(currentLayer, searchText, replaceText);

                if (currentLayer.layers) {
                    recurseLayers(currentLayer.layers);
                }
            }
        } catch (e) {
            logger (e);
        }
    }

    function replaceName(objArray, searchText, replaceText) {
        try {
            var visible = objArray.visible;
            var locked = objArray.locked;
            var typeName = objArray.typename;
            if (visible && !locked) {
                //var searchtext = "/\s*" + searchText + "\s*\d*/";
                objArray.name = objArray.name.replace(searchText, replaceText);
            }
        } catch (e) {
            logger(e);
        }
    }


    startGUI();

    function startGUI() {

        var win = new Window("dialog", "Replace Layer name", undefined);

        win.orientation = "column";
        win.alignChildren = ["fill", "fill"];

        // Search
        var searchGrp = win.add("panel", undefined, "Search and Replace");
        searchGrp.orientation = "column";
        searchGrp.alignChildren = ["fill", "fill"];

        var titleMsgS = searchGrp.add("statictext", undefined, "Layer name to search:");
        var txt_searchText = searchGrp.add("edittext { characters: 1, justify: 'center', active: true }");

        txt_searchText.helpTip = "Input layer name to replace";

        var titleMsgR = searchGrp.add("statictext", undefined, "Layer name to replace with:");
        var txt_replaceText = searchGrp.add("edittext { characters: 1, justify: 'center', active: true }");
        txt_replaceText.helpTip = "Input layer name to replace with";

        // Set first text box to active
        txt_searchText.active = true;

        win.addEventListener ("keydown", function(kd) {enter(kd) });

        // Replace button
        var replaceBtn = searchGrp.add("button", undefined, "Replace");
        replaceBtn.helpTip = "Replace layer name";
        replaceBtn.onClick = function() {
            searchText = txt_searchText.text;
            replaceText = txt_replaceText.text;

            recurseLayers(docLayers);
            app.redraw();
        }

        function enter(k) {
            if (k.keyName == "Enter") {
                recurseLayers(searchText.text, replaceText.text);
                app.redraw();
            }
        }

        // Close button
        var quitBtn = win.add("button", undefined, "Close");
        quitBtn.helpTip = "Press Esc to Close";

        // Event listener for the quit button
        quitBtn.onClick = function() {   
            win.close();   
        }  

        // Centering & Show Window
        win.center();
        win.show(); 
    }


    // Prints stack trace
    function logger(e) {
        var errorMsg = "";

        errorMsg = errorMsg.concat("An error has occured:\n", e.line, "\n", e.message, "\n", e.stack);
        //$.writeln(errorMsg);
    }

} else {
        alert("You do not have any document opened!");
}

实施例: 顶层(蓝色方块)设置为锁定(灯锁符号)。子层继承锁定状态(灰色锁定符号)。在AI中,这些子图层被认为是锁定的,但是,对于我的脚本,它们在解锁时标记(使用layer.locked)。

enter image description here 更新:工作代码,感谢@ermax。

function recurseLayers(currLayers) {
        var length = currLayers.length;
        var currentLayer = null;
        var searchtext = searchText;
        var replacetext = replaceText;

        try {
            for (var i = length; i--;) {
                currentLayer = currLayers[i];
                replaceName(currentLayer, searchText, replaceText);

                if (currentLayer.layers) {
                    recurseLayers(currentLayer.layers);
                }
            }
        } catch (e) {
            logger (e);
        }
    }

    function replaceName(currLayer, searchText, replaceText) {
        try {
            var visible = currLayer.visible;
            var locked = currLayer.locked;
            var typeName = currLayer.typename;
            if (checkLayerVisibility(currLayer) && !checkLayerLocked(currLayer)) {
                currLayer.name = currLayer.name.replace(searchText, replaceText);
            }
        } catch (e) {
            logger(e);
        }
    }

    function checkLayerLocked(layer) {
        if(!layer.locked) 
            for(var parent = layer.parent; parent.typename=='Layer'; parent = parent.parent) {
                 if(parent.locked)
                    return true;
             }
        return layer.locked;
    } 

    function checkLayerVisibility(layer) {
        if(layer.visible) 
        for(var parent = layer.parent; parent.typename=='Layer'; parent = parent.parent) {
             if(!parent.visible)
                return false;
         }
        return layer.visible;
     }

1 个答案:

答案 0 :(得分:2)

您可以通过在父图层中检查此状态来检查子图层可见状态,如果其中一个被隐藏,则此子图层也会隐藏:

function checkLayerVisibility(layer)
{
    if(layer.visible) 
    for(var parent = layer.parent; parent.typename=='Layer'; parent = parent.parent)
    {
         if(!parent.visible)
            return false;
     }
    return layer.visible;
 } 

对于锁定/解锁状态,方式相同:

function checkLayerLockedStatus(layer)
{
    if(!layer.locked) 
    for(var parent = layer.parent; parent.typename=='Layer'; parent = parent.parent)
    {
         if(parent.locked)
            return true;
    }
    return layer.locked;
 }