Скриптинг и управление наборами.

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

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Неожиданно столкнулся с интересной проблемкой. Как из скрипта можно получить информацию об элементах наборов (кисти, узоры и т.д.) или, хотя бы, их количество? Пока что, единственно что приходит на ум - начиная с большИх значений, удалять или переименовывать элементы по индексу, до тех пор, пока генерируется ошибка. Существует ли менее извращенный способ?
 

Skvoznyak

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

пресеты что-ли?
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

Ну, наверное. У меня сейчас русская версия, будь она трижды здорова! По аглицки узоры - patterns
 

Skvoznyak

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

var key = charIDToTypeID('PttR'); значение для паттернов, для других пресетов надо здесь менять

Код:
var names = [];

  var classApplication = charIDToTypeID('capp');
  var typeOrdinal      = charIDToTypeID('Ordn');
  var enumTarget       = charIDToTypeID('Trgt');
  var key = charIDToTypeID('PttR');
  
  var ref = new ActionReference();
  ref.putEnumerated(classApplication, typeOrdinal, enumTarget);

  var appDesc = app.executeActionGet(ref);
   
  var mgr = appDesc.getList(stringIDToTypeID('presetManager'));
  var max = mgr.count;

  for (var i = 0; i < max; i++) {
    var objType = mgr.getObjectType(i);
    if (objType == key) {
      break;
    }
  }

  if (i != max) {
    var preset = mgr.getObjectValue(i);
    var list = preset.getList(charIDToTypeID('Nm  '));
    var max = list.count;
    for (var i = 0; i < max; i++) {
      var str = list.getString(i);
	 names.push(str);
    }
  }

а вообще всякие нестандартные вещи надо смотреть тут
http://sourceforge.net/projects/ps-scripts/files/xtools/v2.0/xtools-2_0.zip/download
 
  • Спасибо
Реакции: dumbm1

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

Действительно, как то не подумал в эту сторону, thanx! Что касается списка констант, я пользуюсь этим.
 

Skvoznyak

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

а это все в документации sdk есть, ну и в коде ессно
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

То-то и оно, что в SDK бОльшая часть недокументирована, тот же PttR, к примеру, да и Nm ... :(
 

Skvoznyak

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

в PITerminology.h все есть

#define keyName 'Nm ' // NOTE: This used to be keyName, but was changed to avoid conflicts with PDFL.
#define classPattern 'PttR'

ScriptListener/Listener еще помогают очень, а также Getter - там вообще вся возможная инфа из шопа выужена. xbytor именно из getter выудил куски кода и переписал на js.
 
  • Спасибо
Реакции: dumbm1

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

в PITerminology.h все есть
Ну это, вроде как уже не документация, а библиотеки - в самом же Scripting Reference адоба почему-то сочла нужным привести только некоторые константы (причем, меньшую часть) :(
Кстати, в моей версии SDK (plugins SDK) даже этот файл почему-то отсутствует.
В общем, еще раз высказываю адобам свое фу по поводу документируемости. 'P:E'
 

Skvoznyak

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

должно быть, без него ни один образец из sdk не соберется.
photoshopapi->photoshop->
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

Это, наверное, в новом SDK появилось, в моей версии (под C++) нету :(
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

А где, к примеру, вообще сам синтаксис Action команд у адобы описан? К примеру, у меня команда "Dlt " нормально работает только по абсолютному индексу элемента, удалять элемент по имени никак не получается. Вот такой кусок кода:
Код:
      var id14 = charIDToTypeID( "Dlt " );
      var desc3 = new ActionDescriptor();
      var list2 = new ActionList();
      var ref3 = new ActionReference();
      ref3.putClass(charIDToTypeID("Ptrn"));
      desc3.putReference(charIDToTypeID("null"),ref3);

      var ref4 = new ActionReference();
ref4.putEnumerated(charIDToTypeID("Dcmn"),charIDToTypeID("Ordn"),charIDToTypeID("Trgt"));
      desc3.putReference(charIDToTypeID("Usng"),ref4);
      desc3.putString(charIDToTypeID("Nm  "),name);
      executeAction( id14, desc3, DialogModes.NO );
вызывает ошибку "неподдерживаемая команда". Аналогичный кусок через putName выдает, что, мол, объект с таким именем отсутствует. А как, тогда, правильно?
 

Skvoznyak

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

ну тут как.. можно смотреть по аналогии с c++ кодом, ActionManager ведь тот же.
наиболее простое - поставить ScriptListener и смотреть его лог

а так в доках есть многое, надо лопатить Automation Tutorial.pdf, Photoshop Actions Guide.pdf и описания Automation сюит в html доках
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

ну тут как.. можно смотреть по аналогии с c++ кодом, ActionManager ведь тот же.
наиболее простое - поставить ScriptListener и смотреть его лог
ScriptListener не помогает - там то как раз удаление по индексу идет, а не по имени, т.е. через putIndex :(
Кстати, сейчас столкнулся со случаем, где и ваш пример не работает - первая команда executeActionGet(ref) вызывает ошибку "программный сбой" Руссифицированный фотошоп. :(
В общем, склоняюсь к мысли, что у адобы две беды - документаторы и локализаторы... 'P:E'
 

Skvoznyak

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

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

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

да и индекс по имени найти не такая уж большая проблема, когда все имена в массиве лежат.
То-то и оно, что проблема достаточно серьезная, так как в моем случае доступа к массиву нет:
1.jpg :(
Почему такое возможно и как обойти?
 

Skvoznyak

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

не знаю, метод такой есть, это точно. попробуйте плагин вместо скрипта сделать. как всю инфу получать - образец Getter

может, фотошоп переставить?
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

может, фотошоп переставить?
Хочется ж универсального решения, которое б работало везде. Но, судя по всему, получается, что (во всяком случае) в локализованном CS3 функция executeActionGet не работает вообще - любой пример из Getter ошибку 8800 выдает... :(
 

Skvoznyak

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

что, и плагин не работает?
 

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Ответ: Скриптинг и управление наборами.

А смысл? Мне-то из скрипта надо.
С количеством, вроде, выкрутился вот так:

Код:
function GetPatternCount()
{
 for (cnt=1;;cnt++){
  try{
    var desc1 = new ActionDescriptor();
    var ref3 = new ActionReference();
    var id16 = charIDToTypeID( "Ptrn" );
    ref3.putIndex( id16, cnt );
    desc1.putReference( charIDToTypeID( "null" ), ref3 );
    executeAction( charIDToTypeID( "slct" ), desc1 , DialogModes.NO );
  }catch(err){
    return(cnt-1);
  }
 }
}
 
Статус
Закрыто для дальнейших ответов.