Javascript 将图层名称复制到Photoshop中文本框的脚本
我正在尝试用两个工作脚本创建一个脚本 目标: 我们需要一个脚本,该脚本将遍历当前文档中的所有层,查找以特定颜色红色标记的每个层,例如,仅复制以红色标记的层的名称,然后将所有名称一个接一个地放在文本层中附加的示例图像 资源: 我找到了两个脚本,每个脚本完成了我们需要的一半,那么我们如何将它们组合在一起呢 1“按红色选择”遍历文档并查找文档中有多少层标记为红色:Javascript 将图层名称复制到Photoshop中文本框的脚本,javascript,photoshop,Javascript,Photoshop,我正在尝试用两个工作脚本创建一个脚本 目标: 我们需要一个脚本,该脚本将遍历当前文档中的所有层,查找以特定颜色红色标记的每个层,例如,仅复制以红色标记的层的名称,然后将所有名称一个接一个地放在文本层中附加的示例图像 资源: 我找到了两个脚本,每个脚本完成了我们需要的一半,那么我们如何将它们组合在一起呢 1“按红色选择”遍历文档并查找文档中有多少层标记为红色: #target photoshop if (app.documents.length > 0) { // the file;
#target photoshop
if (app.documents.length > 0) {
// the file;
var myDocument = app.activeDocument;
// get number of layers;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var applicationDesc = executeActionGet(ref);
var theNumber = applicationDesc.getInteger(stringIDToTypeID("numberOfLayers"));
// process the layers;
var theLayers = new Array;
var theOthers = new Array;
for (var m = 0; m <= theNumber; m++) {
try {
var ref = new ActionReference();
ref.putIndex( charIDToTypeID( "Lyr " ), m);
var layerDesc = executeActionGet(ref);
var layerSet = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));
var isBackground = layerDesc.getBoolean(stringIDToTypeID("background"));
// if not layer group collect values;
if (layerSet != "layerSectionEnd" /*&& layerSet != "layerSectionStart"*/ && isBackground != true) {
var theName = layerDesc.getString(stringIDToTypeID('name'));
var theID = layerDesc.getInteger(stringIDToTypeID('layerID'));
var visible = layerDesc.getBoolean(stringIDToTypeID("visible"));
var theColor = layerDesc.getEnumerationValue(stringIDToTypeID("color"));
if (typeIDToStringID(theColor) == "red") {theLayers.push([theName, theID])}
else {theOthers.push([theName, theID])}
};
}
catch (e) {};
};
// if layers are red;
if (theLayers.length > 0) {alert ("there are " + theLayers.length + " Red layers")}
else {alert ("no red layers")}
};
计划:
根据我的理解,我们需要从一个循环开始,这个循环与我们的文档大小一样长,即VARI的总层数=0;i非常感谢您的帮助 您需要做的唯一一件事就是使用换行符将图层数组的名称连接起来\r: 结果如下:
我建议你在任何学习网站code academy上学习JS课程,等等:这不会花费你超过一到两个小时,但你会学到基本概念:这将使你的生活在处理类似问题时变得更加轻松。那么你尝试了什么,哪些不奏效?你似乎知道应该做什么,并且拥有所有的拼图。问题是我没有足够的编码经验来拼凑这些拼图。我可以理解每个组件的功能,但无法在一个脚本中连接它们。所以我没有我尝试过的剧本——只有两个片段和一个计划。我向一位朋友寻求帮助,但他的脚本也不起作用。我可以把他的脚本作为一个起点。嘿,谢尔盖,非常感谢你的回答和注释代码。这很有帮助。代码100%按照我的要求运行,通过您的清晰描述,我可以进一步调整它,以满足我们在studio的需要。起初它很简单,但现在我们看到了将代码注入到一些地方的机会。因此,在这一点上,正确地学习JavaScript对我来说是非常有价值的。再次感谢,像你这样的人让世界继续前进。
if (app.documents.length > 0) mainScript();
function mainScript() {
try{
var myLayerName = activeDocument.activeLayer.name;
var myLayerText = activeDocument.artLayers.add();
myLayerText.name = "Comp";
myLayerText.kind = LayerKind.TEXT;
var textProperty = myLayerText.textItem;
textProperty.size = 10;
textProperty.font = "Arial";
myLayerText.textItem.contents = myLayerName;
}catch (errStr){
alert(errStr);
}
}
if (app.documents.length > 0)
{
// the file;
var myDocument = app.activeDocument;
// get number of layers;
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var applicationDesc = executeActionGet(ref);
var theNumber = applicationDesc.getInteger(stringIDToTypeID("numberOfLayers"));
// process the layers;
var theLayers = new Array;
for (var m = 0; m <= theNumber; m++)
{
try
{
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("Lyr "), m);
var layerDesc = executeActionGet(ref);
var layerSet = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));
var isBackground = layerDesc.getBoolean(stringIDToTypeID("background")); // if not layer group collect values; if (layerSet != "layerSectionEnd" /*&& layerSet != "layerSectionStart"*/ && isBackground != true)
{
var theName = layerDesc.getString(stringIDToTypeID('name'));
var theColor = layerDesc.getEnumerationValue(stringIDToTypeID("color"));
if (typeIDToStringID(theColor) == "red")
{
theLayers.push(theName); // we only need names here
}
};
}
catch (e)
{};
};
// got our red layers in theLayers
var myLayerText = activeDocument.artLayers.add();
myLayerText.name = "Result";
myLayerText.kind = LayerKind.TEXT;
var textProperty = myLayerText.textItem;
textProperty.size = 10;
textProperty.font = "Arial";
myLayerText.textItem.contents = theLayers.join('\r'); // joining layers with a line-break: this is going to be textItem text
};