Hier nun die Sourcecodes der Programme (nicht lang!), damit jeder,
der gerne möchte, damit spielen kann:
Der Java-Teil:
import java.lang.*;
import java.awt.*;
import java.io.*;
import java.awt.image.*;
public class Lochblech extends Frame{
private static Lochblech application;
// Application starten
public static void main(String[] args){
application = new Lochblech(args[0]);
// ...und beenden
System.exit(0);
}
// Konstruktor (macht alles)
public Lochblech(String imageName){
// Farbkanäle
int red,green,blue;
// Bild
Image image = Toolkit.getDefaultToolkit().getImage(imageName);
// Laden des Bildes überwachen
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 0);
// Warten, bis Bild vollständig geladen
try{
mt.waitForID(0);
}catch(Exception e){
// Wenn was schiefgeht
System.exit(0);
}
// Breite und Höhe ermitteln
int w = image.getWidth(this);
int h = image.getHeight(this);
// Speicherplatz Breite x Höhe reservieren
int[] pixels = new int[w * h];
// Die Pixel auslesen
try{
PixelGrabber pg = new PixelGrabber(image,
0, 0, w, h, pixels, 0, w);
pg.grabPixels();
}catch(Exception e){
}
// Breite und Höhe ausgeben
System.out.println(w);
System.out.println(h);
// Den Rotanteil der Pixel ausgeben
for(int i = 0; i < w * h; i++){
red = (pixels[i] & 0x00ff0000) >> 16;
//green = (pixels[i] & 0x0000ff00) >> 8;
//blue = (pixels[i] & 0x000000ff);
System.out.println(red);
}
}
}
Und der Lisp-Teil:
(defun lochblech(filename / fh b w h p r row col)
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setq fh(open filename "r"))
(setq w(atoi(read-line fh)))
(setq h(atoi(read-line fh)))
(setq row 0)
(setq p '(0 0))
(setq r (/ 1 255.0))
(repeat h
(setq col 0)
(repeat w
(setq p(list(* 1.1 col)(* 1.1 row)))
(setq b(1+(atoi(read-line fh))))
;(command "_circle" p (* b r))
(command "_donut" 0 (* b r) p "")
(setq col(1+ col))
)
(setq row(1- row))
)
(close fh)
)
Noch eine Ergänzung, es haben mich einige Mails erreicht mit der
Frage, wie man die Kreisdurchmesser an vorhandene Werkzeuge anpassen
kann - d.h. nicht mehr alle möglichen Durchmesser sollen vorkommen
können, sondern es soll auf einige verschiedene Durchmesser reduziert
werden, für die Stanzwerkzeuge vorhanden sind.
Natürlich gibt es da verschiedene Wege - auf die naheliegende
Möglichkeit, das Bild einfach als 8- oder 16-Farben-GIF abzuspeichern,
ist wohl niemand gekommen. Aber natürlich kann es auch sein, dass
jemand nicht 8 oder 16 Werkzeuge zur Verfügung hat, sondern vielleicht
ausgerechnet 11! Ein 11-Farben-GIF gibt es leider nicht...
Hier noch mal eine Variante des Lisp-Teils, der (beispielhaft) die
ganze Sache für 11 verschiedene Werkzeugdurchmesser erzeugt. Zum
Abändern reicht es, neue Werkzeuge einfach in die Liste einzutragen
oder daraus zu entfernen, es muss sonst nichts am Programm geändert
werden.
(defun lochblech(filename / fh b w h p r row col
maximum werkzeuge abstufen)
; Lokale Funktion zum Abstufen der Radien
(defun abstufen(zahl werkzeuge / )
(terpri)
(nth(fix(/ zahl(/ 1.0(1-(length werkzeuge)))))werkzeuge)
)
; **************
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setq werkzeuge'(1 1.5 2 2.5 3.5 4.5 6 7.5 9 11 13))
; Hier die vorhandenen Werkzeug-Radien eintragen!!!!
(setq maximum(apply'max werkzeuge))
(setq fh(open filename "r"))
(setq w(atoi(read-line fh)))
(setq h(atoi(read-line fh)))
(setq row 0)
(setq p '(0 0))
(setq r(/ 1 255.0))
(repeat h
(setq col 0)
(repeat w
(setq p(list(* 2.2 maximum col)(* 2.2 maximum row)))
(setq b(1+(atoi(read-line fh))))
;(command "_circle" p (abstufen(* b r)werkzeuge))
(command "_donut" 0 (abstufen(* b r)werkzeuge) p "")
(setq col(1+ col))
)
(setq row(1- row))
)
(close fh)
)
Und noch ein kleiner Tipp: Wer mit dem Lisp-Teil überhaupt
nicht klarkommt, der kann ja mal einen Blick in mein
Autolisp-Tutorial
werfen - da werden Sie geholfen!