/* Copyright (c) 2010, Chris Want Please see BSD style licence at the end of this file */ class ViewModel { PlacementElement[] panels, gridTab, statTab, varioTab, dataTab; TabPanel tabGridVarioStat; SlicePanel slicePanel=null; Iso3dPanel iso3d=null; LayersPanel layersPanel=null; ProbePanel probePanel=null; ClickedPanel clickedPanel=null; BrandPanel brandPanel; NumIsoPanel numIsoPanel=null; SearchPanel searchPanel=null; KrigingPanel krigPanel=null; GridPanel gridPanel=null; ReadWritePanel readWritePanel=null; VariogramPanel varioPanel; CDFPanel cdfPanel; PFont font; ViewModel(DataModel data, ControlModel control) { int sliceWidth = 350, sliceHeight = 350, layerHeight = 26; int probeHeight = 105, probeWidth = 120; int isoHeight = 350, numIsoHeight = 75; int tabWidth = 380, tabHeight = 350; int brandWidth = 90; int readWriteWidth = sliceWidth - brandWidth - 10; int gridHeight = 120, varioHeight = 320, cdfHeight = 315; int searchHeight = 130, searchWidth = 205; int x1, y1; font = loadFont("Verdana-12.vlw"); x1 = 10; y1 = 10; slicePanel = new SlicePanel(data, control, font, x1, y1, sliceWidth, sliceHeight); y1 += (sliceHeight+10); layersPanel = new LayersPanel(data, control, x1, y1, sliceWidth, layerHeight); y1 += (layerHeight+5); probePanel = new ProbePanel(data, control, font, x1, y1, probeWidth, probeHeight); clickedPanel = new ClickedPanel(data, control, font, x1+probeWidth+5, y1, probeWidth, probeHeight); brandPanel = new BrandPanel(x1+2*probeWidth+20, y1, brandWidth, probeHeight); y1 += (probeHeight+5); numIsoPanel = new NumIsoPanel(data, control, x1, y1, sliceWidth, numIsoHeight); y1 += (numIsoHeight+5); searchPanel = new SearchPanel(data, control, x1, y1, searchWidth, searchHeight); krigPanel = new KrigingPanel(data, control, x1+searchWidth+5, y1, sliceWidth - searchWidth - 5, searchHeight); gridPanel = new GridPanel(data, control, 10, 10, tabWidth-20, gridHeight); varioPanel = new VariogramPanel(data, control, 10, 10, tabWidth-20, varioHeight); cdfPanel = new CDFPanel(data, control, font, 10, 10, tabWidth-20, cdfHeight); readWritePanel = new ReadWritePanel(data, control, 10, tabHeight-50, tabWidth-20, 30); statTab = new PlacementElement[] { cdfPanel }; varioTab = new PlacementElement[] { varioPanel }; gridTab = new PlacementElement[] { gridPanel, }; dataTab = new PlacementElement[] { readWritePanel, }; x1+=(sliceWidth+10); y1=10; iso3d = new Iso3dPanel(data, control, font, x1, y1, tabWidth, isoHeight); y1 += (isoHeight+10); tabGridVarioStat = new TabPanel("tabGridVarioStat", font, x1, y1, tabWidth, tabHeight, control.controlP5); tabGridVarioStat.addTab("Variogram", varioTab); tabGridVarioStat.addTab("Grid", gridTab); tabGridVarioStat.addTab("Statistics", statTab); tabGridVarioStat.addTab("Data", dataTab); panels = new PlacementElement[] { tabGridVarioStat, slicePanel, iso3d, probePanel, clickedPanel, layersPanel, numIsoPanel, brandPanel, readWritePanel, searchPanel, krigPanel, }; } void draw() { for (int i=0; i < panels.length; ++i) { panels[i].draw(); } } void mouseMoved() { for (int i=0; i < panels.length; ++i) { panels[i].mouseMoved(); } } void mousePressed() { for (int i=0; i < panels.length; ++i) { panels[i].mousePressed(); } } void mouseReleased() { for (int i=0; i < panels.length; ++i) { panels[i].mouseReleased(); } } void updateState() { for (int i=0; i < panels.length; ++i) { panels[i].updateState(); } } void setGridVarioStatTab(int value) { tabGridVarioStat.setTab(value); } void updateControllers() { // To make sure text values in Textfield controllers have been submitted for (int i=0; i < panels.length; ++i) { panels[i].updateControllers(); } } void updateVariogramControls() { varioPanel.controlsFromVariogram(control.krig.vario); varioPanel.flagRedraw(); } void updateKrigingControls() { krigPanel.controlsFromKriging(control.krig); krigPanel.flagRedraw(); } void updateSearchControls() { searchPanel.controlsFromSearch(control.krig.search, control.krig.kd); searchPanel.flagRedraw(); } } class SearchPanel extends PlacementElement { DataModel data; ControlModel control; //Toggle searchOn, searchRadiusOn, searchNumOn; //Slider searchRadius, searchNum; RadioButton searchType; Controller[] anis, angles; Slider minPoints, maxPoints; color bgcolor; color fgcolor; SearchPanel(DataModel data, ControlModel control, float x, float y, float w, float h) { super(x, y, w, h); this.data = data; this.control = control; int x1 = (int)getScreenX(10); int y1 = (int)getScreenY(10); addController(searchType = control.controlP5.addRadioButton("searchType", (int) x1, (int) y1)); searchType.setItemsPerRow(2); searchType.setSpacingColumn(70); searchType.addItem("Global Kriging", 0); searchType.addItem("Search-based Kriging", 1); searchType.setNoneSelectedAllowed(false); y1 += 20; anis = new Controller[3]; angles = new Controller[3]; for (int j=0; j<3; ++j) { addController(anis[j] = addTextFloat("es_anis" + j, 1.0, x1+60*j, y1, 50, 20)); addController(angles[j] = addTextFloat("es_angles" + j, 1.0, x1+60*j, y1+35, 50, 20)); anis[j].setLabel("scale " + (j+1)); angles[j].setLabel("angle " + (j+1)); } y1 += 75; addController(minPoints = control.controlP5.addSlider("minPoints",0,data.krig.kd.ndata,3,x1, y1,50,15)); addController(maxPoints = control.controlP5.addSlider("maxPoints",0,data.krig.kd.ndata,5,x1+95,y1,50,15)); /* addController(searchOn = control.controlP5.addToggle("searchOn", false, x1,y1,10,10)); searchOn.setLabel("Search"); x1 += 10; y1 += 30; addController(searchRadiusOn = control.controlP5.addToggle("searchRadiusOn", false, x1,y1,10,10)); searchRadiusOn.setLabel("Radius"); addController(searchRadius = control.controlP5.addSlider("searchRadius", 1, 100, 5, x1+60,y1,100,25)); searchRadius.captionLabel().setVisible(false); y1 += 30; addController(searchNumOn = control.controlP5.addToggle("searchNumOn", false, x1,y1,10,10)); searchNumOn.setLabel("Data points"); addController(searchNum = control.controlP5.addSlider("searchNum", 1, 10, 5, x1+60,y1,100,25)); searchNum.captionLabel().setVisible(false); */ controlsFromSearch(control.krig.search, control.krig.kd); bgcolor = color(0, 0, 0); fgcolor = color(255, 0, 0); } void draw(PGraphics out) { boolean modified = false; float x1, y1; out.beginDraw(); if (redraw) { out.fill(bgcolor); out.stroke(fgcolor); out.rectMode(CORNER); out.rect(getX(0), getY(0), w-1, h-1); redraw = false; } out.endDraw(); } void controlsFromSearch(Search search, KrigData kd) { disableControllers(); if ( (search == null) || (!search.isEnabled())) { searchType.activate(0); } else { if (search instanceof EllipsoidSearch) { EllipsoidSearch es = (EllipsoidSearch) search; searchType.activate(1); for (int j=0; j<3; ++j) { ((Textfield) anis[j]).setText(control.textFloat.format(es.rot.anis[j])); anis[j].show(); ((Textfield) angles[j]).setText(control.textFloat.format(es.rot.angles[j])); angles[j].show(); } minPoints.setMin(0); minPoints.setMax(es.maxPoints); minPoints.setValue(es.minPoints); if (es.maxPoints > 0) { minPoints.show(); } maxPoints.setMin(es.minPoints); maxPoints.setMax(kd.ndata); maxPoints.setValue(es.maxPoints); if (es.minPoints < kd.ndata) { maxPoints.show(); } } } searchType.show(); /* searchOn.setValue(false); searchRadiusOn.setValue(false); searchNumOn.setValue(false); if (search!=null && search.isEnabled()) { searchOn.setValue(true); if (control.krig.search instanceof RadiusNumSearch) { RadiusNumSearch rnsearch = (RadiusNumSearch) search; if (rnsearch.radiusSearch.isEnabled()) { searchRadius.show(); searchRadiusOn.setValue(true); } } searchRadiusOn.show(); } searchOn.show(); */ } } class NumIsoPanel extends PlacementElement { DataModel data; ControlModel control; color bgcolor; color fgcolor; Slider numIsoSlider; ImagePlacementElement colorMap=null; PFont font; int fontSize; int sliderHeight, cBarHeight, sliderY, cBarY, textY; NumIsoPanel(DataModel data, ControlModel control, float x, float y, float w, float h) { super(x, y, w, h); this.data = data; this.control = control; this.fontSize = 10; this.font = loadFont("Verdana-10.vlw"); sliderHeight = (int)h/2 - 20; cBarHeight = (int)h - 45 - sliderHeight; sliderY = 10; cBarY = sliderY + sliderHeight + 15; textY = cBarY + cBarHeight + 8; addController(numIsoSlider = control.controlP5.addSlider("numIso",1,MAX_ISOSURFACES,control.numSurf, (int)getScreenX(10),(int)getScreenY(10),(int)(w-75),sliderHeight)); numIsoSlider.setLabel("Isosurfaces"); bgcolor = color(0, 0, 0); fgcolor = color(255, 0, 0); colorMap = new ImagePlacementElement((int)getX(10), (int)getY(cBarY), (int)w - 20, cBarHeight, getColorMap((int)w - 20,cBarHeight)); //colorMap.setParent(this); } void draw(PGraphics out) { boolean modified = false; if (redraw) { NumberFormat numFormat; numFormat = new DecimalFormat("0.00"); out.beginDraw(); out.fill(bgcolor); out.stroke(fgcolor); out.rectMode(CORNER); out.rect(getX(0), getY(0), w-1, h-1); colorMap.flagRedraw(); colorMap.draw(out); out.textFont(font, fontSize); out.textMode(SCREEN); out.fill(255); out.stroke(255); out.textAlign(LEFT, TOP); out.text(numFormat.format(data.krig.out.getScalMin(EST)), getX(10), getY(textY)); out.textAlign(RIGHT, TOP); out.text(numFormat.format(data.krig.out.getScalMax(EST)), getX(w-11), getY(textY)); out.stroke(255); out.line(getX(9), getY(cBarY), getX(9), getY(textY-2)); out.line(getX(w-10), getY(cBarY), getX(w-10), getY(textY-2)); for (int i=0; i < control.numSurf; ++i) { float x1, y1, unit; unit = (i+1.0) / (control.numSurf+1.0); x1 = getX(10 + unit * (w-20)); y1 = getY(30); fill(unitToColor(unit)); noStroke(); triangle(x1-5, getY(cBarY)-5, x1+5, getY(cBarY)-5, x1, getY(cBarY)); } redraw = false; out.endDraw(); } } PImage getColorMap(int w1, int h1) { PImage colorMap = createImage(w1, h1, RGB); colorMap.loadPixels(); for (int j=0; j < h1; ++j) { for (int i=0; i < w1; ++i) { colorMap.pixels[j*w1 + i] = unitToColor((float) i / (float) w1); } } colorMap.updatePixels(); return colorMap; } } class BrandPanel extends ImagePlacementElement { BrandPanel(float x, float y, float w, float h) { super(x, y, w, h); pi = loadImage("ualberta_brand.png"); } } class CDFGraphData extends LineGraphData { CDF cdf; String label; color col; int counter = 0; CDFGraphData(CDF cdf, color col, String label) { this.cdf = cdf; this.label = label; this.col = col; } float getMinDomain() { return cdf.datamin; } float getMaxDomain() { return cdf.datamax; } float getMinRange() { return 0.0; } float getMaxRange() { return 1.0; } int getNumData() { return cdf.numData; } void reset() { counter = 0; } float[] getNextData() { float[] out = new float[2]; out[0] = cdf.sortData[counter]; out[1] = counter / (cdf.numData - 1.0); ++counter; return (out); } color getColor() { return col; } String getLabel() { return label; } } class CDFPanel extends PlacementElement { DataModel data; ControlModel control; PFont font; int fontSize; int pad=10, gx, gy, gw, gh; float datamin, datamax; LineGraph graph; CDFPanel(DataModel data, ControlModel control, PFont font, float x, float y, float w, float h) { super(x, y, w, h); this.data = data; this.control = control; this.font = font; this.fontSize = 12; //this.font = createFont("Courier",fontSize); gx = (int) getX(pad); gy = (int) getY(pad); gw = (int) w - 2*pad; gh = (int) h - 2*pad; updateState(); } void draw(PGraphics out) { if (redraw) { gx = (int) getX(pad); gy = (int) getY(pad); gw = (int) w - 2*pad; gh = (int) h - 2*pad; out.fill(0); //out.stroke(255, 0, 0); out.noStroke(); out.rect(getX(0), getY(0), w, h); //out.rect(gx, gy, gw, gh); //drawCDF(out); graph.draw(out, gx, gy, gw, gh); redraw = false; } } void drawCDF(PGraphics out) { out.textFont(font,fontSize); out.textMode(SCREEN); out.stroke(0, 255, 127); out.fill(0, 255, 127); out.textAlign(LEFT, BOTTOM); out.text("DATA", gx+gw-35, gy+gh-20); plotLine(out, data.dataCDF); out.stroke(255, 127, 0); out.fill(255, 127, 0); out.textAlign(LEFT, BOTTOM); out.text("Model", gx+gw-35, gy+gh-5); plotLine(out, data.modelCDF); drawPlotArea(out); } void drawPlotArea(PGraphics out) { out.stroke(255); out.line(gx-3, gy+gh, gx+gw, gy+gh); out.line(gx, gy, gx, gy+gh+3); out.stroke(96, 127); out.line(gx-3, gy, gx+gw, gy); out.line(gx+gw, gy, gx+gw, gy+gh+3); } void plotSteps(PGraphics out, CDF cdf) { noFill(); float prob = 0, px, pxold, py; pxold = gx; for (int i=1; i< cdf.numData; ++i) { prob = (float) i / (cdf.numData - 1); px = gx + gw * (cdf.sortData[i] - datamin) / (datamax - datamin); py = gy + (1.0 - prob)*gh; line(pxold, py, px, py); pxold = px; } line(pxold, gy, gx+gw, gy); } void plotLine(PGraphics out, CDF cdf) { noFill(); float prob = 0, px, pxold, py, pyold; pxold = gx; pyold = gy+gh; for (int i=1; i< cdf.numData-1; ++i) { prob = (float) (2*i+1) / (2*(cdf.numData - 1)); px = gx + gw * (cdf.sortData[i] - datamin) / (datamax - datamin); py = gy + (1.0 - prob)*gh; line(pxold, pyold, px, py); pxold = px; pyold = py; } line(pxold, pyold, gx+gw, gy); } void updateState() { super.updateState(); this.graph = new LineGraph(font, fontSize, "CDF", "Value", "P"); graph.addGraphData(new CDFGraphData(data.dataCDF, color(255, 255, 127), "Data")); graph.addGraphData(new CDFGraphData(data.modelCDF, color(127, 255, 255), "Model")); datamin = min(data.dataCDF.datamin, data.modelCDF.datamin); datamax = max(data.dataCDF.datamax, data.modelCDF.datamax); } } class ReadWritePanel extends PlacementElement { DataModel data; ControlModel control; color bgcolor; color fgcolor; ReadWritePanel(DataModel data, ControlModel control, float x, float y, float w, float h) { super(x, y, w, h); this.data = data; this.control = control; int x1, y1; x1 = round(getScreenX(5)); y1 = round(getScreenY(5)); addController(control.controlP5.addButton("readData",1,x1,y1,60,19)); x1 = (int) getScreenX(w-65); addController(control.controlP5.addButton("writeData",1,x1,y1,60,19)); bgcolor = color(0, 0, 0); fgcolor = color(255, 0, 0); } void draw(PGraphics out) { boolean modified = false; float x1, y1; out.beginDraw(); if (redraw) { out.fill(bgcolor); out.stroke(fgcolor); out.rectMode(CORNER); out.rect(getX(0), getY(0), w-1, h-1); redraw = false; } out.endDraw(); } } class KrigingPanel extends PlacementElement { DataModel data; ControlModel control; color bgcolor; color fgcolor; RadioButton krigType; Controller meanSet, dataMean; Controller calc; KrigingPanel(DataModel data, ControlModel control, float x, float y, float w, float h) { super(x, y, w, h); this.data = data; this.control = control; int x1, y1; x1 = round(getScreenX(10)); y1 = round(getScreenY(10)); addController(krigType = control.controlP5.addRadioButton("krigType", (int) x1, (int) y1)); krigType.setItemsPerRow(1); krigType.addItem("Ordinary Kriging", 0); krigType.addItem("Simple Kriging", 1); krigType.setNoneSelectedAllowed(false); y1 = round(getScreenY(50)); addController(meanSet = addTextFloat("meanSet", control.krig.getMean(control.krig.kd), x1, y1, 50, 20)); meanSet.setLabel("Mean"); x1 += 60; addController(dataMean = control.controlP5.addButton("dataMean",1,x1,y1,60,20)); dataMean.setLabel("Data Mean"); x1 = round(getScreenX(10)); y1 = round(getScreenY(h-30)); addController(calc = control.controlP5.addButton("calcKriging",1,x1,y1,(int)w-20,19)); calc.setLabel("Calculate Kriging"); calc.setColorBackground(color(0,127,0)); calc.setColorActive(color(51,192,51)); calc.setColorForeground(color(51,192,51)); bgcolor = color(0, 0, 0); fgcolor = color(255, 0, 0); controlsFromKriging(control.krig); redraw = true; } void controlsFromKriging(Kriging krig) { int type; disableControllers(); krigType.activate(type = krig.getCode()); krigType.show(); if (type==1) { meanSet.show(); ((Textfield) meanSet).setText(control.textFloat.format(krig.mean)); dataMean.show(); } calc.show(); } void enableControllers() { controlsFromKriging(control.krig); } void draw(PGraphics out) { out.beginDraw(); if (redraw) { out.fill(bgcolor); out.stroke(fgcolor); out.rectMode(CORNER); out.rect(getX(0), getY(0), w-1, h-1); redraw = false; } out.endDraw(); } } Controller addTextFloat(String name, float init, int x1, int y1, int w1, int h1) { Textfield tf; tf = control.controlP5.addTextfield(name, x1, y1, w1, h1); tf.setText(control.textFloat.format(init)); tf.setAutoClear(false); return tf; } class GridPanel extends PlacementElement { DataModel data; ControlModel control; color bgcolor; color fgcolor; Controller xMin, xMax, yMin, yMax, zMin, zMax, xRes, yRes, zRes; GridPanel(DataModel data, ControlModel control, float x, float y, float w, float h) { super(x, y, w, h); this.data = data; this.control = control; int xstart = round(getScreenX(10)), ystart = round(getScreenY(10)); int vspacing = 35, hspacing = 100, x1, y1; x1 = xstart; y1 = ystart; addController(xMin = addTextFloat("xMin", control.xMin, x1, y1, 60, 20)); y1 += vspacing; addController(yMin = addTextFloat("yMin", control.yMin, x1, y1, 60, 20)); y1 += vspacing; addController(zMin = addTextFloat("zMin", control.zMin, x1, y1, 60, 20)); x1 += hspacing; y1 = ystart; addController(xMax = addTextFloat("xMax", control.xMax, x1, y1, 60, 20)); y1 += vspacing; addController(yMax = addTextFloat("yMax", control.yMax, x1, y1, 60, 20)); y1 += vspacing; addController(zMax = addTextFloat("zMax", control.zMax, x1, y1, 60, 20)); x1 += hspacing; y1 = ystart; addController(xRes = control.controlP5.addSlider("xRes",2,100,control.xRes,x1,y1,100,20)); y1 += vspacing; addController(yRes = control.controlP5.addSlider("yRes",2,100,control.yRes,x1,y1,100,20)); y1 += vspacing; addController(zRes = control.controlP5.addSlider("zRes",1,100,control.zRes,x1,y1,100,20)); bgcolor = color(0, 0, 0); fgcolor = color(255, 0, 255); } void draw(PGraphics out) { boolean modified = false; float x1, y1; out.beginDraw(); if (redraw) { out.fill(bgcolor); out.stroke(fgcolor); out.rectMode(CORNER); out.rect(getX(0), getY(0), w-1, h-1); redraw = false; } out.endDraw(); } } class LayersPanel extends PlacementElement { DataModel data; ControlModel control; color bgcolor; color fgcolor; Slider xLayer, yLayer, zLayer; LayersPanel(DataModel data, ControlModel control, float x, float y, float w, float h) { super(x, y, w, h); this.data = data; this.control = control; int xStart = round(x+5), yStart = round(y+5), hSpacing = (int) (w/3.0), sWidth = (int) (w/3.0 - 45), x1, y1; x1 = xStart; y1 = yStart; addController(xLayer = control.controlP5.addSlider("xLayer",0,data.krig.out.xRes-1,control.yzlayer,x1,y1,sWidth,(int)h-10)); x1 += hSpacing; addController(yLayer = control.controlP5.addSlider("yLayer",0,data.krig.out.yRes-1,control.xzlayer,x1,y1,sWidth,(int)h-10)); x1 += hSpacing; addController(zLayer = control.controlP5.addSlider("zLayer",0,data.krig.out.zRes-1,control.xylayer,x1,y1,sWidth,(int)h-10)); bgcolor = color(0, 0, 0); fgcolor = color(255, 0, 0); } void draw(PGraphics out) { boolean modified = false; float x1, y1; out.beginDraw(); if (redraw) { out.fill(bgcolor); out.stroke(fgcolor); out.rectMode(CORNER); out.rect(getX(0), getY(0), w-1, h-1); redraw = false; } out.endDraw(); } void updateState() { flagRedraw(); xLayer.hide(); yLayer.hide(); zLayer.hide(); if (data.krig.out.zRes > 1) { xLayer.show(); yLayer.show(); zLayer.show(); } else { return; } xLayer.setValue(0); yLayer.setValue(0); zLayer.setValue(0); xLayer.setMax(data.krig.out.xRes-1); yLayer.setMax(data.krig.out.yRes-1); zLayer.setMax(data.krig.out.zRes-1); } } abstract class SamplePanel extends GraphicsPlacementElement { DataModel data; ControlModel control; PFont font; color bgcolor; color textcolor; SamplePanel(DataModel data, ControlModel control, PFont font, float x, float y, float w, float h) { super(x, y, w, h, P2D); this.data = data; this.control = control; this.font = font; bgcolor = color(0,0,0); textcolor = color(255,255,255); } abstract boolean updatePoint(); void draw(PGraphics out, float[] point) { boolean modified = false; float x1, y1; pi.beginDraw(); if (redraw) { pi.fill(bgcolor); pi.stroke(textcolor); pi.rect(0, 0, w-1, h-1); redraw = false; modified = true; } if (updatePoint()) { int[] cell; int startx = 50; int starty = 20; int spacing = 15; boolean valid; cell = control.nearestCell(point); valid = !control.invalidValue(cell); pi.textFont(font,12); pi.textMode(SCREEN); pi.fill(textcolor); x1 = startx; y1 = starty; pi.textAlign(RIGHT); pi.text("X = ", x1, y1); y1+=spacing; pi.text("Y = ", x1, y1); y1+=spacing; pi.text("Z = ", x1, y1); if (valid) { y1+=spacing; pi.text("EST = ", x1, y1); y1+=spacing; pi.text("VAR = ", x1, y1); } x1 = startx; y1 = starty; pi.textAlign(LEFT); pi.text(point[0], x1, y1); y1+=spacing; pi.text(point[1], x1, y1); y1+=spacing; pi.text(point[2], x1, y1); if (valid) { y1+=spacing; pi.text(control.estValue(cell), x1, y1); y1+=spacing; pi.text(control.varValue(cell), x1, y1); } flagRedraw(); modified = true; } pi.endDraw(); if (modified) { out.image(pi, x, y); } } } class ProbePanel extends SamplePanel { DataModel data; ControlModel control; PFont font; ProbePanel(DataModel data, ControlModel control, PFont font, float x, float y, float w, float h) { super(data, control, font, x, y, w, h); this.data = data; this.control = control; this.font = font; textcolor = color(204,204,204); bgcolor = color(51,51,51); } boolean updatePoint() { return control.updateProbe(); } void draw(PGraphics out) { draw(out, control.probe); } } class ClickedPanel extends SamplePanel { DataModel data; ControlModel control; PFont font; ClickedPanel(DataModel data, ControlModel control, PFont font, float x, float y, float w, float h) { super(data, control, font, x, y, w, h); this.data = data; this.control = control; this.font = font; bgcolor = color(51,51,51); textcolor = color(255,255,51); } boolean updatePoint() { return (control.clicked != null); } void draw(PGraphics out) { draw(out, control.clicked); } } class VariogramPanel extends PlacementElement { DataModel data; ControlModel control; color bgcolor; color fgcolor; RadioButton[] type; Button add; Button[] delete; Controller[] cc; Controller[][] anis, angles; Controller nugget; int structHeight; VariogramPanel(DataModel data, ControlModel control, float x, float y, float w, float h) { super(x, y, w, h); this.data = data; this.control = control; bgcolor = color(0, 0, 0); fgcolor = color(255,255,255); type = new RadioButton[MAX_VARIO_STRUCT]; delete = new Button[MAX_VARIO_STRUCT]; anis = new Controller[MAX_VARIO_STRUCT][3]; angles = new Controller[MAX_VARIO_STRUCT][3]; cc = new Controller[MAX_VARIO_STRUCT]; structHeight = 90; int x1 = (int)getScreenX(20), y1 = (int)getScreenY(20); for (int i=0; i < MAX_VARIO_STRUCT; ++i) { x1 = (int)getScreenX(20); y1 = (int)getScreenY(15+i*(structHeight)); addController(cc[i] = addTextFloat("cc" + i, 1.0, x1, y1, 50, 20)); cc[i].setLabel("cc"); type[i] = addTypeRadio("varioStructType" + i, x1+60, y1); for (int j=0; j<3; ++j) { addController(anis[i][j] = addTextFloat("anis" +j + i, 1.0, x1+150+60*j, y1, 50, 20)); addController(angles[i][j] = addTextFloat("angles" +j + i, 1.0, x1+150+60*j, y1+35, 50, 20)); anis[i][j].setLabel("scale " + (j+1)); angles[i][j].setLabel("angle " + (j+1)); } //type[i].deactivateAll(); addController(delete[i] = control.controlP5.addButton("deleteVarioStruct" + i,1,x1,y1+45,40,19)); delete[i].setColorBackground(color(127,0,0)); delete[i].setColorActive(color(192,51,51)); delete[i].setColorForeground(color(192,51,51)); delete[i].setLabel("Delete"); } x1 = (int)getScreenX(20); y1 = (int)getScreenY(h-40); addController(nugget = addTextFloat("nugget", 1.0, x1, y1, 50, 20)); x1 = (int)getScreenX(w-60); addController(add = control.controlP5.addButton("addVarioStruct",1,x1,y1,40,19)); add.setLabel("Add"); add.setColorBackground(color(0,127,0)); add.setColorActive(color(51,192,51)); add.setColorForeground(color(51,192,51)); controlsFromVariogram(control.krig.vario); } void controlsFromVariogram(Variogram vario) { // Turn controllers off this.disableControllers(); int numstruct = vario.structures.length; for (int i=0; i < numstruct; ++i) { VariogramStructure structure = vario.structures[i]; type[i].activate(structure.getCode()); type[i].show(); for (int j=0; j<3; ++j) { ((Textfield) anis[i][j]).setText(control.textFloat.format(structure.rot.anis[j])); anis[i][j].show(); ((Textfield) angles[i][j]).setText(control.textFloat.format(structure.rot.angles[j])); angles[i][j].show(); } ((Textfield) cc[i]).setText(control.textFloat.format(structure.cc)); cc[i].show(); delete[i].show(); } add.show(); add.setPosition(getScreenX(20), getScreenY(10) + numstruct*structHeight); nugget.show(); ((Textfield) nugget).setText(control.textFloat.format(vario.nugget)); switch (numstruct) { case (MAX_VARIO_STRUCT): // hide add button add.hide(); break; case 1: // hide delete button delete[0].hide(); break; } } void updateState() { controlsFromVariogram(control.krig.vario); flagRedraw(); } void draw(PGraphics out) { out.beginDraw(); if (redraw) { out.fill(bgcolor); out.stroke(fgcolor); out.rectMode(CORNER); out.rect(getX(0), getY(0), w-1, h-1); for (int i=0; i cyan r = 0; g = round(2550 * val); b = 255; return color(r,g,b); } val -= 0.1; if (val <= 0.1) { // cyan -> green r = 0; g = 255; b = 255 - round(2550 * val); return color(r,g,b); } val -= 0.1; if (val <= 0.1) { // green -> yellow r = round(2550 * val); g = 255; b = 0; return color(r,g,b); } val -= 0.1; if (val <= 0.1) { // yellow -> orange r = 255; g = 255 - round(1280 * val); b = 0; return color(r,g,b); } val -= 0.1; if (val <= 0.1) { // orange -> red r = 255; g = 127 - round(1270 * val); b = 0; return color(r,g,b); } return color(255, 0, 0); } /* Copyright (c) 2010, Chris Want, Research Support Group, AICT, University of Alberta. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Contributors: Chris Want (University of Alberta) */