我使用fabric.js创建了一种'多边形选择器'或'多边形制作器'。每次单击都会创建多边形的一个角,可以选择,移动等等......双击原始点'关闭'多边形。在这一点上,我采用构成多边形的所有圆/线并将它们分组。到目前为止一切都很好。
当双击这样的组时,我希望它取消组合并恢复到可移动节点(即移动圆形重塑多边形等);但是有一些奇怪的事情发生了 - 看看当你移动圆圈时会发生什么,某些线条似乎“没有加入”圆圈......
我已经查看了每个group / ungroup相关的fabric.js线程(这里/那里/无处不在)。似乎没有覆盖我在这里的“连接”对象的类型。
我放在一起表明问题的小提琴说它比我能做得更好:http://jsfiddle.net/bhilleli/4v8mkw6q/
破解的代码是@:
//dbl clicked a group so lets ungroup it!
items = p._objects; // grab the items from the group you want to
// translate the group-relative coordinates to canvas relative ones
p._restoreObjectsState();
// remove the original group and add all items back to the canvas
canvas.remove(p);
for (var i = items.length - 1; i >= 0; i--) {
canvas.add(items[i]);
}
canvas.renderAll();
答案 0 :(得分:9)
您可以使用布料分组工具
您可以将对象组合在一起并取消组合,并在对象上进行操作 同一时间
例如
var canvas = new fabric.Canvas('paper',{
isDrawingMode: true
});
$("#select").click(function(){
canvas.isDrawingMode = false;
});
$("#draw").click(function(){
canvas.isDrawingMode = true;
});
$("#group").on('click', function() {
var activegroup = canvas.getActiveGroup();
var objectsInGroup = activegroup.getObjects();
activegroup.clone(function(newgroup) {
canvas.discardActiveGroup();
objectsInGroup.forEach(function(object) {
canvas.remove(object);
});
canvas.add(newgroup);
});
});
$("#ungroup").click(function(){
var activeObject = canvas.getActiveObject();
if(activeObject.type=="group"){
var items = activeObject._objects;
alert(items);
activeObject._restoreObjectsState();
canvas.remove(activeObject);
for(var i = 0; i < items.length; i++) {
canvas.add(items[i]);
canvas.item(canvas.size()-1).hasControls = true;
}
canvas.renderAll();
}
});
请查看以下链接
答案 1 :(得分:1)
if (!canvas.getActiveObject()) {
return;
}
if (canvas.getActiveObject().type !== 'group') {
return;
}
canvas.getActiveObject().toActiveSelection();
canvas.requestRenderAll();
答案 2 :(得分:0)
如果getActiveGroup()不可用,则可以使用它进行分组(在鼠标选择多个对象之后):
toGroup()仅在选择了多个对象时可用
var activeObj = canvas.getActiveObject();
var activegroup = activeObj.toGroup();
var objectsInGroup = activegroup.getObjects();
activegroup.clone(function(newgroup) {
canvas.remove(activegroup);
objectsInGroup.forEach(function(object) {
canvas.remove(object);
});
canvas.add(newgroup);
});