0

我对整个 basiljs 世界都很陌生。所以这可能是一个非常基本的问题。然而,我无法自己弄清楚...... </p>

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

我能够让图像框架交换,但是它将框架内容留在相同的位置。这是它的样子:

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

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

感谢您的帮助,我渴望了解更多!拉菲

4

2 回答 2

1

尽管这不是我建议使用 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();
于 2017-05-31T19:06:08.550 回答
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 团队意识到图像的转换有些过于复杂,并且计划在未来简化此过程。

于 2017-05-31T10:07:36.417 回答