In seiner Funktionalität auf die Lehre in gestalterischen Studiengängen zugeschnitten... Schnittstelle für die moderne Lehre
In seiner Funktionalität auf die Lehre in gestalterischen Studiengängen zugeschnitten... Schnittstelle für die moderne Lehre
Während des Workshops Generative Gestaltung wir haben uns mit Adobe ExtendScript Toolkit auseinandergesetzt. Es wurde uns beigebracht wie man durch Scripting Adobe Indesign bedient mit der Hilfe von basil.js Library (http://basiljs.ch/about/). Das gestalten durch Code ermöglich interessanten Ergebnisse, die per „Hand“ nicht entstehen würden. Außerdem lassen sich damit Prozesse wiederholen, mit denen man sich sonst sich Zeit lang beschäftigen müsste.
Es folgen einige Code-Beispielsanwendung, welche meine Ergebnisse des Workshops sind.
Der Quellcode wandelt die in der JSON Datei stehenden hexadezimalen Zahlenwerte in RGB Werte um, sodass diese von Basil gelesen werden können. Dann werden die aus den RGB Werten erzeugten Farben in einer Ellipsenreihenfolge dargestellt und durch Anwendungen zweier Effekte wird diese Dynamik erzeugt.
Json: https://github.com/dariusk/corpora/blob/master/data/colors/crayola.json
//MIT License
#includepath "~/Documents/;%USERPROFILE%Documents";
#include „basiljs/bundle/basil.js“;
// this script shows how to load data into
// basil for further usage.
// The document you are working with needs to be saved at least once.
// The data needs to be in a folder next to that document
// The folder needs to be named „data“
// take a look into the output of the JS console of the ESTK
/**
* calculates a sum of 3 values in an array
* @param {Array} rgb holds [RED, GREEN, BLUE]
* @return {Number} a sum of the RGB
*/
function combine(arr) {
return arr[0] + arr[1] + arr[2];
}
function hexToRGB(hexString){ //convert HEX to RGB
var col = [(parseInt(hexString, 16) >> 16 ) & 0xff, (parseInt(hexString, 16) >> 8 ) & 0xff, parseInt(hexString, 16 ) & 0xff ];
//b.println(hexString);
//b.println(col);
return col;
}
function draw() {
var pw = 250; // for easier handling
var ph = 200; // for easier handling
var doc = b.doc();
doc.documentPreferences.properties = {
pageWidth: pw,
pageHeight: ph
}; // set the page size
b.clear(doc); // clear the doc
b.units(b.MM); // use MM
// get the scripts name
// get its containing folder
// get the name of the script without the extension
// add the .indd to the extension
var fname = File($.fileName).parent.fsName + '/' + ($.fileName.split('/')[$.fileName.split('/').length - 1]).split('.')[0] + '.indd';
// and save it
doc.save(fname, false, 'basil', true); //save the file next to the script
var filecontent = b.loadString(„data.json“); // load the text file
//b.println(filecontent.constructor.name); // take a look at what kind of content we have
var json = b.JSON.decode(filecontent); // transform it to JSON
//b.println(json.constructor.name); // take a look again what json is
//b.println(json.description); // print something from the file
// loop all the entries
// data conversion
for (var i = 0; i < json.colors.length; i++) {
//b.println(json.colors[i].color); // take a look at the entry
//b.println(json.colors[i].color.length); // how many characters does the entry have
//b.println(json.colors[i].hex);
var rgb = hexToRGB(json.colors[i].hex.slice(1)); // take out the # on the HEXvalue
json.colors[i].rgb = rgb;
json.colors[i].rgbsum = combine(rgb); // // calc a sum (darkest to brightest)
// b.println(json.colors[i].rgbsum);
// take a look at the result
//b.println('updated json');
}
// now sort the array based on the sum
json.colors.sort(function(a, b) {
var value1 = a.rgbsum;
var value2 = b.rgbsum;
if (value1 < value2) {
return -1;
}
if (value1 > value2) {
return 1;
}
return 0;
});
//b.println(json.colors.toSource());
var x = 0;
var y = 0;
var rectWidth = b.width/json.colors.length;
var diam = 6.9;
b.noStroke();
for (var j = 0; j < json.colors.length; j++) {
// b.println(json.colors[j].rgb);
b.fill(json.colors[j].rgb[0], json.colors[j].rgb[1], json.colors[j].rgb[2]); // set fill color
b.ellipseMode(b.CORNER); // To start from the corner of the shape not from the center
myShape = b.ellipse (x,y , diam, diam);// draw the ellipse
myShape.transparencySettings.innerShadowSettings.properties = {
applied: true,
distance: 2
};//inner shadow effect
myShape.transparencySettings.directionalFeatherSettings.properties = {
applied: true,
angle: 0+j,
leftWidth: 2,
rightWidth: 5,
}; //directional Feather effect
//Constraints the pattern
x += diam; // update x
if(x >= b.width){
x = 0;
y+=diam;
}
}
// end of code ---------
}
b.go();
Der Quellcode zeichnet geometrischen Formen eines Kiwiquerschnittes. Es beginnt mit dem Hauptkern und die umliegenden Samen die mit leichten Verschiebungen zum Kern organisch dargestellt werden. Es folg der Fruchtfleisch mit leichten Kontur, das die Schalle angedeutet. Diese Prozess wird wiederholt und die Kiwis werden durch die ganze Fläsche mit verschiedene Winkelngrad verteilt.
//MIT License
#includepath "~/Documents/;%USERPROFILE%Documents";
#include "basiljs/bundle/basil.js";
const PAGE_HEIGHT = 200;
const PAGE_WIDTH = 200;
function drawKiwi(x,y,width,height,deg, doc) {
var grp =[];
var angle = 0;
var radius = 20;
b.noStroke();
//RGB
b.fill(207,227,197);
b.pushMatrix(); // reset the whole coordinate space
b.translate(x, y); // offset it
//b.rotate(b.radians(deg)); // turn it
// begin a new polygon
// draw the verticies
b.beginShape(b.CLOSE);
b.vertex(-3,-19);
b.vertex(-5,-15);
b.vertex(-7,-9);
b.vertex(-10,3);
b.vertex(-2,19);
b.vertex(10,3);
b.vertex(8,-11);
var kern = b.endShape();// end the polygon and pass it into a variable
grp.push(kern);
kern.transparencySettings.directionalFeatherSettings.properties = {
applied: true,
angle: 15,
leftWidth: 5,
rightWidth: 2
};
//draw cores
while(angle < 360){
var _x = b.cos(b.radians(angle)) * (radius + b.random(-0,0));
var _y = b.sin(b.radians(angle)) * (radius + b.random(-4,4));
//RGB
b.fill(9,23,2);
var kerne = b.ellipse(_x,_y, 4 ,1);
grp.push(kerne);
angle+=b.random(0,15);
kerne.transparencySettings.outerGlowSettings.properties = {
applied: true,
effectColor: doc.swatches[0]
};
}
//RGB
b.stroke(94, 61, 17);
b.fill(135, 232, 70);
//draw the green ellipse
var ell = b.ellipse(0,0,70,90);
ell.transparencySettings.outerGlowSettings.properties = {
applied: true,
effectColor: doc.swatches[3]
};
ell.sendToBack(); //send it to the back
grp.push(ell);
b.popMatrix(); // reset the coordinate space
return grp; // return it for further handling
} // end of function drawKiwi
//main draw function
function draw() {
var doc = b.doc();
b.clear(doc);
b.units(b.MM);
doc.documentPreferences.properties = {
pageHeight:PAGE_HEIGHT,
pageWidth:PAGE_WIDTH
};
var MAX_KIWI = 20; // number of items we want
var kiwis = []; // will hold the items
// now loop the number of items we defined before
for (var i = 0; i < MAX_KIWI; i++) {
var item = drawKiwi(b.random(100),b.random(100), b.random(50),b.random(70),b.random(360), doc);
var groupedItem = doc.pages[0].groups.add(item);
var rotate = app.transformationMatrices.add({counterclockwiseRotationAngle:(b.random(360))});// rotate
groupedItem.transform(CoordinateSpaces.pasteboardCoordinates, AnchorPoint.centerAnchor, rotate); //
groupedItem.move(undefined,[b.random(PAGE_WIDTH/2),b.random(PAGE_HEIGHT/2)]);
;
kiwis.push(item); // add them to an array
} // end of the loop
} // end of draw function
// run basil
b.go();
Der Quellcode zeichnet ein Rechteck, das sich in einem konstanten Winkel wiederholt. Durch den angewendten Effekt wird ein Schatten erzeugt.
//MIT License
#includepath "~/Documents/;%USERPROFILE%Documents";
#include "basiljs/bundle/basil.js";
function draw() {
// code goes here -----------
var doc = b.doc(); // to clean the last document
b.clear(doc);
doc.documentPreferences.properties = {
};
b.rotate(30); // to rotate the shape only one time
//b.stroke(b.random(255), b.random(255),b.random(255)) //uncomment that if you want strokes with random colors
//b.noFill(); // uncomment that if you do not what to fill the shape
b.fill(b.random(255), b.random(255),b.random(255)); // to fill the shape with the same random color
for ( var i=1; i <= 30; i++ ){
//b.stroke(b.random(75), b.random(201),b.random(80)); // uncomment that if you want a random color for each stroke
//b.fill(b.random(75), b.random(201),b.random(80)); //uncomment that if you want a random color for each shape
//b.rotate(30); //uncomment that for a loop rotation
var rectWithShadow = b.rect(i+200, i+200, 100, 100); //shape values, also possible with b.ellipse
rectWithShadow.transparencySettings.dropShadowSettings.properties = {
mode: ShadowMode.DROP, //shadow properties
noise: 0.5,
xOffset: 20,
yOffset: 50,
opacity: 4,
spread: 60,
}
}
}
b.go();