diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/commands/SetPreset.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/commands/SetPreset.java index d3df5f88633cfd47e5498738b0287009c770eb92..cbe12755b276016f23f03e8cb0fdc4d17b0f03c7 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/commands/SetPreset.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/commands/SetPreset.java @@ -19,8 +19,8 @@ public class SetPreset implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - Builder builder = new Builder(); Server server = sender.getServer(); + Builder builder = new Builder(server); Player player = server.getPlayer(sender.getName()); if (player != null) { Location location = player.getLocation(); @@ -31,11 +31,11 @@ public class SetPreset implements CommandExecutor { Runnable t = () -> { DataHolder.foundation.setLocation(location); DataHolder.generateSimpleData(Integer.parseInt(args[0])); - builder.setFoundation(server, location, DataHolder.foundation.getWidth().x, DataHolder.foundation.getWidth().y, DataHolder.foundation.getMaterial()); + builder.setFoundation(location, DataHolder.foundation.getWidth().x, DataHolder.foundation.getWidth().y, DataHolder.foundation.getMaterial()); for (Structure structure : DataHolder.foundation.getChildren()) { Building building = (Building) structure; sender.sendMessage("bau" + building.toString()); - builder.fillQube(server, building.getLocation(), building.getWidth().x, building.getHeight(), building.getWidth().y, building.getMaterial());//Not yet ready to print foundations + builder.fillQube(building.getLocation(), building.getWidth().x, building.getHeight(), building.getWidth().y, building.getMaterial());//Not yet ready to print foundations } }; t.run(); diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/commands/generateLayout.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/commands/generateLayout.java index f81cae4a6215cb682ed205f864ccf193a4e858af..6e6670a6d3af87b9c153abbf4a317014a8dd7b96 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/commands/generateLayout.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/commands/generateLayout.java @@ -2,9 +2,13 @@ package de._82grfl1bif.KPI_Visualizer.commands; import de._82grfl1bif.KPI_Visualizer.data.DataHolder; import de._82grfl1bif.KPI_Visualizer.data.JsonParser; +import de._82grfl1bif.KPI_Visualizer.layouts.TreeMap.Rectangle; +import de._82grfl1bif.KPI_Visualizer.layouts.TreeMap.Row; +import de._82grfl1bif.KPI_Visualizer.layouts.TreeMap.SquarifiedTreemapLayout; import de._82grfl1bif.KPI_Visualizer.structures.*; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -13,56 +17,75 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; +import java.awt.*; +import java.util.Map; import java.util.logging.Level; public class generateLayout implements CommandExecutor { - Builder builder = new Builder(); @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (args.length < 2){ + if (args.length < 2) { sender.sendMessage("please type or select the needed Arguments with tab."); return false; } - sender.sendMessage("generating Layout"); + sender.sendMessage("generating SimpleSquareLayout"); Server server = sender.getServer(); + Builder builder = new Builder(server); Player player = server.getPlayer(sender.getName()); JsonParser jsonParser = new JsonParser(); - if (!jsonParser.evalJson(args[0])){ + if (!jsonParser.evalJson(args[0])) { sender.sendMessage("failed to parse Json"); return false; } - if(player != null) { + if (player != null) { //check if Player exists for getting Start coordinates. Location location = player.getLocation(); + if (args[1].equals("SquarifiedTreemap")) { //check 2. Argument whether to use SquarifiedTreemap or SimpleSquare Layout. + BukkitRunnable t = new BukkitRunnable() { + @Override + public void run() { + SquarifiedTreemapLayout squarifiedTreemapLayout = new SquarifiedTreemapLayout(); + squarifiedTreemapLayout.generateLayout(DataHolder.foundation, new Rectangle(DataHolder.foundation.getArea(), Math.sqrt(DataHolder.foundation.getArea()), new Point(0, 0))); + builder.setFoundation(location,(int)Math.round(Math.sqrt(DataHolder.foundation.getArea())),(int)Math.round(Math.sqrt(DataHolder.foundation.getArea())), Material.COBBLESTONE); + for (Row row : squarifiedTreemapLayout.getRows()) { + for (Map.Entry entry : row.getRectangles().entrySet()) { + Rectangle r = entry.getKey(); + Structure s = entry.getValue(); + if(s.getClass() == Foundation.class){ + builder.setFoundation(location.clone().add(r.getOrigin().x,s.getDepth(),r.getOrigin().y),(int)(r.getWidth()),(int)(r.getHeight()),s.getMaterial()); + }else{ + builder.fillQube(location.clone().add(r.getOrigin().x,s.getDepth()+100,r.getOrigin().y),(int)(r.getWidth()),((Building)s).getHeight(),(int)(r.getHeight()),s.getMaterial()); + } + if(r.getHeight() >= 5 && r.getWidth() >= 5){ - BukkitRunnable t = new BukkitRunnable() { - @Override - public void run() { - //DataHolder.ComplexData(); - DataHolder.foundation.setLocation(location); - DataHolder.foundation.organizeFoundation(); - DataHolder.foundation.correctAllLocations(location); - builder.setFoundation(server, DataHolder.foundation.getLocation().clone().add(0, DataHolder.foundation.getDepth(), 0), DataHolder.foundation.getWidth().x, DataHolder.foundation.getWidth().x, DataHolder.foundation.getMaterial()); - setAllChildren(server, DataHolder.foundation); - } - }; - t.run(); - return true; - }else{ + }else{ + Bukkit.getLogger().log(Level.SEVERE,"the rectangle is too small"); + } + } + } + } + }; + t.run(); + return true; + } else { + BukkitRunnable t = new BukkitRunnable() { + @Override + public void run() { + DataHolder.foundation.setLocation(location); + DataHolder.foundation.organizeFoundation(); + DataHolder.foundation.correctAllLocations(location); + builder.setFoundation(DataHolder.foundation.getLocation().clone().add(0, DataHolder.foundation.getDepth(), 0), DataHolder.foundation.getWidth().x, DataHolder.foundation.getWidth().x, DataHolder.foundation.getMaterial()); + builder.setAllChildren(DataHolder.foundation); + } + }; + t.run(); + return true; + } + + } else { Bukkit.getLogger().log(Level.SEVERE, "Kein Spieler gefunden."); return false; } } - private void setAllChildren(Server server, Foundation foundation) { - for (Structure s : foundation.getChildren()) { - if (s.getClass() == Foundation.class) {//TODO must be revisited to draw rectangular Foundations - builder.setFoundation(server, s.getLocation().clone().add(0, s.getDepth(), 0), s.getWidth().x, s.getWidth().x, s.getMaterial()); - setAllChildren(server, (Foundation) s); - } else {//TODO must be revisited to draw rectangular Buildings - builder.buildBuilding(server, s.getLocation().clone().add(1, s.getDepth(), 1), s.getWidth().x - 2, ((Building) s).getHeight(), s.getMaterial()); - } - } - } - } diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/data/FileInputTabCompleter.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/FileInputTabCompleter.java similarity index 89% rename from src/main/java/de/_82grfl1bif/KPI_Visualizer/data/FileInputTabCompleter.java rename to src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/FileInputTabCompleter.java index 3c30e682db305d0269f180246e5872b876f5b386..9c40cfb21b34e7d220121e8d038b4bee497b299e 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/data/FileInputTabCompleter.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/FileInputTabCompleter.java @@ -1,5 +1,6 @@ -package de._82grfl1bif.KPI_Visualizer.data; +package de._82grfl1bif.KPI_Visualizer.helpers; +import de._82grfl1bif.KPI_Visualizer.data.JsonParser; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Quadrat.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/Quadrat.java similarity index 96% rename from src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Quadrat.java rename to src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/Quadrat.java index 44d2b17d25496f1feb3b03b7dc991316c9923b37..98bb782b14d742827ef6b04dfe290299f6fd7fb0 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Quadrat.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/Quadrat.java @@ -1,11 +1,11 @@ -package de._82grfl1bif.KPI_Visualizer.helpers; +package de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare; import de._82grfl1bif.KPI_Visualizer.structures.Structure; import java.awt.*; import java.util.ArrayList; -public class Quadrat extends Shape{ +public class Quadrat extends Shape { private Boolean belegt; diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Rectangle.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/Rectangle.java similarity index 98% rename from src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Rectangle.java rename to src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/Rectangle.java index c9f5e4df2506a5ae6335131db4baf3a277d663ed..0ce01ffa8b10fc721cdd0970e65f021289648742 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Rectangle.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/Rectangle.java @@ -1,4 +1,4 @@ -package de._82grfl1bif.KPI_Visualizer.helpers; +package de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare; import java.awt.*; import java.util.ArrayList; diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Shape.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/Shape.java similarity index 74% rename from src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Shape.java rename to src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/Shape.java index f4a49c37c269c7bc07d2c40bdfddea93947cd17d..fcfb34eb45e9c2c4f1c47a21dbe0cb3d9de0a759 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Shape.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/Shape.java @@ -1,4 +1,4 @@ -package de._82grfl1bif.KPI_Visualizer.helpers; +package de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare; import java.awt.Point; diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Layout.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/SimpleSquareLayout.java similarity index 81% rename from src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Layout.java rename to src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/SimpleSquareLayout.java index e2c935767d24d698ffcc3f82b6df46fc38e44089..b20a8daf2ae727f6bfcae0f74af4b52d59d9835d 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/helpers/Layout.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/SimpleSquare/SimpleSquareLayout.java @@ -1,5 +1,7 @@ -package de._82grfl1bif.KPI_Visualizer.helpers; +package de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare; +import de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Quadrat; +import de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Rectangle; import de._82grfl1bif.KPI_Visualizer.structures.Structure; import javax.management.AttributeNotFoundException; @@ -7,8 +9,7 @@ import java.awt.*; import java.util.ArrayList; import java.util.Comparator; -@SuppressWarnings("ALL") -public class Layout { +public class SimpleSquareLayout { private final ArrayList structures; private final ArrayList layout = new ArrayList<>(); @@ -19,7 +20,7 @@ public class Layout { private int size = 0; - public Layout(ArrayList structures){ + public SimpleSquareLayout(ArrayList structures){ this.structures = structures;//ordered biggest first. } @@ -77,9 +78,9 @@ public class Layout { layout.add(new Quadrat(new Point(q.bottomLeftCorner.y,q.bottomLeftCorner.x),new Point(q.topRightCorner.y,q.topRightCorner.x))); // gespiegeltes Quadrat layout.add(new Quadrat(new Point(q.bottomLeftCorner.x,q.bottomLeftCorner.x),structure.getWidth().x)); // Oberes rechtes Quadrat if((this.size-(2*structure.getWidth().x)) > 0){ //falls Abstand zwischen den Quadraten ist. - Rectangle rTop = new Rectangle(structure.getWidth().x,(this.size-2*structure.getWidth().x),new Point(q .topRightCorner.y,q.bottomLeftCorner.x)); + de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Rectangle rTop = new de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Rectangle(structure.getWidth().x,(this.size-2*structure.getWidth().x),new Point(q .topRightCorner.y,q.bottomLeftCorner.x)); layout.addAll(rTop.splitToQuads(rTop)); - Rectangle rRight = new Rectangle((this.size-2*structure.getWidth().x),structure.getWidth().x,new Point(q.bottomLeftCorner.x,q.topRightCorner.y)); + de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Rectangle rRight = new Rectangle((this.size-2*structure.getWidth().x),structure.getWidth().x,new Point(q.bottomLeftCorner.x,q.topRightCorner.y)); layout.addAll(rRight.splitToQuads(rRight)); } } diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/TreeMap/Rectangle.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/TreeMap/Rectangle.java new file mode 100644 index 0000000000000000000000000000000000000000..59aecbcba55ae291d51b921d2924ffdecaf0068f --- /dev/null +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/TreeMap/Rectangle.java @@ -0,0 +1,61 @@ +package de._82grfl1bif.KPI_Visualizer.layouts.TreeMap; + +import de._82grfl1bif.KPI_Visualizer.structures.Structure; + +import java.awt.*; +import java.util.ArrayList; +import java.util.HashMap; + +public class Rectangle{ + + private double area; + private double width; + private double height; + private Point origin; + + public void setHeight(double height) { + this.height = height; + this.width = area/height; + } + + public void setWidth(double width) { + this.width = width; + this.height = area/width; + } + + public double getArea() { + return area; + } + + public double getWidth() { + return width; + } + + public double getHeight() { + return height; + } + + public Point getOrigin() { + return origin; + } + + public void setOrigin(Point origin) { + this.origin = origin; + } + + public Rectangle(double area,double width,Point origin){ + this.area = area; + this.origin = origin; + setWidth(width); + } + + public double getSideRelation(){ + return Math.max(width/height,height/width); + } + + public boolean checkSideRelation(double side){ + return !(getSideRelation() < Math.max((area/side)/side,side/(area/side)));// false if the Relation gets worse. + } + + +} diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/TreeMap/Row.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/TreeMap/Row.java new file mode 100644 index 0000000000000000000000000000000000000000..6660426b30b565b4dc9c957fb9e81eee4b05d8a6 --- /dev/null +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/TreeMap/Row.java @@ -0,0 +1,118 @@ +package de._82grfl1bif.KPI_Visualizer.layouts.TreeMap; + +import de._82grfl1bif.KPI_Visualizer.structures.Structure; + +import java.awt.*; +import java.util.HashMap; +import java.util.Map; + +public class Row { + + double broad; + boolean horizontal; + + public HashMap getRectangles() { + return rectangles; + } + + HashMap rectangles; + Rectangle space; + + public Row(Rectangle space) { + this.space = space; + this.rectangles = new HashMap<>(); + this.broad = 0; + this.horizontal = (space.getWidth() >= space.getHeight()); + } + + private double getSideRelation() { + double currentMax = 0; + for (Map.Entry entry : rectangles.entrySet()) { + Rectangle r = entry.getKey(); + currentMax = Math.max(r.getSideRelation(), currentMax); + } + return currentMax; + } + + public void addRectangle(double area, Structure structure) { + double currentArea = getCurrentArea() + area; + if (horizontal) { + this.broad = currentArea / space.getHeight(); //calculating the new broad + int currentHeight = this.space.getOrigin().y; //new temp for height of origins + for (Map.Entry entry : rectangles.entrySet()) { + Rectangle r = entry.getKey(); + r.setWidth(this.broad);//setting new width&Height for all existing rectangles + r.setOrigin(new Point(this.space.getOrigin().x, currentHeight));//setting new origins for all existing rectangles + currentHeight += (int) Math.round(r.getHeight());//for next origin + } + rectangles.put((new Rectangle(area, this.broad, new Point(this.space.getOrigin().x, currentHeight))), structure);//add new Rectangle + } else { + this.broad = currentArea / space.getWidth(); //calculating the new broad + int currentWidth = this.space.getOrigin().x; //new temp for width of origins + for (Map.Entry entry : rectangles.entrySet()) { + Rectangle r = entry.getKey(); + r.setHeight(this.broad);//setting new width&Height for all existing rectangles + r.setOrigin(new Point(currentWidth, space.getOrigin().y));//setting new origins for all existing rectangles + currentWidth += (int) Math.round(r.getHeight());//for next origin + } + rectangles.put(new Rectangle(area, area / this.broad, new Point(currentWidth, space.getOrigin().y)), structure); + } + } + + private double getCurrentArea() { + double currentArea = 0; + for (Map.Entry entry : rectangles.entrySet()) { + Rectangle r = entry.getKey(); + currentArea += r.getArea(); + } + return currentArea; + } + + public boolean checkInsert(double area) { + if (!rectangles.isEmpty()) { + double currentArea = getCurrentArea() + area; + double broadTemp = horizontal ? currentArea / space.getHeight() : currentArea / space.getWidth(); + for (Map.Entry entry : rectangles.entrySet()) { + Rectangle r = entry.getKey(); + if (!r.checkSideRelation(broadTemp)) + return false;//returns false if one of the existing rectangles gets worse + } + return !(new Rectangle(area, broad, new Point(0, 0)).getSideRelation() > getSideRelation()); //returns false if the inserted rectangle is worse, than any other before + }else { + return true; + } + } + + public Rectangle getLeftover() { + Point origin; + double width; + if (horizontal) { + origin = new Point(space.getOrigin().x + (int)(broad), space.getOrigin().y); + width = space.getWidth() - getWidth(); + } else { + origin = new Point(space.getOrigin().x, space.getOrigin().y + (int)(broad)); + width = getWidth(); + } + return new Rectangle(this.space.getArea() - getCurrentArea(), width, origin); + } + + public double getWidth() { + if (horizontal) { + return this.broad; + } else { + return this.space.getWidth(); + } + } + + public double getHeight() { + if (horizontal) { + return this.space.getHeight(); + } else { + return this.broad; + } + } + + public boolean isFull(){ + return (Math.round(this.space.getArea()) <= Math.round(this.getCurrentArea())); + } +} diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/TreeMap/SquarifiedTreemapLayout.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/TreeMap/SquarifiedTreemapLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..19338e118f69e6b0aa430e0301de1dd221d0d712 --- /dev/null +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/layouts/TreeMap/SquarifiedTreemapLayout.java @@ -0,0 +1,58 @@ +package de._82grfl1bif.KPI_Visualizer.layouts.TreeMap; + +import de._82grfl1bif.KPI_Visualizer.structures.Foundation; +import de._82grfl1bif.KPI_Visualizer.structures.Structure; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class SquarifiedTreemapLayout { + + private ArrayList rows = new ArrayList<>(); + + public ArrayList getRows() { + return rows; + } + + public SquarifiedTreemapLayout() { + this.rows = new ArrayList<>(); + } + + public void generateLayout(Foundation foundation, Rectangle bounds) { + rows.addAll(generateSubLayout(foundation, bounds)); + ArrayList foundations = new ArrayList<>(); + foundations.add(foundation); + do { + ArrayList tempRows = new ArrayList<>(); + rows.stream().filter(r -> r.rectangles.containsValue(foundations.get(foundations.size()-1))).forEach(row -> + tempRows.addAll(generateSubLayout(foundations.get(foundations.size()-1), new Rectangle(foundations.get(foundations.size()-1).getArea(), row.getWidth(), row.space.getOrigin())))); + rows.addAll(tempRows);//letztes element bearbeitet und ein subLayout dafür angelegt. + + ArrayList tempFoundations = new ArrayList<>(); + for (Structure s : foundations.get(foundations.size() - 1).getChildren()) { + if (s.getClass() == Foundation.class) { + tempFoundations.add((Foundation) s); + } + } + foundations.remove(foundations.size()-1); + foundations.addAll(tempFoundations);//alle Kinder(nur Foundations) des letzten Elements in die Liste geschrieben und das Element entfernt. + + } while (!foundations.isEmpty()); + } + + private ArrayList generateSubLayout(Foundation foundation, Rectangle rectangle) { + ArrayList result = new ArrayList<>(); + result.add(new Row(rectangle)); + for (Structure s : foundation.getChildren()) { + if (!result.get(result.size() - 1).checkInsert(s.getArea())) {//wenn einfügen in die bestehende Reihe das Seitenverhältnis verschlechtern würde. + Row tempRow = new Row(result.get(result.size() - 1).getLeftover());//erzeige neue Reihe mit dem Rest des alten spaces als space. + result.add(tempRow);//füge die neue Reihe ans Ende der Sammlung ein. + } + result.get(result.size() - 1).addRectangle(s.getArea(), s);//füge das Kind in die letzte Reihe ein, die in der Liste ist. + } + return result; + } +} + diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/main.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/main.java index 6df40dc77eb571b9262b629e1e76a269c7ebd663..722936b872ec3fe90ec0ca378e9cb44bbd04afbb 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/main.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/main.java @@ -2,7 +2,7 @@ package de._82grfl1bif.KPI_Visualizer; import de._82grfl1bif.KPI_Visualizer.commands.SetPreset; import de._82grfl1bif.KPI_Visualizer.commands.generateLayout; -import de._82grfl1bif.KPI_Visualizer.data.FileInputTabCompleter; +import de._82grfl1bif.KPI_Visualizer.helpers.FileInputTabCompleter; import org.bukkit.plugin.java.JavaPlugin; public final class main extends JavaPlugin { diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Builder.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Builder.java index 3400a046ceb781ccbde9f83988257cb683c56f43..68055f2b038d931ae3f1775f87e4ee74a56b0fd9 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Builder.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Builder.java @@ -7,7 +7,13 @@ import org.bukkit.block.Block; public class Builder { - public void setFoundation(Server server, Location startLocation, int x, int z, Material material) { + Server server; + + public Builder(Server server) { + this.server = server; + } + + public void setFoundation(Location startLocation, int x, int z, Material material) { for (int cx = 0; cx < x; cx++) { for (int cz = 0; cz < z; cz++) { Block block = server.getWorlds().get(0).getBlockAt(startLocation.clone().add(cx, 0, cz)); @@ -16,87 +22,78 @@ public class Builder { } } - public void fillQube(Server server, Location startLocation, int x, int y, int z, Material material) { + public void fillQube(Location startLocation, int x, int y, int z, Material material) { for (int cy = 0; cy < y; cy++) { - setFoundation(server, startLocation.clone().add(0, cy, 0), x, z, material); + setFoundation(startLocation.clone().add(0, cy, 0), x, z, material); } } - private void setWalls(Server server, Location startLocation, int x, int y,Material material) { - Location save = startLocation.clone(); - Location temp = startLocation.clone(); - for (int cx = 0; cx < x - 1; cx++) {// x+x Wall - for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(cx,cy,1)).setType(material); - } - } - temp = save.clone(); - for (int cz = 0; cz < x - 1; cz++) {// z+x Wall + private void setWalls(Location startLocation, int x, int y, int z, Material innerMaterial, Material glassMaterial) { + Location temp = startLocation.clone().add(0,0,1); + for (int cz = 0; cz < z - 2; cz++) {//00-0Z for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(1, cy, cz)).setType(material); + server.getWorlds().get(0).getBlockAt(temp.clone().add(1, cy, cz)).setType(innerMaterial); + server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, cz)).setType(glassMaterial); } } - temp = save.clone().add(0, 0, x - 1); - for (int cx = 0; cx < x; cx++) {// x+x z+x Wall from x+x + temp = startLocation.clone().add(1,0,0); + for (int cx = 0; cx < x - 2; cx++) {//00-0X for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(cx, cy, -1)).setType(material); + server.getWorlds().get(0).getBlockAt(temp.clone().add(cx, cy, 1)).setType(innerMaterial); + server.getWorlds().get(0).getBlockAt(temp.clone().add(cx, cy, 0)).setType(glassMaterial); } } - temp = save.clone().add(x - 1, 0, 0); - for (int cz = 0; cz < x - 1; cz++) {// x+x z+x Wall from x+z + temp = startLocation.clone().add(1, 0, z - 1); + for (int cx = 0; cx < x - 2; cx++) {//0Z-ZX for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(-1, cy, cz)).setType(material); - } - } + server.getWorlds().get(0).getBlockAt(temp.clone().add(cx, cy, -1)).setType(innerMaterial); + server.getWorlds().get(0).getBlockAt(temp.clone().add(cx, cy, 0)).setType(glassMaterial); - temp = save.clone(); - for (int cx = 0; cx < x - 1; cx++) {// x+x Wall - for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(cx, cy, 0)).setType(Material.GLASS); } } - temp = save.clone(); - for (int cz = 0; cz < x - 1; cz++) {// z+x Wall + temp = startLocation.clone().add(x - 1, 0, 1); + for (int cz = 0; cz < z - 2; cz++) {//0X-XZ for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, cz)).setType(Material.GLASS); - } - } - temp = save.clone().add(0, 0, x - 1); - for (int cx = 0; cx < x; cx++) {// x+x z+x Wall from x+x - for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(cx, cy, 0)).setType(Material.GLASS); - } - } - temp = save.clone().add(x - 1, 0, 0); - for (int cz = 0; cz < x - 1; cz++) {// x+x z+x Wall from x+z - for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, cz)).setType(Material.GLASS); + server.getWorlds().get(0).getBlockAt(temp.clone().add(-1, cy, cz)).setType(innerMaterial); + server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, cz)).setType(glassMaterial); + } } + } - temp = save.clone(); + private void setCorners(Location startLocation, int x, int y, int z, Material facade) { + Location temp = startLocation.clone(); for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, 0)).setType(Material.BLACKSTONE); + server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, 0)).setType(facade); } - temp = save.clone().add(x - 1, 0, 0); + temp = startLocation.clone().add(x - 1, 0, 0); for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, 0)).setType(Material.BLACKSTONE); + server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, 0)).setType(facade); } - temp = save.clone().add(0, 0, x - 1); + temp = startLocation.clone().add(0, 0, z - 1); for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, 0)).setType(Material.BLACKSTONE); + server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, 0)).setType(facade); } - temp = save.clone().add(x - 1, 0, x - 1); + temp = startLocation.clone().add(x - 1, 0, z - 1); for (int cy = 0; cy < y; cy++) { - server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, 0)).setType(Material.BLACKSTONE); + server.getWorlds().get(0).getBlockAt(temp.clone().add(0, cy, 0)).setType(facade); } - - save.add(0,y,0);//roof - setFoundation(server,save,x,x,Material.BLACKSTONE); } - public void buildBuilding(Server server, Location startLocation, int x, int y, Material material) { - setWalls(server, startLocation.clone().add(0, 1, 0), x, y, material); + public void buildBuilding(Location startLocation, int x, int y, int z, Material material) { + setWalls(startLocation, x, y, z, material, Material.GLASS); + setCorners(startLocation, x, y, z, Material.BLACKSTONE); + setFoundation(startLocation.clone().add(0, y, 0), x, z, Material.BLACKSTONE);//roof } + public void setAllChildren(Foundation foundation) { + for (Structure s : foundation.getChildren()) { + if (s.getClass() == Foundation.class) {//TODO must be revisited to draw rectangular Foundations + this.setFoundation(s.getLocation().clone().add(0, s.getDepth(), 0), s.getWidth().x, s.getWidth().x, s.getMaterial()); + setAllChildren((Foundation) s); + } else {//TODO must be revisited to draw rectangular Buildings + this.buildBuilding(s.getLocation().clone().add(1, s.getDepth(), 1), s.getWidth().x - 2, ((Building) s).getHeight(),s.getWidth().x-2, s.getMaterial()); + } + } + } } diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Building.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Building.java index 9ac797f19bddb29469f31971389a46816d9eed83..8ba14ae720dc49bcf2229fa2ef637f5dbf563f64 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Building.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Building.java @@ -13,7 +13,7 @@ public class Building extends Structure{ this.width.y = width; this.height = height; this.material = material; - if(this.width.x < 3){ + if(this.width.x < 5){ throw new IllegalArgumentException("keine Gebäude kleiner 3 wegen 2 Gehweg"); } } @@ -22,7 +22,7 @@ public class Building extends Structure{ this.width = width; this.height = height; this.material = material; - if(this.width.x < 3 || this.width.y < 3){ + if(this.width.x < 5 || this.width.y < 5){ throw new IllegalArgumentException("keine Gebäude kleiner 3 wegen 2 Gehweg"); } } @@ -30,9 +30,10 @@ public class Building extends Structure{ public Building(Material material, Klasse klasse, String name){ //Buildings are Square -> no depth this.material = material; this.width = new Point(5,5); //TODO: make this work with treemap and square + this.area = klasse.qloc; this.name = name; this.height = klasse.commits; // con be changed to likings TODO: find out which fits best. - if(this.width.x < 3 || this.width.y < 3){ + if(this.width.x < 5 || this.width.y < 5){ throw new IllegalArgumentException("keine Gebäude kleiner 3 wegen 2 Gehweg"); } } diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Foundation.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Foundation.java index b3d6f84244ba4349abc5da5bc9918f4542a92618..670a6d739ea69f70e4e57b90de72c04e7ff20f89 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Foundation.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Foundation.java @@ -1,7 +1,7 @@ package de._82grfl1bif.KPI_Visualizer.structures; import de._82grfl1bif.KPI_Visualizer.data.Klasse; -import de._82grfl1bif.KPI_Visualizer.helpers.Layout; +import de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.SimpleSquareLayout; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.util.Vector; @@ -16,7 +16,7 @@ import java.util.Random; public class Foundation extends Structure { private ArrayList children = new ArrayList<>(); - private Layout layout; + private SimpleSquareLayout simpleSquareLayout; public Foundation(int depth, Material material) { //Foundations are uniform Height this.width.x = 0; @@ -47,7 +47,7 @@ public class Foundation extends Structure { if (isFoundation) { result = new Foundation(this.depth + 1, nextMaterial(), name); } else { - result = new Building(Material.LIME_CONCRETE, klasse, name); + result = new Building(nextMaterial(), klasse, name); } this.children.add(result); return result; @@ -143,19 +143,10 @@ public class Foundation extends Structure { return null; } - public Structure findByName(String findName) { - if (this.name.equals(findName)) { - return this; - } else { - for (Structure s : this.children) { - if (s.getClass() == Foundation.class) { - if ((((Foundation) s).findByName(findName)) != null) { - return s; - } - } - } - } - return null; + @Override + public double getArea(){ + if(area == 0)setAllAreas(); + return area; } private static class DepthComparator implements Comparator { @@ -188,13 +179,13 @@ public class Foundation extends Structure { } else { //normal Call and recursion this.children.sort(new WidthComparator()); Collections.reverse(this.children); //Widest Building or Foundation first - this.layout = new Layout(this.children); - this.layout.createLayout(); - this.width.x = layout.getSize(); + this.simpleSquareLayout = new SimpleSquareLayout(this.children); + this.simpleSquareLayout.createLayout(); + this.width.x = simpleSquareLayout.getSize(); } } - private ArrayList collectAllFoundations() { //called on the base Foundation + public ArrayList collectAllFoundations() { //called on the base Foundation ArrayList fCollection = new ArrayList<>(); fCollection.add(this); int currentDepth = this.depth; @@ -211,6 +202,18 @@ public class Foundation extends Structure { return fCollection; } + public ArrayList collectAllBuildings() { //called on the base Foundation + ArrayList buildings = new ArrayList<>(); + for (Structure s: children) { + if (s.getClass() == Foundation.class){ + buildings.addAll(((Foundation) s).collectAllBuildings()); + }else{ + buildings.add((Building) s); + } + } + return buildings; + } + private ArrayList getNextDepth() { ArrayList result = new ArrayList<>(); for (Structure s : this.children) { @@ -229,7 +232,7 @@ public class Foundation extends Structure { public void correctAllLocations(Location location) { for (Structure s : this.children) { try { - Point temp = this.layout.getCoordinateOf(s); + Point temp = this.simpleSquareLayout.getCoordinateOf(s); s.setLocation(location.clone().add(temp.x, 0, temp.y)); if (s.getClass() == Foundation.class) { Foundation f = (Foundation) s; @@ -240,4 +243,17 @@ public class Foundation extends Structure { } } } + + private double setAllAreas(){ + double myArea = 0; + for (Structure s: children) { + if(s.getClass() == Foundation.class){ + myArea += ((Foundation) s).setAllAreas(); + }else{ + myArea += s.getArea(); + } + } + this.area = myArea; + return myArea; + } } diff --git a/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Structure.java b/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Structure.java index ac8118e70e1f7d5bd85d966d713374f28e349876..5efa1abb86780304feda90f4010d2ff1ff924f99 100644 --- a/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Structure.java +++ b/src/main/java/de/_82grfl1bif/KPI_Visualizer/structures/Structure.java @@ -15,6 +15,11 @@ public abstract class Structure{ protected Location location; protected int depth; protected String name; + protected double area; + + public double getArea() { + return area; + } public Material getMaterial() { return material;