使用预定义的SVG文件创建带端口的自定义JointJS形状

时间:2016-05-11 03:15:30

标签: svg shapes ports jointjs

我想在JointJS中使用一系列预先创建的SVG符号。 我搜索了使用预创建的SVG,我发现可以通过将SVG放在'markup'属性中来使用SVG创建一个完整的自定义元素 - (https://groups.google.com/forum/#!topic/jointjs/pQvN_0lXPVk)。

以下是SVG的示例。关于如何将此定义嵌入标记属性并向其添加端口的帮助将非常受欢迎。

由于

<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g stroke-width="0.1" clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" />
<g stroke-width="0.25" clip-path="url(#clipId0)" fill="rgb(0,0,0)" stroke="none" >
<path d="M1013.96,634.98 10.0392,634.98 1013.96,133.02 z" />
</g>
<g stroke-width="0.25" clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" >
<polyline points="10.0392,133.02 1013.96,133.02 1013.96,634.98 10.0392,634.98 10.0392,133.02 " />
<polyline points="10.0392,634.98 1013.96,133.02 " />
</g>
</svg>

1 个答案:

答案 0 :(得分:2)

您可以将SVGImageElement添加到标记中,以在形状中显示任意SVG。只需将SVG文件内容转换为dataURL并设置xlink:href属性。

var shape = new joint.shapes.basic.Image({
  // markup: '<g class="rotatable"><g class="scalable"><image/></g><text/></g>',      
  attrs: {
    image: {
      'xlink:href': 'data:image/svg+xml;utf8,' + encodeURLComponent(svgFileContent)
    } 
  }
});

http://jsfiddle.net/kumilingus/eqen3pdf/

为了创建一个显示SVG图像并且还有端口的形状,您可以例如使用devs.Model形状并将其标记中的唯一SVGRectElement替换为SVGImageElement

new joint.shapes.devs.Model({
  markup: '<g class="rotatable"><g class="scalable"><image class="body"/></g><text class="label"/><g class="inPorts"/><g class="outPorts"/></g>',
  attrs: {
  '.body': {
    'xlink:href': 'data:image/svg+xml;utf8,' + encodeURLComponent(svgFileContent)
  },
  inPorts: ['in'],
  outPorts: ['out']
});

http://jsfiddle.net/kumilingus/tm2ctvxq/

请注意,可以将SVG文件内容直接插入到标记中(不含<?xml version="1.0" standalone="no"?>)。我不建议将它用于更复杂的SVG。

例如,当SVG包含带有id的SVGClipPathElement时。创建形状的2个实例会导致SVG中的所有ID必须唯一。