Example #1
0
        private Point[] GetLinkPoints(BackPlaneLink link, double linkYoffSetScale)
        {
            PlaneVpx  vev1 = PlaneVpxArray[link.FirstEndId];
            PlaneVpx  vev2 = PlaneVpxArray[link.SecondEndId];
            Rectangle r1;
            Rectangle r2;

            switch (link.LinkType)
            {
            case LinkType.EtherNet:
                r1 = vev1._infoAreaRects[0];
                r2 = vev2._infoAreaRects[0];
                break;

            case LinkType.RapidIO:
                r1 = vev1._infoAreaRects[1];
                r2 = vev2._infoAreaRects[1];
                break;

            case LinkType.GTX:
                r1 = vev1._infoAreaRects[2];
                r2 = vev2._infoAreaRects[2];
                break;

            default:    //LVDS
                r1 = vev1._infoAreaRects[3];
                r2 = vev2._infoAreaRects[3];
                break;
            }
            Point p1 = new Point(r1.Location.X + r1.Size.Width / 2, (int)(r1.Location.Y + r1.Size.Height - linkYoffSetScale * r1.Size.Height));
            Point p2 = new Point(r2.Location.X + r2.Size.Width / 2, p1.Y);

            return(new Point[] { p1, p2 });
        }
Example #2
0
        /// <summary>
        /// 判断一条Link的两端是否有效地连接了板卡的相关位置;
        /// </summary>
        /// <param name="link"></param>
        /// <returns></returns>
        private bool IsValidLine(BackPlaneLink link)
        {
            //排除无效的槽位
            if (!(_container.IsContainBoard(link.FirstEndId) && _container.IsContainBoard(link.SecondEndId)))
            {
                return(false);
            }

            //获取Link的端点1连接的板卡名字
            if (!_bpView._bp.IsConnetctAreaSlot(link.FirstEndId))
            {
                Board end1Board = ModelFactory <Board> .CreateByName(_container.BoardNameDir[link.FirstEndId]);

                if (!end1Board.IsLinkValidConnected(link, 1))
                {
                    return(false);
                }
            }

            //获取Link的端点2连接的板卡名字
            if (!_bpView._bp.IsConnetctAreaSlot(link.FirstEndId))
            {
                Board end2Board = ModelFactory <Board> .CreateByName(_container.BoardNameDir[link.SecondEndId]);

                if (!end2Board.IsLinkValidConnected(link, 2))
                {
                    return(false);
                }
            }
            return(true);
        }
Example #3
0
        private void Init()
        {
            //初始化背板画图对象
            var bp = ModelFactory <BackPlane> .CreateByName(_container.BackPlaneName);

            _boardViews = new PlaneVpx[bp.SlotsNum];
            _bpView     = new BackPlaneViewModel(bp, base._rect);
            _boardRects = _bpView.SlotRects;

            //初始化_boardViews
            foreach (var pair in _container.BoardNameDir)
            {
                var rect = _boardRects[pair.Key];
                if (_container.IsContainBoard(pair.Value))
                {
                    _boardViews[pair.Key] = new BoardVpx(rect, pair.Value);
                }
                else
                {
                    _boardViews[pair.Key] = new EmptySlotVpx(rect, pair.Value);
                }
            }

            //分配连接
            _links = new Dictionary <ContainerLink, Point[]>();
            foreach (var linkPair in _bpView.LinkDir)
            {
                BackPlaneLink link = linkPair.Key;
                _links.Add(new ContainerLink(link, IsValidLine(link)), linkPair.Value);
            }
        }
Example #4
0
        /// <summary>
        /// 判断一条底板连接的Link是否有效地连接到了板子的VPX的有效位置及区域类型
        /// </summary>
        /// <param name="bLink"></param>
        /// <param name="endPosition">需判断的Link连接的端点位置:1,2</param>
        /// <returns></returns>
        public bool IsLinkValidConnected(BackPlaneLink bLink, int endPosition)
        {
            int linkPostion = ((endPosition == 1) ? bLink.FirstEndPostion : bLink.SecondEndPostion);
            var validLinks  = from link in LinkList
                              where link.LinkType == bLink.LinkType &&                                                  //类型相同
                              ((link.FirstEndType == EndType.VPX && link.FirstEndPositionList.Contains(linkPostion)) ||//第1端为vpx且包含相关位置;
                               (link.SecondEndType == EndType.VPX && link.SecondEndPositionList.Contains(linkPostion))) //第2端为vpx且包含相关位置;
                              select link;

            if (validLinks.ToList().Count == 0)
            {
                return(false);
            }
            return(true);
        }
Example #5
0
        public override void SaveXmlByName()
        {
            List <BackPlaneLink> savedLinks = new List <BackPlaneLink>(); //已经存入的连接
            string xmlPath = string.Format(@"{0}\{1}.xml", PathManager.GetBackPlanePath(), this.Name);

            //先判断一些文件是否存在
            if (!PathManager.CheckFile(xmlPath))
            {
                return;
            }
            //保存XML文件
            XDocument xd = new XDocument(
                new XElement("BackPlane",
                             new XAttribute("Name", this.Name),
                             new XAttribute("Type", this.Type),
                             new XAttribute("SlotsNum", this.SlotsNum),
                             new XElement("Links")
                             )
                );
            XElement rt    = xd.Element("BackPlane");
            XElement links = rt.Element("Links");

            foreach (var linkList in this.LinksArray)
            {
                if (linkList == null)
                {
                    continue;
                }
                foreach (var link in linkList)
                {
                    int equalNum = savedLinks.Where(lnk => BackPlaneLink.IsEqual(link, lnk)).Count();
                    if (equalNum == 0)//该条连接的等效连接没有被访问过
                    {
                        links.Add(new XElement("Link",
                                               new XAttribute("FirstEndId", link.FirstEndId.ToString()),
                                               new XAttribute("FirstEndPos", link.FirstEndPostion.ToString()),
                                               new XAttribute("SecondEndId", link.SecondEndId.ToString()),
                                               new XAttribute("SecondEndPos", link.SecondEndPostion.ToString()),
                                               new XAttribute("Type", link.LinkType.ToString())
                                               ));
                        savedLinks.Add(link);
                    }
                }
            }
            xd.Save(xmlPath);
        }
Example #6
0
        public override ModelBase CreateObjectByName(string objectName)
        {
            BackPlane backPlane;
            string    xmlPath = string.Format(@"{0}\{1}.xml", PathManager.GetBackPlanePath(), objectName);

            if (!File.Exists(xmlPath))
            {
                MessageBox.Show("CreateObject_BackPlane:没有该BackPlane对应的XML文件!");
                return(null);
            }

            XDocument xd = XDocument.Load(xmlPath);
            //根元素的Attribute
            XElement rt       = xd.Element("BackPlane");
            int      slotsNum = int.Parse(rt.Attribute("SlotsNum").Value);

            backPlane      = new BackPlane(slotsNum);
            backPlane.Name = rt.Attribute("Name").Value;
            backPlane.Type = rt.Attribute("Type").Value;

            //取links赋值到backPlane.linkDir
            XElement links = rt.Element("Links");

            for (int i = 0; i < backPlane.VirtualSlotsNum; i++)
            {
                List <BackPlaneLink> linksList = new List <BackPlaneLink>();
                //找到同一槽位的links,然后添加到list
                var slotLinks = from link in links.Elements()
                                where int.Parse(link.Attribute("FirstEndId").Value) == i
                                select link;
                foreach (var link in slotLinks)
                {
                    LinkType type = (LinkType)Enum.Parse(typeof(LinkType), link.Attribute("Type").Value);

                    var tempLink = new BackPlaneLink(i, int.Parse(link.Attribute("FirstEndPos").Value)
                                                     , int.Parse(link.Attribute("SecondEndId").Value), int.Parse(link.Attribute("SecondEndPos").Value), type);
                    linksList.Add(tempLink);
                }
                backPlane.LinksArray[i] = linksList;
            }
            return(backPlane);
        }