Normalement, la position d'un objet par rapport au canevas peut être obtenue à partir de ses attributs .left
et .top
, mais ceux-ci deviennent relatifs au groupe si l'objet se trouve dans une sélection/un groupe. Y a-t-il un moyen d'obtenir leur position par rapport à la toile?
Lorsqu'un objet est à l'intérieur d'un groupe, ses coordonnées par rapport au canevas dépendent de l'origine du groupe (et de l'origine de l'objet également).
Disons que nous avons ce code qui a un rect et un cercle ajouté à un groupe.
var canvas = new fabric.Canvas(document.getElementById('c'));
var rect = new fabric.Rect({
width: 100,
height: 100,
left: 50,
top: 50,
fill: 'rgba(255,0,0,0.5)'
});
var circle = new fabric.Circle({
radius: 50,
left: 175,
top: 75,
fill: '#aac'
});
var group = new fabric.Group([rect, circle],{
originX: 'center',
originY: 'center'
});
canvas.add(group);
canvas.renderAll();
Voici les trois cas possibles pour centrer le groupe:
Origine du groupe définie au centre (comme dans le code ci-dessus):
Comme le montre la figure ci-dessous, rect.left
nous indique la distance entre l'objet et le centre du groupe. rect.group.left
nous donne la distance entre le centre du groupe et la gauche de la toile.
Donc distance du rect à gauche de la toile = rect.left + rect.group.left
( http://jsfiddle.net/uue3hcj6/3/ )
L'origine du groupe est définie en haut/à gauche (également le paramètre par défaut)
rect.left
nous donne la distance de gauche de l'objet du centre du groupe. rect.group.left
nous donne la distance entre la gauche du groupe et la gauche de la toile. Maintenant, pour calculer la distance restante, nous devons ajouter la moitié de la largeur du groupe.
Donc distance du rect à gauche de la toile = rect.left + rect.group.left
+ rect.group.width/2
( http://jsfiddle.net/uue3hcj6/6/ )
L'origine du groupe est définie en bas/à droite
rect.left
nous donne la distance de gauche de l'objet du centre du groupe. rect.group.left
nous donne la distance de droite du groupe de gauche de la toile. Maintenant, pour calculer la distance totale, il faut soustraire la moitié de la largeur du groupe.
Donc distance du rect à gauche de la toile = rect.left + rect.group.left
- rect.group.width/2
( http://jsfiddle.net/uue3hcj6/7/ )
Remarque: Des cas similaires sont également possibles pour un objet.
La solution consiste à prendre en compte la largeur du groupe. Le object.left
est relatif au centre du groupe, pas à sa gauche, nous prenons donc group.width/2
:
var canvas = new fabric.Canvas(document.getElementById('c'));
var rect = new fabric.Rect({
width: 100,
height: 100,
left: 50,
top: 50,
fill: 'rgba(255,0,0,0.5)'
});
var circle = new fabric.Circle({
radius: 50,
left: 150,
top: 75,
fill: '#aac'
});
canvas.add(rect);
canvas.add(circle);
canvas.renderAll();
function getPOS(){
var group = canvas.getActiveGroup();
if (group == null) {
var pos = rect.left;
}
else {
var pos = rect.group.left + rect.group.width/2 + rect.left;
}
alert("Position of rect from left:"+pos);
}
Dû résoudre ce problème avec une autre approche ... Je devais trouver des images dans les données de la toile JSON, mon code est donc:
let findItemByType = function(source, type, rX, rY)
{
rX = rX ? rX : 0;
rY = rY ? rY : 0;
let objs = [];
source.forEach(function(item){
if (item.type === type){
item.rX = rX + item.left;
item.rY = rY + item.top;
objs.Push(item);
}
else {
if (item.objects)
{
item.rX = rX;
item.rY = rY;
let subresult = findItemByType(item.objects,
type,
item.rX + item.left + item.width / 2,
item.rY + item.top + item.height / 2);
if (subresult){
objs = objs.concat(subresult);
}
}
}
});
return objs;
}
let images = findItemByType(canvas.toJSON().objects, "image", 0, 0);
Ce code doit amener un tableau de tous les objets image et ceux-ci doivent avoir les attributs rX et rY qui sont des positions relatives des images.