zoukankan      html  css  js  c++  java
  • 被忽视的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';
    }
    });


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

  • 相关阅读:
    扫面线模板
    (动态规划、栈)leetcode 84. Largest Rectangle in Histogram, 85. Maximal Rectangle
    tmux 常见命令汇总
    leetcode 221
    leetcode 319 29
    (贪心)leetcode 392. Is Subsequence, 771. Jewels and Stones, 463. Island Perimeter
    leetcode 982 668
    Python import 同文件夹下的py文件的函数,pycharm报错
    Windows里Anaconda-Navigator无法打开的解决方案
    Windows下 gpu版 Tensorflow 安装
  • 原文地址:https://www.cnblogs.com/twaver/p/4021540.html
Copyright © 2011-2022 走看看