Javascript 使用basiljs交换项目

Javascript 使用basiljs交换项目,javascript,adobe-indesign,basil.js,Javascript,Adobe Indesign,Basil.js,我对整个basiljs世界都很陌生。所以这可能是一个非常基本的问题。我自己也没能弄明白,但是 我正在尝试创建一个简单的脚本,用于交换在同一页面上选择的两个项目 我能够使图像帧交换,但是它将帧内容保留在相同的位置。下面是它看起来的样子: includepath~/Documents/;%USERPROFILE%文档; 包括basiljs/bundle/basil.js; 函数图{ var selItems=b.选择; var selItems0x=b.itemXselItems[0]; var

我对整个basiljs世界都很陌生。所以这可能是一个非常基本的问题。我自己也没能弄明白,但是

我正在尝试创建一个简单的脚本,用于交换在同一页面上选择的两个项目

我能够使图像帧交换,但是它将帧内容保留在相同的位置。下面是它看起来的样子:

includepath~/Documents/;%USERPROFILE%文档; 包括basiljs/bundle/basil.js; 函数图{ var selItems=b.选择; var selItems0x=b.itemXselItems[0]; var selItems1x=b.itemXselItems[1]; var selItems0y=b.itemselitems[0]; var selItems1y=b.itemselitems[1]; b、 itemXselItems[0],selItems1x; b、 itemXselItems[1],selItems0x; b、 ItemsElitems[0],selItems1y; b、 ItemsElitems[1],selItems0y; }
b、 去 问题在于,在InDesign中,图像图形及其包含的框架被视为两个独立的对象,这意味着,如果只移动框架,其中的图形不会移动

在basil.js中,您可以使用方法b.transformImage随图形移动框架,但使用起来相当麻烦,因为您需要传递图像的位置和比例

或者,您可以在第二步中移动图形。首先确保该项目实际上包含一个图形,而不是一个简单的椭圆形等。如果是这种情况,请将其移动到与其父框架相同的位置。您可以使用frame.graphics[0]访问框架图形

脚本将如下所示:

#includepath "~/Documents/;%USERPROFILE%Documents";
#include "basiljs/bundle/basil.js";

function draw() {

    var selItems = b.selections();

    var selItems0x = b.itemX(selItems[0]);
    var selItems1x = b.itemX(selItems[1]);
    var selItems0y = b.itemY(selItems[0]);
    var selItems1y = b.itemY(selItems[1]);


    b.itemX(selItems[0], selItems1x);
    b.itemY(selItems[0], selItems1y);

    if(selItems[0].graphics.length > 0) {
      b.itemX(selItems[0].graphics[0], selItems1x);
      b.itemY(selItems[0].graphics[0], selItems1y);
    }

    b.itemX(selItems[1], selItems0x);
    b.itemY(selItems[1], selItems0y);

    if(selItems[1].graphics.length > 0) {
      b.itemX(selItems[1].graphics[0], selItems0x);
      b.itemY(selItems[1].graphics[0], selItems0y);
    }

}
b.go();
请注意,如果图像的左上角被边框裁剪,则此操作将不起作用。在这种情况下,您需要找出图形左上角的实际位置,然后在移动图形后相应地偏移图形


顺便说一句,basil.js团队意识到图像的转换有点过于复杂,因此需要在将来简化此过程。

尽管这不是我建议使用InDesign内置函数的基本方式。您可以将它们与Basil代码混合使用。巴兹尔不在乎。可以将元素装入其框架或使其居中

请尝试以下代码段:

#includepath "~/Documents/;%USERPROFILE%Documents";
#include "basiljs/bundle/basil.js";

function setup(){
  var sel = b.selections();
  var gb0 = sel[0].geometricBounds;
  var gb1 = sel[1].geometricBounds;
  // swap them
   sel[0].geometricBounds = gb1;
   sel[1].geometricBounds = gb0;
  // see the different fit options
  // http://yearbook.github.io/esdocs/#/InDesign/FitOptions
  sel[0].fit(FitOptions.CENTER_CONTENT);
  sel[0].fit(FitOptions.PROPORTIONALLY); 
  }

b.go();