Paper.js предоставляет мощный и гибкий API для работы с графикой на HTML5 Canvas. Одним из ключевых аспектов управления элементами на сцене является выбор объектов — возможность ссылаться на них, изменять, фильтровать или группировать для дальнейшей работы.
В Paper.js объекты сцены представляются как Item.
Все объекты, такие как Path, Raster,
Group, Shape, наследуются от класса
Item, что позволяет применять к ним единый набор методов
для выбора и манипуляции.
Каждый объект, созданный в Paper.js, автоматически добавляется в
активный проект (project.activeLayer по
умолчанию). Для получения ссылки на объект можно использовать следующие
подходы:
var circle = new Path.Circle({
center: [100, 100],
radius: 50,
fillColor: 'red'
});
Здесь переменная circle содержит ссылку на объект круга.
Эта ссылка позволяет напрямую изменять свойства объекта:
position, fillColor, strokeColor,
scale() и другие.
Слой (Layer) содержит массив children,
который хранит все объекты, добавленные в этот слой. Выбор объектов
внутри слоя осуществляется через:
var allItems = project.activeLayer.children;
Особенности:
children возвращает живой массив
объектов, который обновляется при добавлении или удалении объектов.project.activeLayer.children[0].var paths = project.activeLayer.children.filter(function(item){
return item instanceof Path;
});
Paper.js предоставляет методы для работы с объектами на основе их свойств:
item.nameКаждому объекту можно присвоить имя:
var rect = new Path.Rectangle({
point: [50, 50],
size: [100, 100],
fillColor: 'blue',
name: 'myRect'
});
Для поиска объекта по имени:
var found = project.activeLayer.findChildren({ name: 'myRect' });
Метод findChildren возвращает массив всех объектов,
соответствующих критериям. Можно искать по типу,
именам, функциональному фильтру:
var redItems = project.activeLayer.findChildren(function(item){
return item.fillColor && item.fillColor.toCSS(true) === '#ff0000';
});
Paper.js позволяет фильтровать объекты по их типу, что особенно полезно при работе с большим количеством элементов:
var circles = project.activeLayer.children.filter(function(item){
return item instanceof Path.Circle;
});
Альтернативно, можно использовать findChildren с
фильтром по классу:
var circles = project.activeLayer.findChildren({ class: Path.Circle });
Группы (Group) используются для объединения объектов и
управления ими как одним целым. Группа сама является объектом
Item, поэтому методы выбора применимы как к группе, так и к
её дочерним элементам:
var group = new Group();
var c1 = new Path.Circle([50, 50], 20);
var c2 = new Path.Circle([100, 50], 20);
group.addChildren([c1, c2]);
Для выбора дочерних элементов группы:
var children = group.children;
var circlesInGroup = group.children.filter(item => item instanceof Path.Circle);
Paper.js поддерживает методы для работы с пространственными координатами:
item.hitTest(point) — проверяет попадание точки в
объект.project.activeLayer.hitTest(point) — возвращает первый
объект, попавший под точку.Пример:
var hitResult = project.activeLayer.hitTest(new Point(100, 100));
if(hitResult) {
hitResult.item.fillColor = 'green';
}
Параметры hitTest позволяют уточнять, какие элементы
проверять: fill, stroke,
segments, bounds.
Для сложных сцен удобно использовать комбинацию методов:
var selectedItems = project.activeLayer.children
.filter(item => item.fillColor)
.filter(item => item.fillColor.toCSS(true) === '#ff0000')
.map(item => {
item.scale(1.2);
return item;
});
Таким образом можно создавать цепочки фильтрации, применять трансформации и изменять визуальные свойства одновременно.
Метод findChildren может искать вложенные
объекты внутри групп:
var allRedItems = project.activeLayer.findChildren(function(item){
return item.fillColor && item.fillColor.toCSS(true) === '#ff0000';
}, true); // true — рекурсивный поиск
Рекурсивный поиск полезен для сложных сцен с несколькими уровнями групп.
Layer) и его
children — основной механизм обхода всех
элементов.Эти инструменты обеспечивают полный контроль над сценой Paper.js и позволяют строить как простые, так и комплексные интерактивные приложения.