void CLayout::exportToSBML(Layout * layout, const std::map<CCopasiObject*, SBase*> & copasimodelmap, std::map<std::string, const SBase*>& sbmlIDs) const { if (!layout) return; //Name and ID std::string id = CSBMLExporter::createUniqueId(sbmlIDs, "layout_"); layout->setId(id); sbmlIDs.insert(std::pair<const std::string, const SBase*>(id, layout)); //we do not check if the layout is already present in the libsbml data //structures. This is no big deal since at the moment no software //relies on persistent IDs for layout elements. //Dimensions Dimensions tmpDim = mDimensions.getSBMLDimensions(); layout->setDimensions(&tmpDim); //some of the following code is not used at the moment: the COPASI model map //does not contain glyphs. Since this may change in the future I leave the code //below. // create a map from COPASI layout object to SBML objects. We do not put //the layout objects into the global map (copasimodelmap) but we need to have //access to all objects in the current layout since speciesReferenceGlyph and //textGlyph need to reference other graphical objects. std::map<const CLBase*, const SBase*> layoutmap; //Compartment glyphs unsigned C_INT32 i, imax = mvCompartments.size(); for (i = 0; i < imax; ++i) { CLCompartmentGlyph * tmp = mvCompartments[i]; //check if the compartment glyph exists in the libsbml data std::map<CCopasiObject*, SBase*>::const_iterator it; it = copasimodelmap.find(tmp); CompartmentGlyph * pCG; if (it == copasimodelmap.end()) //not found { pCG = new CompartmentGlyph; layout->getListOfCompartmentGlyphs()->appendAndOwn(pCG); } else { pCG = dynamic_cast<CompartmentGlyph*>(it->second); } layoutmap.insert(std::pair<const CLBase*, const SBase*>(tmp, pCG)); tmp->exportToSBML(pCG, copasimodelmap, sbmlIDs); } //Species glyphs imax = mvMetabs.size(); for (i = 0; i < imax; ++i) { CLMetabGlyph * tmp = mvMetabs[i]; //check if the glyph exists in the libsbml data std::map<CCopasiObject*, SBase*>::const_iterator it; it = copasimodelmap.find(tmp); SpeciesGlyph * pG; if (it == copasimodelmap.end()) //not found { pG = new SpeciesGlyph; layout->getListOfSpeciesGlyphs()->appendAndOwn(pG); } else { pG = dynamic_cast<SpeciesGlyph*>(it->second); } layoutmap.insert(std::pair<const CLBase*, const SBase*>(tmp, pG)); tmp->exportToSBML(pG, copasimodelmap, sbmlIDs); } //Reaction glyphs imax = mvReactions.size(); for (i = 0; i < imax; ++i) { CLReactionGlyph * tmp = mvReactions[i]; //check if the glyph exists in the libsbml data std::map<CCopasiObject*, SBase*>::const_iterator it; it = copasimodelmap.find(tmp); ReactionGlyph * pG; if (it == copasimodelmap.end()) //not found { pG = new ReactionGlyph; layout->getListOfReactionGlyphs()->appendAndOwn(pG); } else { pG = dynamic_cast<ReactionGlyph*>(it->second); } layoutmap.insert(std::pair<const CLBase*, const SBase*>(tmp, pG)); //we need to pass the layoutmap here for 2 reasons: //1. the metabreferenceglyphs need to be added //2. the metabreferenceglyphs need to resolve the reference to the metabglyph tmp->exportToSBML(pG, copasimodelmap, sbmlIDs, layoutmap); } //Text glyphs imax = mvLabels.size(); for (i = 0; i < imax; ++i) { CLTextGlyph * tmp = mvLabels[i]; //check if the glyph exists in the libsbml data std::map<CCopasiObject*, SBase*>::const_iterator it; it = copasimodelmap.find(tmp); TextGlyph * pG; if (it == copasimodelmap.end()) //not found { pG = new TextGlyph; layout->getListOfTextGlyphs()->appendAndOwn(pG); } else { pG = dynamic_cast<TextGlyph*>(it->second); } layoutmap.insert(std::pair<const CLBase*, const SBase*>(tmp, pG)); tmp->exportToSBML(pG, copasimodelmap, sbmlIDs); } //generic glyphs imax = mvGraphicalObjects.size(); for (i = 0; i < imax; ++i) { CLGraphicalObject * tmp = mvGraphicalObjects[i]; //check if the glyph exists in the libsbml data std::map<CCopasiObject*, SBase*>::const_iterator it; it = copasimodelmap.find(tmp); GraphicalObject * pG; if (it == copasimodelmap.end()) //not found { pG = new GraphicalObject; layout->getListOfAdditionalGraphicalObjects()->appendAndOwn(pG); } else { pG = dynamic_cast<GraphicalObject*>(it->second); } layoutmap.insert(std::pair<const CLBase*, const SBase*>(tmp, pG)); tmp->exportToSBML(pG, copasimodelmap, sbmlIDs); } //now that we have all graphical objects in the layoutmap we can resolve the references //in the text glyphs imax = mvLabels.size(); for (i = 0; i < imax; ++i) { const CLTextGlyph * tmp = mvLabels[i]; //find the corresponding SBML object std::map<const CLBase*, const SBase*>::const_iterator it = layoutmap.find(tmp); if (it != layoutmap.end() && it->second && dynamic_cast<const TextGlyph*>(it->second)) { tmp->exportReferenceToSBML(const_cast<TextGlyph*>(dynamic_cast<const TextGlyph*>(it->second)), layoutmap); } } }
void CLGeneralGlyph::exportToSBML(GraphicalObject * g, //TODO const std::map<const CCopasiObject*, SBase*> & copasimodelmap, std::map<std::string, const SBase*>& sbmlIDs, std::map<const CLBase*, const SBase*> & layoutmap) const { if (!g) return; //call the coresponding method of the base class CLGraphicalObject::exportToSBML(g, copasimodelmap, sbmlIDs); #if LIBSBML_VERSION >= 50800 GeneralGlyph *general = dynamic_cast<GeneralGlyph *>(g); if (!general) return; //reference to model objects CCopasiObject* tmp = getModelObject(); if (tmp) { std::map<const CCopasiObject*, SBase*>::const_iterator it = copasimodelmap.find(tmp); if (it != copasimodelmap.end()) { if (it->second) general->setReferenceId(it->second->getId()); } const CLBase* base = dynamic_cast<const CLBase*>(tmp); if (base) { std::map<const CLBase*, const SBase*>::const_iterator it2 = layoutmap.find(base); if (it2 != layoutmap.end()) { if (it2->second) general->setReferenceId(it2->second->getId()); } } } //curve mCurve.exportToSBML(general->getCurve(), copasimodelmap); //reference glyphs size_t i, imax = mvReferences.size(); for (i = 0; i < imax; ++i) { CLReferenceGlyph * tmp = mvReferences[i]; //check if the glyph exists in the libsbml data std::map<const CCopasiObject*, SBase*>::const_iterator it; it = copasimodelmap.find(tmp); ReferenceGlyph * pG; if (it == copasimodelmap.end()) //not found { pG = general->createReferenceGlyph(); } else { pG = dynamic_cast<ReferenceGlyph*>(it->second); } layoutmap.insert(std::pair<const CLBase*, const SBase*>(tmp, pG)); tmp->exportToSBML(pG, copasimodelmap, sbmlIDs, layoutmap); } imax = mvSubglyphs.size(); for (i = 0; i < imax; ++i) { CLGraphicalObject * tmp = mvSubglyphs[i]; CLMetabGlyph * metab = dynamic_cast<CLMetabGlyph*>(tmp); CLCompartmentGlyph* comp = dynamic_cast<CLCompartmentGlyph*>(tmp); CLGeneralGlyph* gg = dynamic_cast<CLGeneralGlyph*>(tmp); CLTextGlyph* text = dynamic_cast<CLTextGlyph*>(tmp); //check if the glyph exists in the libsbml data std::map<const CCopasiObject*, SBase*>::const_iterator it; it = copasimodelmap.find(tmp); GraphicalObject * pG; if (it == copasimodelmap.end()) //not found { if (metab) pG = ((Layout*)g->getParentSBMLObject()->getParentSBMLObject())->createSpeciesGlyph(); else if (comp) pG = ((Layout*)g->getParentSBMLObject()->getParentSBMLObject())->createCompartmentGlyph(); else if (gg) pG = ((Layout*)g->getParentSBMLObject()->getParentSBMLObject())->createGeneralGlyph(); else if (text) pG = ((Layout*)g->getParentSBMLObject()->getParentSBMLObject())->createTextGlyph(); else pG = ((Layout*)g->getParentSBMLObject()->getParentSBMLObject())->createAdditionalGraphicalObject(); } else { pG = dynamic_cast<GraphicalObject*>(it->second); } layoutmap.insert(std::pair<const CLBase*, const SBase*>(tmp, pG)); if (metab) metab->exportToSBML(static_cast<SpeciesGlyph*>(pG), copasimodelmap, sbmlIDs); else if (comp) comp->exportToSBML(static_cast<CompartmentGlyph*>(pG), copasimodelmap, sbmlIDs); else if (text) text->exportToSBML(static_cast<TextGlyph*>(pG), copasimodelmap, sbmlIDs); else if (gg) gg->exportToSBML(pG, copasimodelmap, sbmlIDs, layoutmap); else tmp->exportToSBML(pG, copasimodelmap, sbmlIDs); } #endif // LIBSBML_VERSION >= 50800 }