Commit ecce2b54 authored by Luna Riegel's avatar Luna Riegel
Browse files

Feat: Add visualization of Unfragmented error

parent 07d21d94
...@@ -38,7 +38,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError; ...@@ -38,7 +38,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidError; import de.hft.stuttgart.citydoctor2.check.error.SolidError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError; import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError;
...@@ -182,7 +182,7 @@ public abstract class AbstractErrorVisitor implements ErrorVisitor { ...@@ -182,7 +182,7 @@ public abstract class AbstractErrorVisitor implements ErrorVisitor {
} }
@Override @Override
public void visit(SurfaceFragmentedError err) { public void visit(SurfaceUnfragmentedError err) {
} }
@Override @Override
......
...@@ -56,7 +56,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError; ...@@ -56,7 +56,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidError; import de.hft.stuttgart.citydoctor2.check.error.SolidError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError; import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError;
...@@ -136,7 +136,7 @@ public interface ErrorVisitor { ...@@ -136,7 +136,7 @@ public interface ErrorVisitor {
public void visit(SchematronError err); public void visit(SchematronError err);
public void visit(SurfaceFragmentedError err); public void visit(SurfaceUnfragmentedError err);
public void visit(DegeneratedRingError err); public void visit(DegeneratedRingError err);
......
...@@ -48,7 +48,7 @@ import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError; ...@@ -48,7 +48,7 @@ import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError;
import de.hft.stuttgart.citydoctor2.check.error.SchematronError; import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError; import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError;
...@@ -189,7 +189,7 @@ public interface HealingMethod { ...@@ -189,7 +189,7 @@ public interface HealingMethod {
return false; return false;
} }
default boolean visit(SurfaceFragmentedError err, ModificationListener l) { default boolean visit(SurfaceUnfragmentedError err, ModificationListener l) {
return false; return false;
} }
......
...@@ -57,7 +57,7 @@ import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError; ...@@ -57,7 +57,7 @@ import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError;
import de.hft.stuttgart.citydoctor2.check.error.SchematronError; import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError; import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError;
...@@ -369,7 +369,7 @@ public class QualityAdeErrorVisitor extends AbstractErrorVisitor { ...@@ -369,7 +369,7 @@ public class QualityAdeErrorVisitor extends AbstractErrorVisitor {
} }
@Override @Override
public void visit(SurfaceFragmentedError err) { public void visit(SurfaceUnfragmentedError err) {
// not translated // not translated
} }
......
...@@ -27,6 +27,7 @@ import de.hft.stuttgart.citydoctor2.check.HealingMethod; ...@@ -27,6 +27,7 @@ import de.hft.stuttgart.citydoctor2.check.HealingMethod;
import de.hft.stuttgart.citydoctor2.check.ModificationListener; import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement; import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import java.io.Serial; import java.io.Serial;
...@@ -36,17 +37,19 @@ import java.io.Serial; ...@@ -36,17 +37,19 @@ import java.io.Serial;
* @author Matthias Betz * @author Matthias Betz
* *
*/ */
public class SurfaceFragmentedError implements CheckError { public class SurfaceUnfragmentedError implements CheckError {
@Serial @Serial
private static final long serialVersionUID = 3146243879393474196L; private static final long serialVersionUID = 3146243879393474196L;
private final BoundarySurface bs; private final BoundarySurface bs;
private final double angleDeviation; private final double angleDeviation;
private final Polygon fragment;
public SurfaceFragmentedError(BoundarySurface bs, double angleDerivation) { public SurfaceUnfragmentedError(BoundarySurface bs, Polygon fragment, double angleDerivation) {
this.bs = bs; this.bs = bs;
this.angleDeviation = angleDerivation; this.angleDeviation = angleDerivation;
this.fragment = fragment;
} }
@Override @Override
...@@ -62,6 +65,10 @@ public class SurfaceFragmentedError implements CheckError { ...@@ -62,6 +65,10 @@ public class SurfaceFragmentedError implements CheckError {
return bs; return bs;
} }
public Polygon getFragment() {
return fragment;
}
@Override @Override
public boolean accept(HealingMethod method, ModificationListener l) { public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l); return method.visit(this, l);
......
...@@ -24,11 +24,12 @@ import java.util.List; ...@@ -24,11 +24,12 @@ import java.util.List;
import de.hft.stuttgart.citydoctor2.check.Check; import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckResult; import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.math.Vector3d; import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.utils.Pair;
/** /**
* Utility class for checking whether a boundary surface has different normals * Utility class for checking whether a boundary surface has different normals
...@@ -55,14 +56,15 @@ public class UnfragmentedCheck { ...@@ -55,14 +56,15 @@ public class UnfragmentedCheck {
*/ */
public static CheckResult checkForFragmentedBoundarySurfaces(Check c, BoundarySurface bs, double delta) { public static CheckResult checkForFragmentedBoundarySurfaces(Check c, BoundarySurface bs, double delta) {
for (Geometry geom : bs.getGeometries()) { for (Geometry geom : bs.getGeometries()) {
List<Vector3d> normals = new ArrayList<>(); List<Pair<Polygon,Vector3d>> normals = new ArrayList<>();
for (Polygon p : geom.getPolygons()) { for (Polygon p : geom.getPolygons()) {
normals.add(p.calculateNormalNormalized()); normals.add(new Pair<>(p, p.calculateNormalNormalized()));
} }
double x = 0; double x = 0;
double y = 0; double y = 0;
double z = 0; double z = 0;
for (Vector3d n : normals) { for (Pair<Polygon, Vector3d> pair : normals) {
Vector3d n = pair.getValue1();
x += n.getX(); x += n.getX();
y += n.getY(); y += n.getY();
z += n.getZ(); z += n.getZ();
...@@ -71,11 +73,12 @@ public class UnfragmentedCheck { ...@@ -71,11 +73,12 @@ public class UnfragmentedCheck {
y = y / normals.size(); y = y / normals.size();
z = z / normals.size(); z = z / normals.size();
Vector3d averageNormal = new Vector3d(x, y, z); Vector3d averageNormal = new Vector3d(x, y, z);
for (Vector3d n : normals) { for (Pair<Polygon, Vector3d> pair : normals) {
Vector3d n = pair.getValue1();
double dot = averageNormal.dot(n); double dot = averageNormal.dot(n);
double acos = Math.acos(dot); double acos = Math.acos(dot);
if (acos > delta) { if (acos > delta) {
SurfaceFragmentedError err = new SurfaceFragmentedError(bs, acos); SurfaceUnfragmentedError err = new SurfaceUnfragmentedError(bs, pair.getValue0(),acos);
return new CheckResult(c, ResultStatus.ERROR, err); return new CheckResult(c, ResultStatus.ERROR, err);
} }
} }
......
...@@ -40,11 +40,10 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError; ...@@ -40,11 +40,10 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidError; import de.hft.stuttgart.citydoctor2.check.error.SolidError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError; import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError;
import org.apache.commons.lang3.NotImplementedException;
public class GlobalErrorVisitor implements ErrorVisitor { public class GlobalErrorVisitor implements ErrorVisitor {
...@@ -188,7 +187,7 @@ public class GlobalErrorVisitor implements ErrorVisitor { ...@@ -188,7 +187,7 @@ public class GlobalErrorVisitor implements ErrorVisitor {
} }
@Override @Override
public void visit(SurfaceFragmentedError err) { public void visit(SurfaceUnfragmentedError err) {
} }
@Override @Override
......
...@@ -336,6 +336,17 @@ public class HighlightController { ...@@ -336,6 +336,17 @@ public class HighlightController {
}); });
} }
public void addObjectHighlight(CityObject object, TriangulatedGeometry triGeom) {
object.accept(new CheckableUtilsVisitor() {
@Override
public void check(Geometry geom) {
geom.getPolygons().forEach(p -> {
addPolygonHighlight(p, triGeom);
});
}
});
}
/** /**
* Adds a polygon highlight to a {@link TriangulatedGeometry}. * Adds a polygon highlight to a {@link TriangulatedGeometry}.
* @param p the polygon to highlight * @param p the polygon to highlight
......
...@@ -42,11 +42,12 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError; ...@@ -42,11 +42,12 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidError; import de.hft.stuttgart.citydoctor2.check.error.SolidError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError; import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError; import de.hft.stuttgart.citydoctor2.check.error.XMLValidationError;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.Edge; import de.hft.stuttgart.citydoctor2.datastructure.Edge;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
...@@ -244,8 +245,10 @@ public class ListErrorVisitor implements ErrorVisitor { ...@@ -244,8 +245,10 @@ public class ListErrorVisitor implements ErrorVisitor {
} }
@Override @Override
public void visit(SurfaceFragmentedError err) { public void visit(SurfaceUnfragmentedError err) {
// nothing to display controller.clearHighlights();
controller.addObjectHighlight(err.getBoundarySurface(), geom);
controller.addPolygonHighlight(err.getFragment(), geom);
} }
@Override @Override
...@@ -306,6 +309,7 @@ public class ListErrorVisitor implements ErrorVisitor { ...@@ -306,6 +309,7 @@ public class ListErrorVisitor implements ErrorVisitor {
@Override @Override
public void visit(FeatureCollisionError err){ public void visit(FeatureCollisionError err){
controller.highlightGeometryCollisions(err.getCollisionRecord(), geom); controller.highlightGeometryCollisions(err.getCollisionRecord(), geom);
//TODO: Implement handling of error here //TODO: Implement handling of error here
} }
} }
...@@ -38,7 +38,7 @@ import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError; ...@@ -38,7 +38,7 @@ import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError;
import de.hft.stuttgart.citydoctor2.check.error.SchematronError; import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError; import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceFragmentedError; import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError; import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError; import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon; import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
...@@ -49,7 +49,6 @@ import de.hft.stuttgart.citydoctor2.datastructure.Polygon; ...@@ -49,7 +49,6 @@ import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
import de.hft.stuttgart.citydoctor2.gui.CheckStatus; import de.hft.stuttgart.citydoctor2.gui.CheckStatus;
import de.hft.stuttgart.citydoctor2.gui.tree.node.EdgeNode; import de.hft.stuttgart.citydoctor2.gui.tree.node.EdgeNode;
import de.hft.stuttgart.citydoctor2.gui.tree.node.GeometryNode;
import de.hft.stuttgart.citydoctor2.gui.tree.node.LinearRingNode; import de.hft.stuttgart.citydoctor2.gui.tree.node.LinearRingNode;
import de.hft.stuttgart.citydoctor2.gui.tree.node.PolygonNode; import de.hft.stuttgart.citydoctor2.gui.tree.node.PolygonNode;
import de.hft.stuttgart.citydoctor2.gui.tree.node.TextNode; import de.hft.stuttgart.citydoctor2.gui.tree.node.TextNode;
...@@ -400,7 +399,10 @@ public class ErrorItemVisitor extends AbstractErrorVisitor { ...@@ -400,7 +399,10 @@ public class ErrorItemVisitor extends AbstractErrorVisitor {
} }
@Override @Override
public void visit(SurfaceFragmentedError err) { public void visit(SurfaceUnfragmentedError err) {
PolygonNode polygonNode = new PolygonNode(err.getFragment(), CheckStatus.NOT_CHECKED);
TreeItem<Renderable> polygonItem = new TreeItem<>(polygonNode);
root.getChildren().add(polygonItem);
TextNode textNode = new TextNode( TextNode textNode = new TextNode(
Localization.getText("ErrorItemVisitor.deviation") + ": " + err.getAngleDeviation()); Localization.getText("ErrorItemVisitor.deviation") + ": " + err.getAngleDeviation());
TreeItem<Renderable> textItem = new TreeItem<>(textNode); TreeItem<Renderable> textItem = new TreeItem<>(textNode);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment