TWaver初学实战——炫动2D机房之设备篇

有了机柜,下面就该上设备了。不过,这似乎也太简单,因为

设备面板就是个小灰块

……呃,还是再分几个区吧,要不实在太单调:

	drawPane: function(ctx) {
		ctx.fillStyle = this._borderColor;
		ctx.fillRect(
			this._panelData.x,
			this._panelData.y,
			this._panelData.w,
			this._panelData.h);
		ctx.fillStyle = this._centerPanelColor;
		ctx.fillRect(
			this._panelData.center.x,
			this._panelData.center.y,
			this._panelData.center.w,
			this._panelData.center.h);
		ctx.fillStyle = this._sidePaneColor;
		ctx.fillRect(
			this._panelData.left.x,
			this._panelData.left.y,
			this._panelData.left.w,
			this._panelData.left.h);
		ctx.fillRect(
			this._panelData.right.x,
			this._panelData.right.y,
			this._panelData.right.w,
			this._panelData.right.h);
	},

还是老路子,再

添加交互变化

	drawPane: function(ctx) {
		ctx.fillStyle = this._element._isFocus ? this._borderFocusColor : this._borderColor;
		……
		if(this._element._isFocus) {
			ctx.lineWidth = this._outlineWidth;
			ctx.strokeStyle = this._outlineColor;
			ctx.strokeRect(
				this._panelData.x - this._outlineWidth / 2,
				this._panelData.y - this._outlineWidth / 2,
				this._panelData.w + this._outlineWidth,
				this._panelData.h + this._outlineWidth);
		}
	},

  

接下来才是重点,那就是设备端口的绘制。首先

绘制电源端口

电源端口绘制在左右面板,单列纵向均匀排列:

	initPowerPorts: function() {
		var self = this;
		var count = this._element._powerPortAmount;
		var lCount = count && Math.ceil(count / 2);
		if(lCount) {
			for(i = 0; i < lCount; i++) {
				var number = i * 2 + 1;
				initPowerPort(this._panelData.left, lCount, number, i);
			}
		}
		var rCount = count && Math.floor(count / 2);
		if(rCount) {
			for(i = 0; i < rCount; i++) {
				var number = (i + 1) * 2;
				initPowerPort(this._panelData.right, rCount, number, i);
			}
		}
		function initPowerPort(panel, count, number, i) {
			var ph = 4;
			var gap = (panel.h0 - ph * count) / (count + 1);
			var start = gap + ph / 2;
			var offset = (panel.h0 - gap) / count;
			var port = ‘p‘ + number;
			var data = {
				x0: panel.x0 + panel.w0 / 2,
				y0: panel.y0 + start + offset * i,
				number: number,
				connected: self._element._connectedPowerPorts.indexOf(port) >= 0
			}
			self._portsData[port] = data;
			self.refreshPortLoc(port);
		}
	},

再用黄色标识出已连通的端口,一目了然:

			var data = port && this._portsData[port];
			if(data && port.charAt(0) == ‘p‘) {
				ctx.strokeStyle = data.connected ? this._powerPortColor : this._powerPortConnectedColor;
				ctx.lineWidth = 0.1;
				ctx.fillStyle = data.connected ? this._powerPortConnectedColor : this._powerPortColor;
				if(port == this._focusPort) {
					ctx.fillStyle = this._powerPortFocusColor;
				}
				this.drawPowerPort(ctx, data);
			}

  

  

接下来

绘制网络端口

网口绘制在中部面板,排列方式固定位置的办法,把所有可用的网口位置都标识出来,实际上占用多少就填充多少个,同样用不同的颜色表示已连通和未连通两种状态:

	initNetworkPorts: function() {
		var self = this;
		var cx0 = this._panelData.center.x0;
		var cy0 = this._panelData.center.y0;
		var cw0 = this._panelData.center.w0;
		var ch0 = this._panelData.center.h0;
		var xCount = this._networkPortRows;
		var xPh = 3;
		var xGap = (cw0 - xPh * xCount) / (xCount + 1);
		var xStart = xGap + xPh / 2;
		var xOffset = (cw0 - xGap) / xCount;
		var yCount = this._element._uCount;
		var yPh = 7;
		var yGap = (ch0 - yPh * yCount) / (yCount + 1);
		var yStart = yGap + yPh / 2;
		var yOffset = (ch0 - yGap) / yCount;
		for(j = 0; j < yCount; j++) {
			for(i = 0; i < xCount; i++) {
				var number1 = (xCount * j + i) * 2 + 1;
				initNetworkPort(number1, i, j, -2);
				var number2 = (xCount * j + i) * 2 + 2;
				initNetworkPort(number2, i, j, 2);
			}
		}
		function initNetworkPort(number, i, j, offset) {
			var port = ‘n‘ + number;
			var data = {
				x0: cx0 + xStart + xOffset * i,
				y0: cy0 + yStart + yOffset * j + offset,
				number: number,
				connected: self._element._connectedNetworkPorts.indexOf(port) >= 0,
				usable: number <= self._element._networkPortAmount
			}
			self._portsData[port] = data;
			self.refreshPortLoc(port);
		}
	},

  

这样一个设备面板就基本完成了

互动上似乎还可以再干点什么……那就

突出显示当前端口

	onMouseMove: function(e) {
		var eLoc = this._network.zoomManager._getLogicalPoint(e);
		this._UI.setFocusPort(eLoc);
	},
……
	getFocusPortByLoc: function(eLoc) {
		for(var port in this._portsData) {
			var data = this._portsData[port];
			var xDistance = Math.abs(data.x - eLoc.x);
			var yDistance = Math.abs(data.y - eLoc.y);
			if(port.charAt(0) == ‘p‘ && xDistance < 3 && yDistance < 2) {
				return port;
			}
			if(port.charAt(0) == ‘n‘ && xDistance < 1.5 && yDistance < 1.5) {
				return port;
			}
		}
		return null;
	},

  

如果大家对设计和配色有槽要吐,那也是可以理解的,毕竟我只是个普通的程序猿。

这个虚拟设备面板的可取之处,在于它的U高和端口数量都可以定制,有着极大的灵活性和实用性。

	var rackDatas = [{
		id: ‘rackbin1‘,
		name: ‘机柜1‘,
		uAmount: 30,
		children: [{
			id: ‘device11‘,
			name: ‘设备1‘,
			uStart: 2,
			uCount: 2,
			powerPortAmount: 3,
			networkPortAmount: 7,
			connectedPowerPorts: [‘p1‘],
			connectedNetworkPorts: [‘n2‘, ‘n4‘, ‘n6‘]
		}, {
			id: ‘device12‘,
			name: ‘设备2‘,
			uStart: 10,
			uCount: 3,
			powerPortAmount: 4,
			networkPortAmount: 51,
			connectedPowerPorts: [‘p2‘,‘p3‘],
			connectedNetworkPorts: [‘n10‘, ‘n11‘, ‘n12‘, ‘n13‘, ‘n14‘]
		}, {
			id: ‘device13‘,
			name: ‘设备3‘,
			uStart: 20,
			uCount: 4,
			powerPortAmount: 5,
			networkPortAmount: 51,
			connectedPowerPorts: [‘p2‘,‘p3‘,‘p4‘],
			connectedNetworkPorts: []
		}]
	}];

最后再看看连排设备的效果:

时间: 2024-11-09 22:10:49

TWaver初学实战——炫动2D机房之设备篇的相关文章

TWaver初学实战——2D机房之机柜篇

前一段参与了一个2D机房的项目,但是这种"命题作文"总感觉憋屈,那就回咱这主场再发挥发挥! 第一篇,咱就从机柜下手. --机柜似乎有点太简单了,因为 机柜就是个大灰框 drawBorder: function(ctx) { ctx.fillStyle = 'gray'; ctx.fillRect( this._rackX, this._rackY, this._rackOuterWidth, this._rackOuterHeight); ctx.clearRect( this._ra

TWaver初学实战——如何在EasyUI中插入TWaver(续)

上次文章虽然简单易懂,但很有些小伙伴不满意:你这TWaver和EasyUI结合,只不过生硬地把TWaver图形插进去了,数据和人家EasyUI没一毛钱关系.嘿嘿,不就是想发生关系嘛,没问题啊!咱就还用原来的EasyUI的代码,看看怎么把它表格中的数据用拓扑的方式显示出来. 在本机发布web程序 这次再干咱要有新路,不能再把数据写到代码里了,乱乱乎乎的很不专业,必须原汁原味就用json文件.别小看这一改变,需要在本机搭建服务器,要是原来没接触还真得忙活一阵子.不过这些工作可不白做,那是玩网页开发的

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

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

五行代码实现 炫动滑动 卡片层叠布局,仿探探、人人影视订阅界面 简单&amp;优雅:LayoutManager+ItemTouchHelper

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/53730908 本文出自:[张旭童的博客](http://blog.csdn.net/zxt0601) 代码传送门:喜欢的话,随手点个star.多谢 https://github.com/mcxtzhang/LayoutManagerDemo 概述 前几天看有人实现了仿人人美剧的订阅界面,不过在细节之处以及实现方式我个人认为都不是最佳的姿势. 于是我也动手撸了一个,还顺带撸了个探探的界面

(android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图

(android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图 http://www.cnblogs.com/macroxu-1982/archive/2011/09/13/2174657.html 实现效果: 获取手机gps当前的位置,显示位置对于的google地图. 具体的步骤: 1 Step One  创建包含MapView控件的应用界面 <com.google.android.maps.MapView android:layout_width="fill

机房合作——感悟篇

机房合作已经做了很长时间了,但也就是这几天正式进入状态了.看着我们的合作越来越默契,心里别提多高兴了.丹丹渐渐的能看懂我的图了,建建也不会自己加方法了,我画的图也不会丢三落四的.小伙伴们越来越有默契了,我的一点感受,与大家分享. 适当"间作套种",千万别搁置 从7月开始准备专业课考试之前,我就着手画图了.当时的感觉跟前两次画图没什么差别,一直心想着能不能偷懒少画点图,省个事儿.所以一直不慌不忙地一边看牛腩一边画图,之后就是准备专业课考试--考试--放假,画图基本上就是搁置了.等到放假回

.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新手朋友),但是转念一想不如来点猛的(考虑到急性子的朋友),让你通过本文的学习就能快速的入门ASP.NET Core.既然是快速入门所以过多过深的内容我这里就一笔带过了!然后在后面的一些列文章中再慢慢的对其中的概念进行阐述. 本文已收录至.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规

Android使用SVG矢量图打造酷炫动效!

尊重原创,欢迎转载,转载请注明: FROM  GA_studio   http://blog.csdn.net/tianjian4592 一个真正酷炫的动效往往让人虎躯一震,话不多说,咱们先瞅瞅效果: 这个效果我们需要考虑以下几个问题: 1. 这是图片还是文字: 2. 如果是图片该如何拿到图形的边沿线坐标,如果是文字呢? 3. 如果拿到了边沿线坐标,如何让光线沿着路径跑动: 4. 怎么处理过程的衔接: 以上四个问题似乎不是太好处理,而这几个问题也正好是这个效果精华所在,接下来咱们一个一个进行考虑

Android 4.4.2引入的超炫动画库

概述 Scene Transition TransitionManager 常用API 1.4.1. AutoTransition 1.4.2. ChangeBounds 1.4.3. ChangeClipBounds 1.4.4. ChangeImageTransform 1.4.5. ChangeScroll 1.4.6. ChangeTransform 1.4.7. Explode 1.4.8. Fade 1.4.9. Slide 1.4.10. TransitionSet 1.4.11.