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 }); }
/// <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); }
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); } }
/// <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); }
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); }
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); }