From 4441b5409fd377e10902dded91b524a82f66f41f Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Mon, 13 May 2019 19:16:37 +0200 Subject: [PATCH] colinear points are removed when exporting to sbml --- .../sbml/reaction/SbmlReactionExporter.java | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java index e1eae5b534..778ae75c77 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java @@ -21,6 +21,7 @@ import org.sbml.jsbml.SpeciesReference; import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph; import org.sbml.jsbml.ext.layout.BoundingBox; import org.sbml.jsbml.ext.layout.Curve; +import org.sbml.jsbml.ext.layout.CurveSegment; import org.sbml.jsbml.ext.layout.LineSegment; import org.sbml.jsbml.ext.layout.Point; import org.sbml.jsbml.ext.layout.ReactionGlyph; @@ -35,8 +36,10 @@ import org.w3c.dom.Node; import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.common.XmlParser; import lcsb.mapviewer.common.exception.InvalidXmlSchemaException; +import lcsb.mapviewer.converter.model.celldesigner.geometry.helper.PolylineDataFactory; import lcsb.mapviewer.converter.model.sbml.SbmlBioEntityExporter; import lcsb.mapviewer.converter.model.sbml.SbmlExtension; +import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.InconsistentModelException; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.kinetics.SbmlKinetics; @@ -295,14 +298,38 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb if (isExtensionEnabled(SbmlExtension.RENDER)) { assignStyleToGlyph(reactionGlyph, createStyle(reaction)); } - if (reactionGlyph.getBoundingBox()==null) { + if (reactionGlyph.getBoundingBox() == null) { reactionGlyph.setBoundingBox(new BoundingBox()); } - if (reactionGlyph.getBoundingBox().getPosition()==null) { + if (reactionGlyph.getBoundingBox().getPosition() == null) { reactionGlyph.getBoundingBox().setPosition(new Point()); } reactionGlyph.getBoundingBox().getPosition().setZ(reaction.getZ()); + removeColinearPoints(reactionGlyph); + } + + private void removeColinearPoints(ReactionGlyph glyph) { + PolylineData line = createLine(glyph.getCurve()); + logger.debug(line); + line = PolylineDataFactory.removeCollinearPoints(line); + logger.debug(line); + Curve curve = createCurve(line, false); + glyph.setCurve(curve); + } + + private PolylineData createLine(Curve curve) { + PolylineData result = new PolylineData(); + if (curve.getCurveSegmentCount() > 0) { + CurveSegment segment = curve.getCurveSegment(0); + result.addPoint(new Point2D.Double(segment.getStart().getX(), segment.getStart().getY())); + } + for (int i = 0; i < curve.getCurveSegmentCount(); i++) { + CurveSegment segment = curve.getCurveSegment(i); + result.addPoint(new Point2D.Double(segment.getEnd().getX(), segment.getEnd().getY())); + + } + return result; } private LocalStyle createStyle(ReactionNode node) { @@ -358,16 +385,20 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb private SpeciesReferenceGlyph createNodeGlyph(ReactionGlyph reactionGlyph, ReactionNode node) { SpeciesReferenceGlyph reactantGlyph = reactionGlyph.createSpeciesReferenceGlyph("node_" + getNextId()); reactantGlyph.setSpeciesGlyph(speciesExporter.getSbmlGlyphByElementId(node.getElement().getElementId()).getId()); - reactantGlyph.setCurve(createCurve(node, node instanceof Reactant)); + Curve curve = createCurve(node.getLine(), node instanceof Reactant); + if (curve.getCurveSegmentCount() == 0) { + logger.warn(new ElementUtils().getElementTag(node) + " Problematic line"); + } + reactantGlyph.setCurve(curve); reactantGlyph.setSpeciesReference(speciesReferenceByReactionNode.get(node)); return reactantGlyph; } - private Curve createCurve(ReactionNode node, boolean reverse) { + private Curve createCurve(PolylineData polyline, boolean reverse) { Curve curve = new Curve(); - List<Line2D> lines = node.getLine().getLines(); + List<Line2D> lines = polyline.getLines(); if (reverse) { - lines = node.getLine().reverse().getLines(); + lines = polyline.reverse().getLines(); } for (Line2D line : lines) { if (line.getP1().distance(line.getP2()) > Configuration.EPSILON) { @@ -377,9 +408,6 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb curve.addCurveSegment(segment); } } - if (curve.getCurveSegmentCount() == 0) { - logger.warn(new ElementUtils().getElementTag(node) + " Problematic line"); - } return curve; } -- GitLab