d3js网络拓扑关系特效

d3js拓扑关系特效

<%= render partial: ‘bar‘ %>
<style>
.table td{
  text-align: center;
}
td .progress {
    margin-bottom: 0;
    width: 175px;
}
td .progress-text {
    position: absolute;
    width: 175px;
    text-align: center;
}
.tdwidth{width:175px;}
.progress {
    margin-bottom: 0;
    width: 175px;
}
.progress-text {
    position: absolute;
    width: 175px;
    text-align: center;
}
</style>

<head>
  <style type="text/css">
    body
    {
      height: 100%;
    }
  </style>
  <meta charset="utf-8">
  <title>D3 Page Template</title>
  <script type="text/javascript" src="d3/d3.js"></script>
</head>
<body>
  <% vts_size = @vts.size %>
  <% sts_size = @sts.size %>
  <% stvs_size = @stvs.size %>
  <% all_size = vts_size + sts_size + stvs_size %>
  <% v_and_s = Array.new(all_size ) %>
  <% for i in 0..sts_size-1 do %>
  <% v_and_s[i] = @sts[i] %>
  <% end %>
  <% for i in sts_size..sts_size+vts_size-1 do %>
  <% v_and_s[i] = @vts[i-sts_size] %>
  <% end %>
  <% for i in sts_size+vts_size..all_size do %>
  <% v_and_s[i] = @vts[i-sts_size-vts_size] %>
  <% end %>

  <svg width="200" height="100">
    <circle cx="12" cy="10" r="10"  fill="#FF3420"/>
    <circle cx="12" cy="35" r="10"  fill="#7FFF00"/>
    <rect x="2" y="50" width="20" height="20" style="fill:#1E90FF" />
    <text x="30" y="13" fill="black">switch</text>
    <text x="30" y="39" fill="black">virtual switch</text>
    <text x="30" y="64" fill="black">virtual machine</text>
  </svg>

  <script type="text/javascript" charset="utf-8">
    var w = 1200;
    var h = 600;
    var names = [];
    var sts_size = <%= sts_size %>;
    var vts_size = <%= vts_size %>;
    var stvs_size = <%= stvs_size %>
    var all_size = <%= all_size %>;
    var i = 0;
    var j = 0;
    var k = 0;
    var nodes = [];
    var edges = [];
    var sts1_array = new Array();
    var sts1_used = new Array();
    var all_array = new Array();
    for(i = 0; i < sts_size/2; ++i)
    {
      all_array[i] = new Array();
    }
    //把sts表导成一个二维数组sts1_array
    for(i = 0; i < sts_size; ++i)
    {
      sts1_array[i] = new Array();
      sts1_used[i] = 0;
    }
    i = 0;
    <% for i in 0..sts_size-1 do %>
      sts1_array[i][0] = "<%= @sts[i].switch_name %>";
      sts1_array[i][1] = "<%= @sts[i].port %>";
      sts1_array[i][2] = "<%= @sts[i].next_hop_name %>";
      ++i;
    <% end %>
    var kk = sts1_array[0];
    //把sts1_array搞成s的关系表放入all_array
    i = 0;
    j = 0;
    k = 0;
    for(i = 0; i < sts_size; ++i)
    {
      if(sts1_used[i] == 0)
      {
        var x1 = sts1_array[i];
        var x2id = 0;
        for(j = i+1; j < sts_size; ++j)
        {
          var x2 = sts1_array[j];
          x2id = j;
          if(x1[0] == x2[2] && x1[2] == x2[0])
          {
            sts1_used[i] = 1;
            sts1_used[j] = 1;
            break;
          }
        }
        all_array[k][0] = x1[0];
        all_array[k][1] = x1[0] + ":" + x1[1] + " to " + sts1_array[x2id][0] + ":" + sts1_array[x2id][1];
        all_array[k][2] = x1[2];
        ++k;
      }
    }
    //对all_array排序
    all_array.sort(function(a,b)
    {
      if(a[0] > b[0])return 1;
      else if(a[0] == b[0])return a[2]>b[2]?1:-1;
      else return -1;
    });
    //把s放入hashtables里
    var hashTable = new Object();
    var ids = [];
    var idnum = 0;
    for(i = 0; i < sts_size/2; ++i)
    {
      var x1 = all_array[i];
      if(x1[0] in hashTable){}
      else
      {
        hashTable[x1[0]] = idnum++;
	ids.push(x1[0]);
      }
      if(x1[2] in hashTable){continue;}
      else
      {
        hashTable[x1[2]] = idnum++;
	ids.push(x1[2]);
      }
    }
    //把vts表导成一个二维数组放入all_array
    for(i = sts_size/2; i < vts_size + sts_size/2; ++i)
    {
      all_array[i] = new Array();
    }
    <% for i in 0..vts_size-1 do %>
      all_array[k][0] = "<%= @vts[i].vm_name %>";
      all_array[k][2] = "<%= @vts[i].switch_name %>";
      all_array[k][1] = all_array[k][2] + ":<%= @vts[i].port %>   to   " + all_array[k][0];
      //把vm放入hashtables里
      if(all_array[k][0] in hashTable){}
      else
      {
        hashTable[all_array[k][0]] = idnum++;
        ids.push(all_array[k][0]);
      }
      ++k;
    <% end %>
    //把stvs表放入all_array
    for(i = vts_size + sts_size/2; i < vts_size + sts_size/2 + stvs_size; ++i)
    {
      all_array[i] = new Array();
    }
    var hashTable2 = new Object();
    <% for i in 0..stvs_size-1 do %>
      all_array[k][0] = "<%= @stvs[i].switch %>";
      all_array[k][1] = "<%= @stvs[i].type_s %>";
      hashTable2[all_array[k][0]] = all_array[k][1];
      ++k;
    <% end %>
    //生成nodes
    all_size = sts_size/2 + vts_size;
    for(i = 0;i < idnum - vts_size; ++i)
    {
      var node1 =
        {
	  "name": ids[i],
	  "type": "circle",
	  "switch_type": hashTable2[ids[i]]
	};
	nodes.push(node1);
    }
    for(i = idnum - vts_size;i < idnum; ++i)
    {
      var node1 =
        {
          "name": ids[i],
	  "type": "rect",
	  "switch_type": "rect"
	};
      nodes.push(node1);
    }
    //alert(nodes[1].name);
    //生成edges 关系都在all_array中
    for(i = 0 ; i < all_size; ++i)
    {
      var ss = hashTable[all_array[i][0]];
      var tt = hashTable[all_array[i][2]];
      var desc = all_array[i][1];
      var edges1 =
        {
	  "source": ss,
	  "target": tt,
	  "des": desc
	};
      edges.push(edges1);
    }
    //下面开始画图
    var color = d3.scale.category20();
    var svg = d3.select("body")
                .append("svg")
                .attr("width", w)
                .attr("height", h);
    var force2 = d3.layout.force()
                   .nodes(nodes)
                   .links(edges)
                   .size([w, h])
                   .linkDistance([130])
                   .charge([-2000])
                   .gravity(0.15);
    force2.start();
    var stroke_color = "black";
    var stroke_width = "0.5";
    var touch_stroke_color = "#9F5FBF";//紫色
    var touch_stroke_width = "1";
    var switch_color = "#FF3420"//红
    var vswitch_color = "#7FFF00";//绿
    var vm_color = "#1E90FF";//蓝
    //edges
    var edges2 = svg.selectAll("line")
                    .data(edges)
                    .enter()
                    .append("line")
                    .style("stroke", "#ccc")
                    .style("stroke-width", 2)
                    .call(force2.drag);
    //link
    var link2 = svg.selectAll("link");
    link2 = link2.data(edges);
    var linkEnter2 = link2.enter()
                          .append("g")
                          .attr("class","link")
                          .call(force2.drag);
    linkEnter2.append("text")
              .attr("dy", ".35em")
              .text(function(d){ return d.des; });
    //node
    var node2 = svg.selectAll("node");
    node2 = node2.data(nodes);
    var nodeEnter2 = node2.enter()
                          .append("g")
                          .attr("class", "node")
                          .call(force2.drag);
    nodeEnter2.append("circle")
              .attr("r", function(d)
                         {
                           if(d.type == "circle") return 10;
                           else return 0;
                         })
              .style("fill", function(d, i)
                             {
                               if(d.type == "circle")
                               {
                                 if(d.switch_type == "1") return switch_color; else if(d.switch_type == "2") return vswitch_color;}
                                 else if(d.type == "rect"){return vm_color;}
                             })
              .on("mouseover", function(x,i)  //鼠标移动到一个节点上时,将其及与其邻接的节点突出显示
                               {
                                 node2.style("stroke",function(d) { if(d.index == x.index)return touch_stroke_color; })
                                      .style("stroke-width", function(d) { if(d.index == x.index)return touch_stroke_width; });

                                 link2.style("stroke", function(d) { if(d.source.index == x.index || d.target.index == x.index) return touch_stroke_color; })
                                      .style("stroke-width", function(d) { if(d.source.index == x.index || d.target.index == x.index) return touch_stroke_width; });

                                 svg.selectAll("text")
                                    .style("fill",function(d) { if(d.index == x.index) return touch_stroke_color; })
                                    .style("fill",function(d) { if(d.source.index == x.index || d.target.index == x.index) return touch_stroke_color; });
                               })
              .on("mouseout", function()  //鼠标离开时还原
                              {
                                node2.style("stroke-width","0");
                                node2.style("stroke", stroke_color);
                                link2.style("stroke", stroke_color);
                                link2.style("stroke-width","0");
                                svg.selectAll("text").style("fill","black");
                              });

    nodeEnter2.append("rect")
              .attr("width",function(d)
	                    {
			     if(d.type == "rect") return 20;
			     else return 0;
                            })
              .attr("height",function(d)
                             {
                               if(d.type == "rect") return 20;
                               else return 0;
                             })
               .style("fill", function(d, i)
	                      {
                                if(d.type == "circle")
                                {
                                  if(d.switch_type == "1") return switch_color;
                                  else if(d.switch_type == "2") return vswitch_color;
                                }
                                else if(d.type == "rect")
                                {
                                  return vm_color;
                                }
                              })
              .on("mouseover", function(x,i)  //鼠标移动到一个节点上时,将其及与其邻接的节点突出显示
                               {
                                 node2.style("stroke",function(d) { if(d.index == x.index)return touch_stroke_color; })
                                      .style("stroke-width", function(d) { if(d.index == x.index)return touch_stroke_width; });

                                 link2.style("stroke", function(d) { if(d.source.index == x.index || d.target.index == x.index) return touch_stroke_color; })
                                      .style("stroke-width", function(d) { if(d.source.index == x.index || d.target.index == x.index) return touch_stroke_width; });

                                 svg.selectAll("text")
                                    .style("fill",function(d) { if(d.index == x.index) return touch_stroke_color; })
                                    .style("fill",function(d) { if(d.source.index == x.index || d.target.index == x.index) return touch_stroke_color; });
                               })
              .on("mouseout", function()  //鼠标离开时还原
                              {
                                node2.style("stroke-width","0");
                                node2.style("stroke", stroke_color);
                                link2.style("stroke", stroke_color);
                                link2.style("stroke-width","0");
                                svg.selectAll("text").style("fill","black");
                              });
	nodeEnter2.append("text")
	  .attr("dy", ".35em")
	  .text(function(d) { return d.name; })
	  .on("mouseover", function(x,i)  //鼠标移动到一个节点上时,将其及与其邻接的节点突出显示
                               {
                                 node2.style("stroke",function(d) { if(d.index == x.index)return touch_stroke_color; })
                                      .style("stroke-width", function(d) { if(d.index == x.index)return touch_stroke_width; });

                                 link2.style("stroke", function(d) { if(d.source.index == x.index || d.target.index == x.index) return touch_stroke_color; })
                                      .style("stroke-width", function(d) { if(d.source.index == x.index || d.target.index == x.index) return touch_stroke_width; });

                                 svg.selectAll("text")
                                    .style("fill",function(d) { if(d.index == x.index) return touch_stroke_color; })
                                    .style("fill",function(d) { if(d.source.index == x.index || d.target.index == x.index) return touch_stroke_color; });
                               })
              .on("mouseout", function()  //鼠标离开时还原
                              {
                                node2.style("stroke-width","0");
                                node2.style("stroke", stroke_color);
                                link2.style("stroke", stroke_color);
                                link2.style("stroke-width","0");
                                svg.selectAll("text").style("fill","black");
                              });

    force2.on("tick", function()
                      {
                        edges2.attr("x1", function(d) { return d.source.x; })
                              .attr("y1", function(d) { return d.source.y; })
                              .attr("x2", function(d) { return d.target.x; })
                              .attr("y2", function(d) { return d.target.y; });
                        link2.attr("transform", function(d) { return "translate(" + (d.source.x+d.target.x)/2 + "," + (d.source.y+d.target.y)/2 + ")"; });
                        node2.attr("transform", function(d)
                                                {
                                                  if(d.type == "circle") return "translate(" + d.x + "," + d.y + ")";
                                                  else
                                                  {
                                                    var dx = parseFloat(d.x) - 10;
                                                    var dy = parseFloat(d.y) - 10;
                                                    return "translate(" + dx + "," + dy + ")";
                                                  }
                                                });
                      });
  </script>
</body>

  

时间: 2024-12-20 16:38:07

d3js网络拓扑关系特效的相关文章

深入理解VMware虚拟网络

这篇文章是在毕业后接触vmare虚拟机中的网络部分的启蒙文章,相当值得研读,让我认识到了看不见的还有很多,知道的真的太少.如果能同过这篇文章 理解vmware的网络构成原理,再理解vmare vsphere 架构中的网络时候会有很大的帮助.甚至会对帮助理解VMware很多的模块有帮助:如VMotion ,  HA 等等 =========================================================== VMware Workstation是一款非常不错的虚拟机

理解VMware虚拟网络

简述:VMware虚拟网络概述.实现虚拟网络上网 Part0 子网掩码.DHCP.NAT,这些点请自行百度,百度百科讲的很清晰. Part1 转载:本文出自 "王春海的博客" 博客http://wangchunhai.blog.51cto.com/225186/381225 注:在转载文章上对于每一种网络都增加了例子 3.1 VMware虚拟网络概述 VMware Workstation(或VMware Server)安装在物理计算机,这台计算机称作"主机",假设这

转-深入理解VMware虚拟网络

原文出处:http://wangchunhai.blog.51cto.com/225186/381225 VMware Workstation是一款非常不错的虚拟机软件,许多爱好者用VMware Workstation设计多种实现环境做测试.VMware Workstation的虚拟网络部分,功能非常的强大,但对于初学者来说,稍显复杂.基于此,本文将深入介绍VMware的虚拟网络,让读者深刻理解VMware虚拟网络之间的关系,从而可以设计多种复杂的广域网.局域网的实验环境,满足读者的实验需求.由

物联仓储系统ZigBee组网原理

在嵌入式项目物联仓储系统中,使用cortexM0模拟仓库,cortex-A9模拟服务器,两块开发板之间使用ZigBee技术实现数据接收和发送,本文就介绍一下ZigBee组网的原理和相关步骤. 1.组网概述 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网. ZigBee网络中的节点主要包含三个:终端节点.路由器节点.PAN协调器节点 节点功能: 协调器节点:ZigBee协调器是网络各节点信息的汇聚点

Nagios和商业开源网管软件SugarNMS的功能介绍和区别

Nagios简介 Nagios是一个监视系统运行状态和网络信息的监视系统.Nagios能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等.Nagios可运行在Linux/Unix平台之上,同时提供一个可选的基于浏览器的WEB界面以方便系统管理人员查看网络状态,各种系统问题,以及日志等等.Nagios通常由一个主程序(Nagios).一个插件程序(Nagios-plugins)和四个可选的ADDON(NRPE.NSCA.NSClient++和NDOUtils)组成.Nagios的监控工作

OpenNMS与智和网管平台开发性能评估

随着网络系统结构的日益庞大复杂,运维人员有必要使用一套网络管理系统来方便快捷的管理好网络.为了更好的管理各种设备,便于对网络中的故障进行排查,公司需要一款满足需求的网管软件.目前市面上的网管软件众多,这些软件经过适当的配置即可对通用设备进行管理.但这些通用的功能无法满足我们100%的需求,必须进行二次开发.出于公司所使用技术(Java).市场占用率和功能全面性,选择了两款提供两次开发的平台,OpenNMS与智和网管平台,通过对两款产品进行全方位的对比,选择出一款适合的网管软件,在此基础上进行整合

Zigbee组网原理详解

Zigbee组网原理详解 来源:互联网 作者:佚名2015年08月13日 15:57   [导读] 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网. 关键词:RFDFFDZigBee 1.组网概述 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网. 2. 网络初始化预备 Zigbee网络的建立是由网络

ZigBee组网原理

Zigbee组建一个完整的网络包含两个步骤:网络初始化和节点加入网络.其中,节点加入网络可以分为通过协调器直接连接入网和通过已有父节点入网.下面来依次说明. 1. 网络初始化 ZigBee网络初始化只能是由网络协调器发起的,在组建网络前,需要判断本节点还没与其他网络连接.如果节点已经与其他网络连接时,此节点只能作为该网络的子节点.一个ZigBee网络中有且仅有一个ZigBee协调器,一旦网络建立好了,协调器就退化成路由器的角色,甚至是可以去掉协调器的,这一切得益于ZigBee网络的分布式特性.

OpenNMS和商业开源网管软件SugarNMS的比较

OpenNMS是网络管理系统Network Management System 的简称,是一种开源软件网络监视工具.可用来自动发现网络节点,监控网络服务,如HTTP,DNS,SSH等,当系统服务停止时,OpenNMS会依管理者所建立的规则寄出通知,告知运维人员网络障碍,事件汇整,自动执行对应动作,以及服务层级效能监控.?它可以支持SNMP网络管理协议,确保管理的扩展性,并且提供定制功能从而有利于管理范围的伸缩,流量和接点系统硬件使用情况需要在配置snmp. 目前,OpenNMS专注以下三个方面: