被忽视的TWaver功能(1)

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

解析JSON数据生成TWaver中的网元和连线
下面是Demo中用到的JSON数据格式样例

var topo_data = [
    {"element": "node", "name": "网关", "id": "gateway1", "image": "group", "icon": "icon_wall"},
    {"element": "node", "name": "网关", "id": "gateway2", "image": "subnetwork", "icon": "icon_wall"},
    {"element": "link", "from": "cloud", "to": "center1", "name":"包含关系"},
    {"element": "link", "from": "gather2", "to": "firewall", "arrow": "11"}
];

根据element判断创建何种对象,是网元还是连线;image设置网元图片的名称(这些图片都是事先需要注册,如果使用TWaver内置的图片,则不需要,直接使用TWaver的图片注册名称即可,例如twaver.Defaults.IMAGE_GROUP),icon设置网元上的标识,arrow设置连线的箭头方向,下面上代码

function createElement(item){
    var element;
    if(item.element == ‘link‘){
        var from = this.box.getDataById(item.from);
        var to = this.box.getDataById(item.to);
        var link = new MyLink(from, to);
        if(item.arrow){
            if(item.arrow=="10" || item.arrow=="11") link.setStyle(‘arrow.from‘, true);
            if(item.arrow=="01" || item.arrow=="11") link.setStyle(‘arrow.to‘, true);
        }
        this.box.add(link);
        element=link;
    }
    if(item.element ==‘node‘){
        var node = new twaver.Node(item.id);
        if(item.image){
            node.setImage(item.image);
            if(item.image==‘group‘) node.setImage(twaver.Defaults.IMAGE_GROUP);
            if(item.image==‘subnetwork‘) node.setImage(twaver.Defaults.IMAGE_SUBNETWORK);
        }
        if(item.icon){
            node.setStyle(‘icons.names‘, [item.icon]);
            node.setStyle(‘icons.position‘, ‘bottomright.topleft‘);
        }
        node.setStyle(‘shadow.blur‘,10);
        node.setStyle(‘shadow.xoffset‘,5);
        node.setStyle(‘shadow.yoffset‘,5);
        this.box.add(node);
        element=node;
    }

    if(element){
        element.setStyle(‘label.font‘, ‘11px "Microsoft Yahei"‘);
        element.setName(item.name);
    }
}

网元右下角带上不同标识的小图标
在TWaver里这个非常简单,使用网元自带的IconAttachment就能实现,在上面的代码中,处理icon部分有用到,icon的names可以是一个数组,同时放多个图标;还可以设置图标的X或Y轴上Y的偏移量,更多属性可以参考TWaver文档

node.setStyle(‘icons.names‘, [item.icon]);
node.setStyle(‘icons.position‘, ‘bottomright.topleft‘);

来个大图欣赏欣赏

连线需要是二次曲线
这个需要重写LinkUI,只需要重写getLinkPoints的方法就可以。默认此方法返回是的是from和to两个点,如果需要二次曲线,那就需要一共3个点,这里计算from和to的中心点,并做了一个偏移,方法最后返回的是一个list,第一个元素是from点,第二个元素是包含中间点和to点的list,如果需要连线是贝塞尔曲线第二个元素应是包含3个元素的list,TWaver内部做了个识别

getLinkPoints: function () {
    MyLinkUI.superClass.getLinkPoints.call(this);

    var f = this.getFromPoint();
    var t = this.getToPoint();

    var points = new twaver.List();
    points.add(f);
    points.add(t);

    this._lineLength = _twaver.math.calculateLineLength(points);
    var offset = this._lineLength/10;
    var m = {
        x: (f.x+t.x)/2 + offset,
        y: (f.y+t.y)/2 + offset,
    }
    var cps = new twaver.List();
    cps.add(m);
    cps.add(t);

    points.removeAt(1);
    points.add(cps);
    this._linkPoints = points;

    return this._linkPoints;
}

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

var popupMenu = new twaver.controls.PopupMenu(network);
popupMenu.setMenuItems([
    { label: ‘添加设备‘},
    { label: ‘删除设备‘},
    { separator: true},
    { label: ‘详细信息...‘},
]);
popupMenu.onMenuItemRendered = function (div, menuItem) {
    div.childNodes[1].style[‘font-family‘]="‘Microsoft Yahei‘, ‘Open Sans‘,sans-serif";
    div.childNodes[1].style[‘font-size‘]=‘12px‘;
};


信息板并不需要TWaver的机制,只需要监听network的事件,控制DOM就可以实现。可以每次生成一个div显示,也缓存一个div,通过CSS控制它的display属性,根据具体需求所定。这里缓存了一个div,根据点击的网元不同,修改div上的标题和图标

this.network.addInteractionListener(function(e){
if(e.kind == ‘clickElement‘ && e.element && e.element.getClassName() == ‘twaver.Node‘ && e.element.getName()){
    var titleImg = document.getElementById(‘titleImg‘);
    var ei = twaver.Util.getImageAsset(e.element.getImage())._cache;
    titleImg.src = ei.toDataURL();

    var titleTxt = document.getElementById(‘titleTxt‘);
    var txt = ‘‘;
    if(e.element.getName()){
        txt = e.element.getName();
    }
    titleTxt.innerHTML = txt;
    var s = dialog.style;
    s.display = ‘block‘;
    s.left = e.event.x+‘px‘;
    s.top = e.event.y+‘px‘;
} else {
    dialog.style.display = ‘none‘;
}
});


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

时间: 2024-10-04 00:13:19

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

巧用TWaver 3D 矢量图形功能

的确,提起TWaver,大家想到的首先是“电信拓扑图组件”.其实,由于其灵活的MVC架构.矢量化设计.方便定制等特点,TWaver可以做的还有很多.例如房地产行业常见到的“户型图”. 户型推荐是销售接待中很重要的阶段,也被称做是为客户造梦的过程,户型也是客户是否选择该楼盘的一大要素.制作漂亮的户型图在房地产行业无疑是非常重要的一项工作. 首先利用TWaver常被忽视的“矢量图形”功能,来定义房间和隔断的形状.这可以通过代码片段完成.json格式定义完成.或编辑器拖拽完成.一小段代码或json足可

华为手机5个容易被忽视的功能,关键时刻大有作用

现在很多人都比较喜欢用华为手机,主要还是因为华为手机的功能比较多,但是有那么多好用的功能,肯定还是有些人连华为手机一半的功能都没有用到,那岂不是很可惜?今天就来盘点一下其中很容易被大家忽视的5个功能,每一个都很好用哦,赶紧来看看吧. 1.多用户模式 华为手机的用户模式跟其他手机有些不同,这是为了保护信息安全,华为手机模式可以为不同用户设置独立的空间,数据.权限都是相互独立.互不干扰的.非常私密,再也不用怕女朋友查手机,或者是孩子玩你的手机啦. 2.手机也能充当门禁卡 出门忘带门禁卡怎么办?华为手

如果css足够强大了,你还会用编程的方式实现去实现css已有的功能吗?

现在css3 都出来的,但是其实我由于一些原因,有些css2中都能支持的样式,我都没有使用过.我感觉我真的有必要静下心来,去看看那些东西,看看哪些以前都被忽视掉的. 今天我主要来讲三个对于我们编程经常用到的,具体如下. 一. 有序列表序号 a.应用场景 有一个列表,需要有序号展示,方便用户知道当前列表记录数,用户可以任意删除其中一条记录,删除后,序号重新整理. b.思考 我以前的不知道有样式的通常做法是,列表信息在展示时通过索引+1,变成当前记录的序号,这个方法很简单.但是在记录任意删除时就麻烦

apache的优化-日志轮询、错误页面重定向、压缩功能deflate、客户端缓存expire

1.apache日志轮询 1.1)什么是日志轮询 默认情况下apache的日志是写入到一个文件中的,这对日志的备份和分析造成不便.日志轮询就是可以把apache的日志根据时间进行分开,例如按天轮询:即apache会把当天的日志写入到一个独立的文件中. 1.2)下载并安装日志轮询工具 wget http://cronolog.org/download/cronolog-1.6.2.tar.gz tarzxf cronolog-1.6.2.tar.gz  cdcronolog-1.6.2 ./con

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

就算你不是一名前端开发工程师,相信你也不会对Chrome浏览器感到陌生.根据最新的一份(2015/06)的浏览器市场占有率报告,Chrome近乎占有浏览器天下的半壁江山.简单.快捷使它成为了新时代人们的新宠.如果你是一名web开发人员,我推荐你使用Chrome.作为前端开发的"IDE",你只需要搭配一个编辑器就能完成几乎所有的开发任务了.关于它的使用和功能分析要么都是大而不全,要么是巨细糜烦.本系会比较详细地分享卤煮的一些Chrome(F12开发者功能)使用经验,从一些基础的功能开始到

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

2017年"程序媛和工程狮"绝对不能忽视的编程语言.框架和工具 IT程序狮· 9 天前 在过去的一年里,软件开发行业继续大踏步地向前迈进.回顾 2016 年,我们看到了更多新兴的流行语言.框架和工具,它们改变着我们的工作方式,让我们看到更多的可能.但在这个行业,紧随潮流是很难的.所以在每年年底,我们都会给你提供一些建议,它涉及什么是最重要的,以及你在未来一年中应该学习什么. 大趋势 渐进式 Web Apps 在 2016 年里,我们见证了 Progressive Web App 概念的

TWaver初学实战——制作交互式地铁图

每天坐地铁,经常看地铁图,有一天突然想到,地铁图不也是一种拓扑结果吗?TWaver到底能与地铁图擦出怎样的火花呢? 想到就干,先到网上找幅参考图.各种风格的地铁图还挺多,甚至有大学生自主设计制作,受到地铁相关人士的认可和赞扬.不过看到他花了3周时间,我就比较同情他了,如果学会了TWaver,我保他连3天都不用就可以完成,而且还是纯矢量.可交互.有动态效果.无失真缩放的拓扑图. 我们就以上面这幅地铁图为模版来进行制作. 一.数据整理 俗话说兵马未动粮草先行,没有数据再好的创意也白搭. 数据格式,自

浅谈微信卡券功能开发(2)

回顾 继续介绍NODEJS开发微信卡券功能,昨天简单演示了微信接口的Access Token的原理和用法,还有门店的添加和查询,今天我们将介绍卡券的创建以及核销的最基本的流程. 本文将使用NodeJS作为开发语言,以wechat-card,和官方文档为主进行演示. 创建卡券 昨天我们已经添加完成门店,接下来我们将要创建卡券.微信的API接口为: https://api.weixin.qq.com/card/create?access_token=ACCESS_TOKEN 使用wechat-car

JQuery的一些简单功能

JQuery js的缺点总结 1.入口函数只能有一个,如果出现多个,后面的会覆盖掉前面的 2.代码容错性差,容易出错,出错会导致后面的代码不执行 3.存在浏览器兼容性,比如innerText在火狐浏览器中不起作用 4.DOM操作复杂,实现简单的动画很麻烦 jQuery的两种入口函数: $(document).ready(function(){}); $(function(){}); 对比JavaScript的入口函数与jQuery的入口函数 1.JavaScript的入口函数要等到页面中所有资源