Incom ist die Kommunikations-Plattform der Fachhochschule Potsdam

In seiner Funktionalität auf die Lehre in gestalterischen Studiengängen zugeschnitten... Schnittstelle für die moderne Lehre

Incom ist die Kommunikations-Plattform der Fachhochschule Potsdam mehr erfahren

Generative Gestaltung

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.

Data.json

OptischeWirkung.pngOptischeWirkung.png

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();

Kiwi

Captura de pantalla 2016-05-09 a les 15.50.30.pngCaptura de pantalla 2016-05-09 a les 15.50.30.png

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();

3D

Captura de pantalla 2016-04-08 a les 14.48.21.pngCaptura de pantalla 2016-04-08 a les 14.48.21.png

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();

Ein Projekt von

Fachgruppe

Werkstattpraxis

Art des Projekts

Studienarbeit im ersten Studienabschnitt

Betreuung

foto: Fabian Morón Zirfas

Entstehungszeitraum

Sommersemester 2016