InDesign: сценарий для «вставки на место» выбранных объектов во все разблокированные слои.

Я пытаюсь создать скрипт для «вставки на место» всех выбранных объектов во все разблокированные слои. Моя попытка, вероятно, почти завершена, но что-то не работает.

var myDoc = app.activeDocument;

var al=myDoc.activeLayer.name; // remembers current layer name
app.copy(); // copies whatever is selected

// paste in place for all unlocked layers, excepting source layer
for (var i=0;i<myDoc.layers.length;i++) {
    if ((myDoc.layers[i].locked=false) && (myDoc.layers[i].name!=al)) {
        myDoc.activeLayer=myDoc.layers[i];
        app.pasteInPlace();
    }
}

Ответы (2)

В вашей проверке, если слой заблокирован, отсутствует a =(в противном случае он назначает, а не оценивает). Должен быть;

if ( myDoc.layers[i].locked == false ) ...

Я только что проверил, и скрипт отлично работает с этим исправленным.

Тогда полный рабочий скрипт:

var myDoc = app.activeDocument;

var al = myDoc.activeLayer.name; // remembers current layer name
app.copy(); // copies whatever is selected

// paste in place for all unlocked layers, excepting source layer
for ( var i = 0; i < myDoc.layers.length; i++ ) {
    if ( myDoc.layers[i].locked == false && myDoc.layers[i].name != al ) {
        myDoc.activeLayer = myDoc.layers[i];
        app.pasteInPlace();
    }
}
Хех, я знал, что, должно быть, пропустил что-то основное :)) спасибо .. также добавил это к вопросу на случай, если кто-то погуглит это
@ Люциан, не беспокойтесь, вы действительно должны оставить неверный код в вопросе, хотя вопрос на самом деле не имеет смысла, если код работает :) (хотя я добавил полный исправленный код здесь)

Вариант скрипта для вставки выделенных объектов на все остальные заблокированные слои:

var myDoc = app.activeDocument;

var al=myDoc.activeLayer.name; // remembers current layer
app.copy(); // copies whatever is selected

for (var i=0;i<myDoc.layers.length;i++) {
    if ((myDoc.layers[i].locked==true) && (myDoc.layers[i].name!=al)) {
        myDoc.activeLayer=myDoc.layers[i]; // select next layer
        myDoc.layers[i].locked=false; // unlock it
        app.pasteInPlace(); // paste in place
        myDoc.layers[i].locked=true; // relock it   
    }
}

myDoc.activeLayer=al; // Go back to original  layer
Это вставка во все заблокированные слои, ОП говорит «все разблокированные слои» .
По-видимому, вставка на месте работает только с РАЗБЛОКИРОВАННЫМИ И ВИДИМЫМИ слоями, так что да, я обнаружил это только во время редактирования.
О, я понял. Вот почему я предложил просто разблокировать целевой слой, вставить его на место, а затем снова заблокировать (при желании).
Это хороший момент. Позвольте мне переосмыслить это :)
Отредактировал мой ответ, как вариант...
Я вижу, ваш вариант определенно верен, но с другой логикой. Ваш вариант принудительно вставляет пасту для ВСЕХ слоев, однако первоначальный объем вопроса заключался в том, чтобы вставить только на НЕБЛОКИРОВАННЫЕ слои. Разблокировка только некоторых из них на самом деле работает как контрольный список. Не уверен, что это имеет смысл :)
Глядя на это снова, последняя добавленная вами строка весьма полезна. Возврат к исходной части слоя.
Собственно, о последней строчке. Я добавил его в свой скрипт, так как считаю его полезным. Но вы пробовали? Кажется, он не возвращается к исходному слою...
@Lucian Я работаю, но выбор слоя и выбор объекта - это две разные вещи. Если вы проверите панель слоев, вы увидите, что активным слоем является тот, который вы выбрали первым своим объектом, но выбранный объект находится на последнем слое вашего цикла. В моем варианте объект не был выбран, потому что слой был повторно заблокирован, так что это не было проблемой. В вашем варианте все иначе. Просто добавьте app.selection = null; Если вы хотите вернуться к исходному выбору, это будет другая история.