2016-07-13 1 views
0

Je veux écrire un script qui effectue les opérations suivantes:Choisir, ajuster et distribuer les cadres de texte dans InDesign [ExtendScript]

  • sélectionner certains cadres de texte
  • centre
  • la sélection horizontalement
  • distribuer les images horizontalement
  • la routine entière doit être faite sur plusieurs pages

Mon premier problème est, que je veux seulement choisir ct textframes à partir d'un calque déverrouillé. J'ai trouvé plusieurs solutions où tous les textframes, même sur des calques verrouillés, ont été sélectionnés. Et la seule solution que j'ai trouvé jusqu'ici qui ne fait que sélectionner les textframes de ma couche déverrouillée (app.menuActions.item("$ID/Select &All").invoke();) ne fournit pas un objet avec lequel je peux travailler (ajuster, distribuer) par la suite.

Existe-t-il une solution à mes besoins?


Edit: Ma dernière tentative ressemblait à ceci (pour une seule page, je ne l'ai pas utilisé une boucle pour plusieurs pages lors du test):

// 'allPageItems' erfasst alle Rahmen, zusätzlich Gruppen und Bilder 
var allObjects = app.activeDocument.layoutWindows[0].activeSpread.allPageItems; 
// eine Schleife durch die Objekte 
for (var n=0; n<allObjects.length; n++) { 
    var curObject = allObjects[n]; 
    // prüfen, ob Textrahmen 
    if (curObject.constructor.name == "TextFrame") { 
     // verankerte Textrahmen ausschliessen 
     if (curObject.parent != "[object Character]") { 
      // zur Auswahl hinzufügen 
      curObject.select(SelectionOptions.ADD_TO); 
     } 
    } 
} 
+0

Bienvenue sur SO! Qu'avez-vous essayé de faire loin? :) – GibboK

+1

J'ai ajouté du code que j'ai déjà essayé @GibboK – yaksey

Répondre

2

En général, la sélection est quelque chose qui est destiné à l'interaction de l'interface utilisateur, pas pour les scripts. Par conséquent, vous devriez éviter de manipuler tous les éléments de sélection dans votre script et collecter les textFrames en tant qu'objets dans un tableau que vous pouvez ensuite utiliser pour faire les autres choses.

Cela devrait fonctionner:

#target indesign 

var doc = app.activeDocument; 
var curSpread = doc.layoutWindows[0].activeSpread; 
var spreadItems = curSpread.allPageItems; 

var distObjects = []; 

// collect all relevant objects in distObjects 
for (var i = 0; i < spreadItems.length; i += 1) { 
    var si = spreadItems[i]; 

    // skip if itemLayer is locked 
    if (si.itemLayer.locked) continue; 

    // skip if item is not a textFrame 
    if (!(si instanceof TextFrame)) continue; 

    // skip if item is anchored 
    if (si.parent.constructor.name === "Character") continue; 

    distObjects.push(si); 
}; 

// group all collected objects to center them, then ungroup 
var distGroup = curSpread.groups.add(distObjects); 
doc.align([distGroup], AlignOptions.HORIZONTAL_CENTERS, AlignDistributeBounds.SPREAD_BOUNDS); 
distGroup.ungroup(); 

// distribute all objects horizontally 
doc.distribute(distObjects, DistributeOptions.HORIZONTAL_CENTERS, AlignDistributeBounds.ITEM_BOUNDS); 

Note: Si cela est utilisé avec une version plus ancienne d'identité (avant CC2014 je crois), après dégrouper, tous pageItems resteront sur la même couche. La fonctionnalité pour eux de revenir à la couche d'origine n'a été introduite que récemment. Si vous avez besoin d'une solution pour une version plus ancienne d'InDesign, vous devrez calculer les limites du groupe d'objets que vous avez trouvé, puis les compenser un par un, de sorte que toute la "sélection" puisse être centrée.

+0

Fonctionne comme un charme, merci beaucoup! Et merci pour les informations plus détaillées sur la façon dont la sélection devrait fonctionner dans un script. – yaksey