public static Element[] GetMolecularFormulaOrderingFor(ParticleFlags flags)
    {
        bool flag1 = (flags & ParticleFlags.MolecularFormula_1) > 0;
        bool flag2 = (flags & ParticleFlags.MolecularFormula_2) > 0;

        if (!flag1 & !flag2)
        {
            return(ordering_C_H_alphabetical);
        }
        if (!flag1 & flag2)
        {
            return(ordering_H_alphabetical_O);
        }
        if (!flag2)
        {
            return(ordering_electronegativity);
        }
        return(ordering_electronegativity_reversed);
    }
示例#2
0
 public static extern int MakePhase(int group, ParticleFlags flags);
        /// <summary>
        ///
        /// </summary>
        /// <param name="data"></param>
        /// <param name="pos"></param>
        private void FromBytes(byte[] data, int pos)
        {
            int i = pos;

            if (data.Length == 0)
            {
                return;
            }

            Serial = (uint)(data[i++] + (data[i++] << 8) +
                            (data[i++] << 16) + (data[i++] << 24));

            StartTick = (uint)(data[i++] + (data[i++] << 8) +
                               (data[i++] << 16) + (data[i++] << 24));

            SrcPattern = (SourcePattern)data[i++];

            SrcMaxAge = (data[i++] + (data[i++] << 8)) / 256.0f;

            // TODO: Unknown
            i += 2;

            SrcAngleBegin = (data[i++] / 100.0f) * (float)Math.PI;
            SrcAngleEnd   = (data[i++] / 100.0f) * (float)Math.PI;

            SrcBurstRate      = (data[i++] + (data[i++] << 8)) / 256.0f;
            SrcBurstRadius    = (data[i++] + (data[i++] << 8)) / 256.0f;
            SrcBurstSpeedMin  = (data[i++] + (data[i++] << 8)) / 256.0f;
            SrcBurstSpeedMax  = (data[i++] + (data[i++] << 8)) / 256.0f;
            SrcBurstPartCount = data[i++];

            SrcOmega   = new LLVector3();
            SrcOmega.X = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;
            SrcOmega.Y = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;
            SrcOmega.Z = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;

            SrcAccel   = new LLVector3();
            SrcAccel.X = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;
            SrcAccel.Y = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;
            SrcAccel.Z = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;

            SrcTexture   = new LLUUID(data, i);
            i           += 16;
            SrcTargetKey = new LLUUID(data, i);
            i           += 16;

            PartFlags = (ParticleFlags)(data[i++] + (data[i++] << 8));

            PartMaxAge = (data[i++] + (data[i++] << 8)) / 256.0f;

            // TODO: Unknown
            i += 2;

            PartStartRGBA = (uint)(data[i++] + (data[i++] << 8) +
                                   (data[i++] << 16) + (data[i++] << 24));

            PartEndRGBA = (uint)(data[i++] + (data[i++] << 8) +
                                 (data[i++] << 16) + (data[i++] << 24));

            PartStartScale   = new LLVector3();
            PartStartScale.X = data[i++] / 32.0f;
            PartStartScale.Y = data[i++] / 32.0f;

            PartEndScale   = new LLVector3();
            PartEndScale.X = data[i++] / 32.0f;
            PartEndScale.Y = data[i++] / 32.0f;
        }
    /// <summary>
    /// Take all new data from other particle. Id, charge and hashes are not taken
    /// </summary>
    /// <param name="source">particle to take data from</param>
    /// <param name="reorderings">temporary buffer</param>
    /// <returns>false if topology mismatch</returns>
    public bool TakeAbsentDataFrom(ParticleInfo source, List <int> reorderings, bool allowAutofix = false)
    {
        Init();

        // data copied only if not present in destination
        // id stays the same
        // hashes are not updated, should be recalculated by the caller

        if (string.IsNullOrEmpty(name))
        {
            name = source.name;
        }
        if (CID == 0)
        {
            CID = source.CID;
        }
        for (int i = 0; i < source.CASes.Count; i++)
        {
            if (!CASes.Contains(source.CASes[i]))
            {
                CASes.Add(source.CASes[i]);
            }
        }
        if ((flags & ParticleFlags.HasChemicalFormula) == 0)
        {
            chemicalFormula = source.chemicalFormula;
            flags          |= (source.flags & ParticleFlags.HasChemicalFormula);
        }

        flags |= (source.flags & ParticleFlags.HasSkeletalFormula);
        flags |= (source.flags & ParticleFlags.ShowInExplorer);
        flags |= (source.flags & ParticleFlags.ShowInConstructor);
        flags |= (source.flags & ParticleFlags.ForceIncludeInBuild);

        bool success        = true;
        var  structureFlags = ParticleFlags.Has3D | ParticleFlags.Has2D;

        if ((flags & structureFlags) != structureFlags && // there is something missing
            (source.flags & structureFlags) > 0)        // there is something to copy
        {
            var sAtoms = source.data.atoms;
            if ((flags & structureFlags) == 0)          // everything is missing
            {
                // just copy the whole data
                data.atoms = DeepCopy(sAtoms);
                data.bonds = DeepCopy(source.bonds);
                // copy some flags from source
                var flagsToCopy = ParticleFlags.HasParticleCharge | ParticleFlags.HasAtomCharges
                                  | ParticleFlags.Has2D | ParticleFlags.Has3D | ParticleFlags.HasTopology
                                  | ParticleFlags.HasRadicalAtoms;
                flags &= ~flagsToCopy;
                flags |= (source.flags & flagsToCopy);
            }
            else
            {
                var atoms = data.atoms;
                success = ParticleComparer.AreEqual(this, source, true, reorderings);
                if (!success & allowAutofix)
                {
                    success = ParticleComparer.AreEqual(this, source, false, reorderings);
                }
                if (success)
                {
                    if ((flags & ParticleFlags.Has2D) == 0
                        & (source.flags & ParticleFlags.Has2D) > 0)
                    {
                        // we should take 2d from source, but keep our 3d
                        for (int i = atoms.Count - 1; i >= 0; i--)
                        {
                            atoms[i].flatPosition = sAtoms[reorderings[i]].flatPosition;
                        }
                        flags |= ParticleFlags.Has2D | ParticleFlags.HasTopology;
                    }
                    else if ((flags & ParticleFlags.Has3D) == 0
                             & (source.flags & ParticleFlags.Has3D) > 0)
                    {
                        // we should take 3d from source, but keep our 2d
                        for (int i = atoms.Count - 1; i >= 0; i--)
                        {
                            atoms[i].position = sAtoms[reorderings[i]].position;
                        }
                        flags |= ParticleFlags.Has3D | ParticleFlags.HasTopology;
                    }
                    // take charges
                    if ((source.flags & ParticleFlags.HasAtomCharges) > 0)
                    {
                        flags |= (source.flags & (ParticleFlags.HasParticleCharge | ParticleFlags.HasAtomCharges));
                        for (int i = atoms.Count - 1; i >= 0; i--)
                        {
                            if (atoms[i].atomCharge == 0)
                            {
                                atoms[i].atomCharge = sAtoms[reorderings[i]].atomCharge;
                            }
                        }
                    }
                    // take radicals
                    if ((source.flags & ParticleFlags.HasRadicalAtoms) > 0)
                    {
                        flags |= (source.flags & ParticleFlags.HasRadicalAtoms);
                        for (int i = atoms.Count - 1; i >= 0; i--)
                        {
                            if (atoms[i].radical == 0)
                            {
                                atoms[i].radical = sAtoms[reorderings[i]].radical;
                            }
                        }
                    }
                }
            }
        }

        if (string.IsNullOrEmpty(primaryName))
        {
            primaryName = source.primaryName;
        }

        var sSynonyms = source.iupacs;

        for (int i = 0; i < sSynonyms.Count; i++)
        {
            var syn = sSynonyms[i];
            if (syn.Equals(primaryName, StringComparison.Ordinal))
            {
                continue;
            }
            if (iupacs.Contains(syn))
            {
                continue;
            }
            iupacs.Add(syn);
        }

        return(success);
    }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="data"></param>
        /// <param name="pos"></param>
        private void FromBytes(byte[] data, int pos)
        {
            int i = pos;

            if (data.Length == 0)
                return;

            Serial = (uint)(data[i++] + (data[i++] << 8) +
                    (data[i++] << 16) + (data[i++] << 24));

            StartTick = (uint)(data[i++] + (data[i++] << 8) +
                    (data[i++] << 16) + (data[i++] << 24));

            SrcPattern = (SourcePattern)data[i++];

            SrcMaxAge = (data[i++] + (data[i++] << 8)) / 256.0f;

            // TODO: Unknown
            i += 2;

            SrcAngleBegin = (data[i++] / 100.0f) * (float)Math.PI;
            SrcAngleEnd = (data[i++] / 100.0f) * (float)Math.PI;

            SrcBurstRate = (data[i++] + (data[i++] << 8)) / 256.0f;
            SrcBurstRadius = (data[i++] + (data[i++] << 8)) / 256.0f;
            SrcBurstSpeedMin = (data[i++] + (data[i++] << 8)) / 256.0f;
            SrcBurstSpeedMax = (data[i++] + (data[i++] << 8)) / 256.0f;
            SrcBurstPartCount = data[i++];

            SrcOmega = new LLVector3();
            SrcOmega.X = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;
            SrcOmega.Y = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;
            SrcOmega.Z = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;

            SrcAccel = new LLVector3();
            SrcAccel.X = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;
            SrcAccel.Y = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;
            SrcAccel.Z = (data[i++] + (data[i++] << 8)) / 128.0f - 256.0f;

            SrcTexture = new LLUUID(data, i);
            i += 16;
            SrcTargetKey = new LLUUID(data, i);
            i += 16;

            PartFlags = (ParticleFlags)(data[i++] + (data[i++] << 8));

            PartMaxAge = (data[i++] + (data[i++] << 8)) / 256.0f;

            // TODO: Unknown
            i += 2;

            PartStartRGBA = (uint)(data[i++] + (data[i++] << 8) +
                    (data[i++] << 16) + (data[i++] << 24));

            PartEndRGBA = (uint)(data[i++] + (data[i++] << 8) +
                    (data[i++] << 16) + (data[i++] << 24));

            PartStartScale = new LLVector3();
            PartStartScale.X = data[i++] / 32.0f;
            PartStartScale.Y = data[i++] / 32.0f;

            PartEndScale = new LLVector3();
            PartEndScale.X = data[i++] / 32.0f;
            PartEndScale.Y = data[i++] / 32.0f;
        }