Paper.js Игнорирование выбора изображения

Я работаю с Paper.js и пытаюсь создать "Selection-Via-Intersection "

Я имею в виду, что пользователь рисует прямоугольник выбора, и выбираются элементы, чьи контуры пересекаются ИЛИ любая из их точек внутри прямоугольника выбора.

Теперь с элементами пути все в порядке, но с растровым изображением возникают проблемы:

Это способ игнорировать растровое изображение в выборе ИЛИ заставить его каким-то образом работать с растром (если да, я был бы признателен за простой ответ, иначе я не смогу его реализовать, любители и все такое).

С моим текущим кодом Chrome возвращает: Uncaught TypeError: Cannot read property 'length' of undefined

Это код на данный момент:

// Returns path points which are contained in the rect. 
function getSegmentsInRect(rect) {
    var segments = [];

    function checkPathItem(item) {
        if (item._locked || !item._visible || item._guide)
            return;
        var children = item.children;
        if (!rect.intersects(item.bounds))
            return;
        if (item instanceof paper.Path) {
            for (var i = 0; i < item.segments.length; i++) {
                if (rect.contains(item.segments[i].point))
                    segments.push(item.segments[i]);
            }
        } else {
            for (var j = children.length-1; j >= 0; j--)
                checkPathItem(children[j]);
        }
    }

    for (var i = paper.project.layers.length - 1; i >= 0; i--) {
        checkPathItem(paper.project.layers[i]);
    }

    return segments;
}

// Returns all items intersecting the rect.
// Note: only the item outlines are tested.
function getPathsIntersectingRect(rect) {
    var paths = [];
    var boundingRect = new paper.Path.Rectangle(rect);

    function checkPathItem(item) {
        var children = item.children;
        if (item.equals(boundingRect))
            return;
        if (!rect.intersects(item.bounds))
            return;
        if (item instanceof paper.PathItem) {
            if (rect.contains(item.bounds)) {
                paths.push(item);
                return;
            }
            var isects = boundingRect.getIntersections(item);
            if (isects.length > 0)
                paths.push(item);
        } else {
            for (var j = children.length-1; j >= 0; j--)
                checkPathItem(children[j]);
        }
    }

    for (var i = 0, l = paper.project.layers.length; i < l; i++) {
        var layer = paper.project.layers[i];
        checkPathItem(layer);
    }

    boundingRect.remove();

    return paths;
}

// Returns bounding box of all selected items.
function getSelectionBounds() {
    var bounds = null;
    var selected = paper.project.selectedItems;
    for (var i = 0; i < selected.length; i++) {
        if (bounds == null)
            bounds = selected[i].bounds.clone();
        else
            bounds = bounds.unite(selected[i].bounds);

И вот как я определяю свой растр

function placeImage() {

    var raster = new paper.Raster('mona');
    raster.addChild;
    raster.position = paper.view.center;
    raster.selected = true;
    raster.index = 0;

}

person nicholaswmin    schedule 28.03.2014    source источник


Ответы (1)


Мы можем использовать item.type, чтобы проверить, является ли элемент, пересекающий Прямоугольник выбора, ''Растровым''.

Я добавил дополнительный оператор IF, который делает именно это.

IF(item.type === "Raster"){
return;
}

Таким образом, элементы типа Raster игнорируются.

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

ОБНОВЛЕНИЕ: Paper.js v0.9.17 использует className вместо type для определения типа. элемента.

Поэтому функция выше меняется на это:

IF(item.className === "Raster"){
    return;
    }
person nicholaswmin    schedule 29.03.2014