リンクをクリップボードにコピー
コピー完了
M1 / OS 13.7.5 / AI 2024 /ExtendScript
JXAのドロップレットでAIで処理する書類を一旦テキストに書き出し、
JXAよりExtendScriptを実行して、
ExtendScript側でテキストファイルを読み込み書類をひとつずつ処理するスクリプトを実行中に
途中から添付画像の様なアラートが表示されました。
(書類は1つずつ保存して閉じています)
(試しにJXAと切り離してExtendScriptだけで実行しても同じでした)
このアラートを回避する方法はあるのでしょうか?
処理数は300程度でそこまで多くはありません。
以前はこのぐらいの処理をしてもアラートが出なかった気がするのですが。
リンクをクリップボードにコピー
コピー完了
スクリプト構成を精査しないことにははっきりしたことは言い難いので、まずそこをお含みおきください。
ドキュメント構成による影響が考えられるんですけど、スクリプトの実行ではメインメモリにリークは生じますが、GPUメモリを消費することはあまりありませんので、単純に描画スタックのリフレッシュが行われていないのではないかと思います。さっと思いつくのはredrawで描画をリフレッシュするのと、ドキュメント毎にガーベージコレクションを走らせる等でしょうか。
リンクをクリップボードにコピー
コピー完了
ありがとうございます。redrawは入れてみてもだめでした。
以下スクリプトです。
#include "~/json2.js"
var myp = $.fileName.split("/");
var currentFolder = myp.slice(0, myp.length - 1).join("/") + "/";
var regList =["^test"];
(function () {
var files=readText(File(currentFolder+"docs.txt"));
files=JSON.parse(files);
for (var i=0; i<files.length; i++){
var fp =files[i];
app.open(File(fp));
var doc = app.activeDocument;
revertToBlack(regList);
}
})();
function revertToBlack(regs){
var doc = app.activeDocument;
var cSwatches=(function(){
var sws = doc.swatches;
var ary = [];
for (var i=0; i<sws.length; i++){
var sw = sws[i];
var nm = sw.name;
for (var r=0; r<regs.length; r++){
var reg=RegExp(regs[r]);
if (nm.match(reg)){
ary.push(sw);
}
}
}
return ary;
})();
if (cSwatches.length>0){
setCol(cSwatches);
removeSwatch(cSwatches);
}
function removeSwatch(ary) {
for (var s=0; s<ary.length; s++){
var csw = ary[s].remove();
}
}
function setCol(ary) {
var theCol = new CMYKColor();
theCol.cyan = 0;
theCol.magenta = 0;
theCol.yellow = 0;
theCol.black = 100;
for (var i = 0; i < ary.length; i++) {
var swatch = ary[i];
if (swatch) {
if (swatch.color.typename === "SpotColor") {
swatch.color.spot.color = theCol;
} else {
swatch.color = theCol;
}
if ((swatch.color.constructor.name == 'SpotColor') && (swatch.color.spot.colorType == ColorModel.PROCESS)) {
actualColor = swatch.color.spot.color;
swatch.color = actualColor;
}
} else {
// alert("スウォッチ '" + swatchName + "' が見つかりません。");
}
}
}
app.redraw();
doc.close(SaveOptions.SAVECHANGES);
}
function readText(f){
if (f != null) {
var res= f.open('r');
if (res) {
var txt= f.read();
f.close();
}
}
return txt;
}
リンクをクリップボードにコピー
コピー完了
redrawの代わりに$.gc()を入れてもだめでした。
リンクをクリップボードにコピー
コピー完了
投稿されたコードに問題点はないですね。やはりドキュメントの描画が重い影響ではないかと思います。
ちなみにPCの実装メモリはどれぐらい載ってますか?
リンクをクリップボードにコピー
コピー完了
16GBです。
CADから作成した図面を複数含むのでドキュメントによっては少しPathItemsは多いですが、
それほど複雑な図でもなく、各ドキュメントの描画もそれほど重くはありません。
リンクをクリップボードにコピー
コピー完了
CADからでパスが多いという事はメモリの利用量の問題ですね。AppleSilicon機はGPUメモリをメインから割譲しますから、メインメモリの利用状況によってはGPUへの割当が不足する可能性があります。ドキュメントループでメモリスタックを開放しきれないのであれば、小刻みに実行する他ないでしょう。
リンクをクリップボードにコピー
コピー完了
結論としてドキュメントを閉じた後に$.gc()か、
一通りの処理を終えた後とドキュメント保存前の2箇所に$.gc()かredrawで最後までできました。
ただいずれの場合も処理数後半からドキュメントを閉じた後にイラレのドキュメント表示スペース(黒)が
マゼンダ1色みたいな状態になるのは同じでした。
かろうじて処理できているという印象です。
ともかく今回はこれで凌ぎました。ありがとうございました。