Рассмотрим мой код:
// Ensure a document is open
if (app.documents.length > 0) {
var doc = app.activeDocument;
var originalLayer = doc.activeLayer; // Store reference to the original layer
// Check if the layer is not the background layer
if (!originalLayer.isBackgroundLayer) {
var layerBounds = originalLayer.bounds;
var layerWidth = layerBounds[2].as('px') - layerBounds[0].as('px'); // Convert bounds to pixels
var layerHeight = layerBounds[3].as('px') - layerBounds[1].as('px'); // Convert bounds to pixels
var segmentWidth = 75; // Width of each segment in pixels
for (var x = 0; x < layerWidth; x += segmentWidth) {
doc.activeLayer = originalLayer; // Reactivate the original layer
// Create a selection for the segment
var segmentRight = Math.min(x + segmentWidth, layerWidth);
var selectionCoords = [
[x, 0],
[segmentRight, 0],
[segmentRight, layerHeight],
[x, layerHeight]
];
// Check if the selection coordinates are valid
if (isValidSelection(selectionCoords)) {
doc.selection.select(selectionCoords);
// Copy the selection to a new layer
doc.selection.copy();
var newLayer = doc.artLayers.add();
doc.paste();
newLayer.name = "Segment " + (x / segmentWidth + 1);
// Deselect to avoid interference in the next loop
doc.selection.deselect();
} else {
alert("Invalid selection coordinates.");
}
}
alert("Layer divided into 25-pixel segments.");
} else {
alert("The active layer is the background layer and cannot be divided.");
}
} else {
alert("No document open.");
}
// Function to check if selection coordinates are valid
function isValidSelection(coords) {
for (var i = 0; i < coords.length; i++) {
if (coords[i][0] < 0 || coords[i][1] < 0) {
return false;
}
}
return true;
}
Что я пытаюсь сделать?
У меня есть слой с именем Color
. Я хочу создать несколько слоев одинаковой ширины 75 пикселей, копируя содержимое этого слоя с помощью файла JavaScript.
В моем документе активным слоем является слой с именем Color
. Слой частично [не полностью] заполнен розовым цветом. Теперь, когда я запускаю этот файл, действительно создается слой с именем Segment 1
, но после этого появляется диалоговое окно с предупреждением с надписью Could not complete the command because the selected layer is empty
. Я знаю, в чем проблема. Я взял 75 пикселей данных слоя с крайнего левого угла слоя Color
, вставил их в слой Segment 1
и создал его. Но когда цикл запускается во второй раз, он считает Segment 1
активным слоем, что на самом деле таковым не является. Поэтому я явно добавил строку:
doc.activeLayer = originalLayer;
так что при каждом запуске цикла активным слоем будет слой с именем Color
. Но проблема все еще сохраняется. Где я сделал что-то не так? Я думаю, мне нужно добавить некоторые значения смещения.
Кажется, в вашем коде нет ничего плохого. Вы используете правильный файл?
Ох, щелк! Наконец-то я нашел ошибку и решил ее сам. Спасибо!!!
@M.Riyan Но проблема все еще возникает, когда мой слой не полностью заполнен контентом. Я упомянул концепцию значений смещения. Вы как-нибудь можете помочь?
Если у вас есть слой, который не заполнен полностью каким-либо содержимым, необходимо использовать пару значений смещения.
Ширина и высота слоя измеряются только по его содержимому. Если размер холста составляет 1920x1080, то слой, содержащий содержимое только внутри прямоугольника в пределах четырех координат (100,100), (100,200), (300,200) и (300,100), будет иметь определенные значения layer_width
и layer_height
, которые вы можете измерить.
var layerBounds = originalLayer.bounds;
var layerX = layerBounds[0].as('px'); // X coordinate of the top-left corner of the layer
var layerY = layerBounds[1].as('px'); // Y coordinate of the top-left corner of the layer
Здесь, в этом коде, layerX
имеет значение 100
[в моем примере] и layerY
тоже имеет значение 100
. Теперь, чтобы найти layer_height
и layer_width
, я могу просто следовать вашим шагам:
var layerWidth = layerBounds[2].as('px') - layerX; // Width of the layer in pixels
var layerHeight = layerBounds[3].as('px') - layerY; // Height of the layer in pixels
Таким образом, теперь у нас есть значения смещения, которые можно записать как:
var offsetX = layerX;
var offsetY = layerY;
и код наконец меняется:
var selectionCoords = [
[x + offsetX, offsetY],
[segmentRight + offsetX, offsetY],
[segmentRight + offsetX, layerHeight + offsetY],
[x + offsetX, layerHeight + offsetY]
];
Вот и все. Больше ничего не требуется.
В случае отладки мы можем использовать функцию JavaScript alert()
для отладки значений.
что такое погружение слоя? Кроме того, вам необходимо предоставить контекст того, что делает предоставленный вами фрагмент кода, вместо того, чтобы случайным образом предлагать людям прочитать все это и понять самостоятельно. И еще, скажите, пожалуйста, что вы пытаетесь сделать?