使用basiljs交换项目

时间:2017-05-31 09:26:20

标签: javascript adobe-indesign basil.js

我对整个罗勒世界都很陌生。所以这可能是一个非常基本的问题。我无法自己解决这个问题......

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

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

#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.itemX(selItems[1], selItems0x);   
    b.itemY(selItems[0], selItems1y);
    b.itemY(selItems[1], selItems0y);   
    

}
b.go();

现在我的问题是:我如何调用帧内容。显然我希望那个移动与框架相同。

感谢您的帮助,我渴望了解更多信息! Raphy

2 个答案:

答案 0 :(得分:1)

即使它不是" basiliy"方式我建议使用InDesign内置函数。你可以将它们与Basil Code混合使用。罗勒不关心。可以将元素装入框架或使其居中。

试试这个代码段:

#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();

答案 1 :(得分:0)

问题是在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团队意识到图像的转换有点过于复杂,there is a plan将来会简化这个过程。