package ch.w3p.currgrid;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/**
* Applet zur Berechnung von Strömen in einem Gitter
* Bestehend aus Kontrol und View die Berechnungen werden durch das CurrSim Objekt getätigt
*
* Simulates a Current Grid. Mathematic Project I2
* Authors Daniel Schröter; Fabian Heusser
* Teacher: Dr. Josef F. Bürgler
* School: hta.fhz.ch, Horw;
* Project Homepage: http://www.w3p.ch/currgrid/
* Project Maillist: currgrid@w3p.ch
*
* supported features:
* interpolatet Plot:
* interpolatet VoltageOutput;
* change Voltage Points;
* delete Voltage Points;
* delete a Singel Voltage Point;
* drawLevelLinesM;
* Matrix ScrPrintOut
*
*
* LEGAL NOTICE
* THIS PROJECT AND ITS FILES ARE COPYRIGHTED BY THE AUTHORS
* THIS PROJECT CAN BE COPIED, MODIFIED AND DISTRIBUTED
* UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENCE
* WITH THE RESTRICTION OF SENDING US A MAIL WITH THE MODIFIED
* SOURCODE IF THE PROJECT IS MODIEFIED.
*
* if you like this progi feel free to send us something (beer, chips, playmates, houses....).
*
*
* @author Daniel Schröter
* @author Fabian Heusser
* @version 1.04, 07/03/01
* @(#) CurrSimLet.java
*/
/*
ACHTUNG! cols und rows sind durcheinandergeraten es ist kein verlass mehr auf die natürliche asozation der beiden begriffe!
*/
public class CurrSimLet extends Applet
implements ActionListener, AdjustmentListener, MouseListener, MouseMotionListener {
//Titel
private Label titel = new Label("Simgrid by Heusser & Schröter");
//Panels
private Panel controlPanel;
private Panel gridPanel;
//Grösse des Gitters
private Label rowsLabel;
private Label colsLabel;
private Label rowsActualLabel;
private Label colsActualLabel;
private Scrollbar rowsBar;
private Scrollbar colsBar;
//Definieren eines Punktes
private Label vLabel;
private TextField vTextField;
private int mouseKlickedX = 0;
private int mouseKlickedY = 0;
private Button randomButton;
private Button setDefButton;
private Choice setDefChoice;
private Button resetButton;
//Berechnen
private Button calcButton;
//Frame für ausgabe
private OutputFrame outputFrame1;
//Grafik für Schnellere Bildwiedergabe
//Ausgabe auf das Applet (hier die Spannungswerte)
private Image simImage;
private Graphics simGraphics;
private boolean simImageCreated = false;
private boolean simImageChanged = false;
//Ausgabe der Berechneten Daten =>Frame
//Frame hat sein eigenes Bild!!
//das Gitter
private SimGrid grid;
private static int gridCols = 20;
private static int gridRows = 20;
//Quickinfo
private String quickinfo;
private int quickinfoX = 0;
private int quickinfoY = 0;
/** Initialisierung des Applets
* -GUI initialisieren
* -CurrSim Obj mit Standarteinstellungen generieren
*/
public void init( ){
//Grösse des Applets
this.setEnabled(true);
this.setBackground(Color.lightGray);
//this.setSize(504,600);
//Panels
controlPanel = new Panel(null);add(controlPanel);
controlPanel.setBounds(0,0,503,90);
//gridPanel = new Panel();
//titel
controlPanel.add(titel);
titel.setBounds(170,5,250,20);
this.setName("Projekt Simgrid by Heusser & Schröter");
//Elemente zur Definition der Grösse des Gitters
rowsLabel = new Label("cols:");
controlPanel.add(rowsLabel);
rowsLabel.setBounds(15,15,40,10);
rowsBar = new Scrollbar(Scrollbar.HORIZONTAL,0,1,1,50);
controlPanel.add(rowsBar);
rowsBar.addAdjustmentListener(this);
rowsBar.setBounds(15,35,60,15);
colsLabel = new Label("rows:");
controlPanel.add(colsLabel);
colsLabel.setBounds(80,15,60,10);
colsBar = new Scrollbar(Scrollbar.HORIZONTAL,0,1,1,50);
controlPanel.add(colsBar);
colsBar.addAdjustmentListener(this);
colsBar.setBounds(80,35,60,15);
rowsActualLabel = new Label(""+gridCols);
controlPanel.add(rowsActualLabel);
rowsActualLabel.setBounds(15,50,40,10);
colsActualLabel = new Label(""+gridRows);
controlPanel.add(colsActualLabel);
colsActualLabel.setBounds(80,50,70,10);
rowsBar.setValue(gridCols);
colsBar.setValue(gridRows);
//Elemente zur Definition eines Punktes im Gitter
vLabel = new Label("U (in V):");
controlPanel.add(vLabel);
vLabel.setBounds(125,65,45,15);
vTextField = new TextField("",5);
controlPanel.add(vTextField);
vTextField.addActionListener(this);
vTextField.setBounds(170,60,70,20);
vTextField.setText("0");
//Zufallsmuster
randomButton = new Button("random");
controlPanel.add(randomButton);
randomButton.addActionListener(this);
randomButton.setBounds(250,60,60,20); //250,35,60,20);
//vordefinierte Muster
setDefButton = new Button("set");
controlPanel.add(setDefButton);
setDefButton.addActionListener(this);
setDefButton.setBounds(360,35,40,20);
setDefChoice = new Choice();
controlPanel.add(setDefChoice);
setDefChoice.setBounds(250,35,100,20);
setDefChoice.add("Dr.J.B.Muster");
setDefChoice.add("Muster2");
setDefChoice.add("Muster3");
//reset des Netzes (alle def Punkte löschen)
resetButton = new Button("reset");
controlPanel.add(resetButton);
resetButton.addActionListener(this);
resetButton.setBounds(430,10,60,20);
//Gitter berechnen
calcButton = new Button("calculate");
controlPanel.add(calcButton);
calcButton.addActionListener(this);
calcButton.setBounds(430,60,60,20);
//Frame für Ausgabe
outputFrame1 = new OutputFrame();
//Gitter erstellen
grid = new SimGrid(0,0,500,500,gridCols,gridRows);
outputFrame1.setGrid(grid);
//Mausbedienung
addMouseListener(this);
addMouseMotionListener(this);
//Hintergrundfarbe
this.setBackground(Color.lightGray);
}
/** Zeichnen des Applets
* -Das bereitgestellte Bild des Grids wird gezeichnet (aus dem bebufferten Bild)
* -falls die Maus im Gridfenster ist wird ein Quickinfo mit den Spannungswerten angezeigt
*/
public void paint(Graphics g ){//mit DoubleBuffering
if (!simImageCreated) {
simImage = createImage(500,500);
simGraphics = simImage.getGraphics();
simGraphics.setColor(this.getBackground());
simGraphics.fillRect(0, 0, 500,500);
grid.drawGridWithPoints(simGraphics,Color.black,Color.red);
//grid.displayGrid(simGraphics); //wird hier zum ersten mal gezeichnet
//und dann nur noch bei Veränderungen
}
if (simImageChanged){
grid.drawGridWithPoints(simGraphics,Color.black,Color.red,0,0);
}
g.drawImage(simImage,1, 97, this);
g.setColor(Color.darkGray);
g.draw3DRect(0,96,501,501,true);
//quickinfo anzeigen
if (quickinfo != null) {
Color col = new Color(255,255,0,150);//yellow Background with Alpha
g.setColor(col);
g.fillRect(quickinfoX,quickinfoY,100,15);
g.setColor(Color.black);
g.drawRect(quickinfoX,quickinfoY,100,15);
g.drawString(quickinfo,quickinfoX+3,quickinfoY+12);
}
}
/**
* Die update methode wurde überschrieben, da mit DoubleBuffering gearbeitet wird
*/
public void update(Graphics g) {
paint(g);
}
/**
* Eingaben bearbeiten
*
* -Spannungs-TextField eingaben kontrollieren
* -Button Benutzerdef Punkt setzen
* -Button Berechnen des Grid
* -Button Reset: Neues leeres Grid erstellen
* -Button Random 8 Punkte mit Zufallskoordinaten und Spannung hinzufügen
* -Button Muster: entsprechend dem ausgewählten Muster Punkte hinzufügen
*/
public void actionPerformed(ActionEvent e){
boolean error=false;
//Kontrolle der Werte (funktioniert nur wenn Enter gedrückt)
if (e.getSource() == vTextField) {
double v;
try {
v = Double.parseDouble(vTextField.getText());
} catch (NumberFormatException exeption) {
vTextField.setText("0");//Textfeld das einen nicht gültigen inhalt hat auf 0
v=0;
}
if ((v<-100000d) || (v>100000d)){ //Falls v-Wert ausserhalb des def. Bereichs
vTextField.setText("0");
}
}
//dem Grid werden 8 Punkte mit Zufälligen Koordinaten und Spannungswerten hinzugefügt