示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }