- 浏览: 165465 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
qq_21380041:
954414957@qq.com
HTML5数据可视化第二弹:打造最美3D机房 -
qq_21380041:
楼主,求代码
HTML5数据可视化第二弹:打造最美3D机房 -
luoaz:
楼主能不能传个源码的附件上来, 分享学习下呢?
HTML5+WebGL 3D机房开发实例 -
xiaosi1278:
你好能不能把你讲的源代码发一下!!做参考403541110@q ...
TWaver 3D 编辑器的使用(一)----设计3D场景以及数据绑定 -
TWaverGeek:
BigBird2012 写道您好,您能把您使用TWaver导入 ...
TWaver导入导出AutoCAD DXF图纸
最近有客户提到自定义链路的需求,个人感觉非常有代表意义,现在共享出来给大家参考一下。先来看看需求:
1. 链路要分成两半,用两种颜色填充。
2. 填充百分比在不同值域时,用不同颜色。
3. 显示刻度
4. 有个开关,可以控制链路变短,变短后,链路只画开始和结束部分(相当于原始链路的缩影),中间不画
5. 如果有多条链路,链路合并后两端分别显示这些链路中的最高填充百分比
合并前:
合并后:
6. 进入子网后,节点上显示和上层节点的连线信息
进入子网前,节点2和子网内节点4之间有链路:
进入子网后,节点4上也显示此链路:
先看看实现的效果,后面我们慢慢解释如何定制链路:
前5个需求可以通过自定义Link和LinkUI实现,需要注意:
1. 用Link#getBundleLinks获取所有的捆绑链路
2. 用LinkUI#drawLinePoints画线</li>
完整代码如下:
// 自定义Link构造函数 demo.ScaleLink = function(id, from, to) { // 调用基类构造函数 demo.ScaleLink.superClass.constructor.call(this, id, from, to); // 设置链路宽度为10个像素 this.setStyle('link.width', 10); //this.setStyle('link.color', 'rgba(0, 0, 0, 0)'); // 设置Link类型为平行 this.setStyle('link.type', 'parallel'); // 设置链路捆绑的间距为40 this.setStyle('link.bundle.offset', 40); // 设置刻度颜色 this.setClient('scaleColor', 'black'); // 设置刻度宽度 this.setClient('scaleWidth', 1); // 设置刻度个数 this.setClient('scaleNumbers', 4); // 设置是否变短 this.setClient('shortened', false); // 设置变短后的长度 this.setClient('shortenLength', 100); // 设置分割线颜色 this.setClient('splitterColor', 'black'); // 设置起始填充百分比 this.setClient('fromFillPercent', 0); // 设置结束填充百分比 this.setClient('toFillPercent', 0); }; // 设置自定义Link继承twaver.Link twaver.Util.ext('demo.ScaleLink', twaver.Link, { // 重载获取UI类的方法,返回自定义UI类 getCanvasUIClass : function () { return demo.ScaleLinkUI; }, // 根据百分比获取填充颜色 getFillColor: function(percent) { if (percent < 0.25) { return 'green'; } if (percent < 0.5) { return 'yellow'; } if (percent < 0.75) { return 'magenta'; } return 'red'; }, // 获取起始填充颜色 getFromFillColor: function () { return this.getFillColor(this.getFromFillPercent()); }, // 获取结束填充颜色 getToFillColor: function () { return this.getFillColor(this.getToFillPercent()); }, // 获取起始百分比 getFromFillPercent: function () { // 如果是链路捆绑代理,返回所有捆绑链路中最大填充百分比的值 if (this.isBundleAgent()) { var fromAgent = this.getFromAgent(), percentKey, maxPercent = 0, percent; this.getBundleLinks().forEachSiblingLink(function (link) { percentKey = fromAgent === link.getFromAgent() ? 'fromFillPercent' : 'toFillPercent'; percent = link.getClient(percentKey); maxPercent = percent > maxPercent ? percent : maxPercent; }); return maxPercent; } else { return this.getClient('fromFillPercent'); } }, // 获取结束百分比 getToFillPercent: function () { // 如果是链路捆绑代理,返回所有捆绑链路中填充百分比最大的值 if (this.isBundleAgent()) { var toAgent = this.getToAgent(), percentKey, maxPercent = 0, percent; this.getBundleLinks().forEachSiblingLink(function (link) { percentKey = toAgent === link.getToAgent() ? 'toFillPercent' : 'fromFillPercent'; percent = link.getClient(percentKey); maxPercent = percent > maxPercent ? percent : maxPercent; }); return maxPercent; } else { return this.getClient('toFillPercent'); } }, // 重载获取网元名称方法,判断如果是链路捆绑代理,就返回起始和结束代理节点的名称 getName: function () { if (this.getClient('shortened')) { return null; } else if (this.isBundleAgent()) { return this.getFromAgent().getName() + '-' + this.getToAgent().getName(); } else { return demo.ScaleLink.superClass.getName.call(this); } } }); // 自定义LinkUI构造函数 demo.ScaleLinkUI = function(network, element){ // 调用基类构造函数 demo.ScaleLinkUI.superClass.constructor.call(this, network, element); }; // 设置自定义Link继承twaver.canvas.LinkUI twaver.Util.ext('demo.ScaleLinkUI', twaver.canvas.LinkUI, { // 获取Link角度 getAngle: function () { return getAngle(this.getFromPoint(), this.getToPoint()); }, // 获取Link中间点 getMiddlePoint: function (from, to, percent) { return { x: from.x + (to.x - from.x) * percent, y: from.y + (to.y - from.y) * percent }; }, // 画刻度线 drawScaleLine: function (from, to, angle, length, ctx, percent, lineWidth, lineColor) { var point = this.getMiddlePoint(from, to, percent); var y = length/2 * Math.sin(angle), x = length/2 * Math.cos(angle); ctx.beginPath(); ctx.lineWidth = lineWidth; ctx.strokeStyle = lineColor; ctx.moveTo(point.x + x, point.y + y); ctx.lineTo(point.x - x, point.y -y); ctx.stroke(); }, // 获取是否将链路变短 isShorten: function () { var link = this.getElement(); return link.getClient('shortened') && this.getLineLength() > link.getClient('shortenLength') * 2; }, // 重载画链路函数,用自定义逻辑画链路 paintBody: function (ctx) { var points = this.getLinkPoints(), link = this.getElement(); if (!points || points.size() < 2) { return; } var lineLength = this.getLineLength(), shortenLength = link.getClient('shortenLength'), percent = shortenLength / lineLength, from = points.get(0), to = points.get(1), angle = this.getAngle() + Math.PI/2; if (this.isShorten()) { fromPoints = new twaver.List([from, this.getMiddlePoint(from, to, percent)]); toPoints = new twaver.List([this.getMiddlePoint(from, to, 1 - percent), to]); this._paintBody(ctx, fromPoints, angle); this._paintBody(ctx, toPoints, angle); // 画文字 ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillStyle = 'black'; var textCenter = {x: (fromPoints.get(0).x + fromPoints.get(1).x)/2, y: (fromPoints.get(0).y + fromPoints.get(1).y)/2}; ctx.fillText(link.getName(), textCenter.x, textCenter.y); textCenter = {x: (toPoints.get(0).x + toPoints.get(1).x)/2, y: (toPoints.get(0).y + toPoints.get(1).y)/2}; ctx.fillText(link.getName(), textCenter.x, textCenter.y); ctx.fillText(link.getToNode().getName(), fromPoints.get(1).x, fromPoints.get(1).y); ctx.fillText(link.getFromNode().getName(), toPoints.get(0).x, toPoints.get(0).y); } else { this._paintBody(ctx, points, angle); } // 画起始箭头 if (link.getClient('arrow.from')) { twaver.Util.drawArrow(ctx, 12, 9, points, true, 'arrow.standard', true, 'gray', 0, 0, 1, 'black'); } // 画结束箭头 if (link.getClient('arrow.to')) { twaver.Util.drawArrow(ctx, 12, 9, points, false, 'arrow.standard', true, 'gray', 0, 0, 1, 'black'); } }, _paintBody: function (ctx, points, angle) { var link = this.getElement(), width = link.getStyle('link.width'), grow = width, outerColor = this.getOuterColor(); if (outerColor) { var outerWidth = link.getStyle('outer.width'); grow += outerWidth * 2; } var selectBorder = !this.getEditAttachment() && link.getStyle('select.style') === 'border' && this.getNetwork().isSelected(link); if (selectBorder) { var selectWidth = link.getStyle('select.width'); grow += selectWidth * 2; } ctx.lineCap = link.getStyle('link.cap'); ctx.lineJoin = link.getStyle('link.join'); // 画选中边框 if (selectBorder) { this.drawLinePoints(ctx, points, grow, link.getStyle('select.color')); } // 画边框 if (outerColor) { this.drawLinePoints(ctx, points, width + outerWidth * 2, outerColor); } // 画Link this.drawLinePoints(ctx, points, width, this.getInnerColor() || link.getStyle('link.color')); var fromFillPercent = link.getFromFillPercent(), toFillPercent = link.getToFillPercent(), fromFillColor = link.getFromFillColor(), toFillColor = link.getToFillColor(), from = points.get(0), to = points.get(1); var x = from.x + (to.x - from.x) / 2 * fromFillPercent, y = from.y + (to.y - from.y) / 2 * fromFillPercent; var middle = {x: x, y: y}; var fromPoints = new twaver.List([from, middle]); // 画起始填充色 this.drawLinePoints(ctx, fromPoints, width, fromFillColor); from = points.get(1); to = points.get(0); x = from.x + (to.x - from.x) / 2 * toFillPercent; y = from.y + (to.y - from.y) / 2 * toFillPercent; middle = {x: x, y: y}; var toPoints = new twaver.List([from, middle]); // 画结束填充色 this.drawLinePoints(ctx, toPoints, width, toFillColor); from = points.get(0); to = points.get(1); var scaleWidth = link.getClient('scaleWidth'), scaleColor = link.getClient('scaleColor'); // 画刻度 for (var i = 1, n = link.getClient('scaleNumbers') * 2; i < n; i++) { this.drawScaleLine(from, to, angle, width/2, ctx, i/n, scaleWidth, scaleColor); } // 画分隔线 this.drawScaleLine(from, to, angle, width, ctx, 0.5, 3, link.getClient('splitterColor')); } });
本文完整代码见附件:见原文最下方
发表评论
-
HTML5数据可视化第四弹:交互式地铁线路图
2016-12-13 15:25 982前言 最近特别忙, ... -
HTML5数据可视化第三弹:萌萌哒拓扑图分组
2016-12-02 09:55 2481前言 最近忙着给客户折腾一个复杂的多层嵌套关系。客 ... -
HTML5+WebGL 3D机房开发实例
2015-09-30 15:28 11624前阵子写了一篇HMTL5 3D ... -
HTML5 3D水源监控系统
2015-09-07 23:29 1388天津港爆炸事件后,除 ... -
看HTML5如何化解大型复杂网络拓扑图的分组嵌套效果
2015-06-25 14:12 3618忙完3D,最近又开始用HTML5给客户开发网管界面。这次客 ... -
HTML5数据可视化第二弹:打造最美3D机房
2015-06-01 14:25 12780最近项目开发任务告一段落,刚好有时间整理这大半年的一些成果 ... -
HTML5数据可视化第一弹:彩虹爆炸图
2015-05-19 15:23 8028前言 25年过去了,Brooks博士著名的“没有银 ... -
HTML5组织结构图之名片式网元布局
2015-05-07 11:43 2460组织结构图(Organization chart)是企业的 ... -
HTML5流程图之矢量可伸展workflow
2015-05-06 17:17 11458互联网购物成了当今非 ... -
HTML5流程图之复杂关系网
2015-05-06 17:10 2230关系网图的呈现方式多种多样,今天我们给大家分享的是和弦式的 ... -
数字图像处理技术在TWaver可视化中的应用
2015-04-16 14:30 712数字图像处理(Digital Image Processin ... -
用拓扑图呈现多层级关系图
2015-04-13 11:51 1670大部分拓扑图界面都有显示“分级呈现”的需求。一个复杂的系统或 ... -
TWaver GIS制作穹顶之下的雾霾地图
2015-03-18 14:31 754“我不满意,我不想等待,我也不再推诿,我要站出来做一点什么。 ... -
TWaver HTML5之树形布局
2015-03-11 10:53 1419转眼间春节假期已经过完,作为一个职业的程序猿,不知道大家有没 ... -
3D赛瓦号——整装待发!
2015-02-16 10:51 684随着岁末将至,twaver开发团队依旧马不停蹄,3d产品功 ... -
TWaver 3D应用于大型数据中心(续)
2015-02-04 12:00 953在2014年11月份,我们当时发了一篇有关TWaver HT ... -
TWaver动画之雷达扫描效果
2015-01-26 14:03 1590UI和功能是好的产品的两个重要因素,很多产品往往只注重功能上 ... -
HTML5 实现Link跳线效果
2015-01-15 14:01 1006之前我们推出过Flex版 ... -
在TWaver的Tree节点上画线
2015-01-13 10:27 948论坛上有同学提出如何在tree上画引导线,之前我们Flex已 ... -
22万个木箱!TWaver 3D极限压榨
2014-12-29 11:31 895打开个门户网站都千呼万唤,我们还能期待网页上的3D技术会有 ...
相关推荐
《TWaver HTML5 开发指南代码》是一份专为开发者准备的参考资料,它主要聚焦于如何利用TWaver库在HTML5环境下构建拓扑工具和机房展示应用。TWaver是一个强大的可视化框架,其核心特性是支持复杂的图形和网络图表的...
通过这些文件,开发者可以学习如何在HTML5环境中集成Twaver,创建交互式的可视化界面,包括添加图形元素、处理用户交互、响应事件、定制样式和布局等。同时,了解API文档可以帮助开发者掌握如何利用Twaver提供的类和...
Twaver学习案例的例子
在开发环境搭建部分,文档将引导开发者配置TWaver HTML5的运行环境,确保开发者能够顺利使用TWaver HTML5组件进行开发。 在快速上手章节中,文档将介绍一些约定俗成的开发惯例,帮助开发者快速熟悉TWaver HTML5的...
TWaver的图形组件库中提供了拓扑组件、地图组件、设备图组件,以及表格、树图、属性表、图表等丰富的通用图形界面组件,为电信运营支撑系统(OSS)的开发提供“一站式”的组件产品和解决方案,是快速设计、开发和...
3. **JavaScript编程**:TWaver库是用JavaScript编写,这意味着开发者需要熟悉JavaScript语法和面向对象编程,以创建和定制3D图形组件。 4. **3D图形组件**:TWaver提供的3D图形组件包括但不限于3D图表(如3D柱状图...
5. **报警系统模拟**:“alarm”可能是一个具体的应用场景,展示如何使用twaver.js来设计和实现报警系统的图形界面,包括节点的状态变化、事件响应等。 6. **交互操作**:学习如何利用twaver.js库实现图形元素的交互...
TWaver组件家族包括TWaver Java、TWaver Web、TWaver Flex、TWaver .NET、TWaver HTML5和TWaver GIS,覆盖了多种开发环境。本文主要讨论的是在Flex环境下的TWaver组件——TWaver Flex。 在配置TWaver Flex的开发...
TWaver HTML5(以下简称TWaver)使用HTML5技术和javascript语言,可在支持HTML5的浏览器上进行绘图。 使用TWaver前,需熟悉几个基本概念:图元(Element)、容器(DataBox)和画布(Network)。 图元:图形中的...
【标题】"twaver拓扑" 是一个基于HTML5技术的图形化工具,主要用于创建和展示复杂的网络拓扑结构。这个工具提供了丰富的图形类型,能够适应多种应用场景,如IT网络架构、工业控制系统、流程图等。它允许用户通过图形...
2. demo.jar:这是TWaver的演示示例程序的Java可执行文件,包含了用TWaver实现的各种图表和图形案例。 3. demo.sh:这是Linux或Mac OS下的Shell脚本,同样用于启动Demo程序,展示了TWaver跨平台的能力。 4. License....
对于在 Internet Explorer 浏览器中使用的情况,可能需要对弹出菜单进行定制,以适应不同的需求。 #### 总结 Twaver Web SVG 是一款强大的网络管理工具,它利用 SVG 技术实现了对电信网络的可视化管理。通过对该...
《TWaver Java 3.7 开发者指南》是一份详尽的技术文档,旨在为开发者提供使用TWaver Java 3.7版本进行网络、图表、数据管理和用户界面设计的全面指导。TWaver Java是一个功能丰富的可视化组件库,适用于构建复杂的...
5. `javadoc`:这个目录下是TWaver库的Java文档,详细解释了每个类、接口和方法的功能和用法,对开发者理解和使用TWaver的API非常有帮助。 6. `src`:源代码目录,可能包含了示例代码或者TWaver的部分源码,供...
【标题】"Twaver Web实例源码"是一个关于使用Twaver与ExtJS结合的Web应用程序开发的学习资源。Twaver是一款强大的图形化建模和可视化工具,常用于数据可视化、网络拓扑图、流程图等场景。ExtJS则是一个流行的...
- TWaver支持多种技术和平台,包括**Java**、**Flex**、**.NET**、**HTML5**和**Android**等。 - 这种跨平台的支持意味着TWaver可以被集成到不同的应用场景中,无论是桌面应用、Web应用还是移动应用,都能找到合适的...
4. **文档**:可能包含PDF或HTML格式的用户手册、API参考等,帮助开发者理解Twaver的类结构和方法,以及如何有效地使用它们。 5. **示例数据**:为了展示图表的构建和数据绑定,可能会提供一些示例数据文件,如XML或...
TWaver HTML5使用JavaScript语言开发,可运行在多种现代浏览器:IE9+, Firefox, Chrome, Safari, Opera。请原谅我 没有列出具体的版本号,现在浏览器更新换代太快,而TWaver HTML5面向的是现代和未来的浏览器,所以...
7. **API和插件开发**:深入研究Twaver的Java API,学习如何扩展和定制功能,创建自己的插件。 8. **国际化和多语言支持**:如果你的应用需要支持多种语言,那么理解Twaver的国际化特性是必要的。 9. **性能优化**:...