KonvaJS: как сохранить положение и вращение фигуры в группе после отсоединения? - PullRequest
0 голосов
/ 03 июля 2019

Как сохранить свойства позиции, поворота и масштаба фигур в группе после отсоединения?

Похоже, что формы теряются в измененных свойствах, если отсоединить все фигуры в группе после перемещения или изменения размера пользователя, поворотагруппа, которая обернута под Transformer.

Я пробую это как следующий источник.

    <button id="ungroup">ungroup</button>
    <div id="container"></div>
    const stage = new Konva.Stage({
       container: 'container',
       width: window.innerWidth,
       height: window.innerHeight
    });

    const layer = new Konva.Layer();
    stage.add(layer);

    const rect = new Konva.Rect({
       x : 50, y : 50, width: 100, height: 100,
       fill: 'black',
    });
    const rect2 = new Konva.Rect({
       x : 150, y : 50, width: 80, height: 80,
       fill: 'red',
    });

    const group = new Konva.Group({
        draggable: true
    });
    group.add(rect);
    group.add(rect2);

    const tr = new Konva.Transformer({
        node: group
    });

    layer.add(group);
    layer.add(tr);
    layer.draw();

    document.getElementById('ungroup').addEventListener('click', () => {
        tr.remove()
      // how can keep the moved or rotated properties?
      rect.moveTo(layer);
      rect2.moveTo(layer);
        group.removeChildren();
      group.remove();
      layer.draw();
    });

Группа имеет два прямоугольника, которые могут перемещаться с помощью трансформатора.Но после отсоединения они теряют движение, масштаб и вращение.

1 Ответ

1 голос
/ 03 июля 2019

Вы можете взять матрицу абсолютного преобразования узла и после отсоединения повторно применить ее к узлу.

function decompose(mat) {
  var a = mat[0];
  var b = mat[1];
  var c = mat[2];
  var d = mat[3];
  var e = mat[4];
  var f = mat[5];

  var delta = a * d - b * c;

  let result = {
    x: e,
    y: f,
    rotation: 0,
    scaleX: 0,
    scaleY: 0,
    skewX: 0,
    skewY: 0,
  };

  // Apply the QR-like decomposition.
  if (a != 0 || b != 0) {
    var r = Math.sqrt(a * a + b * b);
    result.rotation = b > 0 ? Math.acos(a / r) : -Math.acos(a / r);
    result.scaleX = r;
    result.scaleY = delta / r;
    result.skewX = Math.atan((a * c + b * d) / (r * r));
    result.scleY = 0;
  } else if (c != 0 || d != 0) {
    var s = Math.sqrt(c * c + d * d);
    result.rotation =
      Math.PI / 2 - (d > 0 ? Math.acos(-c / s) : -Math.acos(c / s));
    result.scaleX = delta / s
    result.scaleY = s;
    result.skewX = 0
    result.skewY = Math.atan((a * c + b * d) / (s * s));
  } else {
    // a = b = c = d = 0
  }

  result.rotation *= 180 / Math.PI;
  return result;
}

const matrix = node.getAbsoluteTransform().getMatrix();
const attrs = decompose(matrix);
node.moveTo(layer);
node.setAttrs(attrs);

Демо: https://codepen.io/elscorpio/pen/VqvLpG

...