internal Cl3DModelPointIterator(Cl3DModel p_mManagedModel, Cl3DModelPoint p_pActualPoint)
 {
     m_mManagedModel = p_mManagedModel;
     m_pActualPoint = p_pActualPoint;
 }
        private void LoadInternalModelType(string p_sModelPath)
        {
            using (BinaryReader reader = new BinaryReader(File.OpenRead(p_sModelPath)))
            {
                string header = reader.ReadString();
                string[] splitedHeader = header.Split(',');
                string[] splitedFileVersion = splitedHeader[0].Split(' ');
                if(splitedFileVersion[0].Equals("FileVersion:"))
                    m_ModelVersion = UInt32.Parse(splitedFileVersion[1]);

                if (m_ModelVersion > m_iSupportedFileVersion)
                    throw new Exception("Unsupported file version: " + m_ModelVersion.ToString());

                string oldPath = reader.ReadString();
                m_sModelType = reader.ReadString();
                m_NextPointId = reader.ReadUInt32();
                m_uPointsCount = reader.ReadUInt32();

                if (m_ModelVersion == 4 || m_ModelVersion == 5)
                    m_sExpression = reader.ReadString();

                if (m_ModelVersion == 5)
                {
                    int Count = reader.ReadInt32();
                    for( int i=0; i< Count; i++)
                    {
                        m_ListOfPreviousProcessingAlgorithms.Add(reader.ReadString());
                    }
                }

                Dictionary<String, uint> SpecificPointsDictionarry = new Dictionary<String, uint>();

                int count = reader.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    if (m_ModelVersion == 0 || m_ModelVersion == 1)
                    {
                        int sp = reader.ReadInt32();
                        uint PointID = reader.ReadUInt32();
                        SpecificPointsDictionarry.Add(((eSpecificPoints)sp).ToString(), PointID);
                    }
                    else if (m_ModelVersion == 2 || m_ModelVersion == 3 || m_ModelVersion == 4 || m_ModelVersion == 5)
                    {
                        string sp = reader.ReadString();
                        uint PointID = reader.ReadUInt32();

                        if (!SpecificPointsDictionarry.ContainsKey(sp))
                            SpecificPointsDictionarry.Add(sp, PointID);
                        else
                        {
                            ClInformationSender.SendInformation("Cannot add specific label " + sp + " to a point number " + PointID + ", this label already exists", ClInformationSender.eInformationType.eDebugText);
                        }
                    }
                    else
                        throw new Exception("Unsupported file model version: " + m_ModelVersion.ToString());
                }

                Cl3DModelPoint previous = null;

                m_dSpecificPoints = new Dictionary<String,Cl3DModelPoint>();
                m_dPointsInTheModel = new Dictionary<uint,Cl3DModelPoint>();

                Dictionary<uint, KeyValuePair<Cl3DModel.Cl3DModelPointIterator, List<uint>>> Points = new Dictionary<uint, KeyValuePair<Cl3DModelPointIterator, List<uint>>>();
                for (int i = 0; i < m_uPointsCount; i++)
                {
                    List<uint> NeighborsList;
                    Cl3DModelPoint actual = Cl3DModelPoint.LoadPoint(reader, this, out NeighborsList);

                    Points.Add(actual.m_PointID, new KeyValuePair<Cl3DModelPointIterator, List<uint>>(actual.GetIterator(), NeighborsList));
                    m_dPointsInTheModel.Add(actual.m_PointID, actual);

                    if (previous == null)
                    {
                        m_pFirstPointInModel = actual;
                        previous = m_pFirstPointInModel;
                    }
                    else
                    {
                        previous.m_NextPoint = actual;
                        actual.m_PrevPoint = previous;
                        previous = actual;
                    }
                }

                foreach(KeyValuePair<uint, KeyValuePair<Cl3DModel.Cl3DModelPointIterator, List<uint>>> point in Points)
                {
                    Cl3DModel.Cl3DModelPointIterator Iter = point.Value.Key;
                    List<uint> IterList = point.Value.Value;
                    foreach (uint NeighborID in IterList)
                    {
                        KeyValuePair<Cl3DModel.Cl3DModelPointIterator, List<uint>> Neighboor;
                        if (!Points.TryGetValue(NeighborID, out Neighboor))
                            throw new Exception("Cannot get point fron the dicrionary");

                        Iter.AddNeighbor(Neighboor.Key);
                    }
                }

                foreach(KeyValuePair<String, uint> SpecPoint in SpecificPointsDictionarry)
                {
                    string SpecPointLabel = SpecPoint.Key;
                    uint SpecPointID = SpecPoint.Value;

                    Cl3DModelPoint pt = null;
                    if (m_dPointsInTheModel.TryGetValue(SpecPointID, out pt))
                        m_dSpecificPoints.Add(SpecPointLabel, pt);
                    else
                        throw new Exception("Cannot find point with ID: " + SpecPointID + " to assign label: " + SpecPointLabel);
                }

                reader.Close();
            }
            ClInformationSender.SendInformation("BinaryModel ver: " + m_ModelVersion.ToString(), ClInformationSender.eInformationType.eDebugText);
        }
 public Cl3DModelPointIterator(Cl3DModel p_mManagedModel)
 {
     m_mManagedModel = p_mManagedModel;
     m_pActualPoint = p_mManagedModel.m_pFirstPointInModel;
 }
        public Cl3DModelPointIterator RemovePointFromModel(Cl3DModelPointIterator p_pPointToRemoveFromModel)
        {
            if (m_pFirstPointInModel == null || p_pPointToRemoveFromModel == null || p_pPointToRemoveFromModel.m_pActualPoint == null)
                return null;

            foreach (KeyValuePair<string, Cl3DModelPoint> point in m_dSpecificPoints)
            {
                if (point.Value.m_PointID == p_pPointToRemoveFromModel.PointID)
                {
                    m_dSpecificPoints.Remove(point.Key);
                    break;
                }
            }

            if (m_pFirstPointInModel.m_PointID == p_pPointToRemoveFromModel.m_pActualPoint.m_PointID)
                m_pFirstPointInModel = m_pFirstPointInModel.m_NextPoint;

            List<Cl3DModelPointIterator> listOfNeighbors = p_pPointToRemoveFromModel.GetListOfNeighbors();
            foreach (Cl3DModelPointIterator neighbor in listOfNeighbors)
                neighbor.RemoveNeighbor(p_pPointToRemoveFromModel);

            if (p_pPointToRemoveFromModel.m_pActualPoint.m_NextPoint != null)
                p_pPointToRemoveFromModel.m_pActualPoint.m_NextPoint.m_PrevPoint = p_pPointToRemoveFromModel.m_pActualPoint.m_PrevPoint;
            if (p_pPointToRemoveFromModel.m_pActualPoint.m_PrevPoint != null)
                p_pPointToRemoveFromModel.m_pActualPoint.m_PrevPoint.m_NextPoint = p_pPointToRemoveFromModel.m_pActualPoint.m_NextPoint;

            m_dPointsInTheModel.Remove(p_pPointToRemoveFromModel.PointID);

            Cl3DModel Model = p_pPointToRemoveFromModel.m_mManagedModel;
            p_pPointToRemoveFromModel.m_mManagedModel = null;

            Cl3DModelPoint ActualPoint = p_pPointToRemoveFromModel.m_pActualPoint;
            p_pPointToRemoveFromModel.m_pActualPoint = null;

            m_uPointsCount--;

            return new Cl3DModelPointIterator(Model, ActualPoint.m_NextPoint);
        }
 public void ResetModel()
 {
     m_ModelVersion = 0;
     m_sModelPath = "Unknown";
     m_sModelType = "Unknown";
     m_bModelHasChanged = true;
     m_dSpecificPoints.Clear();
     while (m_pFirstPointInModel != null)
     {
         m_pFirstPointInModel.m_NeighborhoodsList.Clear();
         Cl3DModelPoint next = m_pFirstPointInModel.m_NextPoint;
         if (next != null)
             next.m_PrevPoint = null;
         m_pFirstPointInModel.m_NextPoint = null;
         m_pFirstPointInModel = next;
     }
 }
        public Cl3DModelPointIterator AddPointToModel(float p_fX, float p_fY, float p_fZ, uint p_PointID)
        {
            if (m_dPointsInTheModel.ContainsKey(p_PointID))
                throw new Exception("Such point with ID: " + p_PointID + " exists in the model");

            Cl3DModelPoint newPoint = new Cl3DModelPoint(p_fX, p_fY, p_fZ, this, p_PointID);

            m_dPointsInTheModel.Add(p_PointID, newPoint);

            if (m_pFirstPointInModel == null)
            {
                m_pFirstPointInModel = newPoint;
            }
            else
            {
                newPoint.m_NextPoint = m_pFirstPointInModel;
                m_pFirstPointInModel.m_PrevPoint = newPoint;
                m_pFirstPointInModel = newPoint;
            }

            if (m_NextPointId <= p_PointID)
                m_NextPointId = p_PointID + 1;

            m_uPointsCount++;
            return newPoint.GetIterator();
        }
            public static Cl3DModelPoint LoadPoint(BinaryReader reader, Cl3DModel p_pMy3DModel, out List<uint> p_NeighborsList)
            {
                uint PointID = reader.ReadUInt32();
                float X = reader.ReadSingle();
                float Y = reader.ReadSingle();
                float Z = reader.ReadSingle();
                int RangeX = reader.ReadInt32();
                int RangeY = reader.ReadInt32();
                bool AlreadyVisited = reader.ReadBoolean();
                int color = reader.ReadInt32();
                float U = 0;
                float V = 0;

                if (p_pMy3DModel.m_ModelVersion == 3 || p_pMy3DModel.m_ModelVersion == 4 || p_pMy3DModel.m_ModelVersion == 5)
                {
                    U = reader.ReadSingle();
                    V = reader.ReadSingle();
                }

                Cl3DModelPoint newPoint = new Cl3DModelPoint(X,Y,Z,p_pMy3DModel,PointID,RangeX,RangeY);
                newPoint.m_fU = U;
                newPoint.m_fV = V;
                newPoint.m_AlreadyVisited = AlreadyVisited;
                newPoint.m_Color = Color.FromArgb(color);

                p_NeighborsList = new List<uint>();
                int count = reader.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    p_NeighborsList.Add(reader.ReadUInt32());
                }
                count = reader.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    String SpecificPointType = "";
                    if (p_pMy3DModel.m_ModelVersion == 0)
                    {
                        int sp = reader.ReadInt32();
                        Cl3DModelPointIterator.eSpecificValues point = (Cl3DModelPointIterator.eSpecificValues)sp;
                        SpecificPointType = point.ToString();
                    }
                    else if (p_pMy3DModel.m_ModelVersion == 1 || p_pMy3DModel.m_ModelVersion == 2 || p_pMy3DModel.m_ModelVersion == 3 || p_pMy3DModel.m_ModelVersion == 4 || p_pMy3DModel.m_ModelVersion == 5)
                    {
                        SpecificPointType = reader.ReadString();
                    }
                    else
                        throw new Exception("Unsupported version of model: ver. " + p_pMy3DModel.m_ModelVersion.ToString());

                    double Value = reader.ReadDouble();
                    newPoint.m_dPointValues.Add(SpecificPointType, Value);
                }

                return newPoint;
            }
            public bool MoveToPrevious()
            {
                if (m_pActualPoint == null || m_pActualPoint.m_PrevPoint == null)
                    return false;

                m_pActualPoint = m_pActualPoint.m_PrevPoint;
                return true;
            }
            public bool MoveToPoint(uint p_uPointID)
            {
                if (m_pActualPoint == null)
                    return false;

                Cl3DModelPoint tmp;

                if (m_mManagedModel.m_dPointsInTheModel.TryGetValue(p_uPointID, out tmp))
                {
                    m_pActualPoint = tmp;
                    return true;
                }

                return false;
            }
            public bool MoveToNext()
            {
                if (m_pActualPoint == null)
                    return false;

                m_pActualPoint = m_pActualPoint.m_NextPoint;

                if (m_pActualPoint == null)
                    return false;
                else
                    return true;
            }