Как раскрасить вложенные составные пути Extendscript для Illustrator CS5?

Я пытаюсь раскрасить pathItems внутри compoundPathItem в Illustrator. Мой объект выглядит как круг внутри круга. Никаких штрихов, четыре пути, два compoundPathItems внутри compoundPathItem.

Когда я отлаживаю эту строку: alert(doc.compoundPathItems[0])I get:-[CompoundPathItem] .... which makes sense because I've combined two compoundPathItems.

Однако я не могу получить доступ к pathItems, чтобы раскрасить их:

doc.compoundPathItems[0].compoundPathItems[0].pathItems ... errors out x_x ... 
alert(doc.compoundPathItems[0].pathItems.length) gives me 0 .... T-T

Помогите мне понять, что здесь происходит, пожалуйста.


person Robert Robles-Mejia    schedule 05.11.2014    source источник


Ответы (3)


Этот скрипт будет работать, если все pageItems равны compoundItems, app.activeDocument.pathItems выдаст все pathItems в документе. Это также даст вложенный в compoundPathItem. Так что попробуйте, если это работает для вас

var currentDocument = app.activeDocument;
var pathItems = currentDocument.pathItems;
var redSwatch = currentDocument.swatches.getByName('CMYK Red');
var blueSwatch = currentDocument.swatches.getByName('CMYK Blue');
for (var i = 0; i < pathItems.length; i++) {
    pathItems[i].filled = true;
    pathItems[i].fillColor = redSwatch.color;
    pathItems[i].stroked = true;
    pathItems[i].strokeColor = blueSwatch.color;
}
person Charu    schedule 09.09.2017

похожа ли форма предмета на обведенную букву «О»? или "◎" > два составных элемента пути в составном элементе пути.

Я думаю, что любой элемент path_item в элементе Compound_path_item, окрашенный, наконец, заполняет цвет родительского объекта (= Compound_path_item).

если буква "О", попробуйте этот код ниже

#target "Illustrator"
var doc = app.documents[0];
var co_pathitem = doc.compoundPathItems[0].pathItems;

// create colors
var color1 = new RGBColor();
color1.red = 255;

var color2 = new RGBColor();
color2.blue = 255;

// fillcolor red
co_pathitem[0].filled = true;
co_pathitem[0].fillColor = color1;
$.writeln(co_pathitem[0].fillColor.properties()); // => color1

// fillcolor blue
co_pathitem[1].filled = true;
co_pathitem[1].fillColor = color2;
$.writeln(co_pathitem[1].fillColor.properties()); // => color2

// => doc.compoundPathItems[0] will be colored with color2(colored at last)

// but pathItems[0] filled with color1 yet
$.writeln(co_pathitem[0].fillColor.properties()); // => color1

Object.prototype.properties = function (cr) {
  var self = this;
  var cr = cr || ", ";
  var props = [];
  for (var i in self) {
    try {
      props.push(i + ":" + self[i]);
    } catch (e) {
      // props.push(i + ":" + e);
    }
  };
  return props.join(cr);
}
person milligramme    schedule 13.11.2014
comment
Нет, извините.. форма похожа на вторую, которую вы сказали ◎ - person Robert Robles-Mejia; 26.11.2014

Дело в том, что если вы распаковаете целевой compathItem, то получите не просто много pathItem. Вы получите groupItems, другие составныеPathItems, pathItems внутри подгрупп и так далее. Вся структура в том виде, в каком она была до создания CompathPath. Единственный способ получить все pathItems — это doc.pathItems. Но вы можете сделать трюк и проверить, являются ли компаундПатИтем.слой (это родительский слой) и каждый родительский слой путиИтем одним и тем же слоем. Итак, это отлично сработало для меня:

var whiteColor = new CMYKColor();
whiteColor.black = 0;

var doc = app.activeDocument;
//....defining targetLayer here
var whitePathItem = targetLayer.compoundPathItems[0]; //Target layer contains our compound Path
var parentLayer = whitePathItem.layer;

for(var i = 0; i < doc.pathItems.length; i++) {
    var pathItem = doc.pathItems[i];
    if(pathItem.layer == parentLayer) pathItem.fillColor = whiteColor;
}

Просто проверка родительского слоя, вот и весь фокус!

person bodich    schedule 15.01.2019