`
shlei
  • 浏览: 288653 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

仿IBM-BPM Monitor实现的demo

阅读更多
    前段时间根据公司要求做一个工作流方面的demo,遂模仿IBM的BPM Monitor做了一个demo。因Company Secret原因,不能公开全部源码,现将部分代码贴于此,供各位大虾点评。

画线代码:
package com
{
	import flash.geom.Point;
	
	import mx.controls.Text;
	import mx.core.UIComponent;
	/**
	 * 
	 * 控制流程图的画线
	 * 
	 * */
	public class Line extends UIComponent
	{
		/** 线段的显示文本 **/
		public var label:String;
		/** 箭头大小 **/
		public var arrowSize:uint = 3;
		/** 线的颜色 **/
		public var lineColor:uint = 0xffffff;
		/** 箭头方向 **/
		private var aspect:int=1;
		/** 开始的一段直线长度 **/
		private var startLine:int=10;
		/** 线的名称 **/
		private var _label:Text;
		/** 开始节点 **/
		private var startPoint:Point;
		/** 结束节点 **/
		private var endPoint:Point;
		/** 线段连接的开始节点名称 **/
		public var fromNode:String;
		/** 线段连接的结束节点名称 **/
		public var toNode:String;
		
		/** 初始化文本样式 **/
		private static var classConstructed:Boolean = Nodes.initStyles();
		
		public function Line()
		{
			super();
		}

		/** 创建组建的子组件 **/
		override protected function createChildren():void{
			super.createChildren();
			
			if(!_label){
				_label=new Text();
				var textStyleName:*=getStyle("textStyleName");
				_label.styleName=textStyleName?textStyleName:this;
				
				addChild(_label);
			}
		}

		/** 更改属性 **/
		override protected function commitProperties():void{
			super.commitProperties();
			
			if(_label){
				_label.text=label;
			}
		}
		
		/** 在组建中画出子组件,并确定子组件在组件中的位置和大小 **/
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
			super.updateDisplayList(unscaledWidth,unscaledHeight);
			
			if(!_label)
				return;
			//endPoint.x-startPoint.x,endPoint.y-startPoint.y
			_label.move(0,0);
			_label.setActualSize(width,30);
		}

		/** 带箭头的线 **/
		private function drawLine(startPoint:Point,endPoint:Point,startL:int):void{
			getLine(startPoint,endPoint,startL);
			drawArrowHead(startPoint,endPoint);
		}

		/** 自定义画线 **/
		public function cusLine(arr:Array):void{
			var len:int=arr.length;
			
			if(len==0)return;
			
			if(len==1){
				var p:Object=arr[0] as Object;
				
				this.graphics.clear();//清除之前的画线痕迹
				
				drawLine(p.sPoint as Point,p.ePoint as Point,p.sLine as int);
				return;
			}
			
			for(var i:int=0;i<arr.length;i++){
				var points:Object=arr[i] as Object;
				getLine(points.sPoint as Point,points.ePoint as Point,points.sLine as int);
			}
			drawArrowHead(Object(arr[len-1]).sPoint as Point,Object(arr[len-1]).ePoint as Point);
		}

		/** 画线 **/
		private function getLine(startPoint:Point,endPoint:Point,startL:int):void{
			this.startPoint=startPoint;
			this.endPoint=endPoint;
			if(startL>0)
				startLine=startL;
			
			this.graphics.moveTo(startPoint.x,startPoint.y);
			this.graphics.lineStyle(2,lineColor,0.7);
			//用于确定根据开始节点和结束节点画出的线是否是直线
			if(startPoint.x==endPoint.x||startPoint.y==endPoint.y){
				this.graphics.lineTo(endPoint.x,endPoint.y);
				//确定箭头的方向
				if(startPoint.y==endPoint.y&&startPoint.x<endPoint.x)
					aspect=1;//箭头向右
				else if(startPoint.y==endPoint.y&&startPoint.x>endPoint.x)
					aspect=2;//箭头向左
				else if(startPoint.y>endPoint.y&&startPoint.x==endPoint.x)
					aspect=3;//箭头向上
				else
					aspect=4;//箭头向下
			}else{
				//开始节点横坐标小于结束节点时
				if(startPoint.x<endPoint.x){
					aspect=1;
					this.graphics.lineTo(startPoint.x+startLine,startPoint.y);
					//开始节点纵坐标小于结束节点时,改变弧线的方向
					if(startPoint.y<endPoint.y){
						this.graphics.curveTo(startPoint.x+startLine+10,startPoint.y,startPoint.x+startLine+10,startPoint.y+10);
						this.graphics.lineTo(startPoint.x+startLine+10,endPoint.y-10);
						this.graphics.curveTo(startPoint.x+startLine+10,endPoint.y,startPoint.x+startLine+20,endPoint.y);
					}else{
						this.graphics.curveTo(startPoint.x+startLine+10,startPoint.y,startPoint.x+startLine+10,startPoint.y-10);
						this.graphics.lineTo(startPoint.x+startLine+10,endPoint.y+10);
						this.graphics.curveTo(startPoint.x+startLine+10,endPoint.y,startPoint.x+startLine+20,endPoint.y);
					}
					this.graphics.lineTo(endPoint.x,endPoint.y);
				}else{//开始节点横坐标大于结束节点时
					aspect=2;
					this.graphics.lineTo(startPoint.x-startLine,startPoint.y);
					if(startPoint.y<endPoint.y){
						this.graphics.curveTo(startPoint.x-startLine-10,startPoint.y,startPoint.x-startLine-10,startPoint.y+10);
						this.graphics.lineTo(startPoint.x-startLine-10,endPoint.y-10);
						this.graphics.curveTo(startPoint.x-startLine-10,endPoint.y,startPoint.x-startLine-20,endPoint.y);
					}else{
						this.graphics.curveTo(startPoint.x-startLine-10,startPoint.y,startPoint.x-startLine-10,startPoint.y-10);
						this.graphics.lineTo(startPoint.x-startLine-10,endPoint.y+10);
						this.graphics.curveTo(startPoint.x-startLine-10,endPoint.y,startPoint.x-startLine-20,endPoint.y);
					}
					this.graphics.lineTo(endPoint.x,endPoint.y);
				}
			}
			startLine=10;//还原初始值
		} 
		
		/** 画箭头 **/
		private function drawArrowHead(startPoint:Point,endPoint:Point):void{
			//得到箭头的角度
			var angle:Number  = this.getAngle(startPoint,endPoint);
			var centerX:Number = endPoint.x - arrowSize * Math.cos(angle*(Math.PI/180));
			var centerY:Number = endPoint.y + arrowSize * Math.sin(angle*(Math.PI/180));
			
		 	var leftX:Number = centerX + arrowSize * Math.cos((angle+120)*(Math.PI/180));
			var leftY:Number = centerY - arrowSize * Math.sin((angle+120)*(Math.PI/180));
			var rightX:Number = centerX + arrowSize * Math.cos((angle+240)*(Math.PI/180));
			var rightY:Number = centerY - arrowSize * Math.sin((angle+240)*(Math.PI/180)); 
			
			this.graphics.lineStyle(2,lineColor,1);
			
			this.graphics.moveTo(endPoint.x,endPoint.y);
			
			this.graphics.lineTo(leftX,leftY);
			this.graphics.lineTo(centerX,centerY);

			this.graphics.lineTo(rightX,rightY);
			this.graphics.lineTo(endPoint.x,endPoint.y);
		}
		
		/** 得到箭头的角度 **/
		private function getAngle(startPoint:Point,endPoint:Point):Number{
			var temX:Number = 0;
			var temY:Number = 0;
			//调整箭头方向
			switch(aspect){
				case 1:
					//箭头向右
					temX= endPoint.x - (endPoint.x-10);
					temY= endPoint.y - endPoint.y;
					break;
				case 2:
					//箭头向左
					temX= endPoint.x - (endPoint.x+10);
					temY= endPoint.y - endPoint.y;
					break;
				case 3:
					//箭头向上
					temX= endPoint.x - endPoint.x;
					temY= endPoint.y - (endPoint.y-10);
					break;
				case 4:
					//箭头向下
					temX= endPoint.x - endPoint.x;
					temY= endPoint.y - (endPoint.y+10);
					break;
			}
			var angle:Number = Math.atan2(temY,temX)*(180/Math.PI)
			return angle;
		}
		
		/** 删除 **/
		public function removeLine():void{
			this.graphics.clear();
		}
		
	}
}

  • 大小: 52.5 KB
  • 大小: 34.2 KB
3
0
分享到:
评论
7 楼 421081646 2012-08-08  
挺好的,学习中
6 楼 shlei 2011-03-07  
andy_ghg 写道
shlei 写道
andy_ghg 写道
我写了一个类似的东西,不过不是用来做流程设计的,是用来展现数据的,不过基础组件应该是差不多的,不过我现在遇到一个问题,就是那个工作区的问题,我现在想做成跟BPM一样的工作区,就是将组件拖拽至边缘后会自动出现滚动条。我现在基本上都做的差不多了,就差这一个实现了,想请教一下你是怎么做的,我现在用的是Flexlib里面的DragCanvas这个开源的组件,但是做scale的时候会出现问题,所以想自己写一个。

留个Email,andy_ghg@163.com希望在这方面能多交流,我这边完成的组件有Node,Line,ZoomPanel(就是缩略图)。线是带箭头且不深入到节点内部的,Node是用的FXG做图标的。

那个我暂时还没有做出来,我在做业务方面的东西,不过我有个思路:你把你的流程图的容器的宽定义为距离容器原点横坐标最远的节点X轴加上节点的宽度,纵坐标也一样,然后再给流程图所在容器的父容器加一个slider,当流程图容器被拖拽超出流程图容器的父容器时,slider增加长度,这个slider有属性可以设置。


好的,谢谢你的提醒,我一会去试试,最近在做SSO,搞得头大,好久没忙活前端了。

不好意思,我说的是scroller,不是slider,之前打错了。
5 楼 andy_ghg 2011-03-06  
shlei 写道
andy_ghg 写道
我写了一个类似的东西,不过不是用来做流程设计的,是用来展现数据的,不过基础组件应该是差不多的,不过我现在遇到一个问题,就是那个工作区的问题,我现在想做成跟BPM一样的工作区,就是将组件拖拽至边缘后会自动出现滚动条。我现在基本上都做的差不多了,就差这一个实现了,想请教一下你是怎么做的,我现在用的是Flexlib里面的DragCanvas这个开源的组件,但是做scale的时候会出现问题,所以想自己写一个。

留个Email,andy_ghg@163.com希望在这方面能多交流,我这边完成的组件有Node,Line,ZoomPanel(就是缩略图)。线是带箭头且不深入到节点内部的,Node是用的FXG做图标的。

那个我暂时还没有做出来,我在做业务方面的东西,不过我有个思路:你把你的流程图的容器的宽定义为距离容器原点横坐标最远的节点X轴加上节点的宽度,纵坐标也一样,然后再给流程图所在容器的父容器加一个slider,当流程图容器被拖拽超出流程图容器的父容器时,slider增加长度,这个slider有属性可以设置。


好的,谢谢你的提醒,我一会去试试,最近在做SSO,搞得头大,好久没忙活前端了。
4 楼 shlei 2011-01-07  
andy_ghg 写道
我写了一个类似的东西,不过不是用来做流程设计的,是用来展现数据的,不过基础组件应该是差不多的,不过我现在遇到一个问题,就是那个工作区的问题,我现在想做成跟BPM一样的工作区,就是将组件拖拽至边缘后会自动出现滚动条。我现在基本上都做的差不多了,就差这一个实现了,想请教一下你是怎么做的,我现在用的是Flexlib里面的DragCanvas这个开源的组件,但是做scale的时候会出现问题,所以想自己写一个。

留个Email,andy_ghg@163.com希望在这方面能多交流,我这边完成的组件有Node,Line,ZoomPanel(就是缩略图)。线是带箭头且不深入到节点内部的,Node是用的FXG做图标的。

那个我暂时还没有做出来,我在做业务方面的东西,不过我有个思路:你把你的流程图的容器的宽定义为距离容器原点横坐标最远的节点X轴加上节点的宽度,纵坐标也一样,然后再给流程图所在容器的父容器加一个slider,当流程图容器被拖拽超出流程图容器的父容器时,slider增加长度,这个slider有属性可以设置。
3 楼 andy_ghg 2011-01-07  
我写了一个类似的东西,不过不是用来做流程设计的,是用来展现数据的,不过基础组件应该是差不多的,不过我现在遇到一个问题,就是那个工作区的问题,我现在想做成跟BPM一样的工作区,就是将组件拖拽至边缘后会自动出现滚动条。我现在基本上都做的差不多了,就差这一个实现了,想请教一下你是怎么做的,我现在用的是Flexlib里面的DragCanvas这个开源的组件,但是做scale的时候会出现问题,所以想自己写一个。

留个Email,andy_ghg@163.com希望在这方面能多交流,我这边完成的组件有Node,Line,ZoomPanel(就是缩略图)。线是带箭头且不深入到节点内部的,Node是用的FXG做图标的。
2 楼 shlei 2010-12-27  
rongxh2010 写道
Point这个类的代码贴来看看,呵呵

不好意思,因为是在公司做的,所以有相关的保密约束,不过我可以贴出来小部分代码,剩下的就要你举一反三了。
graphics.clear();
			graphics.lineStyle(2,lineColor,1);
			
			var fillType:String=GradientType.LINEAR;
			var color:Array=[0XFFFFFF, 0XCDE891];
			var alphas:Array=[1,1];
			var ratios:Array=[0x00,0xff];
			var matr:Matrix=new Matrix();
			matr.createGradientBox(width,height,Math.PI/4,0,0);
			var spreadMethod:String=SpreadMethod.PAD;
			graphics.beginGradientFill(fillType,color,alphas,ratios,matr,spreadMethod);
			
			graphics.drawCircle(unscaledWidth/2,CIRCLE_RADIUS,CIRCLE_RADIUS);
			graphics.endFill();
1 楼 rongxh2010 2010-12-25  
Point这个类的代码贴来看看,呵呵

相关推荐

    仿IBM-BPM Editor实现的WorkFlowEditor

    【标题】"仿IBM-BPM Editor实现的WorkFlowEditor"是一个关于流程编辑器开发的项目,旨在模仿IBM的Business Process Manager (BPM)编辑器的功能。这个编辑器主要用于设计、编辑和管理工作流,它是业务流程自动化的...

    ibm-pc汇编语言程序设计教程参考答案

    ibm-pc汇编语言程序设计教程参考答案ibm-pc汇编语言程序设计教程参考答案ibm-pc汇编语言程序设计教程参考答案ibm-pc汇编语言程序设计教程参考答案ibm-pc汇编语言程序设计教程参考答案ibm-pc汇编语言程序设计教程参考...

    ibm-java-sdk-8.0-5.11-x86_64-archive.bin

    ibm-java-sdk-8.0-5.11-x86_64-archive.bin ibm的jdk 8.0版本

    ibm-java-ppc64-sdk-7.0-10.50

    1. **下载与准备**:首先,你需要从IBM官方网站或者其他可信赖的来源下载`ibm-java-ppc64-sdk-7.0-10.50.bin`这个二进制文件。这个文件是安装程序的载体,包含了所有必要的组件。 2. **赋予执行权限**:由于AIX系统...

    IBM Thread and Monitor Dump Analyzer (TMDA)

    IBM Thread and Monitor Dump Analyzer (TMDA) 是一个专门用于分析Java应用程序的线程和监控器转储的工具。在Java应用开发和运维过程中,线程 dump 是诊断和解决性能问题、死锁、线程阻塞等关键问题的重要手段。TMDA...

    IBM-MQ项目DEMO和Jar包.zip

    此“IBM-MQ项目DEMO和Jar包.zip”压缩包显然包含了与IBM MQ相关的示例代码和必要的JAR库文件,用于帮助开发者理解和使用IBM MQ。 首先,让我们来详细探讨IBM MQ的核心概念和技术特性: 1. **消息中间件**:IBM MQ...

    在spring boot中使用jms集成IBM-MQ和TLQ,包含普通队列和主题订阅两种模式,并实现按需加载

    1) 本工程主要演示在SPRING BOOT工程中怎样使用JMS集成IBM-MQ及TLQ两种消息中间件产品 2) 使用SPRING BOOT Conditional机制实现了两种产品按需加载,工程会根据配置文件开关动态加载 3) 实现了普通队列消息发送与...

    ibm-java-x86_64-sdk-8.0-5.16.bin

    linux 64位IBM JDK1.8 linux 64位

    IBM-WWPMM方法论

    IBM-WWPMM方法论 IBM-WWPMM方法论 基本概念 项目计划 项目授权书 组建项目团队 构建项目管理主计划框架 完成工作分解(WBS) 进行风险识别、制定风险管理计划 修订WBS并估算每一项任务的成本(时间) 确定任务间的...

    因素与员工离职和绩效有关(数据集)-ibm-hr-analytics-attrition-dataset.zip

    因素与员工离职和绩效有关(数据集)-ibm-hr-analytics-attrition-dataset.zip因素与员工离职和绩效有关(数据集)-ibm-hr-analytics-attrition-dataset.zip因素与员工离职和绩效有关(数据集)-ibm-hr-analytics-...

    IBM-Full官方Visio形状

    【IBM-Full官方Visio形状】是一套专为IBM产品设计的Visio形状库,它包含了大量的图形元素,用于在Microsoft Visio中绘制IBM相关的系统架构、网络拓扑、流程图和其他技术图表。这些形状可以帮助IT专业人员更直观地...

    IBM-PC汇编语言程序设计(第五版)

    - 本书可能会介绍如何通过中断服务程序(ISR)或者系统调用来实现对操作系统服务的调用,这对于开发能够在IBM-PC上运行的应用程序来说非常重要。 5. **调试与优化** - 编写高质量的汇编语言程序往往需要经过多次...

    ibm-java-jre-6.0-16.30-linux-i386.bin

    ibm-java-jre-6.0-16.30-linux-i386.binibm-java-jre-6.0-16.30-linux-i386.bin

    ibm-semeru-open-jdk_x64_mac_11.0.16_8_openj9-0.33.0.tar.gz

    ibm open j9的虚拟机包(mac os x64)

    TMDA--ibm thread and monitor dump analyzer

    ibm thread and monitor dump analyzer https://www.ibm.com/support/pages/ibm-thread-and-monitor-dump-analyzer-java-tmda

    IBM-PC汇编语言程序设计实验报告1

    根据提供的文件信息,本篇将围绕“IBM-PC汇编语言程序设计实验报告1”进行深入探讨,重点解析四个子程序的功能实现以及如何通过主程序完成一个简单的乐曲程序。 ### 一、实验背景 在计算机科学领域,汇编语言是一...

    IBM-PC汇编语言实验报告

    在IBM-PC汇编语言中,这通常通过定义数据段(datarea segment)并存储字符序列来实现。例如,定义两个字符串string1和string2,并使用db指令分配存储空间并赋值。字符的显示则通过调用DOS中断服务,如INT 21H的AH=09...

    64位linux上的ibm-java2-x86_64-jre-5.0-13.1.x86_64

    ibm-java2-x86_64-jre-5.0-13.1.x86_64.rpm

    IBM-PC汇编语言程序设计例题习题集(非常清晰)

    ( 清华大学 《IBM-PC 汇编语言程序设计(第二版)》 沈美明 温冬婵 编著)。 PS1:本人还上传了配套的PPT课件。 绝对的物有所值! PS2:本系列资源上传一共有3个:  1\汇编语言教程. 2\配套习题集. 3\PPT...

Global site tag (gtag.js) - Google Analytics