Сценарии Photoshop: создание выделения, а затем подгонка текстового поля внутри - PullRequest
0 голосов
/ 12 марта 2019

Использование Javascript для Photoshop (ExtendScript) Я пытаюсь создать динамическое текстовое поле.

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

Таким образом, независимо от размеров нижних 10% (созданных аргументом resizeCanvas), текст всегда удобно помещается в нем. Поэтому, когда пользователь добавляет несколько слов, он не выглядит слишком маленьким, а когда он добавляет более длинное предложение, он не переполняется.

Вопрос, изначально заданный здесь (с картинками) https://forums.adobe.com/message/10952562#10952562

Пример начального изображения:

стартовое изображение

Всплывающее окно:

пользовательское всплывающее окно

Маленький текстовый результат:

outcome1

Длинный текст Результат:

результат 2

Вот где я сейчас нахожусь:

#target Photoshop  
  
app.preferences.rulerUnits = Units.PIXELS;  
app.preferences.typeUnits = TypeUnits.PIXELS;  
var doc = app.activeDocument;  
var hgt10 = doc.height / 10;  
var FillColor = new SolidColor;  
FillColor.rgb.hexValue = 'ff0000';  
var newHgt = doc.height + hgt10  
doc.resizeCanvas(doc.width, newHgt, AnchorPosition.TOPCENTER);  
  
  var win = new Window('dialog', "Custom Text");  
  var grp1 = win.add('group');  
  grp1.alignChildren = "top";  
  var txt = grp1.add('edittext', [0, 0, 300, 150], "Write your message", {multiline: true, scrolling: true});  
  txt.active = true;  
  var grp2 = win.add('group');  
  var goBtn = grp2.add('button', undefined, "Run");  
  grp2.add('button', undefined, "Cancel");  
    
  var newLyr = doc.artLayers.add();  
  newLyr.kind = LayerKind.TEXT;  
  // CONTENTS  
  var txtLyr = newLyr.textItem  
  txtLyr.font = "ArialMT"  
  txtLyr.contents = txt.text  
  var uV = new UnitValue(20,'mm')  
  txtLyr.size = UnitValue(25,'mm')  
  txtLyr.color = FillColor;  
  txtLyr.position = [25, 2200] // x, y - Need to fix position to fit in the lower 10%  
  
  goBtn.onClick = function() {  
    win.close();   
  }  
  
win.show();     

Итак, области, в которых я хотел бы получить помощь:

1) Получение текста для размещения в новой области (созданной аргументом resizeCanvas, расширяющимся на 10%)

2) Добавление разрывов строк и автоматическое определение размера для размещения текстовых файлов различной длины в поле.

С уважением,

1 Ответ

0 голосов
/ 12 марта 2019

Чтобы добавить разрывы строк, замените все \n s на \r s (по крайней мере, для Windows у меня есть ощущение, что для этой версии Mac может потребоваться что-то еще, но я не уверен):

txtLyr.contents = txt.text.replace(/\n/gm, '\r')

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

var lines = txt.text.split('\n'); //getting the number of lines
var maxSize = hgt10 / lines.length; //calculating max size for a line (including the leading) = 10% of doc height devided by lines number
newLyr.textItem.useAutoLeading = true // making sure that text uses autoleading
var leading = newLyr.textItem.autoLeadingAmount; //autoleading value is in % of text size
maxSize = maxSize / leading * 100; // recalculating text size based on leading in pixels
txtLyr.size = maxSize;
txtLyr.position = [25, originalDocHeight + maxSize]

Результат с одной строкой и несколькими строками:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...