被忽视的TWaver功能(1)
应客户需求写个Demo,Demo中包括一些经常使用的功能。包括解析JSON数据生成TWaver中的网元和连线。网元右下角带上不同标识的小图标,连线须要是二次曲线。弹出菜单和信息板。跟大家分享下。先上图让大家看看效果(大家在学习的同一时候,是否能发现这次Demo有所不同)


解析JSON数据生成TWaver中的网元和连线
以下是Demo中用到的JSON数据格式例子
1 |
var topo_data |
2 |
{"element": "node", "name": "网关", "id": "gateway1", "image": "group","icon": "icon_wall"}, |
3 |
{"element": "node", "name": "网关", "id": "gateway2", "image":"subnetwork", "icon": "icon_wall"}, |
4 |
{"element": "link", "from": "cloud", "to": "center1", "name":"包括关系"}, |
5 |
{"element": "link", "from": "gather2", "to": "firewall", "arrow": "11"} |
6 |
]; |
依据element推断创建何种对象,是网元还是连线;image设置网元图片的名称(这些图片都是事先须要注冊。假设使用TWaver内置的图片,则不须要。直接使用TWaver的图片注冊名称就可以。比如twaver.Defaults.IMAGE_GROUP),icon设置网元上的标识,arrow设置连线的箭头方向,以下上代码
1 |
function createElement(item){ |
2 |
var element; |
3 |
if(item.element'link'){ |
4 |
var fromthis.box.getDataById(item.from); |
5 |
var tothis.box.getDataById(item.to); |
6 |
var linknew MyLink(from, |
7 |
if(item.arrow){ |
8 |
if(item.arrow=="10" ||"11")'arrow.from', true); |
9 |
if(item.arrow=="01" ||"11")'arrow.to', true); |
10 |
} |
11 |
this.box.add(link); |
12 |
element=link; |
13 |
} |
14 |
if(item.element'node'){ |
15 |
var nodenew twaver.Node(item.id); |
16 |
if(item.image){ |
17 |
node.setImage(item.image); |
18 |
if(item.image=='group') |
19 |
if(item.image=='subnetwork') |
20 |
} |
21 |
if(item.icon){ |
22 |
node.setStyle('icons.names', |
23 |
node.setStyle('icons.position', 'bottomright.topleft'); |
24 |
} |
25 |
node.setStyle('shadow.blur',10); |
26 |
node.setStyle('shadow.xoffset',5); |
27 |
node.setStyle('shadow.yoffset',5); |
28 |
this.box.add(node); |
29 |
element=node; |
30 |
} |
31 |
32 |
if(element){ |
33 |
element.setStyle('label.font', '11px); |
34 |
element.setName(item.name); |
35 |
} |
36 |
} |
网元右下角带上不同标识的小图标
在TWaver里这个很easy,使用网元自带的IconAttachment就能实现。在上面的代码中,处理icon部分实用到,icon的names能够是一个数组,同一时候放多个图标;还能够设置图标的X或Y轴上Y的偏移量,很多其它属性能够參考TWaver文档
1 |
node.setStyle('icons.names', |
2 |
node.setStyle('icons.position', 'bottomright.topleft'); |
来个大图赞赏赞赏

连线须要是二次曲线
这个须要重写LinkUI,仅仅须要重写getLinkPoints的方法就能够。默认此方法返回是的是from和to两个点。假设须要二次曲线,那就须要一共3个点。这里计算from和to的中心点,并做了一个偏移,方法最后返回的是一个list。第一个元素是from点,第二个元素是包括中间点和to点的list,假设须要连线是贝塞尔曲线第二个元素应是包括3个元素的list,TWaver内部做了个识别
1 |
getLinkPoints: function () |
2 |
MyLinkUI.superClass.getLinkPoints.call(this); |
3 |
4 |
var fthis.getFromPoint(); |
5 |
var tthis.getToPoint(); |
6 |
7 |
var pointsnew twaver.List(); |
8 |
points.add(f); |
9 |
points.add(t); |
10 |
11 |
this._lineLength |
12 |
var offsetthis._lineLength/10; |
13 |
var m |
14 |
x: |
15 |
y: |
16 |
} |
17 |
var cpsnew twaver.List(); |
18 |
cps.add(m); |
19 |
cps.add(t); |
20 |
21 |
points.removeAt(1); |
22 |
points.add(cps); |
23 |
this._linkPoints |
24 |
25 |
return this._linkPoints; |
26 |
} |
弹出菜单和信息板
弹出菜单使用TWaver的PopupMenu机制,轻松搞定,直接上代码
1 |
var popupMenunew twaver.controls.PopupMenu(network); |
2 |
popupMenu.setMenuItems([ |
3 |
{'加入设备'}, |
4 |
{'删除设备'}, |
5 |
{true}, |
6 |
{'具体信息...'}, |
7 |
]); |
8 |
popupMenu.onMenuItemRenderedfunction (div, |
9 |
div.childNodes[1].style['font-family']="'Microsoft; |
10 |
div.childNodes[1].style['font-size']='12px'; |
11 |
}; |

信息板并不须要TWaver的机制,仅仅须要监听network的事件,控制DOM就能够实现。能够每次生成一个div显示,也缓存一个div,通过CSS控制它的display属性。依据详细需求所定。
这里缓存了一个div,依据点击的网元不同,改动div上的标题和图标
1 |
this.network.addInteractionListener(function(e){ |
2 |
if(e.kind'clickElement' &&'twaver.Node' && |
3 |
var titleImg'titleImg'); |
4 |
var ei |
5 |
titleImg.src |
6 |
7 |
var titleTxt'titleTxt'); |
8 |
var txt''; |
9 |
if(e.element.getName()){ |
10 |
txt |
11 |
} |
12 |
titleTxt.innerHTML |
13 |
var s |
14 |
s.display'block'; |
15 |
s.left'px'; |
16 |
s.top'px'; |
17 |
} else { |
18 |
dialog.style.display'none'; |
19 |
} |
20 |
}); |


开头括弧中问题,大家肯定已经明确。指的是网元的图标发生了。是不是比以往更加美丽了,感谢大家的支持。

被忽视的TWaver功能(1)的更多相关文章
- 巧用TWaver 3D 矢量图形功能
的确,提起TWaver,大家想到的首先是“电信拓扑图组件”.其实,由于其灵活的MVC架构.矢量化设计.方便定制等特点,TWaver可以做的还有很多.例如房地产行业常见到的“户型图”. 户型推荐是销售接 ...
- 运用TWaver 3D 矢量图形处理能力
的确,提起TWaver,大家想到的首先是"电信拓扑图组件".事实上.因为其灵活的MVC架构.矢量化设计.方便定制等特点.TWaver能够做的还有非常多.比如房地产行业常见到的&qu ...
- SWIG 3 中文手册——6. SWIG 和 C++
目录 6 SWIG 和 C++ 6.1 关于包装 C++ 6.2 方法 6.3 支持的 C++ 功能 6.4 命令行选项与编译 6.5.1 代理类的构造 6.5.2 代理类中的资源管理 6.5.3 语 ...
- 几个超级好用但很少有人知道的 webstorm技巧
我总结一些我发现的比较实用的功能,内容来自日常工作中用到的功能.图片来自PPT,是在公司内部的分享. 你不知道的webstorm进阶使用技巧 1.双击shift 全局搜索,可以搜索代码.设置等. 如果 ...
- 2017年"程序媛和工程狮"绝对不能忽视的编程语言、框架和工具
2017年"程序媛和工程狮"绝对不能忽视的编程语言.框架和工具 在过去的一年里,软件开发行业继续大踏步地向前迈进.回顾 2016 年,我们看到了更多新兴的流行语言.框架和工具, ...
- JQuery的一些简单功能
JQuery js的缺点总结 1.入口函数只能有一个,如果出现多个,后面的会覆盖掉前面的 2.代码容错性差,容易出错,出错会导致后面的代码不执行 3.存在浏览器兼容性,比如innerText在火狐浏览 ...
- Chrome开发者工具不完全指南(一、基础功能篇)
就算你不是一名前端开发工程师,相信你也不会对Chrome浏览器感到陌生.根据最新的一份(2015/06)的浏览器市场占有率报告,Chrome近乎占有浏览器天下的半壁江山.简单.快捷使它成为了新时代人们 ...
- .NET框架设计(常被忽视的C#设计技巧)
阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...
- 货运APP产品魔力=卓越功能×情感诉求
货运APP产品魔力=卓越功能×情感诉求 [导语]在滴滴打车.快的打车软件风靡全国之际,很多企业也在探索如何将其应用到公路货运领域用以整合社会运力资源.但一方面大多数人聚焦的是干线运输中的长途货车运 ...
随机推荐
- struts2上传图片
在WEB-INF下新建一个content目录,建立一个upload.jsp <%@ page contentType="text/html; charset=UTF-8" l ...
- JAVA思维导图系列:多线程0基础
感觉自己JAVA基础太差了,又一次看一遍,已思维导图的方式记录下来 多线程0基础 进程 独立性 拥有独立资源 独立的地址 无授权其它进程无法訪问 动态性 与程序的差别是:进程是动态的指令集合,而程序是 ...
- jz2440烧写开发板uboot,内核和文件系统等的相关命令
下载文件{ftpget -u 1 -p 1 192.168.2.110 a.out a.outnfs 30000000(destination) 192.168.2.109:/home/fs/work ...
- ZOJ 3594 年份水题 【注意:没有0年】
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...
- 解决QT Creator在Linux下的输入法问题
https://vjudge1.github.io/2014/04/02/type-chinese-in-linux/http://blog.csdn.net/ubuntutouch/article/ ...
- LoadRunner脚本增强
1.检查点 web_find() 和web_reg_find() 2.Block技术 如果对不同的事物进行不同次数的循环该怎么处理?默认情况下LoadRunner对所有的事物都是统一执行的,即虽然有多 ...
- uva 10837 - A Research Problem(欧拉功能+暴力)
题目链接:uva 10837 - A Research Problem 题目大意:给定一个phin.要求一个最小的n.欧拉函数n等于phin 解题思路:欧拉函数性质有,p为素数的话有phip=p−1; ...
- Python 对Twitter中指定话题的被转载Tweet数量的频谱分析
CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-10 @author: guaguastd @name: r ...
- 基于JSP+SERVLET的新闻发布系统(一)
本系统使用的是基于JSP+SERVLET+TOMCAT6 数据库使用的是MYSQL IDE是MYECLIPSE8.5,页面编辑使用的是百度的ueditor,比较适合咱国人 采用MVC模式,使用的关键技 ...
- C# - Environment类,获取桌面的路径
private void button1_Click(object sender, EventArgs e) { string Path = Environment.GetFolderPath(Env ...