diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java index 7472ee1cbb776bfb8d42484d2f335210ff00e461..e418c5232819ecd2f76045faca2104ad311930b8 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java @@ -29,6 +29,7 @@ import lcsb.mapviewer.converter.ConverterException; import lcsb.mapviewer.converter.ConverterParams; import lcsb.mapviewer.converter.IConverter; import lcsb.mapviewer.converter.InvalidInputDataExecption; +import lcsb.mapviewer.converter.model.celldesigner.structure.ComplexSpeciesTest; import lcsb.mapviewer.converter.model.sbml.reaction.SbmlReactionParser; import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesParser; import lcsb.mapviewer.model.map.BioEntity; @@ -40,7 +41,9 @@ import lcsb.mapviewer.model.map.modifier.Modulation; import lcsb.mapviewer.model.map.reaction.AbstractNode; import lcsb.mapviewer.model.map.reaction.Modifier; import lcsb.mapviewer.model.map.reaction.Reaction; +import lcsb.mapviewer.model.map.species.Complex; import lcsb.mapviewer.model.map.species.Element; +import lcsb.mapviewer.model.map.species.Species; public class SbmlParser implements IConverter { @@ -115,6 +118,9 @@ public class SbmlParser implements IConverter { if (sbmlModel.getRuleCount() > 0) { throw new NotImplementedException("Rule not implemented for model"); } + if (layoutExists) { + addComplexRelationsBasedOnCoordinates(model); + } createLayout(model, layout, params.isSizeAutoAdjust(), reactionParser); return model; } catch (XMLStreamException e) { @@ -122,6 +128,39 @@ public class SbmlParser implements IConverter { } } + private void addComplexRelationsBasedOnCoordinates(Model model) { + for (Element element : model.getElements()) { + if (element instanceof Species) { + Species species = (Species) element; + if (species.getComplex() == null && element.getWidth() != 0 || element.getHeight() != 0) { + Complex complex = findComplexForElement(species, model); + if (complex != null) { + complex.addSpecies(species); + } + } + } + } + } + + private Complex findComplexForElement(Species species, Model model) { + Complex result = null; + for (Element element : model.getElements()) { + if (element instanceof Complex && element!=species) { + Complex complex = (Complex) element; + if ( complex.getWidth() != 0 || complex.getHeight() != 0) { + if (complex.contains(species)) { + if (result==null) { + result = complex; + } else if (result.getSize()>complex.getSize()) { + result = complex; + } + } + } + } + } + return result; + } + private void createLayout(Model model, Layout layout, boolean resize, SbmlReactionParser parser) throws InvalidInputDataExecption { if (model.getWidth() == null) {