Как сохранить маржу (позиции) одинаковыми при изменении размеров объектов - PullRequest
0 голосов
/ 14 февраля 2020

В чем проблема?

Я не хочу путать сообщество с моим вопросом, поэтому скажу, что мой вопрос основан на Javascript (особенно DOM в Photoshop). Поэтому, если кто-то может помочь мне с функцией / logi c, для которой требуется основа c javascript, тогда он может приложить усилия для дальнейшего чтения, спасибо.

Сейчас; Ситуация такова, что я делаю бесплатную ie плагин для Photoshop (HTML Panel) под названием "PS Blender", которая будет имитировать ту же функциональность, что и Blend Tool в Illustrator, хотя Illustrator имеет очень сложный и мощный Варианты наложения, пока я планирую смешивать только основные c с позициями, поворотами, масштабами и прозрачностью. Первый опытный образец готов, и я проверил, где все работало хорошо, кроме смешивания масштаба. Прежде чем мы продолжим, пожалуйста, посмотрите ниже GIF-файлы, чтобы вы могли понять ситуацию.

  • Сначала попробуйте с позициями и прозрачностью, которая, кажется, работает отлично First try with positions and transparency, which seems working perfectly

  • Вторая попытка с включенным масштабированием, которая не работает хорошо (результат должен быть таким, как я чистил в конце GIF) Second try with scaling included, which doesn't works well (The result should be like I brushed in the end of GIF)

Мой код, касающийся проблемы

Итак, вся функция генерации Blend - это ....

function generateBlend(data) {
    //Get user's input from panel
    var newLayerPositionX = data.split("&&&&")[0];
    var newLayerPositionY = data.split("&&&&")[1];
    var newLayerScaleX = data.split("&&&&")[2];
    var newLayerScaleY = data.split("&&&&")[3];
    var newLayerRotation = data.split("&&&&")[4];
    var newLayerTransparency = data.split("&&&&")[5];
    var steps = parseInt(data.split("&&&&")[6]);
    //calculates the difference between values where start values are the real data and new values are user input
    var xTransform = parseFloat(newLayerPositionX) - parseFloat(startLayerPositionX);
    var yTransform = parseFloat(newLayerPositionY) - parseFloat(startLayerPositionY);
    var xScale = parseFloat(newLayerScaleX) - parseFloat(startScaleX); //if positive then increase size and on negative decrease
    var yScale = parseFloat(newLayerScaleY) - parseFloat(startScaleY);
    var rot = parseFloat(newLayerRotation) - parseFloat(startRotation);
    var trans = parseFloat(newLayerTransparency) - parseFloat(startTransparency);
    //dummy variables to call after every increment in for loop
    var masterScaleX = parseFloat(startScaleX);
    var masterScaleY = parseFloat(startScaleY);
    var masterRotation = parseFloat(startRotation);
    var masterTransparency = parseFloat(startTransparency);
    //create a new smart object to start copying and cloning layers (steps)
    editSmartObject();
    duplicateLayer();
    moveLayerBelow();
    convertToSmart();
    renameLayer("SmartObject");
    //define masterPositionX and Y because startPositionX is the value of layers bound which lies in original document while our current layer lies in the smart object of original document so bounds need to be updated
    var docRef = app.activeDocument;
    var curLayer = docRef.activeLayer;
    var curLayerBounds = curLayer.bounds;
    var curLayerPositionX = curLayerBounds[0].value + ((curLayerBounds[2].value - curLayerBounds[0].value) / 2);
    var curLayerPositionY = curLayerBounds[1].value + ((curLayerBounds[3].value - curLayerBounds[1].value) / 2);
    var masterPositionX = parseFloat(curLayerPositionX);
    var masterPositionY = parseFloat(curLayerPositionY);
    //generates incremental values i.e. 50px move in 5 steps gives 10px per step.
    var splitPositionX = parseFloat(xTransform) / steps;
    var splitPositionY = parseFloat(yTransform) / steps;
    var splitScaleX = parseFloat(xScale) / steps;
    var splitScaleY = parseFloat(yScale) / steps;
    var splitRotation = parseFloat(rot) / steps;
    var splitTransparency = parseFloat(trans) / steps;
    //the main code for generating blends starts here
    for (var i = 0; i < steps; i++) {
        //updates masterPositing by adding splits
        masterPositionX = masterPositionX + parseFloat(splitPositionX);
        masterPositionY = masterPositionY + parseFloat(splitPositionY);
        //Photoshop DOM Scale method is relative rather than absolute so if we will change scale to 50 then it won't resize object by 50% but it will resize objects half by it's current size so we need to tweak resize method
        var masterScaleX = parseFloat(((masterScaleX + splitScaleX) * 100) / masterScaleX);
        var masterScaleY = parseFloat(((masterScaleY + splitScaleY) * 100) / masterScaleY);
        var masterRotation = masterRotation + parseFloat(splitRotation);
        var masterTransparency = masterTransparency + parseFloat(splitTransparency);
        //starts looping in where order will be duplicate SO-clear mask-move downside-apply transformation-select above layer-select bound-below layer mask (This all steps are what makes blend layers)
        try {
            duplicateLayer();
            moveLayerBelow();
            if (hasMask() == true) {
                selectLayerMask();
                deleteLayerMask();
            }
            transformLayer(parseFloat(splitPositionX), parseFloat(splitPositionY))
            resizeLayer(masterScaleX, masterScaleY);
            rotateLayer(masterRotation);
            changeTransparency(masterTransparency);
            revealAll();
            selectAboveLayer();
            selectBoundOfLayer()
            selectBelowLayer();
            createMask();
            invert();
            trim();
        } catch (e) {
            alert(e);
        }
    }
}

Как вы можете видеть выше в сегменте try, я делаю все вызов отдельных методов; Теперь все, что вас может заинтересовать, - это метод Resize с кодом ....

function resizeLayer(xScale, yScale) {
    app.activeDocument.activeLayer.resize(xScale, yScale, AnchorPosition.MIDDLECENTER);
}

Смотрите, это очень базовая c функция, напрямую разветвленная из Официальной ссылки JS.

Что я пробовал?

Ну, я пробовал несколько различных методов, таких как изменение AnchorPosition и т. Д. c, но поскольку направление смешивания может быть любым, я не могу найти способ заставить его работать. Ну, функция делает это работает. Давайте рассмотрим простой пример: подумайте, что слой должен перемещаться на 10 пикселей на каждом шаге и должен изменять размер на 5%. Теперь, если не будет никакого изменения размера, он будет перемещать клоны на каждые 10 пикселей, но если мы теперь изменим его размер, тогда нам нужно чтобы переместить клонов на 10px + область, уменьшенная из-за изменения размера, и эту область кажется невозможной, поскольку я вообще не являюсь разработчиком и хорошо знаю основы JS.

Что мне нужно?

Все, что мне нужно, это несколько советов о том, как мне написать код c изменения размера для решения этой проблемы. Весь ваш вклад будет очень полезен, так как это freeb ie, который я делаю для сообщества, я могу поделиться исходным кодом, если вам тоже нужно. Спасибо, что уделили время на мой вопрос.

С наилучшими пожеланиями!

1 Ответ

0 голосов
/ 17 февраля 2020

Процесс был довольно прост, и у самого вопроса был ответ, но я никогда не думал об этом с этой точки зрения. проблема заключалась в том, как сохранить поле, даже когда объект уменьшен, и все, что мне нужно было сделать, это добавить уменьшенные пиксели к xDisplacement, и это сработало отлично. решил не делать плагин самостоятельно, так как боюсь, что у меня могут возникнуть сотни вопросов, так как я новичок ie в разработке, обновленный код и первый прототип доступны на PS Blender GitHub страница. (Я выпустил его как открытый источник, может быть, я могу опубликовать ссылку)

...