我在使用的时候,画板如果比较多的时候在检测是否存在画板这一步需要很长时间,用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;
以上脚本有个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;