我想编写一个执行以下操作的脚本:
我的第一个问题是,我只想从未锁定的图层中选择文本框架。我找到了几种解决方案,其中所有文本框架,甚至是锁定图层都被选中。
到目前为止我发现的唯一解决方案就是从我的未锁定图层(app.menuActions.item("$ID/Select &All").invoke();
)中选择文本框架,但后来没有提供我可以使用的对象(调整,分发)。
我的要求是否有解决方案?
编辑: 我的上次尝试看起来像这样(对于单个页面,我在测试时没有使用多个页面的循环):
// '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 :(得分:2)
通常,选择是用于UI交互的,而不是用于脚本。因此,您应该避免处理脚本中的所有选择内容,并将textFrames收集为数组中的对象,然后您可以使用它来执行其他操作。
这应该有效:
#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);
注意:如果这与旧的ID版本一起使用(我相信CC2014之前),在取消分组后,所有pageItem将保留在同一层上。最近才介绍了他们返回原始图层的功能。如果你需要一个较旧的InDesign版本的解决方案,你需要计算你找到的对象组的边界,然后逐个抵消它们,所以整个&#34;选择&#34;可以集中精力。