Skip to main content
Known Participant
October 18, 2024
Question

Espacement entre les lettres en fonction de la largeur de la composition

  • October 18, 2024
  • 1 reply
  • 420 views

Bonjour,
J'ai un très grand nombre phrases (plus d'une centaine) qui s'enchainent à intervales régulières dans une compo. Les phrase n'étant pas toutes de la même longueur, la largeur de la compo est réglée sur la plus longue d'entre elles. 
Mais je souhaiterais que toutes les phrases, en jouant sur l'espacement entre les lettres, aient la même longueur : celle de la composition.
Connaissez-vous un script ou une expression qui permettrait de faire cela, svp ?

This topic has been closed for replies.

1 reply

Legend
October 19, 2024

Je viens de tester, je ne sais pas si c'est intéressant, le script a mis 2 minutes pour modifier 10 lignes.

Pour 100 lignes, il faut compter au moins 20 minutes

et la valeur max du tracking est limitée à 1000 donc si tu as des phrases courtes, ça risque de poser problème.

 

 

 

 

 

Known Participant
October 19, 2024
Legend
October 19, 2024

Je l'ai optimisé un peu et je suis tombé à 20 secondes pour 10 lignes 

Il suffit de sélectionner un calque de texte et exécuter le script:

 

Text_Tracking_to_Comp_Width_Adjuster.jsx

 

var project = app.project;
var activeComp = project.activeItem;

if (activeComp && activeComp.selectedLayers.length > 0) {
    var selectedTextLayer = activeComp.selectedLayers[0];
    
    if (selectedTextLayer.property("Source Text")) {
        app.beginUndoGroup("Adjust Text Tracking");
        var duplicatedLayer = selectedTextLayer.duplicate();
        duplicatedLayer.enabled = false;
        var originalTextDocument = selectedTextLayer.property("Source Text").value;
        var originalText = duplicatedLayer.property("Source Text").value;
        var lines = originalTextDocument.toString().split('\r');
        var startRange = 0;
        var defaultTrackingValue = originalTextDocument.tracking;
        var maxTrackingValue = 1000;

        for (var i = 0; i < lines.length; i++) {
            originalText.text = lines[i];
            duplicatedLayer.property("Source Text").setValue(originalText);

            var trackingValue = originalText.tracking;
            var currentIteration = 1;
            var bigStep = 10;
            var smallStep = 1;
            var maxIterations = maxTrackingValue / bigStep + bigStep * smallStep;

            while (duplicatedLayer.sourceRectAtTime(0, false).width < activeComp.width && currentIteration < maxIterations) {
                trackingValue += bigStep;

                if (trackingValue > maxTrackingValue) {
                    trackingValue = maxTrackingValue;
                    break;
                }

                originalText.tracking = trackingValue;
                duplicatedLayer.property("Source Text").setValue(originalText);

                if (duplicatedLayer.sourceRectAtTime(0, false).width > activeComp.width) {
                    trackingValue -= bigStep; 
                    originalText.tracking = trackingValue;
                    duplicatedLayer.property("Source Text").setValue(originalText);

                    while (duplicatedLayer.sourceRectAtTime(0, false).width < activeComp.width && currentIteration < maxIterations) {
                        trackingValue += smallStep;

                        if (trackingValue > maxTrackingValue) {
                            trackingValue = maxTrackingValue;
                            break;
                        }

                        originalText.tracking = trackingValue;
                        duplicatedLayer.property("Source Text").setValue(originalText);

                        if (duplicatedLayer.sourceRectAtTime(0, false).width > activeComp.width) {
                            originalText.tracking = trackingValue - smallStep;
                            duplicatedLayer.property("Source Text").setValue(originalText);
                            break;
                        }
                        currentIteration++;
                    }
                    break;
                }
                currentIteration++;
            }

            originalTextDocument.characterRange(startRange, startRange + originalText.toString().length).tracking = originalText.tracking;
            selectedTextLayer.property("Source Text").setValue(originalTextDocument);
            originalText.tracking = defaultTrackingValue;
            duplicatedLayer.property("Source Text").setValue(originalText);
            startRange += originalText.toString().length + 1;
        }
        duplicatedLayer.remove();
        app.endUndoGroup();
    }
}