Skip to content
Snippets Groups Projects
Commit 5aefb13c authored by Piotr Gawron's avatar Piotr Gawron
Browse files

export/import of reaction uses proper line definition for line center

parent ffce141c
No related branches found
No related tags found
2 merge requests!630WIP: Resolve "The privileges of a new user are not saved in some cases",!581Resolve "export to sbml layout creates partial lines for operators"
......@@ -214,32 +214,15 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb
firstReactant = false;
}
boolean firstProduct = true;
Point2D productStartPoint = null;
for (Product product : reaction.getProducts()) {
SpeciesReferenceGlyph productGlyph = createNodeGlyph(reactionGlyph, product);
if (firstProduct) {
productGlyph.setRole(SpeciesReferenceRole.PRODUCT);
for (NodeOperator operator : reaction.getOperators()) {
if (operator.isProductOperator()) {
if (productStartPoint == null) {
productStartPoint = operator.getLine().getBeginPoint();
LineSegment segment = new LineSegment();
segment.setStart(new Point(reactantEndPoint.getX(), reactantEndPoint.getY()));
segment.setEnd(new Point(productStartPoint.getX(), productStartPoint.getY()));
reactionGlyph.getCurve().addCurveSegment(segment);
}
addOperatorLineToGlyph(reactionGlyph, operator, false);
}
}
if (productStartPoint == null) {
productStartPoint = product.getLine().getBeginPoint();
LineSegment segment = new LineSegment();
segment.setStart(new Point(reactantEndPoint.getX(), reactantEndPoint.getY()));
segment.setEnd(new Point(productStartPoint.getX(), productStartPoint.getY()));
reactionGlyph.getCurve().addCurveSegment(segment);
}
} else {
productGlyph.setRole(SpeciesReferenceRole.SIDEPRODUCT);
}
......@@ -296,7 +279,6 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb
curve.addCurveSegment(segment);
}
}
}
private SpeciesReferenceGlyph createNodeGlyph(ReactionGlyph reactionGlyph, ReactionNode node) {
......
......@@ -18,6 +18,7 @@ import org.sbml.jsbml.LocalParameter;
import org.sbml.jsbml.Model;
import org.sbml.jsbml.ModifierSpeciesReference;
import org.sbml.jsbml.SpeciesReference;
import org.sbml.jsbml.ext.layout.Curve;
import org.sbml.jsbml.ext.layout.CurveSegment;
import org.sbml.jsbml.ext.layout.ReactionGlyph;
import org.sbml.jsbml.ext.layout.SpeciesGlyph;
......@@ -192,11 +193,11 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
}
}
if (reactionWithLayout.getReactants().size() > 1 && reactionWithLayout.getProducts().size() > 0) {
NodeOperator operator = createInputOperator(reactionWithLayout);
NodeOperator operator = createInputOperator(reactionWithLayout, glyph);
reactionWithLayout.addNode(operator);
}
if (reactionWithLayout.getReactants().size() > 0 && reactionWithLayout.getProducts().size() > 1) {
NodeOperator operator = createOutputOperator(reactionWithLayout);
NodeOperator operator = createOutputOperator(reactionWithLayout, glyph);
reactionWithLayout.addNode(operator);
}
assignRenderDataToReaction(glyph, reactionWithLayout);
......@@ -271,13 +272,23 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
}
}
private NodeOperator createOutputOperator(Reaction reactionWithLayout) {
private NodeOperator createOutputOperator(Reaction reactionWithLayout, ReactionGlyph reactionGlyph) {
PolylineData line = new PolylineData();
Point2D p1 = reactionWithLayout.getReactants().get(0).getLine().getEndPoint();
Point2D p2 = reactionWithLayout.getProducts().get(0).getLine().getBeginPoint();
Point2D center = new Point2D.Double((p1.getX() + p2.getX()) / 2, (p1.getY() + p2.getY()) / 2);
line.addPoint(p2);
line.addPoint(center);
Curve curve = reactionGlyph.getCurve();
int min = 0;
if (reactionWithLayout.getReactants().size() > 1) {
// with operator in the output we need to leave something for the operator
min = curve.getCurveSegmentCount() - 1;
}
for (int i = min; i < curve.getCurveSegmentCount(); i++) {
CurveSegment segment = curve.getCurveSegment(i);
if (line.getPoints().size() == 0) {
line.addPoint(new Point2D.Double(segment.getStart().getX(), segment.getStart().getY()));
}
line.addPoint(new Point2D.Double(segment.getEnd().getX(), segment.getEnd().getY()));
}
NodeOperator operator;
if (reactionWithLayout instanceof TruncationReaction) {
operator = new TruncationOperator();
......@@ -291,13 +302,24 @@ public class SbmlReactionParser extends SbmlBioEntityParser {
return operator;
}
private NodeOperator createInputOperator(Reaction reactionWithLayout) {
private NodeOperator createInputOperator(Reaction reactionWithLayout, ReactionGlyph reactionGlyph) {
PolylineData line = new PolylineData();
Point2D p1 = reactionWithLayout.getReactants().get(0).getLine().getEndPoint();
Point2D p2 = reactionWithLayout.getProducts().get(0).getLine().getBeginPoint();
Point2D center = new Point2D.Double((p1.getX() + p2.getX()) / 2, (p1.getY() + p2.getY()) / 2);
line.addPoint(p1);
line.addPoint(center);
Curve curve = reactionGlyph.getCurve();
int max = curve.getCurveSegmentCount();
if (reactionWithLayout.getProducts().size() > 1) {
// with operator in the output we need to leave something for the operator
max--;
}
for (int i = 0; i < max; i++) {
CurveSegment segment = curve.getCurveSegment(i);
if (line.getPoints().size() == 0) {
line.addPoint(new Point2D.Double(segment.getStart().getX(), segment.getStart().getY()));
}
line.addPoint(new Point2D.Double(segment.getEnd().getX(), segment.getEnd().getY()));
}
NodeOperator operator;
if (reactionWithLayout instanceof HeterodimerAssociationReaction) {
operator = new AssociationOperator();
......
......@@ -7,12 +7,14 @@ import static org.junit.Assert.assertTrue;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.lang.reflect.Modifier;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
......@@ -26,11 +28,14 @@ import org.sbml.jsbml.ext.multi.PossibleSpeciesFeatureValue;
import org.sbml.jsbml.ext.multi.SpeciesFeatureType;
import lcsb.mapviewer.common.Configuration;
import lcsb.mapviewer.common.comparator.LineComparator;
import lcsb.mapviewer.common.comparator.ListComparator;
import lcsb.mapviewer.converter.ConverterParams;
import lcsb.mapviewer.converter.IConverter;
import lcsb.mapviewer.converter.graphics.AbstractImageGenerator;
import lcsb.mapviewer.converter.graphics.NormalImageGenerator;
import lcsb.mapviewer.converter.graphics.PngImageGenerator;
import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser;
import lcsb.mapviewer.model.graphics.PolylineData;
import lcsb.mapviewer.model.map.compartment.Compartment;
import lcsb.mapviewer.model.map.model.Model;
......@@ -85,6 +90,7 @@ public class SbmlExporterTest {
private Model getModelAfterSerializing(Model originalModel) throws Exception {
String xml = exporter.toXml(originalModel);
logger.debug(xml);
ByteArrayInputStream stream = new ByteArrayInputStream(xml.getBytes("UTF-8"));
Model result = parser.createModel(new ConverterParams().inputStream(stream));
// showImage(originalModel);
......@@ -629,4 +635,17 @@ public class SbmlExporterTest {
assertEquals("Notes weren't exported/imported properly", model.getNotes(), deserializedModel.getNotes());
}
@Test
public void testExportImportOfInputOperator() throws Exception {
Model originalModel = new CellDesignerXmlParser().createModel(new ConverterParams().filename("testFiles/cell_designer_problems/heterodimer_association.xml"));
Model model = getModelAfterSerializing(originalModel);
List<Line2D> lines1 = originalModel.getReactions().iterator().next().getLines();
List<Line2D> lines2 = model.getReactions().iterator().next().getLines();
ListComparator<Line2D> comparator = new ListComparator<>(new LineComparator(Configuration.EPSILON));
assertEquals(0, comparator.compare(lines1, lines2));
}
}
......@@ -43,5 +43,4 @@ log4j.logger.lcsb.mapviewer.model.map.reaction.AbstractNodeComparator=info
log4j.logger.lcsb.mapviewer.model.map.model.ModelComparator=info
log4j.logger.lcsb.mapviewer.common.comparator=info
log4j.logger.lcsb.mapviewer.model.graphics.PolylineDataComparator=info
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment