日曜日, 3月 22, 2026

TCDW8713 
今後の作品に影響が出てくると思います

Cute Baby Alien 020(^o^)
俵犬系・・・なんだそれ?
3Dプリンタで,既に40体ほどプリントしています。実験を兼ねていますが、そこでのノウハウで今後の作品に影響が出てくると思います。まっ、実験といっても楽しい実験なので・・・。

土曜日, 3月 21, 2026

JavaScriptでAI遊び 90 
Illustratorで線幅と線形状を指定変更(改訂版)

改訂版も普通に[線]パレットで処理出来るので意味ないですが・・・
選択したパスの線を[線端、実角]を指定できるようにしました。

if (app.documents.length === 0) {
alert("ドキュメントがありません");
exit();
}

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

if (!sel || sel.length === 0) {
alert("パスを選択してください");
exit();
}

// ---------- UI ----------
var dlg = new Window("dialog", "ストローク詳細設定");
dlg.orientation = "column";
dlg.alignChildren = "left";

// 線幅
dlg.add("statictext", undefined, "線幅 (pt)");
var weightInput = dlg.add("edittext", undefined, "2");
weightInput.characters = 6;

// 線種
dlg.add("statictext", undefined, "線種");
var typeList = dlg.add("dropdownlist",
undefined, ["実線", "破線", "二重線"]);
typeList.selection = 0;

// 二重線間隔
dlg.add("statictext", undefined, "二重線の間隔 (pt)");
var gapInput = dlg.add("edittext", undefined, "2");
gapInput.characters = 6;

// 線端
dlg.add("statictext", undefined, "線端(Cap)");
var capList = dlg.add("dropdownlist",
undefined, ["丸", "角", "四角"]);
capList.selection = 0;

// 線角
dlg.add("statictext", undefined, "線角(Join)");
var joinList = dlg.add("dropdownlist",
undefined, ["丸", "角", "ベベル"]);
joinList.selection = 0;

// ボタン
var btns = dlg.add("group");
btns.add("button", undefined, "OK");
btns.add("button", undefined, "キャンセル");

if (dlg.show() !== 1) exit();

// ---------- 設定取得 ----------
var strokeWeight = parseFloat(weightInput.text);
var strokeType = typeList.selection.text;
var gap = parseFloat(gapInput.text);

// Cap
var capStyle = StrokeCap.ROUNDENDCAP;
if (capList.selection.text === "角") capStyle =
StrokeCap.BUTTENDCAP;
if (capList.selection.text === "四角") capStyle =
StrokeCap.PROJECTINGENDCAP;

// Join
var joinStyle = StrokeJoin.ROUNDENDJOIN;
if (joinList.selection.text === "角") joinStyle =
StrokeJoin.MITERENDJOIN;
if (joinList.selection.text === "ベベル") joinStyle =
StrokeJoin.BEVELENDJOIN;

// ---------- 処理 ----------
for (var i = 0; i < sel.length; i++) {
if (!(sel[i] instanceof PathItem)) continue;

var p = sel[i];
p.stroked = true;
p.strokeWidth = strokeWeight;
p.strokeCap = capStyle;
p.strokeJoin = joinStyle;

// 実線
if (strokeType === "実線") {
p.strokeDashes = [];
}

// 破線
if (strokeType === "破線") {
p.strokeDashes = [strokeWeight * 2,
            strokeWeight * 2];
}

// 二重線
if (strokeType === "二重線") {
p.strokeDashes = [];

// 内側線
p.strokeWidth = strokeWeight;

// 外側線
var p2 = p.duplicate();
p2.strokeWidth = strokeWeight;

var offsetValue = strokeWeight + gap;

var effectXML =
'<LiveEffect name="Adobe Offset Path">' +
'<Dict data="R mlim 4 R ofst ' + offsetValue + '"/>' +
'</LiveEffect>';

p2.applyEffect(effectXML);
}
}

alert("ストローク設定を適用しました");


実行すると表示されるパレットで設定をすれば・・・

設定が反映されます。




オープンパスに対する二重線の問題は解決していません(>_<)

TCDW8712 
30人ぐらい並んでいたのは何だったのだろう

昨日、量販店で買い物をしようとしたら、謎の長蛇のレジ待ちをみて戦力喪失。30人ぐらい並んでいたのは何だったのだろう・・・。某アップルストアでも転売ヤーの列を彷彿させる光景でした。

金曜日, 3月 20, 2026

3Dプリンタ遊び 05 
フィラメントの選択は大切

プレートへの定着が悪く、色々試していたのですが、PVA合成洗濯のりでもダメなことがあり、困惑していたのですが・・・・


取りあえず手持ちのスティック糊で急場をしのいでいましたが・・・


IPA(高純度アルコール)でプレート部分をキムワイプで拭くことが私の環境では一番だと分かりました。

一件落着なので、ここで改めてフィラメントについて調べて見ました。
Bambu Lab A1 miniで使える推奨フィラメントは4種類

PLA
PETG
TPU(柔軟素材)
PVA(水溶性サポート材)



現実的な2種類を整理するとこんな感じになりました。

ここで改めて私が求めている方向でまとめると、8対2でPLAという答えが出ました。ということで近々にPLAを購入することにしました。

TCDW8711 
9年も前に購入していたようです

Amazonで精密ヤスリを物色していてポチる寸前、別件で部屋の中で捜し物をしていたら、同じ物が出てきて唖然。9年も前に購入していたようです(^o^)汗

木曜日, 3月 19, 2026

メカニカルリードホルダーで精密ヤスリを使う

メカニカルリードホルダーシリーズですね。
今回は精密ヤスリ編です。

メカニカルリードホルダーで竹製ニードル 2023/01/08

ヤスリのサイズにもよりますが、意外と手持ちの数本が利用可能でした。細すぎると持ちにくいのですが、これで持ちやすくなりました。

精密ヤスリの利用は力を入れる作業にはならないので問題なしです。

TCDW8710 
雰囲気が似ている場所が多いので要注意ですね

久しぶりンい利用した路線で、よく利用する卯路線と勘違いして関係ない駅で下車してしまい苦笑い。地下鉄は雰囲気が似ている場所が多いので要注意ですね。

水曜日, 3月 18, 2026

Bambu Studio Lessons 04 
座面が曲面の場合の対処方法

座面が曲面の場合の対処方法の試行錯誤・・・

何位も考えずにプリントしたら・・・

お尻の部分が、かなり残念な結果になりました。上はヤスリがけで挫折した状態(>_<)

そこで。あえてサポート材を自主作成し、自動のサポート材と組み合わせてみました。

結果は、だいぶ改善されましたが、かかとの部分がもぎれてしまいました。」

でも、よく考えたら、立たせれば良かったわけです。いつもこの状態で作成出来るわけではありませんが、キャラクタ類はこれが基本かもしれませんね。なお、この状態ではプリントしていません。

立つことを想定していなかったので、微妙に外股になっているので・・・(>_<)

お尻を隠せばこんな感じです。

※Bambu Lab 高速 PETGを使用

TCDW8709 
どちらも好きという人は存在するのかな〜?

Cute Baby Alien 019(^o^)
六つ足はカブトムシやクワガタだけじゃなくてGも含まれるんですよね。どちらも嫌いという人は普通に居ますが、どちらも好きという人は存在するのかな〜?

火曜日, 3月 17, 2026

Let's start JavaScript 100 
3Dデータの比率を保ったサイズ変更

modoやBlenderでは、何故か? 比率を保ったまま数値指定でサイズ変更が出来ない(※)ので、取りあえずHTMLで比率を保ったサイズ変更を作成して見ました。

※modoやBlenderは比率の拡大縮小なら比率を保ったままの処理が可能です。もしかして他の3Dソフトも同じなのかも? まっ、比率で計算してもいいんですけどね。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>3Dの比率を保ったサイズ変更</title>
<style>
body {
font-family: "Segoe UI", sans-serif;
background: gray;
display: flex;
justify-content: center;
align-items: center;
height: 80vh;
margin: 0;
}

.container {
background: #ffffff;
padding: 40px;
border-radius: 14px;
box-shadow: 0 8px 25px rgba(0,0,0,0.08);
width: 500px;
}

h2 {
margin-bottom: 30px;
font-weight: 600;
text-align: center;
color: #333;
}

.section {
margin-bottom: 30px;
}

.section-title {
font-size: 14px;
color: #666;
margin-bottom: 12px;
letter-spacing: 1px;
}

.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 18px;
}

.field {
display: flex;
flex-direction: column;
}

label {
font-size: 13px;
margin-bottom: 6px;
color: #555;
}

input {
padding: 5px;
border-radius: 8px;
border: 1px solid #dcdfe6;
font-size: 14px;
transition: 0.2s;
}

input:focus {
border-color: #4a90e2;
box-shadow: 0 0 0 3px rgba(74,144,226,0.15);
outline: none;
}

.result input {
background: #f0f6ff;
}

button {
width: 102%;
padding: 5px;
border-radius: 8px;
border: none;
background: #4a90e2;
color: white;
font-size: 14px;
cursor: pointer;
transition: 0.2s;
}

button:hover {
background: #3a7bd5;
}
</style>
</head>
<body>

<div class="container">
<h2>3Dの比率を保ったサイズ変更</h2>

<div class="section">
<div class="section-title">元の値</div>
<div class="grid">
<div class="field">
<label>old X</label>
<input type="text" id="x" value="2">
</div>
<div class="field">
<label>old Y</label>
<input type="text" id="y" value="4">
</div>
<div class="field">
<label>old Z</label>
<input type="text" id="z" value="6">
</div>
</div>
</div>

<div class="section result">
<div class="section-title">新しい値(どれか1つ入力)</div>
<div class="grid">
<div class="field">
<label>new X</label>
<input type="text" id="x2">
</div>
<div class="field">
<label>new Y</label>
<input type="text" id="y2">
</div>
<div class="field">
<label>new Z</label>
<input type="text" id="z2">
</div>
</div>
</div>

<button onclick="clearAll()">新しい値のクリア</button>
</div>

<script>
const x = document.getElementById("x");
const y = document.getElementById("y");
const z = document.getElementById("z");
const x2 = document.getElementById("x2");
const y2 = document.getElementById("y2");
const z2 = document.getElementById("z2");

function toNum(val){
return parseFloat(val);
}

function round2(num){
return (Math.round(num * 100) / 100).toFixed(2);
}

function calculate(source){
const xVal = toNum(x.value);
const yVal = toNum(y.value);
const zVal = toNum(z.value);

if (!xVal || !yVal || !zVal) return;

let ratio;

if(source==="x2" && x2.value!==""){
ratio = toNum(x2.value) / xVal;
} else if(source==="y2" && y2.value!==""){
ratio = toNum(y2.value) / yVal;
} else if(source==="z2" && z2.value!==""){
ratio = toNum(z2.value) / zVal;
} else {
return;
}

if(isNaN(ratio)) return;

if(source !== "x2") x2.value = round2(xVal * ratio);
if(source !== "y2") y2.value = round2(yVal * ratio);
if(source !== "z2") z2.value = round2(zVal * ratio);
}

function clearAll(){
x2.value="";
y2.value="";
z2.value="";
}

x2.addEventListener("input",()=>calculate("x2"));
y2.addEventListener("input",()=>calculate("y2"));
z2.addEventListener("input",()=>calculate("z2"));
</script>

</body>
</html>

実行直後の画面です。

現在の値をoldXYZに入力し・・・

newXYZのどれかに求める値を入力すると、残り3つの値が自動的に表示されます。

[新しい値クリア]でnewXYZの値をリセットできます。

TCDW8708 
相互に新しい発見があって楽しいです

久しぶりに使うジャンルのソフトの類似ソフトを同時に使うことを楽しんでいます。来月あたりから公開予定。modoとBlenderのような感じです。相互に新しい発見があって楽しいです。混乱も頭の体操ですね〜。

月曜日, 3月 16, 2026

お手軽プラスチック溶接

プラスチック溶接機を買えば済む問題ですが、原理は簡単なので専用の道具なしでチャレンジしてみました。

カッティングシートが汚くて申し訳ないです。

最初に思いついたのはホチキスの針。しかし、直ぐに熱が冷めてしまうので失敗でした。

そこで100均で手に入れた0.9mm径のステンレス針金をホチキスの針のように加工し、ライターで熱してプラスチックの接合部分に押し当てたところ、上手くいきました。

ただし、針金が冷めた後で余分な部分をニッパーなどでカットし、切り口を金工用ヤスリで調整するのがちょっと大変でした。針金のコーナー部分を綺麗な直角に折り曲げること。綺麗に素早くカットできるニッパーが処理の要です。

取りあえずなんとかなったのですが、ニッパーと金工用ヤスリを新たに買い求めないとダメかもしれません。

もうちょっと実験してみますが、強度を上げるために針金に水平を保って波を付けるのは至難の技。素直に専用機を買った方が良さそうですね(^o^)

TCDW8707 
接的にイメージが沸いてくる感じです

アンティーク専門店へ時々出かけるのですが、買うわけではなくアイデア探しだったりします。もちろん古いデザインが参考になるわけではなく、間接的にイメージが沸いてくる感じです。

日曜日, 3月 15, 2026

Bambu Studio Lessons 03 
まとめてプリントする際の注意点

プレートのエリア内であればまとめて配置し、プリントすることは何ら問題ないのですが、うっかりミスってしまいました。

4つのキャラクタを配置し・・・

※実際に発生したトラブル時のレイアウトではありません。Bambu Studioは自動保存なので終止した時点で上書き保存されてしまうためです。もし元の状態を残したい場合は、一旦終了してからファイルの複製を作成し、複製側を修正するとよいでしょう。

必ずサポートの状況を確認しましょう。

上はプリント結果ですが、一部で形状生成に失敗していますが、プレビュー状態でサポートが重なっていないことを確認すれば問題は解決します。

背面には後ろに設置したキャラクターのサポートが食い込んでしまいました。カッターとヤスリで消し取りましたが、面倒な後処理は時間の無駄なので、必ずチェックです。

※Bambu Lab 高速 PETGを使用

TCDW8706 
アルバムを眺めて時の流れを感じてしまいました

ふと、1973年に発売されたポール・マッカートニー&ウイングスのアルバム「Band on the Run」のジャケットッ写真の9名の人物のうち、存命なのはポール・マッカートニーとジョン・コンテの二人になっていたんですね。このお気に入りのアルバムを眺めて時の流れを感じてしまいました。

土曜日, 3月 14, 2026

JavaScriptでAI遊び 89 
Illustratorで線幅と線形状を指定変更

普通に[線]パレットで処理出来るので意味ないですが・・・
選択したパスの線を[線幅、実線、破線、二重線]を指定します。

if (app.documents.length === 0) {
alert("ドキュメントがありません");
exit();
}

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

if (!sel || sel.length === 0) {
alert("パスを選択してください");
exit();
}

// ---- UI ----
var dlg = new Window("dialog", "ストローク設定");
dlg.orientation = "column";

dlg.add("statictext", undefined, "線幅 (pt)");
var weightInput = dlg.add("edittext", undefined, "2");
weightInput.characters = 6;

dlg.add("statictext", undefined, "線種");
var typeList = dlg.add("dropdownlist",
undefined, ["実線", "破線", "二重線"]);
typeList.selection = 0;

var btns = dlg.add("group");
btns.add("button", undefined, "OK");
btns.add("button", undefined, "キャンセル");

if (dlg.show() !== 1) exit();

var strokeWeight = parseFloat(weightInput.text);
var strokeType = typeList.selection.text;

// ---- 処理 ----
for (var i = 0; i < sel.length; i++) {
if (!(sel[i] instanceof PathItem)) continue;

var p = sel[i];
p.stroked = true;
p.strokeWidth = strokeWeight;

if (strokeType === "実線") {
p.strokeDashes = [];
}

if (strokeType === "破線") {
p.strokeDashes = [strokeWeight * 2, strokeWeight * 2];
}

if (strokeType === "二重線") {
// 元の線
p.strokeDashes = [];

// 複製して外側の線を作る
var p2 = p.duplicate();
p2.strokeWidth = strokeWeight * 0.5;

// Offset Path エフェクト適用
var offset = strokeWeight * 1.2;
var effectXML =
'<LiveEffect name="Adobe Offset Path">' +
'<Dict data="R mlim 4 R ofst ' + offset + '"/>' +
'</LiveEffect>';

p2.applyEffect(effectXML);
}
}

alert("ストロークを変更しました");


サンプル形状・・・

実行すると表示されるパレットで・・・

線幅を5pt、線種を破線にすると・・・

直ぐに[変更しました]が表示され・・・

指定が反映されます。

二重線は・・・

塗りがあると正しく表示しません(今後の課題)。

塗りを無しにすればこんな感じです。

ただし、オープンパスに対して実行すると・・・

三重線になってしまいます(今後の課題)。