`
zl-2577
  • 浏览: 80214 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

最近研究了关于web流程图设计的一个开源项目mxgraph

阅读更多

      领导有一个搞内控流程优化的思路,找我问问有没有什么想法。想将公司后台的风险库,控制库,组织机构等与内控流程联系起来,用的比较普遍的流程图设计软件就visio了。有没有一个办法可以把visio嵌入到B/S系统中呢。

      带着这个疑问到网络上试着搜索着。突然一个词进入我的视线--mxgraph。B/S结构,可以加泳道,多种图形形状和图片,支持导出图片等支持一定让这个web流程设计项目增色不少。于是决定找了一个破解版本下来研究研究。

      在本机搭好环境后,拿给咨询部的同事看了看,觉得不错,要是支持visio里德标准流程图的图元就好了。于是仔细看了看它底层画图用的是vml,就有一点信心按照自己的想法画些图元出来了。说干就干。于是就开始了图元创造。

mxclient.js这个文件是mxgraph的核心的js文件。那些图元及编辑器等就是在这里边定义的。

首先声明几个形状

//create shape by ryan start ----------
	SHAPE_RYAN: 'ryan',
	SHAPE_STORAGE: 'storage',
                SHAPE_RECORD : 'record',
	SHAPE_TAPE : 'tape',
	SHAPE_HANDINPUT : 'handinput',
	SHAPE_HANDOPERATOR : 'handoperator',
	SHAPE_DATA: 'data',
	SHAPE_CIRCULATION: 'circulation',
	SHAPE_CARD: 'card',
	SHAPE_PREFLOW : 'preflow',
	SHAPE_INTERNALSTORAGE : 'internalstorage',
//create shape by ryan end ----------

 让这些形状继承默认的形状

//create shape by ryan start --------------------------------
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_RYAN] = mxRyan;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_STORAGE] = mxStorage;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_RECORD] = mxRecord;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_TAPE] = mxTape;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_HANDINPUT] = mxHandInput;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_HANDOPERATOR] = mxHandOperator;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_DATA] = mxData;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_CIRCULATION] = mxCirculation;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_CARD] = mxCard;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_PREFLOW] = mxPreflow;
mxCellRenderer.prototype.defaultShapes[mxConstants.SHAPE_INTERNALSTORAGE] = mxInternalStorage;
//create shape by ryan end --------------------------------

 下面是这些形状的具体画法的方法

//create shape by ryan start----------------------------------------

function mxRyan(bounds, fill, stroke, strokewidth){
    this.bounds = bounds;
    this.fill = fill;
    this.stroke = stroke;
    this.strokewidth = strokewidth || 1;
};
mxRyan.prototype = new mxActor();
mxRyan.prototype.constructor = mxActor;
mxRyan.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, h);//start from 
	path.lineTo(0, 0);// line to 
	path.lineTo(w, 0);// line to
	path.lineTo(w, h);//line to
	path.curveTo(w * 0.4, h  - w * 0.20 , 2.4 * w * 0.20, h + w * 0.20 , 0, h);// radian 
	path.close();
};

function mxTape(bounds, fill, stroke, strokewidth){
	this.bounds = bounds;
	this.fill = fill;
	this.stroke = stroke;
	this.strokewidth = strokewidth || 1;
};
mxTape.prototype = new mxActor();
mxTape.prototype.constructor = mxActor;
mxTape.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, h);
	path.lineTo(0, 0);
	path.curveTo(w * 0.4, w * 0.20 , 2.8 *  w * 0.20, - w * 0.20 , w, 0);
	path.lineTo(w, h);
	path.curveTo(w * 0.4, h  - w * 0.20 , 2.4 * w * 0.20, h + w * 0.20 , 0, h);
	path.close();
};

function mxStorage(bounds, fill, stroke, strokewidth){
	this.bounds = bounds;
	this.fill = fill;
	this.stroke = stroke;
	this.strokewidth = strokewidth || 1;
};
mxStorage.prototype = new mxActor();
mxStorage.prototype.constructor = mxActor;
mxStorage.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, 0);
	path.curveTo(0, 0, -0.26 * w, 0.50 * h, 0, h);
	path.lineTo(w, h);
	path.curveTo(w, h, 0.74 * w, 0.50 * h, w, 0);
	path.lineTo(w, 0);
    	path.close();
};

function mxRecord(bounds, fill, stroke, strokewidth){
   	this.bounds = bounds;
    	this.fill = fill;
    	this.stroke = stroke;
    	this.strokewidth = strokewidth || 1;
};
mxRecord.prototype = new mxActor();
mxRecord.prototype.constructor = mxActor;
mxRecord.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, 0);
	path.curveTo(0, 0, -0.26 * w, 0.50 * h, 0, h);
	path.lineTo(w, h);
	path.curveTo(w, h, 0.74 * w, 0.50 * h, w, 0);
	path.curveTo(w, 0, 1.24 * w, 0.50 * h, w, h);
	path.curveTo(w, h, 0.74 * w, 0.50 * h, w, 0);
    	path.close();
};

function mxHandInput(bounds, fill, stroke, strokewidth){
    	this.bounds = bounds;
    	this.fill = fill;
    	this.stroke = stroke;
    	this.strokewidth = strokewidth || 1;
};
mxHandInput.prototype = new mxActor();
mxHandInput.prototype.constructor = mxActor;
mxHandInput.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, h/2);
	path.lineTo(0, h);
	path.lineTo(w, h);
	path.lineTo(w, 0);
    	path.close();
};

function mxHandOperator(bounds, fill, stroke, strokewidth){
    	this.bounds = bounds;
   	this.fill = fill;
    	this.stroke = stroke;
    	this.strokewidth = strokewidth || 1;
};
mxHandOperator.prototype = new mxActor();
mxHandOperator.prototype.constructor = mxActor;
mxHandOperator.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, 0);
	path.lineTo(w * 0.25, h);
	path.lineTo(w * 0.75, h);
	path.lineTo(w, 0);
    	path.close();
};

function mxData(bounds, fill, stroke, strokewidth){
    	this.bounds = bounds;
    	this.fill = fill;
    	this.stroke = stroke;
    	this.strokewidth = strokewidth || 1;
};
mxData.prototype = new mxActor();
mxData.prototype.constructor = mxActor;
mxData.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(w * 0.125, 0);
	path.lineTo(-w * 0.125, h);
	path.lineTo(w * 0.875, h);
	path.lineTo(w * 1.125, 0);
    	path.close();
};

function mxCirculation(bounds, fill, stroke, strokewidth){
    	this.bounds = bounds;
    	this.fill = fill;
    	this.stroke = stroke;
    	this.strokewidth = strokewidth || 1;
};
mxCirculation.prototype = new mxActor();
mxCirculation.prototype.constructor = mxActor;
mxCirculation.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, h / 3);
	path.lineTo(0, h);
	path.lineTo(w, h);
	path.lineTo(w, h /3);
	path.lineTo(w /5 * 4, 0);
	path.lineTo(w /5, 0);
    	path.close();
};

function mxCard(bounds, fill, stroke, strokewidth){
    	this.bounds = bounds;
    	this.fill = fill;
    	this.stroke = stroke;
    	this.strokewidth = strokewidth || 1;
};
mxCard.prototype = new mxActor();
mxCard.prototype.constructor = mxActor;
mxCard.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, h / 3);
	path.lineTo(0, h);
	path.lineTo(w, h);
	path.lineTo(w, 0);
	path.lineTo(w /5, 0);
    	path.close();
};

function mxPreflow(bounds, fill, stroke, strokewidth){
    	this.bounds = bounds;
    	this.fill = fill;
    	this.stroke = stroke;
    	this.strokewidth = strokewidth || 1;
};
mxPreflow.prototype = new mxActor();
mxPreflow.prototype.constructor = mxActor;
mxPreflow.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, 0);
	path.lineTo(0, h);
	path.lineTo(w, h);
	path.lineTo(w, 0);
	path.lineTo(0, 0);
	path.moveTo(w /7 , 0);
	path.lineTo(w /7 , h);
	path.moveTo(w /7 * 6 , 0);
	path.lineTo(w /7 * 6 , h);
    	path.close();
};

function mxPreflow(bounds, fill, stroke, strokewidth){
    	this.bounds = bounds;
    	this.fill = fill;
    	this.stroke = stroke;
    	this.strokewidth = strokewidth || 1;
};
mxPreflow.prototype = new mxActor();
mxPreflow.prototype.constructor = mxActor;
mxPreflow.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, 0);
	path.lineTo(0, h);
	path.lineTo(w, h);
	path.lineTo(w, 0);
	path.lineTo(0, 0);
	path.moveTo(w /7 , 0);
	path.lineTo(w /7 , h);
	path.moveTo(w /7 * 6 , 0);
	path.lineTo(w /7 * 6 , h);
    	path.close();
};

function mxInternalStorage(bounds, fill, stroke, strokewidth){
    	this.bounds = bounds;
    	this.fill = fill;
    	this.stroke = stroke;
    	this.strokewidth = strokewidth || 1;
};
mxInternalStorage.prototype = new mxActor();
mxInternalStorage.prototype.constructor = mxActor;
mxInternalStorage.prototype.redrawPath = function(path, x, y, w, h){
	path.moveTo(0, 0);
	path.lineTo(0, h);
	path.lineTo(w, h);
	path.lineTo(w, 0);
	path.lineTo(0, 0);
	path.moveTo(w /7 , 0);
	path.lineTo(w /7 , h);
	path.moveTo(0 , w / 7);
	path.lineTo(w, w / 7);
    	path.close();
};


//create shape by ryan end ----------

 

 然后我们再GraphEditor.js中添加到库中

 

//create shape by ryan 
	insertVertexTemplate(library, graph, '文档', 'images/ryan.gif', 'shape=ryan', 80, 60);
	insertVertexTemplate(library, graph, '数据', 'images/data.gif', 'shape=data', 80, 60);
	insertVertexTemplate(library, graph, '存储数据', 'images/storage.gif', 'shape=storage', 80, 60);
	insertVertexTemplate(library, graph, '直接数据', 'images/record.gif', 'shape=record', 80, 60);
	insertVertexTemplate(library, graph, '纸带', 'images/tape.gif', 'shape=tape', 80, 60);
	insertVertexTemplate(library, graph, '手动输入', 'images/handinput.gif', 'shape=handinput', 100, 50);
	insertVertexTemplate(library, graph, '手动操作', 'images/handoperator.gif', 'shape=handoperator', 80, 60);
	

 

  • 大小: 82.4 KB
0
4
分享到:
评论
2 楼 zl-2577 2011-06-22  
zwfflying 写道
兄弟,看一下这个效果:
http://bpm.bstek.com/sample/bpmgraph/_designer.jsp

这个还是挺炫酷的。
它支持自定义图形吗?比如画出visio里的基本流程图的形状吗?它能解决泳道图吗?流程分解和合并吗?
正在寻觅中。。
1 楼 zwfflying 2011-06-02  
兄弟,看一下这个效果:
http://bpm.bstek.com/sample/bpmgraph/_designer.jsp

相关推荐

    mxgraph1.02WEB图形设计

    "mxgraph1.02WEB图形设计"是一个基于EXTJS扩展的开源图形设计工具,主要用于构建Web环境下的流程图和其他图表。这个工具的核心是mxGraph库,它提供了一套强大的JavaScript API,允许开发者在Web浏览器中创建、编辑和...

    web的绘制流程图的javascript库工具(mxgraph)

    mxGraph是一款强大的JavaScript库,专为在Web环境中创建和编辑流程图、图表和其他图形而设计。这个库提供了丰富的功能,使开发者能够轻松地构建交互式的绘图应用。下面将详细介绍mxGraph的核心特性、使用方法以及它...

    mxGraph流程图js包

    总的来说,mxGraph是一个强大的工具,适合需要在Web应用中实现图形编辑和流程图展示的场景。通过熟练掌握mxGraph,开发者可以创建出功能丰富、用户友好的图形界面,提高业务流程的可视化和效率。

    mxGraph流程图

    通过学习和掌握mxGraph,开发者可以创建出功能强大且用户友好的Web流程图应用,提高工作效率,简化工作流程。同时,由于mxGraph是开源项目,开发者可以根据自身需求对其进行扩展和定制,以满足特定场景的需求。

    mxgraph.MXGRAPH..MXGRAPH..

    MXGRAPH通常指的是一个开源的JavaScript图形库,用于创建可交互的图表和流程图,但它与音乐文件无关。如果您需要关于MXGRAPH的详细信息,我可以提供如下内容: MXGRAPH是一个强大的图形编辑框架,主要用于创建富...

    基于mxgraph的流程建模js框架

    而基于mxgraph的流程建模JavaScript框架则为开发者提供了一个强大且灵活的工具,使得在Web环境中创建交互式流程图成为可能。mxgraph是一个开源的图形库,支持多种图形绘制,包括流程图、网络拓扑图等,它以其高效...

    mxgraph-eval-1_0_2_8.zip

    总结起来,mxGraph-eval-1_0_2_8.zip是WEB流程开发工具的一个重要版本,提供了丰富的资源和工具,旨在帮助开发者实现高效、直观的图形编辑解决方案。通过深入研究和实践,开发者可以充分利用mxGraph的功能,打造...

    mxgraph经典实例及各个类包的解释Api

    通过研究`drawio-master`项目,可以更深入地理解mxGraph如何被用于构建一个完整的图形编辑应用。 总结,mxGraph是JavaScript领域强大的图形库,提供了丰富的API和实例,能够满足复杂的图形绘制需求。通过深入学习和...

    在线画图wwwdrawio网站的源码基于mxGraph开发

    mxGraph是一个用JavaScript编写的开源图形库,专门用于在Web应用中实现交互式的图形编辑。它提供了丰富的API,可以绘制复杂的图形结构,支持多种图形操作,如拖放、连接、缩放和平移。mxGraph的核心特性包括: 1. *...

    mxgraph 包

    mxGraph 是一款强大的开源图形库,主要用于在 Web 应用程序中创建交互式的图表和流程图。它由 Java 编写,通过 JavaScript 进行前端展示,并且支持 HTML5 Canvas 和 SVG 渲染。mxGraph 提供了丰富的功能,包括形状...

    mxgraph 的初步介绍与开发入门

    mxgraph 是一个强大的开源图形库,主要应用于创建交互式图形界面,例如流程图、网络拓扑图、UML模型等。这个库支持JavaScript和Java两种语言,允许开发者在Web浏览器或者服务器端进行图形编辑。由于它的灵活性和可...

    flex 画流程图 流程编辑

    在Flex中,画流程图是一项重要的功能,尤其在业务流程管理和系统设计中尤为常见。流程编辑器允许用户直观地设计和修改流程,这对于提高工作效率和理解复杂逻辑非常有帮助。 标题所提及的“flex 画流程图 流程编辑”...

    mxGraph 应用

    mxGraph 是一个强大的开源JavaScript库,专用于在Web上创建和编辑图形,尤其适用于构建交互式图表、流程图和组织结构图。它以其高度可定制性、高性能和易用性而受到开发者的青睐。在本篇文章中,我们将深入探讨如何...

    huiger123-mxgraph-master.zip

    mxGraph是一款强大的JavaScript图形库,主要用于创建交互式和可自定义的图表、流程图和模型。这个开源项目,"huiger123-mxgraph-master.zip",包含了mxGraph的源代码,允许开发者深入理解其内部工作原理并进行扩展。...

    mxgraph-eval-1_4_0_9

    mxGraph 是一个强大的开源JavaScript库,专用于在Web应用程序中创建和编辑图形。这个"mxgraph-eval-1_4_0_9"版本可能是mxGraph的一个特定发行版,版本号为1.4.0.9,可能包含了该库的一些改进和特性。下面将详细介绍...

    基于Web的JGraphx自动绘制拓扑图的设计和实现.pdf

    4. mxGraph:mxGraph是一个Java图形库,提供了图形绘制和布局的功能。 5.拓扑图自动绘制:拓扑图自动绘制是指通过计算机程序自动生成拓扑图的过程,通常用于表示网络拓扑结构、机房拓扑结构等。 6. Java Applet技术...

    基于javascript画图源码,可实现流程画图

    MXGraph是一个强大的开源JavaScript库,它允许开发者创建交互式的图表和图形编辑器,非常适合用于实现工作流的可视化设计。下面将详细探讨这个主题。 MXGraph的核心功能包括: 1. **图形绘制**:MXGraph提供了丰富...

    Attack-Tree-Tool:创建一个Web工具以使用Node.JS和mxGraph构建攻击树模型

    mxGraph是一个强大的JavaScript图形库,专为绘制和编辑图形图表设计,如流程图、网络图和攻击树。在这个项目中,mxGraph用于渲染和交互式操作攻击树。它提供了丰富的API,支持自定义节点样式、连接线、事件监听等,...

    mxGraphic资料与实例

    `mxGraphic` 是一个基于 `ExtJS` 的开源框架,它专门设计用于创建动态工作流、网络拓扑图和Visio风格的图形。这个框架提供了强大的图形绘制和编辑功能,使得开发者可以轻松地在Web应用中实现复杂的可视化需求。`...

Global site tag (gtag.js) - Google Analytics