• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Script API for stroke align dashes to path corners?

Community Expert ,
Jan 18, 2022 Jan 18, 2022

Copy link to clipboard

Copied

Hi all, does anybody know if, via ExtendScript, we can determine if a stroked path item is "aligning to corners and path ends, adjusting lengths to fit"? I'm talking about this option in the UI:

Screen Shot 2022-01-16 at 11.11.35 am.png

 

I couldn't find anything in the object model, but might have missed something. If it turns out that this property isn't exposed via the API, I can probably make a hack that analyzes the outlined stroke to check, but I'd rather not have to. Thanks for looking.

- Mark

 

TOPICS
Scripting

Views

485

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Expert , Jan 22, 2022 Jan 22, 2022

I've written a function that returns true when the item has dashes aligned. Figured I should post it here for anyone who happens along later.

- Mark

 

Edit: now works with compoundPaths.

 

 

 

/*

    Get Stroke Dashes Alignment Style
    For Adobe Illustrator 2022

    by m1b,
    here: https://community.adobe.com/t5/illustrator-discussions/script-api-for-stroke-align-dashes-to-path-corners/td-p/12689425

    This function returns true if the item's stroke
    dash alignment is set to 'aligning
...

Votes

Translate

Translate
Adobe
Community Expert ,
Jan 18, 2022 Jan 18, 2022

Copy link to clipboard

Copied

Oh, just found this post, asking same question. Sorry for repeat.

- Mark

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guide ,
Jan 19, 2022 Jan 19, 2022

Copy link to clipboard

Copied

Hi @m1b.  Is this part of your attempt so solve this problem?  If so, I would be interested in what your general approach is.  I ask because I gave it some thought at the time, but got nowhere. 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jan 19, 2022 Jan 19, 2022

Copy link to clipboard

Copied

Yes exactly @femkeblanco! I'm still chipping away at it, bit by bit. I think I'll have a solution soon, depending on how much time I get to work on it this week. It really sent me down a rabbit hole! I will post on the original thread when I get somewhere.

- Mark

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guide ,
Jan 19, 2022 Jan 19, 2022

Copy link to clipboard

Copied

Good luck!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jan 22, 2022 Jan 22, 2022

Copy link to clipboard

Copied

LATEST

I've written a function that returns true when the item has dashes aligned. Figured I should post it here for anyone who happens along later.

- Mark

 

Edit: now works with compoundPaths.

 

 

 

/*

    Get Stroke Dashes Alignment Style
    For Adobe Illustrator 2022

    by m1b,
    here: https://community.adobe.com/t5/illustrator-discussions/script-api-for-stroke-align-dashes-to-path-corners/td-p/12689425

    This function returns true if the item's stroke
    dash alignment is set to 'aligning to corners
    and path ends, adjusting lengths to fit'.

    At this time there is no API access to this setting
    so this method is quite hacky: it converts a model
    duplicate of the item into outline stroke
    and counts the number of dashes.

    `item` must be a pathItem or compoundPathItem
    and must have a dashed stroke.

*/


alert(strokeDashesAreAligned(app.activeDocument.selection[0]));


function strokeDashesAreAligned(item, keepSelection) {
    if (
        item == undefined || !(item.hasOwnProperty('pathPoints') || item.hasOwnProperty('pathItems'))
    ) return;

    var dashesAreAligned;

    // we only worry about storing the
    // selection because the outline
    // stroke test later destroys it
    keepSelection = keepSelection || true;
    var doc = getParentDocument(item),
        selectedItems = [];
    if (keepSelection) {
        for (var i = 0; i < doc.selection.length; i++) {
            selectedItems.push(doc.selection[i]);
        }
    }

    if (item.typename == 'CompoundPathItem') {

        // COMPOUND PATH ITEM

        if (
            item.pathItems[0].stroked == false
            || item.pathItems[0].strokeDashes.length == 0
        ) return;

        // duplicate
        var dup = item.duplicate();
        doc.selection = null;
        dup.selected = true;
        // uncompound
        app.executeMenuCommand('noCompoundPath');
        // collect the resulting path items
        var pathItemsToDelete = [];
        for (var i = 0; i < doc.selection.length; i++)
            pathItemsToDelete.push(doc.selection[i]);

        // get result on just the first path
        dashesAreAligned = strokeDashesAreAligned(pathItemsToDelete[0], keepSelection);

        // remove uncompounded duplicates
        for (var i = pathItemsToDelete.length - 1; i >= 0; i--)
            pathItemsToDelete[i].remove();

    } else {

        // PATH ITEM

        if (
            item.stroked == false
            || item.strokeDashes.length == 0
        ) return;

        // duplicate item
        var modelPathItem = item.duplicate();

        // standardise model
        var standardPoints = [[0, 0], [3, 0]];
        modelPathItem.filled = false;
        modelPathItem.stroked = true;
        modelPathItem.strokeWidth = 0.1;
        modelPathItem.strokeDashes = [1];
        modelPathItem.closed = false;
        for (var i = modelPathItem.pathPoints.length - 1; i >= 0; i--) {
            if (i >= standardPoints.length) {
                modelPathItem.pathPoints[i].remove();
            } else {
                modelPathItem.pathPoints[i].anchor = standardPoints[i];
                modelPathItem.pathPoints[i].leftDirection = standardPoints[i];
                modelPathItem.pathPoints[i].rightDirection = standardPoints[i];
            }
        }

        // convert to outlined stroke
        // must clear selection to do this
        doc.selection = null;
        modelPathItem.selected = true;
        app.executeMenuCommand('OffsetPath v22');
        modelPathItem = doc.selection[0];

        // the model, once converted to compoundPathItem,
        // will have 2 pathItems if dashes are not aligned,
        // or 3 if dashes are aligned
        var dashesAreAligned = modelPathItem.pathItems.length == 3;

        // remove the model and reselect the original
        modelPathItem.remove();

        // re-instate inital selection
        for (var i = 0; i < selectedItems.length; i++) {
            selectedItems[i].selected = true;
        }
    }

    return dashesAreAligned;
}

function getParentDocument(obj) {
    while (obj.hasOwnProperty('parent') && obj.constructor.name != 'Document')
        obj = obj.parent;
    return obj;
}

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines