脚本在 ExtendScript 工具包中正确执行,但在 Illustrator 中不正确
Script executes properly in ExtendScript Toolkit, but not Illustrator
我编写了一个脚本,该脚本选择多个路径,复制它们,并使用操作将 "Object > Envelope distort > Make with top object" 应用于底部路径的每个副本以及选择中的所有其他路径(不要相信 DOM 中有任何东西可以直接与信封交互)。所以我从这个开始:
https://i.stack.imgur.com/cBKZs.png
它在 ExtendScript Toolkit 中完美运行,给了我这个:
https://i.stack.imgur.com/dLdRz.png
但是如果我从 Illustrator 中执行脚本,我会遇到这样的问题:
https://i.stack.imgur.com/caL0u.png
这是我的代码:
var doc = app.activeDocument;
var sel = app.activeDocument.selection;
var currentLayer = app.activeDocument.activeLayer;
function envelope(){
var arr = [];
var bottomObject = sel[sel.length - 1];
bottomObject.selected = false;
for (i = 0; i < sel.length - 1; i++){
arr.push(sel[i]);
var newObjs = sel[i].duplicate();
newObjs.zOrder(ZOrderMethod.SENDBACKWARD)
}
currentLayer.hasSelectedArtwork = false;
for (i = 0; i < arr.length; i++){
var objectsToDistribute = bottomObject.duplicate();
objectsToDistribute.zOrder(ZOrderMethod.SENDTOBACK);
arr[i].selected = true;
objectsToDistribute.selected = true;
app.doScript('Envelope all', 'scriptTest');
}
}
envelope();
Here's动作集。那么为什么我会从同一个脚本中得到不同的结果呢?有没有办法在 Illustrator 中解决这个问题?
您必须将行 currentLayer.hasSelectedArtwork = false;
移动到循环中。每次迭代都需要清除选择:
...
for (i = 0; i < arr.length; i++){
currentLayer.hasSelectedArtwork = false; // <------------- here
var objectsToDistribute = bottomObject.duplicate();
objectsToDistribute.zOrder(ZOrderMethod.SENDTOBACK);
arr[i].selected = true;
objectsToDistribute.selected = true;
app.doScript('Envelope all', 'scriptTest');
}
...
实际上你不需要动作集。
可以通过 app.executeMenuCommand('Make Envelope');
完成
这是我的脚本版本:
var sel = app.activeDocument.selection; // all the objects that have been selected
var lowest = sel[sel.length-1]; // the lowest object
for (var i=0; i<sel.length-1; i++) {
var top = sel[i].duplicate(); // make a copy of the next object
var btm = lowest.duplicate(); // make a copy of the lowest object
app.selection = null; // deselect all
top.selected = true; // select the top copy
btm.selected = true; // select the bottom copy
app.executeMenuCommand('Make Envelope'); // make Envenlope
}
唯一的区别:它变换所选对象中最低的对象。
我编写了一个脚本,该脚本选择多个路径,复制它们,并使用操作将 "Object > Envelope distort > Make with top object" 应用于底部路径的每个副本以及选择中的所有其他路径(不要相信 DOM 中有任何东西可以直接与信封交互)。所以我从这个开始:
https://i.stack.imgur.com/cBKZs.png
它在 ExtendScript Toolkit 中完美运行,给了我这个:
https://i.stack.imgur.com/dLdRz.png
但是如果我从 Illustrator 中执行脚本,我会遇到这样的问题:
https://i.stack.imgur.com/caL0u.png
这是我的代码:
var doc = app.activeDocument;
var sel = app.activeDocument.selection;
var currentLayer = app.activeDocument.activeLayer;
function envelope(){
var arr = [];
var bottomObject = sel[sel.length - 1];
bottomObject.selected = false;
for (i = 0; i < sel.length - 1; i++){
arr.push(sel[i]);
var newObjs = sel[i].duplicate();
newObjs.zOrder(ZOrderMethod.SENDBACKWARD)
}
currentLayer.hasSelectedArtwork = false;
for (i = 0; i < arr.length; i++){
var objectsToDistribute = bottomObject.duplicate();
objectsToDistribute.zOrder(ZOrderMethod.SENDTOBACK);
arr[i].selected = true;
objectsToDistribute.selected = true;
app.doScript('Envelope all', 'scriptTest');
}
}
envelope();
Here's动作集。那么为什么我会从同一个脚本中得到不同的结果呢?有没有办法在 Illustrator 中解决这个问题?
您必须将行 currentLayer.hasSelectedArtwork = false;
移动到循环中。每次迭代都需要清除选择:
...
for (i = 0; i < arr.length; i++){
currentLayer.hasSelectedArtwork = false; // <------------- here
var objectsToDistribute = bottomObject.duplicate();
objectsToDistribute.zOrder(ZOrderMethod.SENDTOBACK);
arr[i].selected = true;
objectsToDistribute.selected = true;
app.doScript('Envelope all', 'scriptTest');
}
...
实际上你不需要动作集。
可以通过 app.executeMenuCommand('Make Envelope');
这是我的脚本版本:
var sel = app.activeDocument.selection; // all the objects that have been selected
var lowest = sel[sel.length-1]; // the lowest object
for (var i=0; i<sel.length-1; i++) {
var top = sel[i].duplicate(); // make a copy of the next object
var btm = lowest.duplicate(); // make a copy of the lowest object
app.selection = null; // deselect all
top.selected = true; // select the top copy
btm.selected = true; // select the bottom copy
app.executeMenuCommand('Make Envelope'); // make Envenlope
}
唯一的区别:它变换所选对象中最低的对象。