画板检测提速

使用问题 · 9 次浏览
Ray-CD 创建于 1天8小时前

我在使用的时候,画板如果比较多的时候在检测是否存在画板这一步需要很长时间,用Claude优化了一版检测代码,速度很可观,

#target photoshop

var v = checkArtboards();

function checkArtboards() {
    try {
        var doc = app.activeDocument;
        var layers = doc.layers;
        
        // 从前往后遍历顶级图层
        for (var i = 0; i < layers.length; i++) {
            if (isArtboard(layers[i])) {
                return true; // 找到画板立即返回
            }
        }
        
        return false; // 没有找到画板
        
    } catch (e) {
        return false;
    }
}

function isArtboard(layer) {
    try {
        // 只检查LayerSet类型的图层
        if (layer.typename !== "LayerSet") {
            return false;
        }
        
        // 获取图层ID用于ActionDescriptor检测
        var layerID = getLayerID(layer);
        if (!layerID) {
            return false;
        }
        
        var ref = new ActionReference();
        ref.putIdentifier(charIDToTypeID("Lyr "), layerID);
        var layerDesc = executeActionGet(ref);
        
        // 方法1: 检查artboardEnabled属性(优先检查,最直接)
        if (layerDesc.hasKey(stringIDToTypeID("artboardEnabled")) && 
            layerDesc.getBoolean(stringIDToTypeID("artboardEnabled"))) {
            return true;
        }
        
        // 方法2: 检查layerSection属性(备用检查,更兼容)
        if (layerDesc.hasKey(stringIDToTypeID("layerSection"))) {
            var layerSection = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));
            if (layerSection === "layerSectionStart") {
                // 检查是否有artboard属性作为最终确认
                if (layerDesc.hasKey(stringIDToTypeID("artboard"))) {
                    return true;
                }
            }
        }
        
        return false;
        
    } catch (e) {
        return false;
    }
}

function getLayerID(layer) {
    try {
        // 方法1: 直接通过图层对象获取ID(更可靠)
        var originalActiveLayer = app.activeDocument.activeLayer;
        
        try {
            // 临时设置为活动图层来获取ID
            app.activeDocument.activeLayer = layer;
            
            var ref = new ActionReference();
            ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
            var layerDesc = executeActionGet(ref);
            var layerID = layerDesc.getInteger(stringIDToTypeID("layerID"));
            
            return layerID;
            
        } finally {
            // 恢复原来的活动图层
            app.activeDocument.activeLayer = originalActiveLayer;
        }
        
    } catch (e) {
        // 方法2: 如果方法1失败,使用索引方式(修复版)
        try {
            var doc = app.activeDocument;
            var layers = doc.layers;
            
            // 找到图层在顶级图层中的索引位置
            for (var i = 0; i < layers.length; i++) {
                if (layers[i] === layer) {
                    // 修复:PS的图层索引从1开始,不是从0开始
                    var ref = new ActionReference();
                    ref.putProperty(stringIDToTypeID("property"), stringIDToTypeID("layerID"));
                    ref.putIndex(charIDToTypeID("Lyr "), i + 1);
                    return executeActionGet(ref).getInteger(stringIDToTypeID("layerID"));
                }
            }
            
            return null;
        } catch (e2) {
            return null;
        }
    }
}

v;

Ray-CD 1天8小时前 :

以上脚本有个bug,会将当前选中的组展开,修复后的脚本

#target photoshop


var v = checkArtboards();


function checkArtboards() {

    try {

        var doc = app.activeDocument;

        var layers = doc.layers;

        

        // 从前往后遍历顶级图层

        for (var i = 0; i < layers.length; i++) {

            if (isArtboard(layers[i])) {

                return true; // 找到画板立即返回

            }

        }

        

        return false; // 没有找到画板

        

    } catch (e) {

        return false;

    }

}


function isArtboard(layer) {

    try {

        // 只检查LayerSet类型的图层

        if (layer.typename !== "LayerSet") {

            return false;

        }

        

        // 获取图层ID用于ActionDescriptor检测

        var layerID = getLayerID(layer);

        if (!layerID) {

            return false;

        }

        

        var ref = new ActionReference();

        ref.putIdentifier(charIDToTypeID("Lyr "), layerID);

        var layerDesc = executeActionGet(ref);

        

        // 方法1: 检查artboardEnabled属性(优先检查,最直接)

        if (layerDesc.hasKey(stringIDToTypeID("artboardEnabled")) && 

            layerDesc.getBoolean(stringIDToTypeID("artboardEnabled"))) {

            return true;

        }

        

        // 方法2: 检查layerSection属性(备用检查,更兼容)

        if (layerDesc.hasKey(stringIDToTypeID("layerSection"))) {

            var layerSection = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));

            if (layerSection === "layerSectionStart") {

                // 检查是否有artboard属性作为最终确认

                if (layerDesc.hasKey(stringIDToTypeID("artboard"))) {

                    return true;

                }

            }

        }

        

        return false;

        

    } catch (e) {

        return false;

    }

}


function getLayerID(layer) {

    try {

        var doc = app.activeDocument;

        var layers = doc.layers;

        

        // 找到图层在顶级图层中的索引位置

        for (var i = 0; i < layers.length; i++) {

            if (layers[i] === layer) {

                // 方法1: 使用图层名称作为参考(避免索引问题)

                try {

                    var ref = new ActionReference();

                    ref.putProperty(stringIDToTypeID("property"), stringIDToTypeID("layerID"));

                    ref.putName(charIDToTypeID("Lyr "), layer.name);

                    return executeActionGet(ref).getInteger(stringIDToTypeID("layerID"));

                } catch (e1) {

                    // 方法2: 使用索引方式,但要正确计算索引

                    // PS图层面板显示的顺序和内部索引是相反的

                    // 顶部图层的索引是1,第二个是2,依此类推

                    try {

                        var ref = new ActionReference();

                        ref.putProperty(stringIDToTypeID("property"), stringIDToTypeID("layerID"));

                        ref.putIndex(charIDToTypeID("Lyr "), i + 1);

                        return executeActionGet(ref).getInteger(stringIDToTypeID("layerID"));

                    } catch (e2) {

                        return null;

                    }

                }

            }

        }

        

        return null;

    } catch (e) {

        return null;

    }

}


v;

回复内容
暂无回复
回复主贴