View Javadoc
1 /***************************************************************************** 2 * Virtual Mockup for Machine Vision 3 * Copyright (C) 2001-2003 Fabio R. de Miranda, João E. Kogler Jr., 4 * Carlos S. Santos. 5 * Virtual Mockup for Machine Vision Project funded by SENAC-SP 6 * 7 * Permission is granted to redistribute and/or modify this 8 * software under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * This software is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License (http://www.gnu.org/copyleft/lesser.html) 16 * for more details. 17 * 18 *****************************************************************************/ 19 20 package camera3d; 21 22 import camera3d.gui.*; 23 import java.awt.Point; 24 import java.awt.Dimension; 25 import java.util.*; 26 import java.net.URL; 27 import java.net.MalformedURLException; 28 import java.io.*; 29 import org.jdom.*; 30 import org.jdom.input.*; 31 import org.jdom.output.*; 32 33 /*** 34 * A class for saving/retrieving information about the working environment. Currently, 35 * only information about objects native to the Virtual Camera (e.g. lights, cameras, 36 * distance measurers, etc) and graphical components is supported. All information about 37 * content imported into the the application is lost. 38 * 39 * @author Fábio Roberto de Miranda e Carlos da Silva dos Santos 40 */ 41 public class XMLConverter { 42 43 /*** Provides information to be saved/receives objects loaded from file. */ 44 J3DBase base; 45 private VcObjectXMLHandler handler; 46 /*** indent string*/ 47 private static final String indentation = " "; 48 /*** Name of root element of valid documents. */ 49 private static final String rootName = "VirtualCamera"; 50 /*** Name of element under which are put scene graph elements. */ 51 private static final String sceneRootName = "SceneElements"; 52 /* string representations of boolean values. */ 53 private static final String trueSt = "True"; 54 private static final String falseSt = "False"; 55 /*** Version attribute. */ 56 private static final String versionAtt = "Version"; 57 private static final String versionValue = "0.1"; 58 59 // GUI section attributes 60 // number of viewports 61 private static final String vpNumberAtt = "VPNumber"; 62 // view showed by a certain viewport 63 private static final String viewInVpAtt = "View"; 64 // attribute to tell whether viewport is internal 65 private static final String internalAtt = "Internal"; 66 // window width 67 private static final String widthAtt = "Width"; 68 // window height 69 private static final String heightAtt = "Height"; 70 // X position of window 71 private static final String xPosAtt = "XPosition"; 72 // Y position of window 73 private static final String yPosAtt = "YPosition"; 74 /// end of GUI attributes 75 76 private boolean newLine = true; 77 File file; 78 Document doc; 79 80 /* handlers of XML elements for individual types of objects, responsible for 81 converting object information into XML data and vice-versa. */ 82 VcViewXMLHandler viewHandler; 83 VcLaserArrayXMLHandler arrayHandler; 84 DistanceMeasurerXMLHandler measurerHandler; 85 VcAmbientLightXMLHandler ambientHandler; 86 VcDirectLightXMLHandler directHandler; 87 VcPointLightXMLHandler pointHandler; 88 VcSpotLightXMLHandler spotHandler; 89 VcHelperPointXMLHandler ptHandler; 90 91 public XMLConverter() { 92 } 93 94 /*** 95 * Creates new converter, setting the J3DBase object which will provide/receive 96 * scene graph information. 97 */ 98 public XMLConverter(J3DBase base) { 99 this.base = base; 100 } 101 102 /*** 103 * Sets the J3DBase which will provide/receive scene graph information. 104 */ 105 public void setBase(J3DBase base){ 106 this.base = base; 107 } 108 109 /*** 110 * Returns the J3DBase which provides/receives scene graph information. 111 */ 112 public J3DBase getBase(){ 113 return this.base; 114 } 115 116 /*** 117 * Prints a debug message. 118 */ 119 void debugln(String s){ 120 System.out.println(s); 121 } 122 123 /*** 124 * Creates a new Document based on scene graph information and outputs it to a file. 125 */ 126 public void write(String filename, GUIControl guiControl){ 127 Vector VcObjVector; 128 VcObject obj; 129 Element element; 130 FileOutputStream outStream; 131 // creates element that serves as root for document 132 Element root = new Element(rootName); 133 root.setAttribute(versionAtt,versionValue); 134 doc = new Document(root); 135 try{ 136 file = new File(filename); 137 }catch(NullPointerException npe){ 138 npe.printStackTrace(); 139 return; 140 } 141 try{ 142 outStream = new FileOutputStream(file); 143 }catch(FileNotFoundException fnfe){ 144 fnfe.printStackTrace(); 145 return; 146 } 147 /* 148 Currently, all content is added under root element 149 */ 150 151 Element sceneRoot = new Element(sceneRootName); 152 root.addContent(sceneRoot); 153 /* creates elements referring to objects present in the scene */ 154 VcObjVector = guiControl.getJ3DBase().getObjectList(); 155 Iterator iter = VcObjVector.iterator(); 156 while(iter.hasNext()){ 157 // for each element, gets the appropriate handler, then 158 // creates XML element and adds it to document 159 obj = (VcObject)iter.next(); 160 handler = getHandler(obj); 161 if(handler!=null){ 162 element = handler.createElement(obj); 163 sceneRoot.addContent(element); 164 } 165 } 166 167 168 /************************--start of GUI section--************************/ 169 Element guiElement = new Element("GUI"); 170 root.addContent(guiElement); 171 ViewportWindowManager manager = guiControl.getViewportManager(); 172 List vpList = manager.getListOfFrames(); 173 Element vpElement; 174 ViewportFrame vpFrame; 175 int cont = 0; 176 iter = vpList.iterator(); 177 // creates an element which holds information about viewport size, 178 // position and view shown; and add it to guiElement 179 while(iter.hasNext()){ 180 vpFrame = (ViewportFrame)iter.next(); 181 vpElement = new Element("Viewport"); 182 // number of viewport 183 vpElement.setAttribute(vpNumberAtt,Integer.toString(cont)); 184 String internal; 185 if(vpFrame.isInternalFrame()) internal = trueSt; 186 else internal = falseSt; 187 // tells whether viewport is internal or not 188 vpElement.setAttribute(internalAtt,internal); 189 Point p2d = vpFrame.getPosition(); 190 // position of viewport window 191 vpElement.setAttribute(xPosAtt,Integer.toString(p2d.x)); 192 vpElement.setAttribute(yPosAtt,Integer.toString(p2d.y)); 193 Dimension d = vpFrame.getSize(); 194 // size of viewport window 195 vpElement.setAttribute(widthAtt,Integer.toString(d.width)); 196 vpElement.setAttribute(heightAtt,Integer.toString(d.height)); 197 // label of view shown in viewport 198 vpElement.setAttribute(viewInVpAtt,vpFrame.getViewport().getView().getLabel()); 199 guiElement.addContent(vpElement); 200 cont++; 201 } 202 203 FrameSwitcherPane selPane = guiControl.getSelectionPane(); 204 // creates element relating to selection list pane 205 Element selElement = new Element("SelectionPane"); 206 String internal; 207 if(selPane.isInside()) internal = trueSt; 208 else internal = falseSt; 209 // tells whether selection list pane is internal or not 210 selElement.setAttribute(internalAtt,internal); 211 Point p2d = selPane.getPosition(); 212 // position of selection list pane 213 selElement.setAttribute(xPosAtt,Integer.toString(p2d.x)); 214 selElement.setAttribute(yPosAtt,Integer.toString(p2d.y)); 215 Dimension d = selPane.getSize(); 216 // size of selection list pane 217 selElement.setAttribute(widthAtt,Integer.toString(d.width)); 218 selElement.setAttribute(heightAtt,Integer.toString(d.height)); 219 guiElement.addContent(selElement); 220 221 FrameSwitcherPane edtPane = guiControl.getEditionPane(); 222 // creates element relating to edition list pane 223 Element edtElement = new Element("EditionPane"); 224 if(edtPane.isInside()) internal = trueSt; 225 else internal = falseSt; 226 // tells whether edition pane is internal or not 227 edtElement.setAttribute(internalAtt,internal); 228 p2d = edtPane.getPosition(); 229 // position of edition list pane 230 edtElement.setAttribute(xPosAtt,Integer.toString(p2d.x)); 231 edtElement.setAttribute(yPosAtt,Integer.toString(p2d.y)); 232 d = selPane.getSize(); 233 // size of selection list pane 234 edtElement.setAttribute(widthAtt,Integer.toString(d.width)); 235 edtElement.setAttribute(heightAtt,Integer.toString(d.height)); 236 guiElement.addContent(edtElement); 237 238 /*************************--end of GUI section--*************************/ 239 240 XMLOutputter outputter = new XMLOutputter(indentation,newLine); 241 // outputs Document content to file 242 try{ 243 outputter.output(doc,outStream); 244 outStream.close(); 245 }catch(java.io.IOException ioe){ 246 ioe.printStackTrace(); 247 } 248 249 } 250 251 /*** 252 * Loads the content of a file into the scene graph and configures graphical components. 253 * @param filename complete path to configuration file. 254 * @param guiControl serves as access point to scene graph and graphical components. 255 */ 256 public void load(String filename, GUIControl guiControl){ 257 this.base = guiControl.getJ3DBase(); 258 try{ 259 file = new File(filename); 260 }catch(NullPointerException npe){ 261 npe.printStackTrace(); 262 return; 263 } 264 265 SAXBuilder builder = new SAXBuilder(); 266 try{ 267 doc = builder.build(file); 268 }catch(JDOMException e){ 269 e.printStackTrace(); 270 return; 271 } 272 273 Element root = doc.getRootElement(); 274 // checks whether this is really a Virtual Camera file 275 if(!(rootName.equals(root.getName()))){ 276 System.out.println("Not a valid Virtual Camera file"); 277 return; 278 } 279 280 List list; 281 initializeHandlers(); 282 // gets element which serves as root to all scene graph elements 283 Element sceneRoot = root.getChild(sceneRootName); 284 285 // processes all different types of scene graph elements 286 list = sceneRoot.getChildren(viewHandler.getType()); 287 viewHandler.processList(list,base); 288 289 list = sceneRoot.getChildren(arrayHandler.getType()); 290 arrayHandler.processList(list,base); 291 292 list = sceneRoot.getChildren(pointHandler.getType()); 293 pointHandler.processList(list,base); 294 295 list = sceneRoot.getChildren(ambientHandler.getType()); 296 ambientHandler.processList(list,base); 297 298 list = sceneRoot.getChildren(spotHandler.getType()); 299 spotHandler.processList(list,base); 300 301 list = sceneRoot.getChildren(directHandler.getType()); 302 directHandler.processList(list,base); 303 304 list = sceneRoot.getChildren(measurerHandler.getType()); 305 measurerHandler.processList(list,base); 306 307 list = sceneRoot.getChildren(ptHandler.getType()); 308 ptHandler.processList(list,base); 309 310 /************************--start of GUI section--************************/ 311 ViewportWindowManager manager = guiControl.getViewportManager(); 312 Element guiElement = root.getChild("GUI"); 313 if(guiElement==null) return; 314 List vpList = guiElement.getChildren("Viewport"); 315 Iterator iter = vpList.iterator(); 316 Element vpElement; 317 int index,x,y,width,height; 318 boolean internal; 319 String intSt; 320 String viewLabel; 321 VcView view; 322 while(iter.hasNext()){ 323 vpElement = (Element) iter.next(); 324 try{ 325 index = vpElement.getAttribute(vpNumberAtt).getIntValue(); 326 debugln("vp index "+index); 327 intSt = vpElement.getAttributeValue(internalAtt); 328 if(intSt.equalsIgnoreCase(falseSt)) internal = false; 329 else internal = true; 330 331 x = vpElement.getAttribute(xPosAtt).getIntValue(); 332 y = vpElement.getAttribute(yPosAtt).getIntValue(); 333 width = vpElement.getAttribute(widthAtt).getIntValue(); 334 height = vpElement.getAttribute(heightAtt).getIntValue(); 335 336 viewLabel = vpElement.getAttributeValue(viewInVpAtt); 337 debugln("View label "+ viewLabel); 338 VcObject obj = guiControl.getJ3DBase().getByLabel(viewLabel); 339 if((obj!=null)&&(obj instanceof VcView)) view = (VcView) obj; 340 else view = null; 341 342 guiControl.setViewInViewport(index,view); 343 guiControl.setViewportLocation(index,internal,x,y,width,height); 344 345 }catch(org.jdom.DataConversionException dce){ 346 dce.printStackTrace(); 347 } 348 } 349 350 Element selElement = guiElement.getChild("SelectionPane"); 351 try{ 352 intSt = selElement.getAttributeValue(internalAtt); 353 if(intSt.equalsIgnoreCase(falseSt)) internal = false; 354 else internal = true; 355 356 x = selElement.getAttribute(xPosAtt).getIntValue(); 357 y = selElement.getAttribute(yPosAtt).getIntValue(); 358 width = selElement.getAttribute(widthAtt).getIntValue(); 359 height = selElement.getAttribute(heightAtt).getIntValue(); 360 361 FrameSwitcherPane selPane = guiControl.getSelectionPane(); 362 selPane.setInside(internal); 363 selPane.setPosition(x,y); 364 selPane.setSize(width,height); 365 }catch(org.jdom.DataConversionException dce){ 366 dce.printStackTrace(); 367 } 368 369 370 Element edtElement = guiElement.getChild("EditionPane"); 371 try{ 372 intSt = edtElement.getAttributeValue(internalAtt); 373 if(intSt.equalsIgnoreCase(falseSt)) internal = false; 374 else internal = true; 375 376 x = edtElement.getAttribute(xPosAtt).getIntValue(); 377 y = edtElement.getAttribute(yPosAtt).getIntValue(); 378 width = edtElement.getAttribute(widthAtt).getIntValue(); 379 height = edtElement.getAttribute(heightAtt).getIntValue(); 380 381 FrameSwitcherPane edtPane = guiControl.getEditionPane(); 382 edtPane.setInside(internal); 383 edtPane.setPosition(x,y); 384 edtPane.setSize(width,height); 385 }catch(org.jdom.DataConversionException dce){ 386 dce.printStackTrace(); 387 } 388 /*************************--end of GUI section--*************************/ 389 } 390 391 /*** 392 * Returns the appropriate XML handler, according to the type of VcObject 393 * given as input. 394 */ 395 private VcObjectXMLHandler getHandler(VcObject obj){ 396 if(obj instanceof VcView){ 397 if(viewHandler==null) viewHandler = new VcViewXMLHandler(); 398 return viewHandler; 399 } 400 if(obj instanceof VcLaserArray){ 401 if(arrayHandler==null) arrayHandler = new VcLaserArrayXMLHandler(); 402 return arrayHandler; 403 } 404 if(obj instanceof DistanceMeasurer){ 405 if(measurerHandler==null) measurerHandler = new DistanceMeasurerXMLHandler(); 406 return measurerHandler; 407 } 408 if(obj instanceof VcAmbientLight){ 409 if(ambientHandler==null) ambientHandler = new VcAmbientLightXMLHandler(); 410 return ambientHandler; 411 } 412 if(obj instanceof VcDirectLight){ 413 if(directHandler==null) directHandler = new VcDirectLightXMLHandler(); 414 return directHandler; 415 } 416 if(obj instanceof VcPointLight){ 417 if(obj instanceof VcSpotLight){ 418 if(spotHandler==null) spotHandler = new VcSpotLightXMLHandler(); 419 return spotHandler; 420 } 421 if(pointHandler==null) pointHandler = new VcPointLightXMLHandler(); 422 return pointHandler; 423 } 424 if(obj instanceof VcHelperPoint){ 425 if(ptHandler==null) ptHandler = new VcHelperPointXMLHandler(); 426 return ptHandler; 427 } 428 // return null till we find a way to handle content 429 if(obj instanceof VcContent){ 430 return null; 431 } 432 return null; 433 } 434 435 private void initializeHandlers(){ 436 if(viewHandler==null) viewHandler = new VcViewXMLHandler(); 437 if(arrayHandler==null) arrayHandler = new VcLaserArrayXMLHandler(); 438 if(measurerHandler==null) measurerHandler = new DistanceMeasurerXMLHandler(); 439 if(ambientHandler==null) ambientHandler = new VcAmbientLightXMLHandler(); 440 if(directHandler==null) directHandler = new VcDirectLightXMLHandler(); 441 if(pointHandler==null) pointHandler = new VcPointLightXMLHandler(); 442 if(spotHandler==null) spotHandler = new VcSpotLightXMLHandler(); 443 if(ptHandler==null) ptHandler = new VcHelperPointXMLHandler(); 444 } 445 446 /* 447 public static void main(String[] args) { 448 XMLConverter XMLConverter1 = new XMLConverter(); 449 }*/ 450 451 }

This page was automatically generated by Maven