我正在使用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)。
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;
}
答案 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;
}