mxGraph学习

mxgraph的渲染过程

1:初始化mxUtils对象:doc = mxUtiles.createXmlDocument();

2:使用创建的对象,创建具体模型:

  Var person = doc.createElement(‘模型名字’);

  可以通过setAttribute来设置模型对象的属性:

person.setAttribute('lastName', 'Duck');
person1.setAttribute('firstName', 'Daffy');

3:设置画布

   通过页面中选定一个已有元素作为画布:

var graph = new mxGraph(container);其中container的方法使用原生js:container = doucment.getElementById("id")

4:设置画布属性

graph.setCellsResizable(false);定义画布中模型元素是否可拉伸

设置画布大小:

graph.setResizeContainer(true);该属性为true的时候可以通过minimumContainerSize 来控制画布整体大小展示
graph.minimumContainerSize = new mxRectangle(0, 0, 500, 380);

获取画布xml内容

document.body.appendChild(mxUtils.button('View XML', function()
{
   var encoder = new mxCodec();
   console.log('122',graph.getModel())
   var node = encoder.encode(graph.getModel());
   console.log('123',mxUtils.getPrettyXml(node));获取标准xml
    mxUtils.getXml(result);获取去除空格xml
   mxUtils.popup(mxUtils.getPrettyXml(node), true);
}));

上面代码中:

mxUtils.button定义了特定按钮,可操作mxgraph画布

mxCodec是官方给出的xml编解码器,很明显我们通过graph.getModel()获得到的是画布对象的整体属性,包括节点,属性,监听事件等(未知,为了更深了解,后面需要更加深入了解)

var enc = new mxCodec(mxUtils.createXmlDocument());
var node = enc.encode(editor.graph.getModel());

后面的eg我们通过encoder.encode可以看到输出的是正常的xml字符串,目前个人理解这个字符串就是我们需要保存的最终数据。

可以拿到xml那必然可以添加xml到画布,encode对应的就是decode,

var xml = '<root><mxCell id="2" value="Hello," vertex="1"><mxGeometry x="20" y="20" width="80" height="30" as="geometry"/></mxCell><mxCell id="3" value="World!" vertex="1"><mxGeometry x="200" y="150" width="80" height="30" as="geometry"/></mxCell><mxCell id="4" value="" edge="1" source="2" target="3"><mxGeometry relative="1" as="geometry"/></mxCell></root>';
var doc = mxUtils.parseXml(xml);
var codec = new mxCodec(doc);
var elt = doc.documentElement.firstChild;
var cells = [];

while (elt != null)
{
    cells.push(codec.decode(elt));
    elt = elt.nextSibling;
}

graph.addCells(cells);

这个例子是官网的api上给的例子

可以看到需要先通过mxCodec对xml做一些处理,然后对再添加到画布中

可以看到上面画布中出现了两个蓝色举行跟一条线连接。

所以说,通过对画布操作可以实现模型的后台存储与展示。

简单工具栏:

//获取所需复制工具
var cells = graph.getSelectionCells();
var bounds = graph.getView().getBounds(cells);

var funct = function(graph, evt, cell)
{
   graph.stopEditing(false);

   var pt = graph.getPointForEvent(evt);
   var dx = pt.x - bounds.x;
   var dy = pt.y - bounds.y;
   
   graph.setSelectionCells(graph.importCells(cells, dx, dy, cell));
}
//添加工具栏
var img = toolbar.addMode(null, 'editors/images/outline.gif', funct);
mxUtils.makeDraggable(img, graph, funct);
mxUtils.show可对画布进行截屏或者局部截屏
insertVertex可新增自定义图形,可引入自定义图片,参考官网ports.html

左侧工具栏可做自己自定义部分

发布了29 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bjhan_csdn/article/details/105208384