TWaver HTML5之树形布局

转眼间春节假期已经过完,作为一个职业的程序猿,不知道大家有没有这样的感觉,一天不碰电脑,总觉得生活少点什么。今天是春节后上班的第三天,给大家分享一下我们前段时间的一个需求,需求是这样的:界面中的网元分为不同的域,比如一级域,二级域,三级域,….N级域,而且不同域之间会有连线。对于这个需求,按照常规的想法,使用group岂不是很简单,一级域是一个group,二级域也是一个group,二级域的group是一级域的父亲,以此类推。但是这样有个问题,如果域比较多,会造成group的过度嵌套,界面中group多了之后,不仅用户体验下降,而且会严重影响性能,所以倒不如直接用树,可以很直观的体现各个域之间的层级关系。
Screen Shot 2015-02-27 at 10.14.31
下面是布局的代码,代码很简单,相信熟悉twaver的人很容易看懂。

function layoutRing(){    
    //setup all group rings.
    var groups={};    
    box.forEach(function(data){
      if(data instanceof twaver.Node){
        var node=data;
        node.setClient('x', node.getLocation().x);
        node.setClient('y', node.getLocation().y);
        var groupName=data.getClient('group');
        if(!groups[groupName]){
          groups[groupName]=[];
        }
        var rings=groups[groupName];
        var level=parseInt(node.getClient('level'));
        if(rings.length<=level){
          rings.push([]);
        }
        var ring=rings[level];
        ring.push(node);
      }
    });
 
    cleanConnections();
    layouter.doLayout('topbottom');   
     
    for(var groupName in groups){
      //get this group bounds.
      var x1=undefined, y1=undefined, x2=undefined, y2=undefined;
      var rings=groups[groupName];
      for(var level=0;level<rings.length; level++){
        var ring=rings[level];
        for(var index=0;index<ring.length;index++){
          var node=ring[index];   
          x1=x1 ? Math.min(x1, node.getLocation().x) : node.getLocation().x;
          y1=y1 ? Math.min(y1, node.getLocation().y) : node.getLocation().y;
          x2=x2 ? Math.max(x2, node.getLocation().x) : node.getLocation().x;
          y2=y2 ? Math.max(y2, node.getLocation().y) : node.getLocation().y;
 
          var target=box.getDatas().get(Math.floor(Math.random()*box.size()));
          if(target instanceof twaver.Node && target!==node){
            var connection=new twaver.Link(node, target);
            connection.setStyle('link.width',0.2);
            connection.setStyle('link.color', '#aaaaaa');
            connection.setClient('connection',true);
            connection.setClient('angle', (target.getClient('angle')+node.getClient('angle'))/2);
            box.add(connection);
          }
        }
      }
      var width=x2-x1;
      var height=y2-y1;           
 
      //layout each ring for this group.
      for(var level=0;level<rings.length; level++){
        var ring=rings[level];
        for(var index=0;index<ring.length;index++){
          var node=ring[index];   
          var radius=node.getLocation().y-y1;
          var range=Math.PI*2;        
          var angle=(node.getLocation().x-x1)/width * range;
          if(level>1 && (level==rings.length-1 || rings.length<4)){
            angle=node.getParent().getClient('angle')+(angle-node.getParent().getClient('angle'))/3;
          }
          var x=radius*Math.cos(angle);
          var y=radius*Math.sin(angle);
                   
          node.setLocation(node.getClient('x'),node.getClient('y'));
          node.setClient('angle', angle);                     
          move(node, x, y);
        }
      }
    }   
   }

 

布局中的可以加入动画效果,提升用户体验,关于动画的相关文档可以参考文档:Screen Shot 2015-02-27 at 10.53.11

 

 

function move(node, x, y){
    var x0=node.getClient('x');
    var y0=node.getClient('y');
    new twaver.Animate({
          from: { x: x0, y: y0 },
          to: { x: x, y: y },
          type: 'point',
          delay: 100,
          dur: 1000,
          easing: 'easeNone',
          onUpdate: function (value) {
            node.setLocation(value.x, value.y);
          }
        }).play();      
   }

 

 

如果有对这个示例感兴趣的朋友,可以发邮件索取相关代码,邮箱地址:jack.shangguan@servasoft.com

html js树形图多级菜单美观可配置 html js树形图,美观大方,界面友好,可配置,也可自己重新调整样式,美观的菜单列表,多级列表,三级及三级以上列表,可自行配置 立即下载

相关推荐

X光安检模型训练第一步:手把手教你处理OPIXray和HIXray这两个小众数据集

本文详细解析了X光安检AI模型训练的关键步骤,重点介绍如何处理OPIXray和HIXray这两个专业数据集。从数据格式转换到YOLO标准,再到数据增强和质量验证,手把手指导开发者高效利用这些数据集进行目标检测模型训练,提升安检场景下的危险物品识别准确率。

weixin_32629853的博客 316

Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断

Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断

见贤思齐焉,见不贤内自省 969

22版本Altium Designer导出生产文件的规范化操作指南

本文详细介绍了PCB设计中的Gerber文件导出流程及相关文件生成方法。主要内容包括:1)Gerber文件导出的5个关键设置步骤;2)NC钻孔文件的导出方法;3)坐标文件的生成方式;4)文件打包规范要求必须包含Gerber文件、NC钻孔文件和坐标文件;5)文件提交的两种方式(新手推荐提交原始工程文件,量产推荐仅提交Gerber文件包)。文章还特别强调了单位一致性、精度验证等注意事项,为PCB设计文件的规范输出提供了完整指导。

qq_56506325的博客 1055

TWaver组件之Tree使用(翻译TWaver文档+补充自己使用体会)

第一篇:使用一个 Tree 组件 TTree 是 Twaver 提供的主要图形组件之一,它实现了分层呈现 DataBox 中数据,每个 Tree 都有一个根节点,所有节点都从该节点下降。 树上的每个节点都是一个 element 实例,它有一系列的属性,如 标签、图标、工具提示等,这些属性通过 element 的一到多个属性进行设置的。 介绍 Tr...

hn_liuyi 617

新手自己动手设置3D-slicer中文版(超详细图文)

3DSlicer是一个开源的免费软件,用于医学图像分析(包括配准和交互式分割)和可视化(包括3D渲染)以及用于图像引导治疗研究的软件平台。复制qm文件,粘贴于3D-slicer文件相关文件夹内,\bin\translations\。打开3dslicer,edit菜单下Application Settings,支持的操作系统:Linux,Mac OSX和Windows。本人英语太差,所以第一反应就是中文版,官网无中文版下载,下载后不能直接使用,必须要发布成qm文件;qm文件已经生成,位于ts文件同一文件夹。

linjianping513的博客 9839

【YOLO 系列】基于YOLOv8的工业零件表面缺陷智能检测系统【python源码+Pyqt5界面+数据集+训练代码】

本文详细介绍了如何基于YOLOv8深度学习模型和PyQt5图形界面,构建一套完整的工业零件表面缺陷智能检测系统。内容涵盖从环境搭建、数据集标注、模型训练调参到最终封装成可执行桌面软件的全流程,并深入解析了YOLOv8在工业视觉场景中的技术优势与落地优化策略。

ol78901234的博客 401

用TWaver HTML5定制五彩斑斓的链路

最近有客户提到自定义链路的需求,个人感觉非常有代表意义,现在共享出来给大家参考一下。先来看看需求: 链路要分成两半,用两种颜色填充。 填充百分比在不同值域时,用不同颜色。 显示刻度 有个开关,可以控制链路变短,变短后,链路只画开始和结束部分(相当于原始链路的缩影),中间不画 如果有多条链路,链路合并后两端分别显示这些链路中的最高填充百分比 合并前: 合并后: 进入子网后...

web开发自学 483

【R语言实例】物种分布模型介绍

SDM介绍

wong2016的博客 1万+

Twaver-HTML5基础学习(2)基本数据元素(Data)

Data对象上的基本属性和如何自定义属性

见贤思齐焉,见不贤内自省 1387

18、Excel VBA编程:自定义函数创建与代码调试全攻略

本文详细介绍了Excel VBA中自定义函数的创建方法,以获取单元格注释为例演示了完整开发流程,并深入讲解了代码调试的重要性与核心工具。内容涵盖三种主要错误类型及其应对策略,系统介绍了调试工具栏、断点、逐行执行、Locals窗口、Immediate窗口等实用功能。通过综合案例展示了如何运用调试技术解决实际问题,并总结了提前规划、逐步测试、日志记录等最佳实践,帮助读者提升VBA编程效率与代码质量。

life6的博客 100

【51单片机仿真】基于51单片机设计的温湿度采集检测系统__资料编号11

该系统通过与AT89C51单片机、LCD1602显示屏和DHT11温湿度传感器的集成,实时读取环境中的温度和湿度数据并在LCD1602上显示这些信息,其中系统初始化LCD1602显示屏、通过DHT11_receive()函数接收并校验DHT11传感器的温湿度数据、使用LCD_ShowNum()函数逐位显示湿度和温度数据并在这些数据后附加相应的单位符号,以便用户可以直观地看到当前环境的温湿度情况。

嵌入式阿齐Archie 2万+

Twaver-HTML5基础学习(40)表格可视化视图组件(Table)

Twaver-HTML5基础学习(40)表格可视化视图组件(Table)

见贤思齐焉,见不贤内自省 1178

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

twaver html5,TWaver可视化编辑器的前世今生(二)3D编辑器

插播一则广告(长期有效)MONO哥需要在武汉招JavaScript工程师若干要求:对前端技术(JavasScript、HTML、CSS),对可视化技术(Canvas、WebGL)有浓厚的兴趣基础不好的可培养,基础好的可共谋大事感兴趣的给我发邮件:hr@servasoft.com------------------------------------------------------------正...

weixin_31608325的博客 680

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Twaver-HTML5基础学习(31)Tree基本使用

Twaver-HTML5基础学习(31)Tree基本使用

见贤思齐焉,见不贤内自省 907

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Twaver-HTML5基础学习(14)连线(Link)连线类型(直线、延伸直线、正交直线)

Twaver-HTML5基础学习(14)连线(Link)连线类型(直线、延伸直线、正交直线)

见贤思齐焉,见不贤内自省 2108

TWaver HTML5 (2D)----数据元素

概述 数据元素是数据模型的基本要素,用于描述图形网元,业务网元,或者纯数据。TWaver HTML5中所有数据元素都继承自twaver.Data。为不同功能的需求,预定义了三类数据类型:twaver.Element,twaver.Alarm,twaver.Layer,分别用来描述拓扑的网元,告警和图层。其中拓扑网元扩展定义了十几种网元类型,用以描述丰富的拓扑网元特性,其中最常用的几类拓...

limeOracle的博客 318

TWaver HTML5学习笔记 —— 复制网络元素

一、学习内容概述:      学习在拓扑图中,实现拓扑元素的复制和粘贴,实现原理:将选中的元素复制保存到内存中,当选择进行粘贴时,从内存中取出之前复制的元素进行粘贴操作,并指定这些新生成元素的新名称(原有元素前加“new-”)和位置(以当前右键选择点击的位置,结合复制元素中网元的最小x、y坐标,计算出x、y坐标的偏移量)。 二、学习内容总结: 1、复制选中的元素:

Steven的专栏 3738

Twaver-HTML5基础学习(17)子网(SubNetwork)

Twaver-HTML5基础学习(17)子网(SubNetwork)

见贤思齐焉,见不贤内自省 587

Twaver-HTML5基础学习(26)背景

Twaver-HTML5基础学习(26)背景

见贤思齐焉,见不贤内自省 648

Twaver-HTML5基础学习(29)界面交互

Twaver-HTML5基础学习(29)界面交互

见贤思齐焉,见不贤内自省 860

TWaver初学实战——基于HTML5的交互式地铁图

每天坐地铁,经常看地铁图,有一天突然想到,地铁图不也是一种拓扑结果吗?TWaver到底能与地铁图擦出怎样的火花呢? 想到就干,先到网上找幅参考图。各种风格的地铁图还挺多,甚至有大学生自主设计制作,受到地铁相关人士的认可和赞扬。不过看到他花了3周时间,我就比较同情他了,如果学会了TWaver,我保他连3天都不用就可以完成,而且还是纯矢量、可交互、有动态效果、无失真缩放的拓扑图。 ...

weixin_30736301的博客 641

Twaver-HTML5基础学习(32)Network样式andTree样式

Twaver-HTML5基础学习(32)Network样式andTree样式

见贤思齐焉,见不贤内自省 1068

HTML&CSS中的树形结构图

有两个维度影响树视图的布局: 行间距(等于文本的行高)和标记的半径。.tree{虽然我们通常使用相对单位来缩放基于文本大小的用户界面控件,但对于标记,这可能导致控件过小或过大,所以我们使用一个合理的固定大小。

Li5306的博客 1万+
上一篇: TWaver推智能手表挑战华为苹果
下一篇: TWaver GIS制作穹顶之下的雾霾地图
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值