[ID CS4-CS6] список Layer и Path в прилинкованном PSD

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
пока безуспешно ищу в инете — спрошу тут. может кто знает, как получить список слоёв и путей в прилинкованном PSD файле.
ну и эмулировать Object Layer Options скриптом после этого.


Не по теме:
Javascript интересует, понятное дело :)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
В прилинкованном прямым путем- никак
На то он и прилинкованный, чтобы выглядеть снаружи как черный ящик
Через бриджталк — первое что на ум приходит
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
точно.
Код:
img.graphicLayerOptions.graphicLayers
и
Код:
img.clippingPath.photoshopPathNames

осталось только выставить Show Layers скриптом, и я опять буду счастлив :)
 

Flame

Unregistered user
20 лет на форуме
Сообщения
1 323
Реакции
58
в CS4 у каждого элемента этого graphicLayers есть свойство currentVisibility?
 
  • Спасибо
Реакции: bossrus

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
в CS4 у каждого элемента этого graphicLayers есть свойство currentVisibility?
надеюсь. докопался о этого свойства только в библиотеке к CS5 индизайну. позже допишу сработало ли в ЦС4
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
уууууух, как всё закрутилось. никогда бы не подумал, что всё настолько прикольно. @Eugenyus, вам несомненно будет интересно :)
итак. дошёл в скрипте до изменения видимости слоёв. при первой попытке всё отлично работает. скрипт
Код:
app.activeDocument.selection[0].graphicLayerOptions.graphicLayers[1].currentVisibility = false;
работает просто замечательно и вырубает именно второй слой, как и задумывалось. но радоваться, как оказалось, несколько рановато. скрипт
Код:
var pic = app.documents[0].allGraphics[0];
var picLay = pic.graphicLayerOptions.graphicLayers;
for (q=0;q<picLay.length;q++)
    {
    picLay[q].currentVisibility = false;
    }
вылетает на втором шаге с сообщением, что, дескать,
Screen shot 2017-11-21 at 16.48.05.png
раз множество прочитав каждую букву в цикле, я начал понимать, что я чего-то не понимаю. но чего я не понимаю — я ещё не понимал.

мои метания и многочисленные тесты с "огого" после каждого — я глубоко описывать не буду, но в итоге оказалось, что при изменении видимости слоя в прилинкованном файле — меняется сам линк. то есть в данном примере переменная pic становится undefined. всё меняется! даже id этой картинки в app.documents[0].allGraphics.
и выделение с этой картинки снимается.

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

вот такой вот пердюмонокль.
есть идеи, как найти вернуть эту картинку в переменную pic без перебора всех id после каждого изменения видимости слоя?
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Link тоже меняется?
дык pic в примере и есть линк. или что имеется ввиду?

пока сделал такую конструкцию:
Код:
var graph = app.documents[0].allGraphics;

var idS = new Array();
for (var i=0;i<graph.length;i++)
    idS[i]=app.documents[0].allGraphics[i].id;

var img = app.activeDocument.selection[0];

for (var q=0;q<img.graphicLayerOptions.graphicLayers.length;q++)
    {
    img.graphicLayerOptions.graphicLayers[q].currentVisibility = false;

    var idSS = new Array();
    for (var i=0;i<graph.length;i++)
        idSS[i]=app.documents[0].allGraphics[i].id;

    for (var i=0; i<idS.length;i++)
        if (idS[i]!=idSS[i])
            {
            var img = app.documents[0].allGraphics[i];
            break;
            }
    }
и таки смог выключить все слои. но как-то попахивает какой-то лютой жестью
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Конструкция с перебором всех id кажется мне безумной
А что, объект меняется совсем целиком вместе с label, name? 'hmmm'
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Конструкция с перебором всех id кажется мне безумной
я к этому уже близок. так странно мне ещё не было. когда вроде всё правильно, а не работает :)
А что, объект меняется совсем целиком вместе с label, name?
name не катит, бо их там куча на странице с одного файла.
label — вариант лучше, но короче всего на 3 строчки, чем перебор id. :)
всё равно перебирать все картинки. а сравнение 2 текстовых массивов — это милисекунды.

завтра попробую с label.
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 216
Код:
var gfx = app.selection[0].graphics[0];
var link = gfx.itemLink;
var layers = [];
for (var i = 0; i < link.parent.graphicLayerOptions.graphicLayers.length; i++) {
    var layer = link.parent.graphicLayerOptions.graphicLayers[i];
    layers.push(layer);
}

for (var i = 0; i < layers.length; i++) {
    link.parent.graphicLayerOptions.graphicLayers[i].currentVisibility = false;
}
 
  • Спасибо
Реакции: Flame и bossrus

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
@Oleg Butrin, о да!
причём если вчера вечером, когда я увидел это сообщение, я думал что дело в массиве слоёв. но оказалось, что дело в обращении к слоям с заднего входа. через итемлинк оно работает и "в лоб".

Код:
var gfx = app.selection[0].graphics[0];
var link = gfx.itemLink;
for (var i = 0; i < link.parent.graphicLayerOptions.graphicLayers.length; i++) {
    link.parent.graphicLayerOptions.graphicLayers[i].currentVisibility = false;
}

работает просто великолепно.
причём если слегка видозменить запись, сократив её без изменения сути — фигу. работать перестаёт.

то есть код, где мы переносим длинную повторяющуюся часть в объявление переменной, чтобы избавиться от неё в теле программы:
Код:
var gfx = app.selection[0].graphics[0];
var link = gfx.itemLink.parent.graphicLayerOptions.graphicLayers;
for (var i = 0; i < link.length; i++) {
    link[i].currentVisibility = false;
}

работать перестаёт. видать при изменении видимости слоёв изменение структуры документа не доходят до уровня "итемлинк", и только обращение через него остаётся работоспособным.

спасибо, @Oleg Butrin. я бы не додумался бы идти "с заднего входа" :)
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 216
я бы не додумался бы идти "с заднего входа"

Не по теме:
поперхнулся

Давай лучше назовем это "боковой вход" 8*)

Тут, на самом деле, логика понятна. При включении и отключении слоев происходит, очевидно, автоматический реимпорт с новыми установками видимости слоев. Потому генерируется новый id. Но линк-то остается на тот же файл.
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
займусь-ка я некропостингом, раз тему не закрыли вовремя :D

дополнительный вопрос почти в тему — можно ли как-то "заморозить" обновление картинки до того момента, когда будут выключены/включены все слои? потому как если слоёв десяток — то отключение всех занимает кучу времени. в отличии от отключения оных с помощью Object Layer Options.
очень хотелось бы остановить обновление картинки, выключить все слои, и обновить картинку 1 раз.
попытки скрывать картинку (в CS6), или даже весь слой с картинкой (в CS4) ускорения не принесли :(