Created
January 18, 2024 18:23
-
-
Save flipphillips/3c7a51527778083c467e2a88e43996a1 to your computer and use it in GitHub Desktop.
Led wall grid generator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// LEDWallGrid - This script will create a grid of squares for an LED wall. | |
// | |
// Flip Phillips | |
// Darren Alexander (from FidoLED) | |
// | |
// Winter 2024 | |
// | |
// (c) Darren Alexander 2015 | |
// (c) Flip Phillips 2024 but released under the MIT license | |
// | |
#target photoshop | |
app.bringToFront(); | |
$.localize = true; | |
// try { | |
// } | |
// catch (e) { | |
// } | |
// | |
// the things to set | |
// | |
var canvasWidth = 1920; | |
var canvasHeight = 1080; | |
var ModuleW = 5; | |
var ModuleH = 4; | |
var ColumnOffset = 0; | |
var pixelpitchwide = 88; | |
var pixelpitchhigh = 88; | |
var guides = false; | |
var randomColors = true; | |
var numbering = true; | |
// the things we compute | |
var width = ModuleW * pixelpitchwide; | |
var height = ModuleH * pixelpitchhigh; | |
var defaultRulerUnits = preferences.rulerUnits; preferences.rulerUnits = Units.PIXELS; | |
var doc = documents.add(canvasWidth, canvasHeight, 72, "LED Grids", NewDocumentMode.RGB, DocumentFill.TRANSPARENT, 1.0); | |
// | |
// make guides | |
// | |
function makeGuide(pixelOffSet, orientation) { | |
var id8 = charIDToTypeID("Mk "); | |
var desc4 = new ActionDescriptor(); | |
var id9 = charIDToTypeID("Nw "); | |
var desc5 = new ActionDescriptor(); | |
var id10 = charIDToTypeID("Pstn"); | |
var id11 = charIDToTypeID("#Rlt"); | |
desc5.putUnitDouble(id10, id11, pixelOffSet); // integer | |
var id12 = charIDToTypeID("Ornt"); | |
var id13 = charIDToTypeID("Ornt"); | |
var id14 = charIDToTypeID(orientation); | |
desc5.putEnumerated(id12, id13, id14); | |
var id15 = charIDToTypeID("Gd "); | |
desc4.putObject(id9, id15, desc5); | |
executeAction(id8, desc4, DialogModes.NO); | |
} | |
if (guides) { | |
for (i = 0; i <= ModuleW; i++) { | |
makeGuide(pixelpitchwide * i, "Vrtc"); | |
} | |
for (i = 0; i <= ModuleH; i++) { | |
makeGuide(pixelpitchhigh * i, "Hrzn"); | |
} | |
} | |
// | |
// make boxes | |
// | |
// row colum globals? | |
var c = 0; | |
var r = 0; | |
var colourcycle = 0; | |
function makegrids(ppitch, colourcycle) { | |
for (s = 0; s <= ModuleH - 1; s++) { // this loop created a filled in column - now I need to move over 1 module and do more! | |
var Colour1 = new SolidColor; | |
var Colour2 = new SolidColor; | |
if (randomColors) { | |
Colour1.rgb.red = Math.round(Math.random() * 255); | |
Colour1.rgb.green = Math.round(Math.random() * 255); | |
Colour1.rgb.blue = Math.round(Math.random() * 255); | |
Colour2.rgb.red = Math.round(Math.random() * 255); | |
Colour2.rgb.green = Math.round(Math.random() * 255); | |
Colour2.rgb.blue = Math.round(Math.random() * 255); | |
} | |
else { | |
Colour1.rgb.red = 255; | |
Colour1.rgb.green = 68; | |
Colour1.rgb.blue = 34; | |
Colour2.rgb.red = 0; | |
Colour2.rgb.green = 170; | |
Colour2.rgb.blue = 238; | |
} | |
var X1 = Number(ppitch) //Number((z*ModuleW)*pixelpitchwide) // point 1 of the selection | |
var Y1 = Number(r * pixelpitchhigh) //Number((z*ModuleH)*pixelpitchhigh) // point 1 of the selection | |
var X2 = Number(X1 + pixelpitchwide) // point 2 of the selection | |
var Y2 = Number(r * pixelpitchhigh) //Number((z*ModuleH)*pixelpitchhigh) // point 2 of the selection | |
var X3 = Number(X1 + pixelpitchwide) // point 3 of the selection | |
var Y3 = Number(Y1 + pixelpitchhigh) // Point 3 of the selection | |
var X4 = Number(ppitch) //Number((z*ModuleW)*pixelpitchwide) // point 4 of the selection | |
var Y4 = Number(Y1 + pixelpitchhigh) // Point 4 of the selection | |
var selectionBounds = [[X1, Y1], [X2, Y2], [X3, Y3], [X4, Y4]]; | |
curDoc.selection.select(selectionBounds, SelectionType.REPLACE, 0, false); | |
if (colourcycle == 0) { | |
curDoc.selection.fill(Colour1); | |
var colourcycle = 1; | |
} | |
else { | |
curDoc.selection.fill(Colour2); | |
var colourcycle = 0; | |
} | |
curDoc.selection.deselect(); | |
r = r + 1; | |
} | |
} | |
var curDoc = activeDocument; | |
var newLayer = curDoc.artLayers.add(); | |
newLayer.name = "TheGrids"; | |
for (t = 0; t <= ModuleW - 1; t++) { //this is the loop for doing the column | |
var ppitch = (t * pixelpitchwide); | |
makegrids(ppitch, colourcycle); | |
r = 0; | |
if (colourcycle == 0) { // I need to flip the colours over at the start of a new column | |
var colourcycle = 1; | |
} | |
else { | |
var colourcycle = 0; | |
} | |
} | |
// | |
// numbering | |
// | |
var textpitchx = 0; | |
var textpitchy = 0; | |
function addtext(columnnumber) { | |
// suppress all dialogs | |
app.displayDialogs = DialogModes.NO; | |
var AD = activeDocument; | |
var TextLayer = AD.artLayers.add(); | |
TextLayer.kind = LayerKind.TEXT; | |
var txtRef = TextLayer.textItem; | |
txtRef.color = new SolidColor(255, 255, 255); // Set text color to white | |
txtRef.strokeColor = new SolidColor(0, 0, 0); // Set stroke color to black | |
txtRef.strokeWidth = 1; // Set stroke width | |
txtRef.createOutline(); // Create outline of the text | |
txtRef.font = "Trebuchet MS"; | |
txtRef.antiAliasMethod = AntiAlias.SHARP; | |
txtRef.justification = Justification.CENTER; | |
//txtRef.anchorposition = AnchorPosition.MIDDLECENTER; | |
txtRef.position = Array((textpitchx + (pixelpitchwide / 2)), (textpitchy + (pixelpitchhigh / 1.4))); //20,46 | |
txtRef.size = (pixelpitchwide / 2.0); | |
txtRef.contents = columnnumber + 1; | |
} | |
var nn = 0; | |
for (a = 1; a <= ModuleH; a++) { | |
for (q = 0; q <= ModuleW - 1; q++) { | |
addtext(nn + ColumnOffset); | |
textpitchx = ((q + 1) * pixelpitchwide); //this moves thetext along the columns | |
nn = nn + 1; | |
} | |
textpitchx = 0; | |
textpitchy = ((a) * pixelpitchhigh); | |
q = 0; | |
} | |
// ok here I want to hide the background layer and the grid layer and flatten the text layers | |
curDoc.activeLayer = curDoc.layers.TheGrids; | |
curDoc.activeLayer.visible = 0; | |
curDoc.activeLayer = curDoc.layers[curDoc.layers.length - 3]; // this makes the 3rd Layer active | |
curDoc.mergeVisibleLayers(); | |
curDoc.activeLayer = curDoc.layers.TheGrids; | |
curDoc.activeLayer.visible = 1; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment