Скрипт в Photoshop CS5

Статус
Закрыто для дальнейших ответов.

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
Для копирования файла как слоя в предыдущий документ использовал следующий скрипт:
Код:
                                                        // get document name; duplicate to new document; close;
					// name layer in new document using the original document name
					
					var docRef = app.activeDocument;
					var docName = docRef.name; 					
					docRef.changeMode(ChangeMode.RGB);
					docRef.activeLayer.duplicate(documents[0],ElementPlacement.PLACEATBEGINNING);
					docRef.close(SaveOptions.DONOTSAVECHANGES);
					documents[0].activeLayer.name = docName.substring(0, docName.lastIndexOf("."));

В ранних версиях он работает, в последних не хочет переименовывать слой по имени закрытого файла. Пишет об ошибке 8800.
Помогите пожалуйста исправить последнюю строку на корректную для CS5.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Ответ: Скрипт в Photoshop CS5

Помочь не могу, ибо CS5 нет, но могу подсказать пути решения.
1) Разбейте последнюю строку на две:
Код:
docName=docName.substring(0, docName.lastIndexOf("."))
documents[0].activeLayer.name = docName;
и посмотрите в какой именно строке ошибка возникает
2) Попробуйте тупо присвоить documents[0].activeLayer.name любое имя и посмотрите сработает или нет
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Скрипт в Photoshop CS5

У меня нормально сработал, без ошибок. Текст ошибки есть, или только номер пишет?
 

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
Ответ: Скрипт в Photoshop CS5

Выскакивает таблоUntitled-1.jpg
 

Sho Nuff

Участник
Сообщения
50
Реакции
143
Ответ: Скрипт в Photoshop CS5

Код:
// get document name; duplicate to new document; close;
// name layer in new document using the original document name

var docRef = app.activeDocument;
var docName = docRef.name;                     
docRef.changeMode(ChangeMode.RGB);
var newLayer = docRef.activeLayer.duplicate(documents[0],ElementPlacement.PLACEATBEGINNING);
var i = docName.lastIndexOf(".");
newLayer.name = i > 0 ? docName.substring(0, i) : docName;

if (docRef !== documents[0]) {
    docRef.close(SaveOptions.DONOTSAVECHANGES);
}

app.activeDocument - документ имещий фокус,
documents[0] - документ который был открыт первым,
в некоторых случаях это может оказаться один и тот же объект. Добавлена проверка такого случая.
 

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
Ответ: Скрипт в Photoshop CS5

Логично. Но все равно спотыкается на строчке
newLayer.name = i > 0 ? docName.substring(0, i) : docName;
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Ответ: Скрипт в Photoshop CS5

А ошибка какая?
Вообще, правильнее newLayer.name = i ? docName.substring(0, i) : docName; но это непринципиально
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Ответ: Скрипт в Photoshop CS5

А ошибка какая?
Вообще, правильнее newLayer.name = i ? docName.substring(0, i) : docName; но это непринципиально

это как раз неправильно. если точки нет i=-1, и выполнится первая часть. в итоге newLayer.name=undefined
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Ответ: Скрипт в Photoshop CS5

Гм сорри, я думал, он 0 возвращает, если точки нет. С бейсиком, видимо перепутал. Но и тогда неправильно - тогда надо newLayer.name = (i >= 0) ? docName.substring(0, i) : docName; хотя непонятно что делать в случае если имя с точки начинается...
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Ответ: Скрипт в Photoshop CS5

Гм сорри, я думал, он 0 возвращает, если точки нет. С бейсиком, видимо перепутал. Но и тогда неправильно - тогда надо newLayer.name = (i >= 0) ? docName.substring(0, i) : docName;

ну тогда при названии начинающемся с точки опять undefined получится. а на практике разницы не будет, в общем первоначальный вариант самый лучший.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Ответ: Скрипт в Photoshop CS5

ну да, ""
 

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
Ответ: Скрипт в Photoshop CS5

Выскакивает окошко Untitled-1.jpg

И надо слой с именем файла, а не слоя в файле.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Ответ: Скрипт в Photoshop CS5

Странно. То есть CS5 для переименования хочет, чтобы слой был обязательно активным???
И надо слой с именем файла, а не слоя в файле.
Тогда newLayer.name = (i > 0) ? docName.substring(i, docName.length-i) : docName
 

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
Ответ: Скрипт в Photoshop CS5

Все-равно виснет на этой строке...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Ответ: Скрипт в Photoshop CS5

Так виснет или окошко выдает? А если просто попробовать как я с самого начала говорил прямо слою имя присвоить: newLayer.name = "Test layer"; - работает?
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Ответ: Скрипт в Photoshop CS5

не проверял )
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Скрипт в Photoshop CS5

chesen, выложите, наверное, те два файла, с которыми работаете, а то пальцем в небо долго будем гадать. У меня же сработало всё, значит не в алгоритме дело, значит файлы имеют какую-то специфику, которую так просто не угадать.
 
Статус
Закрыто для дальнейших ответов.