00001 package edu.tum.cs.ias.knowrob.vis.applets;
00002
00003 import java.awt.GridLayout;
00004 import java.awt.event.MouseListener;
00005 import java.awt.event.MouseMotionListener;
00006 import java.io.FileInputStream;
00007 import java.io.ObjectInputStream;
00008 import java.util.*;
00009
00010 import javax.swing.JFrame;
00011
00012 import controlP5.ControlP5;
00013 import controlP5.ControlWindow;
00014 import controlP5.Textarea;
00015 import controlP5.Textfield;
00016 import controlP5.ControlEvent;
00017 import edu.tum.cs.ias.knowrob.prolog.PrologInterface;
00018
00019 import processing.core.*;
00020 import jpl.Query;
00021 public class PrologVisualizationCanvas extends PApplet implements MouseListener, MouseMotionListener, MapObjClickListener {
00022
00023 private static final long serialVersionUID = 4575739930038583994L;
00024 public enum Part {KITCHEN_VIS, ACTION_VIS, VIDEO, ALL};
00025
00029 private boolean debugMode = false;
00030
00031
00032
00033 protected ActionVisApplet AVObject;
00034 protected SemanticMapVisApplet KVObject;
00035 public ControlP5 controlP5;
00036 protected ControlWindow controlWindow;
00037
00038 public JFrame img_window;
00039
00040
00041 public PrologVisualizationCanvas() {
00042
00043 img_window = null;
00044
00045
00046
00047 this.init();
00048 this.setSize(560, 620);
00049
00050 AVObject = new ActionVisApplet();
00051 AVObject.init();
00052 AVObject.setSize(550, 600);
00053 AVObject.setPrologVisCanvas(this);
00054
00055
00056 KVObject = new SemanticMapVisApplet();
00057 KVObject.init();
00058 KVObject.setSize(720, 600);
00059 KVObject.setMapObjClickListener(this);
00060
00061
00062 this.add(KVObject);
00063
00064
00065
00066
00067
00068
00069 this.draw();
00070 this.setVisible(true);
00071 this.setSize(1270, 620);
00072
00073 if(debugMode) {
00074 (new Thread(new testDataLoader(this))).start();
00075 }
00076
00077 }
00078
00079 public void draw() {
00080 background(20, 20, 20);
00081 }
00082
00083
00088 public void displayFixed(String identifier) {
00089 KVObject.displayActionFixedIdent(addSingleQuotes(identifier));
00090 KVObject.redraw();
00091 }
00092
00097 public void displayAction(String identifier) {
00098 KVObject.displayAction(addSingleQuotes(identifier));
00099 KVObject.redraw();
00100 }
00101
00106 public void displayEyeTrajectory(String identifier) {
00107 KVObject.displayEyeTrajectory(addSingleQuotes(identifier));
00108 KVObject.redraw();
00109 }
00110
00111 public void displayHumanTrajectory(String identifier, String handUsed){
00112 KVObject.displayHumanTrajectory(addSingleQuotes(identifier), addSingleQuotes(handUsed));
00113 KVObject.redraw();
00114 }
00115
00122 public void setActionInformation(String[][][] pl_list, String hand, int level) {
00123 if(AVObject != null)
00124 AVObject.setActionInformation(pl_list, hand, level);
00125 KVObject.redraw();
00126 }
00127
00131 public void clear(){
00132 KVObject.clear();
00133 KVObject.redraw();
00134 }
00135
00141 public void drawBackground(){
00142 KVObject.drawBackground();
00143 KVObject.redraw();
00144 }
00145
00146
00151 public void addObject(String identifier){
00152 KVObject.addObject(addSingleQuotes(identifier));
00153 KVObject.redraw();
00154 }
00155
00162 public void addObjectWithChildren(String identifier) {
00163 KVObject.addObjectWithChildren(addSingleQuotes(identifier));
00164 KVObject.redraw();
00165 }
00166
00171 public void addTrajectory(String[] identifiers){
00172
00173 for(String identifier : identifiers) {
00174
00175 addObject(identifier);
00176
00177
00178 KVObject.highlightItem(addSingleQuotes(identifier), true, SemanticMapVisApplet.convertColor(255, 221, 0, 255));
00179
00180 }
00181 KVObject.redraw();
00182 }
00183
00188 public void removeObject(String identifier){
00189 KVObject.removeObject(addSingleQuotes(identifier));
00190 KVObject.redraw();
00191 }
00192
00193
00200 public void removeObjectWithChildren(String identifier) {
00201 KVObject.removeObjectWithChildren(addSingleQuotes(identifier));
00202 KVObject.redraw();
00203 }
00204
00210 public void highlight(String identifier, boolean highlight) {
00211 KVObject.highlightItem(addSingleQuotes(identifier),highlight);
00212 KVObject.redraw();
00213 }
00214 public void highlight(String identifier, boolean highlight, int color) {
00215 KVObject.highlightItem(addSingleQuotes(identifier),highlight, color);
00216 KVObject.redraw();
00217 }
00218 public void highlight(String identifier, boolean highlight, int r, int g, int b) {
00219
00220 int c = (((((255 << 8) + r) << 8) + g) << 8) + b;
00221 KVObject.highlightItem(addSingleQuotes(identifier),highlight, c);
00222 KVObject.redraw();
00223
00224 }
00225 public void highlight(String identifier, boolean highlight, int r, int g, int b, String prob) {
00226
00227
00228 int alpha = (int) (255 * Float.valueOf(prob));
00229 int c = (((((alpha << 8) + r) << 8) + g) << 8) + b;
00230
00231
00232
00233
00234 KVObject.highlightItem(addSingleQuotes(identifier),highlight, c);
00235 KVObject.redraw();
00236 }
00241 int HSVtoRGB (float h, float s, float v) {
00242
00243 float rr = 0, gg = 0, bb = 0;
00244 float hh = (6 * h) % 6;
00245 int c1 = (int) hh;
00246 float c2 = hh - c1;
00247 float x = (1 - s) * v;
00248 float y = (1 - (s * c2)) * v;
00249 float z = (1 - (s * (1 - c2))) * v;
00250 switch (c1) {
00251 case 0: rr=v; gg=z; bb=x; break;
00252 case 1: rr=y; gg=v; bb=x; break;
00253 case 2: rr=x; gg=v; bb=z; break;
00254 case 3: rr=x; gg=y; bb=v; break;
00255 case 4: rr=z; gg=x; bb=v; break;
00256 case 5: rr=v; gg=x; bb=y; break;
00257 }
00258 int N = 256;
00259 int r = Math.min(Math.round(rr*N),N-1);
00260 int g = Math.min(Math.round(gg*N),N-1);
00261 int b = Math.min(Math.round(bb*N),N-1);
00262
00263 int rgb = ((r&0xff)<<16) | ((g&0xff)<<8) | b&0xff;
00264 return rgb;
00265 }
00266
00272 public void highlightWithChildren(String identifier, boolean highlight) {
00273 KVObject.highlightReachable(addSingleQuotes(identifier),highlight);
00274 KVObject.redraw();
00275 }
00276
00277
00281 public void clearHighlight() {
00282 KVObject.clearHighlights();
00283 KVObject.redraw();
00284 }
00285
00286
00291 public void mapObjectClicked(String identifier) {
00292 displayInformationForEntity(addSingleQuotes(identifier));
00293 KVObject.redraw();
00294 }
00295
00296
00297 public void setViewParameters(float xShift, float yShift,float xRot, float yRot, float zoom) {
00298 KVObject.setViewParameters(xShift, yShift, xRot, yRot, zoom);
00299 KVObject.redraw();
00300 }
00301
00302 public void showImagesInNewWindow(String[] imgs) {
00303
00304 img_window = new JFrame();
00305 img_window.setLayout(new GridLayout(1,imgs.length));
00306
00307 int frameWidth = 0;
00308 int frameHeight = 30;
00309
00310 int totalWidth = frameWidth;
00311 int totalHeight = frameHeight;
00312
00313 for(String img : imgs) {
00314 img = img.replaceAll( "\"", "" );
00315
00316 ImageViewerApplet iviewer = new ImageViewerApplet(img);
00317 iviewer.init();
00318
00319 img_window.getContentPane().add(iviewer);
00320 iviewer.setSize(iviewer.width,iviewer.height);
00321 totalWidth += iviewer.width;
00322 totalHeight = max(iviewer.height + frameHeight, totalHeight);
00323 }
00324
00325 img_window.setSize(totalWidth, totalHeight);
00326 img_window.pack();
00327 img_window.setVisible(true);
00328 img_window.setResizable(true);
00329 }
00330
00331
00335
00336
00337
00338
00339 @SuppressWarnings("unused")
00340 private ArrayList<String[]> readInformationForEntity(String entity) {
00341
00342
00343 ArrayList<String[]> bindings = new ArrayList<String[]>();
00344 HashMap<String, Vector<String>> qres = PrologInterface.executeQuery("findall([P|O], (rdf_has("+entity+", P, O)), Cs)");
00345
00346 if(qres!=null) {
00347 for(String k : qres.keySet()) {
00348
00349 Vector<String> res = qres.get(k);
00350
00351 for(String o : res) {
00352
00353 String[] list = o.split("'\\.'", 2);
00354 if(list.length<2) continue;
00355 String rest = list[1];
00356
00357 bindings.addAll(dottedPairsToArrayList(rest));
00358 }
00359 }
00360 }
00361 return bindings;
00362 }
00363
00364 public void actionsInActivity() {
00365 HashMap<String, Vector<String>> qres = PrologInterface.executeQuery("rdf_has(Plan, rdfs:label, literal(type('http://www.w3.org/2001/XMLSchema#string', 'set a table'))), " +
00366 "comp_ehow:matching_actions(Plan, Act)");
00367 if(qres!=null) {
00368 Vector<String> act = qres.get("Act");
00369
00370 if(act != null) {
00371
00372
00373 this.AVObject.setActionsInActivity(act.toArray());
00374 }
00375 }
00376 }
00377
00378 private void displayInformationForEntity(String entity) {
00379
00380 HashMap<String, Vector<String>> qres = PrologInterface.executeQuery("rdf_has("+entity+", P, O)");
00381
00382 if(qres!=null) {
00383 Vector<String> P = qres.get("P");
00384 Vector<String> O = qres.get("O");
00385 String info = "";
00386 if(P != null && O != null)
00387 for(int i=0;i<P.size() && i<O.size();i++) {
00388 info += printKey(P.get(i)) + ": " + printValue(O.get(i)) + "\n";
00389 }
00390
00391 if(controlP5!=null && controlP5.getController("CurrentAction")!=null)
00392 ((Textfield) controlP5.getController("CurrentAction")).setValue(printKey(entity));
00393 if(controlP5!=null && controlP5.getGroup("CurrentAttributes")!=null)
00394 ((Textarea) controlP5.getGroup("CurrentAttributes")).setText(info);
00395
00396 System.out.println(info);
00397 }
00398
00399 }
00400
00401 private String printKey(String k) {
00402 String[] ks = k.split("#");
00403 if(ks.length>1) {
00404 String res = ks[1].replaceAll("'", "");
00405 return res;
00406 }
00407 else return k;
00408 }
00409
00410 private String printValue(String v) {
00411 if (v.contains("#")) {
00412 String[]vs=v.split("#");
00413 return vs[1].replaceAll("'", "").replaceAll("\\(", "").replaceAll("\\)", "");
00414
00415 } else if(!v.startsWith("literal")) {
00416 return v.replaceAll("'", "").replaceAll("\\(", "").replaceAll("\\)", "");
00417
00418 } else {
00419
00420 String v1 = v.replaceFirst("literal\\(type\\('http://www\\.w3\\.org/2001/XMLSchema", "");
00421 return v1.replaceAll("'", "").replaceAll("\\(", "").replaceAll("\\)", "");
00422 }
00423 }
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470 public void controlEvent(ControlEvent e) {
00471
00472 if(e.getController().getId()==101 && e.getValue()==2.0)
00473 actionsInActivity();
00474
00475 }
00476
00477
00478 private ArrayList<String[]> dottedPairsToArrayList(String rest) {
00479 ArrayList<String[]> bindings = new ArrayList<String[]>();
00480 while(rest.length()>0) {
00481 String[] l = rest.split("'\\.'", 2);
00482
00483 if((l[0].equals("")) || (l[0].equals("("))) {
00484 if(l[0].startsWith("(")) {
00485 rest=l[1]; continue;
00486
00487 } else break;
00488 } else {
00489 bindings.add(l[0].substring(1, l[0].length()-2).split(", "));
00490 if(l.length>1) {
00491 rest=l[1]; continue;
00492 } else break;
00493 }
00494
00495 }
00496 return bindings;
00497 }
00498
00499
00500 public static String removeSingleQuotes(String str) {
00501 if(str.startsWith("'"))
00502 str = str.substring(1);
00503
00504 if(str.endsWith("'"))
00505 str = str.substring(0, str.length()-1);
00506 return str;
00507 }
00508
00509 public static String addSingleQuotes(String str) {
00510 return "'"+removeSingleQuotes(str)+"'";
00511 }
00512
00513
00514 public SemanticMapVisApplet getKitchenVisApplet() {
00515 return this.KVObject;
00516 }
00517
00518 public static void main(String args[]) {
00519 PApplet.main(new String[] { "de.tum.in.fipm.kipm.gui.visualisation.base.PrologVisualizationCanvas" });
00520 }
00521 }
00522
00523 class testDataLoader implements Runnable {
00524
00525 PrologVisualizationCanvas c;
00526 public testDataLoader(PrologVisualizationCanvas c) {
00527 this.c = c;
00528 }
00529
00530 @SuppressWarnings("unchecked")
00531 public void run() {
00532
00533 try{
00534 Thread.sleep(20000);
00535 }catch(Exception e){};
00536 new Query("initCmdProlog").oneSolution();
00537 new Query("ensure_loaded('C:/Projects/Eclipse2/kipm/demo.pl')").oneSolution();
00538
00539 new Query("ddLeft").oneSolution();
00540 try{
00541 FileInputStream fos = new FileInputStream("C:/Projects/Eclipse2/kipm/tmpDataLeft.ser");
00542 ObjectInputStream oos = new ObjectInputStream(fos);
00543
00544 ArrayList<Object[]> o = (ArrayList<Object[]>)oos.readObject();
00545
00546 for(Object[] obj : o){
00547 c.setActionInformation((String[][][])obj[0], (String)obj[1], (Integer)obj[2]);
00548 }
00549
00550 oos.close();
00551 }catch(Exception e){}
00552
00553
00554 new Query("ddRight").oneSolution();
00555 try{
00556 FileInputStream fos = new FileInputStream("C:/Projects/Eclipse2/kipm/tmpDataRight.ser");
00557 ObjectInputStream oos = new ObjectInputStream(fos);
00558
00559 ArrayList<Object[]> o = (ArrayList<Object[]>)oos.readObject();
00560
00561 for(Object[] obj : o){
00562 c.setActionInformation((String[][][])obj[0], (String)obj[1], (Integer)obj[2]);
00563 }
00564
00565 oos.close();
00566 }catch(Exception e){}
00567
00568
00569 }
00570
00571 }