В Paper.js группы (Group) и
слои (Layer) являются ключевыми
структурами для организации объектов на холсте. Они позволяют управлять
набором элементов одновременно, задавать трансформации, стили и порядок
отображения. При работе с SVG важно понимать, как Paper.js импортирует и
интерпретирует группы <g> и слои
<svg>.
Для загрузки SVG используется метод project.importSVG().
Он может принимать как строку с SVG-кодом, так и объект
SVGElement:
paper.project.importSVG(svgString, {
onLoad: function(item) {
// item — это корневая группа или элемент
},
expandShapes: true
});
onLoad — функция обратного вызова
после завершения импорта.expandShapes — при true
все <path> и <polygon> будут
преобразованы в объекты Paper.js (Path), а не оставлены в
виде Shape.После импорта Paper.js создает иерархию объектов,
соответствующую структуре SVG. Основной контейнер часто представляет
собой объект Group.
GroupGroup объединяет несколько элементов, позволяя применять трансформации и стили ко всей группе:
let group = new Group();
let circle = new Path.Circle({
center: [50, 50],
radius: 25,
fillColor: 'red'
});
let rectangle = new Path.Rectangle({
point: [30, 30],
size: [40, 40],
fillColor: 'blue'
});
group.addChild(circle);
group.addChild(rectangle);
group.position = new Point(200, 200);
group.rotate(45);
Особенности:
position,
rotation, scaling) применяются ко всем
дочерним объектам.fillColor,
strokeColor) можно задавать как для отдельного объекта, так
и для всей группы.<g> внутри
<g>.LayerLayer — это особый тип группы, который влияет на порядок отрисовки и видимость объектов:
let layer1 = new Layer();
let path1 = new Path.Circle({
center: [100, 100],
radius: 50,
fillColor: 'green'
});
let layer2 = new Layer();
let path2 = new Path.Circle({
center: [150, 150],
radius: 50,
fillColor: 'orange'
});
// layer2 выше layer1, поэтому path2 рисуется поверх path1
Ключевые моменты:
activeLayer позволяет
добавлять новые объекты в конкретный слой.visible = false) или изменять
прозрачность (opacity).SVG <g> импортируются как объекты
Group. Их структура и вложенность сохраняются:
<svg>
<g id="group1" transform="translate(50,50)">
<circle cx="0" cy="0" r="25" fill="red"/>
<rect x="-20" y="-20" width="40" height="40" fill="blue"/>
</g>
</svg>
Импорт в Paper.js:
paper.project.importSVG(svgElement, function(item) {
console.log(item instanceof Group); // true
console.log(item.children.length); // 2
});
Особенности импорта:
transform из SVG автоматически
применяется к объекту Group.expandShapes = true, все фигуры внутри
<g> становятся объектами Paper.js
(Path.Circle, Path.Rectangle).group.children[i].Применение трансформаций к группе:
group.translate(50, 50);
group.rotate(30, group.bounds.center);
group.scale(1.5);
Применение к слою:
layer1.opacity = 0.5;
layer2.visible = false;
layer2.sendToBack(); // Перемещает слой вниз
Разница:
SVG с двумя слоями:
<svg>
<g id="layer1">
<circle cx="50" cy="50" r="25" fill="red"/>
</g>
<g id="layer2">
<rect x="40" y="40" width="50" height="50" fill="blue"/>
</g>
</svg>
Импорт в Paper.js с разделением на слои:
paper.project.importSVG(svgElement, {expandShapes: true}, function(item) {
let layer1 = new Layer();
let layer2 = new Layer();
item.children[0].addTo(layer1); // Красный круг
item.children[1].addTo(layer2); // Синий квадрат
});
Теперь объекты находятся на отдельных слоях, и их можно управлять независимо, изменяя прозрачность, порядок и трансформации.
При работе с SVG в Paper.js:
Group соответствует
<g> в SVG. Используется для объединения объектов и
управления ими как единым целым.Layer управляет порядком отрисовки и
глобальными свойствами. Можно использовать для организации сложных
сцен.children позволяет обходить
вложенные элементы, применять стили, анимации и трансформации.importSVG сохраняет иерархию,
применяет трансформации и позволяет выбирать способ конвертации
фигур.Эта комбинация групп и слоев обеспечивает гибкое управление импортированными SVG, облегчая построение сложных интерактивных сцен на Paper.js.