水曜日, 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、線種を破線にすると・・・

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

指定が反映されます。

二重線は・・・

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

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

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

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

TCDW8705 
無意識にイメージを溜め込んでいたのかもですね

Cute Baby Alien 018(^o^)
ハーシーのチョコ系〜でも色は明治アポロ?(^o^)
普段の行動範囲が変化すると、それまで定期的に出向いていた場所の景観がちょっと気になってしまうことがあります。無意識にイメージを溜め込んでいたのかもですね。