如何使用javascript在Illustrator中加载符号库?

时间:2015-07-27 14:07:22

标签: javascript adobe-illustrator extendscript

通过代码,我尝试将符号库从参考Illustrator文件加载到另一个文件。 我想像你点击其他图书馆那样做同样的负担。在UI中,您必须选择一个Ai文件来获取其所有符号。

enter image description here

有谁知道怎么做?有一种简单的方法,还是我应该一个接一个地复制符号?

我尝试加载其他文档,然后将每个符号复制到第一个文档:

var loadSymbolLibrary = function(fromAiFile) {
    var thisDocument = activeDocument;
    app.open(fromAiFile);
    var fromAiDocument = activeDocument;

    var symbols = fromAiDocument.symbols;
    for(var i = 0; i < symbols.length; i++) {
        var symbol = symbols[i];
        thisDocument.symbols.add(symbol);
    }

    fromAiDocument.close();
    activeDocument = thisDocument;
}

但是在向第一个文档添加符号时出现错误。 根据Adobe文档,我需要PageItemSymbolRegistrationPoint来创建带有add()函数的符号。

[编辑]

我还尝试以这种方式加载包含符号的文档:

    var openOptions = new OpenOptions();
openOptions.openAs = LibraryType.SYMBOLS;
var symbolDocument = app.open(symbolAiFile, null, openOptions);

这会在Illustrator中打开一个符号窗口,但我不知道如何通过代码处理它,因为调用symbolDocument.symbols会生成一个&#39;文档不再打开&#39;错误。

1 个答案:

答案 0 :(得分:2)

首先,为了清楚起见, SymbolItem Symbol 的放置实例并且 Document 同时具有两者,这将是有用的。那些。

如果传递的符号不在该文档的符号列表中,则Illustrator将不允许调用Document.symbolItems.add()。就个人而言,我认为这是一个错误。这是一个包装类,它将符号库作为新文档打开(注意排除相关的openAs属性),将符号放入该文档,然后将符号项复制到另一个文档。

#target illustrator-18


//class
function SymbolLibrary(){

    this.symbolsDoc = null;
    this.len = 0;

    this.begin = function(symbolFileName){
        var file1 = File(symbolFileName);
        //open the symbol library
        var optRef = new OpenOptions();
        //optRef.openAs = LibraryType.SYMBOLS; //broken. just open as regular doc
        this.symbolsDoc = app.open( file1 , null , optRef);
        this.len = this.symbolsDoc.symbols.length;
        return this.symbolsDoc;
    }

    this.list = function(){
        for(var i=0;i<symbolsDoc.symbols.length;i++){
            $.writeln( symbolsDoc.symbols[i] );
        }
        return symbolsDoc.symbols;
    }

    this.place = function(targetDoc,index){
        var symbolItem = this.symbolsDoc.symbolItems.add(this.symbolsDoc.symbols[index]);
        finalItem = symbolItem.duplicate( targetDoc,ElementPlacement.PLACEATEND );
        symbolItem.remove();
        return finalItem;
    }

    this.end = function(){
    this.symbolsDoc.close(SaveOptions.DONOTSAVECHANGES);
    }
}

var filename =  "/Applications/Adobe\ Illustrator\ CC\ 2014/"+
    "Presets.localized/en_US/Symbols/Nature.ai";


//create new document
var mydoc = app.documents.addDocument('',new DocumentPreset());

//instantiate the symbol library handler class
var lib1 = new SymbolLibrary();

lib1.begin(filename);
for(var i=0;i<lib1.len;i++){
    lib1.place(mydoc,i).position = [((i%10)*100),i*10];
}
lib1.end();

$.writeln('#########');