Ejemplo n.º 1
0
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            // TODO: Get the object to display a visualizer for.
            //       Cast the result of objectProvider.GetObject()
            //       to the type of the object being visualized.
            IPositionSet data = (IPositionSet)objectProvider.GetObject();

            // TODO: Display your view of the object.
            //       Replace displayForm with your own custom Form or Control.

            //RandomPositionSet data = new RandomPositionSet(100, -1000, 1000);

            LayersExOptDlg Painter = new LayersExOptDlg();

            using (LayersPainterForm frmPainter = new LayersPainterForm(Painter))
            {
                //PainterDialog.DrawPositionSet(data);

                Layer lay = new Layer_PositionSet_Point(data);
                Painter.Add(lay);
                frmPainter.Show();
                frmPainter.Refresh();

                frmPainter.Visible = false;

                //displayForm.Text = data.ToString();
                windowService.ShowDialog(frmPainter);
            }
        }
 private void OnGetPositionSetToGetConvexHull(IPositionSet positionSet)
 {
     lock (layers)
     {
         Layer_PositionSet_Point layer = new Layer_PositionSet_Point(new PositionSet_Cloned(positionSet));
         layer.MainColor         = Settings.Default.PositionSetToGetConvexHullColor;
         layer.Point.PointRadius = 1;
         layers.Add(layer);
     }
     flowControlerForm.BeginInvoke(Update);
     flowControlerForm.SuspendAndRecordWorkerThread();
 }
        private void OnGetPositionSetOfComparedPoint(IPositionSet positionSet)
        {
            lock (layers)
            {
                Layer_PositionSet_Point layer = new Layer_PositionSet_Point(new PositionSet_Cloned(positionSet));
                layer.Point.PointRadius       = 2;
                layer.Point.IsDrawPointBorder = true;
                layer.MainColor = Color.FromArgb(0, 255, 0);
                layer.Name      = "PositionSetOfComparedPoint";
                layers.Add(layer);
            }

            flowControlerForm.BeginInvoke(Update);
            flowControlerForm.SuspendAndRecordWorkerThread();
        }
Ejemplo n.º 4
0
        private void OnGetChildPositionSetInSpecificLevelOfConvexHull(ILevel level, int levelSequence, IPositionSet positionSet)
        {
            lock (layers)
            {
                childPositionSetOfConvexHullLayer = new Layer_PositionSet_Point(new PositionSet_Cloned(positionSet));
                childPositionSetOfConvexHullLayer.SetPositionSetTransformByM2MLevel(level);
                childPositionSetOfConvexHullLayer.MainColor = Settings.Default.ChildPositionSetInSpecificLevelOfConvexHullColor;
                //layer.MainColor = GenerateColor.GetSimilarColor(GenerateColor.GetSimilarColor(GenerateColor.GetSimilarColor(aryMainColor[levelSequence])));
                childPositionSetOfConvexHullLayer.Point.PointRadius       = 2;
                childPositionSetOfConvexHullLayer.Point.IsDrawPointBorder = true;
                childPositionSetOfConvexHullLayer.Active = true;
                layers.Add(childPositionSetOfConvexHullLayer);
            }

            flowControlerForm.BeginInvoke(Update);
            flowControlerForm.SuspendAndRecordWorkerThread();
        }
        private void OnGetQueryPosition(IPosition position)
        {
            lock (layers)
            {
                IPositionSetEdit temp = new PositionSetEdit_ImplementByICollectionTemplate();
                temp.AddPosition(position);

                Layer_PositionSet_Point queryPositionLayer = new Layer_PositionSet_Point(temp);
                queryPositionLayer.Point.PointRadius       = 3;
                queryPositionLayer.Point.PointColor        = Color.IndianRed;
                queryPositionLayer.Point.IsDrawPointBorder = true;
                queryPositionLayer.Active = true;
                layers.Add(queryPositionLayer);
            }

            flowControlerForm.BeginInvoke(Update);
            flowControlerForm.SuspendAndRecordWorkerThread();
        }
Ejemplo n.º 6
0
        private void TestForViewer(object sender, EventArgs e)
        {
            painterDialog.Show();

            painterDialog.Reset();
            painterDialog.HoldOnMode();

            RandomPositionSet_InFixedDistribution randomPositionSet1 = new RandomPositionSet_InFixedDistribution
                                                                           (10000, distributionStyle.GaussianDistribution);

            new ConfiguratedByForm(randomPositionSet1);
            randomPositionSet1.Produce();

            RandomPositionSet_InFixedDistribution randomPositionSet2 = new RandomPositionSet_InFixedDistribution
                                                                           (10000, distributionStyle.LaplaceDistribution);

            new ConfiguratedByForm(randomPositionSet2);
            randomPositionSet2.Produce();

            M2MSCreater_ForGeneralM2MStruture m2m_Creater_ForGeneralM2MStruture = new M2MSCreater_ForGeneralM2MStruture();
            IM2MStructure m2mStructure = m2m_Creater_ForGeneralM2MStruture.CreateAutomatically(randomPositionSet2);

            m2mStructure.Preprocessing(randomPositionSet2);

            painterDialog.Clear();
            painterDialog.DrawPositionSet(randomPositionSet1);
            painterDialog.DrawPositionSet(randomPositionSet2);
            painterDialog.DrawM2MLevel(m2mStructure.GetLevel(m2mStructure.GetLevelNum() - 1));
            painterDialog.DrawM2MStructure(m2mStructure);
            Layer_PositionSet layer = new Layer_PositionSet_Point(GetRamSet2());

            layer.SetPositionSetTransformByM2MLevel(m2mStructure.GetLevel(m2mStructure.GetLevelNum() - 1));
            //painterDialog.Painter.Layers.Add(layer);
            painterDialog.Show();

            painterDialog.Clear();
            painterDialog.DrawPath(GetRamSet(1000, 800));
            painterDialog.DrawPositionSet(GetRamSet(500, 400));
            painterDialog.DrawConvexHull(GetRamSet2());
            painterDialog.DrawSquareFrame(GetRamSet(500, 400));
            painterDialog.Show();

            painterDialog.Reset();
        }
Ejemplo n.º 7
0
        private void OnGetLinePositionSetInSpecificLevel(ILevel level, int levelSequence, IPositionSet positionSet)
        {
            lock (layers)
            {
                if (linePartSetLayer == null)
                {
                    linePartSetLayer           = new Layer_M2MPartSetInSpecificLevel(level, positionSet);
                    linePartSetLayer.MainColor = Settings.Default.LinePositionSetInSpecificLevelColor;
                    linePartSetLayer.Alpha     = 50;
                    //linePartSetLayer.LineColor = Color.Red;
                    linePartSetLayer.Active = true;
                    layers.Add(linePartSetLayer);

                    positionSetSet = new PositionSetSet();

                    BottonLevelPositionSetLayer = new Layer_PositionSet_Point(positionSetSet);
                    BottonLevelPositionSetLayer.Point.IsDrawPointBorder = true;
                    BottonLevelPositionSetLayer.Point.PointRadius       = 2;
                    BottonLevelPositionSetLayer.Point.PointColor        = Settings.Default.BottonLevelPositionSetColor;
                    layers.Add(BottonLevelPositionSetLayer);
                }
                else
                {
                    linePartSetLayer.SpringLayerRepresentationChangedEvent(linePartSetLayer);
                }

                positionSetSet.Clear();
                positionSet.InitToTraverseSet();
                while (positionSet.NextPosition())
                {
                    IPart tempPart = level.GetPartRefByPartIndex((int)positionSet.GetPosition().GetX(), (int)positionSet.GetPosition().GetY());
                    if (tempPart != null)
                    {
                        positionSetSet.AddPositionSet(m2mStructure.GetBottonLevelPositionSetByAncestorPart((
                                                                                                               tempPart), levelSequence));
                    }
                }

                BottonLevelPositionSetLayer.SpringLayerRepresentationChangedEvent(BottonLevelPositionSetLayer);
            }

            flowControlerForm.BeginInvoke(Update);
            flowControlerForm.SuspendAndRecordWorkerThread();
        }
        private void OnCurrentNearestPointChanged(IPosition point)
        {
            lock (layers)
            {
                if (shrinkBoundPointSetLayer == null)
                {
                    shrinkBoundPointSet                              = new PositionSetEdit_ImplementByICollectionTemplate();
                    shrinkBoundPointSetLayer                         = new Layer_PositionSet_Point(shrinkBoundPointSet);
                    shrinkBoundPointSetLayer.Active                  = true;
                    shrinkBoundPointSetLayer.Point.PointRadius       = 3;
                    shrinkBoundPointSetLayer.Point.IsDrawPointBorder = true;
                    shrinkBoundPointSetLayer.Point.PointColor        = Color.Red;
                    layers.Add(shrinkBoundPointSetLayer);
                }

                shrinkBoundPointSet.AddPosition(point);
                shrinkBoundPointSetLayer.PositionSet = shrinkBoundPointSet;
            }

            flowControlerForm.BeginInvoke(Update);
            flowControlerForm.SuspendAndRecordWorkerThread();
        }
        private void OnGetComparedPoint(IPosition point)
        {
            lock (layers)
            {
                if (ComparedPointLayer == null)
                {
                    ComparedPointSet                           = new PositionSetEdit_ImplementByICollectionTemplate();
                    ComparedPointLayer                         = new Layer_PositionSet_Point(ComparedPointSet);
                    ComparedPointLayer.Active                  = true;
                    ComparedPointLayer.Point.PointRadius       = 2;
                    ComparedPointLayer.Point.IsDrawPointBorder = true;
                    ComparedPointLayer.Point.PointColor        = Color.Goldenrod;
                    layers.Add(ComparedPointLayer);
                }

                ComparedPointSet.AddPosition(point);
                ComparedPointLayer.PositionSet = ComparedPointSet;
            }

            flowControlerForm.BeginInvoke(Update);
            flowControlerForm.SuspendAndRecordWorkerThread();
        }
Ejemplo n.º 10
0
        private void ShowLine()
        {
            IWriteLineInGridEngine writeLineInGridEngine = new Line2Block();
            //IWriteLineInGridEngine writeLineInGridEngine = new Line2Block();

            IPositionSet line = writeLineInGridEngine.WriteLineInGrid(configurationForWriteLineInGridAlgorithm.GridWidth,
                                                                      configurationForWriteLineInGridAlgorithm.GridHeight,
                                                                      configurationForWriteLineInGridAlgorithm.StartPosition,
                                                                      configurationForWriteLineInGridAlgorithm.EndPosition);

            painterDialog.Clear();
            painterDialog.Layers.Add(new Layer_Grid(10, 10, configurationForWriteLineInGridAlgorithm.GridWidth,
                                                    configurationForWriteLineInGridAlgorithm.GridHeight, 0, 0));

            IPositionSetEdit startAndEnd = new PositionSetEdit_ImplementByICollectionTemplate();

            startAndEnd.AddPosition(configurationForWriteLineInGridAlgorithm.StartPosition);
            startAndEnd.AddPosition(configurationForWriteLineInGridAlgorithm.EndPosition);

            painterDialog.HoldOnMode();
            painterDialog.SetShowModeToForm();

            if (line != null)
            {
                Layer_PositionSet_Point layer = new Layer_PositionSet_Point(line);
                layer.Point.PointRadius = 2;
                layer.Point.PointColor  = Color.Blue;
                painterDialog.Layers.Add(layer);
            }

            Layer_PositionSet_Path layer2 = new Layer_PositionSet_Path((IPositionSet)startAndEnd);

            layer2.PathLine.LineWidth = 2;
            layer2.PathLine.LineColor = Color.Red;
            painterDialog.Layers.Add(layer2);

            painterDialog.Show();
        }
Ejemplo n.º 11
0
        protected void runDemo(IPositionSet set)
        {
            //以下代码必须在UI线程中调用,即不能在另开的线程中调用
            LayersExOptDlg       layers               = new LayersExOptDlg();
            LayersPainterForm    layersPainterForm    = new LayersPainterForm(layers);
            LayersPaintedControl layersPaintedControl = layersPainterForm.LayersPaintedControl;
            LayersEditedControl  layersEditedControl  = new LayersEditedControl();

            layersEditedControl.Dock = DockStyle.Top;
            layersEditedControl.LayersPaintedControl = layersPaintedControl;
            layersPainterForm.Controls.Add(layersEditedControl);
            FlowControlerForm flowControlerForm = new FlowControlerForm();

            layersPainterForm.Show();
            flowControlerForm.Show(layersPainterForm);

            //新建或外部传入待演示对象
            M2M_NN m2m_NN = new M2M_NN();
            M2M_CH m2m_CH = new M2M_CH();

            //打开一个Worker线程来进行算法流程的演示(否则会阻塞UI线程以至于演示不能进行)
            IAsyncResult result = new dDemoProcess(delegate
            {
                ////产生随机点集:
                //RandomPositionSet_InFixedDistribution randomPositionSet_InFixedDistribution = new RandomPositionSet_InFixedDistribution();
                //randomPositionSet_InFixedDistribution.PointNum = 100000;
                //randomPositionSet_InFixedDistribution.DistributionStyle = distributionStyle.ClusterGaussianDistribution;
                //new ConfiguratedByForm(randomPositionSet_InFixedDistribution);
                //randomPositionSet_InFixedDistribution.Produce();

                //编辑点集
                Layer_PositionSet layer;
                if (set is IPositionSet_Connected)
                {
                    layer = new Layer_PositionSet_Connected((IPositionSet_Connected)set);
                    ((Layer_PositionSet_Connected)layer).Point.PointColor        = Color.Yellow;
                    ((Layer_PositionSet_Connected)layer).Point.PointRadius       = 2;
                    ((Layer_PositionSet_Connected)layer).Point.IsDrawPointBorder = true;
                }
                else
                {
                    layer = new Layer_PositionSet_Point(set);
                    ((Layer_PositionSet_Point)layer).Point.PointColor        = Color.Yellow;
                    ((Layer_PositionSet_Point)layer).Point.PointRadius       = 2;
                    ((Layer_PositionSet_Point)layer).Point.IsDrawPointBorder = true;
                }
                layer.EditAble = true;
                layers.Add(layer);
                layersPainterForm.Invalidate();
                flowControlerForm.SuspendAndRecordWorkerThread();
                //layers.Remove(layer);

                ///////////////////////////////////////
                //GetRandomPositionFromPositionSetRectangle getRandomPositionFromPositionSetRectangle
                //= new GetRandomPositionFromPositionSetRectangle(randomPositionSet_InFixedDistribution);

                ////对m2m_NN算法进行演示:
                ////为对象的事件添加事件响应,以进行算法演示
                //AlgorithmDemo_M2M_NN algorithmDemo_M2M_NN = new AlgorithmDemo_M2M_NN(m2m_NN, layers, flowControlerForm, layersPaintedControl.Invalidate);

                ////以下代码与非演示状态一样。
                //m2m_NN.PreProcess(randomPositionSet_InFixedDistribution);
                //m2m_NN.NearestNeighbor(layersPaintedControl.GetMouseDoubleChickedRealPosition());
                //while (true)
                //{
                //    for (int i = layers.Count - 1; i >= 0; i--)
                //    {
                //        if ((layers[i].Name != "M2MStructure") && (layers[i].Name != "PositionSetOfComparedPoint"))
                //        {
                //            layers.Remove(layers[i]);
                //        }
                //    }

                //    m2m_NN.NearestNeighbor(getRandomPositionFromPositionSetRectangle.Get());
                //}

                ////结束演示(解除事件响应的绑定)
                //algorithmDemo_M2M_NN.EndDemo();
                ///////////////////////////////////////

                //对m2m_CH算法进行演示:
                //为对象的事件添加事件响应,以进行算法演示
                //AlgorithmDemo_M2M_CH algorithmDemo_M2M_CH = new AlgorithmDemo_M2M_CH(m2m_CH, layers, flowControlerForm, layersPaintedControl.Invalidate);
                //while (true)
                //{
                //    layers.Clear();
                //    //以下代码与非演示状态一样。
                //    m2m_CH.ConvexHull(randomPositionSet_InFixedDistribution.Produce());
                //}

                ////结束演示(解除事件响应的绑定)
                //algorithmDemo_M2M_CH.EndDemo();
            }).BeginInvoke(null, null);
        }
Ejemplo n.º 12
0
        private void pathFindingToolStripMenuItem_Click(object sender, EventArgs e)
        {
            IPositionSet_Connected positionSet_Connected = (IPositionSet_Connected)positionSetContainer.GetPositionSet();

            Dijkstra dijkstra = new Dijkstra();
            AStar    astar    = new AStar();
            M2M_PF   m2m_PF   = new M2M_PF();

            IM2MStructure m2mStructure = null;

            List <IPosition_Connected> m2mPath = null;
            List <IPosition_Connected> path    = null;

            //计算算法运行时间用
            //IPosition_Connected start = null;
            //IPosition_Connected end = null;
            ISearchPathEngine searchPathEngine1 = m2m_PF;
            ISearchPathEngine searchPathEngine2 = dijkstra;

            m2m_PF.GetM2MStructure             += delegate(IM2MStructure m2mS) { m2mStructure = m2mS; };
            m2m_PF.GetM2MStructureInPreprocess += delegate(IM2MStructure m2mS) { m2mStructure = m2mS; };
            List <ushort> timeStampList = new List <ushort>();

            m2m_PF.GetTimeStamp += delegate(ushort timeStamp) { timeStampList.Add(timeStamp); };

            searchPathEngine1.InitEngineForMap(positionSet_Connected);
            searchPathEngine2.InitEngineForMap(positionSet_Connected);

            //以下代码必须在UI线程中调用,即不能在另开的线程中调用
            LayersExOptDlg       layers               = new LayersExOptDlg();
            LayersPainterForm    layersPainterForm    = new LayersPainterForm(layers);
            LayersPaintedControl layersPaintedControl = layersPainterForm.LayersPaintedControl;
            LayersEditedControl  layersEditedControl  = new LayersEditedControl();

            layersEditedControl.Dock = DockStyle.Top;
            layersEditedControl.LayersPaintedControl = layersPaintedControl;
            layersPainterForm.Controls.Add(layersEditedControl);
            layersPainterForm.Show();

            //打开一个Worker线程来进行算法流程的演示(否则会阻塞UI线程以至于演示不能进行)
            IAsyncResult result = new dDemoProcess(delegate
            {
                Layer_PositionSet_Connected layer_PositionSet_Connected = new Layer_PositionSet_Connected(positionSet_Connected);
                layer_PositionSet_Connected.Point.PointColor            = Color.Yellow;
                layer_PositionSet_Connected.Connection.LineColor        = Color.Blue;
                layer_PositionSet_Connected.Connection.LineWidth        = 0.6f;
                layer_PositionSet_Connected.Point.PointRadius           = 1.2f;
                layers.Add(layer_PositionSet_Connected);
                layer_PositionSet_Connected.SpringLayerRepresentationChangedEvent(layer_PositionSet_Connected);

                for (int levelSequence = 1; levelSequence < m2mStructure.GetLevelNum(); levelSequence++)
                {
                    Layer_PartSet_Connected layer_PartSet_Connected = new Layer_PartSet_Connected(m2mStructure, levelSequence);
                    layer_PartSet_Connected.Visible = false;
                    layers.Add(layer_PartSet_Connected);
                }

                while (true)
                {
                    IPosition_Connected start = (IPosition_Connected)layersEditedControl.GetMouseDoubleChickedNearestPositionInCurrentPositionSet(positionSet_Connected);
                    PositionSet_ConnectedEdit startPointSet = new PositionSet_ConnectedEdit();
                    startPointSet.AddPosition_Connected(start);
                    Layer_PositionSet_Point layerStartPoint = new Layer_PositionSet_Point(startPointSet);
                    layerStartPoint.Active = true;
                    layerStartPoint.Point.IsDrawPointBorder = true;
                    layerStartPoint.Point.PointRadius       = 5;
                    layerStartPoint.Point.PointColor        = Color.PaleGreen;
                    layers.Add(layerStartPoint);
                    layerStartPoint.SpringLayerRepresentationChangedEvent(layerStartPoint);

                    IPosition_Connected end = (IPosition_Connected)layersEditedControl.GetMouseDoubleChickedNearestPositionInCurrentPositionSet(positionSet_Connected);
                    PositionSet_ConnectedEdit endPointSet = new PositionSet_ConnectedEdit();
                    endPointSet.AddPosition_Connected(end);
                    Layer_PositionSet_Point layerEndPoint = new Layer_PositionSet_Point(endPointSet);
                    layerEndPoint.Active = true;
                    layerEndPoint.Point.IsDrawPointBorder = true;
                    layerEndPoint.Point.PointRadius       = 5;
                    layerEndPoint.Point.PointColor        = Color.Cyan;
                    layers.Add(layerEndPoint);
                    layerEndPoint.SpringLayerRepresentationChangedEvent(layerEndPoint);

                    CountTimeTool.TimeCounter timeCounter = new CountTimeTool.TimeCounter();

                    searchPathEngine2.InitEngineForMap(positionSet_Connected);
                    double time2      = timeCounter.CountTimeForRepeatableMethod(delegate { searchPathEngine2.SearchPath(start, end); });
                    path              = searchPathEngine2.SearchPath(start, end);
                    float pathLength2 = ((Dijkstra)searchPathEngine2).GetPathLength();
                    Console.WriteLine("Dijkstra consume time: " + time2 + " path Length = " + pathLength2);

                    searchPathEngine1.InitEngineForMap(positionSet_Connected);

                    //清空timeStampList以记录寻径过程各层的timeStamp
                    double time1 = timeCounter.CountTimeForRepeatableMethod(delegate { searchPathEngine1.SearchPath(start, end); });

                    timeStampList.Clear();
                    m2mPath           = searchPathEngine1.SearchPath(start, end);
                    float pathLength1 = ((M2M_PF)searchPathEngine1).GetPathLength();

                    Console.WriteLine("M2M_PF   consume time: " + time1 + " path Length = " + pathLength1);
                    //searchPathEngine1.SearchPath(start, end);

                    if (searchPathEngine1 is M2M_PF && m2mStructure != null)
                    {
                        for (int levelSequence = 1; levelSequence < m2mStructure.GetLevelNum(); levelSequence++)
                        {
                            ILevel level             = m2mStructure.GetLevel(levelSequence);
                            IPart rootPart           = m2mStructure.GetLevel(0).GetPartRefByPartIndex(0, 0);
                            IPositionSet positionSet = m2mStructure.GetDescendentPositionSetByAncestorPart(levelSequence, rootPart, 0);

                            List <IPosition_Connected> position_ConnectedList = new List <IPosition_Connected>();
                            positionSet.InitToTraverseSet();
                            while (positionSet.NextPosition())
                            {
                                if (positionSet.GetPosition() is IPart_Multi)
                                {
                                    IPart_Multi partMulti = (IPart_Multi)positionSet.GetPosition();
                                    IEnumerable <IPart_Connected> part_ConnectedEnumerable = partMulti.GetSubPartSet();

                                    foreach (IPart_Connected part in part_ConnectedEnumerable)
                                    {
                                        IPosition_Connected tempPartConnected = (IPosition_Connected)part;
                                        if (((Tag_M2M_Part)tempPartConnected.GetAttachment()).isNeedToSearch == true)
                                        {
                                            if (timeStampList[levelSequence - 1] == ((Tag_M2M_Part)tempPartConnected.GetAttachment()).timeStamp)
                                            {
                                                position_ConnectedList.Add(tempPartConnected);
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    IPosition_Connected tempPartConnected = (IPosition_Connected)positionSet.GetPosition();
                                    if (((Tag_M2M_Part)tempPartConnected.GetAttachment()).isNeedToSearch == true)
                                    {
                                        if (timeStampList[levelSequence - 1] == ((Tag_M2M_Part)tempPartConnected.GetAttachment()).timeStamp)
                                        {
                                            position_ConnectedList.Add(tempPartConnected);
                                        }
                                    }
                                }
                            }

                            IPositionSet partSet = new PositionSet_Connected(position_ConnectedList);

                            Layer_M2MPartSetInSpecificLevel layer_M2MPartSetInSpecificLevel = new Layer_M2MPartSetInSpecificLevel(m2mStructure.GetLevel(levelSequence), partSet);
                            layer_M2MPartSetInSpecificLevel.Active = true;
                            layer_M2MPartSetInSpecificLevel.Alpha  = 100;
                            //layer_M2MPartSetInSpecificLevel.

                            layers.Add(layer_M2MPartSetInSpecificLevel);

                            //PositionSet_Connected partSet_Connected = new PositionSet_Connected(position_ConnectedList);

                            //Layer_PositionSet_Connected layer_PartSet_Connected = new Layer_PositionSet_Connected(partSet_Connected);
                            ////layer_PartSet_Connected.MainColor
                            ////layer_PartSet_Connected.Active = true;
                            //layer_PartSet_Connected.SetPositionSetTransformByM2MLevel(level);

                            //layers.Add(layer_PartSet_Connected);
                        }
                    }

                    if (path != null)
                    {
                        Layer_PositionSet_Path layer = new Layer_PositionSet_Path(new PositionSet_Connected(path));
                        layer.Active                      = true;
                        layer.PathLine.LineColor          = Color.Black;
                        layer.PathLine.LineWidth          = 2;
                        layer.PathPoint.PointRadius       = 2;
                        layer.PathPoint.IsDrawPointBorder = true;

                        //layer.EditAble = true;
                        //layer.Point.PointColor = Color.Yellow;
                        //layer.Point.PointRadius = 2;
                        //layer.Point.IsDrawPointBorder = true;
                        layers.Add(layer);
                        layer.SpringLayerRepresentationChangedEvent(layer);
                    }
                    else
                    {
                        this.BeginInvoke(new dShow(MessageBox.Show), new object[] { "There is no path between two node" });
                    }

                    if (m2mPath != null)
                    {
                        Layer_PositionSet_Path layer = new Layer_PositionSet_Path(new PositionSet_Connected(m2mPath));
                        layer.Active                      = true;
                        layer.PathLine.LineColor          = Color.Red;
                        layer.PathLine.LineWidth          = 2;
                        layer.PathPoint.PointRadius       = 2;
                        layer.PathPoint.IsDrawPointBorder = true;

                        //layer.EditAble = true;
                        //layer.Point.PointColor = Color.Yellow;
                        //layer.Point.PointRadius = 2;
                        //layer.Point.IsDrawPointBorder = true;
                        layers.Add(layer);
                        layer.SpringLayerRepresentationChangedEvent(layer);
                    }
                    else
                    {
                        this.BeginInvoke(new dShow(MessageBox.Show), new object[] { "There is no path between two node by M2M_PF" });
                    }
                }
            }).BeginInvoke(null, null);
        }
        private void AddNodeButton_Click(object sender, EventArgs e)
        {
            layersPaintedControl.state_PainterForm_MouseDown = LayersPaintedControl.State_PainterForm_MouseDown.Other;
            IPosition currentPoint = new Position_Connected_Edit(0, 0);
            PositionSetEdit_ImplementByICollectionTemplate positionSetEdit_ImplementByICollectionTemplate = new PositionSetEdit_ImplementByICollectionTemplate();

            positionSetEdit_ImplementByICollectionTemplate.AddPosition(currentPoint);
            Layer_PositionSet_Point layer = new Layer_PositionSet_Point(positionSetEdit_ImplementByICollectionTemplate);

            MouseMovedRealPosition = delegate(IPosition position)
            {
                positionSetEdit_ImplementByICollectionTemplate.RemovePosition(currentPoint);
                currentPoint = position;
                positionSetEdit_ImplementByICollectionTemplate.AddPosition(currentPoint);
                layer.SpringLayerRepresentationChangedEvent(layer);
                layersPaintedControl.Invalidate();
            };

            layer.VisibleInOptDlg                = false;
            layer.Active                         = true;
            layer.Name                           = "Edited Figure";
            layer.Point.IsDrawPointBorder        = true;
            layer.Point.PointColor               = Color.Red;
            layer.Point.PointRadius              = 3;
            layer.PointCoordinate.CoordinateFont = new Font(layer.PointCoordinate.CoordinateFont, FontStyle.Bold);
            layer.PointCoordinate.Visible        = true;

            if (currentLayer != null)
            {
                layers.Remove(currentLayer);
            }
            currentLayer = layer;
            layers.Add(layer);

            MouseLBottonCheckRealPosition = delegate(IPosition position)
            {
                //((IPositionSetEdit)selectedPositionSetEdit).AddPosition(position);
                if (selectedPositionSetEdit is IPositionSet_ConnectedEdit && position is IPosition_Connected)
                {
                    ((IPositionSet_ConnectedEdit)selectedPositionSetEdit).AddPosition_Connected((IPosition_Connected)position);
                }
                else
                if (selectedPositionSetEdit is IPositionSetEdit)
                {
                    ((IPositionSetEdit)selectedPositionSetEdit).AddPosition(position);
                }
                else
                {
                    throw new Exception(error_position);
                }

                selectedPositionSetLayer.SpringLayerRepresentationChangedEvent(selectedPositionSetLayer);
                if (m2m_NN.CanInsert(position))
                {
                    m2m_NN.Insert(position);
                }
                else
                {
                    m2m_NN.PreProcess(selectedPositionSetEdit);
                    selectedPositionSetLayer.SpringLayerMaxRectChangedEvent();
                }
                layersPaintedControl.Invalidate();
            };
        }