Select,在 InDesign [ExtendScript] 中调整和分布文本框
Select, adjust and distribute textframes in InDesign [ExtendScript]
我想编写一个脚本来执行以下操作:
- select 一些文本框
- 水平居中select离子
- 水平分布帧
- 整个例程必须在几页上完成
我的第一个问题是,我只想 select 来自未锁定图层的文本框。我找到了几个解决方案,其中所有文本框,甚至锁定图层上的文本框,都被 selected。
到目前为止,我发现的唯一解决方案是 select 未锁定层 (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);
}
}
}
通常,选择是用于 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 之前)一起使用,取消分组后,所有 pageItems 将保留在同一层上。他们移回原始图层的功能是最近才推出的。如果您需要针对旧版 InDesign 的解决方案,则需要计算找到的对象组的边界,然后将它们一一偏移,这样整个 "selection" 就可以居中。
我想编写一个脚本来执行以下操作:
- select 一些文本框
- 水平居中select离子
- 水平分布帧
- 整个例程必须在几页上完成
我的第一个问题是,我只想 select 来自未锁定图层的文本框。我找到了几个解决方案,其中所有文本框,甚至锁定图层上的文本框,都被 selected。
到目前为止,我发现的唯一解决方案是 select 未锁定层 (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);
}
}
}
通常,选择是用于 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 之前)一起使用,取消分组后,所有 pageItems 将保留在同一层上。他们移回原始图层的功能是最近才推出的。如果您需要针对旧版 InDesign 的解决方案,则需要计算找到的对象组的边界,然后将它们一一偏移,这样整个 "selection" 就可以居中。