Skip to main content
Egor Chistyakov
Inspiring
September 27, 2017
Answered

How to snap/round gradient rotation and stops?

  • September 27, 2017
  • 2 replies
  • 1101 views

Sometiems I need to massively shake up gradient fiils — make angles rounded and position stops at multiples of, for example, five.

I'm trying to conjure up a script for this, and immidiately stopped at this part:

var NewFill = Math.round(OldFill.rotate / 5) * 5;

OldFill.rotate(NewFill, 0, 0, 1, 0);

What is wrong with it?

This topic has been closed for replies.
Correct answer Egor Chistyakov

Figured that out. RTFM.

thisDocument = app.activeDocument;

docSelection = thisDocument.selection;

selectionLen = docSelection.length;

for (i = 0; i < selectionLen; i++) {

    oldFill = docSelection;

    if (oldFill.typename == "PathItem" || oldFill.typename == "CompoundPathItem") {

        checkPath = oldFill;

        if (oldFill.typename == "CompoundPathItem") {

            checkPath = oldFill.pathItems[0];

        }

        if (checkPath.filled == true && checkPath.fillColor.typename == "GradientColor") {

            if (checkPath.fillColor.gradient.type == GradientType.LINEAR) {

                //make rotation multiple of 5

                var angleVal = prompt("Make angle of gradients to be multiple of:","5","Gradient Angle")

                var oldAngle = checkPath.fillColor.angle;

                var newAngle = (Math.round(oldAngle / angleVal)) * angleVal;

                var angleDiff = newAngle - oldAngle;

                oldFill.rotate(angleDiff, 0, 0, 1, 0);

                //make stops position at multiple of 5

                var stopVal = prompt("Make gradient stops position at multiple of:","5","Gradient Stops")

                var numOfStops = checkPath.fillColor.gradient.gradientStops.length;

                for (k = 0; k < numOfStops; k++) {

                    var oldRamp = checkPath.fillColor.gradient.gradientStops.rampPoint;

                    var newRamp = (Math.round(oldRamp / stopVal)) * stopVal;

                    checkPath.fillColor.gradient.gradientStops.rampPoint = newRamp;

                }

            }

        }

    }

}

2 replies

Disposition_Dev
Legend
September 27, 2017

Glad we were able to help.

Egor Chistyakov
Inspiring
September 28, 2017

You know how this works sometimes

Disposition_Dev
Legend
September 28, 2017

I certainly do. many times trying to explain an issue to someone who's never seen the project is enough to pull yourself out of whatever funk you're in and allow you to see a new perspective.

Egor Chistyakov
Inspiring
September 27, 2017

I'm a dumbass, I'm trying to divide a function.

Well, then, how to READ current angle of gradient fill with JS? I know well how to set it, but I need to know it first to change it.

Egor Chistyakov
Egor ChistyakovAuthorCorrect answer
Inspiring
September 27, 2017

Figured that out. RTFM.

thisDocument = app.activeDocument;

docSelection = thisDocument.selection;

selectionLen = docSelection.length;

for (i = 0; i < selectionLen; i++) {

    oldFill = docSelection;

    if (oldFill.typename == "PathItem" || oldFill.typename == "CompoundPathItem") {

        checkPath = oldFill;

        if (oldFill.typename == "CompoundPathItem") {

            checkPath = oldFill.pathItems[0];

        }

        if (checkPath.filled == true && checkPath.fillColor.typename == "GradientColor") {

            if (checkPath.fillColor.gradient.type == GradientType.LINEAR) {

                //make rotation multiple of 5

                var angleVal = prompt("Make angle of gradients to be multiple of:","5","Gradient Angle")

                var oldAngle = checkPath.fillColor.angle;

                var newAngle = (Math.round(oldAngle / angleVal)) * angleVal;

                var angleDiff = newAngle - oldAngle;

                oldFill.rotate(angleDiff, 0, 0, 1, 0);

                //make stops position at multiple of 5

                var stopVal = prompt("Make gradient stops position at multiple of:","5","Gradient Stops")

                var numOfStops = checkPath.fillColor.gradient.gradientStops.length;

                for (k = 0; k < numOfStops; k++) {

                    var oldRamp = checkPath.fillColor.gradient.gradientStops.rampPoint;

                    var newRamp = (Math.round(oldRamp / stopVal)) * stopVal;

                    checkPath.fillColor.gradient.gradientStops.rampPoint = newRamp;

                }

            }

        }

    }

}