[AI CC-CC2022] сдублировать документ открытый в иллюстраторе

  • Автор темы Автор темы dik973
  • Дата начала Дата начала

dik973

Топикстартер
15 лет на форуме
Сообщения
596
Реакции
79
Можно ли в скрипте без сохранения сдублировать документ? Если да, то как?
Спасибо.
 
Курим маны
upload_2017-6-10_8-24-22.png
 
  • Спасибо
Реакции: dumbm1
Если не сложно, скажите, почему без сохранения?
Код:
//@target illustrator
(function doc_dupl() {
  var doc             = activeDocument,
      docPath         = doc.fullName + '',
      docFile         = new File(docPath),
      docFileCopyPath = docPath.slice(0, -3) + '_copy.ai',
      docFileCopy     = new File(docFileCopyPath);
  if (!doc.saved) doc.save();
  docFile.copy(docFileCopyPath);
  open(docFileCopy);
}());
 

Не по теме:
С сохранением каждый может, а вот попробуй без сохранения! '))'
 
  • Спасибо
Реакции: dumbm1
То есть только переносом атрибутов и элементов? Без сохранения, потому как на некоторых файлах виснет иллюстратор, может конечно не в этом проблема.
 
Последнее редактирование:
да уж, duplicate() ни для документов, ни для слоев не сделали в иллюстраторе

а если документ не сохранить, зачем вы с ним работаете, кстати?
 
  • Спасибо
Реакции: dumbm1
Вот скрипт. Смысл постоянные слои помечены @. Остальные -- переменные, удаляются кроме одного -- сохраняется pdf. Возвращается обратно, удаляются кроме следующего и т.д. На каких-то файлах работает нормально, на каких-то вылетает. Вот и думаю про альтернативу.
var myDoc=app.activeDocument;
var noDelIndicate="@";
var myName=myDoc.name.split(".")
var noDelLayer=[];
var varLayer=[];
_sortLayer(myDoc);
for (j=0; j<varLayer.length;j++){
for (k=varLayer.length-1;k>=0;k--){
if (k!=j) {varLayer[k].remove()};
}
app.executeMenuCommand("selectall");
myDoc.fitArtboardToSelectedArt (0);
saveFileToPDF (File(myDoc.path+"/"+myName[0]+"_"+varLayer[j].name));
app.undo();
app.undo();
var noDelLayer=[];
var varLayer=[];
_sortLayer(myDoc);
}




function saveFileToPDF (dest) {
var originalInteractionLevel = userInteractionLevel;
userInteractionLevel = UserInteractionLevel.DONTDISPLAYALERTS;
var doc = app.activeDocument;
if ( app.documents.length > 0 ) {
var saveName = new File ( dest );
saveOpts = new PDFSaveOptions();
saveOpts.compatibility = PDFCompatibility.ACROBAT5;
saveOpts.colorCompression=CompressionQuality.JPEGMEDIUM;
saveOpts.colorDownsampling=96;
saveOpts.artboardRange="1";
saveOpts.optimization=true;
saveOpts.colorDestinationID=ColorDestination.COLORDESTINATIONDOCRGB;
saveOpts.colorDownsamplingMethod=DownsampleMethod.BICUBICDOWNSAMPLE;
saveOpts.generateThumbnails = false;
saveOpts.preserveEditability = false;
doc.saveAs( saveName, saveOpts );
}
userInteractionLevel = originalInteractionLevel;
return 0;
}





function _sortLayer(_Doc){
//alert(_Doc.layers.length)
for (var i=0;i<_Doc.layers.length;i++){
_Doc.layers.visible=true;
_Doc.layers.locked=false;
if (_Doc.layers.name.indexOf(noDelIndicate)==-1){varLayer.push(_Doc.layers)}else{noDelLayer.push(_Doc.layers)}
}

}
 
Я могу примерно ванговать слабые места вашего скрипта: у вас одновременно присутствуют вызовы и javascript и иллюстраторовских пунктов меню и даже undo
А за это ответственны совершенно разные сьюты и плагины, которые во время работы скрипта насмерть сражаются друг с другом.
Если вы хотите придать скрипту максимальную устойчивость (абсолютная ввиду национальных особенностей разработчиков адобовского скриптинга не достижима по определению) - используйте что-то одно.
 
вот тут явно ошибка

Код:
function _sortLayer(_Doc){
//alert(_Doc.layers.length)
for (var i=0;i<_Doc.layers.length;i++){
_Doc.layers.visible=true;
_Doc.layers.locked=false;
if (_Doc.layers.name.indexOf(noDelIndicate)==-1){varLayer.push(_Doc.layers)}else{noDelLayer.push(_Doc.layers)}
}

в цикле при обращении к слоям нет индекса i нигде
varLayer и noDelLayer у вас объявлены в конце основного цикла внутри его области видимости еще раз, поэтому при втором проходе там по идее должны после вызова _sortLayer остаться пустые массивы.

undo два раза не уверен что нужно делать, но в точке, куда хотите вернуться по undo нужно поставить app.redraw()
вообще я бы не рисковал с undo, а открывал каждый раз оригинальный файл заново, удалял слои, сохранял pdf, и закрывал оригинал без сохранения
 
  • Спасибо
Реакции: _MBK_
Вместо undo() каждый раз открывать исходник конечно можно, но будет ли это надежней? Вместо selectall, пройтись по всем объектам и пометить их? visibleBound не подходит, так как видит внутренность масок.
 
вот тут явно ошибка

Код:
function _sortLayer(_Doc){
//alert(_Doc.layers.length)
for (var i=0;i<_Doc.layers.length;i++){
_Doc.layers.visible=true;
_Doc.layers.locked=false;
if (_Doc.layers.name.indexOf(noDelIndicate)==-1){varLayer.push(_Doc.layers)}else{noDelLayer.push(_Doc.layers)}
}

в цикле при обращении к слоям нет индекса i нигде
varLayer и noDelLayer у вас объявлены в конце основного цикла внутри его области видимости еще раз, поэтому при втором проходе там по идее должны после вызова _sortLayer остаться пустые массивы.

undo два раза не уверен что нужно делать, но в точке, куда хотите вернуться по undo нужно поставить app.redraw()
вообще я бы не рисковал с undo, а открывал каждый раз оригинальный файл заново, удалял слои, сохранял pdf, и закрывал оригинал без сохранения
Большое спасибо! Странно, что он работал.
Ой, проверил в скрипте i- есть, странно, при копировании исчезают i, как это может быть?
 
Последнее редактирование:
Это да, ошибка явная.
И redraw надо всегда ставить между обращениями к пунктам меню и undo обязательно
 
Вместо undo() каждый раз открывать исходник конечно можно, но будет ли это надежней?

по мне так надежней, но это на ваше усмотрение

>Вместо selectall, пройтись по всем объектам и пометить их?

можно вот так
Document.selectObjectsOnActiveArtboard (): Boolean
Adobe Illustrator 21 Type Library
Select art objects in active artboard.
 
upload_2017-6-13_10-12-41.png