//判断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;
        }
Beispiel #5
0
 public ComponentViewModel(Models.Component cmp)
 {
     _component = cmp;
 }
Beispiel #6
0
 public ComponentViewModel(Models.Component cmp, Rectangle rect)
 {
     _component = cmp;
     Init(rect);
 }