/** * */ package iamrescue.util; import gis2.GMLWorldModelCreator; import iamrescue.agent.SimulationTimer; import iamrescue.belief.IAMWorldModel; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import javolution.util.FastMap; import javolution.util.FastSet; import kernel.KernelException; import rescuecore2.config.Config; import rescuecore2.config.ConfigException; import rescuecore2.standard.entities.StandardEntity; import rescuecore2.standard.entities.StandardEntityURN; import rescuecore2.worldmodel.WorldModel; /** * @author Sebastian * */ public class ScenarioGenerator { private Map<String, Integer> agents = new FastMap<String, Integer>(); private Map<String, Integer> buildings = new FastMap<String, Integer>(); public void setPoliceForces(int number) { agents.put("rcr:policeforce", number); } public void setFireBrigades(int number) { agents.put("rcr:firebrigade", number); } public void setAmbulanceTeams(int number) { agents.put("rcr:ambulanceteam", number); } public void setCivilians(int number) { agents.put("rcr:civilian", number); } public void setFires(int number) { buildings.put("rcr:fire", number); } public void setRefuges(int number) { buildings.put("rcr:refuge", number); } public void setFireStations(int number) { buildings.put("rcr:firestation", number); } public void setAmbulanceCentres(int number) { buildings.put("rcr:ambulancecenter", number); } public void setPoliceOffices(int number) { buildings.put("rcr:policeoffice", number); } public void generateScenario(String outputFile, String mapFile) { File f = new File(outputFile); Set<Integer> used = new FastSet<Integer>(); Config cfg; try { cfg = new Config(new File("boot/config")); cfg.setValue("gis.map.dir", mapFile); GMLWorldModelCreator creator = new GMLWorldModelCreator(); WorldModel wm = creator.buildWorldModel(cfg); IAMWorldModel iwm = new IAMWorldModel(new SimulationTimer(), cfg); iwm.merge(wm.getAllEntities()); FileWriter writer = new FileWriter(f); writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); writer.write("<rcr:scenario " + "xmlns:rcr=\"urn:roborescue:map:scenario\">\n"); StandardEntity[] buildingsArray = iwm.getEntitiesOfType( StandardEntityURN.BUILDING).toArray(new StandardEntity[0]); StandardEntity[] roadsAndBuildings = iwm.getEntitiesOfType( StandardEntityURN.BUILDING, StandardEntityURN.ROAD) .toArray(new StandardEntity[0]); for (Entry<String, Integer> agent : agents.entrySet()) { String agentStr = agent.getKey(); System.out.print("Adding " + agentStr); int number = agent.getValue(); for (int i = 0; i < number; i++) { int index = (int) (Math.random() * roadsAndBuildings.length); StandardEntity se = roadsAndBuildings[index]; int location = se.getID().getValue(); writer.write(" <" + agentStr + " rcr:location=\"" + location + "\"/>\n"); System.out.print("."); } System.out.println(""); } for (Entry<String, Integer> building : buildings.entrySet()) { String buildingStr = building.getKey(); System.out.print("Adding " + buildingStr); int number = building.getValue(); for (int i = 0; i < number; i++) { int index; if (used.size() == buildingsArray.length) { System.out.println("Cannot add further buildings!"); break; } do { index = (int) (Math.random() * buildingsArray.length); } while (used.contains(index)); used.add(index); StandardEntity se = buildingsArray[index]; int location = se.getID().getValue(); writer.write(" <" + buildingStr + " rcr:location=\"" + location + "\"/>\n"); System.out.print("."); } System.out.println(""); } writer.write("</rcr:scenario>\n"); writer.flush(); writer.close(); System.out.println("Done"); } catch (ConfigException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KernelException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { ScenarioGenerator generator = new ScenarioGenerator(); generator.setCivilians(50); generator.setPoliceForces(10); generator.setAmbulanceTeams(10); generator.setFireBrigades(10); generator.setRefuges(5); generator.generateScenario( "maps/gml/OS/processed/highfield/dummyScenario.xml", "maps/gml/OS/processed/highfield"); } }