2017-03-20 1 views
0

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:

  1. Boucler chaque couche;
  2. Copiez le contenu dans un nouveau calque (facultatif peut-être, mais travailler avec les calques d'origine semblait très problématique);
  3. Parcourez tous les groupes de la couche pour en trouver un avec pathItem[0].clipping === true;
  4. Retirer le masque d'écrêtage;
  5. Sélectionnez et regroupez tout ce qui reste sur le calque;
  6. Créez un rectangle au-dessus de l'illustration avec les mêmes dimensions et coordonnées que le masque d'écrêtage;
  7. Sélectionnez à la fois le groupe et le rectangle; et
  8. Exécuter Outline Stroke, Pathfinder > Crop et Expand 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(); 
} 

Répondre

1

Oui, vous pouvez exécuter Pathfinder> Rogner par la création d'action et l'exécuter à partir du code.

  • panneau d'action ouvert et créer de nouveaux ensembles d'action, par exemple PathfinderSet
  • créer une nouvelle action vide, par exemple acte cultures
  • d'enregistrement de début et enregistrer une étape - application cultures pathfinder à certains objets
  • ouvrir le menu contextuel d'action et enregistrer PathfinderSet à déposer, par exemple 'pathfinder-actions.aia'

Exécuter cette action à partir du script:

var fAction = new File('pathfinder-actions.aia'); 
    app.loadAction(fAction); 
    app.doScript("act-crop", "PathfinderSet", false); 
    app.unloadAction("PathfinderSet",""); 
+0

C'est exactement ce que j'ai fini par faire. –