Всем программистам знакома технология include – когда вы включаете в файл другие файлы. Это удобно, т.к. можно поменять что-то в одной часть и это поменяется везде, где эта часть используется. И тут меня посетила страшная мысль: а может ли Photoshop использовать подобную технологию? Например, при создании сайта иметь отдельно файл с шапкой и низом, которые бы использовались в других файлах.
Пример «на пальцах»:

Для примера мы делаем 3 файла: top.psd, bottom.psd и index.psd в который нужно их поместить. Первое что приходит на ум – пункт меню File-Place (Файл-Поместить), который создает Smart-объекты. Так и делаем.

Помещаем(File-Place) нужные файлы-части(top.psd, bottom.psd) в основной файл(index.psd).

Но вот в чем проблема: если что-то изменить в файле top.psd, то в файле index.psd ничего не изменится, Потому-что smart-объект не является ссылкой на файл. Это, скорее, копирование в index.psd. Получается, что top.psd не то же что smart-объект в index.psd[top].

Можно, нажав правой кнопкой мыши на Smart-объекте, заменить его на новый (Replace Contents), но это не наш подход. Можно сделать Action Script, который будет заменять созданные слои, но тогда для каждой части придется создавать свой Action Script.
После долгой борьбы за справедливость, первый раз открыв ExtendScript, был написан скрипт, который автоматически обновляет все smart-объекты. Скрипт находит все smart-объекты в файле и обновляет их, заменяя файлами в папке с исходным файлом. Cкрипт ориентируется по имени слоя и заменяет его файлом с соответствующим именем. (Для удобства выполнение скрипта можно повесить на горячую клавишу)
1. Добавить файл скрипта в папку фотошопа:
«С:\Program Files\Adobe\Adobe Photoshop CS4\Presets\Scripts\Update includes.jsx»
2. Поместить все файлы в один каталог

3. Создать smart-объекты необходимых частей, назвав их СООТВЕТСТВЕННО ИМЕНАМ ФАЙЛОВ.

4. Для обновления – нажать File->Scripts->Update Includes
Пример «на пальцах»:

Для примера мы делаем 3 файла: top.psd, bottom.psd и index.psd в который нужно их поместить. Первое что приходит на ум – пункт меню File-Place (Файл-Поместить), который создает Smart-объекты. Так и делаем.

Помещаем(File-Place) нужные файлы-части(top.psd, bottom.psd) в основной файл(index.psd).

Но вот в чем проблема: если что-то изменить в файле top.psd, то в файле index.psd ничего не изменится, Потому-что smart-объект не является ссылкой на файл. Это, скорее, копирование в index.psd. Получается, что top.psd не то же что smart-объект в index.psd[top].

Можно, нажав правой кнопкой мыши на Smart-объекте, заменить его на новый (Replace Contents), но это не наш подход. Можно сделать Action Script, который будет заменять созданные слои, но тогда для каждой части придется создавать свой Action Script.
После долгой борьбы за справедливость, первый раз открыв ExtendScript, был написан скрипт, который автоматически обновляет все smart-объекты. Скрипт находит все smart-объекты в файле и обновляет их, заменяя файлами в папке с исходным файлом. Cкрипт ориентируется по имени слоя и заменяет его файлом с соответствующим именем. (Для удобства выполнение скрипта можно повесить на горячую клавишу)
Для работы необходимо:
1. Добавить файл скрипта в папку фотошопа:
«С:\Program Files\Adobe\Adobe Photoshop CS4\Presets\Scripts\Update includes.jsx»
2. Поместить все файлы в один каталог

3. Создать smart-объекты необходимых частей, назвав их СООТВЕТСТВЕННО ИМЕНАМ ФАЙЛОВ.

4. Для обновления – нажать File->Scripts->Update Includes
Листинг скрипта:
// Copyright 2002-2007. Adobe Systems, Incorporated. All rights reserved.
// This script will launch JavaScript debugger.
// enable double clicking from the Macintosh Finder or the Windows Explorer
#target photoshop
// in case we double clicked the file
app.bringToFront();
function replaceSmartLayerContents( file ) {
var desc = new ActionDescriptor();
desc.putPath( charIDToTypeID( "null" ), file);
executeAction( stringIDToTypeID( "placedLayerReplaceContents" ), desc, DialogModes.NO );
};
function main() {
// Создаем указатель на текущий документ
var docRef = app.activeDocument;
// Получаем рабочий каталог текущего файла
var workFolder = app.activeDocument.path;
debugger;
//Проходим по все слоям...
for(i=0;i<docRef.layers.length;i++){
// ...и выбираем smart-объекты
if(docRef.layers[i].kind == LayerKind.SMARTOBJECT){
// Получаем имя файла из имени слоя
var filename = docRef.layers[i].name;
// Открываем файл
var updatefile = File (workFolder+'/'+filename);
//Проверяем наличие файла
if(updatefile.exists)
{
// Выделяем обновляемый слой
docRef.activeLayer = docRef.layers[i];
// Обновляем слой
replaceSmartLayerContents (updatefile);
docRef.activeLayer.name = filename;
}
}
}
};
main();