Highlighted

## Script to rotate selected objects by random increments of your choice

Engaged ,
Nov 02, 2020

Copied

Just in case anyone's making patterns or something.

I wrote this tiny script that rotates all selected objects by random increments of 60 degrees, or 90, or whatever you want. It makes use of modulo for efficiency.

Free to use and share.

Please post to this thread anything you create with it as I believe it could produce some interesting patterns, mazes, etc. If you can find a way to do the same thing using just AI native tools please share your technique here.

Any bugs / feedback please also post here so I can improve the script.

First, a section of a seamless pattern I made just now using 3 hexagonal tiles and a few tricks (custom line profiles, Roughen filter, etc).

Enjoy!

``````// Script to rotate all selected objects by set increments with the intention that it will be useful for the generation of pattern tiles. Copyright runninghead.com 2020. If you use this script please send me examples of your work, I'd love to see what you can do with it! Any suggestions / bug reports welcome.

// NOTE: Does not currently work through Groupings, so Ungroup your objects before running this script!

nSel = aSel.length;// number of objects currently selected in illustrator
increment = Number(prompt("Rotation degree increments (30, 45, 60, 90, etc?)", 60));

for(i=0; i<nSel; i++)
{
randomAngle = Math.floor(Math.random()*360);
rotationAngle = randomAngle - (randomAngle % increment);
aSel[i].rotate(rotationAngle, rotationAngle);
}

// end of script``````

Contributor
| Contributor

I like the pattern! Clever choice of hexagonal cells I think. Would you mind posting a screen shot of the 3 hexes you used?

Also, not a bug, but just for seeing different ways of scripting, here's how I would start your script if I wrote it:

``````var items = app.activeDocument.selection;

// then, I'd use items.length here
for (var i=0; i<items.length; i++) {``````

Also, the rotate method just needs the angle parameter once, eg. pathItem.rotate(60).

Thanks for sharing!

TOPICS
Scripting

Views

204

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more

## Script to rotate selected objects by random increments of your choice

Engaged ,
Nov 02, 2020

Copied

Just in case anyone's making patterns or something.

I wrote this tiny script that rotates all selected objects by random increments of 60 degrees, or 90, or whatever you want. It makes use of modulo for efficiency.

Free to use and share.

Please post to this thread anything you create with it as I believe it could produce some interesting patterns, mazes, etc. If you can find a way to do the same thing using just AI native tools please share your technique here.

Any bugs / feedback please also post here so I can improve the script.

First, a section of a seamless pattern I made just now using 3 hexagonal tiles and a few tricks (custom line profiles, Roughen filter, etc).

Enjoy!

``````// Script to rotate all selected objects by set increments with the intention that it will be useful for the generation of pattern tiles. Copyright runninghead.com 2020. If you use this script please send me examples of your work, I'd love to see what you can do with it! Any suggestions / bug reports welcome.

// NOTE: Does not currently work through Groupings, so Ungroup your objects before running this script!

nSel = aSel.length;// number of objects currently selected in illustrator
increment = Number(prompt("Rotation degree increments (30, 45, 60, 90, etc?)", 60));

for(i=0; i<nSel; i++)
{
randomAngle = Math.floor(Math.random()*360);
rotationAngle = randomAngle - (randomAngle % increment);
aSel[i].rotate(rotationAngle, rotationAngle);
}

// end of script``````

Contributor
| Contributor

I like the pattern! Clever choice of hexagonal cells I think. Would you mind posting a screen shot of the 3 hexes you used?

Also, not a bug, but just for seeing different ways of scripting, here's how I would start your script if I wrote it:

``````var items = app.activeDocument.selection;

// then, I'd use items.length here
for (var i=0; i<items.length; i++) {``````

Also, the rotate method just needs the angle parameter once, eg. pathItem.rotate(60).

Thanks for sharing!

TOPICS
Scripting

Views

205

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 02, 2020 1
12 Replies 12
Contributor ,
Nov 02, 2020

Copied

I like the pattern! Clever choice of hexagonal cells I think. Would you mind posting a screen shot of the 3 hexes you used?

Also, not a bug, but just for seeing different ways of scripting, here's how I would start your script if I wrote it:

``````var items = app.activeDocument.selection;

// then, I'd use items.length here
for (var i=0; i<items.length; i++) {``````

Also, the rotate method just needs the angle parameter once, eg. pathItem.rotate(60).

Thanks for sharing!

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 02, 2020 0
Contributor ,
Nov 02, 2020

Copied

And here's another approach to calculating the rotation angle. I've only tested on a calculator, so let me know if it doesn't work right for your use.

``````// gives a number between 0 and 5 for increment = 60
var rotationIndex = Math.floor(Math.random * (360 / increment - 1));

// so rotation is that many times the increment
var rotationAngle = rotationIndex * increment;``````

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 02, 2020 1
Engaged ,
Nov 02, 2020

Copied

Interesting! I'll look in to this ASAP and amend the script (almost midnight here). Thank you @m1b !

As I hope is visible in the screen grab, I used 0% transparency on some line segments to preserve the overall hexagonal shape for the 3 symbols (restored these to 10% for the grab).

Roughness provided by a custom line profile.

Many Escher tesselations seem to break down to 6 triangles within each hex, triangles that link back in to each other. This affords a powerful method for interlinking of decorative or illustrative artwork. I'll attempt some more patterns soon and post here.

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 02, 2020 1
Contributor ,
Nov 02, 2020

Copied

Thank you, that's excellent!

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 02, 2020 1
Most Valuable Participant ,
Nov 03, 2020

Copied

The two elements (below) seem identical?

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 03, 2020 0
Engaged ,
Nov 03, 2020

Copied

Oops! My bad- in a rush, chose the wrong one. Will correct the grab and repost. Thx

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 03, 2020 0
Engaged ,
Nov 06, 2020

Copied

NOTE: Custom line profiles, etc will change the way illustrator calulates teh width of each hex, leading to the need to adjust your math when positioning each hex in the initial group (assuming you're using Transform to duplicate them, then Expand Appearance to leave the many instances of the original symbols).

Corrected grab:

Proof of random incremental rotation (top lines all in orange):

New code (way more sensible, efficient and works exactly the same!):

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 06, 2020 1
Contributor ,
Nov 06, 2020

Copied

Looks good!

I still don't think you need the double parameter for the rotate. Is that deliberate?

``items[i].rotate(rotationAngle);``

Also, this is not important in your case, but I would incorporate an unpainted circle as part of the symbol definitions. If you make this circle centred on the centre of the hexagon, and make it at least large enough that it defines the bounding box, then even if you break the link to the symbols later, you can still rotate the items with your script without them wandering around (because a circle at any rotation has the same bounding box).

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 06, 2020 1
Engaged ,
Nov 07, 2020

Copied

Yeah, sorry m1b, I really should spend more time reading (and working on this) before posting- been a bit distracted lately! 😅

Thank you so much for the excellent help, much appreciated.

the unpainted circumcircle idea is intriguing, it would work well to counteract the way stroke profile/weight get calculated in to the overall width & height of the duplicated symbols but breaking the link to the duplicated symbols is not possible for me because of where I'm taking this project. Wish I could explain more here but this forum's public.

Looking at the double parameter later today.

tbh- my coding's very rusty as I've been ill for almost a year and I'm only just getting back to the keyboard, so I may have some dumbass, script-kitty questions for you later! 🙂

Thanks

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 07, 2020 0
Engaged ,
Nov 07, 2020

Copied

Ah! I spent an embarrassingly long time staring at the code in your last post before realising that you were referring to my code! 😂
(I'm blaming the morphine 🙂)

``items[i].rotate(rotationAngle, rotationAngle);``

is now changed to

``items[i].rotate(rotationAngle);``

Script works the same.

Duplicated parameter was legacy from script to resize symbols by width and height independently.

Thanks

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 07, 2020 0
Contributor ,
Nov 07, 2020

Copied

Sorry to hear you been ill for so long. Hope your well on the road to recovery! Don't stress about the code... what you're doing is great. I love it. And making missteps is par for the course.

The rotate method takes several parameters. The first is the angle. The next four are the boolean options changePositions, changeFillPatterns, changeFillGradients, changeStrokePattern, and the last is rotateAbout.

Passing the angle number in as the second parameter equates to true unless the angle is zero. So in your case it works by chance. 😜

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 07, 2020 2
LATEST
Engaged ,
Nov 08, 2020

Copied

Wow that's sone handy info! & thanks @m1b

Can't wait to post the next phase of this here. That'll probably happen next week sometime.

Likes

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Nov 08, 2020 0
Resources
Learning Resources for Illustrator
What's new and fixed in Illustrator
Fonts and Typography in Illustrator