private void RemoveNodeButton_Click(object sender, EventArgs e)
        {
            ResetEventHandler();
            layersPaintedControl.state_PainterForm_MouseDown = LayersPaintedControl.State_PainterForm_MouseDown.Other;
            IPosition nearestPoint = new Position_Connected_Edit(0, 0);
            PositionSetEdit_ImplementByICollectionTemplate positionSetEdit_ImplementByICollectionTemplate = new PositionSetEdit_ImplementByICollectionTemplate();

            positionSetEdit_ImplementByICollectionTemplate.AddPosition(nearestPoint);
            Layer_PositionSet_Square layer = new Layer_PositionSet_Square(positionSetEdit_ImplementByICollectionTemplate);

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

            layer.VisibleInOptDlg = false;
            layer.Active          = true;
            layer.Name            = "Edited Figure";
            layer.SquareFrameDrawer.RectangleRadiusWidth = 8;
            layer.SquareFrameDrawer.LineWidth            = 1;
            layer.SquareFrameDrawer.LineColor            = Color.Red;
            layer.CenterPointCoordinate.Visible          = true;
            layer.CenterPointCoordinate.CoordinateFont   = new Font(layer.CenterPointCoordinate.CoordinateFont, FontStyle.Bold);

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

            MouseLBottonCheckRealPosition = delegate(IPosition position)
            {
                //((IPositionSetEdit)selectedPositionSetEdit).RemovePosition(nearestPoint);
                if (selectedPositionSetEdit is IPositionSet_ConnectedEdit && nearestPoint is IPosition_Connected)
                {
                    ((IPositionSet_ConnectedEdit)selectedPositionSetEdit).RemovePosition_Connected((IPosition_Connected)nearestPoint);
                }
                else
                if (selectedPositionSetEdit is IPositionSetEdit)
                {
                    ((IPositionSetEdit)selectedPositionSetEdit).RemovePosition(nearestPoint);
                }
                else
                {
                    throw new Exception(error_position);
                }
                selectedPositionSetLayer.SpringLayerRepresentationChangedEvent(selectedPositionSetLayer);
                m2m_NN.Remove(nearestPoint);
                layersPaintedControl.Invalidate();
            };
        }
 public void OnLayersPainterFormMouseMove(object sender, MouseEventArgs e)
 {
     if (MouseMovedRealPosition != null)
     {
         Position_Connected_Edit mouseChickedRealPosition = new Position_Connected_Edit();
         mouseChickedRealPosition.SetX(layersPaintedControl.ConvertMouseXToRealX(e.X));
         mouseChickedRealPosition.SetY(layersPaintedControl.ConvertMouseYToRealY(e.Y));
         if (MouseMovedRealPosition != null)
         {
             MouseMovedRealPosition(mouseChickedRealPosition);
         }
     }
 }
        public void testDictionary()
        {
            float value = 3.14f;
            IPosition_Connected p = new Position_Connected_Edit(2, 5);
            Tag l = new Tag(p, value), temp;

            dict.Add(p, l);
            dict.TryGetValue(p, out temp);
            Assert.AreEqual(l, temp);
            Console.WriteLine(l.GetHashCode());
            Console.WriteLine(temp.GetHashCode());
            temp.g *= 2;
            dict.TryGetValue(p, out temp);
            Assert.AreEqual(l, temp);
            Console.WriteLine(l.GetHashCode());
            Console.WriteLine(temp.GetHashCode());
        }
        private static IPositionSet_Connected ConvertDBFToPositionSet_Connected(string fileFolder)
        {
            Dictionary <string, Position_Connected_Edit> boundaryPointDictioinary = new Dictionary <string, Position_Connected_Edit>();

            List <IPosition_Connected> position_ConnectedList = new List <IPosition_Connected>();

            int a1 = Create(new StringBuilder("J50F001019\\"));
            int a2 = Create(new StringBuilder("J50F002020\\"));
            int a3 = Create(new StringBuilder("J50F001020\\"));
            int a4 = Create(new StringBuilder("J50F002019\\"));


            for (int currentDBFIndex = a1; currentDBFIndex <= a4; currentDBFIndex++)
            {
                SetCurrentIndex(currentDBFIndex);

                if ((OpenNodeDBF() == 1) && (OpenRoadDBF() == 1) && (OpenS_ATTDBF() == 1))
                {
                    int aTTRecordCount  = GetS_ATTRecordCount();
                    int roadRecordCount = GetRoadRecordCount();
                    int nodeRecordCount = GetNodeRecordCount();

                    Position_Connected_Edit[] aryPosition_Connected_Edit = new Position_Connected_Edit[nodeRecordCount];

                    for (int i = 0; i < nodeRecordCount; i++)
                    {
                        Position_Connected_Edit point = aryPosition_Connected_Edit[i];

                        //如果之前没有被创建
                        if (point == null)
                        {
                            //如果是边界点
                            if (ReadNodeBOUNDARY(i) != 0)
                            {
                                string str = ReadNodeX_COORD(i).ToString() + ReadNodeY_COORD(i).ToString();
                                //如果没添加进hash表
                                if (!boundaryPointDictioinary.TryGetValue(str, out point))
                                {
                                    point = new Position_Connected_Edit((float)ReadNodeX_COORD(i), (float)ReadNodeY_COORD(i));
                                    aryPosition_Connected_Edit[i] = point;
                                    boundaryPointDictioinary.Add(str, point);
                                }
                            }
                            else
                            {
                                double x = ReadNodeX_COORD(i);
                                double y = ReadNodeY_COORD(i);
                                point = new Position_Connected_Edit((float)x, (float)y);
                                aryPosition_Connected_Edit[i] = point;
                            }
                        }

                        int beginId = ReadNodeBEGS_ID(i);
                        int endId   = ReadNodeENDS_ID(i);

                        //if (endId < GetS_ATTRecordCount())
                        {
                            for (int j = beginId; j < endId; j++)
                            {
                                int roadId  = ReadAdjacentRoadID(j) - 1;
                                int FNodeId = ReadRoadFNODE(roadId) - 1;
                                int TNodeId = ReadRoadTNODE(roadId) - 1;

                                int aNodeId = (FNodeId == i) ? TNodeId : FNodeId;

                                bool isConnectToAdjacent             = false;
                                bool isAdjacentConnectToCurrentPoint = false;

                                if (FNodeId == i)
                                {
                                    if (ReadRoadDIRECTION(roadId) == 1)
                                    {
                                        isConnectToAdjacent             = true;
                                        isAdjacentConnectToCurrentPoint = true;
                                    }
                                    else if (ReadRoadDIRECTION(roadId) == 2)
                                    {
                                        isConnectToAdjacent = true;
                                    }
                                    else if (ReadRoadDIRECTION(roadId) == 3)
                                    {
                                        isAdjacentConnectToCurrentPoint = true;
                                    }
                                }
                                else if (TNodeId == i)
                                {
                                    if (ReadRoadDIRECTION(roadId) == 1)
                                    {
                                        isConnectToAdjacent             = true;
                                        isAdjacentConnectToCurrentPoint = true;
                                    }
                                    else if (ReadRoadDIRECTION(roadId) == 2)
                                    {
                                        isAdjacentConnectToCurrentPoint = true;
                                    }
                                    else if (ReadRoadDIRECTION(roadId) == 3)
                                    {
                                        isConnectToAdjacent = true;
                                    }
                                }

                                //如果存在当前点到邻接点的路径
                                if (isConnectToAdjacent || isAdjacentConnectToCurrentPoint)
                                {
                                    Position_Connected_Edit aNode = aryPosition_Connected_Edit[aNodeId];
                                    //如果该节点未被创建
                                    if (aNode == null)
                                    {
                                        //如果是边界点
                                        if (ReadNodeBOUNDARY(aNodeId) != 0)
                                        {
                                            string str = ReadNodeX_COORD(aNodeId).ToString() + ReadNodeY_COORD(aNodeId).ToString();
                                            //如果没添加进hash表
                                            if (!boundaryPointDictioinary.TryGetValue(str, out aNode))
                                            {
                                                aNode = new Position_Connected_Edit((float)ReadNodeX_COORD(aNodeId), (float)ReadNodeY_COORD(aNodeId));
                                                aryPosition_Connected_Edit[aNodeId] = aNode;
                                                boundaryPointDictioinary.Add(str, aNode);
                                            }
                                        }
                                        else
                                        {
                                            aNode = new Position_Connected_Edit((float)ReadNodeX_COORD(aNodeId), (float)ReadNodeY_COORD(aNodeId));
                                            aryPosition_Connected_Edit[aNodeId] = aNode;
                                        }
                                    }

                                    if (isConnectToAdjacent)
                                    {
                                        point.GetAdjacencyPositionSetEdit().AddAdjacency(aNode, (float)ReadRoadLENGTH(roadId));
                                    }
                                    if (isAdjacentConnectToCurrentPoint)
                                    {
                                        aNode.GetAdjacencyPositionSetEdit().AddAdjacency(point, (float)ReadRoadLENGTH(roadId));
                                    }
                                }
                            }
                        }

                        position_ConnectedList.Add(point);
                    }

                    CloseNodeDBF();
                    CloseRoadDBF();
                    CloseS_ATTDBF();
                }
            }

            IPositionSet_Connected positionSet_Connected = new PositionSet_Connected(position_ConnectedList);

            return(positionSet_Connected);
        }
        private void AddDoubleConnectionButton_Click(object sender, EventArgs e)
        {
            selectedNode = null;
            layersPaintedControl.state_PainterForm_MouseDown = LayersPaintedControl.State_PainterForm_MouseDown.onDaggle;
            ResetEventHandler();
            IPosition nearestPoint = new Position_Connected_Edit(0, 0);
            PositionSetEdit_ImplementByICollectionTemplate positionSetEdit_ImplementByICollectionTemplate = new PositionSetEdit_ImplementByICollectionTemplate();

            positionSetEdit_ImplementByICollectionTemplate.AddPosition(nearestPoint);
            Layer_PositionSet_Square layer = new Layer_PositionSet_Square(positionSetEdit_ImplementByICollectionTemplate);

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

            layer.VisibleInOptDlg = false;
            layer.Active          = true;
            layer.Name            = "Edited Figure";
            layer.SquareFrameDrawer.RectangleRadiusWidth = 8;
            layer.SquareFrameDrawer.LineWidth            = 1;
            layer.SquareFrameDrawer.LineColor            = Color.YellowGreen;
            layer.CenterPointCoordinate.Visible          = true;
            layer.CenterPointCoordinate.CoordinateFont   = new Font(layer.CenterPointCoordinate.CoordinateFont, FontStyle.Bold);

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

            MouseLBottonCheckRealPosition = delegate(IPosition position)
            {
                if (selectedNode == null)
                {
                    selectedNode = nearestPoint;
                    positionSetEdit_ImplementByICollectionTemplate.AddPosition(selectedNode);
                }
                else
                {
                    if (selectedNode != nearestPoint)
                    {
                        float x1 = selectedNode.GetX(), y1 = selectedNode.GetY(), x2 = nearestPoint.GetX(), y2 = nearestPoint.GetY();
                        float distance = (float)Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
                        if (selectedNode is IPosition_Connected_Edit)
                        {
                            ((IPosition_Connected_Edit)selectedNode).GetAdjacencyPositionSetEdit().AddAdjacency((IPosition_Connected)nearestPoint, distance);
                        }
                        else
                        {
                            throw new Exception(error_connection);
                        }
                        if (nearestPoint is IPosition_Connected_Edit)
                        {
                            ((IPosition_Connected_Edit)nearestPoint).GetAdjacencyPositionSetEdit().AddAdjacency((IPosition_Connected)selectedNode, distance);
                        }
                        else
                        {
                            throw new Exception(error_connection);
                        }
                        positionSetEdit_ImplementByICollectionTemplate.RemovePosition(selectedNode);
                        selectedNode = null;
                    }
                }

                selectedPositionSetLayer.SpringLayerRepresentationChangedEvent(selectedPositionSetLayer);
                layersPaintedControl.Invalidate();
            };
        }
        public IPosition GetMouseDoubleChickedNearestPositionInCurrentPositionSet(IPositionSet currentPositionSet)
        {
            M2M_NN m2m_NN = new M2M_NN();

            m2m_NN.PreProcess(currentPositionSet);

            layersPaintedControl.state_PainterForm_MouseDown = LayersPaintedControl.State_PainterForm_MouseDown.onDaggle;
            ResetEventHandler();
            //layersPainterForm.state_PainterForm_MouseDown = LayersPainterForm.State_PainterForm_MouseDown.Other;
            IPosition nearestPoint = new Position_Connected_Edit(0, 0);
            PositionSetEdit_ImplementByICollectionTemplate positionSetEdit_ImplementByICollectionTemplate = new PositionSetEdit_ImplementByICollectionTemplate();

            positionSetEdit_ImplementByICollectionTemplate.AddPosition(nearestPoint);
            Layer_PositionSet_Square layer = new Layer_PositionSet_Square(positionSetEdit_ImplementByICollectionTemplate);

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

            layer.VisibleInOptDlg = false;
            layer.Active          = true;
            layer.Name            = "Edited Figure";
            layer.SquareFrameDrawer.RectangleRadiusWidth = 8;
            layer.SquareFrameDrawer.LineWidth            = 1;
            layer.SquareFrameDrawer.LineColor            = Color.Red;
            layer.CenterPointCoordinate.Visible          = true;
            layer.CenterPointCoordinate.CoordinateFont   = new Font(layer.CenterPointCoordinate.CoordinateFont, FontStyle.Bold);


            System.Threading.Thread currentThread            = System.Threading.Thread.CurrentThread;
            Position_Connected_Edit mouseChickedRealPosition = null;
            IPosition nearestPositionInCurrentPositionSet    = null;

            this.BeginInvoke(new dShow(MessageBox.Show), new object[] { "please double chick on the screen." });

            MouseDoubleChickOnLayersPaintedControl += delegate(object sender, MouseEventArgs e)
            {
                mouseChickedRealPosition = new Position_Connected_Edit();
                mouseChickedRealPosition.SetX(layersPaintedControl.ConvertMouseXToRealX(e.X));
                mouseChickedRealPosition.SetY(layersPaintedControl.ConvertMouseYToRealY(e.Y));

                nearestPositionInCurrentPositionSet = m2m_NN.NearestNeighbor(mouseChickedRealPosition);

                if ((currentThread.ThreadState & System.Threading.ThreadState.Suspended) == System.Threading.ThreadState.Suspended)
                {
                    currentThread.Resume();
                }
            };

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

            currentThread.Suspend();
            MouseDoubleChickOnLayersPaintedControl = null;
            return(nearestPositionInCurrentPositionSet);
        }
        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();
            };
        }
Example #8
0
        public override void Draw(Graphics graphics)
        {
            if (Visible)
            {
                SetDrawerGraphic(graphics);

                List <IPosition_Connected> PartMiddlePointList = new List <IPosition_Connected>();

                List <PointF[]> PointArrayList = new List <PointF[]>();

                ILevel       level       = m2mStructure.GetLevel(levelSequence);
                IPart        rootPart    = m2mStructure.GetLevel(0).GetPartRefByPartIndex(0, 0);
                IPositionSet positionSet = m2mStructure.GetDescendentPositionSetByAncestorPart(levelSequence, rootPart, 0);

                Dictionary <IPosition, IPosition_Connected_Edit> partToPositionDictionary = new Dictionary <IPosition, IPosition_Connected_Edit>();

                positionSet.InitToTraverseSet();
                while (positionSet.NextPosition())
                {
                    Position_Connected_Edit PartDeputyPosition_Connected = new Position_Connected_Edit();
                    partToPositionDictionary.Add(positionSet.GetPosition(), PartDeputyPosition_Connected);
                }

                positionSet.InitToTraverseSet();

                while (positionSet.NextPosition())
                {
                    IPart_Connected currentPart = (IPart_Connected)positionSet.GetPosition();

                    IPositionSet bottomLevelPositionSet = m2mStructure.GetBottonLevelPositionSetByAncestorPart(currentPart, levelSequence);

                    IPosition tempPoint = PositionSetAttribute.GetGravityCenter(bottomLevelPositionSet);

                    IPosition_Connected_Edit PartDeputyPosition_Connected;
                    partToPositionDictionary.TryGetValue(positionSet.GetPosition(), out PartDeputyPosition_Connected);
                    PartDeputyPosition_Connected.SetX(tempPoint.GetX());
                    PartDeputyPosition_Connected.SetY(tempPoint.GetY());


                    currentPart.GetAdjacencyPositionSet().InitToTraverseSet();

                    while (currentPart.GetAdjacencyPositionSet().NextPosition())
                    {
                        IPosition_Connected_Edit adjDeputy;
                        partToPositionDictionary.TryGetValue(currentPart.GetAdjacencyPositionSet().GetPosition(), out adjDeputy);

                        PartDeputyPosition_Connected.GetAdjacencyPositionSetEdit().AddAdjacency(
                            adjDeputy, currentPart.GetAdjacencyPositionSet().GetDistanceToAdjacency());
                    }

                    PartMiddlePointList.Add(PartDeputyPosition_Connected);

                    IPositionSet ConvexHullPointSet = null;

                    if (bottomLevelPositionSet.GetNum() > 1)
                    {
                        ConvexHullPointSet = new QuickHull().ConvexHull(bottomLevelPositionSet);
                    }
                    else
                    {
                        ConvexHullPointSet = bottomLevelPositionSet;
                    }

                    PointF[] tempArray = new PointF[ConvexHullPointSet.GetNum()];

                    int sequence = 0;
                    ConvexHullPointSet.InitToTraverseSet();
                    while (ConvexHullPointSet.NextPosition())
                    {
                        tempArray[sequence].X = ConvertRealXToScreenX(ConvexHullPointSet.GetPosition().GetX());
                        tempArray[sequence].Y = ConvertRealYToScreenY(ConvexHullPointSet.GetPosition().GetY());
                        sequence++;
                    }

                    PointArrayList.Add(tempArray);
                }

                Pen   pen   = new Pen(partColor, partBorderWidth);
                Brush brush = new SolidBrush(Color.FromArgb(alpha, partColor));

                foreach (PointF[] pointArray in PointArrayList)
                {
                    if (pointArray.Length >= 2)
                    {
                        graphics.DrawPolygon(pen, pointArray);
                        graphics.FillPolygon(brush, pointArray);
                    }
                }

                this.positionSet = new PositionSet_ConnectedEdit(PartMiddlePointList);

                positionSetDrawerPump.ResetPump();
                positionSetDrawerPump.DrawCoordinate(pointCoordinateDrawer);
                positionSetDrawerPump.DrawPoint(pointDrawer);
                positionSetDrawerPump.DrawConnection(connectionDrawer);
                positionSetDrawerPump.Run();
            }
        }