ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

水曜日, 8月 26, 2026

JavaScriptでAI遊び 105 
Illustratorで選択したオブジェクトのタック値を確認(グラデーション対応)


Illustratorで選択したオブジェクトのユーザー指定のタック値を確認します。グラデーションに対応。

JavaScriptでAI遊び 104 <br>Illustratorで選択したオブジェクトのタック値を確認 2026/08/17

// 選択オブジェクトからCMYK合計値(TAC)が指定値以上のものだけを選択

if (app.documents.length == 0) {
alert("ドキュメントを開いてください。");
} else {

var doc = app.activeDocument;

if (doc.documentColorSpace != DocumentColorSpace.CMYK) {
alert("CMYKドキュメントのみ対応です。");
} else {

var limit = Number(prompt("CMYK合計値(%)以上を選択", "300"));

if (!isNaN(limit)) {

var sel = doc.selection;

if (sel.length == 0) {
alert("オブジェクトを選択してください。");
} else {

var keep = [];

for (var i = 0; i < sel.length; i++) {
if (checkItem(sel[i], limit)) {
keep.push(sel[i]);
}
}

doc.selection = null;

for (var i = 0; i < keep.length; i++) {
keep[i].selected = true;
}

alert(keep.length + " 個選択しました。");
}
}
}
}

function checkItem(item, limit) {

switch (item.typename) {

case "GroupItem":
for (var i = 0; i < item.pageItems.length; i++) {
if (checkItem(item.pageItems[i], limit)) return true;
}
return false;

case "CompoundPathItem":
for (var i = 0; i < item.pathItems.length; i++) {
if (checkItem(item.pathItems[i], limit)) return true;
}
return false;

case "PathItem":

if (item.filled && checkColor(item.fillColor, limit))
return true;

if (item.stroked && checkColor(item.strokeColor, limit))
return true;

return false;

default:
return false;
}
}

function checkColor(col, limit) {

// 通常のCMYKカラー
if (col.typename == "CMYKColor") {
return (
col.cyan +
col.magenta +
col.yellow +
col.black
) >= limit;
}

// グラデーション
if (col.typename == "GradientColor") {

var stops = col.gradient.gradientStops;

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

var c = stops[i].color;

if (c.typename == "CMYKColor") {

var total =
c.cyan +
c.magenta +
c.yellow +
c.black;

if (total >= limit)
return true;
}
}
}

return false;
}
チェックしたいオブジェクトを選択して実行すると・・・


CMYKの合計値を求めてくるので適宜入力して実行すれば・・・


 
直ぐに該当データを選出します。

こんな感じです。

※Illustratorのアップデートで不具合が出る場合があります。気がついた時点でデバッグするように心がけていますが、すぐに対応できないのでご容赦ください。

木曜日, 8月 20, 2026

JavaScriptでAI遊び 104 
Illustratorで選択したオブジェクトのタック値を確認

Illustratorで選択したオブジェクトのユーザー指定のタック値を確認します。塗りと線に対応。

// 選択オブジェクトからCMYK合計値(TAC)が指定値以上のものだけを選択

if (app.documents.length == 0) {
alert("ドキュメントを開いてください。");
} else {

var doc = app.activeDocument;

if (doc.documentColorSpace != DocumentColorSpace.CMYK) {
alert("CMYKドキュメントのみ対応です。");
} else {

var limit = Number(prompt("CMYK合計値(%)以上を選択", "300"));

if (!isNaN(limit)) {

var sel = doc.selection;

if (sel.length == 0) {
alert("オブジェクトを選択してください。");
} else {

var keep = [];

for (var i = 0; i < sel.length; i++) {
if (checkItem(sel[i], limit)) {
keep.push(sel[i]);
}
}

doc.selection = null;

for (var i = 0; i < keep.length; i++) {
keep[i].selected = true;
}

alert(keep.length + " 個選択しました。");
}
}
}
}

function checkItem(item, limit) {

switch (item.typename) {

case "GroupItem":
for (var i = 0; i < item.pageItems.length; i++) {
if (checkItem(item.pageItems[i], limit)) return true;
}
return false;

case "CompoundPathItem":
for (var i = 0; i < item.pathItems.length; i++) {
if (checkItem(item.pathItems[i], limit)) return true;
}
return false;

case "PathItem":

if (item.filled && checkColor(item.fillColor, limit))
return true;

if (item.stroked && checkColor(item.strokeColor, limit))
return true;

return false;

default:
return false;
}
}

function checkColor(col, limit) {

if (col.typename != "CMYKColor")
return false;

var total =
col.cyan +
col.magenta +
col.yellow +
col.black;

return total >= limit;
}
チェックしたいオブジェクトを選択して実行すると・・・

CMYKの合計値を求めてくるので適宜入力して実行すれば・・・

直ぐに該当データを選出します。

こんな感じです。

※Illustratorのアップデートで不具合が出る場合があります。気がついた時点でデバッグするように心がけていますが、すぐに対応できないのでご容赦ください。

月曜日, 8月 17, 2026

Let's start JavaScript 108 
正多角形の一辺の長さを求める

諸般の事情で必要に迫られて作ってみました。相変わらずレイアウトは必要最低限です。

辺の長さ = 2r × sin(pai/n)
    r:円の半径
    n:多角形の辺の数

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>正多角形の辺の長さ計算</title>
<style>
body {
background: black;
color: white;
font-family: sans-serif;
margin: 20px;
}

input {
width: 80px;
margin: 5px;
}

label {
display: block;
margin: 10px 0;
}
</style>

</style>
</head>

<body>
<center>
<h3>正多角形の1辺の長さ計算</h3>

<label>
半径:
<input type="number" id="radius" value="100">
</label>

<label>
辺の数:
<input type="number" id="sides" value="6" min="3">
</label>

<button onclick="calc()">計算</button>
<br>
<p>辺の長さ = 2r × sin(π/n)<br>

r:円の半径<br>
π:円周率<br>
n:多角形の辺の数</p><br>
<p id="result"></p>

<script>
function calc() {
const r = parseFloat(document.getElementById("radius").value);
const n = parseInt(document.getElementById("sides").value);

if (n < 3) {
document.getElementById("result").textContent =
         "辺の数は3以上です。";
return;
}

const length = 2 * r * Math.sin(Math.PI / n);

document.getElementById("result").textContent =
`1辺の長さ = ${length.toFixed(4)}`;
}
</script>
</center>
</body>
</html>

実行直後のデフォルト値を変更し・・・

計算ボタンをクリックするだけです。

水曜日, 8月 12, 2026

JavaScriptでAI遊び 103 
Illustratorで選択したオブジェクト線幅を指定範囲でランダム設定

選択したオブジェクトの線幅を指定範囲でランダムに設定します。予め全体を任意の線幅に設定しておきます。

// 選択オブジェクトの線幅をランダムに設定

if (app.documents.length === 0) {
alert("ドキュメントを開いてください。");
} else if (app.activeDocument.selection.length === 0) {
alert("オブジェクトを選択してください。");
} else {

var min = Number(prompt("最小線幅(pt)", "0.5"));
var max = Number(prompt("最大線幅(pt)", "5"));

if (isNaN(min) || isNaN(max) || min > max) {
alert("数値を正しく入力してください。");
} else {

var sel = app.activeDocument.selection;

for (var i = 0; i < sel.length; i++) {
setStrokeRandom(sel[i], min, max);
}

alert("完了しました。");
}
}

function setStrokeRandom(obj, min, max) {

switch (obj.typename) {

case "PathItem":
if (obj.stroked) {
obj.strokeWidth = random(min, max);
}
break;

case "CompoundPathItem":
for (var i = 0; i < obj.pathItems.length; i++) {
if (obj.pathItems[i].stroked) {
obj.pathItems[i].strokeWidth = random(min, max);
}
}
break;

case "GroupItem":
for (var j = 0; j < obj.pageItems.length; j++) {
setStrokeRandom(obj.pageItems[j], min, max);
}
break;
}
}

function random(min, max) {
return min + Math.random() * (max - min);
}

ここでは全体を1ptに設定して実行すると・・・

最小線幅を設定し・・・

続けて最大線幅を設定すれば・・・


直ぐに完了します。

処理結果はこんな感じです。

※Illustratorのアップデートで不具合が出る場合があります。気がついた時点でデバッグするように心がけていますが、すぐに対応できないのでご容赦ください。

金曜日, 8月 07, 2026

Let's start JavaScript 107 
シンプルにA版B版の用紙サイズ表示

シンプルにA版B版の用紙サイズを表示するだけです。公式の0〜10のサイズに対応しました。まっ、単にサイズ表を作ればいい話ですが、他のデータなどにも活用できるのでは・・・ということで作りました。

<!DOCTYPE html>
<html lang="ja">

<head>
<meta charset="UTF-8">
<title>A版・B版 サイズ表示</title>
<style>
body {
font-family: sans-serif;
margin: 40px;
background-color: black;
color: white;
}

select,
input {
padding: 6px;
}

#result {
margin-top: 20px;
font-size: 24px;
font-weight: bold;
color: yellow;
}
</style>
</head>

<body>
<center>
<h3>A版・B版 サイズ表示</h3>

<select id="type">
<option value="A">A版</option>
<option value="B">B版</option>
</select>

<input type="number" id="size" min="0" max="10"
            placeholder="0~10">

<div id="result">0~10を入力してください</div>

<script>
const paper = {
A: {
0: "841 × 1189 mm",
1: "594 × 841 mm",
2: "420 × 594 mm",
3: "297 × 420 mm",
4: "210 × 297 mm",
5: "148 × 210 mm",
6: "105 × 148 mm",
7: "74 × 105 mm",
8: "52 × 74 mm",
9: "37 × 52 mm",
10: "26 × 37 mm"
},
B: {
0: "1030 × 1456 mm",
1: "728 × 1030 mm",
2: "515 × 728 mm",
3: "364 × 515 mm",
4: "257 × 364 mm",
5: "182 × 257 mm",
6: "128 × 182 mm",
7: "91 × 128 mm",
8: "64 × 91 mm",
9: "45 × 64 mm",
10: "32 × 45 mm"
}
};

const type = document.getElementById("type");
const size = document.getElementById("size");
const result = document.getElementById("result");

function showSize() {
const t = type.value;
const s = size.value;

if (paper[t][s] !== undefined) {
result.textContent = `${t}${s}${paper[t][s]}`;
} else {
result.textContent = "0~10を入力してください";
}
}

type.addEventListener("change", showSize);
size.addEventListener("input", showSize);
</script>
</center>
</body>

</html>

実行したらA版B版の選択と、数値を入力またはスピンボタン(▲▼マーク)※で・・・

※カーソルを近づけると表示されます。

サイズを表記します。よく使うA4とB5以外は暗記があやふやなので・・・(^o^)

水曜日, 7月 29, 2026

JavaScriptでAI遊び 102 
Illustratorで選択したオブジェクト群の重なりを修正

選択したオブジェクト群の重なりを修正し、アートボード内に再配置します。

// アートボード内にランダム配置(重なり回避)

if (app.documents.length == 0) {
alert("ドキュメントを開いてください");
exit();
}

var doc = app.activeDocument;
var sel = doc.selection;

if (sel.length == 0) {
alert("オブジェクトを選択してください");
exit();
}

var marginMM = Number(prompt("オブジェクト間の余白(mm)", "2"));

if (isNaN(marginMM)) {
exit();
}

var margin = marginMM * 2.834645669;

// 現在のアートボード
var abIndex = doc.artboards.getActiveArtboardIndex();
var ab = doc.artboards[abIndex].artboardRect;

// [left, top, right, bottom]
var abLeft = ab[0];
var abTop = ab[1];
var abRight = ab[2];
var abBottom = ab[3];

function overlap(a, b) {
return !(
a.right + margin < b.left ||
a.left > b.right + margin ||
a.top < b.bottom - margin ||
a.bottom > b.top + margin
);
}

var placed = [];

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

var item = sel[i];
var gb = item.geometricBounds;

var w = gb[2] - gb[0];
var h = gb[1] - gb[3];

var placedOK = false;

for (var attempt = 0; attempt < 1000; attempt++) {

var x = abLeft + Math.random() * ((abRight - abLeft) - w);
var y = abTop - Math.random() * ((abTop - abBottom) - h);

var rect = {
left: x,
top: y,
right: x + w,
bottom: y - h
};

var hit = false;

for (var j = 0; j < placed.length; j++) {
if (overlap(rect, placed[j])) {
hit = true;
break;
}
}

if (!hit) {

item.position = [x, y];

placed.push({
left: x,
top: y,
right: x + w,
bottom: y - h
});

placedOK = true;
break;
}
}

if (!placedOK) {
alert(
"配置できないオブジェクトがあります。\n" +
"アートボードを大きくするか、選択数を減らしてください。"
);
break;
}
}

alert("配置完了");

オブジェクト群を選択し実行すると・・・

間隔値(※)を設定し・・・

※デフォルトは2mm

このパレットが表示されたら完了です。

アート簿度内にかさなっる事無く配置されます。ただし、選択群の数が多いと一部のオブジェクトは重なったままになります。

※Illustratorのアップデートで不具合が出る場合があります。気がついた時点でデバッグするように心がけていますが、すぐに対応できないのでご容赦ください。

木曜日, 7月 23, 2026

JavaScriptでAI遊び 101 
Illustratorで選択したオブジェクトの位置をランダム変更

選択したオブジェクトの位置をランダムに変更じます。

// 選択オブジェクトをランダム移動(mm指定)

if (app.documents.length === 0) {
alert("ドキュメントを開いてください。");
} else {

var doc = app.activeDocument;

if (doc.selection.length === 0) {
alert("オブジェクトを選択してください。");
} else {

var rangeMM = parseFloat(prompt("移動範囲 ±(mm)", "5"));

if (isNaN(rangeMM) || rangeMM < 0) {
alert("正しい数値を入力してください。");
exit();
}

// mm → pt
var rangePt = rangeMM * 2.834645669;

function randomOffset(range) {
return (Math.random() * 2 - 1) * range;
}

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

var item = doc.selection[i];

var dx = randomOffset(rangePt);
var dy = randomOffset(rangePt);

item.translate(dx, dy);
}

alert("ランダム移動完了");
}
}


移動距離を指定し・・・

※デフォルトは5mm

このパレットが表示されたら完了です。

上は処理結果です。

※Illustratorのアップデートで不具合が出る場合があります。気がついた時点でデバッグするように心がけていますが、すぐに対応できないのでご容赦ください。

月曜日, 7月 20, 2026

Let's start JavaScript 106 
シンプルにpointとmmの相互変換

pointとmmの相互変換をちょこちょこ使うので作りました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>point ⇔ mm 相互変換</title>
<style>
body{
font-family:sans-serif;
margin:40px;
font-size:18px;
background: black;
color: white;
}
input{
width:120px;
padding:6px;
font-size:18px;
}
label{
display:inline-block;
width:50px;
}
div{
margin-bottom:15px;
}
</style>
</head>
<body>
<center>
<h3>point ⇔ mm 相互変換</h3>

<div>
<label>point</label>
<input type="number" id="pt" step="0.01">
</div>

<div>
<label>mm</label>
<input type="number" id="mm" step="0.01">
</div>

<script>
// 1pt = 25.4 / 72 mm
const PT_TO_MM = 25.4 / 72;
const MM_TO_PT = 72 / 25.4;

const pt = document.getElementById("pt");
const mm = document.getElementById("mm");

pt.addEventListener("input", function () {
if (this.value === "") {
mm.value = "";
return;
}
mm.value = (parseFloat(this.value) * PT_TO_MM).toFixed(3);
});

mm.addEventListener("input", function () {
if (this.value === "") {
pt.value = "";
return;
}
pt.value = (parseFloat(this.value) * MM_TO_PT).toFixed(3);
});
</script>
</center>
</body>
</html>

実行したら・・・

どちらかに値を入れます。ここではpointに10と入力すると直ぐに3.528mmと表示されます。

そのままmmに5と入力すると直ぐに14.173pointと表示されます。つまり、どちらか一方の値を入力するともう一方が自動で更新されます。