被忽视的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产品魔力=卓越功能×情感诉求 [导语]在滴滴打车.快的打车软件风靡全国之际,很多企业也在探索如何将其应用到公路货运领域用以整合社会运力资源.但一方面大多数人聚焦的是干线运输中的长途货车运 ...
随机推荐
- Delphi启动/停止Windows服务,启动类型修改为"自动"
unit U_StartServices; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...
- Python函数式编程:Lambda表达式
首先我们要明白在编程语言中,表达式和语句的区别. 表达式是一个由变量.常量.有返回值的函数加运算符组成的一个式子,该式子是有返回值的 ,如 a + 1 就是个表达式, 单独的一个常量.变量 或函数调 ...
- Python函数式编程:内置函数reduce 使用说明
一.概述 reduce操作是函数式编程中的重要技术之一,其作用是通过对一个集合的操作,可以从中生成一个值.比如最常见的求和,求最大值.最小值等都是reduce操作的典型例子.python通过内置red ...
- hdu2243之AC自动机+矩阵乘法
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- mysql的基础操作
查看数据库 获取服务器上的数据库列表通常很有用.执行show databases;命令就可以搞定. mysql> show databases; 创建数据库 mysql> create d ...
- C# 课堂总结5-数组
一. 数组:解决同一类大量数据在内存存储和运算的功能. 1.一维数组定义:制定类型,指定长度,指定名称.int[] a=new int[5]int[] a=new int[5]{23,23,23,1, ...
- Http方式获取网络数据
通过以下代码可以根据网址获取网页的html数据,安卓中获取网络数据的时候会用到,而且会用Java中的sax方式解析获取到数据.(sax解析主要是解析xml)具体代码如下: package com.wy ...
- python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- 【Java Web】使用URLRewrite实现网站伪静态
大部分搜索引擎都会优先考虑收录静态的HTML页面,而不是动态的*.jsp.*.php页面.但实际上绝大部分网站都是动态的,不可能全部是静态的HTML页面,因此互联网上大部分网站都会考虑伪静态——就是将 ...
- android 4.0后不允许屏蔽掉home键
屏蔽home键的方法 // 屏蔽掉Home键 public void onAttachedToWindow() { this.getWindow().setType(WindowManager.Lay ...