//判断cNode与cmp当中的各个构件的连接关系,是否gNode与selectedNode各个节点也满足 private bool LinesMatched(Models.Component cmp, ComponentNode cNode, Stack <DynamicNode> selectedNode, DynamicNode dNode) { for (int i = 0; i < cmp.NodeNum; i++) { var curCNode = cmp.CmpTopoNet.NodeArray[i];//当前的构件节点 if (curCNode == cNode) { break; //continue; } var curDNode = selectedNode.Reverse().ToList()[curCNode.NodeId]; //当前的动态节点 //GTX连接判断 var cGTXLine = cmp.CmpTopoNet.GTXLinks[cNode.NodeId, curCNode.NodeId]; var dGtxLine = _topoNet.GTXLinks[dNode.SNode.UrlId, curDNode.SNode.UrlId]; if (!LineMatched(cGTXLine, dGtxLine)) { return(false); } //LVDS连接判断 var cLVDSLine = cmp.CmpTopoNet.LVDSLinks[cNode.NodeId, curCNode.NodeId]; var dLVDSLine = _topoNet.LVDSLinks[dNode.SNode.UrlId, curDNode.SNode.UrlId]; if (!LineMatched(cLVDSLine, dLVDSLine)) { return(false); } } return(true); }
private void DFS_MatchNode(Models.Component cmp, Stack <DynamicNode> selectedNode, List <DynamicNode> usedtopo) { var sNodeArray = _topoNet.NodeArray; var cNodeArray = cmp.CmpTopoNet.NodeArray; int selectedNum = selectedNode.Count; if (selectedNum == cNodeArray.Length)//退出条件 { _appMatchedTopoList.Add(selectedNode.Reverse().ToList()); return; } var curCNode = cNodeArray[selectedNum]; foreach (var node in sNodeArray) { if (!usedtopo.Contains(node) && !selectedNode.Contains(node) && NodeMatched(curCNode, node)) { //判断当前node与selectedNode的连接关系,是否满足curCNode与已匹配的cNode节点的连接情况; if (LinesMatched(cmp, curCNode, selectedNode, node)) { selectedNode.Push(node); DFS_MatchNode(cmp, selectedNode, usedtopo); selectedNode.Pop(); } } } }
private void MatchOneApp(Models.Component cmp, List <DynamicNode> usedtopo) { var sNodeArray = _topoNet.NodeArray; //当前所包含的所有资源节点 var cNodeArray = cmp.CmpTopoNet.NodeArray; //需要匹配的应用节点集合 Stack <DynamicNode> selectedNode = new Stack <DynamicNode>(); //用一个堆栈来存储选择了的节点 _appMatchedTopoList = new List <List <DynamicNode> >(); //把已匹配的节点设置为空 var curCNode = cNodeArray[selectedNode.Count]; try { foreach (var node in sNodeArray) { //目标节点不在已经使用了的节点中,并且匹配成功 if (!usedtopo.Contains(node) && NodeMatched(curCNode, node)) { selectedNode.Push(node); //递归访问下一个 DFS_MatchNode(cmp, selectedNode, usedtopo); selectedNode.Pop(); } } } catch (Exception e) { MessageBox.Show("StaticTopo.MatchApp:" + e.Message); } }
void _yesBtn_Click(object sender, EventArgs e) { //检查信息准确性及完整性 //始化构件实体并记录到XML文件; var retComponent = new Models.Component(); retComponent.InitTopo(_nodeArray.Length); retComponent.Name = _typeTB.Text; for (int i = 0; i < retComponent.NodeNum; i++) { if (_nodeArray[i] != null) { //添加节点信息 retComponent.CmpTopoNet.SetNodeValue(i, new ComponentNode(i, _nodeArray[i])); //添加连接信息 var dgv = _dgvsOpt.DataGridViweList[i]; foreach (DataGridViewRow row in dgv.Rows) { var linkType = (LinkType)Enum.Parse(typeof(LinkType), row.Cells[_dgvColumnTitle_linkType].Value.ToString()); int endId1 = int.Parse(row.Cells[_dgvColumnTitle_end1CmpNum].Value.ToString()); int endId2 = int.Parse(row.Cells[_dgvColumnTitle_end2CmpNum].Value.ToString()); var linkLines = (LinkLanes)Enum.Parse(typeof(LinkLanes), row.Cells[_dgvColumnTitle_dataWidth].Value.ToString()); var curLine = new ComponentLine(linkType, endId1, endId2, linkLines); retComponent.CmpTopoNet.SetLinkValue(curLine); } } } retComponent.SaveXmlByName(); GenerateSourceFile(); this.DialogResult = DialogResult.Yes; }
public ComponentViewModel(Models.Component cmp) { _component = cmp; }
public ComponentViewModel(Models.Component cmp, Rectangle rect) { _component = cmp; Init(rect); }