【问题标题】:Checking for Locked/Hidden Layers in Adobe Illustrator在 Adob​​e Illustrator 中检查锁定/隐藏图层
【发布时间】:2016-12-01 23:39:36
【问题描述】:

我正在使用 Adob​​e Illustrator (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)。

更新:工作代码,感谢@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;
     }

【问题讨论】:

    标签: javascript adobe-illustrator


    【解决方案1】:

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

    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;
     }
    

    【讨论】:

    • 这个过程有多少个父层?所有这些都到最顶层的父母?或者它会在一个被隐藏并返回 false 时立即停止?
    • 是的,一旦父项之一被隐藏,它就会停止。
    • 好的,所以我认为它适用于隐藏的父层,您如何将其应用于锁定层?我复制了代码并更改了锁定层,它忽略了一些但仍然更改了一些锁定的层。
    • 锁定层的应用方式相同:
    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多