var filePath = File.openDialog("テキストファイルを選択してください");
if (!filePath) {
alert("ファイルが選択されていません。");
return;
}
if (!filePath.open("r")) {
alert("ファイルを開けませんでした。");
return;
}
setGradientCsv.jsx
/**********************************************************
setGradientInfo.jsx
CSVファイルを読み込み、Illustratorのスウォッチに複数のグラデーションを一括登録するスクリプト。
ストップの順序と `rampPoint` のズレを防ぎ、適切に適用するように修正。
**********************************************************/
#target illustrator
if (app.documents.length > 0) {
var doc = app.activeDocument;
if (doc.fullName) {
//var docPath = doc.fullName.parent.fsName;
//var csvFile = new File(docPath + "/gradientInfo.csv");
var csvFile = File.openDialog("テキストファイルを選択してください");
if (!csvFile) {
alert("ファイルが選択されていません。");
return;
}
if (csvFile.exists) {
csvFile.open("r");
var csvContent = csvFile.read();
csvFile.close();
var gradientsData = parseCSV(csvContent);
if (gradientsData.length === 0) {
alert("CSV に有効なグラデーションデータがありません。");
exit();
}
// ** グラデーションごとに処理 **
for (var g = 0; g < gradientsData.length; g++) {
var gradientInfo = gradientsData[g];
// ** `rampPoint` の昇順ソート(重要)**
gradientInfo.stops.sort(function(a, b) {
return a.rampPoint - b.rampPoint;
});
// ** グラデーション作成(名前設定なし)**
var newGradient = createGradient();
// ** ストップ数をチェックし、足りない場合は追加 **
while (newGradient.gradientStops.length < gradientInfo.stops.length) {
newGradient.gradientStops.add();
}
// ** ストップを適用(順番を保つ)**
for (var i = 0; i < gradientInfo.stops.length; i++) {
var stop = newGradient.gradientStops[i];
var stopData = gradientInfo.stops[i];
stop.rampPoint = stopData.rampPoint;
stop.midPoint = stopData.midPoint;
stop.opacity = stopData.opacity;
var colorRGB = hexToRGB(stopData.color);
var newColor = new RGBColor();
newColor.red = colorRGB.red;
newColor.green = colorRGB.green;
newColor.blue = colorRGB.blue;
stop.color = newColor;
}
}
alert("すべてのグラデーションがスウォッチに追加されました!");
} else {
alert("gradientInfo.csv が見つかりません。\n先に getGradientInfo.jsx を実行してください。");
exit();
}
} else {
alert("このドキュメントは保存されていません。先に保存してください。");
exit();
}
} else {
alert("ドキュメントを開いてください。");
exit();
}
/**********************************************************
グラデーションを作成する関数(名前は設定しない)
**********************************************************/
function createGradient() {
var theGradient = app.activeDocument.gradients.add();
theGradient.type = GradientType.LINEAR; // リニアグラデーション
return theGradient;
}
/**********************************************************
CSVをパースして複数のグラデーションを処理する関数
**********************************************************/
function parseCSV(csvString) {
var lines = csvString.split("\n");
var gradients = {};
var gradientList = [];
for (var i = 1; i < lines.length; i++) {
var values = lines[i].split(",");
if (values.length === 5) {
var gName = trimString(values[0]);
var stopData = {
rampPoint: parseFloat(values[1]),
midPoint: parseFloat(values[2]),
opacity: parseFloat(values[3]),
color: trimString(values[4])
};
if (!gradients[gName]) {
gradients[gName] = { name: gName, stops: [] };
gradientList.push(gradients[gName]);
}
gradients[gName].stops.push(stopData);
}
}
return gradientList;
}
/**********************************************************
文字列の前後の空白を削除する関数
**********************************************************/
function trimString(str) {
return str.replace(/^\s+|\s+$/g, "");
}
/**********************************************************
Hexカラーコードを RGB に変換する関数
**********************************************************/
function hexToRGB(hex) {
hex = hex.replace("#", "");
return {
red: parseInt(hex.substring(0, 2), 16),
green: parseInt(hex.substring(2, 4), 16),
blue: parseInt(hex.substring(4, 6), 16)
};
}
CSVフォーマット
gradientInfo.csv
gradientName,rampPoint,midPoint,opacity,color
gradientName_01,0,50,100,#d457c3
gradientName_01,20,50,100,#6ee089
gradientName_01,40,50,100,#99ff2a
gradientName_01,70,50,100,#ff5d15
gradientName_01,100,50,100,#f33fff
gradientName_02,0,50,100,#ffff00
gradientName_02,100,50,100,#000000
gradientName_03,0,50,100,#ff0000
gradientName_03,100,50,100,#0000ff
rampPoint)midPoint)opacity)#RRGGBB)sample
gradientName,rampPoint,midPoint,opacity,color
silver01,0,50,100,#E0E0E0
silver01,20,50,100,#B0B0B0
silver01,40,50,100,#707070
silver01,60,50,100,#D4D4D4
silver01,80,50,100,#A0A0A0
silver01,100,50,100,#F0F0F0
gold01,0,50,100,#FFD700
gold01,25,50,100,#D4AF37
gold01,50,50,100,#8B7500
gold01,75,50,100,#FFD700
gold01,100,50,100,#FFF8DC
chromium01,0,50,100,#D0D0D0
chromium01,25,50,100,#505050
chromium01,50,50,100,#FFFFFF
chromium01,75,50,100,#606060
chromium01,100,50,100,#E0E0E0
aurora01,0,50,100,#C6E2FF
aurora01,25,50,100,#FFC0CB
aurora01,50,50,100,#FFFFFF
aurora01,75,50,100,#FFD700
aurora01,100,50,100,#C6E2FF