【问题标题】:Adding separate artboard for each layer based on the content width using Illustrator scripting使用 Illustrator 脚本根据内容宽度为每个图层添加单独的画板
【发布时间】:2023-01-30 06:00:23
【问题描述】:

我已经编写了一段代码来从 csv 文件中提取内容,并在 illustrator 的每一层上添加每一块文本。目前我可以为固定画板添加内容。但是我需要在保持宽度为 23mm 的同时添加单独的画板。因此,画板高度类似于特定层的内容高度。我收到错误消息“TypeError: text.parentArtboard is undefined” 请帮助我解决上述问题。

var csv = '''clipName,Trans,fname
A1 ,test Text1,A1_ENG
A2 ,Pigment dyed fabric w.,A2_ENG
A3 ,UPF 50+ fabric. Only covered areas are protected. To maintain this level of protection the garment must be rinsed in fresh water after each use.,A3_ENG
A4 ,Light colours may become transparent when wet,A4_ENG'''



/* var csv_file = File.openDialog();
csv_file.open("r")
var csv = csv_file.read();
csv_file.close() */
var lines = csv.split("\n");


// MAIN -------------------------------------------------------------

// make character styles
var FONT1 = make_style("font1", "ArialMT", 5.5);

// process lines
for (var i=1; i<lines.length; i++) {
    var data = get_data_from(lines[i]);
    make_layer(data.name)
    var text = make_text(data.contents);
    
    apply_styles(text);
    
    put_in_center(text);
     // Create a new artboard
    //artboard()
}

// END

// functions --------------------------------------------------------

function make_style(style_name, font_name, size) {
      // try to add a new style
    try { var style = app.activeDocument.characterStyles.add(style_name) } 
    // or pick a style with the same name if it exists already
    catch(e) { var style = app.activeDocument.characterStyles.getByName(style_name) }
    
    //var style = app.activeDocument.characterStyles.add(style_name);
    style.characterAttributes.size = size;
    style.characterAttributes.textFont = textFonts.getByName(font_name);
    return style;
}

function addArtboard(text, artboardWidth ) {
    // Get all layers in the text
    var layers = text.layers;
    
    // Set the artboard width to 23
    var artboard = text.parentArtboard;
    artboard.width = artboardWidth;
    
    // Declare variable to keep track of content height
    var contentHeight = 0;
    
    // Loop through all layers
    for (var i = 0; i < layers.length; i++) {
        var layer = layers[i];
        
        // Position the layer
        layer.x = 0;
        layer.y = contentHeight;
        
        // Update content height
        contentHeight += layer.height;
    }
    
    // Set the artboard height based on the content height
    artboard.height = contentHeight;
}

function get_data_from(line) {
    
    var arr = line.split(",");
    var fname = arr[2]
    var VL1   = arr[0];
    var VL2   = arr[1];
    //alert("Your message here...", fname);
    //return {"name":Fname, "contents":[VL1, VL2, VL3, VL4,VL5, VL6, VL7, VL8, VL9]};
    return {"name":fname, "contents":[VL2]};
}
//string.includes(substring)
function rearrangeText(text, artboardWidth) {
  // Split the text into words
  var words = text.split(" ");
  var rearrangedText = "";
  var currentLine = "";
  
  // Loop through each word
  for (var i = 0; i < words.length; i++) {
    var word = words[i];
    // If the current line + the next word would exceed the artboard width
    if (currentLine.length + word.length > artboardWidth) {
      // Add the current line to the rearranged text
      rearrangedText += currentLine + "\n";
      // Reset the current line
      currentLine = "";
    }
    // Add the word to the current line
    currentLine += word + " ";
  }
  // Add the last line to the rearranged text
  rearrangedText += currentLine;
  return rearrangedText;
}

    
function make_layer(layer_name) {
    var new_layer = app.activeDocument.layers.add();
    new_layer.name = layer_name;
}

function make_text(array) {
    var text = app.activeDocument.textFrames.add();
        text.contents = rearrangeText(array.join("\n"),23);
         addArtboard(text.contents,23) //Try to add new artboar based on the text content size
    return text;
}
function artboard() {
    var layers = app.activeDocument.layers;
    var textLayers = [];
    for (var i = 0; i < layers.length; i++) {
        if (layers[i].kind == LayerKind.TEXT) {
            textLayers.push(layers[i]);
        }
    }
    var width = 23; // width in mm
    for (var i = 0; i < textLayers.length; i++) {
        var textLayer = textLayers[i];
        var textBounds = textLayer.bounds;
        var artboardWidth = width * app.activeDocument.rulerUnits;
        var artboardHeight = textBounds[3] - textBounds[1];
        var artboard = app.activeDocument.artboards.add(textBounds);
        artboard.width = artboardWidth;
        artboard.height = artboardHeight;
        textLayer.move(artboard);
    }
}


function to_center(artboard, item){
    var artboard_x = artboard.artboardRect[0] + artboard.artboardRect[2];
    var artboard_y = artboard.artboardRect[1] + artboard.artboardRect[3];
    var x = (artboard_x - item.width)/2;
    var y = (artboard_y + item.height)/2;
    item.position = [x, y];
}

function apply_styles(text) {
    // not the best piece of code, I'm sure it can be done better
    text.textRange.paragraphAttributes.justification = Justification.CENTER;
    FONT1.applyTo(text.textRange);

 
}

function put_in_center(obj) {
    var rect = app.activeDocument.artboards[0].artboardRect;
    var page_w = rect[2] - rect[0];
    var page_h = rect[1] - rect[3];
    var shift_x = page_w/2 - obj.width/2;
    var shift_y = -page_h/2 + obj.height/2;
    obj.position = [rect[0] + shift_x, rect[1] + shift_y];
}

当我删除函数 addArtboard(text, artboardWidth ) 时,所有内容都将根据画板的宽度重新排列。但是,由于代码错误,画板大小不会改变。 专家请帮助我解决这个问题。 下面提到了插画图层上内容排列的图像

【问题讨论】:

  • 学分在这里:stackoverflow.com/a/67323870/14265469 可能问题无法解决,因为二十个月后没有接受的答案。
  • 嗨尤里,最近我能熟练地接受答案。我现在已经接受了答案,对于给您带来的不便,我们深表歉意。这有点不同,因为每一层都有不同的文本高度。每个图层都必须根据文本高度保存在不同的画板中。但画板宽度必须全部为 25mm,文本内容必须分布在 23mm 以内并垂直和水平对齐。 .
  • Yuri Khristich 你还在 discord 上活跃吗?
  • 我有 Discord,但现在我还没准备好花太多时间在上面。您能否张贴所需输出的屏幕截图?据我了解,该任务可以归结为将这些单独图层中创建的文本放到单独的画板上的功能。每个画板的高度都应取决于其文本的高度。这是正确的吗?

标签: javascript scripting adobe adobe-illustrator


【解决方案1】:

如果正确理解任务,您可以将此功能添加到代码中:

function distribute_texts_and_create_artboards() {

    const mm    = 2.83465;   // mm/pt
    var shift_x = 30 * mm;   // horizontal shifs for texts
    var width   = 25 * mm;   // artboard width

    var doc = app.activeDocument;
    var frames = doc.textFrames;

    // move all the frames and create an artboard for the every text frame

    for (var i=0; i<frames.length; i++) {

        var frame = frames[i];
        frame.translate(shift_x * i, 0); // move the frame horizontally

        var frame_x1 = frame.geometricBounds[0];
        var frame_y1 = frame.geometricBounds[1];
        var frame_x2 = frame.geometricBounds[2];
        var frame_y2 = frame.geometricBounds[3];
        var frame_w = frame_x2 - frame_x1;        // frame width
        var frame_h = frame_y2 - frame_y1;        // frame height

        var artboard_x = frame_x1 - (width - frame_w)/2;
        var artboard_y = frame_y1;
        var artboard_w = frame_x2 + (width - frame_w)/2; // artboard width
        var artboard_h = frame_h;                        // artboard height

        var artboard_rect = [artboard_x, artboard_y, artboard_w, artboard_h];

        doc.artboards.add(artboard_rect); // create a new artboard
    }

    doc.artboards[0].remove(); // delete the old first artboard
}

并在“结束”部分的末尾运行它:

...
}

distribute_texts_and_create_artboards();

// END

...

它应该给出如下布局:

稍微调整画板框架的垂直位置可能是有意义的。但是由于您没有提供所需结果的示例,所以我暂时将其保留原样。如果您需要帮助,请告诉我。

而且代码中不再需要函数addArtboard()artboard()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 2012-03-09
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多