[PS CC-CC2022] Скрипт для фотошоп - Relink layers

jazzy

Участник
Топикстартер
Сообщения
378
Реакции
214
Всем известно, что работа со связанными (linked) файлами в Фотошопе - боль и унижение. Как только меняется путь к файлам, Фотошоп предлагает заменить ссылки вручную для каждого файла в макете. Хорошо, если их 1-2-3, но если под сотню да еще и из разных папок - проще плюнуть, чем перелинковывать вручную.

Общая информация:
Это скрипт для групповых операций со связанными файлами. При загрузке он анализирует слои и формирует список ссылок в документе. Красным помечены потерянные файлы (т.е. те, которые где-то валяются, но Фотошоп их не может найти самостоятельно), зеленым - файлы на месте и находятся в том же каталоге где и открытый файл, желтым - файлы на месте, но находятся в другом каталоге (решил выделить их отдельно, так как у меня многие макеты содержат элементы из других папок). Можно щелкать по списку и вручную указывать связи, можно использовать кнопку "связать заново", выполняющую поиск выделенных (либо всех файлов) на диске. Из выпадающего списка можно указать где искать - в том же каталоге, откуда открыт сам документ, либо в новом каталоге. Есть дополнительная опция учитывать расширение файла или нет (она нужна, если вы собрали макет с файлами одного типа, а потом конвертировали их в другой формат (например, для архивации)).
Интерфейс ru/eng (автоматически в зависимости от основного языка Фотошопа, либо вручную если убрать комментарий в 12 строке кода)
2022-02-21_09-45-15.png

Помимо восстановления связей есть возможность собрать все файлы из документа в кучу - за это отвечает опция "собрать ресурсы в папке" (папка создается в том же каталоге, который вы используете для поиска файлов). Можно не указывать имя папки, либо наоборот указать дополнительные подкаталоги (например "макет/портреты"), опция группировки по типу позволяет автоматически разложить файлы по папочкам в зависимости от их типа (джипеги в папку JPG, тифы в папку TIF и т.п.). Самая коварная опция - "перемещать". Она работает по простому принципу - если файл найден в том же каталоге, то при сборе ресурсов он будет перемещен в новую папку. Если файл из другого каталога - только скопирован. Коварство этой опции в том, что API фотошопа не имеет команды "переместить", вследствие чего мне приходится выполнять сначала команды "скопировать", затем "удалить" (при этом удаление происходит непосредственно с диска, минуя корзину). Я постарался сделать все, чтобы перемещение файлов было безопасным (скрипт перед удалением файла всегда проверяет, было ли успешным копирование), но рекомендую использовать ее с осторожностью (не включать ее сразу на рабочих файлах, а сначала проверить, что все работает корректно).


Ссылка на скрипт (ресурсы форума): relink layers (код не обфусцирован, я сторонник open-source).

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

Скрипт писался и тестировался на W10/W11, на OSX я проверил лишь базовую совместимость (есть различия в том, как Фотошоп предоставляет информацию о потерянных файлах + столкнулся с небольшими различиями в реализации js-движка). Исправил то, что нашел, но полноценно не тестировал.

Известные проблемы:
- скрипт не поддерживает диалоговые окна, которые могут быть показаны при замене ссылки для некоторых типов файлов (например, для равок всегда будет появляться окно с предложением скорректировать настройки проявки), а при работе с многостраничными файлами (пдф, макеты из иллюстратора) будет импортирована только первая страница. Если вы работаете с такими файлами, то лучше ставить блокировку на подобные объекты (скрипт будет игнорировать слои с "замочком").

Пы.Сы.
У меня достаточно много скриптов общего назначения для Фотошопа, однако никогда не публиковал их на этом ресурсе. Если будет интерес - возможно пороюсь в закромах и найду еще что-то.
 
Последнее редактирование:
Интерес конечно будет....)) будем следить за темой...)))) :)
 
Скорее всего буду создавать отдельные темы. Ну или с модератором обсужу как лучше. У меня проблема не в том, чтобы скрипты выложить а в том, чтобы набросать к ним внятное описание.

Выложил обновление Relink layers.

Если под виндой тишь да гладь и структура объектов практически не меняется от версии к версии, то в MacOS все иначе. Первоначально тестировал скрипт на Catalina в CC2020 - учел особенности представления имен потерянных файлов, все прекрасно работало. Были сомнения по поводу новых версий операционки, поэтому сегодня накатил Big Sur поставил CC2022 и обнаружил что действительно некоторые вещи изменились (ссылки на битые файлы представлены иначе чем на W10/W11 и иначе чем в Catalina). К счастью потребовалось добавить всего пару проверок, чтобы все заработало.
 
  • Спасибо
Реакции: NatalieRedFox_333
Скорее всего буду создавать отдельные темы. Ну или с модератором обсужу как лучше. У меня проблема не в том, чтобы скрипты выложить а в том, чтобы набросать к ним внятное описание.

Выложил обновление Relink layers.

Если под виндой тишь да гладь и структура объектов практически не меняется от версии к версии, то в MacOS все иначе. Первоначально тестировал скрипт на Catalina в CC2020 - учел особенности представления имен потерянных файлов, все прекрасно работало. Были сомнения по поводу новых версий операционки, поэтому сегодня накатил Big Sur поставил CC2022 и обнаружил что действительно некоторые вещи изменились (ссылки на битые файлы представлены иначе чем на W10/W11 и иначе чем в Catalina). К счастью потребовалось добавить всего пару проверок, чтобы все заработало.
да наверно можно и в этой постить.... зато не надо искать если что... и тему наверно можно закрепить )))
 
2022-02-22_01-33-39.png

'hz'

Под виндой перемещение легко организовать вызовом системных команд, однако в скрипте оно специально разделено на 2 операции (копирование и удаление), так как перемещение файлов требуется до перелинковки, а она в свою очередь не гарантирована в 100% случаев (может быть битый или неподдерживаемый файл, вылет фотошопа, луна не в той фазе и т.п.). Удаление идёт последним этапом когда точно известно, что файл "прицепился" к слою.
 
Последнее редактирование:
  • Спасибо
Реакции: Jeine и NatalieRedFox_333
A попробовать? :)
Под виндой перемещение легко организовать вызовом системных команд
Зачем?
в скрипте оно специально разделено на 2 операции (копирование и удаление), так как перемещение файлов требуется до перелинковки, а она в свою очередь не гарантирована в 100% случаев (может быть битый или неподдерживаемый файл, вылет фотошопа, луна не в той фазе и т.п.). Удаление идёт последним этапом когда точно известно, что файл "прицепился" к слою.
Очень странные рассуждения :) У Вас алгоритм построен если я верно понял, так, что перемещаются только файлы в пределах одного логического диска, при перемещении в таком случае файл не удаляется и не пишется (что кстати в сотни раз быстрее копирования)... если он битый, то и копирование его не спасет и перемещение не испортит...
 
Последнее редактирование:
Ткните носом в работающий код c использованием метода .rename(), перемещающий файл 'd:/1.txt' в 'd:/test folder/1.txt' (каталог создан, проверять наличие не нужно).

Если пользователь укажет целевой каталог на другом диске (вот захотелось ему туда все ресурсы перекинуть) - то и между дисками тоже. Тут есть еще один момент - если идет перелинковка файла (то есть не замена битой ссылки на рабочую, а замена одной одной рабочей ссылки на другую), то в момент открытия смарт-объекта (если линкованный файл лежит внутри него) этот файл должен лежать по прежнему пути (иначе фотошоп ругнется на его отсутствие и остановит скрипт).
 
Последнее редактирование:
* собственно поэтому я ненавижу писать документацию - постоянно разрываюсь между тем, чтобы в деталях описать все особенности скрипта и тем, чтобы подать информацию как можно доступнее :)
 
Спасибо! Значит документации верить нельзя :)
Возможно позже разделю операции перемещения и копирования-удаления с учетом контекста (нужна копия файла для открытия объекта или нет)
 
Если пользователь укажет целевой каталог на другом диске (вот захотелось ему туда все ресурсы перекинуть) - то и между дисками тоже.
и.... все перенесется, и пока не перенесется, скрипт просто дальше не пойдет, кроме того, операция возвращает результат, сделайте проверку если так хочется. Перемещение надежнее чем заложено в файловой системе Вы не сделаете, при копировании как раз и возможны коллизии ИМХО
если идет перелинковка файла (то есть не замена битой ссылки на рабочую, а замена одной одной рабочей ссылки на другую), то в момент открытия смарт-объекта (если линкованный файл лежит внутри него) этот файл должен лежать по прежнему пути (иначе фотошоп ругнется на его отсутствие и остановит скрипт).
Это уже Ваша задача построить алгоритм, который не допустит ошибок, я всего лишь показал как переместить.
 
Спасибо! Значит документации верить нельзя :)
Возможно позже разделю операции перемещения и копирования-удаления с учетом контекста (нужна копия файла для открытия объекта или нет)
Все прекрасно перемещается, единственно что - есть небольшие непонятки с переименованием файла в уже существующий.

Никому верить нельзя
Мюллеру можно же. Но он давно умер. 'RIP'
да наверно можно и в этой постить.... зато не надо искать если что... и тему наверно можно закрепить )))
Для начала (вобще-то давно пора) хотя бы добавить в раздел фотошопа подраздел Автоматизация, имеющийся, кстати, в других разделах.
 
Все прекрасно перемещается, единственно что - есть небольшие непонятки с переименованием файла в уже существующий.
file.exists и переименование с префиксом, если такой файл уже есть в целевом каталоге (это уже есть в коде так как при копировании проблемы все те же самые).
Для начала (вобще-то давно пора) хотя бы добавить в раздел фотошопа подраздел Автоматизация, имеющийся, кстати, в других разделах.
Я только за. Вчера пошебуршал в закромах - скриптов 10 больших (которые можно публиковать) я наберу. Сниппетов (фрагментов кода, решающих мелкие специфичные задачи) за сотню... Мне это интересно в первую очередь из-за фидбека - когда пишешь в стол (для себя или для нужд коллег) пользователи обычно молчат об ошибках и неудобствах.

Вот тут, кстати, товарищ про мой UIcolors распинается (скрипт для модификации интерфейса фотошопа). Я сам от него не восторге, но знаю что пошел в народ - многие любят перекрашивать интерфейс для презентаций или для кровавых слёз из глаз.
2022-02-22_08-42-54.png


 
Последнее редактирование:
Благодаря мудрым советам Gad немного изменил логику Relink layers - раздельные операции копирования и удаления заменил на одну операцию перемещения. Файл в ресурсах обновил.

Однако сразу же полезли проблемы с совместимостью - в винде всё прекрасно, а вот MacOS (Big sur) перемещения не происходит. Игрался с путями (пробовал полные, относительные) - без толку. Т.е. оптимизация коснулась (по сути) только винды, на маках - всё по-прежнему. Т.е., получается, документация не то чтобы врёт, просто немного недоговаривает...
 
Последнее редактирование:
просто немного недоговаривает
Просто в этих ОС по разному реализована операция переименования :) Вин принимает полный путь, в Мак видимо нет:) Системно-зависимая же операция :)
 
Я пробовал и относительные пути.
При этом прочие файловые операции работают одинаково 'hz'
 
Последнее редактирование: