`
lynnlysh
  • 浏览: 178886 次
  • 性别: Icon_minigender_2
  • 来自: 天津
社区版块
存档分类
最新评论

mxgraph 之 自定义双边框长方形(即:doubleRectangle)

阅读更多
1、写在前面:关于双边框形状,在mxgraph中有双边框椭圆形(doubleEllipse),我的双边框长方形就是据此拓展的。
2、该形状的用途:这个图形也是很有必要的,它可用在BPMN中的事务子流程。
3、关键拓展代码:
extension.js
/**
 * 新增表单样式doubleRectangle
 *
 **/
function mxDoubleRectangle(bounds, fill, stroke, strokewidth){
	this.bounds = bounds;
    this.fill = fill;
    this.stroke = stroke;
    this.strokewidth = (strokewidth != null) ? strokewidth: 1;

}
mxDoubleRectangle.prototype = new mxShape();
mxDoubleRectangle.prototype.constructor = mxDoubleRectangle;
mxDoubleRectangle.prototype.createVml = function() {
	this.node = document.createElement('v:group');
    var name = (this.isRounded) ? 'v:roundrect': 'v:rect';
    this.background = document.createElement(name);
    this.configureVmlShape(this.background);
    this.node.appendChild(this.background);
//    this.label = this.background;
    this.isShadow = false;
    this.fill = null;
    this.foreground = document.createElement(name);
    this.configureVmlShape(this.foreground);
    this.node.appendChild(this.foreground);
    this.stroke = null;
    this.configureVmlShape(this.node);
    return this.node;
};
mxDoubleRectangle.prototype.createSvg = function() {

	var g = this.createSvgGroup('rect');
	this.foreground = document.createElementNS(mxConstants.NS_SVG, 'rect');
    this.foreground.setAttribute('shape-rendering', 'optimizeSpeed');
    this.foreground.setAttribute('fill', 'none');
    g.appendChild(this.foreground);  
    return g;
};
mxDoubleRectangle.prototype.redrawSvg = function(node) {
	if (this.innerNode != null) {
        this.updateSvgShape(this.innerNode);
        if (this.shadowNode != null) {
            this.updateSvgShape(this.shadowNode);
        }
    } else {
        this.updateSvgShape(this.node);
    }
    this.updateSvgGlassPane();
    this.updateSvgNode(this.foreground, 8);
};
mxDoubleRectangle.prototype.redrawVml = function() {
	this.node.style.visibility = 'hidden';
	this.updateVmlShape(this.node);
	this.updateVmlGlassPane();
	this.node.style.visibility = 'hidden';
	
	this.background.style.visibility = 'hidden';
	this.updateVmlShape(this.background);
	this.updateVmlGlassPane();
	this.background.style.visibility = 'visible';
	
	this.foreground.style.visibility = 'hidden';
	this.updateVmlShape(this.foreground);
	this.updateVmlGlassPane();
	this.foreground.style.visibility = 'visible';
	var inset = 8;
	var w = Math.floor(this.bounds.width);
	var h = Math.floor(this.bounds.height);
	var x = Math.floor(this.bounds.x);
	var y = Math.floor(this.bounds.y);
	this.background.style.top = inset/2 + 'px';
	this.background.style.left = inset/2 + 'px';
	this.background.style.width = Math.max(0, w - inset) + 'px';
	this.background.style.height = Math.max(0, h - inset) + 'px';
};
mxDoubleRectangle.prototype.updateSvgNode = function(node, inset) {
    inset = (inset != null) ? inset: 0;
    if (node != null) {
        var strokeWidth = Math.max(1, this.strokewidth * this.scale);
        if (this.crisp) {
            node.setAttribute('shape-rendering', 'crispEdges');
        } else {
            node.removeAttribute('shape-rendering');
        }
        if (this.style != null && this.style[mxConstants.STYLE_SMOOTH]) {
            var pts = this.points;
            var n = pts.length;
            if (n > 3) {
                var points = 'M ' + pts[0].x + ' ' + pts[0].y + ' ';
                points += ' Q ' + pts[1].x + ' ' + pts[1].y + ' ' + ' ' + pts[2].x + ' ' + pts[2].y;
                for (var i = 3; i < n; i++) {
                    points += ' T ' + pts[i].x + ' ' + pts[i].y;
                }
                node.setAttribute('d', points);
            }
        }
        if (this.isDashed) {
            var phase = Math.max(1, Math.floor(3 * this.scale));
            node.setAttribute('stroke-dasharray', phase + ',' + phase);
        }
        if (this.isRounded) {
        	var w = this.bounds.width-inset;
            var h = this.bounds.height-inset;
            var r = Math.min(w * mxConstants.RECTANGLE_ROUNDING_FACTOR, h * mxConstants.RECTANGLE_ROUNDING_FACTOR);
            node.setAttribute('rx', r);
            node.setAttribute('ry', r);
        }
        node.setAttribute('stroke',this.stroke);
        node.setAttribute('stroke-width', strokeWidth);
        node.setAttribute('x', this.bounds.x +inset/2);
        node.setAttribute('y', this.bounds.y +inset/2);
        node.setAttribute('width', Math.max(0, this.bounds.width  - inset));
        node.setAttribute('height', Math.max(0, this.bounds.height - inset));
    }
 
};
mxDoubleRectangle.prototype.configureVmlShape = function(node) {
	 node.style.position = 'absolute';
	    var color = this.stroke;
	    if (color != null && color != mxConstants.NONE) {
	        node.setAttribute('stroked', 'true');
	        node.setAttribute('strokecolor', color);
	    } else {
	        node.setAttribute('stroked', 'false');
	    }
	    color = this.fill;
	    node.style.background = '';
	    if (color != null && color != mxConstants.NONE) {
	        if (this.fillNode == null) {
	            this.fillNode = document.createElement('v:fill');
	            node.appendChild(this.fillNode);
	        }
	        this.updateVmlFill(this.fillNode, color, this.gradient, this.gradientDirection, this.opacity);
	    } else {
	        node.setAttribute('filled', 'false');
	        if (this.points == null) {
	            this.configureTransparentBackground(node);
	        }
	    }
	    if ((this.isDashed || this.opacity != null) && this.strokeNode == null) {
	        this.strokeNode = document.createElement('v:stroke');
	        node.appendChild(this.strokeNode);
	    }
	    if (this.strokeNode != null) {
	        if (this.strokeNode != null) {
	            if (this.isDashed) {
	                var phase = Math.max(1, Math.floor(3 * this.scale));
	                var pat = phase + ' ' + phase;
	                if (this.strokeNode.getAttribute('dashstyle') != pat) {
	                    this.strokeNode.setAttribute('dashstyle', pat);
	                }
	            } else if (this.strokeNode.getAttribute('dashstyle') != 'solid') {
	                this.strokeNode.setAttribute('dashstyle', 'solid');
	            }
	        }
	        if (this.opacity != null) {
	            this.strokeNode.setAttribute('opacity', this.opacity + '%');
	        }
	    }
	    if (this.isShadow && this.fill != null) {
	        if (this.shadowNode == null) {
	            this.shadowNode = document.createElement('v:shadow');
	            this.shadowNode.setAttribute('on', 'true');
	            this.shadowNode.setAttribute('color', mxConstants.SHADOWCOLOR);
	            node.appendChild(this.shadowNode);
	        }
	    }
	    if (node.nodeName == 'roundrect') {
	        try {
	            node.setAttribute('arcsize', String(mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) + '%');
	        } catch(e) {}
	    }
    this.strokeNode = null;
};
/**
 *拓展该形状输出img的绘制方法
 **/
mxImageExport.prototype.initShapes = function() {
    this.shapes = [];
//其他形状的绘制也在此定义,就是源码中的,在此只写了新增的代码
    this.shapes['doubleRectangle'] = {
    	drawShape: function(canvas, state, bounds, background) {
            if (background) {
                if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) {
                    var size = Math.max(bounds.width / 10, bounds.height / 10);
                    canvas.roundrect(bounds.x, bounds.y, bounds.width, bounds.height, size, size);
                } else {
                    canvas.rect(bounds.x, bounds.y, bounds.width, bounds.height);
                }
                return true;
            } else {
                canvas.fillAndStroke();
                var inset = 8;
                var x = bounds.x;
                var y = bounds.y;
                var w = bounds.width;
                var h = bounds.height;
                x += inset/2;
                y += inset/2;
                w -=  inset;
                h -=  inset;
                if (w > 0 && h > 0) {
                	 if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) {
	                	var size = Math.max(w / 10, h / 10);
	                	canvas.rect(x, y, w,h,size,size);
                	 }else {
                		 canvas.rect(x,y,w,h);
                	 }
                }
                canvas.stroke();
            }
        }	
    };
    };

4、应用方法:
应用新的样式时可以在default-style.xml中写该样式:
	<add as="transaction" >
		<add as="shape" value="doubleRectangle"/>
		<add as="strokeColor" value="black"/>
		<add as="fillColor" value="#F2F2F2"/>
		<add as="gradientColor" value="#F2F2F2"/>
		<add as="verticalAlign" value="top"/>
		<add as="rounded" value="0"/>
		
	</add>

这就是BPMN中事务子流程的样式定义。
然后,在graph的js中:
 graph.cellRenderer.registerShape('doubleRectangle', mxDoubleRectangle);
	    var style = graph.getStylesheet().getDefaultVertexStyle(); 
	    style[mxConstants.STYLE_SHAPE] = 'doubleRectangle';

这样就可以用这个样式啦啦~~
*************************格叽格叽**************************
终于写完了  lysh  miss  wanan~
  • 大小: 8.4 KB
分享到:
评论
1 楼 59445088 2012-04-17  
格叽格叽? 楼主好幽默

相关推荐

    mxgraph如何实现拓扑图中节点闪烁或节点边框闪烁

    在IT领域,尤其是在图形界面设计和可视化应用中,mxGraph是一个强大的JavaScript库,用于创建交互式的图表和图形,包括复杂的网络拓扑图。本篇文章将深入探讨如何利用mxGraph实现拓扑图中节点和边框闪烁的效果,以...

    mxgraph svg2xml

    mxgraph自定义图元很难调试,这个工具可以通过svg转为xml ,通过微调达到图元定义的目的

    mxgraph中右键和toolbar工具条的实现

    mxgraph 是一个强大的JavaScript库,用于创建交互式图形应用程序,如流程图、网络拓扑图等。它提供了丰富的API和功能,使得开发者可以轻松地在Web应用中集成图形编辑功能。在mxgraph中,实现右键菜单和工具条是两个...

    基于mxgraph的流程建模js框架

    mxgraph的API允许开发人员自定义图形样式、形状以及交互行为,满足各种复杂的可视化需求。 **流程建模** 流程建模是业务流程管理的重要组成部分,通过图形化的方式表示工作流程,使得流程更易于理解和改进。基于...

    mxGraph绘图插件

    mxGraph还支持自定义形状和渲染,开发者可以通过继承或扩展现有的形状类来创建自己的图形组件。此外,它有强大的事件处理机制,可以监听并响应用户的拖放、点击、移动等操作。 实例方面,mxGraph提供了一系列的示例...

    mxgraph.MXGRAPH..MXGRAPH..

    很抱歉,根据您提供的信息,"MXGRAPH"似乎与音乐文件"陈奕迅 - 不要说话.mp3"、"陈奕迅 - 不如这样.mp3"、"陈奕迅 - 不如不见.mp3"并不相关,这看起来更像一个音乐文件的列表而不是IT行业的专业知识点。MXGRAPH通常...

    mxgraph的学习笔记

    "mxgraph学习笔记" MXGraph是一款基于开源技术的图形化库,提供了丰富的API和工具,帮助开发者快速构建复杂的图形应用。下面是MXGraph学习笔记的知识点总结: 坐标系 MXGraph中的坐标系分为两种:无关位置和相关...

    mxgraph editor

    3. **图形样式(Styles)**:mxGraph支持自定义图形样式,包括线条样式、填充颜色、边框样式等,使得图表能呈现各种视觉效果。 4. **图形形状(Shapes)**:mxGraph提供了多种预定义的图形形状,如矩形、椭圆、箭头...

    mxGraph最新

    mxGraph最新div.base { position: absolute; overflow: hidden; white-space: nowrap; font-family: Arial; font-size: 8pt; } div.base#graph { border-style: solid; border-color: #F2F2F2; border-...

    mxGraph破解版 版本号:2.4.0.4

    mxGraph破解版,版本号:2.4.0.4

    js画图框架--mxgraph--入门

    其中,mxGraph 是一个强大的、可自定义的、用于创建交互式图形应用程序的JavaScript库。本文将深入探讨mxGraph的基本概念、安装、使用方法以及如何通过它进行图形绘制。 **1. mxGraph 概述** mxGraph 是由 JGraph ...

    mxgraph-svg2shape:mxGraph SVG到Shape的转换工具

    mxgraph-svg2shape 一套将SVG文件转换为mxGraph资源的工具。 该存储库基于: SVG to XML mxGraph stencil definition translation tool. This was created for internal use, so there are lots of things ...

    mxgraph API和demo

    **mxgraph API与Demo详解** mxGraph是一款强大的JavaScript图形库,用于绘制和编辑流程图、组织结构图等复杂图表。它提供了丰富的API,使得开发者能够轻松地在Web应用中实现图形化界面。本文将深入探讨mxGraph API...

    mxGraph压缩包

    3. **图形样式**:mxGraph支持自定义节点和边的样式,包括填充色、边框、字体等。样式可以通过JSON对象定义,并可以动态改变。 4. **布局算法**:内置的布局算法如层次布局、力导向布局等,可以帮助自动调整节点的...

    mxGraph开发入门指南

    此外,mxGraph支持自定义事件处理、图元风格、图形布局等高级特性。你可以通过添加事件监听器来响应用户交互,如节点的点击、拖拽等。图元风格允许你定义节点和边的外观,而布局算法可以帮助你自动化地组织图形,使...

    mxGraph.zip

    mxGraph 简单易用,只需要在HTML文件中加入...服务器支持: 尽管mxGraph可以单独使用,我们知道你还是希望在客户端和服务器直接能够非常容易地交换数据。所以,我们也一并提供了服务器端的Java及.Net的支持库。

    mxgraph --javascript graph

    mxGraph的核心特性包括交互性、自定义节点形状、丰富的API以及对SVG和Canvas的支持。 在JavaScript图形库中,mxGraph脱颖而出,主要得益于以下几点: 1. **易用性**:mxGraph提供了直观的API,使得开发者能够轻松...

    mxGraph:在HTML页面中制作流程图的JS插件

    - **图形表示**:mxGraph提供了一套完整的图形表示系统,包括各种形状(如框、连接线、箭头等)和样式选项,使得用户可以轻松创建美观的图表。 - **交互性**:该库支持用户对图形的实时编辑,如拖放、连接节点、...

    mxGraph流程图js包

    mxGraph是一款强大的JavaScript库,专用于创建交互式和可自定义的图形编辑器,尤其适合构建流程图、网络拓扑图以及UML模型等图表。它提供了丰富的API和功能,使得开发者可以轻松地在Web应用中集成图形编辑功能。 ...

Global site tag (gtag.js) - Google Analytics