TLDR: Je dois exécuter Pathfinder > Crop
sur toutes les illustrations dans un fichier qui a un masque d'écrêtage appliqué mais qui ne semble pas déclencher correctement le rognage.Puis-je exécuter "Pathfinder> Crop" à partir du panneau Pathfinder et PAS le menu "Effets> Pathfinder"?
MISE À JOUR: Après des heures de rogner à ce que je me suis rendu compte que l'option des cultures dans le menu principal (« Effet> Pathfinder> Crop ») fait tout autre chose que le bouton Rogner dans le panneau Pathfinder. J'utilise app.executeMenuCommand('Live Pathfinder Crop');
pour recadrer l'image, mais cela déclenche apparemment l'action du menu. Je dois accéder à l'action de recadrage à partir du panneau Pathfinder.
J'ai plusieurs couches d'art qui ont des masques d'écrêtage appliqués. Les masques provoquent plusieurs problèmes dans le produit final, donc j'ai besoin de:
- Boucler chaque couche;
- Copiez le contenu dans un nouveau calque (facultatif peut-être, mais travailler avec les calques d'origine semblait très problématique);
- Parcourez tous les groupes de la couche pour en trouver un avec
pathItem[0].clipping === true
; - Retirer le masque d'écrêtage;
- Sélectionnez et regroupez tout ce qui reste sur le calque;
- Créez un rectangle au-dessus de l'illustration avec les mêmes dimensions et coordonnées que le masque d'écrêtage;
- Sélectionnez à la fois le groupe et le rectangle; et
- Exécuter
Outline Stroke
,Pathfinder > Crop
etExpand
sur les éléments sélectionnés.
Voici mon script tel qu'il est.
#target illustrator
var doc = app.activeDocument;
var tempName = '-temp';
function cropGroups() {
var layers = doc.layers;
var layerCount = layers.length;
// Lock all layers
for (var i = 0; i < layerCount; i++) {
layers[i].locked = true;
}
for (var i = 0; i < layerCount; i++) {
var layer = layers[i];
// Create new empty layer
var layerCopy = layers.add();
layerCopy.name = layer.name + tempName;
// Copy all objects from original layer to new layer
var pageItems = layer.pageItems;
var pageItemCount = pageItems.length;
for (var a = pageItemCount - 1; a >= 0; a--) {
pageItems[a].duplicate(layerCopy, ElementPlacement.PLACEATBEGINNING);
}
// Loop through the new layer’s groups
var groups = layerCopy.groupItems;
var totalGroups = groups.length;
for (var g = totalGroups - 1; g >= 0; g--) {
var group = groups[g];
// Ensure group isn’t empty and has a clipping mask
if (group.pathItems.length && group.pathItems[0].clipping) {
var clippingMask = group.pathItems[0];
var clippingRect = { left: clippingMask.left, top: clippingMask.top, height: clippingMask.height, width: clippingMask.width };
clippingMask.remove();
// Time to start the selection dance…
layerCopy.hasSelectedArtwork = true;
// Add selected items to a new group
var selectedItems = doc.selection;
var cropGroup = layerCopy.groupItems.add(); // Create empty group
for (var s = 0; s < selectedItems.length; s++) {
selectedItems[s].move(cropGroup, ElementPlacement.PLACEATEND); // Add all selected items to the new group
}
doc.selection = null;
// Create a new rectangle that matches the size of the clipping mask
var tile = layerCopy.pathItems.rectangle(clippingRect.top, clippingRect.left, clippingRect.width, clippingRect.height);
var tileColor = new RGBColor;
tile.fillColor = tileColor;
tile.move(layerCopy, ElementPlacement.PLACEATBEGINNING);
// Select all layer art again
// layerCopy.hasSelectedArtwork = true;
tile.selected = true;
cropGroup.selected = true;
// Live Pathfinder Crop
app.executeMenuCommand('OffsetPath v22');
app.executeMenuCommand('Live Pathfinder Crop');
app.executeMenuCommand('expandStyle');
doc.selection = null;
}
}
// Return the layer name back to it’s original
layerCopy.name = layerCopy.name.replace(tempName, '');
// Remove the original layer
layer.locked = false;
layer.remove();
}
}
cropGroups();
Cela fonctionne techniquement bien, mais l'action de recadrage n'est pas du tout ce à quoi je m'attendais. Lorsque je cours le script sans lignesexecuteMenuCommand
, puis exécutez ces commandes manuellement dans Illustrator tout est recadré parfaitement.
Qu'est-ce qui me manque ici?
SOLUTION:
Il semble que la fonction « Crop » à partir du panneau Pathfinder réel n'est pas disponible via ExtendScript, donc je fini par faire une action qui ne gère que cette tâche et l'enregistrer en tant que fichier . Ensuite, je l'appelle pour chaque masque de détourage dans le document:
function cropTiles(cb) {
// Load the action file relative to the location of this script
var thisFile = new File($.fileName);
var basePath = thisFile.path;
app.unloadAction('action','');
app.loadAction(new File(basePath + '/actions/action.aia'));
doc.selection = null;
app.executeMenuCommand("Clipping Masks menu item");
var thisClipItem;
var esc = 50;
while (doc.selection.length != 0 && esc > 0) {
esc--;
thisClipItem = doc.selection[0];
doc.selection = null;
thisClipItem.parent.selected = true;
app.executeMenuCommand('Live Outline Stroke');
app.doScript('Crop Gallery Tile', 'action');
app.executeMenuCommand('expandStyle');
doc.selection = null;
app.executeMenuCommand("Clipping Masks menu item");
}
cb && typeof cb === 'function' && cb();
}
C'est exactement ce que j'ai fini par faire. –