Скрипты - впечатать имя файла на фото

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

Meh

Топикстартер
15 лет на форуме
Сообщения
25
Реакции
1
Привет!

Озаботился созданием скрипта, который делал бы в файле текстовый слой с именем файла. Также желательно отрезать у имени первые 8 символов и расширение (имена длинные).

С тоской смотрю через ScriptListener на километр кода, остающийся после создания простого текстового слоя, и обращаюсь к специалистам за помошью: CMYK, откликнитесь ;)!
 

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

Код:
if ( documents.length > 0 )
{

	var originalRulerUnits = preferences.rulerUnits;
	preferences.rulerUnits = Units.PIXELS;
	
	try
	{
		var docRef = activeDocument;

		var myLayerRef = docRef.artLayers.add();
		myLayerRef.kind = LayerKind.TEXT;
		myLayerRef.opacity = 100;
		myLayerRef.name = "[File Name]";
		
		var s = String ( docRef.name );
		var myName = s.substring ( 0, s.length - 4 )
		if ( myName.lenght > 8 ) { myName = s.substring ( 8, s.length - 4 ) }

		var textColor = new SolidColor;
		textColor.rgb.red = 255;
		textColor.rgb.green = 0;
		textColor.rgb.blue = 0;

		var myTextRef = myLayerRef.textItem;
		myTextRef.contents = myName
		
		myTextRef.position = new Array( 20, 20 );
		myTextRef.size = 5;
		myTextRef.font = "Arial";
		myTextRef.color = textColor;
	}
	catch( e )
	{
		preferences.rulerUnits = originalRulerUnits;
		alert( "Error occured!");
//		throw e;
	}

	preferences.rulerUnits = originalRulerUnits;
}
else
{
	alert( "You must have a document open to add a timestamp!" );
}

/*

TextItem

Properties

alternateLigatures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
antiAliasMethod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .AntiAlias
autoKerning. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
autoLeadingAmount . . . . . . . . . . . . . . . . . . . . . Number(double)
baselineShift . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
capitalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Case
color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .SolidColor
contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .String
desiredGlyphScaling . . . . . . . . . . . . . . . . . . . . . Number(double)
desiredLetterScaling . . . . . . . . . . . . . . . . . . . . . Number(double)
desiredWordScaling . . . . . . . . . . . . . . . . . . . . . Number(double)
direction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Direction
fauxBold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
fauxItalic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
firstLineIndent. . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
font . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .String
hangingPuntuation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
height. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
horizontalScale . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(long)
hyphenLimit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(long)
hyphenateAfterFirst . . . . . . . . . . . . . . . . . . . . . . . Number(long)
hyphenateBeforeLast . . . . . . . . . . . . . . . . . . . . . . Number(long)
hyphenateCapitalWords . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
hyphenateWordsLongerThan . . . . . . . . . . . . . . . . Number(long)
hyphenation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
hyphenationZone. . . . . . . . . . . . . . . . . . . . . . . . Number(double)
justification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Justification
kind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .TextType
language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Language
leading. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
leftIndent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
ligatures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
maximumGlyphScaling . . . . . . . . . . . . . . . . . . Number(double)
maximumLetterScaling. . . . . . . . . . . . . . . . . . . Number(double)
maximumWordScaling . . . . . . . . . . . . . . . . . . . Number(double)
minimumGlyphScaling . . . . . . . . . . . . . . . . . . . Number(double)
minimumLetterScaling . . . . . . . . . . . . . . . . . . . Number(double)
minimumWordScaling . . . . . . . . . . . . . . . . . . . Number(double)
noBreak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
oldStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
parent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Object
position . . . . . . . . . . . Object[ Array of two Numbers(double) ])
rightIndent. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
spaceAfter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
spaceBefore. . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
strikeThru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
textComposer . . . . . . . . . . . . . . . . . . . . . . . . . . . .TextComposer
tracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
typename . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .String
underline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
useAutoLeading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean
verticalScale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(long)
warpBend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)
warpDirection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Direction
warpHorizontalDistortion . . . . . . . . . . . . . . . . . Number(double)
warpStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WarpStyle
warpVerticalDistortion . . . . . . . . . . . . . . . . . . . Number(double)
width . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Number(double)

Methods
convertToShape
createPath
toString
return value: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .String
*/

Расширение отрезается (подразумевается что это 3 символа + точка). Восемь первых отрезаются если длина оставшегося превышает 8 символов. Ошибка ловится, и в случае ошибки (например при попытке написать текст в документе индексного цвета, или при отсутствии указанного фонта) будет сообщение.

Внизу скрипта, в комментариях - скопированные из pdf'а свойства и методы для объекта textItem. Поскольку script listener лучше всего использовать для создания экшнов в скрипте, то он как и экшн фиксирует состояние всех этих свойств, что в результате и порождает то, что вы видели в его логах.

То есть, приписываете к объектной переменной myTextRef нужные свойства из перечисленных и определяете их величинами (ссылками на объект, например для свойства color нужно сначала создать объект SolidColor, которому определить цвета, а затем этот объект определить в свойство color объекта textItem)

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

Meh

Топикстартер
15 лет на форуме
Сообщения
25
Реакции
1
Ответ: Скрипты - впечатать имя файла на фото

Спасибо за столь быстрый отклик!
Вечером попробую, о результатах напишу позже.
 

Фотограф

Участник
Сообщения
15
Реакции
0
Ответ: Скрипты - впечатать имя файла на фото

Возможность-класс,скрипт-суперский.Давно хотел создать такую тему.
Только у меня пара вопросов:
Где можно найти точное название шрифтов (для вписания в скрипт)?
Скрипт у меня записан в акшен,после скрипта идёт сайв и клоузе.
Можно ли оставить текстовый слой активным (например вставить Enter)?
 

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

Названия шрифтов отображаются в списке при выбранном Text Tool'е Если вы хотите иметь возможность задавать параметры текстового слоя не в коде скрипта, а в диалоговом окне, то нужно мастерить это окно, которое как и следует ожидать, будет повторять "текстовые" палитры Фотошопа. Рисовать формы на яве я не умею, потому что в яве ничерта не понимаю. На VB запросто. Но это будет уже exe-файл, который из экшна вы не запустите (и из ява-скрипта тоже, если не откроете дыру в безопасности).

Кстати, методом исследования кода экшнов я нашел что стили фонта кодируются так: Arial-Bold, или там Arial-Bold-Italic. Поскольку никаких свойств Bold или Italic для объекта textItem не предусмотрено. Это еще добавляет геморроя.

Скрипт у меня записан в акшен,после скрипта идёт сайв и клоузе.
Можно ли оставить текстовый слой активным (например вставить Enter)?


Нихрена не понял. Закрытие с сохранением можно вписать прямо в тело скрипта. Что такое "оставить текстовый слой активным", а уж "например вставить Enter" я не могу врубиться. Опишите задачу как-то иначе.

"Вставить Enter" - типа вставить перенос строки?
 

Фотограф

Участник
Сообщения
15
Реакции
0
Ответ: Скрипты - впечатать имя файла на фото

-=CMYK=- сказал(а):
Названия шрифтов отображаются в списке при выбранном Text Tool'е Если вы хотите иметь возможность задавать параметры текстового слоя не в коде скрипта, а в диалоговом окне, то нужно мастерить это окно, которое как и следует ожидать, будет повторять "текстовые" палитры Фотошопа. Рисовать формы на яве я не умею, потому что в яве ничерта не понимаю. На VB запросто. Но это будет уже exe-файл, который из экшна вы не запустите (и из ява-скрипта тоже, если не откроете дыру в безопасности).

Кстати, методом исследования кода экшнов я нашел что стили фонта кодируются так: Arial-Bold, или там Arial-Bold-Italic. Поскольку никаких свойств Bold или Italic для объекта textItem не предусмотрено. Это еще добавляет геморроя.

Скрипт у меня записан в акшен,после скрипта идёт сайв и клоузе.
Можно ли оставить текстовый слой активным (например вставить Enter)?


Нихрена не понял. Закрытие с сохранением можно вписать прямо в тело скрипта. Что такое "оставить текстовый слой активным", а уж "например вставить Enter" я не могу врубиться. Опишите задачу как-то иначе.

"Вставить Enter" - типа вставить перенос строки?

У меня до скрипта и после него в действии ещё куча операций.
"Вставить Enter" - это и есть вставить перенос строки.
Активным значит- ещё редактируемым (Может я опять не правильно выразился,короче, посмотри рисунок).
И кстати,как ты смотришь код экшнов
 

Вложения

  • 11.jpg
    11.jpg
    92.7 КБ · Просм.: 998

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

"Enter", в смысле перенос строки (hard return) это два символа в Винде: CR & LF (Carriage Return & Line Feed), с кодами ASCII 13 и 10 соответственно. В VB есть константа - vbCrLf, то есть, Chr(13) & Chr(10)

А в яве (Си) вот такой формат: "\r"

Значит если вам нужно написать несколько строк текста, то вы составляете строку таким образом:

myName = s1 + "\r" + s2; И так далее.

"Редактируемым" - такой фигни нет. В принципе, наверное, можно попробовать через "кнопконажиматель" этого добиться, но уверен что оно того не стоит. Лучше изменить экшн, переписав его на скрипт. Что касается создания текста с разноцветными буквами разного кегля и стиля - в объектной модели Шопа доступной пользователю нет и намека на нечто типа textRange.

Как я смотрю код экшнов? Ну а вы как? - Разворачиваете команды экшна и смотрите чего там понаписано. Касательно экшна для создания текста - понаписано там дочерта. Можно и Script Listener активировать и тогда выполняемые действия запишутся в лог-файл, для явы и для басика (а у ЦС и для эппл-скрипта как я понимаю). Там можно поковыряться и написать функции, которые восполняют пробелы в объектной библиотеке и библиотеке типов - например создание guidelines, или там команды типа Apply Image.
 

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

Тут надо понимать отличие экшн-технологии от объектной среды. В первом случае вы работаете как бы вслепую. Тычете командами и если попадаете то все ОК, если нет - или сообщается об ошибке, или просто фигня какая-то выходит, не совпадающая с ожидаемым результатом. Объектная модель позволяет иметь связь с каждым объектом и контролировать его свойства и события.

Например, я с помощью скрипта создаю экшн в памяти Шопа и запускаю его чтобы создать guideline. После чего я не могу проконтролировать - создалась направляющая или нет, каковы ее координаты и так далее. А если я создаю через объектную модель, например, тот же текстовый слой, то храня ссылку на этот объект в объектной переменной, я могу в любое время выполнения скрипта обратиться к объекту за нужной мне информацией или наоборот, поместить в объект некоторую информацию.

Вот как в этом скрипте: сначала создается объект, затем меняются его свойства. Если, например, не вписать кегль фонта и название и цвет, то будет текст черного цвета, 3 пт, и Courier (у меня по крайней мере).

А с помощью экшн-технологии вы так не можете делать - после того как объект создан, следующая команда в экшне не знает про него ничего. Поэтому все параметры объекта устаналиваются в одной команде экшна, которая его и создает.
 

Фотограф

Участник
Сообщения
15
Реакции
0
Ответ: Скрипты - впечатать имя файла на фото

Всё понятно - писать и пользоваться скриптами не для простых смертных,таких как я.
Но У меня ещё маленький вопрос можешь подсказать кое-что:
Нужен такой скрипт который связывает действие с шириной файла.
Если такая-та ширина то действие 1,если другая действи 2 и т.д.
Заранее спасибо ;)
 

Фотограф

Участник
Сообщения
15
Реакции
0
Ответ: Скрипты - впечатать имя файла на фото

А можно ли, чтоб имя выводилось не в текстовом слое,а копировалось
в буфер обмена.Тогда редактировать будет проще, нажал ctrl+V и пиши
дальше что хочешь.
 

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

Можно. Тут же был где-то скрипт который опеределяет больше ширина высоты документа или нет и выполняет в двух ветках разные действия. Ну так вот, если сравнивать не ширину с высотой, а с фиксированными величинами то можно наплодить сколько угодно веток, в каждой из которых будет выполняться своя операция.

Наверное в яве вообще есть операции с буфером обмена, но поскольку я мало очень в яве понимаю то не знаю о них, и второе - у Шопа ява своя, со своими ограничениями, среди которых может запросто оказаться и отсутствие работы с клипбордой. Для объекта Selection есть команды копирование, вырезки и вставки, но ими кусок текста из переменной в буфер не закинуть.

Я вам вот что скажу. Комбинировать скрипты и экшны нужно только тогда, когда явно скриптом невозможно сделать какую-то операцию. Поэтому, пересмотрите свою идеологию, изложите задачу и вполне возможно у вас будет нормальный скрипт, который делает все сам.
 

Фотограф

Участник
Сообщения
15
Реакции
0
Ответ: Скрипты - впечатать имя файла на фото

А "Тут же был где-то скрипт" это где ?
И есть ли первод документа "PS 7.0 Scripting Guide.pdf" ?
 

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

Где-то был.

А что там переводить-то, яву что ли, на русский язык переводить?

Я вам могу посоветовать, если уж вы там что-то разрабатываете что-то сложнее чем open\save, перейти на VB, по крайней мере там хотя бы из объектной библиотеки будете получать подсказки как и что можно сделать. Да и по API-функциям в VB хорошо - практически все что хотите можно встроить.

И еще по Адобской документации на скриптинг. Уроды они, я утверждаю это. Уроды в кубе. Мало того что в документации примеров нет вообще, описаний практически никаких, так в Шопе-8, они уже bookmark'и поубивали и копировать текст из pdf'ов запретили!!! Каково?

Да и вообще, какой там блин, док по скриптингу на русском, если справку Шопа никто на русский с версии 4 не переводил.
 

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

Вот где был. http://forum.rudtp.ru/showthread.php?t=3989

Кстати, только что напоролся на сук: если в полном имени файла есть символ % - процентов, то ява сбивается с его пути, и в результате файл оказывается записан на одну или на несколько папок выше указанной. Веселуха. Очевидно этот символ для явы - специальный, после которого должен идти ASCII код какого-то "неправильного" для сети символа, типа пробела, например. Бардак, а не военная часть. Теперь придется разбираться еще и с этим...
 

Фотограф

Участник
Сообщения
15
Реакции
0
Ответ: Скрипты - впечатать имя файла на фото

Только не бейте ногами,что такое объектная среда.
 

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

Дисклэймер. Я сам не профессиональный программист и поэтому ответственности за нижеследующее не несу.

Объектная среда когда кругом объекты. Объект обладает свойствами и методами. Имеет данные и процедуры обработки этих данных, которые тоже, данные. В обычном мире, например, объект "колесо" имеет свойство "круглое" и метод "катиться". Очевидно что и любой объект имеющий свойство "круглый" будет обладать методом "катиться", хотя может быть вовсе не колесом.

Программно объект это набор функций образующих его интерфейс. То есть, вы знаете где объекту нужно нажать, чтобы оттуда, откуда вы знаете потекло то, что вам нужно. Вы не получаете доступ внурь объекта, вы пользуетесь его интерфейсом связываясь с объектом посредством т.н. объектных переменных. В некоторых языках, типа Явы - вообще все кругом объекты. Несмотря на очевидную избыточность такого подхода (из набора в 100 свойств и 20 методов вам понадобится 2 свойства и 1 метод, а тело объекта все равно будет включено в виде библиотеки или кода в вашу программу целиком), он оправдывает себя полностью - вы общаетесь с объектом на "высоком уровне", и тем самым ваш собственный код сокращается чрезвычайно и что самое главное сокращается вследствии этого количество ошибок и время на их отлов.

Представьте себе что вместо того чтобы переключать канадлы на ТВ с помощью интерфейса вы бы залезали внутрь ящика и перематывали бы пару катушек и перепаивали бы пару конденсаторов уповая на то, что "ничего лишнего зато нет". Ведь если у вас есть возможность переключаться между 99-ю каналами, то на все 99 каналов предусмотрены детали, микросхемы, процессоры, трансформаторы и тп и тд. Несравненно большая куча.

Вот это и есть объектная среда. Когда вас окружают объекты, о внутреннем устройстве которых вы можете ничего не знать, но умея пользоваться их интерфейсом (для чего достаточно почитать оперэйшн мануал) вы управляете ими и получаете от них результат.

Так вот, в программировании те же самые объекты как телевизор, газета, радио, и тп, только в виде программных модулей, блоков. Из которых вы и строите свою программу.

Установить Новый просмотр = Телевизор.Включить.Канал(9).Громкость(10) :)
 

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

Кстати, если бы народ в массовом порядке желал программировать, ни о каком монстре Майкрософт вы не слышали бы никогда, равно как и про Адобу и прочих. Потому что массовое программирование уже давно бы убило программирование и настала бы пора программирования без программирования. Хреново читается, но зато было бы лучше чем сейчас.

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

Фотограф

Участник
Сообщения
15
Реакции
0
Ответ: Скрипты - впечатать имя файла на фото

если бы народ в массовом порядке желал программировать
может когда-нибудь это и наступит
 

-=CMYK=-

Забанен
Сообщения
3 320
Реакции
2
Ответ: Скрипты - впечатать имя файла на фото

Чтобы такой мутации массового сознания дождаться нужно что-то делать. Вот я и делаю. Пропагандирую любительское программирование. :)
 
Статус
Закрыто для дальнейших ответов.