⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphdistancefilter.as

📁 用于flash/flex的 as3的 2D图形图像图表的动态生成
💻 AS
字号:
package flare.vis.operator.filter
{
	import flare.animate.Transitioner;
	import flare.vis.data.DataSprite;
	import flare.vis.data.EdgeSprite;
	import flare.vis.data.NodeSprite;
	import flare.vis.operator.Operator;
	
	import flash.utils.Dictionary;

	/**
	 * Filter operator that sets visible all items within a specified graph
	 * distance from a set of focus nodes.
	 */
	public class GraphDistanceFilter extends Operator
	{
		/** An array of focal NodeSprites. */
		public var focusNodes:/*NodeSprite*/Array;
		/** Graph distance within which which items wll be visible. */
		public var distance:int;
		/** Flag indicating which graph links to traverse. */
		public var links:int;
		
		/**
		 * Creates a new GraphDistanceFilter.
		 * @param focusNodes an array of focal NodeSprites. Graph distance is
		 *  measured as the minimum number of edge-hops to one of these nodes.
		 * @param distance graph distance within which items will be visible
		 * @param links flag indicating which graph links to traverse. The
		 *  default value is <code>NodeSprite.GRAPH_LINKS</code>.
		 */		
		public function GraphDistanceFilter(focusNodes:Array=null,
			distance:int=1, links:int=3/*NodeSprite.GRAPH_LINKS*/)
		{
			this.focusNodes = focusNodes;
			this.distance = distance;
			this.links = links;
		}
		
		/** @inheritDoc */
		public override function operate(t:Transitioner=null):void
		{
			t = (t==null ? Transitioner.DEFAULT : t);
	        
	        // initialize breadth-first traversal
	        var q:Array = [], depths:Dictionary = new Dictionary();
			for each (var fn:NodeSprite in focusNodes) {				
				depths[fn] = 0;
				fn.visitEdges(function(e:EdgeSprite):void {
					depths[e] = 1;
					q.push(e);
				}, links);
			}
			
			// perform breadth-first traversal
			var xe:EdgeSprite, xn:NodeSprite, d:int;
			while (q.length > 0) {
				xe = q.shift(); d = depths[xe];
				// -- fix to bug 1924891 by goosebumps4all
				if (depths[xe.source] == undefined) {
					xn = xe.source;
				} else if (depths[xe.target] == undefined) {
					xn = xe.target;
				} else {
					continue;
				}
				// -- end fix
				depths[xn] = d;
				
				if (d == distance) {
					xn.visitEdges(function(e:EdgeSprite):void {
						if (depths[e.target]==d && depths[e.source]==d) {
							depths[e] = d+1;
						}
					}, links);
				} else {
					xn.visitEdges(function(e:EdgeSprite):void {
						if (depths[e] == undefined) {
							depths[e] = d+1;
							q.push(e);
						}
					}, links);
				}
			}
			
			// now set visibility based on traversal results
	        visualization.data.visit(function(ds:DataSprite):void {
	        	var visible:Boolean = (depths[ds] != undefined);
	        	var alpha:Number = visible ? 1 : 0;
				var obj:Object = t.$(ds);
				
				obj.alpha = alpha;
				if (ds is NodeSprite) {
					var ns:NodeSprite = ds as NodeSprite;
					ns.expanded = (visible && depths[ds] < distance);
				}
				if (t.immediate) {
					ds.visible = visible;
				} else {
					obj.visible = visible;
				}
	        });
		}
		
	} // end of class GraphDistanceFilter
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -