Диалоговое окно

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

chesen

Топикстартер
20 лет на форуме
Сообщения
553
Реакции
49
В диалоговом окне по умолчанию стоит отображение файлов списком. Может, и бывают случаи когда это удобно, но "эскизы страниц" практичнее. Каждый раз приходится переключать вид отображения "ноготков". Как заставить окно диалога запомнить вид отображения, ведь с эксплорером винды он не связан?
З.Ы. "Бриджем"не пользуюсь по религиозным соображениям.
 
Ответ: Диалоговое окно

chesen сказал(а):
... Как заставить окно диалога запомнить вид отображения, ведь с эксплорером винды он не связан?...


Не по теме:
А что вам удалось заставить Explorer (Проводник) запоминать вид отображения файлов для приложений Windows, когда они его используют, скажем, для обращения к файлам?
 
Ответ: Диалоговое окно

В самом деле не по теме...
 
Ответ: Диалоговое окно

Проводник может запоминать виды отображения для каждой папки (в том числе порядок сортировки) и делает это если включена одноименная опция в настройках отображения папок.

Но связанный с Проводником Общий Диалог этого не поддерживает. Из кодов собственного приложения можно хакнуть Винду переключая вид отображения в Common Dialog, но делать это для сторонней апликухи - геморрой.

Предлагаю активировать в префсах ФШ опцию File Handling > Enable Version Cue Workgroup File Management - которая доступна если установлен этот самый Вершн Кю. Затем вызвать окно открытия файла и нажать появившуюся слева внизу кнопку Use Adobe Dialog. В котором и выбрать Thumbnails в списке видов. Адобский диалог их запоминает. См. аттач.

Но ведь нельзя чтобы хорошо было - и адобский диалог имеет опцию сортировки только по Name, Size, Type. Никакой Date Created, Date Modified нет в помине. Кроме того ноготки делаются адобскими методами, которые как обычно тормознее микрософтовских (какое-то кривое кэширование). Ноготки для psd не делаются, и нет окошка Preview. То есть пзд придется открывать "вслепую". Список слева это Favorites, а не Treeview, то есть перемещаться по дереву папок вы будете тоже "вслепую" - как в Нортон Командире. Короче за одну конфетку - кучка говна впридачу.

Поэтому рекомендую делать наоборот - открывать Проводник, включать там вид на ноготки (досл. thumbnails) и перетаскивать файлы из его окна в окшн ФШ для чего уменьшить размер окна Проводника.

Если Проводник распахнут на все окно и без этого никак не обойтись - перетаскивать на его кнопку в списке задач. То есть тащите файл на кнопку, но не бросаете его там, а задерживаетесь пока окно целевого приложения не активируется - не отпуская кнопки перетаскиваете файл в его окно и готово.

В прежних версиях ФШ так можно было перетаскивать файлы прямо из окна диалога открытия файлов - так нет же, сцуки зарубили эту возможность в новых версиях.
 

Вложения

  • adobedialog.jpg
    adobedialog.jpg
    87.5 КБ · Просм.: 822
Ответ: Диалоговое окно

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

Можно ли назначить (сторонней прогой) клавиши для переключения отображения?
Кстати, я файлы гоняю в поле шопа, работая кнопками Alt-Tab. При определенной сноровке другие способы отрицаются...
 
Ответ: Диалоговое окно

Если у вас Виста, то отображение файлов в диалоге открытия зависит от настройки свойств конкретной папки: включите Pictures и будут ноготки.

Если ХР то:

Chap. 11 (Windows Explorer for Experts),
Choosing View Options,
Changing Views in Common Dialog Boxes:
(page 424, in the (2003) Deluxe Ed.)

The common dialog boxes open in List view by default in all
but certain folders. Unfortunately you can't make a view change
for a particular folder persistent. You can switch from List to
Detailed view when you open a file , for example, but the next
time you open a file, you'll be back at List view again.

В основном желают отображения таблицей (details) и это понятно. Для таблицы есть хаки в виде отдельных приложений, а для ноготков не нашел.

Но если к ноготкам в диалоге открытия вас принуждает скрипт - так переключитесь на адобский диалог, в чем проблема-то?
 
Ответ: Диалоговое окно

Скрипт не работает с адобским диалогом. А чтоб его переделать, моих дарований не хватит.Да там с полсотни скриптов- прога "Pixel Creator ".
 
Ответ: Диалоговое окно

Угребище этот Пихел Криейтор. И делает такое же.

Организацией процесса и легкой автоматизацией экшнами можно делать получше и без этого геморроя.

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

Например типичная задача расставить фотки разного размера: включаете Smart Guldes (View > Show > Smart Guides). Фотки одинакового размера расставляются вообще командой распределения - Layer > Distribute - за два щелчка: одним выравниваете по центру, вторым расставляете предварительно перетащив одну из фоток в противоположное крайнее положение на листе.

Накидать пачку фоток из указанной папки и замаскировать их векторной маской - тривиальная задача автоматизации: Actions + Batch.

Кроме того есть Variables которые имеет смысл использовать когда фотки в монтаже с подпиями. Если имена файлов фоток это текст подписей, например TULIP.jpg - TULIP, то можно написать простейший скрипт для Микрософт Ёкзеля на его VBA чтобы делать из списка файлов Data Set для Variables.

Поскольку такие имена надо когда-то вводить вручную, то можно сделать наоборот - сначала создать список подписей, а затем сопоставить имена файлов с помощью опять же простейшего скрипта хоть в среде ФШ, хоть в том же Ёкзеле.

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

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

Я приблизительно так и работаю. Пиксел хочу использовать для тупой раскладки свадебных альбомов и то для репортажных страниц.На большее он не годится.
 
Ответ: Диалоговое окно

К вопросу о скриптах.Можно ли скриптом подогнать вставляемый документ под выделение или активную маску слоя?
Собственно из-зо этого юзаю "Угребище этот Пихел Криейтор"
 
Ответ: Диалоговое окно

Стандартная команда Paste Into?

В скрипте тоже самое: activeDocument.paste(intoSelection); - аргумент intoSelection может принимать значение true или false. Если true и если есть селекция - вставляется в нее. То есть появляется слой с готовой слоевой маской не связанной со слоем.

Можно и определять габариты селекции, изменять размер указанного изображения под нее и перемещать в тоже самое место.
 
Ответ: Диалоговое окно

Однако вы как именно хотите? У вас же размер селекции изображенной рукой может не совпадать с размером вставляемой картинки. Следовательно надо решить как ее вставлять: клиповать или вмещать по какой-то стороне.

Ниже скрипт который втискивает вставку в селекцию:

Код:
#target photoshop
app.bringToFront();

app.preferences.rulerUnits = Units.PIXELS;

var doc = app.activeDocument;
var bnds = getSelectionBounds(doc);
var w = bnds[2]-bnds[0];
var h = bnds[3]-bnds[1];

doc.selection.deselect();

var l = doc.paste(false);
var lbnd = l.bounds;
for (var i = 0; i < lbnd.length; i++) { 
  lbnd[i] = lbnd[i].value; 
    } 
var lw = lbnd[2]-lbnd[0];
var lh = lbnd[3]-lbnd[1];

l.resize((w/lw)*100, (h/lh)*100, AnchorPosition.TOPLEFT);
var k = 72/doc.resolution; // из-за бага translate в ЦС2
l.translate((bnds[0]-lbnd[0])*k, (bnds[1]-lbnd[1])*k);

function getSelectionBounds(doc) { 
    var l = doc.artLayers.add(); 

    doc.selection.fill(app.foregroundColor); 
    var bnds = l.bounds; 
	l.remove();
  
    for (var i = 0; i < bnds.length; i++) { 
      bnds[i] = bnds[i].value; 
    } 
    return bnds; 
}

У вас, кстати, CS2 или 3?
 
Ответ: Диалоговое окно

CS2. Преимущество скрипта в том, что слой можно назвать именем соотв. файла, что облегчает дальнейшую работу.
За скрипт спасибо!
 
Ответ: Диалоговое окно

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

Код:
// remember unit settings and change to pixels
						var originalRulerUnits = preferences.rulerUnits;
						preferences.rulerUnits = Units.PIXELS;
						
						// restore original unit setting
						preferences.rulerUnits = originalRulerUnits;
						

					// open documents from list; get document name; duplicate to new document; close;
					// name layer in new document using the original document name
					
					var docRef = app.activeDocument;
					var docName = docRef.name; 					
					docRef.changeMode(ChangeMode.RGB);
					docRef.activeLayer.duplicate(documents[0],ElementPlacement.PLACEATBEGINNING);
					docRef.close(SaveOptions.DONOTSAVECHANGES);
					documents[0].activeLayer.name = docName.substring(0, docName.lastIndexOf("."));
 
Ответ: Диалоговое окно

Ниче не понял. Если по короткой стороне селекции то останется пустое место в ее границах. Как делать экшном трансформ после этой вставки - тоже не понял.

В общем вот скрипт который копирует активный слой активного документа в целевой документ, который должен быть в списке Window первым, то есть иметь индекс 0. Скопированный слой уменьшается до размеров габаритов селекции по большей ее стороне с сохранением пропорций. К нему добавляется слоевая маска по селекции, отсоединяется (unlink) и сразу можно двигать слой внутри маски.

Поскольку код получился длинный, то можете скачать его в виде файла из вложения.

Код:
// ЗАТАЛКИВАЕТ АКТИВНЫЙ СЛОЙ АКТИВНОГО ДОКУМЕНТА
// В ГРАНИЦЫ СЕЛЕКЦИИ ЦЕЛЕВОГО ДОКУМЕНТА КОТОРЫЙ 
// ДОЛЖЕН БЫТЬ В СПИСКЕ Window ПЕРВЫМ
// ДЛЯ ФШ ВЕРСИИ CS2!!!

#target photoshop
app.bringToFront();

// целевой документ должен быть первым с списке Window
// если он активный то скрипт не выполняется
if (documents[0] != app.activeDocument) {

	// целевой документ
	var doc0 = documents[0];
	
	// есть ли селекция в целевом документе
	if (hasSelection(doc0)) {
		
		// remember unit settings and change to pixels
		var originalRulerUnits = app.preferences.rulerUnits;
		app.preferences.rulerUnits = Units.PIXELS;

		var bnds = getSelectionBounds(doc0); // габариты 
		var w = bnds[2]-bnds[0]; // ширина
		var h = bnds[3]-bnds[1]; // высота

		// активный документ
		var doc = app.activeDocument;
		doc.changeMode(ChangeMode.RGB);
		// имя файла без расширения
		var docName = doc.name.substring(0, doc.name.lastIndexOf("."));

		var l = doc.activeLayer.duplicate(doc0,ElementPlacement.PLACEATBEGINNING);
		doc.close(SaveOptions.DONOTSAVECHANGES);
		app.activeDocument = doc0;
		l.name = docName;

		var lbnd = l.bounds;
		for (var i = 0; i < lbnd.length; i++) { 
		  lbnd[i] = lbnd[i].value; 
		} 

		var lw = lbnd[2]-lbnd[0]; // ширина слоя
		var lh = lbnd[3]-lbnd[1]; // высота слоя

		var kw = (w/lw)*100;
		var kh = (h/lh)*100;

		// коэффициент масштабирования:
		// по короткой стороне выделения: kw > kh
		// по длинной: kw < kh
		if (kw < kh) { var km = kh} else { var km = kw};

		l.resize(km, km, AnchorPosition.TOPLEFT);
		var k = 72/doc0.resolution; // из-за бага translate в ЦС2
		l.translate((bnds[0]-lbnd[0])*k, (bnds[1]-lbnd[1])*k);
		
		// восстановить селекцию
		doc0.selection.select(new Array (
			new Array(bnds[0],bnds[1]),
			new Array(bnds[2],bnds[1]), 
			new Array(bnds[2],bnds[3]), 
			new Array(bnds[0],bnds[3])),
			SelectionType.REPLACE, 0, false);

		// добавить слоевую маску по селекции
		addMaskFromSelection();

		// снять связь с маской (unlink)
		linkLayerMask(false);

		// restore original unit setting
		preferences.rulerUnits = originalRulerUnits;
		
	} else {
		alert("Целевой документ не имеет селекции");
	}

} else {
	alert("Целевой документ не может быть активным");
}

function hasSelection(doc0){ 
	var doc=app.activeDocument;
	app.activeDocument = doc0;
	try { 
	doc0.selection.contract(0); // From Xbytor 
	} catch (err) { 
	  return false;
	}
	doc0.activeHistoryState = doc0.historyStates[doc0.historyStates.length-1]; 
	app.activeDocument = doc;
	return true; 
} 

function getSelectionBounds(doc) { 
	var doc0 = app.activeDocument;
	app.activeDocument = doc;
    var l = doc.artLayers.add(); 

    doc.selection.fill(app.foregroundColor); 
    var bnds = l.bounds; 
	l.remove();
  
    for (var i = 0; i < bnds.length; i++) { 
      bnds[i] = bnds[i].value; 
    } 
	doc.selection.deselect();
	app.activeDocument = doc0;
    return bnds; 
} 

function addMaskFromSelection() {
	var desc = new ActionDescriptor();
	desc.putClass( 1316429856, 1130917484 );
	var ref = new ActionReference();
	ref.putEnumerated( 1130917484, 1130917484, 1299409696 );
	desc.putReference( 1098129440, ref );
	desc.putEnumerated( 1433628263, 1433629261, 1383492691 );
	executeAction( 1298866208, desc, DialogModes.NO );	
}

function linkLayerMask(bool){
	var desc = new ActionDescriptor();
	var ref = new ActionReference();
	ref.putEnumerated( 1283027488, 1332896878, 1416783732 );
	desc.putReference( 1853189228, ref );
	var desc1 = new ActionDescriptor();
	desc1.putBoolean( 1433629299, bool );
	desc.putObject( 1411391520, 1283027488, desc1 );
	executeAction( 1936028772, desc, DialogModes.NO );
	returnToLayer();
}

function returnToLayer() {
	var savedLayerRef = app.activeDocument.activeLayer;
	app.activeDocument.activeLayer = app.activeDocument.artLayers[app.activeDocument.artLayers.length - 1];
	app.activeDocument.activeLayer = savedLayerRef;
}
 

Вложения

Ответ: Диалоговое окно

Вместо того, чтобы брать размеры вставляемого документа как размеры будущего слоя, я беру именно размеры вставленного слоя, что позволит произвести предварительное кадрирование в документе-источнике. То есть выделяете нужную часть, копируете в слой - Ctrl+J - и затем запускаете скрипт. Именно то, что было ранее вырезано - будет вставлено, измерено и загнано в селекцию.

В принципе можно добавить такую команду в скрипт - вырезание в слой по имеющейся селекции (с проверкой если имеется).
 
Ответ: Диалоговое окно

И еще. Для точного позиционирования в префсах должно быть выбрано для Point/Pica Size - PostScript 72 points/inch. Можно в скрипте проверять эту настройку, но у меня используется константа - 72. Причем это сугубо для обхода бага с методом translate в ФШ ЦС2.

---

Образцы для некоторых функций взяты с сайта http://www.ps-scripts.com о котором я тут не раз упоминал. Готовое в ЦС2 не работает, потому что на дворе уже ЦС4.
 
Ответ: Диалоговое окно

Работает, но почему-то, если селекция с поворотом, к примеру на 30 градусов, то скрипт её выравнивает зачем-то.
Для ЦС3, как я понимаю, будут отличия в обратном порядке работы с открытыми документами?
 
Ответ: Диалоговое окно

Не должно быть поворотов - этот скрипт работает только с прямоугольной селекцией координаты которой совпадают с ее габаритами.

Какая разница собственно что поворачивать - селекцию или слой? То есть какой смысл поворачивать область селекции ДО, не видя картинки, если саму картинку можно повернуть ПОСЛЕ перетаскивания в целевой документ?

Я вижу только один - вы подбираете картинки к тому или иному месту и приходится их поворачивать чтобы глянуть как оно будет.

Так сделайте шаблон из смарт-объектов и заменяйте содержимое смартов не открывая их - командой Replace Content.

---

Насчет поворотов селекции: прямоугольная селекция это частный случай от множества возможных форм. Каждая из которых описывается координатами которые в свою очередь состоят из пары XY. Даже если получить массив координат селекции, то об угле поворота придется судить по тригонометрическим расчетам - готовых данных поворота программа не предоставляет.

А вот смарт сохраняет эти данные. То есть вы всегда можете посмотреть на какой угол он повернут. А также на какие проценты масштабирован и пропорционально ли.
 
Статус
Закрыто для дальнейших ответов.