应客户需求写个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 from
this.box.getDataById(item.from);
5         var to
this.box.getDataById(item.to);
6         var link
new MyLink(from,
to);
7         if(item.arrow){
8             if(item.arrow=="10" ||
item.arrow==
"11")
link.setStyle(
'arrow.from'true);
9             if(item.arrow=="01" ||
item.arrow==
"11")
link.setStyle(
'arrow.to'true);
10         }              
11         this.box.add(link);
12         element=link;
13     }
14     if(item.element
==
'node'){
15         var node
new twaver.Node(item.id);
16         if(item.image){
17             node.setImage(item.image);
18             if(item.image=='group')
node.setImage(twaver.Defaults.IMAGE_GROUP);
19             if(item.image=='subnetwork')
node.setImage(twaver.Defaults.IMAGE_SUBNETWORK);
20         }              
21         if(item.icon){
22             node.setStyle('icons.names',
[item.icon]);
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
"Microsoft Yahei"'
);
34         element.setName(item.name);
35     }
36 }

网元右下角带上不同标识的小图标

在TWaver里这个很easy,使用网元自带的IconAttachment就能实现。在上面的代码中,处理icon部分实用到,icon的names能够是一个数组,同一时候放多个图标;还能够设置图标的X或Y轴上Y的偏移量,很多其它属性能够參考TWaver文档

1 node.setStyle('icons.names',
[item.icon]);
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 f
this.getFromPoint();
5     var t
this.getToPoint();
6  
7     var points
new twaver.List();
8     points.add(f);
9     points.add(t);
10  
11     this._lineLength
= _twaver.math.calculateLineLength(points);
12     var offset
this._lineLength/10;
13     var m
= {
14         x:
(f.x+t.x)/2 + offset,
15         y:
(f.y+t.y)/2 + offset,
16     }
17     var cps
new twaver.List();
18     cps.add(m);
19     cps.add(t);
20  
21     points.removeAt(1);
22     points.add(cps);
23     this._linkPoints
= points;
24  
25     return this._linkPoints;
26 }

弹出菜单和信息板

弹出菜单使用TWaver的PopupMenu机制,轻松搞定,直接上代码

1 var popupMenu
new twaver.controls.PopupMenu(network);
2 popupMenu.setMenuItems([
3     {
label: 
'加入设备'},
4     {
label: 
'删除设备'},
5     {
separator: 
true},
6     {
label: 
'具体信息...'},
7 ]);
8 popupMenu.onMenuItemRendered
function (div,
menuItem) {
9     div.childNodes[1].style['font-family']="'Microsoft
Yahei', 'Open Sans',sans-serif"
;
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' &&
e.element && e.element.getClassName() ==
'twaver.Node' &&
e.element.getName()){
3     var titleImg
= document.getElementById(
'titleImg');
4     var ei
= twaver.Util.getImageAsset(e.element.getImage())._cache;
5     titleImg.src
= ei.toDataURL();
6  
7     var titleTxt
= document.getElementById(
'titleTxt');
8     var txt
'';
9     if(e.element.getName()){
10         txt
= e.element.getName();
11     }
12     titleTxt.innerHTML
= txt;
13     var s
= dialog.style;
14     s.display
'block';
15     s.left
= e.event.x+
'px';
16     s.top
= e.event.y+
'px';
17 else {
18     dialog.style.display
'none';
19 }
20 });



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


被忽视的TWaver功能(1)的更多相关文章

  1. 巧用TWaver 3D 矢量图形功能

    的确,提起TWaver,大家想到的首先是“电信拓扑图组件”.其实,由于其灵活的MVC架构.矢量化设计.方便定制等特点,TWaver可以做的还有很多.例如房地产行业常见到的“户型图”. 户型推荐是销售接 ...

  2. 运用TWaver 3D 矢量图形处理能力

    的确,提起TWaver,大家想到的首先是"电信拓扑图组件".事实上.因为其灵活的MVC架构.矢量化设计.方便定制等特点.TWaver能够做的还有非常多.比如房地产行业常见到的&qu ...

  3. 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 语 ...

  4. 几个超级好用但很少有人知道的 webstorm技巧

    我总结一些我发现的比较实用的功能,内容来自日常工作中用到的功能.图片来自PPT,是在公司内部的分享. 你不知道的webstorm进阶使用技巧 1.双击shift 全局搜索,可以搜索代码.设置等. 如果 ...

  5. 2017年"程序媛和工程狮"绝对不能忽视的编程语言、框架和工具

      2017年"程序媛和工程狮"绝对不能忽视的编程语言.框架和工具 在过去的一年里,软件开发行业继续大踏步地向前迈进.回顾 2016 年,我们看到了更多新兴的流行语言.框架和工具, ...

  6. JQuery的一些简单功能

    JQuery js的缺点总结 1.入口函数只能有一个,如果出现多个,后面的会覆盖掉前面的 2.代码容错性差,容易出错,出错会导致后面的代码不执行 3.存在浏览器兼容性,比如innerText在火狐浏览 ...

  7. Chrome开发者工具不完全指南(一、基础功能篇)

    就算你不是一名前端开发工程师,相信你也不会对Chrome浏览器感到陌生.根据最新的一份(2015/06)的浏览器市场占有率报告,Chrome近乎占有浏览器天下的半壁江山.简单.快捷使它成为了新时代人们 ...

  8. .NET框架设计(常被忽视的C#设计技巧)

    阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...

  9. 货运APP产品魔力=卓越功能×情感诉求

    货运APP产品魔力=卓越功能×情感诉求   [导语]在滴滴打车.快的打车软件风靡全国之际,很多企业也在探索如何将其应用到公路货运领域用以整合社会运力资源.但一方面大多数人聚焦的是干线运输中的长途货车运 ...

随机推荐

  1. search_word

    一个小程序,用asc码输出自己的名字.要求是,a~z两路输入,输出了一个完整的拼音之后还需要输出一个空格.—— 信息硬件过滤的雏形. module search_word ( clock , rese ...

  2. Week5(10月10日):国庆之后,让我们整装期待元旦吧

    Part I:提问  =========================== 1.要将“Hello, Admin",从控制器传递到视图,该如何操作? (1)使用ViewData (2)使用V ...

  3. Python 2.7 学习笔记 基本知识

    python是一种解释型的.面向对象的.带有动态语义的高级程序设计语言.本文介绍下python的基本知识. 一.安装 各种操作系统有自己的安装方法,linux系统一般都自带了python的环境.这里不 ...

  4. paip.输入法编程---输入法ATIaN历史记录 c823

    paip.输入法编程---输入法ATIaN历史记录 c823 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csd ...

  5. EXT.NET高效开发(三)——使用Chrome浏览器的开发人员工具

    这篇帖子老少皆宜,不分男女,不分种族,不分职业.俗话说:“磨刀不误砍柴工”.掌握一些开发工具的使用,对自己帮助是很大的(无论是用于分析问题,还是提高生产力).本篇就讲述如何利用Chrome浏览器(这里 ...

  6. null的小扩展

    注意:JavaScript有6种数据类型,其中是五种基本数据类型,分别是:Undefined.Null.Boolean.Number 和String,还有一种复杂的数据类型Object 使用typeo ...

  7. Swift Error fatal error: unexpectedly found nil while unwrapping an Optional value

    致命的错误: 对一个为空的optional值进行解包. 强制解包(forced unwrapping): 在optional后面加叹号. 比如  "value!" 错误代码: le ...

  8. 编译kernel:配置

    韦东山Linux视频第1期_裸板_UBoot_文件系统_驱动初步\第10课第2节 内核启动流程分析之配置.WMV 下面以DM9000的配置为例: 在一个编译好的内核代码里,寻找CONFIG_DM900 ...

  9. uboot代码2:stage2代码,启动内核

    一.uboot最终目的: 1.读出内核 do_nand read kernel { flash上存的内核:uImage = 头部 + 真正的内核; } 2.启动内核. do_bootm_linux { ...

  10. Ubuntu 安装Matlab2010a

    1.挂载ISO 2.到/media/iso内,在终端执行./install 3.可视化安装 4.问题 1)/usr/local/MATLAB/R2010a/bin/util/oscheck.sh:/l ...