ActionVisApplet.java
Go to the documentation of this file.
00001 package edu.tum.cs.ias.knowrob.vis.applets;
00002 
00003 import java.awt.event.MouseEvent;
00004 import java.awt.event.MouseListener;
00005 import java.awt.event.MouseMotionListener;
00006 import java.io.Serializable;
00007 import java.util.ArrayList;
00008 import java.util.HashMap;
00009 
00010 import processing.core.PApplet;
00011 import processing.core.PFont;
00012 import processing.core.PGraphics;
00013 import processing.core.PGraphics3D;
00014 import controlP5.ControlEvent;
00015 import controlP5.RadioButton;
00016 
00017 public class ActionVisApplet extends PApplet implements MouseListener, MouseMotionListener {
00018 
00019   static final long serialVersionUID=0;
00020 
00021   PGraphics buffer;
00022   private PrologVisualizationCanvas prologVisCanvas = null;
00023 
00025   // DISPLAY PROPERTIES (ROTATION, ZOOM, ...)
00026   
00027   // init values for the display and mouse interaction
00028   // init values for the display and mouse interaction
00029   float leftMouseX=-1.0f, leftMouseY=-1.0f, rightMouseX=-1.0f, rightMouseY=-1.0f, centerMouseY=-1.0f;
00030   float xRotDisplay=-2.549f, yRotDisplay=86.79f, xShiftDisplay=410f, yShiftDisplay=15f, zoomDisplay=1f;
00031 
00032   PFont verdana;
00033   PFont verdanaBold;
00034   PFont dejavu;
00035 
00036   ArrayList<String> actionTypes;
00037   ArrayList<String> objectTypes;
00038     
00040   // BUFFERS
00041   ArrayList<Integer> colors = new ArrayList<Integer>(12);       // the colors used in the vis. HumanTrajVis
00042 
00043   
00044   private ArrayList<ArrayList<ActionInformation>> leftHandActions = new ArrayList<ArrayList<ActionInformation>>();
00045   private ArrayList<ArrayList<ActionInformation>> rightHandActions = new ArrayList<ArrayList<ActionInformation>>();
00046   
00047   private HashMap<Integer, String> color2id = new HashMap<Integer, String>();
00048   
00050   // INDICES
00051   
00052   public int actionIndex = 0;                   // index for the array lists actionData and trajectoryData
00053   private int idColor=0xFFFF0000;
00054 
00056   // FLAGS
00057   
00058   int maxLevel = 1000;
00059   boolean initialize = false;
00060 
00064 //      static {
00065 //              try {
00066 //                      Vector<String> args= new Vector<String>(Arrays.asList(Prolog.get_default_init_args()));
00067 //                      args.add( "-G128M" );
00068 //                      args.add( "-q" );
00069 //                      args.add( "-nosignals" );
00070 //                      Prolog.set_default_init_args( args.toArray( new String[0] ) );
00071 //                      // load the appropriate startup file for this context
00072 //                      new Query("ensure_loaded('/home/tenorth/work/owl/gram_ias.pl')").oneSolution();
00073 //                      new Query( "initCmdProlog" ).allSolutions();
00074 //      
00075 //              } catch(Exception e) {
00076 //                      e.printStackTrace();
00077 //              }
00078 //      }
00079         
00080         
00081   
00082   public void setup() {
00083 
00084     actionTypes= new ArrayList<String>();
00085     objectTypes= new ArrayList<String>();
00086                      
00087                 size(550, 600, PGraphics3D.P3D);
00088                 buffer = createGraphics(width, height, PGraphics3D.P3D);
00089     lights();
00090     
00091     verdana = createFont("Verdana", 11);
00092     verdanaBold = createFont("Verdana-Bold", 18);
00093     dejavu = createFont("DejaVu Sans",13);
00094     
00095     textFont(verdana);
00096     textFont(verdanaBold);
00097     textFont(dejavu);    
00098     hint(ENABLE_ACCURATE_TEXTURES);
00099     
00100     
00101     ellipseMode(RADIUS);
00102     frameRate(20);
00103     
00104     setColors();
00105 
00106     noLoop();
00107     draw();
00108     
00109     if(prologVisCanvas != null) prologVisCanvas.validate();
00110     
00111   }
00112 
00113 // This applet has the information of the abstract level for actions
00114   public void draw() {
00115     
00116         background(20, 20, 20);
00117         
00118     cursor(CROSS);
00119     ortho(-width/2, width/2, -height/2, height/2, -10, 10); 
00120 
00121     pushMatrix();
00122 
00123             translate(xShiftDisplay, yShiftDisplay, 0.0f);
00124                 
00125             rotateX( radians(xRotDisplay) );  
00126             rotateY( radians( yRotDisplay) );
00127     
00128         translate(2000f, height, -400.0f);
00129     
00130         //System.out.println("xShift: " + xShiftDisplay +", yShift: " + yShiftDisplay +", xRot: " + xRotDisplay +"yRot: " + yRotDisplay);
00131 
00132         
00133         lights();
00134         pushMatrix();
00135               
00136                   textFont(verdana);
00137                   textMode(SCREEN);
00138                   textAlign(CENTER);
00139                   fill(0xFFFFFFFF);stroke(0xFFFFFFFF);
00140                   
00141                   text("left hand",  screenX(0, 25, -50), screenY(0, 25, -50));
00142                   text("right hand", screenX(0, 25, 50),  screenY(0, 25, 50));
00143         
00144                   text("abstraction level", screenX(0, -200, 0),  screenY(0, -200, 0));
00145                   
00146           strokeWeight(2);
00147               line(0, 0, 0,   1000, 0, 0);
00148               line(0, 0, 0,   0, -180, 0);
00149                       line(0, -180, 0,   0, -170, -5);
00150                       line(0, -180, 0,   0, -170, 5);
00151               
00152               line(0, 0, -100,   0, 0, 100);
00153 
00154         popMatrix(); 
00155 
00156         pushMatrix();
00157                 drawActionSequence(this.g, false);
00158         popMatrix(); 
00159               
00160     popMatrix();
00161 
00162         
00163  }
00164   
00165   
00169   // 
00170   // PRIMITIVE DRAWING FUNCTIONS (POINTS, BOXES, TRAJECTORIES,...)
00171   // 
00172 
00173   public void drawActionSequence(PGraphics g, boolean isBuffer) {
00174 
00175         g.noStroke();
00176         int i=0;
00177         
00178         if(leftHandActions.size()<1) return;
00179         if(rightHandActions.size()<1) return;
00180 
00181         int level=0;
00182         while(level <= maxLevel) {
00183                 
00184                 ArrayList<ArrayList<ActionInformation>> actions;
00185                 for(String side: new String[]{"left", "right"}) {
00186                         
00187                         if(side.equals("left")) actions=leftHandActions;
00188                         else                                    actions=rightHandActions;
00189                 
00190                         // draw action sequence
00191                         if(level>=actions.size()) continue; 
00192                         for (i=0; i< actions.get(level).size(); i++) {
00193                                 
00194                                 if(i>=actions.get(level).size()) continue;
00195                                 
00196                                 ActionInformation action  = actions.get(level).get(i);
00197 
00198 
00199                                 float actionLengthFactor = 1.0f;
00200                                 float start = actionLengthFactor*action.getStarttime();
00201                                 float end   = actionLengthFactor*action.getEndtime();
00202                                 if(end==-1) end=start;
00203                                 
00204                                 float yshift = -40 * level;
00205                                 float zshift = (side.equals("left"))?(-40):(40);
00206 
00207                                 g.pushMatrix();
00208                                         g.fill(this.getColor(actions.get(level).get(i), isBuffer));
00209                                         
00210                                         g.translate(100*start   // start position
00211                                                         +50*(end-start) // shift to the center of the box
00212                                                                         // vv subtract first action start time
00213                                                         -(100*actionLengthFactor*actions.get(0).get(actionIndex).getTime()),yshift,zshift);
00214                                         g.box(((end==start)?(1):(100*(end-start))), 20, 40);                    
00215                                 g.popMatrix();
00216 
00217                                 
00218                         }
00219 
00220                 }
00221                 
00222                 level++;
00223         }
00224   }
00225 
00226 
00227   private int getColor(ActionInformation item, boolean isBuffer) {
00228 
00229           // return unique color if drawn into buffer
00230           if(isBuffer)
00231                   return(item.getIdColor());
00232           
00233           // check if frame
00234           if(item.endtime==-1) {
00235                   return (0xFF000000 + (((int)(80*item.starttime++)%200)<< 16));
00236           }
00237           
00238           // select color based on controlWindow.colorType      
00239           if(prologVisCanvas != null && (prologVisCanvas.controlP5.getController("color_radio")!=null) && ((RadioButton) prologVisCanvas.controlP5.getGroup("color_radio")).getValue()==0) {
00240                   
00241                   // action type
00242                   String[] act = item.getTypes();
00243                   if(!actionTypes.contains(act[0])) {actionTypes.add(act[0]);}
00244                   int idx = actionTypes.indexOf(act[0]);
00245                   if(idx<0 || idx>this.colors.size()) {System.out.println("Missing color for " + act[0]); return 0;}
00246                   return this.colors.get(idx);
00247           
00248           } else if(prologVisCanvas != null && (prologVisCanvas.controlP5.getController("color_radio")!=null) && ((RadioButton) prologVisCanvas.controlP5.getGroup("color_radio")).getValue()==1) {
00249                   
00250                   // object type                  
00251                   String obj = item.getObjecttype();
00252                   if(!objectTypes.contains(obj)) {objectTypes.add(obj);}
00253                   int idx = objectTypes.indexOf(obj);
00254                   
00255                   if(idx<0 || idx>this.colors.size()) {System.out.println("Missing color for " + obj);  return 0;}
00256                   
00257                   return this.colors.get(idx);
00258                   
00259           } else if(prologVisCanvas != null && (prologVisCanvas.controlP5.getController("color_radio")!=null) && ((RadioButton) prologVisCanvas.controlP5.getGroup("color_radio")).getValue()==2) {
00260                   
00261                   // missing in activity -> return red until activities are implemented
00262                   if(item.isInActivity()) {
00263                           return 0xFF00CC00;
00264                   }
00265                   else return 0xFFCC0000;
00266           }
00267           return 0;
00268   }
00269   
00270   
00271 
00272   
00273   
00277   // 
00278   // LOADING DATA
00279   // 
00280 
00281   public void setActionInformation(String[][][] pl_list, String hand, int level) {
00282         
00283           try{
00284           
00285         // read list of actions from Prolog
00286         ArrayList<ActionInformation> actionlist = new ArrayList<ActionInformation>();
00287         for(String[][] infos : pl_list) {
00288                 
00289                 String label = infos[0][0];
00290                 
00291                 float starttime=0.0f;
00292                 try{
00293                         starttime=Float.valueOf(infos[1][0]);
00294                 } catch(NumberFormatException e) {
00295                         starttime=Float.valueOf((infos[1][0].split("#"))[1]);
00296                 }
00297                 
00298                 float endtime=0.0f;
00299                 try{
00300                         endtime=Float.valueOf(infos[2][0]);
00301                 } catch(NumberFormatException e) {
00302                         endtime=Float.valueOf((infos[2][0].split("#"))[1]);
00303                 }
00304 
00305                 String[] types = infos[3];
00306                 String objecttype = infos[4][0];
00307                 
00308                 color2id.put(idColor, label);
00309                 actionlist.add(new ActionInformation(label, starttime, endtime, types, objecttype, idColor++));
00310                 
00311         }
00312         
00313         int l = Integer.valueOf(level);
00314         
00315         while(l>=leftHandActions.size()) {
00316                 leftHandActions.add(new ArrayList<ActionInformation>());
00317         }
00318 
00319         while(l>=rightHandActions.size()) {
00320                 rightHandActions.add(new ArrayList<ActionInformation>());
00321         }
00322         
00323         if(hand.equals("left"))
00324                 this.leftHandActions.set(l, actionlist);
00325         else
00326                 this.rightHandActions.set(l, actionlist);
00327         
00328           } catch(Exception e) {
00329                   e.printStackTrace();
00330           }
00331         
00332         this.redraw();
00333   }
00334 
00335 
00336   public void setActionsInActivity(Object[] actions) {
00337           System.out.println(actions.toString());
00338           for(Object act : actions) {
00339                   System.out.println(act.toString());
00340                   for(ArrayList<ActionInformation> alist : this.leftHandActions) {
00341                           for(ActionInformation ainfo : alist) {
00342                                   if(("'"+ainfo.getLabel()+"'").equals(act.toString())) {
00343                                           ainfo.setInActivity(true);
00344                                   }
00345                           }
00346                   }
00347           }       
00348           for(Object act : actions) {
00349                   for(ArrayList<ActionInformation> alist : this.rightHandActions) {
00350                           for(ActionInformation ainfo : alist) {
00351                                   if(("'"+ainfo.getLabel()+"'").equals(act.toString())) {
00352                                           ainfo.setInActivity(true);
00353                                   }
00354                           }
00355                   }
00356           }
00357   }
00358         
00359     
00360     
00364     // 
00365     // EVENT HANDLER
00366     // 
00367 
00368         
00369   public void mousePressed(MouseEvent e) {
00370           
00371           // general: save mouse positions for calculating rotation and translation
00372           if(e.getButton()==MouseEvent.BUTTON1) {
00373                         leftMouseX = e.getX();
00374                         leftMouseY = e.getY();
00375           } else if(e.getButton()==MouseEvent.BUTTON3) {
00376                         rightMouseX = e.getX();
00377                         rightMouseY = e.getY();
00378           } else if (e.getButton()==MouseEvent.BUTTON2) {
00379                         centerMouseY = e.getY();
00380           }
00381 
00382                                  
00383         }
00384   
00385   
00386         public void mouseReleased(MouseEvent e) {
00387                 
00388                 if(e.getButton()==MouseEvent.BUTTON1) { // reset the buffers
00389                         leftMouseX = -1.0f;
00390                         leftMouseY = -1.0f;
00391                 } else if(e.getButton()==MouseEvent.BUTTON3) {  // reset the buffers
00392                         rightMouseX = -1.0f;
00393                         rightMouseY = -1.0f;
00394                 } else if (e.getButton()==MouseEvent.BUTTON2) {
00395                         centerMouseY = -1.0f;
00396                 }
00397         
00398         }
00399 
00400     public void mouseDragged(MouseEvent e) {
00401 
00402 
00403         if(leftMouseX != -1.0f) {       // change rotation
00404                   xRotDisplay+= (e.getY()-leftMouseY) * 0.05;
00405                   yRotDisplay-= (e.getX()-leftMouseX) * 0.05;
00406                         leftMouseX = e.getX();
00407                         leftMouseY = e.getY();
00408                 
00409                 }else if(rightMouseX != -1.0f) {        // change translation
00410                   yShiftDisplay+= (e.getY()-rightMouseY) * 0.5;
00411                   xShiftDisplay+= (e.getX()-rightMouseX) * 0.5;
00412                         rightMouseX = e.getX();
00413                         rightMouseY = e.getY();
00414                 
00415                 } else if (centerMouseY != -1.0f) {     // zoom
00416                           zoomDisplay+= (e.getY()-centerMouseY) * 0.02;
00417                           if(zoomDisplay<0.01){zoomDisplay=0.01f;}
00418                           centerMouseY = e.getY();
00419                 }
00420         
00421         redraw();
00422     }
00423     
00424     public void mouseClicked() {
00425 
00426           // draw the scene in the buffer
00427           buffer.beginDraw();
00428           buffer.background(0); // since background is not an object, its id is 0
00429           
00430             buffer.ortho(-width/2, width/2, -height/2, height/2, -10, 10); 
00431 
00432             buffer.pushMatrix();
00433 
00434                     buffer.translate(xShiftDisplay, yShiftDisplay, 0.0f);
00435                         
00436                     buffer.rotateX( radians(xRotDisplay) );  
00437                     buffer.rotateY( radians( yRotDisplay) );
00438             
00439                     buffer.translate(2000f, height, -400.0f);
00440                 drawActionSequence(buffer, true);
00441                 
00442             buffer.popMatrix();
00443           buffer.endDraw();
00444          
00445           // get the pixel color under the mouse
00446           int pick = buffer.get(mouseX, mouseY);
00447           
00448           String id = this.color2id.get(pick);
00449           if(id!=null && prologVisCanvas != null) {
00450                           prologVisCanvas.displayAction(id);
00451                           prologVisCanvas.mapObjectClicked(id);
00452           }
00453     }
00454     
00455 //    public void keyPressed(){
00456 //      
00457 //      // hook: when running as slave, just propagate key events for proper synchronization
00458 //          //if(prologVisCanvas != null) {
00459 //          //  prologVisCanvas.keyPressed(keyCode);
00460 //          //  return;
00461 //          //}
00462 //      
00463 //              switch(keyCode) {
00464 //                      case RIGHT:
00465 //                              actionIndex++;
00466 //                              break;
00467 //                      case LEFT:
00468 //                              actionIndex--;
00469 //                              break;
00470 //                      case java.awt.event.KeyEvent.VK_PAGE_UP:
00471 //                              actionIndex+=10;
00472 //                              break;
00473 //                      case java.awt.event.KeyEvent.VK_PAGE_DOWN:
00474 //                              actionIndex-=10;
00475 //                              break;
00476 //              }
00477 //              
00478 //
00479 //              if(actionIndex>leftHandActions.get(0).size()-1) 
00480 //                      actionIndex=leftHandActions.get(0).size()-1;
00481 //              if(actionIndex<0) actionIndex=0;                
00482 //              redraw();
00483 //      }
00484     
00485     
00486     public      void controlEvent(ControlEvent theEvent) {
00487         if(prologVisCanvas != null && theEvent.isGroup() && theEvent.getGroup().getId()==100) {
00488                 // act_radio
00489                 this.maxLevel =(int)prologVisCanvas.controlP5.getGroup("act_radio").getValue();
00490 
00491         } else if(theEvent.isGroup() && theEvent.getGroup().getId()==101) {
00492                 // act_color
00493         }
00494         redraw();
00495     }
00496     
00497 
00498   public int makeColor(int r,int g,int b){
00499           int col = 0xFF000000 + 0x0000FF00 * r + 0x000000FF * g + b;
00500           return col;
00501     }
00502   
00503   public void setPrologVisCanvas(PrologVisualizationCanvas c){
00504           prologVisCanvas = c;
00505   }
00506     
00507     //fills the array colors with two colors for each action, one for the trajectory and one for the human pose
00508     public void setColors(){
00509 
00510         for(int[] c : new int[][]{      
00511                                                         
00512                                                         {255,255,153},  {255,153,153},          {153,0,102},
00513                                                         {51,0,51},      {102,102,102},          {102,51,153},
00514                                                         {255,204,0},    {255,51,0},             {153,204,0},
00515                                                         {204,153,0},    {255,255,255},          {255,153,102},
00516                                                         {102,0,0},      {204,255,102},          {102,102,51},
00517                                                         {204,204,204},  {255,255,51},           {153,102,102},
00518                                                         {153,0,51},     {153,153,153},          {51,153,0},
00519                                                         {102,153,204},  {51,51,204},            {0,153,102},
00520                                                         {102,255,204},  {0,0,204},
00521                                                         {102,153,204},  {51,51,204},            {0,153,102},
00522                                                         {255,255,153},  {255,153,153},          {153,0,102},
00523                                                         {153,0,51},     {153,153,153},          {51,153,0},
00524                                                         {51,0,51},      {102,102,102},          {102,51,153},
00525                                                         {204,204,204},  {255,255,51},           {153,102,102},
00526                                                         {102,0,0},      {204,255,102},          {102,102,51},
00527                                                         {204,153,0},    {255,255,255},          {255,153,102},
00528                                                         {255,204,0},    {255,51,0},             {153,204,0},
00529                                                         {102,255,204},  {0,0,204}}) {
00530                 colors.add(makeColor(c[0], c[1], c[2]));
00531         }
00532         
00533 
00534     }       
00535 
00536     
00537         private class ActionInformation implements Serializable {
00538                 
00539                 private static final long serialVersionUID = -1005928838950117046L;
00540                 private String label;
00541                 private float starttime;
00542                 private float endtime=-1;
00543                 private String[] types;
00544                 private String objecttype;
00545                 private int idColor;
00546                 private boolean inActivity;
00547 
00548 
00549                 public ActionInformation(String label, float starttime, float endtime, String[] types, String objecttype, int idColor) {
00550                         super();
00551                         this.label = label;
00552                         this.starttime = starttime;
00553                         this.endtime = endtime;
00554                         this.types = types;
00555                         this.objecttype = objecttype;
00556                         this.idColor = idColor;
00557                         this.inActivity = false;
00558                 }
00559 
00560 
00561                 @SuppressWarnings("unused")
00562                 public ActionInformation(String label, float time, String[] types, String objecttype, int idColor) {
00563                         super();
00564                         this.label = label;
00565                         this.starttime = time;
00566                         this.types = types;
00567                         this.objecttype = objecttype;
00568                         this.idColor = idColor;
00569                         this.inActivity = false;
00570                 }
00571 
00572 
00573                 public String getLabel() {
00574                         return label;
00575                 }
00576 
00577 
00578                 @SuppressWarnings("unused")
00579                 public void setLabel(String label) {
00580                         this.label = label;
00581                 }
00582 
00583 
00584                 public String getObjecttype() {
00585                         return objecttype;
00586                 }
00587 
00588 
00589                 @SuppressWarnings("unused")
00590                 public void setObjecttype(String objecttype) {
00591                         this.objecttype = objecttype;
00592                 }
00593 
00594 
00595                 public float getTime() {
00596                         return starttime;
00597                 }
00598 
00599 
00600                 public int getIdColor() {
00601                         return idColor;
00602                 }
00603 
00604 
00605                 @SuppressWarnings("unused")
00606                 public void setIdColor(int idColor) {
00607                         this.idColor = idColor;
00608                 }
00609 
00610 
00611                 @SuppressWarnings("unused")
00612                 public void setTime(float time) {
00613                         this.starttime = time;
00614                 }
00615 
00616 
00617                 public String[] getTypes() {
00618                         return types;
00619                 }
00620 
00621 
00622                 @SuppressWarnings("unused")
00623                 public void setTypes(String[] types) {
00624                         this.types = types;
00625                 }
00626 
00627 
00628                 public float getEndtime() {
00629                         return endtime;
00630                 }
00631 
00632 
00633                 @SuppressWarnings("unused")
00634                 public void setEndtime(float endtime) {
00635                         this.endtime = endtime;
00636                 }
00637 
00638 
00639                 public float getStarttime() {
00640                         return starttime;
00641                 }
00642 
00643 
00644                 @SuppressWarnings("unused")
00645                 public void setStarttime(float starttime) {
00646                         this.starttime = starttime;
00647                 }
00648                 
00649                 public boolean isInActivity() {
00650                         return inActivity;
00651                 }
00652 
00653 
00654                 public void setInActivity(boolean inActivity) {
00655                         this.inActivity = inActivity;
00656                 }
00657 
00658         }
00659 
00660         
00661 //       public void save() {
00662 //               System.out.println("saving...");
00663 //                try{
00664 //                         FileOutputStream fos = new FileOutputStream("/home/tenorth/lefthand.ser");
00665 //                         ObjectOutputStream oos = new ObjectOutputStream(fos);
00666 //                         oos.writeObject(this.leftHandActions);
00667 //                         oos.flush();
00668 //                         oos.close();
00669 //                         
00670 //                         fos = new FileOutputStream("/home/tenorth/righthand.ser");
00671 //                         oos = new ObjectOutputStream(fos);
00672 //                         oos.writeObject(this.rightHandActions);
00673 //                         oos.flush();
00674 //                         oos.close();
00675 //                         
00676 //                }catch(Exception e){
00677 //                        e.printStackTrace();
00678 //                }
00679 //      }
00680         
00681         public static void main(String args[]) {
00682                 PApplet.main(new String[] { "de.tum.in.fipm.kipm.gui.visualisation.applets.ActionVisApplet" });
00683         }
00684 }
00685 


mod_vis
Author(s): Moritz Tenorth, Jakob Engel
autogenerated on Sat Dec 28 2013 17:09:49