Skip to content

Commit daf6529

Browse files
author
David Baum
committed
always use hex color
We always use the hex values in the database, independently from the output format. Only in the m2t step for x3d we convert them into rgb strings
1 parent d31d1a5 commit daf6529

11 files changed

Lines changed: 113 additions & 172 deletions

File tree

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.getaviz.generator;
2+
3+
import java.awt.Color;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
7+
public class ColorGradient {
8+
9+
public static List<String> createColorGradient(String startHex, String endHex, int maxLevel) {
10+
Color start = Color.decode(startHex);
11+
Color end = Color.decode(endHex);
12+
13+
int steps = maxLevel - 1;
14+
if (maxLevel == 1) {
15+
steps++;
16+
}
17+
18+
float r_step = (end.getRed() - start.getRed()) / steps;
19+
float g_step = (end.getGreen() - start.getGreen()) / steps;
20+
float b_step = (end.getBlue() - start.getBlue()) / steps;
21+
22+
List<String> colorRange = new ArrayList<>();
23+
for (int i = 0; i < maxLevel; i++) {
24+
float newR = (start.getRed() + i * r_step)/255f;
25+
float newG = (start.getGreen() + i * g_step)/255f;
26+
float newB = (start.getBlue() + i * b_step)/255f;
27+
colorRange.add(newR + " " + newG + " " + newB);
28+
}
29+
return colorRange;
30+
}
31+
}

generator2/org.getaviz.generator/src/main/java/org/getaviz/generator/SettingsConfiguration.java

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.getaviz.generator.SettingsConfiguration.Bricks.Layout;
1414
import org.getaviz.generator.SettingsConfiguration.Original.BuildingMetric;
1515
import org.getaviz.generator.SettingsConfiguration.Panels.SeparatorModes;
16-
import org.getaviz.generator.output.OutputColor;
1716

1817
public class SettingsConfiguration {
1918
private static PropertiesConfiguration config;
@@ -315,28 +314,27 @@ public double getBuildingVerticalMargin() {
315314
return config.getDouble("city.building.vertical_margin", 1.0);
316315
}
317316

318-
public OutputColor getPackageColorStart() {
319-
return new OutputColor(config.getString("city.package.color_start", "#969696"));
317+
public String getPackageColorStart() {
318+
return config.getString("city.package.color_start", "#969696");
320319
}
321320

322-
public OutputColor getPackageColorEnd() {
323-
return new OutputColor(config.getString("city.package.color_end", "#f0f0f0"));
321+
public String getPackageColorEnd() {
322+
return config.getString("city.package.color_end", "#f0f0f0");
324323
}
325324

326-
public OutputColor getClassColorStart() {
327-
return new OutputColor(config.getString("city.class.color_start", "#131615"));
325+
public String getClassColorStart() {
326+
return config.getString("city.class.color_start", "#131615");
328327
}
329328

330-
public OutputColor getClassColorEnd() {
331-
return new OutputColor(config.getString("city.class.color_end", "#00ff00"));
329+
public String getClassColorEnd() {
330+
return config.getString("city.class.color_end", "#00ff00");
332331
}
333332

334-
public OutputColor getClassColor() {
335-
final String color = config.getString("city.class.color", "#353559");
336-
return new OutputColor(color);
333+
public String getClassColor() {
334+
return config.getString("city.class.color", "#353559");
337335
}
338336

339-
public OutputColor getCityColor(String name) {
337+
public String getCityColor(String name) {
340338
String colorName = name.toLowerCase();
341339
String defaultColor = "";
342340
switch (colorName) {
@@ -367,10 +365,16 @@ public OutputColor getCityColor(String name) {
367365
case "black":
368366
defaultColor = "#000000"; break;
369367
}
370-
final String color = config.getString("city.color." + colorName, defaultColor);
371-
return new OutputColor(color);
368+
return config.getString("city.color." + colorName, defaultColor);
372369
}
373370

371+
public String getCityFloorColor() {
372+
return config.getString("city.floor.color", "#1485CC");
373+
}
374+
375+
public String getCityChimneyColor() {
376+
return config.getString("city.floor.chimney.color", "#FFFC19");
377+
}
374378

375379
public double getRDDataFactor() {
376380
return config.getDouble("rd.data_factor", 4.0);
@@ -408,19 +412,16 @@ public double getRDDataTransparency() {
408412
return config.getDouble("rd.data_transparency", 0);
409413
}
410414

411-
public OutputColor getRDClassColor() {
412-
final String color = config.getString("rd.color.class", "#353559");
413-
return new OutputColor(color);
415+
public String getRDClassColor() {
416+
return config.getString("rd.color.class", "#353559");
414417
}
415418

416-
public OutputColor getRDDataColor() {
417-
final String color = config.getString("rd.color.data", "#fffc19");
418-
return new OutputColor(color);
419+
public String getRDDataColor() {
420+
return config.getString("rd.color.data", "#fffc19");
419421
}
420422

421-
public OutputColor getRDMethodColor() {
422-
final String color = config.getString("rd.color.method", "#1485cc");
423-
return new OutputColor(color);
423+
public String getRDMethodColor() {
424+
return config.getString("rd.color.method", "#1485cc");
424425
}
425426

426427
public boolean isMethodDisks() {

generator2/org.getaviz.generator/src/main/java/org/getaviz/generator/city/m2m/City2City.java

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package org.getaviz.generator.city.m2m;
22

3-
import org.getaviz.generator.output.OutputColor;
3+
import org.getaviz.generator.ColorGradient;
44
import org.getaviz.generator.SettingsConfiguration;
55
import org.getaviz.generator.Step;
66
import org.getaviz.generator.database.Labels;
77
import org.getaviz.generator.SettingsConfiguration.BuildingType;
88
import org.getaviz.generator.city.CityUtils;
99
import org.getaviz.generator.SettingsConfiguration.ClassElementsModes;
1010
import org.getaviz.generator.SettingsConfiguration.Original.BuildingMetric;
11-
import org.getaviz.generator.SettingsConfiguration.OutputFormat;
12-
1311
import java.util.HashMap;
1412
import java.util.List;
1513
import java.util.stream.Collectors;
@@ -25,21 +23,22 @@
2523

2624
public class City2City implements Step {
2725
private Log log = LogFactory.getLog(this.getClass());
28-
private List<OutputColor> PCKG_colors;
29-
private List<OutputColor> NOS_colors;
26+
private List<String> PCKG_colors;
27+
private List<String> NOS_colors;
3028
private HashMap<Long, double[]> properties = new HashMap<>();
3129
private DatabaseConnector connector = DatabaseConnector.getInstance();
32-
private OutputFormat outputFormat;
3330

34-
private OutputColor packageColorStart;
35-
private OutputColor packageColorEnd;
31+
private String packageColorStart;
32+
private String packageColorEnd;
3633

3734
private BuildingType buildingType;
3835
private String buildingTypeAsString;
3936
private BuildingMetric originalBuildingMetric;
40-
private OutputColor classColorStart;
41-
private OutputColor classColorEnd;
42-
private OutputColor classColor;
37+
private String classColorStart;
38+
private String classColorEnd;
39+
private String classColor;
40+
private String floorColor;
41+
private String chimneyColor;
4342
private boolean showBuildingBase;
4443

4544
private double heightMin;
@@ -69,7 +68,8 @@ public City2City(SettingsConfiguration config) {
6968
this.originalBuildingMetric = config.getOriginalBuildingMetric();
7069
this.classColorStart = config.getClassColorStart();
7170
this.classColorEnd = config.getClassColorEnd();
72-
this.outputFormat = config.getOutputFormat();
71+
this.floorColor = config.getCityFloorColor();
72+
this.chimneyColor = config.getCityChimneyColor();
7373
this.heightMin = config.getHeightMin();
7474
this.widthMin = config.getWidthMin();
7575
this.classColor = config.getClassColor();
@@ -98,12 +98,12 @@ public void run() {
9898
}
9999
int packageMaxLevel = connector.executeRead("MATCH p=(n:District)-[:CONTAINS*]->(m:District) WHERE NOT (m)-[:CONTAINS]->(:District) RETURN length(p) AS length ORDER BY length(p) DESC LIMIT 1").
100100
single().get("length").asInt() + 1;
101-
PCKG_colors = OutputColor.createColorGradient(packageColorStart, packageColorEnd, packageMaxLevel);
101+
PCKG_colors = ColorGradient.createColorGradient(packageColorStart, packageColorEnd, packageMaxLevel);
102102

103103
if (originalBuildingMetric == BuildingMetric.NOS) {
104104
int NOS_max = connector.executeRead("MATCH (n:Building) RETURN max(n.numberOfStatements) AS nos").single().
105105
get("nos").asInt();
106-
NOS_colors = OutputColor.createColorGradient(classColorStart, classColorEnd, NOS_max + 1);
106+
NOS_colors = ColorGradient.createColorGradient(classColorStart, classColorEnd, NOS_max + 1);
107107
}
108108

109109
connector.executeRead("MATCH p=(n:Model:City)-[:CONTAINS*]->(m:District) RETURN p").forEachRemaining((result) -> setDistrictAttributes(result.get("p").asPath()));
@@ -144,7 +144,7 @@ public void run() {
144144
}
145145

146146
private void setDistrictAttributes(Path districtPath) {
147-
String color = PCKG_colors.get(districtPath.length() - 1).toString();
147+
String color = PCKG_colors.get(districtPath.length() - 1);
148148
connector.executeWrite(
149149
String.format("MATCH (n) WHERE ID(n) = %d SET n.height = %f, n.color = \'%s\'", districtPath.end().id(),
150150
heightMin, color));
@@ -183,9 +183,9 @@ private void setBuildingAttributesOriginal(Node building, int methodCounter, int
183183
height = methodCounter;
184184
}
185185
if (originalBuildingMetric == BuildingMetric.NOS) {
186-
color = NOS_colors.get(building.get("numberOfStatements").asInt(0)).toString();
186+
color = NOS_colors.get(building.get("numberOfStatements").asInt(0));
187187
} else {
188-
color = classColor.toString();
188+
color = classColor;
189189
}
190190
connector.executeWrite(cypherSetBuildingSegmentAttributes(building.id(), width, length, height, color));
191191
}
@@ -213,7 +213,7 @@ private void setBuildingAttributesPanels(Node building, int methodCounter, int d
213213
length = widthMin * areaUnit + panelHorizontalMargin * 2;
214214
}
215215

216-
connector.executeWrite(cypherSetBuildingSegmentAttributes(building.id(), width, length, height, classColor.toString()));
216+
connector.executeWrite(cypherSetBuildingSegmentAttributes(building.id(), width, length, height, classColor));
217217
}
218218

219219
private void setBuildingAttributesBricks(Node building, int methodCounter, int dataCounter) {
@@ -226,7 +226,7 @@ private void setBuildingAttributesBricks(Node building, int methodCounter, int d
226226
} else {
227227
height = 0;
228228
}
229-
color = classColor.toString();
229+
color = classColor;
230230
// Setting width, height & sideCapacity
231231
switch (brickLayout) {
232232
case STRAIGHT: {
@@ -278,7 +278,7 @@ private void setBuildingAttributesFloors(Node building, int methodCounter, int d
278278
} else {
279279
height = methodCounter;
280280
}
281-
connector.executeWrite(cypherSetBuildingSegmentAttributes(building.id(), width, length, height, classColor.toString()));
281+
connector.executeWrite(cypherSetBuildingSegmentAttributes(building.id(), width, length, height, classColor));
282282
}
283283

284284
private void setBuildingSegmentAttributes(Long segment) {
@@ -444,12 +444,8 @@ private void calculateFloors(Node building) {
444444
Record record = floors.next();
445445
long floor = record.get("f").asNode().id();
446446
floorCounter++;
447-
String color = 20 / 255.0 + " " + 133 / 255.0 + " " + 204 / 255.0;
448-
if (outputFormat == OutputFormat.AFrame) {
449-
color = "#1485CC";
450-
}
451447
String statement = cypherSetBuildingSegmentAttributes(floor, bWidth * 1.1, bLength * 1.1,
452-
bHeight / (floorNumberValue + 2 ) * 0.80, color);
448+
bHeight / (floorNumberValue + 2 ) * 0.80, floorColor);
453449
statement +=
454450
String.format("CREATE (n)-[:HAS]->(p:City:Position {x: %f, y: %f, z: %f})", bPosX,
455451
(bPosY - ( bHeight / 2) ) + bHeight / ( floorNumberValue + 2 ) * floorCounter, bPosZ);
@@ -476,11 +472,7 @@ private void calculateChimneys(Node building) {
476472
" RETURN c");
477473
while (chimneys.hasNext()) {
478474
long chimney = chimneys.next().get("c").asNode().id();
479-
String color = 255 / 255.0 + " " + 252 / 255.0 + " " + 25 / 255.0;
480-
if (outputFormat == OutputFormat.AFrame) {
481-
color = "#FFFC19";
482-
}
483-
connector.executeWrite(cypherSetBuildingSegmentAttributes(chimney, 0.5, 0.5, 1.0, color));
475+
connector.executeWrite(cypherSetBuildingSegmentAttributes(chimney, 0.5, 0.5, 1.0, chimneyColor));
484476
if (chimneyCounter % 4 == 0) {
485477
courner1.add(chimney);
486478
}

generator2/org.getaviz.generator/src/main/java/org/getaviz/generator/city/m2t/City2AFrame.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.io.IOException;
1111
import java.io.FileWriter;
1212
import org.getaviz.generator.output.AFrame;
13-
import org.getaviz.generator.output.OutputColor;
1413
import org.neo4j.driver.v1.types.Node;
1514
import java.util.ArrayList;
1615
import java.util.List;
@@ -23,7 +22,7 @@ public class City2AFrame implements Step {
2322
private String buildingTypeAsString;
2423
private boolean showAttributesAsCylinders;
2524
private double panelSeparatorHeight;
26-
private OutputColor color;
25+
private String color;
2726
private boolean showBuildingBase;
2827
private AFrame outputFormat;
2928

generator2/org.getaviz.generator/src/main/java/org/getaviz/generator/output/OutputColor.java

Lines changed: 0 additions & 53 deletions
This file was deleted.

generator2/org.getaviz.generator/src/main/java/org/getaviz/generator/output/X3D.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import org.getaviz.generator.city.m2m.Rectangle;
66
import org.getaviz.generator.SettingsConfiguration.BuildingType;
77

8+
import java.awt.*;
9+
810
public class X3D implements OutputFormat {
911
private SettingsConfiguration.ClassElementsModes classElementMode;
1012
private SettingsConfiguration.ClassElementsSortModesCoarse classElementsSortModesCoarse;
@@ -55,6 +57,11 @@ public String head() {
5557
return builder.toString();
5658
}
5759

60+
public String printColor(String hexColor) {
61+
Color color = Color.decode(hexColor);
62+
return color.getRed()/255f + " " + color.getGreen()/255f + " " + color.getBlue()/255f;
63+
}
64+
5865
public String settingsInfo() {
5966
StringBuilder builder = new StringBuilder();
6067
builder.append("<SettingsInfo ClassElements=\'" + classElementMode);

0 commit comments

Comments
 (0)