Скриптинг: что-то я задал в параметрах...

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

Ghost in shell

Топикстартер
15 лет на форуме
Сообщения
251
Реакции
12
Есть строка

app.documents[0].resizeImage(20, 20, 10, ResampleMethod.BICUBIC)

что означают числа 20? Лично я хочу задавать размер в пикселах.
И как задать параметр Constrain Proportions?
 
Ответ: Скриптинг: что-то я задал в параметрах...

20 единиц в тех единицах измерения, которые заданы в preferences.
В пикселях:
app.preferences.rulerUnits = Units.PIXELS
Constrain Proportions при ресайзе вычислять самостоятельно.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Спасибо. Вобщем-то я морально готов к ошибкам в книгах по программированию. Сколько не изучал, ни одна прога нормально не запускалась.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Несмотря на то, что, в инсталляционой папке Фотошопа есть масса примеров скриптов, и в том числе есть скрипт с говорящим названием - Resize.js - аффтар прикупил какой-то перевод (типа шадринского) "книги по программированию". Значит как единицы установить не знаем, но по какому программированию книга - тоже не пишем. Это коаксиально.

Цитирую Resize.js со своими комментариями:

Код:
// (c) Copyright 2005.  Adobe Systems, Incorporated.  All rights reserved.


/** "$$$/JavaScripts/ResizeOnOpen/Description=Pop the image size dialog. Pre populate the menu with 100 x 100 pixels." **/


// on localized builds we pull the $$$/Strings from a .dat file, see documentation for more details
$.localize = true;

var startRulerUnits;
var startTypeUnits;
var startDisplayDialogs;

try {
	startDisplayDialogs = displayDialogs;

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

	startRulerUnits = preferences.rulerUnits;
	startTypeUnits = preferences.typeUnits;
	
	displayDialogs = DialogModes.NO;

// Затем, вот как устанавливаются единицы измерения документов.

	preferences.rulerUnits = Units.PIXELS;

// Следующая строка это для шрифтов, для данного случая - не нужно.

	preferences.typeUnits = TypeUnits.PIXELS;

// Ниже идет проверка - имеет ли текущий документ высоту и ширину не равную 100 (пикселам). 

	if ( activeDocument.width != 100 || activeDocument.height != 100 ) {

// Вызов диалога нам не нужен. Это просто скрипт такой.

		displayDialogs = DialogModes.ALL;

// Ну вот оно, ресайзится. Кроме конечных размеров указывается разрешение 
// - в данном случае 72 ppi.

//А вот скажите - почему у вас оно равно 10???

		activeDocument.resizeImage( 100, 100, 72, ResampleMethod.BICUBIC );
		displayDialogs = DialogModes.NO;
	}

// Теперь настройки линейки восстанавливаются.

	displayDialogs = startDisplayDialogs;
	preferences.rulerUnits = startRulerUnits;
	preferences.typeUnits = startTypeUnits;

}

// Уловка ошибок. Если скрипт вывалится по ошибке, то какая-то его часть не
// будет выполнена, например та часть, где восстаналиваются настройки, поэтому в программировании предусмотрена конструкция улавливающая ошибки и выполняющая заданный внутри нее код:

catch(e) {
	// always wrap your script with try/catch blocks so you don't stop production
	// remove comments below to see error for debugging 
	// alert( e );

	if ( undefined != startDisplayDialogs ) {
		displayDialogs = startDisplayDialogs;
	}

	if ( undefined != startRulerUnits ) {
		preferences.rulerUnits = startRulerUnits;
	}

	if ( undefined != startTypeUnits ) {
		preferences.typeUnits = startTypeUnits;
	}
}

Вот и все.
 
Ответ: Скриптинг: что-то я задал в параметрах...

И как задать параметр Constrain Proportions?

Нужно получить сведения о текущих размерах картинки - в примере показано как это делается, и затем делить их на один и тот же делитель. Результат класть в аргументы функции. Но поскольку у функции resizeImage все аргументы опциональные, то можно попробовать узнать каково разрешение и изменять только его, опустив h и w, :

resizeImage( , , 72, ResampleMethod.BICUBIC );

Или узнав все параметры передавать их функции, но изменять только разрешение.

Это в случае если действительное разрешение картинки вас не колебет.

Однако в индустриальном программировании (то есть программировании от индусов), принято использовать для передачи аргументов само выражение. Например, вместо:

w=docRef.width;
h=docRef.height;
r=docRef.resolution;
new_w = w/2;
new_h = w/2;
.resizeImage(new_w, new_h, r);

Сделать так:

k = 2;
.resizeImage(docRef.width/k, docRef.height/k, docRef.resolution);

Почуйствуйте разницу.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Вообще-то нет, надо умножать. По правилам нормализации надо всегда умножать:

Код:
.resizeImage(docRef.width*k, docRef.height*k, docRef.resolution);

А коэффициент изменять от 0 в большую или меньшую сторону. Если вам нужно увеличить, то k=2; если уменьшить в два раза то k=0.5;

Это дает вот что: вместо того, чтобы иметь 2 функции - одну для увеличения, а другую для уменьшения, вы пишите ровно одну, а аргументы готовите отдельно.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Чтобы не плодить темы задам вопрос здесь:

Как получить доступ к элементу (слою или группе) на любом уровне вложения по его имени?
Или по другому: Как перебрать все элементы в документе?
 
Ответ: Скриптинг: что-то я задал в параметрах...

На каком-то форуме участник с ником socket приводил следующий код:
Код:
//Простейший скрипт по нахождению последнего в списке слоев слоя 
с именем совпадающим с введеным.

#target photoshop

var f = prompt("Type a layer name", "", "Find Layer");
if ((f != "") && (f != null)) {
	findLayerbyName(app.activeDocument);
}

function findLayerbyName(obj) {
	for( var i = 0; i < obj.artLayers.length; i++) {
		if (obj.artLayers[i].name == f) {
			activeDocument.activeLayer = obj.artLayers[i];
			break;
		}
	}
	for( var i = 0; i < obj.layerSets.length; i++) {
		if (obj.layerSets[i].name == f) {
			activeDocument.activeLayer = obj.layerSets[i];
			break;
		}
		findLayerbyName(obj.layerSets[i]);
	}
}
 
Ответ: Скриптинг: что-то я задал в параметрах...

Kuzmin сказал(а):
На каком-то форуме участник с ником socket приводил следующий код:
Огромное спасибо. Я подозревал, что без рекурсии не обойтись.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Задам еще вопрос. Так сказать на удачу.

Че я мучаюсь вот с поздним связыванием. Написал я когда-то программу с ранним связыванием и пользовался ей не зная бед, пока не вышел девятый шоп. При работе с девятым (и так далее) шопом программа вызывает какой-то ассерт и шоп захлопывается.
Код:
[B]ntdll.DbgBreakPoint:[/B]
int 3
ret
mov edi, edi 

курсор на ret

В восьмом работает абсолютно стабильно. Причем совершенно не предсказуемо - когда захотел, тогда и захлопнулся. Никто не слышал о данной проблеме?
 
Ответ: Скриптинг: что-то я задал в параметрах...

Я подозревал, что без рекурсии не обойтись

Естественно, там же: иерархия.

Насчет ассертов похоже на бред.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Zest сказал(а):
Насчет ассертов похоже на бред.
В каком месте бред? Может я не правильно выразился.
Есть факт: программа работает до восьмого включительно абсолютно стабильно. Начиная с девятого закрывает фотошоп, причем совершенно безсистемно. Если запустить из-под отладчика, то просмотр регистров дает нам строку
Код:
int 3
Спросил у программера, он сказал, что это ассерт. Утверждать не буду. Ассерт не ассерт - это не суть. Суть в том, что не работает выше восьмого. Если бы хоть был контретный участок кода, который вызывал бы такое поведение, а то же хаотично. Вот в чем беда.
Программа эта для потоковой обработки (что очевидно). Так вот если я все функции переберу на разовое исполнение, то они все работают. Но если они в циклах и комбинациях, то начинает глючить. Я думаю они ввели какой-то флак выполнения предыдущей функции. Ведь не даром начиная с девятого экшены стали быстро работать. Что-то они сделали и забыли меня предупредить.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Бред в том смысле что тема о скриптах, а вас интересует падучая модуля написанного как я понял на Си. Тут в первом мало кто понимает, а уж во втором и подавно. Набирайте в поисковике ntdll.DbgBreakPoint +photoshop и смотрите может быть есть похожие ситуации. Кроме того у вас должна быть тугоментация в виде SDK для текущей версии где скорее всего нашли отражения последние изменения.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Ведь не даром начиная с девятого экшены стали быстро работать.

Как работали так и работают. Возможно в 9-й версии по умолчанию отключена опция показа результата операции, а в предыдущих по умолчанию включена.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Zest сказал(а):
Бред в том смысле что тема о скриптах, а вас интересует падучая модуля написанного как я понял на Си. Тут в первом мало кто понимает, а уж во втором и подавно. Набирайте в поисковике ntdll.DbgBreakPoint +photoshop и смотрите может быть есть похожие ситуации. Кроме того у вас должна быть тугоментация в виде SDK для текущей версии где скорее всего нашли отражения последние изменения.
Ничего тут страшного нет. Я брал код сгенерированный ScriptListener-ом. Октрывал библиотеку типов в своем яызке (паскаль) и составлял команды на нужном мне языке. Это гораздо проще, между прочим, чем скрипты сочинять. И возможностей больше.
Вот, например, как выглядит упомянутый код (выбор слоя по имени)

Код:
Procedure PSSelectByName(LName:string);
var
  Snad,Snad2:IActionDescriptor;
  Snar:IActionReference;

begin
  Snad2:=v.MakeDescriptor;
  Snar:=v.MakeReference;
  Snar.PutName(phClassLayer,LName);
  Snad2.PutReference(phTypeNull,Snar);
  Snad2.PutBoolean(phKeyMakeVisible,0);
  Snad:=v.MakeControlObject.Play(phEventSelect,Snad2,phDialogDisplay);
end;

SDK добросовестно качаю для каждой версии. Но толку от него мало. Это SDK выглядит в виде домашнего архива. Это когда дома есть папочка, где натискано с инете всякой полезной инфы.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Приехали американцы в Италию и спрашивают прохожего: что лучше: Паскаль или Си? Прохожий ничерта не понимает по-английски и разинув улыбку бормочет: си! си!

Так вот, лучше - Бейсик.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Zest сказал(а):
Приехали американцы в Италию и спрашивают прохожего: что лучше: Паскаль или Си? Прохожий ничерта не понимает по-английски и разинув улыбку бормочет: си! си!

Так вот, лучше - Бейсик.
Дело же не в языке. Тут либо в раннем связывании, либо в этом методе, т.е. через Descriptor-ы. Пока застрял я делать через "скрипты", к тому же не нахожу такую команду как Match Color... Попробую переделать через Descriptor-ы, но с поздним связыванием. Вот и выясню точно в чем дело.
 
Ответ: Скриптинг: что-то я задал в параметрах...

Благодаря Басику никогда не интересовался тем что такое раннее/позднее связывание: в процессе отладки используется позднее, а в процессе компиляции - раннее.

SDK добросовестно качаю для каждой версии.

Смотри-ка, видать когда Адоба сделала SDK для ФШ платными мало нашлось желающих платить за этот бутер, а кто купил начал требовать разъяснений. Теперь раздают бесплатно как в старые добрые времена.
 
Статус
Закрыто для дальнейших ответов.