private SdfState ReadCtabFooter(StreamReader reader) { SdfState result = SdfState.Error; while (!reader.EndOfStream) { string line = SdFileConverter.GetNextLine(reader); if (!string.IsNullOrEmpty(line)) { if (line.StartsWith(MDLConstants.M_CHG) || line.StartsWith(MDLConstants.M_ISO) || line.StartsWith(MDLConstants.M_RAD)) { ReadAtomPropertyLine(line); } if (line.Equals(MDLConstants.M_END)) { result = SdfState.EndOfCtab; break; } } } return(result); }
public override SdfState ImportFromStream(StreamReader reader, Molecule molecule, out string message) { _molecule = molecule; atomByNumber = new Dictionary <int, Atom>(); bondByNumber = new Dictionary <int, Bond>(); numberByAtom = new Dictionary <Atom, int>(); message = null; SdfState result = SdfState.Null; try { while (!reader.EndOfStream) { MDLCounts counts = ReadCtabHeader(reader); if (!string.IsNullOrEmpty(counts.Message)) { if (counts.Message.Contains("Unsupported")) { result = SdfState.Unsupported; } else { result = SdfState.Error; } message = counts.Message; break; } else { ReadAtoms(reader, counts.Atoms); ReadBonds(reader, counts.Bonds); result = ReadCtabFooter(reader); break; } } } catch (System.Exception ex) { Debug.WriteLine(ex.Message); message = ex.Message; result = SdfState.Error; } return(result); }
public override SdfState ImportFromStream(StreamReader reader, Molecule molecule, out string message) { message = null; _molecule = molecule; SdfState result = SdfState.Null; try { bool isFormula = false; string internalName = ""; while (!reader.EndOfStream) { string line = SdFileConverter.GetNextLine(reader); //reader.ReadLine();; if (!string.IsNullOrEmpty(line)) { if (line.Equals(MDLConstants.SDF_END)) { // End of SDF Section result = SdfState.EndOfData; break; } if (line.StartsWith(">")) { // Clear existing Property Name internalName = string.Empty; // See if we can find the property in our translation table foreach (var property in _propertyTypes) { if (line.Equals(property.ExternalName)) { isFormula = property.IsFormula; internalName = property.InternalName; break; } } } else { // Property Data if (!string.IsNullOrEmpty(internalName)) { if (isFormula) { var formula = new TextualProperty(); formula.FullType = internalName; formula.Value = line; _molecule.Formulas.Add(formula); } else { var name = new TextualProperty(); name.FullType = internalName; name.Value = line; _molecule.Names.Add(name); } } } } else { internalName = string.Empty; } } } catch (System.Exception ex) { Debug.WriteLine(ex.Message); result = SdfState.Error; } return(result); }
public Model Import(object data) { Model model = null; if (data != null) { string dataAsString = (string)data; if (!dataAsString.Contains("v3000") && !dataAsString.Contains("V3000")) { model = new Model(); LineNumber = 0; // Convert incoming string to a stream MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(dataAsString); writer.Flush(); stream.Position = 0; StreamReader sr = new StreamReader(stream); Molecule molecule = null; SdfState state = SdfState.Null; string message = null; while (!sr.EndOfStream) { switch (state) { case SdfState.Null: case SdfState.EndOfData: molecule = new Molecule(); CtabProcessor pct = new CtabProcessor(); state = pct.ImportFromStream(sr, molecule, out message); if (state == SdfState.Error) { model.GeneralErrors.Add(message); } //Ensure we add the molecule after it's populated model.Molecules.Add(molecule); if (model.Molecules.Count >= 16) { model.GeneralErrors.Add("This file has greater than 16 structures!"); sr.ReadToEnd(); } break; case SdfState.EndOfCtab: DataProcessor dp = new DataProcessor(_propertyTypes); state = dp.ImportFromStream(sr, molecule, out message); break; case SdfState.Error: // Swallow rest of stream sr.ReadToEnd(); break; case SdfState.Unsupported: // Swallow rest of stream sr.ReadToEnd(); break; } } // Can't use RebuildMolecules() as it trashes the formulae and labels //model.RebuildMolecules(); model.RefreshMolecules(); } } return(model); }
public Model Import(object data) { Model model = null; if (data != null) { string dataAsString = (string)data; if (!dataAsString.Contains("v3000") && !dataAsString.Contains("V3000")) { model = new Model(); LineNumber = 0; // Convert incoming string to a stream MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(dataAsString); writer.Flush(); stream.Position = 0; StreamReader sr = new StreamReader(stream); Molecule molecule = null; SdfState state = SdfState.Null; string message = null; while (!sr.EndOfStream) { switch (state) { case SdfState.Null: case SdfState.EndOfData: molecule = new Molecule(); CtabProcessor pct = new CtabProcessor(); state = pct.ImportFromStream(sr, molecule, out message); if (state == SdfState.Error) { model.GeneralErrors.Add(message); } Molecule copy = molecule.Copy(); copy.SplitIntoChildren(); // If copy now contains (child) molecules, replace original if (copy.Molecules.Count > 1) { molecule = copy; } //Ensure we add the molecule after it's populated model.AddMolecule(molecule); molecule.Parent = model; if (model.Molecules.Count >= 16) { model.GeneralErrors.Add("This file has greater than 16 structures!"); sr.ReadToEnd(); } break; case SdfState.EndOfCtab: DataProcessor dp = new DataProcessor(_propertyTypes); state = dp.ImportFromStream(sr, molecule, out message); break; case SdfState.Error: // Swallow rest of stream sr.ReadToEnd(); break; case SdfState.Unsupported: // Swallow rest of stream sr.ReadToEnd(); break; } } model.Relabel(true); model.Refresh(); } } return(model); }
public Model Import(object data) { Model model = null; if (data != null) { string dataAsString = (string)data; if (!dataAsString.Contains("v3000") && !dataAsString.Contains("V3000")) { model = new Model(); // Convert incoming string to a stream MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(dataAsString); writer.Flush(); stream.Position = 0; StreamReader sr = new StreamReader(stream); Molecule molecule = null; SdfState state = SdfState.Null; string message = null; while (!sr.EndOfStream) { switch (state) { case SdfState.Null: case SdfState.EndOfData: molecule = new Molecule(); //NOTE: do NOT add an empty molecule to the model. Add it AFTER it's been populated //model.Molecules.Add(molecule); CtabProcessor pct = new CtabProcessor(); state = pct.ImportFromStream(sr, molecule, out message); //THIS is where you should add the molecule! model.Molecules.Add(molecule); break; case SdfState.EndOfCtab: DataProcessor dp = new DataProcessor(_propertyTypes); state = dp.ImportFromStream(sr, molecule, out message); break; case SdfState.Error: // Swallow rest of stream string dumpOnError = sr.ReadToEnd(); break; case SdfState.Unsupported: // Swallow rest of stream string dumponUnsupported = sr.ReadToEnd(); break; } } // Can't use RebuildMolecules() as it trashes the formulae and labels //model.RebuildMolecules(); model.RefreshMolecules(); } } return(model); }