/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CityDoctor2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with CityDoctor2. If not, see .
*/
package de.hft.stuttgart.citydoctor2.reporting.pdf;
import java.util.Collection;
import org.locationtech.proj4j.ProjCoordinate;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.Edge;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
/**
* Handler for the information given by the errors. The information is formatted
* and written out in the PDF report. Most information is formatted into code
* blocks with a border for more overview.
*
* @author Matthias Betz
*
*/
public class PdfErrorHandler implements ErrorReport {
private static final String VERTEX_FORMAT = "%f %f %f";
private static final String TAG_COLOR = "#3F7F7F";
private static final String ATTRIBUTE_KEY_COLOR = "#7F007F";
private static final String ATTRIBUTE_VALUE_COLOR = "#2A00FF";
private Section section;
private ParserConfiguration config;
public PdfErrorHandler(Section section, ParserConfiguration config) {
this.config = config;
this.section = section;
}
@Override
public void add(Polygon p) {
CodeBlock block = new CodeBlock();
section.addCodeBlock(block);
block.addText("", TAG_COLOR);
block.newLine(10);
block.addText("", TAG_COLOR);
for (Vertex v : p.getExteriorRing().getVertices()) {
block.newLine(20);
addVertexToBlock(block, v);
}
block.newLine(10);
block.addText("", TAG_COLOR);
if (!p.getInnerRings().isEmpty()) {
block.newLine(10);
block.addText("", TAG_COLOR);
for (LinearRing ring : p.getInnerRings()) {
block.newLine(20);
block.addText("", TAG_COLOR);
for (Vertex v : p.getExteriorRing().getVertices()) {
block.newLine(30);
addVertexToBlock(block, v);
}
block.newLine(20);
block.addText("", TAG_COLOR);
}
block.newLine(10);
block.addText("", TAG_COLOR);
}
block.newLine(0);
block.addText("", TAG_COLOR);
}
private void addVertexToBlock(CodeBlock block, Vertex v) {
double x = v.getX();
double y = v.getY();
double z = v.getZ();
if (config.getOriginalTransform() != null) {
ProjCoordinate p1 = new ProjCoordinate();
ProjCoordinate p2 = new ProjCoordinate();
p1.x = v.getX();
p1.y = v.getY();
config.getOriginalTransform().transform(p1, p2);
x = p2.x;
y = p2.y;
}
block.addText(String.format(VERTEX_FORMAT, x, y, z));
}
private void addGmlId(GmlElement e, CodeBlock block) {
if (!e.getGmlId().isGenerated()) {
block.addText(" gml:id", ATTRIBUTE_KEY_COLOR);
block.addText("=");
block.addText(e.getGmlId().getGmlString(), ATTRIBUTE_VALUE_COLOR);
}
}
@Override
public void add(LinearRing lr) {
CodeBlock block = new CodeBlock();
section.addCodeBlock(block);
block.addText("", TAG_COLOR);
for (Vertex v : lr.getVertices()) {
block.newLine(10);
addVertexToBlock(block, v);
}
block.newLine();
block.addText("", TAG_COLOR);
}
@Override
public void add(Geometry geom) {
CodeBlock block = new CodeBlock();
section.addCodeBlock(block);
block.addText("", TAG_COLOR);
for (Polygon p : geom.getPolygons()) {
block.newLine(10);
block.addText("", TAG_COLOR);
}
block.newLine();
block.addText("", TAG_COLOR);
}
@Override
public void add(Vertex v) {
addVector(v);
}
private void addVector(Vector3d v) {
CodeBlock block = new CodeBlock();
section.addCodeBlock(block);
block.addText("", TAG_COLOR);
block.addText(String.format(VERTEX_FORMAT, v.getX(), v.getY(), v.getZ()));
block.addText("", TAG_COLOR);
}
@Override
public void add(String name, Vertex v) {
section.add10PtTextElement(name, 5);
add(v);
}
@Override
public void add(Edge e) {
CodeBlock block = new CodeBlock();
section.addCodeBlock(block);
addEdgeToBlock(e, block);
}
private void addEdgeToBlock(Edge e, CodeBlock block) {
block.addText("", TAG_COLOR);
block.newLine(10);
block.addText("", TAG_COLOR);
block.addText(String.format(VERTEX_FORMAT, e.getFrom().getX(), e.getFrom().getY(), e.getFrom().getZ()));
block.addText("", TAG_COLOR);
block.newLine(10);
block.addText("", TAG_COLOR);
block.addText(String.format(VERTEX_FORMAT, e.getTo().getX(), e.getTo().getY(), e.getTo().getZ()));
block.addText("", TAG_COLOR);
block.newLine();
block.addText("", TAG_COLOR);
block.newLine();
}
@Override
public void add(BoundarySurface bs) {
section.add10PtTextElement("In BoundarySurface " + bs.getType().toString() + " id=" + bs.getGmlId(), 5);
}
@Override
public void add(String name, Edge e) {
section.add10PtTextElement(name, 5);
add(e);
}
@Override
public void add(String name, int value) {
add(name, "" + value);
}
@Override
public void add(String name, double value) {
add(name, "" + value);
}
@Override
public void add(String name, String value) {
section.add10PtTextElement(String.join(": ", name, value), 5);
}
@Override
public void add(String name, Vector3d point) {
section.add10PtTextElement(name, 5);
addVector(point);
}
@Override
public void addPolygons(String name, Collection polygons) {
section.add10PtTextElement(name, 5);
for (Polygon p : polygons) {
section.add10PtTextElement(p.getGmlId().getGmlString(), 10);
}
}
@Override
public void addEdges(String name, Collection edges) {
section.add10PtTextElement(name, 5);
CodeBlock block = new CodeBlock();
section.addCodeBlock(block);
for (Edge e : edges) {
addEdgeToBlock(e, block);
}
}
}