Exemplo n.º 1
0
        /// <summary>
        /// <pre>
        /// -C#N
        /// -[N+]#[C-]
        /// -C=[N+]=N
        /// -N=[N+]=N
        /// </pre>
        /// </summary>
        internal static bool IsColinear(IAtom atom, IEnumerable <IBond> bonds)
        {
            if (PeriodicTable.IsMetal(atom.AtomicNumber))
            {
                return(bonds.Count() == 2);
            }

            int numSgl = atom.ImplicitHydrogenCount ?? 0;
            int numDbl = 0;
            int numTpl = 0;
            int count  = 0;

            foreach (var bond in bonds)
            {
                ++count;
                switch (bond.Order.Numeric())
                {
                case 1:
                    numSgl++;
                    break;

                case 2:
                    numDbl++;
                    break;

                case 3:
                    numTpl++;
                    break;

                case 4:
                    return(true);

                default:
                    return(false);
                }
            }
            if (count != 2)
            {
                return(false);
            }

            switch (atom.AtomicNumber)
            {
            case 6:
            case 7:
            case 14:
            case 32:
                if (numTpl == 1 && numSgl == 1)
                {
                    return(true);
                }
                if (numDbl == 2 && numSgl == 0)
                {
                    return(true);
                }
                break;
            }

            return(false);
        }