我是JointJS的新手,我需要使用JointJS创建自定义形状,我尝试使用Rectangle创建菱形,使其高度和宽度相同,然后旋转45度,如下所示,
var diamond = new joint.shapes.basic.Rect({
position: { x: 100, y: 100 },
size: { width: 100, height: 100 },
attrs: { diamond: { width: 100, height: 30 } }
});
diamond.attr({
rect: { fill: '#cccccc', 'stroke-width': 2, stroke: 'black' },
text: {
text: 'Diamond', fill: '#3498DB',
'font-size': 18, 'font-weight': 'bold',
'font-variant': 'small-caps',
'text-transform': 'capitalize'
}
});
diamond.rotate(45);
然而,矩形内部的文字也会旋转,任何想法我怎么能继续....我还需要用标签创建六边形......任何帮助都将非常感激....
先谢谢,
涅茧利
答案 0 :(得分:6)
无需旋转整个元素。尝试将transform
属性添加到joint.dia.basic.Rect
模型。
rect: { transform: 'rotate(45)' }
另一种选择是使用joint.dia.basic.Path
模型。
var diamond = new joint.shapes.basic.Path({
size: { width: 100, height: 100 },
attrs: {
path: { d: 'M 30 0 L 60 30 30 60 0 30 z' },
text: {
text: 'Diamond',
'ref-y': .5 // basic.Path text is originally positioned under the element
}
}
});
为了获得六边形,请再次使用joint.dia.basic.Path
模型,但这次使用以下路径数据。
path: { d: 'M 50 0 L 0 20 0 80 50 100 100 80 100 20 z'}
最后,您可以在其标记中创建一个带有SVG Polygon的自定义形状。
答案 1 :(得分:2)
非常感谢罗马,我遵循钻石的第一个解决方案,它的工作很有魅力!!
这是任何想要使用joint.js制作钻石形状的人,我在joint.js中添加了以下内容
joint.shapes.basic.Diamond = 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: '#FFFFFF', stroke: 'black', width: 1, height: 1,transform: 'rotate(45)' },
'text': { 'font-size': 14, text: '', 'ref-x': .5, 'ref-y': .5, ref: 'rect', 'y-alignment': 'middle', 'x-alignment': 'middle', fill: 'black', 'font-family': 'Arial, helvetica, sans-serif' }
}
}, joint.shapes.basic.Generic.prototype.defaults)
});
其实施如下,
var diamond = new joint.shapes.basic.Diamond({
position: { x: 100, y: 100 },
size: { width: 100, height: 100 },
attrs: { diamond: { width: 100, height: 30 } }
});
diamond.attr({
rect: { fill: '#cccccc', 'stroke-width': 2, stroke: 'black' },
text: {
text: 'Diamond', fill: '#3498DB',
'font-size': 18, 'font-weight': 'bold',
'font-variant': 'small-caps',
'text-transform': 'capitalize'
}
});