Это на месте по предложению 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 увеличивается, цикл вращается. Если он начнет уменьшаться, он остановится.
Я еще не закончил исполнение, но это моя первоначальная логика. Если текста много и он не заполняется в поле, вводя новые строки (при этом уменьшая размер шрифта), добиваемся заполнения всего текста. С другой стороны, если через какой-то момент количество строк начало уменьшаться, это означает, что мы слишком сильно изменили размер шрифта и его нужно добавить обратно.
Конечно, позже точку привязки и положение придется корректировать, но это уже другая тема.