Skip to main content
Participant
March 21, 2015
Answered

remove specific pathPoints from a polygon

  • March 21, 2015
  • 2 replies
  • 856 views

Hi, I'm new here, sorry if this is a dumb question.  I couldn't find it in any of the (rather scanty) documentation on InDesign scripting.

I have a closed polygon (single path) named myFS and want to remove 2 specific points (  (myleft,mybottom) and (myright, mybottom) ) from it. I know they're in there because of how I constructed the polygon.  Apparently there's no remove method for pathPoints in InDesign (unlike Illustrator). So instead I'm trying to retain all the ones I want, and skip those I don't. Here's what I've tried.  But I don't understand how Points are represented, I guess, because this doesn't work--it never finds the points I want, and so myNewFS is the same polygon as myFS.:

var myPathPoints = Array();

var myEntirePath = myFS.paths.item(0).entirePath;

for (i = 0; i< myEntirePath.length; i++) {

        var myPoint = myEntirePath;

       if (myPoint[0] == Array(myleft, mybottom)  || myPoint == Array(myright, mybottom)){

             continue;    // skip the ones I want to remove   

             } else {                 

         myPathPoints.push(myPoint);        

       }

}

var myNewFS=myDocument.polygons.add();

myNewFS.paths.item(0).entirePath = myPathPoints;

myNewFS.fillColor = myDocument.colors.item("RGB Yellow");

Thanks a lot in advance for your help!

Barbara

This topic has been closed for replies.
Correct answer Marc Autret

Hi Barbara,

Anyway, the remove() method does exist for PathPoint so you don't need to build a copy of that polygon, just loop through the pathpoints—from the end—and remove the unwanted points according to your criteria.

Note: on comparing [x,y] coordinates coming from InDesign rulers I strongly recommend you convert numbers into strings and base your code on string comparisons, because obscure rounding issues may occur due to measurement unit conversions and they are undetectable using == or === on numbers. Someday I've encountered a weird case: myPathPoint.anchor[0] was returning some number (say 100) but it wasn't possible to validate the condition myPathPoint.anchor[0]==100, despite the fact that myPathPoint.anchor[0].toSource() was exactly returning Number(100). Coercing the value into a string solved the issue.

So here is the code I would suggest:

// ---

// Given myFS (Polygon, no curve) and

// myleft, myright, mybottom (Numbers)

// ---

var LB = [myleft, mybottom].join('|'),

    RB = [myright, mybottom].join('|'),

    myPathPoints = myFS.paths[0].pathPoints.everyItem().getElements(),

    i = myPathPoints.length, pp, xy;

while( i-- )

    {

    xy = (pp=myPathPoints).anchor.join('|');

    if( xy==LB || xy==RB ) pp.remove();

    }

@+

Marc

2 replies

Marc Autret
Marc AutretCorrect answer
Legend
March 22, 2015

Hi Barbara,

Anyway, the remove() method does exist for PathPoint so you don't need to build a copy of that polygon, just loop through the pathpoints—from the end—and remove the unwanted points according to your criteria.

Note: on comparing [x,y] coordinates coming from InDesign rulers I strongly recommend you convert numbers into strings and base your code on string comparisons, because obscure rounding issues may occur due to measurement unit conversions and they are undetectable using == or === on numbers. Someday I've encountered a weird case: myPathPoint.anchor[0] was returning some number (say 100) but it wasn't possible to validate the condition myPathPoint.anchor[0]==100, despite the fact that myPathPoint.anchor[0].toSource() was exactly returning Number(100). Coercing the value into a string solved the issue.

So here is the code I would suggest:

// ---

// Given myFS (Polygon, no curve) and

// myleft, myright, mybottom (Numbers)

// ---

var LB = [myleft, mybottom].join('|'),

    RB = [myright, mybottom].join('|'),

    myPathPoints = myFS.paths[0].pathPoints.everyItem().getElements(),

    i = myPathPoints.length, pp, xy;

while( i-- )

    {

    xy = (pp=myPathPoints).anchor.join('|');

    if( xy==LB || xy==RB ) pp.remove();

    }

@+

Marc

barbaraeAuthor
Participant
March 22, 2015

Hi Marc, This did the trick!  Thanks a lot, especially about the InDesign measurement unit conversions!   Barbara

Jongware
Community Expert
Community Expert
March 21, 2015

‌It's this construction that does not work:

if (myPoint[0] == Array(myleft, mybottom) ...

-- a Javascript limitation, not specific to InDesign's implementation. Compare arrays by comparing their individual elements instead.