нужен совет по JavaScript под Фотошоп

  • Автор темы Автор темы b-612
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

b-612

Участник
Топикстартер
Сообщения
5
Реакции
0
Пишу программу JavaScript под Photoshop CS4 (ExtendScript 3.92.115, ScriptUI4.0.38).
Создал окно с вложенной группой и панелью. Панель содержит множество групп, каждая по 2 объекта: Static Text, Edited Text.
Static Text хранит имя файла, а окошко Edited Text показывает номер файла в списке. Например так:
1a.psd 1
2B.psd 2
3C.psd 3

...
n.psd n

Список файлов может быть любым и заранее известно, что их будет от 2 до 63. Оператор может сортировать список, меняя номер в окошке Edited Text.
Скрипт следит за изменением номера и если новый номер оказывается допустимым, скрипт меняет местами имена двух файлов, вот так:
1a.psd 1
3C.psd 2
2B.psd 3

...
n.psd n

Скрипт успешно создает окно, проверят корректность номеров, исправляя недопустимые значения, но возникает ошибка при попытке заменить название файла.
Скрипт использует метод onChange, который вызывает безымянную функцию, одну, общую для всех групп списка.
Скрипт заранее не знает сколько будет файлов, поэтому названия объектов Static Text и Edited Text в каждой группе записаны в ассоциативный массив. Доступ осуществляется оператором [], со строкой в качестве индекса. Доступ к объектам организован одинаково, поэтому показываю только операции доступа к проблемному объекту:

nm.onChange = function() {
...
const cn= parseInt(this.text, 10);
const pi= cn - 1;
const stp= "st"+pi; //операция typeof stp возвращает string
const nn= this.parent[stp].text; // ERROR: undefined, in not an object
...
}

Объект с измененным номером в окошке Edited Text работает нормально: копируется имя файла из поля text объекта Static Text, взамен скрипт пишет другое имя и новый номер.
Второй объект, целевой, чей номер совпадает с введенным, оказывается не определеным: "undefined, in not an object". Но он есть и, если начать замену с его окошка, он работает.

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

Как думаете, в чем проблема?
 
Ответ: нужен совет по JavaScript под Фотошоп

Спасибо. Перегрелся от жары и забыл на что ссылается this. Объекты разные и находятся в разных группах, а this указывает на объект, вызвавший функцию. Изменил ссылку и все заработало.
 
Ответ: нужен совет по JavaScript под Фотошоп

"Папа, а ты с кем сейчас говорил?" :)

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

Оператор может сортировать список, меняя номер в окошке Edited Text.

Бедный оператор...
 
Ответ: нужен совет по JavaScript под Фотошоп

Как обычно. я не нашел кнопки "Удалить" или "Закрыть тему" и ответил сам себе, чтобы стало ясно как оно решилось.

Программисты Adobe предусмотрели все, даже то, что на первый взгляд и на второй, да и на третий тоже, отсутствует. Можно сделать как в сказке, когда есть опыт. Я впервые программирую оконный интерфейс и делаю простой вариант, чтобы было удобно в повседневной работе проверять алгоритмы допечатной подготовки трехмерных изображений.
 
Ответ: нужен совет по JavaScript под Фотошоп

А зачем париться с явой, если вы можете написать апликуху на VB (кстати, новые ФШ понимают NET?). Прицепить к ней драйвер базы данных или даже просто через ODBC связываться с екзельным народом любимым листом.

И главное. У вас фундаментальная ламерская ошибка. Вы дублируете собственный индекс файлов (строк), вместо того, чтобы им пользоваться как таковым перетаскивая строки с места на место.

То есть надо завести список, не знаю как на яве, на васике - ListBox. Добавить 4 меню: Move Up, Move Down, To Front, To Back. Написать в событие Click простейшие коды переноса строк в массиве и отображать его в списке общим махом. На меню повешать шорткаты и лафа.
 
Ответ: нужен совет по JavaScript под Фотошоп

С помощью хитромудрого API можно и драг-н-дроп реализовать. С помощью библиотеки FreeImage можно заюзать ноготки в элементе управления наподобии того, который используется в виндовом файловом мененегере - ListView. Если вы замечали то в режиме ноготков (thumbnails) он позволяет перемещать ноготки файлов вручную - в произвольное место их собирать как иконки какие-нить на рабочем столе. Таким образом FreeImage берет из файлов (если это на самом деле файлы) превью, а вы его записываете в ImageList ассоциированный с ListView. И можете таскать картинки интерактивно сколько угодно.

Это получается самостоятельная апликуха, которая попросту связывается с ФШ через указанную в референсах проекта объектную библиотеку. Она у вас есть.

Когда скрипт делается на обмен - это конечно нужна ява. А если чисто для себя, нафиг она сдалась. Изобразили в конструкторе какой угодно интерфейс, события прописали и вперед. Из окна Imediate - которое для отладки кусков кода годится - можно прямиком отдавать приказы Фотошопу сделать то или иное. Набрал: Photoshop.Documents.Add и нажал ентер - в ФШ новый док создался. Очень удобно.

Я уж не говорю о том, что к нормальной апликухе можно прицепить какие угодно виндовые и прочие API функции, субклассы и прочую хренатень.

Если нужен нумерованный список - ну, чтобы видеть какой номер строки (файла), то запросто либо FlexGrid, или просто забацать лейбл с номерами по вертикали.
 
Ответ: нужен совет по JavaScript под Фотошоп

Говорят, что JavaScript работает на МАС и РС, а VB только РС. Этой программе переносимость важна. Кроме того, JavaScript совместим с Java и есть возможность компилировать скрипт, сохраняя бинарный файл.

Перетаскивание сложнее, а это мой первый оконный интерфейс. Постараюсь сделать перетаскивание, обязательно.

Выпадающий список мне не нравится:
1) на узком листе длинные имена файлов обрезаются, а на широком неудобно читать строки заметно разной длины;
2) номер строки в списке придется менять кнопками: [^], [v], [1], [last], а я считаю удобнее сразу задать номер или перетащить.

Не слышал о библиотеке FreeImage. Выясню. Но в моем случае превьюхи не помогут, они похожи как близнецы. Различать можно только по именам.

Скрипт пишу для себя, но в идеале он должен работать на МАС и РС в любой типографии, где мне придется печатать тираж. Поэтому: переносимость и сравнительно удобный интерфейс.
 
Ответ: нужен совет по JavaScript под Фотошоп

Ява так ява.

У вас должен быть список в виде простого окна достаточной ширины. Например в Script Events Manager такой есть. Можете стянуть коды.

У вас должен быть строковый массив, одномерный. И в качестве управления перемещением строк можно использовать кнопки. Я не знаю как там можно ли на них сажать сокращения, но как обычно 4 кнопок хватит. Это кнопки: переместить выделенную строку вверх, вниз на 1 позицию, и переместить ее же на верх списка или вниз списка. Обычно этого достаточно. Типичная система команд изменения Z-order'а объекта в любой дизайнерской программе.

Но ковыряться с самим списком не надо. Напишите функцию популяции (заполнения) списка из указанного массива. И оперируйте самим массивов. Переставлять местами элементы - элементарно через вспомогательный временный массив.

Таким образом у вас список возвращает индекс выбранного элемента, а соответствующая кнопка указывает функции перестановки куда выбранный элемент двигать. Всего 1 функция с парой аргументов на входе, которая модифицирует глобальный массив, а в финале запускает функцию популяции списка. Эта функция первым делом запоминает какая позиция в данный момент выбрана, находит ее в глобальном массиве, запоминает индекс, затем очищает список одной командой, затем заполняет его данными из того массива и в финале выделяет (подсвечивает) строку индекс который был запомнен.

Такая система позволяет вам бесшовно перемещать строку вверх или вниз списка или в любое место (достаточно ввести еще кнопку напротив поля Go To). Жмете раз за разом "вверх" и выделенная строка скачет вверх. С клавы, конечно, более удобно, но как там вешать шорткаты на кнопки - я не знаю. А меню там есть?
 
Ответ: нужен совет по JavaScript под Фотошоп

Ну да, вот в скрип ивент менегере простой код создания списка:

PHP:
				var lbEvents = grpGrpLeft.add( 'listbox', undefined, undefined, {multiselect: true} );
				lbEvents.preferredSize = [400, 126]; // 7 rows
				lbEvents.helpTip = strEventsHelp;


Какие там события - надо еще изучать.

Однако, если список большой, то метод описанный выше может оказаться тормозным. Тогда придется втыкать и вытыкать элементы из самого списка. Это даже проще, если список позволяет создавать элемент с указанным индексом.

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

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

Например я могу вывести почти 20-колоночный список базы данных в 40 тысяч записей и мгновенно редактировать любое поле благодаря свойствам элемента управления DataGrid.

Но посмотрев как адобский кодер устанавливает вручную отношения размеров и расположения в статическом диалоге Script Event Manager'а я просто припух!

Неужели нельзя заюзать вижуал яву для ФШ?
 
Ответ: нужен совет по JavaScript под Фотошоп

Простейший способ перемещения элемента в списке это swap через переменную. В ней запоминается содержание подсвеченного элемента в списке; сам он удаляется, а затем создается новый с соответствующим новой позиции индексом. Который и выбирается в качестве selected.

Обнаружение конца и начала списка при перемещении можно тупо ловить через ошибку чтобы не подсчитывать. :)

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

Кажется там функция популяции должна быть встроена в список:

PHP:
// Create some items to add to the list
		String	listData[] =
		{
			"Item 1",
			"Item 2",
			"Item 3",
			"Item 4"
		};

		// Create a new listbox control
		listbox = new JList( listData );
		topPanel.add( listbox, BorderLayout.CENTER );

http://www.cs.cf.ac.uk/Dave/HCI/HCI_Handout_CALLER/node143.html

Не факт что компилятор ФШ это поймет.
 
Ответ: нужен совет по JavaScript под Фотошоп

Спасибо.
Я конечно знаю как работать с массивом и выпадающим списком.
Можно сделать меню с выбором одной строки или нескольких, можно разделить список на колонки, но все упирается в ограничение длины строки. В меню каждая строка должна содержать отдельный элемент списка, а значит не получится записать длинное имя файла в несколько строк и поставить прокрутку. Я сделал группы по два объекта:
1) StaticText, multistring, содержит имя файла, причем если длинное, то я добавляю малюсенькую полоску прокрутки;
2) EditedText содержит изменяемый номер файла в этом списке.
Таким образом не нужны дополнительные кнопки: ввел новый номер и файл переставляется сразу -- в списке и в массиве. Проще ввести номер, чем несколько раз жать на кнопку.

Рассматриваю возможность перемещения группы мышкой и клавишами с клавиатуры.
Другой интересный вариант -- список из двух колонок с управляемой шириной колонки, содержащей имя файла. Тогда легко выделить строку и перетаскивать.

Не использую Script Event Manager, работаю в ExtendScript Toolkit CS4. Это вполне приличная среда программирования. Интерфейс похож на компилятор Visual C++. Ставится вместе с Фотошопом, но не по умолчанию! В комплекте описания и примеры.
 
Ответ: нужен совет по JavaScript под Фотошоп

и выпадающим списком.

Я нигде не писал про "выпадающий список". В вашем случае это будет полный пипец. Список - обычный.

Или вы все списки выпадающими называете? Выпадающий - как внизу этой страницы напротив метки "Быстрый переход". ComboBox. А обычный список - ListBox - это обычный список.

а значит не получится записать длинное имя файла в несколько строк и поставить прокрутку.

Если вы до всего будете доходить своим умом, то потратите на элементарные вещи уйму времени. В имени файла может быть 256 символов плюс 4 на точку и тип. Всего 260, значит. Кто вам мешает растянуть список на весь экран?

Проще ввести номер

Вам придется проверять что ввел оператор и сообщать что такой номер уже есть. Или как вы думаете человек отследит 63 позиции?

Тогда легко выделить строку и перетаскивать.

Забавно что вы взялись программировать вообще не понимая как эта шняга устроена. В списке НЕТ строк. Там - элементы. То есть вы не можете взять и выделить "строку" в списке от начала и до конца как это делается в текстовом боксе. Вы просто щелкаете по элементу и он становится выбранным (подсвеченным). Большинство списков (как элемент управления) поддерживают чек-боксы. Типичный список - это то самое окно Open File. По свойству типа Selected вы узнаете какой (или какие если разрешен мультиселект) элемент выбран в данный момент и есть ли выбранный вообще.

Не использую Script Event Manager

Тяжко... Этот скрипт был упомянут в качестве сырца кодов для UI списка. Это не дебугер и не компилятор. Это как и следует из названия - менегер событий в ФШ. Вы можете повешать на те или иные события свои скрипты или экшны.



Кроме того в списках строки не переносятся. Обрезаются если не влазят. Некоторые списки как элементы управления имеют встроенную подсказку для этого случая: подводите мышу к частично видному элементу и выскакивает сообщение такое маленькое - там полностью.
 
Ответ: нужен совет по JavaScript под Фотошоп

Я сделал группы по два объекта

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

Чисто спортивный интерес: чем вас не устраивает список файлов в окне Open File? Если бы там можно было перетаскивать файлы вас бы это устроило?

У меня, кстати, реализована такая штука. Список позиций на вывод можно тасовать перетаскиванием или просто запускать сортировку по номеру. Это было сделано после наблюдения за тем, что на листе лучшая печать - в центре, а по краям - гавно. Лучшие позиции (заверстывается сразу несколько штук на лист) было бы хорошо перемещать в списке так, чтобы они оказались в центре. Потратив несколько минут чтобы выяснить какие это номера, я забил их в базу, дописал коды. Теперь выбираю важные позиции в списке, жму сортировку и они оказываются в нужных местах списка, а затем и в нужных местах на печатном листе.

Все это на базе ListView - элемента управления точно таком же, какой используется в Винде для Open File и в Файловом эксплорере.
 
Статус
Закрыто для дальнейших ответов.