Текст — Сценарии After Effects: Размер Шрифта Изменен На Boxtextsize. Оптимизация Сценария.

  • Автор темы Canu
  • Обновлено
  • 23, Oct 2024
  • #1

Мне нужна помощь в улучшении и оптимизации сценария.

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

  function textResize(v,n){

var myComp = v;

var myTextLayer = myComp.layer(n);

var myText = myTextLayer.sourceText.value;

var orgText = myText.text;

var textBoxSurface = myText.boxTextSize[0]*myText.boxTextSize[1];

var textPixel = myTextLayer.sourceRectAtTime(0,false);

var textPixelSurface = textPixel.height*textPixel.width;

myText.text = "W";

myText.fontSize = 20;

myTextLayer.sourceText.setValue(myText);

textPixel = myTextLayer.sourceRectAtTime(0,false);

textPixelSurface = textPixel.height*textPixel.width;

while ((  Math.round((textBoxSurface/textPixelSurface))  >=  Math.round(orgText.length)  ) ){

myText.fontSize = myText.fontSize +1;

myTextLayer.sourceText.setValue(myText);

textPixel = myTextLayer.sourceRectAtTime(0,false);

textPixelSurface = textPixel.height*textPixel.width;

}

myText.text = orgText;

myTextLayer.sourceText.setValue(myText);

}
 

это все еще неточно, и даже размер шрифта достигает своего предела (1296)!

#текст #adobe-after-effects #скрипт #оптимизация

Canu


Рег
11 Nov, 2005

Тем
96

Постов
218

Баллов
698
  • 26, Oct 2024
  • #2

Это на месте по предложению Silly-V. Я искал подобное решение и попытался использовать

 
 function getActualTextSize(layer) {

var textProp = layer.property('Source Text')

var textDocument = textProp.value

var baselineArray = textDocument.baselineLocs

var boxTextPos = textDocument.boxTextPos

var textBoxInvisibleAnchorY = Math.abs(boxTextPos[1])

var lastBaselineIndex = baselineArray[baselineArray.length - 3]

// we add 10 at the end to adjust for descenders

return Math.floor(baselineArray[lastBaselineIndex] + textBoxInvisibleAnchorY + 10)
}

function autosizeText(textLayer) {

var textProp = textLayer.property('Source Text')

var textDocument = textProp.value

//  GET THE BASELINE LOCATIONS OF THE TEXT

var baselineArray = textDocument.baselineLocs

// GET BOXTEXPOS

var boxTextPos = textDocument.boxTextPos

var textBoxInvisibleAnchorX = Math.abs(boxTextPos[0])

var textBoxInvisibleAnchorY = Math.abs(boxTextPos[1])

var boxTextSize = textDocument.boxTextSize

// GET THE MASK DIMENSIONS

var theMaskPath = selection[0].property('Masks').property('Mask1').maskPath

var theMaskShape = theMaskPath.value

var theMaskVertices = theMaskShape.vertices

var maskHeight = theMaskVertices[2][1] - theMaskVertices[1][1] // bottom left Y - top left y

// NOW WE GET THE ACTUAL HEIGHT OF THE TEXT IN THE TEXTBOX.

var lastBaselineIndex = baselineArray[baselineArray.length - 3]

var actualTextHeight = Math.floor(baselineArray[lastBaselineIndex] + textBoxInvisibleAnchorY)

if (actualTextHeight > maskHeight) {

while (actualTextHeight > maskHeight) {

textDocument.fontSize -= 1

textProp.setValue(textDocument)

actualTextHeight = getActualTextSize(selectedLayer)

}

}
}

var selection = app.project.activeItem.selectedLayers
var selectedLayer = selection[0]
autosizeText(selectedLayer)
 
. Basically, an array means, as per documentation

line0.start_x, line0.start_y, line0.end_x, line0.end_y, line1.start_x, line1.start_y, line1.end_x, line1.end_y ... lineN-1.start_x, lineN-1.start_y, lineN-1.end_x, lineN-1.end_y

При этом каждые 4 числа массива объявляют одну строку.

Соответственно, что я сделал:

Во время цикла while размер шрифта уменьшен на X.

Проверено изменение размера массива baselinesLoc.

В зависимости от того, есть ли изменения или нет, установите временную переменную состояния. Который управляет циклом while. Пока baselineLocs увеличивается, цикл вращается. Если он начнет уменьшаться, он остановится.

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

Конечно, позже точку привязки и положение придется корректировать, но это уже другая тема.

 

Acerbial


Рег
28 Aug, 2006

Тем
63

Постов
207

Баллов
532
  • 26, Oct 2024
  • #3

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

Мне наконец удалось заставить что-то работать через скрипт. Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать!

baselineLocs
 

Den_t


Рег
28 Dec, 2004

Тем
74

Постов
193

Баллов
603
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно