Quantcast
Channel: Adobe Community : Popular Discussions - Illustrator Scripting
Viewing all articles
Browse latest Browse all 12845

apply clipping mask to every top level group in document

$
0
0

Example file: https://drive.google.com/file/d/0BzEoJSYDhH_WcXhIalFRTk9qOGc/view?usp=sharing

 

We can assume:

• Grouped art on setups with a named die line.

• All groups exist on 'Layer 1'

 

I am looping through the groups and working with groups who's parent is 'layer'. I was looping through all the groups in the document, but when I created the clipping mask it creates a new group and screws up my loop. I am now looping only through the groups on 'Layer 1' and moving them to a new layer before doing the clipping mask. My script is breaking after the group has successfully moved to the new layer. I have a bunch of alerts in it for debugging.

 

#target Illustrator


var idocX = app.activeDocument;
var li = idocX.layers;


function meetTheParents(PageItem){
  if (PageItem.parent.typename = "Layer"){  return "Layer";  } else if (PageItem.parent.typename = "GroupItem"){  return "Group";  }
}

function isLayerFree(layer){
  if (layer.locked == false && layer.visible == true){  var gpa = layer.parent;  isLayerFree(gpa);  return true  } else {  return false  }
}


var trLyr = li.add();
trLyr.name = "TRASH";
var l1 = li.getByName('Layer 1');
for (j = l1.groupItems.length -1; j >= 0; j--) {  app.executeMenuCommand ('deselectall');  var iGroup = l1.groupItems[j];  if (iGroup.hidden==false && iGroup.locked==false) {  if (meetTheParents(iGroup) == "Layer"){  if (isLayerFree(iGroup.parent)){  iGroup.move(trLyr, ElementPlacement.PLACEATBEGINNING);  // set die variable to die in current selection  alert ("Group " + j + " moved to trash layer");  alert ("trash layer path items length = " + trLyr.pathItems.length); // I'm getting '0' here even though I just moved items into it.  var die = trLyr.pathItems.getByName('proofLine'); // script breaks here  alert ("Die identified for this group");  die.move(trLyr, ElementPlacement.PLACEATBEGINNING);  for (a = 0; a < trLyr.pageItems.length; a++){  var thing = trLyr.pageItems[a];  if (thing.hidden==false && thing.locked==false){  thing.selected = true;  }  }  var sel = idocX.selection; // get selection  alert (sel.length + " items in current selection.");  // make clipped group of die with art inside  if (sel.length==2) {// continue only if 2 objects are selected  var igroup = idocX.groupItems.add(); // add a group that will be the clipping mask group  var imask = sel[0]; // the mask is the object on top  var ipath = sel[1]; // the "drawn object" is at the bottom  var idup = imask.duplicate(); // duplicate the mask, to later get the fill and stroke to apply to the clipping path  ipath.move (igroup, ElementPlacement.PLACEATBEGINNING); // add both path to the group  imask.move (igroup, ElementPlacement.PLACEATBEGINNING);  imask.clipping = true; // make the mask the clipping path  igroup.clipped = true; // clip the everything in the group to the clipping mask  if (idup.filled == true){  imask.fillColor = idup.fillColor; // add fill color, same as the dup  }  imask.stroked = true; // stroke the mask  imask.strokeWidth = idup.strokeWidth; // add stroke width, same as the dup  imask.strokeColor = idup.strokeColor; // add stroke color, seme as the dup  idup.remove(); // remove the duplicate  }else { // show this message if other than 2 objects are selected  alert("Select both, the Mask and the object that needs to be 'inside'.\rThe Mask needs to be the top most object.");  }  app.executeMenuCommand ('deselectall');  igroup.move (l1, ElementPlacement.PLACEATBEGINNING);  }  }  }
}
trLyr.remove();

 

Inside my larger script it breaks silently, in this example script it gives me a "no such element". There should be such an element, I just put it there. After the script closes, the group has been moved, meaning that the named path is right where it should be.


Viewing all articles
Browse latest Browse all 12845

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>