JointJS总结

JointJS总结JointJS 图库允许用户为所有当前的浏览器创建完全交互的绘图工具 JointJS 不仅是一个图库 其 MVC 更多的是 MV 架构将图 元件 element 和连接 link 模型与绘制分离

1 基本介绍

1.1 JointJS

JointJS图库允许用户为所有当前的浏览器创建完全交互的绘图工具。JointJS不仅是一个图库,其MVC(更多的是MV)架构将图、元件(element)和连接(link)模型与绘制分离。这使得JointJS很容易嵌入到后端应用程序。此外,JointJS用Backbone MVC库构建,所以如果用户知道Backbone,会觉得很熟悉JointJS。JointJS是基于jQuery,Underscore,Backbone 和 SVG。

图包含元件,并用链接连接起来。在JointJS中,图由一个模型joint.dia.Graph代表。这个模型然后收集单元(cell,表示元件和链接)。因此,一个单元可以是一个元件(joint.dia.Element或其继承者)或链接(joint.dia.Link)。

JointJS总结

JointJS提供了既提供了基本的图形元件,也包含了一些注明的图表(ERD, Org chart, FSA, UML, PN, DEVS, …)。

1.2 Rappid

Rappid基于JointJS,扩展了40个UI组件和其它元件,能极大的加速应用的开发。形如:

JointJS总结

但Rappid需要购买。虽然如此,但是Rappid的Demo很详细,值得学习研究,为我们实现类似的功能提供了很好的参考。下一章将基于Rappid Demo进一步讨论。

2 Rappid Demo

Rappid提供了详细的Demo,一下只介绍了几个实用的,其它请参考在线文档。

2.1 组件框

下图的左方为组件框,包含了可使用的元件,用户可以方便的拖放到右方的画图区域。另外,用户也可以对元件分组,也能实现自定义用户搜索。

JointJS总结

joint.ui.Stencil实现了JointJS元件的组件栏,简易代码如下:

 var graph = new joint.dia.Graph;
  var paper = new joint.dia.Paper({ 
   
     el: $('#paper'),
     width: 500,
     height: 300,
     model: graph
  });
 
  var stencil = new joint.ui.Stencil({ 
    
     paper: paper,
     width: 200,
     height: 300
  });
  $('#stencil-holder').append(stencil.render().el);//显示模版框
 var r = new joint.shapes.basic.Rect({ 
    
      position: { 
    x: 10, y: 10 }, size: { 
    width: 50, height: 30 } 
  });
  var c = new joint.shapes.basic.Circle({ 
    
      position: { 
    x: 70, y: 10 }, size: { 
    width: 50, height: 30 } 
  });
  stencil.load([r, c]);//加载可使用的元件

 

2.2 控制面板

joint.ui.Halo在每个元件上创建了一个控制面板。

JointJS总结

简易代码:

paper.on('cell:pointerup', function(cellView) { 
   
    // We don't want a Halo for links.
    if (cellView.model instanceof joint.dia.Link) return;
    var halo = new joint.ui.Halo({ 
    cellView: cellView });
    halo.render();
});

 

2.3 属性栏

joint.ui.Inspector创建一个单元模型属性的编辑器和查看器。

JointJS总结

简易代码:

var inspector;
function createInspector(cellView) { 
   
    // No need to re-render inspector if the cellView didn't change.
    if (!inspector || inspector.options.cellView !== cellView) { 
   
        if (inspector) { 
   
            // Set unsaved changes to the model and clean up the old inspector if there was one.
            inspector.updateCell();
            inspector.remove();
        }
        inspector = new joint.ui.Inspector({ 
   
            inputs: { 
   
                myproperty: { 
    type: 'range', min: 0, max: 30, defaultValue: 1, group: 'mydata', index: 1 },
                attrs: { 
   
                    text: { 
    
                        text: { 
    type: 'textarea', group: 'text', index: 1 },
                        'font-size': { 
    type: 'number', group: 'text', index: 2 }
                    }
                }
            },
            groups: { 
   
                mydata: { 
    label: 'My Data', index: 1 },
                text: { 
    label: 'Text', index: 2 }
            },
            cellView: cellView
        });
        $('.inspector-container').html(inspector.render().el);
    }
}
paper.on('cell:pointerup', function(cellView) { 
   
    createInspector(cellView);
});

 

2.4 滚动栏

joint.ui.PaperScroller对paper上的元件进行了包装,实现了滚动、平移、居中和自动调整大小。

JointJS总结

简易代码:

var paper = new joint.dia.Paper({ 
   
    width: 2000,
    height: 2000,
    model: graph
});
var paperScroller = new joint.ui.PaperScroller({ 
   
    paper: paper
});
$('#paper-container').append(paperScroller.render().el);
paperScroller.centerContent();

 

2.5控件对齐

joint.ui.Snaplines是引导元件对齐的实用工具。当用户拖动一个元件垂直或者水平靠近另一个元件时,将会出现水平线或者垂直线。

JointJS总结

简易代码:

var snaplines = new joint.ui.Snaplines({ 
    paper: paper });
snaplines.startListening();

3 自定义控件

JointJS内置了基本的图形元件。这些图形都在joint.shapes.basic命名空间,包括joint.shapes.basic.Rect、joint.shapes.basic.Circle、joint.shapes.basic.Text和joint.shapes.basic.Image。此外,JointJS的插件中也包含了常见图标所需的图形和链接元件。

另外,创建自定义元件也很简单,但需要SVG元素的一些基本知识。最重要的是SVG元件的recttextcircleellipseimage 和 path。它们的详细描述和例子可以在MDN. 中找到。

自定义元素通过链接SVG标签创建。通常,我们将一个元件放置到相对于另一个元件的某个位置。比如,我们希望有一个矩形元件和一个文本元件,并且文本元件应该始终在矩形的中心。但SVG没有提供的这样的方法。因此,JointJS引入了特殊的属性来放置元件的相对位置。例如joint.shapes.basic.Rect元件的定义:

joint.shapes.basic.Rect = joint.shapes.basic.Generic.extend({ 
   
    markup: '<g class="rotatable"><g class="scalable"><rect/></g><text/></g>',
 
    defaults: joint.util.deepSupplement({ 
   
        type: 'basic.Rect',
        attrs: { 
   
            'rect': { 
    fill: 'white', stroke: 'black', 'follow-scale': true, width: 80, height: 40 },
            'text': { 
    'font-size': 14, 'ref-x': .5, 'ref-y': .5, ref: 'rect', 'y-alignment': 'middle', 'x-alignment': 'middle' }
        }
    }, joint.shapes.basic.Generic.prototype.defaults)
});

         如上所示,SVG标签保存在markup属性。这个属性包含了一个joint.shapes.basic.Rect元件的SVG模版。其中包含了两个SVG组:第一个是“rotatable” 当joint.dia.Element.rotate()被调用时,所有在这个组中的元件都会旋转;另外一个是“scalable”,当 joint.dia.Element.resize()被调用时,所有在这个组中的元件都将一起缩放。

 

4 数据存储

4.1关系数据

每个元件都包含一个ID,对于Link型的元件,还包含了起始元件和目标元件的id。这样依照图中的数据关系就很清楚了。JointJS提供了相关API存储元件及其关系,比如:

 

1)  graph.getElements

获取图上所有的元件,除了链接(Link

2)  graph.getLinks()

获取图中所有的链接(Link),除了元件(Element)。

3)    graph.getConnectedLinks(element, opt)

获取所有的已链接的链接(Link)。

4)     graph.toJSON()

返回所画图的JSON序列。注意:这个方法不会返回一个JSON字符串而是一个对象;但通过JSON.stringify()转化之后就能得到。

5)    graph.fromJSON(json,[options])

加载JSON对象(不是字符串)。

4.2 图片

图片的存储也借鉴Rappid的扩展方法:

1)  FORMAT.SVG (SVG EXPORT),此插件为joint.dia.Paper对象增加了两个新方法:

a) toSVG(callback) – 将paper中的内容转化为SVG字符串

b) openAsSVG() – 打开一个新窗口显示SVG paper内容

2)        FORMAT.RASTER (PNG AND JPEGEXPORT),此插件为joint.dia.Paper对象增加了新方法,用于客户端输出PNGJPEG格式的图片。

a)  toPNG(callback [, options]) – 执行回调函数,表示paper内容的PNG数据URI作为其第一个参数

b)  toJPEG(callback [, options]) -执行回调函数,表示paper内容的JPEG数据URI作为其第一个参数

c)  toDataURL(callback [, options]) – 这个是之前两个方法的通用版本。执行回调函数,表示paper内容的特定MIME类型数据URI作为其第一个参数

参考文档:

1)        http://www.jointjs.com/tutorial

2)        http://www.jointjs.com/api

3)        http://jointjs.com/rappid/docs

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233732.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • web渗透测试工具大全_web安全攻防渗透测试实战指南 pdf

    web渗透测试工具大全_web安全攻防渗透测试实战指南 pdf一、渗透测试工具nmap,查看网站服务器开放的端口1、查看服务器上运行的服务$nmap-sVhack-test.com2、查看操作系统版本$nmap-Ohack-test.com二、使用Nikto来收集漏洞信息#官方网站:https://cirt.net/nikto2#wgethttps://cirt.net/nikto/nikto-2.1.5.

    2022年8月12日
    9
  • 项目运行指标:micrometer自定义metrics

    项目运行指标:micrometer自定义metricsmicrometer 自定义 metricsmicro 提供了基于 Java 的 monitorfacad 其与 springboot 应用和 prometheus 的集成方式如下图展示上图中展示的很清楚 应用通过 micrometer 采集和暴露监控端点给 prometheus prometheus 通过 pull 模式来采集监控时序数据信息 之后作为数据源提供给 grafana 进行展示 micrometer 支持的度量方式及在 springboot 中的应用示例 CounterCount 计数器 简单理解

    2025年7月17日
    2
  • python中矩阵的转置_[转]Python中的矩阵转置[通俗易懂]

    python中矩阵的转置_[转]Python中的矩阵转置[通俗易懂]Python中的矩阵转置via需求:你需要转置一个二维数组,将行列互换.讨论:你需要确保该数组的行列数都是相同的.比如:arr=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]列表递推式提供了一个简便的矩阵转置的方法:print[[r[col]forrinarr]forcolinrange(len(arr[0]))][[1,4…

    2022年5月29日
    45
  • java输入Scanner基本用法[通俗易懂]

    java输入Scanner基本用法[通俗易懂]1.基本介绍java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入,每个next获取输入对应的字符。Scannersc=newScanner(System.in);当我们通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext与hasNextLine判断是否还有输入的数据:next()–>hasNext() nextLine()–…

    2022年7月7日
    35
  • 程序员要不要去外包外派公司上班_程序员去外包是不是就废了

    程序员要不要去外包外派公司上班_程序员去外包是不是就废了总结一下外包外派公司的特点,要不要去,你自然就知道了。1.不管是外包还是外派,你的工作地点都不会固定的。都会去甲方的公司去工作,这个项目完事了,你就换到另一个甲方,另一个工作地方了。需要出差,需要驻场等等,工作场所非常不固定。2.面试的时候各种承诺,转正的时候,各种克扣。3.五险一金不会给你按照基本工资交,而是按照最低工资标准交。4.技术方面,可能会让你弄很多你不熟悉的技…

    2022年9月30日
    3
  • java判断空对象为空_Java判断对象是否为空(包括null ,””)的方法[通俗易懂]

    java判断空对象为空_Java判断对象是否为空(包括null ,””)的方法[通俗易懂]本文实例为大家分享了Java判断对象是否为空的具体代码,供大家参考,具体内容如下packagecom.gj5u.publics.util;importjava.util.List;/***判断对象是否为空**@authorRex**/publicclassEmptyUtil{/***判断对象为空**@paramobj*对象名*@return是否为空*/@Supp…

    2022年6月22日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号