vibe-openscad

tier-3-butt-hinge / claude-opus-4-8

10 run / 累計 248.4s / 累計 $0.5890

claude opus 4.8 bare

bare (provider default effort)

run detail →
render
bare render of tier-3-butt-hinge
loading STL…
success 23.6s · 743/1991t · $0.0535
SCAD (140 lines)
// ============================================================
// 家具用 小型バット蝶番 (butt hinge)
// 開いた状態 (180°) で配置
// ============================================================

$fn = 64;

// ---------- パラメータ ----------
leaf_w      = 25;    // 板の横幅 (開く方向)
leaf_h      = 30;    // 板の縦 (ヒンジ軸方向)
leaf_t      = 2;     // 板厚

pin_d       = 4;     // ピン軸 直径
pin_len     = 32;    // ピン軸 長さ

knuckle_od  = 8;     // knuckle 外径
knuckle_id  = 4.6;   // knuckle 内径 (ピン + 0.3 クリアランス)
seg         = 6;     // knuckle 1個の高さ (30/5)

// 皿穴 (M3)
screw_pitch = 8;     // 縦方向ピッチ
cs_d        = 6;     // 皿(テーパ) 直径
cs_depth    = 1;     // 皿深さ
hole_d      = 3.2;   // 貫通穴 直径

// knuckle 中心軸位置 (Y軸に重ねる -> X=0,Z=0)
// 板は knuckle 外径の接線あたりから伸びる
plate_x0    = knuckle_od/2 - leaf_t; // 板内側位置の基準

// ============================================================
// knuckle (筒) : Y方向に立てた円筒 (中心 X=0,Z=0)
// ============================================================
module knuckle(y0, h) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(h = h, d = knuckle_od);
                translate([0, 0, -1])
                    cylinder(h = h + 2, d = knuckle_id);
            }
}

// ============================================================
// 皿穴 (板を貫通) : Z方向
// 板の上面 z = leaf_t, 下面 z = 0
// ============================================================
module countersink(x, y) {
    translate([x, y, 0]) {
        // 貫通穴
        translate([0, 0, -1])
            cylinder(h = leaf_t + 2, d = hole_d);
        // 皿(テーパ) : 上面側
        translate([0, 0, leaf_t - cs_depth])
            cylinder(h = cs_depth + 0.01,
                     d1 = hole_d, d2 = cs_d);
    }
}

// ============================================================
// 平板部 (knuckle なし)
//   dir = -1 : 左板 (x<0)
//   dir = +1 : 右板 (x>0)
// ============================================================
module leaf_plate(dir) {
    // 板は knuckle 軸の接線付近から外側へ
    // 内側端 : 板が knuckle に接続する位置
    inner = knuckle_od/2 - leaf_t; // 板の内側 x 絶対値
    // 平板本体
    if (dir < 0) {
        // 左板 : x = -inner - leaf_w  ~  -inner
        difference() {
            translate([-inner - leaf_w, -leaf_h/2, 0])
                cube([leaf_w, leaf_h, leaf_t]);
            // 皿穴 (knuckle から離れた側)
            sx = -inner - leaf_w + 5;
            for (i = [-1, 0, 1])
                countersink(sx, i * screw_pitch);
        }
    } else {
        // 右板 : x = inner  ~  inner + leaf_w
        difference() {
            translate([inner, -leaf_h/2, 0])
                cube([leaf_w, leaf_h, leaf_t]);
            sx = inner + leaf_w - 5;
            for (i = [-1, 0, 1])
                countersink(sx, i * screw_pitch);
        }
    }
}

// ============================================================
// 左板 : knuckle を外側2個 + 中央1個 (segment 0,2,4)
// ============================================================
module left_leaf() {
    color("Silver") {
        // 板を knuckle 中心高さ(z=0)に合わせる
        translate([0, 0, -leaf_t/2])
            leaf_plate(-1);
        // knuckle (segment 0,2,4)
        for (i = [0, 2, 4])
            knuckle(-leaf_h/2 + i*seg, seg);
        // knuckle と板をつなぐウェブ (左側)
        for (i = [0, 2, 4])
            translate([-(knuckle_od/2 - leaf_t),
                       -leaf_h/2 + i*seg, -leaf_t/2])
                cube([knuckle_od/2, seg, leaf_t]);
    }
}

// ============================================================
// 右板 : knuckle を中間2個 (segment 1,3)
// ============================================================
module right_leaf() {
    color("LightSteelBlue") {
        translate([0, 0, -leaf_t/2])
            leaf_plate(1);
        for (i = [1, 3])
            knuckle(-leaf_h/2 + i*seg, seg);
        for (i = [1, 3])
            translate([0, -leaf_h/2 + i*seg, -leaf_t/2])
                cube([knuckle_od/2, seg, leaf_t]);
    }
}

// ============================================================
// ピン軸 : Y軸に沿う円柱 (両端 1mm 飛び出す)
// ============================================================
module pin() {
    color("Gold")
        translate([0, -pin_len/2, 0])
            rotate([-90, 0, 0])
                cylinder(h = pin_len, d = pin_d);
}

// ============================================================
// 組み立て (180° 開いた状態)
// ============================================================
left_leaf();
right_leaf();
pin();
パラメータ (12)
スライダを動かすと openscad-wasm で再レンダリング

prompt

OpenSCAD で、家具用の小型バット蝶番(butt hinge)を作ってください。
3 つのパーツ(左板、右板、ピン軸)が組み合わさって動作する完成品を、
「開いた状態(180°)」で 1 つの SCAD ファイルに配置して出力します。

寸法と配置:
- 板(leaf)2 枚: 30mm × 25mm × 厚さ 2mm の鉄板形状
  - 縦 30mm の辺がピン軸に沿う(ヒンジ軸方向)
  - 横 25mm の辺が回転で開く方向に伸びる
- ピン軸: 直径 4mm の円柱、長さ 32mm(両端 1mm ずつ knuckle から飛び出す)
- knuckle(筒部): 縦 30mm を 5 等分(各 6mm)に区切り、左板に 3 個・右板に 2 個を
  互い違いに配置(左板は外側 2 個 + 中央 1 個、右板は中間 2 個)
- knuckle 外径 8mm、内径はピン軸 + 0.3mm クリアランス(= 4.6mm 穴)
- 左板と右板はピン軸を共有して回転可能。180° 開いた状態で、両板の
  平らな面が同一平面に来るように配置する
- 各板の knuckle から離れた側に、M3 用の皿穴を 3 個ずつ
  (穴ピッチは板の縦方向に 8mm 間隔、皿穴は表面から見て直径 6mm × 深さ 1mm
  のテーパ + 直径 3.2mm の貫通穴)

座標系:
- ピン軸の中心線を Y 軸に重ねる(ピン軸は +Y 方向)
- 板の平らな面は Z 軸に直交し、左板が x<0 側、右板が x>0 側に伸びる(180° 開)
- knuckle は X=0 を中心とし、Y 方向に 6mm ずつ並ぶ

完成したコード全体を ```openscad ... ``` のフェンスで囲んで出力してください。
コードのみで、追加の説明は不要です。

variant: effort

low success
low
18.0s · 743/1333t · $0.0370
SCAD (80 lines)
// 家具用 小型バット蝶番 (butt hinge) - 180°開状態
// ピン軸中心線 = Y軸, knuckle外径8, ピン径4

$fn = 60;

// パラメータ
leaf_len   = 30;   // 縦(Y方向, ヒンジ軸方向)
leaf_w     = 25;   // 横(開く方向)
leaf_t     = 2;    // 板厚
pin_d      = 4;    // ピン径
pin_len    = 32;   // ピン長
knuckle_od = 8;    // knuckle外径
knuckle_id = 4.6;  // knuckle内径(ピン+0.3クリア)
seg        = 6;    // 各knuckle長
n_seg      = 5;    // 分割数

// knuckle の y 開始位置 (X=0中心, Y方向に並ぶ, 中心が原点)
// 5等分: y = -15..15, 各6mm → 区間 [-15,-9],[-9,-3],[-3,3],[3,9],[9,15]
function seg_y(i) = -leaf_len/2 + i*seg;  // i番目区間の開始y

// 皿穴 (M3): 表面 φ6×深さ1 テーパ + φ3.2貫通
module csk_hole() {
    // 板厚方向 Z に貫通。板の上面 z = +leaf_t/2 側にテーパ
    translate([0,0,-leaf_t/2-0.1])
        cylinder(d=3.2, h=leaf_t+0.2);
    translate([0,0,leaf_t/2-1])
        cylinder(d1=3.2, d2=6, h=1+0.01);
    translate([0,0,leaf_t/2])
        cylinder(d=6, h=0.1); // 表面開口
}

// knuckle (筒) 1個: 区間 i
module knuckle(i) {
    translate([0, seg_y(i), 0])
    rotate([-90,0,0])
        difference() {
            cylinder(d=knuckle_od, h=seg);
            translate([0,0,-0.1])
                cylinder(d=knuckle_id, h=seg+0.2);
        }
}

// 板本体 (knuckle側を X=knuckle_od/2 から leaf_w 伸ばす)
// 板は z 中心0, 厚さ leaf_t。X方向 sign(+1=右, -1=左)
module leaf_plate(sgn) {
    x0 = knuckle_od/2;
    translate([sgn*x0, -leaf_len/2, -leaf_t/2])
        cube([leaf_w, leaf_len, leaf_t]);
}

// 板 + knuckle に皿穴を開ける
// 皿穴位置: knuckleから離れた側, 縦8mm間隔3個
module leaf(sgn, seg_indices) {
    // ねじ穴のX位置(板の外側寄り)
    hole_x = sgn*(knuckle_od/2 + leaf_w - 6);
    difference() {
        union() {
            leaf_plate(sgn);
            for (i = seg_indices) knuckle(i);
        }
        // 皿穴 3個 (y = -8,0,8)
        for (dy = [-8,0,8])
            translate([hole_x, dy, 0]) csk_hole();
    }
}

// ピン軸
module pin() {
    rotate([-90,0,0])
        translate([0,0,-pin_len/2])
            cylinder(d=pin_d, h=pin_len);
}

// 配置
// 左板(x<0): 外側2個 + 中央1個 = 区間 0,2,4
color("Silver")  leaf(-1, [0,2,4]);
// 右板(x>0): 中間2個 = 区間 1,3
color("LightGray") leaf( 1, [1,3]);
// ピン軸
color("Gold") pin();
mediumnot run
high (default) success
high
21.3s · 743/1799t · $0.0487
SCAD (120 lines)
// 小型バット蝶番(butt hinge) 180°開いた状態
// ピン軸中心線 = Y軸、左板 x<0、右板 x>0

$fn = 64;

// パラメータ
leaf_w     = 25;    // 横(開く方向)
leaf_h     = 30;    // 縦(軸方向)
leaf_t     = 2;     // 板厚
pin_d      = 4;     // ピン直径
pin_len    = 32;    // ピン長さ
knuckle_od = 8;     // knuckle外径
knuckle_id = pin_d + 0.3; // 内径(クリアランス)
seg        = leaf_h / 5;  // 6mm

// 皿穴パラメータ
csk_outer  = 6;     // 皿穴上面直径
csk_depth  = 1;     // テーパ深さ
hole_d     = 3.2;   // 貫通穴
hole_pitch = 8;     // 縦方向ピッチ

knuckle_r  = knuckle_od / 2;

// ---- knuckle(筒部) ----
// y0: 開始Y位置, len: 長さ
module knuckle(y0, len) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(h = len, d = knuckle_od);
                translate([0, 0, -1])
                    cylinder(h = len + 2, d = knuckle_id);
            }
}

// ---- 皿穴(板の中央付近、貫通)----
// 板の上面を Z = knuckle_r、下面を Z = knuckle_r - leaf_t と想定して使用
module countersink_at(x, y, top_z, t) {
    translate([x, y, 0]) {
        // 貫通穴
        translate([0, 0, top_z - t - 1])
            cylinder(h = t + 2, d = hole_d);
        // 皿テーパ(上面から)
        translate([0, 0, top_z - csk_depth])
            cylinder(h = csk_depth + 0.01, d1 = hole_d, d2 = csk_outer);
    }
}

// ---- 板本体(平板部) ----
// dir = -1 (左, x<0), +1 (右, x>0)
// 板の平面は knuckle中心からオフセットして同一平面(180°開)になるよう配置
// 板上面 Z = knuckle_r, 下面 Z = knuckle_r - leaf_t
module leaf_plate(dir) {
    // x: knuckle中心(X=0)から leaf_w 伸びる
    // knuckleと重なる部分は接続用に knuckle_r まで含める
    x_inner = 0;
    x_outer = dir * (knuckle_r + leaf_w);
    x_lo = min(x_inner, x_outer);
    x_hi = max(x_inner, x_outer);
    translate([x_lo, 0, knuckle_r - leaf_t])
        cube([x_hi - x_lo, leaf_h, leaf_t]);
}

// ---- 左板(knuckle 3個: 外側2 + 中央1)----
module left_leaf() {
    color("silver")
    difference() {
        union() {
            // 平板
            leaf_plate(-1);
            // knuckle 外側2 + 中央1 -> セグメント 0,2,4
            knuckle(0 * seg, seg);
            knuckle(2 * seg, seg);
            knuckle(4 * seg, seg);
            // 板とknuckleをつなぐウェブ(knuckle中心から板へ)
        }
        // ピン穴(共有)
        translate([0, -1, 0])
            rotate([-90, 0, 0])
                cylinder(h = leaf_h + 2, d = knuckle_id);
        // 皿穴 3個(板の外側)
        cx = -(knuckle_r + leaf_w - 6);
        top_z = knuckle_r;
        for (i = [0:2])
            countersink_at(cx, leaf_h/2 + (i-1)*hole_pitch, top_z, leaf_t);
    }
}

// ---- 右板(knuckle 2個: 中間2)----
module right_leaf() {
    color("gray")
    difference() {
        union() {
            leaf_plate(1);
            // knuckle 中間2 -> セグメント 1,3
            knuckle(1 * seg, seg);
            knuckle(3 * seg, seg);
        }
        translate([0, -1, 0])
            rotate([-90, 0, 0])
                cylinder(h = leaf_h + 2, d = knuckle_id);
        cx = (knuckle_r + leaf_w - 6);
        top_z = knuckle_r;
        for (i = [0:2])
            countersink_at(cx, leaf_h/2 + (i-1)*hole_pitch, top_z, leaf_t);
    }
}

// ---- ピン軸 ----
module pin() {
    color("gold")
    translate([0, -1, 0])     // 両端1mmずつ飛び出す
        rotate([-90, 0, 0])
            cylinder(h = pin_len, d = pin_d);
}

// ---- 組み立て(180°開いた状態)----
left_leaf();
right_leaf();
pin();
max success
max
28.9s · 741/2475t · $0.0656
SCAD (170 lines)
// =========================================================
// Small Butt Hinge for Furniture (M3 mounting holes)
// Open state: 180 degrees (both leaves coplanar)
// =========================================================
//
// Coordinate system:
//   - Pin axis along +Y (centerline on Y-axis)
//   - Leaf flat faces perpendicular to Z
//   - Left leaf extends to x<0, right leaf to x>0
//   - Knuckles centered at X=0, stacked along Y in 6mm bands
//
// =========================================================

$fn = 64;

// ---------------- Parameters ----------------
leaf_len    = 30;    // dimension along pin axis (Y)
leaf_width  = 25;    // dimension in opening direction (X)
leaf_thk    = 2;     // plate thickness (Z)

pin_dia     = 4;     // pin shaft diameter
pin_len     = 32;    // pin total length (1mm overhang each end)

knuckle_n   = 5;     // total knuckle bands
knuckle_h   = leaf_len / knuckle_n;   // = 6
knuckle_od  = 8;     // knuckle outer diameter
clearance   = 0.3;   // pin-to-bore clearance
knuckle_id  = pin_dia + clearance;    // = 4.3 -> spec says 4.6; use +0.3 from pin? 
// NOTE: spec text: inner = pin + 0.3 clearance (=4.6 hole). 
// pin=4, +0.3 clearance => bore 4.6 (0.3 radial? diametral?). Use 4.6 as written.
knuckle_bore = 4.6;

// M3 countersunk holes
screw_clear_dia = 3.2;   // through hole
csk_dia         = 6;     // countersink top diameter
csk_depth       = 1;     // countersink depth
screw_n         = 3;     // holes per leaf
screw_pitch     = 8;     // spacing along Y

// derived: place screws near far edge of each leaf
// knuckle sits at X=0 spanning radius knuckle_od/2 = 4
// flat plate goes from edge of knuckle outward.

// ---------------- Helper: knuckle band ----------------
module knuckle_band() {
    // cylinder centered on Y-axis, length knuckle_h along Y
    rotate([-90, 0, 0])              // align cylinder axis to +Y
        cylinder(h = knuckle_h, d = knuckle_od);
}

module pin_bore_band() {
    rotate([-90, 0, 0])
        cylinder(h = knuckle_h + 0.2, d = knuckle_bore);
}

// ---------------- Helper: leaf plate ----------------
// A flat plate of size width x leaf_len x thk.
// dir = +1 -> extends to +X (right leaf)
// dir = -1 -> extends to -X (left leaf)
// The plate's flat face is on Z. We center it so top face at z=+thk/2.
// It starts from the knuckle outer edge and extends outward by leaf_width.
module leaf_plate(dir) {
    // knuckle outer radius
    kr = knuckle_od / 2;

    // plate spans X from kr to kr+leaf_width (then mirrored by dir)
    // but to nicely blend with knuckle, start a bit inside (overlap).
    overlap = kr;        // overlap region for solid joint
    x_start = -overlap;  // begin inside knuckle for union
    x_end   = leaf_width + kr;

    // For 180-deg open, both plates lie in same plane (z around 0).
    translate([0, 0, -leaf_thk/2])
        if (dir > 0) {
            translate([x_start, 0, 0])
                cube([x_end - x_start, leaf_len, leaf_thk]);
        } else {
            mirror([1,0,0])
                translate([x_start, 0, 0])
                    cube([x_end - x_start, leaf_len, leaf_thk]);
        }
}

// ---------------- Helper: countersunk screw hole ----------------
// Drilled from top (+Z) downward through the plate.
// Positioned at given (x, y).
module csk_hole(x, y) {
    translate([x, y, 0]) {
        // through hole
        translate([0, 0, -leaf_thk/2 - 0.1])
            cylinder(h = leaf_thk + 0.2, d = screw_clear_dia);
        // countersink (taper) opening upward from top face
        translate([0, 0, leaf_thk/2 - csk_depth])
            cylinder(h = csk_depth + 0.01,
                     d1 = screw_clear_dia,
                     d2 = csk_dia);
    }
}

// ---------------- Screw hole pattern for a leaf ----------------
// dir = +1 right leaf, -1 left leaf
module screw_pattern(dir) {
    kr = knuckle_od / 2;
    // place holes near the far edge of the plate
    // center column at some X away from knuckle
    hole_x = dir * (leaf_width + kr - 6);   // 6mm in from outer edge

    // center the 3 holes along Y about leaf center
    y0 = leaf_len/2 - ((screw_n - 1) * screw_pitch)/2;
    for (i = [0 : screw_n - 1]) {
        csk_hole(hole_x, y0 + i * screw_pitch);
    }
}

// ---------------- Left leaf ----------------
// Left leaf knuckles: outer 2 (band 0 and band 4) + center (band 2)
left_bands = [0, 2, 4];
// Right leaf knuckles: middle 2 (band 1 and band 3)
right_bands = [1, 3];

module left_leaf() {
    color("silver")
    difference() {
        union() {
            leaf_plate(-1);
            for (b = left_bands)
                translate([0, b * knuckle_h, 0])
                    knuckle_band();
        }
        // bore through left-leaf knuckles
        for (b = left_bands)
            translate([0, b * knuckle_h - 0.1, 0])
                pin_bore_band();
        // screw holes
        screw_pattern(-1);
    }
}

module right_leaf() {
    color("lightsteelblue")
    difference() {
        union() {
            leaf_plate(+1);
            for (b = right_bands)
                translate([0, b * knuckle_h, 0])
                    knuckle_band();
        }
        // bore through right-leaf knuckles
        for (b = right_bands)
            translate([0, b * knuckle_h - 0.1, 0])
                pin_bore_band();
        // screw holes
        screw_pattern(+1);
    }
}

// ---------------- Pin ----------------
module pin() {
    color("dimgray")
    // total length pin_len, centered so it overhangs 1mm each end
    // knuckle stack spans Y = 0 .. leaf_len (=30); pin from -1 .. 31
    translate([0, -1, 0])
        rotate([-90, 0, 0])
            cylinder(h = pin_len, d = pin_dia);
}

// ---------------- Assembly (180 deg open) ----------------
left_leaf();
right_leaf();
pin();
xhigh success
xhigh
22.2s · 743/1797t · $0.0486
SCAD (115 lines)
// =====================================================
// 家具用 小型バット蝶番 (Butt Hinge)
// 開いた状態 (180°) で出力
// =====================================================

// ---------- パラメータ ----------
leaf_width   = 25;    // 板の横(開く方向)
leaf_length  = 30;    // 板の縦(ピン軸方向)
leaf_thick   = 2;     // 板の厚さ

pin_dia      = 4;     // ピン軸 直径
pin_len      = 32;    // ピン軸 長さ(両端 1mm ずつ飛び出す)

knuckle_od   = 8;     // knuckle 外径
knuckle_clr  = 0.3;   // クリアランス
knuckle_id   = pin_dia + knuckle_clr;  // 4.6mm
knuckle_seg  = 6;     // 各 knuckle の長さ(30/5)

screw_csink_dia = 6;    // 皿穴 テーパ径
screw_csink_dep = 1;    // 皿穴 深さ
screw_thru_dia  = 3.2;  // 貫通穴径
screw_pitch     = 8;    // ねじ穴ピッチ

$fn = 64;

// knuckle のセグメント Y 位置(下端) : 0,6,12,18,24
// 互い違い配置
//   左板: セグメント 0, 2, 4 (外側2 + 中央1)
//   右板: セグメント 1, 3   (中間2)
left_segments  = [0, 2, 4];
right_segments = [1, 3];

// ---------- knuckle (筒部) ----------
module knuckle(seg_index) {
    y0 = seg_index * knuckle_seg;
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(h = knuckle_seg, d = knuckle_od);
                translate([0, 0, -1])
                    cylinder(h = knuckle_seg + 2, d = knuckle_id);
            }
}

// ---------- 皿穴 1個分 (Z方向に貫通、表面 z=+leaf_thick/2 側にテーパ) ----------
module screw_hole() {
    // 貫通穴
    translate([0, 0, -leaf_thick/2 - 1])
        cylinder(h = leaf_thick + 2, d = screw_thru_dia);
    // 皿(テーパ): 表面側
    translate([0, 0, leaf_thick/2 - screw_csink_dep])
        cylinder(h = screw_csink_dep + 0.01,
                 d1 = screw_thru_dia, d2 = screw_csink_dia);
    // 表面より上の余裕(テーパ口を確実に開ける)
    translate([0, 0, leaf_thick/2 - 0.001])
        cylinder(h = 0.5, d = screw_csink_dia);
}

// ---------- 板本体 (knuckle 側 x=0 から外側へ) ----------
// dir = -1 : 左板 (x<0)   dir = +1 : 右板 (x>0)
module leaf_plate(dir) {
    // knuckle 中心(X=0)から板が伸びる。
    // 板は knuckle 外周に接続するため、根元を knuckle_od/2 付近から始める。
    plate_start = knuckle_od/2 - 1;        // 少し knuckle に食い込ませて結合
    plate_x     = leaf_width;              // 板の伸び量

    difference() {
        // 板 (厚さは z 方向、上面 z=+leaf_thick/2)
        if (dir < 0) {
            translate([-plate_start - plate_x, 0, -leaf_thick/2])
                cube([plate_x, leaf_length, leaf_thick]);
        } else {
            translate([plate_start, 0, -leaf_thick/2])
                cube([plate_x, leaf_length, leaf_thick]);
        }

        // ねじ皿穴 3 個 (knuckle から離れた側)
        // X 位置: 板の外端寄り
        screw_x = dir * (plate_start + plate_x - 5);
        // Y 中心を中央、8mm ピッチで 3 個
        for (i = [-1, 0, 1]) {
            translate([screw_x, leaf_length/2 + i * screw_pitch, 0])
                screw_hole();
        }
    }
}

// ---------- 左板 アセンブリ ----------
module left_leaf() {
    color("Silver") {
        leaf_plate(-1);
        for (s = left_segments) knuckle(s);
    }
}

// ---------- 右板 アセンブリ ----------
module right_leaf() {
    color("LightSteelBlue") {
        leaf_plate(1);
        for (s = right_segments) knuckle(s);
    }
}

// ---------- ピン軸 ----------
module pin() {
    color("Gold")
        translate([0, -1, 0])      // -Y 側に 1mm 飛び出す
            rotate([-90, 0, 0])
                cylinder(h = pin_len, d = pin_dia);
}

// ---------- 組み立て (180° 開いた状態) ----------
left_leaf();
right_leaf();
pin();

variant: thinking

off success
off
21.3s · 743/1799t · $0.0487
SCAD (120 lines)
// 小型バット蝶番(butt hinge) 180°開いた状態
// ピン軸中心線 = Y軸、左板 x<0、右板 x>0

$fn = 64;

// パラメータ
leaf_w     = 25;    // 横(開く方向)
leaf_h     = 30;    // 縦(軸方向)
leaf_t     = 2;     // 板厚
pin_d      = 4;     // ピン直径
pin_len    = 32;    // ピン長さ
knuckle_od = 8;     // knuckle外径
knuckle_id = pin_d + 0.3; // 内径(クリアランス)
seg        = leaf_h / 5;  // 6mm

// 皿穴パラメータ
csk_outer  = 6;     // 皿穴上面直径
csk_depth  = 1;     // テーパ深さ
hole_d     = 3.2;   // 貫通穴
hole_pitch = 8;     // 縦方向ピッチ

knuckle_r  = knuckle_od / 2;

// ---- knuckle(筒部) ----
// y0: 開始Y位置, len: 長さ
module knuckle(y0, len) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(h = len, d = knuckle_od);
                translate([0, 0, -1])
                    cylinder(h = len + 2, d = knuckle_id);
            }
}

// ---- 皿穴(板の中央付近、貫通)----
// 板の上面を Z = knuckle_r、下面を Z = knuckle_r - leaf_t と想定して使用
module countersink_at(x, y, top_z, t) {
    translate([x, y, 0]) {
        // 貫通穴
        translate([0, 0, top_z - t - 1])
            cylinder(h = t + 2, d = hole_d);
        // 皿テーパ(上面から)
        translate([0, 0, top_z - csk_depth])
            cylinder(h = csk_depth + 0.01, d1 = hole_d, d2 = csk_outer);
    }
}

// ---- 板本体(平板部) ----
// dir = -1 (左, x<0), +1 (右, x>0)
// 板の平面は knuckle中心からオフセットして同一平面(180°開)になるよう配置
// 板上面 Z = knuckle_r, 下面 Z = knuckle_r - leaf_t
module leaf_plate(dir) {
    // x: knuckle中心(X=0)から leaf_w 伸びる
    // knuckleと重なる部分は接続用に knuckle_r まで含める
    x_inner = 0;
    x_outer = dir * (knuckle_r + leaf_w);
    x_lo = min(x_inner, x_outer);
    x_hi = max(x_inner, x_outer);
    translate([x_lo, 0, knuckle_r - leaf_t])
        cube([x_hi - x_lo, leaf_h, leaf_t]);
}

// ---- 左板(knuckle 3個: 外側2 + 中央1)----
module left_leaf() {
    color("silver")
    difference() {
        union() {
            // 平板
            leaf_plate(-1);
            // knuckle 外側2 + 中央1 -> セグメント 0,2,4
            knuckle(0 * seg, seg);
            knuckle(2 * seg, seg);
            knuckle(4 * seg, seg);
            // 板とknuckleをつなぐウェブ(knuckle中心から板へ)
        }
        // ピン穴(共有)
        translate([0, -1, 0])
            rotate([-90, 0, 0])
                cylinder(h = leaf_h + 2, d = knuckle_id);
        // 皿穴 3個(板の外側)
        cx = -(knuckle_r + leaf_w - 6);
        top_z = knuckle_r;
        for (i = [0:2])
            countersink_at(cx, leaf_h/2 + (i-1)*hole_pitch, top_z, leaf_t);
    }
}

// ---- 右板(knuckle 2個: 中間2)----
module right_leaf() {
    color("gray")
    difference() {
        union() {
            leaf_plate(1);
            // knuckle 中間2 -> セグメント 1,3
            knuckle(1 * seg, seg);
            knuckle(3 * seg, seg);
        }
        translate([0, -1, 0])
            rotate([-90, 0, 0])
                cylinder(h = leaf_h + 2, d = knuckle_id);
        cx = (knuckle_r + leaf_w - 6);
        top_z = knuckle_r;
        for (i = [0:2])
            countersink_at(cx, leaf_h/2 + (i-1)*hole_pitch, top_z, leaf_t);
    }
}

// ---- ピン軸 ----
module pin() {
    color("gold")
    translate([0, -1, 0])     // 両端1mmずつ飛び出す
        rotate([-90, 0, 0])
            cylinder(h = pin_len, d = pin_d);
}

// ---- 組み立て(180°開いた状態)----
left_leaf();
right_leaf();
pin();
adaptive (default) success
adaptive
22.2s · 743/1797t · $0.0486
SCAD (115 lines)
// =====================================================
// 家具用 小型バット蝶番 (Butt Hinge)
// 開いた状態 (180°) で出力
// =====================================================

// ---------- パラメータ ----------
leaf_width   = 25;    // 板の横(開く方向)
leaf_length  = 30;    // 板の縦(ピン軸方向)
leaf_thick   = 2;     // 板の厚さ

pin_dia      = 4;     // ピン軸 直径
pin_len      = 32;    // ピン軸 長さ(両端 1mm ずつ飛び出す)

knuckle_od   = 8;     // knuckle 外径
knuckle_clr  = 0.3;   // クリアランス
knuckle_id   = pin_dia + knuckle_clr;  // 4.6mm
knuckle_seg  = 6;     // 各 knuckle の長さ(30/5)

screw_csink_dia = 6;    // 皿穴 テーパ径
screw_csink_dep = 1;    // 皿穴 深さ
screw_thru_dia  = 3.2;  // 貫通穴径
screw_pitch     = 8;    // ねじ穴ピッチ

$fn = 64;

// knuckle のセグメント Y 位置(下端) : 0,6,12,18,24
// 互い違い配置
//   左板: セグメント 0, 2, 4 (外側2 + 中央1)
//   右板: セグメント 1, 3   (中間2)
left_segments  = [0, 2, 4];
right_segments = [1, 3];

// ---------- knuckle (筒部) ----------
module knuckle(seg_index) {
    y0 = seg_index * knuckle_seg;
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(h = knuckle_seg, d = knuckle_od);
                translate([0, 0, -1])
                    cylinder(h = knuckle_seg + 2, d = knuckle_id);
            }
}

// ---------- 皿穴 1個分 (Z方向に貫通、表面 z=+leaf_thick/2 側にテーパ) ----------
module screw_hole() {
    // 貫通穴
    translate([0, 0, -leaf_thick/2 - 1])
        cylinder(h = leaf_thick + 2, d = screw_thru_dia);
    // 皿(テーパ): 表面側
    translate([0, 0, leaf_thick/2 - screw_csink_dep])
        cylinder(h = screw_csink_dep + 0.01,
                 d1 = screw_thru_dia, d2 = screw_csink_dia);
    // 表面より上の余裕(テーパ口を確実に開ける)
    translate([0, 0, leaf_thick/2 - 0.001])
        cylinder(h = 0.5, d = screw_csink_dia);
}

// ---------- 板本体 (knuckle 側 x=0 から外側へ) ----------
// dir = -1 : 左板 (x<0)   dir = +1 : 右板 (x>0)
module leaf_plate(dir) {
    // knuckle 中心(X=0)から板が伸びる。
    // 板は knuckle 外周に接続するため、根元を knuckle_od/2 付近から始める。
    plate_start = knuckle_od/2 - 1;        // 少し knuckle に食い込ませて結合
    plate_x     = leaf_width;              // 板の伸び量

    difference() {
        // 板 (厚さは z 方向、上面 z=+leaf_thick/2)
        if (dir < 0) {
            translate([-plate_start - plate_x, 0, -leaf_thick/2])
                cube([plate_x, leaf_length, leaf_thick]);
        } else {
            translate([plate_start, 0, -leaf_thick/2])
                cube([plate_x, leaf_length, leaf_thick]);
        }

        // ねじ皿穴 3 個 (knuckle から離れた側)
        // X 位置: 板の外端寄り
        screw_x = dir * (plate_start + plate_x - 5);
        // Y 中心を中央、8mm ピッチで 3 個
        for (i = [-1, 0, 1]) {
            translate([screw_x, leaf_length/2 + i * screw_pitch, 0])
                screw_hole();
        }
    }
}

// ---------- 左板 アセンブリ ----------
module left_leaf() {
    color("Silver") {
        leaf_plate(-1);
        for (s = left_segments) knuckle(s);
    }
}

// ---------- 右板 アセンブリ ----------
module right_leaf() {
    color("LightSteelBlue") {
        leaf_plate(1);
        for (s = right_segments) knuckle(s);
    }
}

// ---------- ピン軸 ----------
module pin() {
    color("Gold")
        translate([0, -1, 0])      // -Y 側に 1mm 飛び出す
            rotate([-90, 0, 0])
                cylinder(h = pin_len, d = pin_dia);
}

// ---------- 組み立て (180° 開いた状態) ----------
left_leaf();
right_leaf();
pin();
dynamicnot run

iteration: iter-png

i1 success
iter 1
29.5s · 3495/2381t · $0.0770
diff vs bare: +31/-30
  // ============================================================
  // 家具用 小型バット蝶番 (butt hinge)
  // 開いた状態 (180°) で配置
  // ============================================================
  
  $fn = 64;
  
  // ---------- パラメータ ----------
  leaf_w      = 25;    // 板の横幅 (開く方向)
  leaf_h      = 30;    // 板の縦 (ヒンジ軸方向)
  leaf_t      = 2;     // 板厚
  
  pin_d       = 4;     // ピン軸 直径
  pin_len     = 32;    // ピン軸 長さ
  
  knuckle_od  = 8;     // knuckle 外径
  knuckle_id  = 4.6;   // knuckle 内径 (ピン + 0.3 クリアランス)
  seg         = 6;     // knuckle 1個の高さ (30/5)
  
  // 皿穴 (M3)
  screw_pitch = 8;     // 縦方向ピッチ
  cs_d        = 6;     // 皿(テーパ) 直径
  cs_depth    = 1;     // 皿深さ
  hole_d      = 3.2;   // 貫通穴 直径
  
- // knuckle 中心軸位置 (Y軸に重ねる -> X=0,Z=0)
- // 板は knuckle 外径の接線あたりから伸びる
- plate_x0    = knuckle_od/2 - leaf_t; // 板内側位置の基準
+ // 板の内側端 (knuckle に接続する位置の絶対値)
+ inner = knuckle_od/2 - leaf_t; // = 2
  
  // ============================================================
  // knuckle (筒) : Y方向に立てた円筒 (中心 X=0,Z=0)
  // ============================================================
  module knuckle(y0, h) {
      translate([0, y0, 0])
          rotate([-90, 0, 0])
              difference() {
                  cylinder(h = h, d = knuckle_od);
                  translate([0, 0, -1])
                      cylinder(h = h + 2, d = knuckle_id);
              }
  }
  
  // ============================================================
  // 皿穴 (板を貫通) : Z方向
- // 板の上面 z = leaf_t, 下面 z = 0
+ // 板の上面 z = leaf_t/2, 下面 z = -leaf_t/2 (板は z=0 中心)
  // ============================================================
  module countersink(x, y) {
      translate([x, y, 0]) {
          // 貫通穴
-         translate([0, 0, -1])
+         translate([0, 0, -leaf_t/2 - 1])
              cylinder(h = leaf_t + 2, d = hole_d);
          // 皿(テーパ) : 上面側
-         translate([0, 0, leaf_t - cs_depth])
+         translate([0, 0, leaf_t/2 - cs_depth])
              cylinder(h = cs_depth + 0.01,
                       d1 = hole_d, d2 = cs_d);
      }
  }
  
  // ============================================================
- // 平板部 (knuckle なし)
+ // 平板部 (板は z=0 を中心に厚さ leaf_t)
  //   dir = -1 : 左板 (x<0)
  //   dir = +1 : 右板 (x>0)
  // ============================================================
  module leaf_plate(dir) {
-     // 板は knuckle 軸の接線付近から外側へ
-     // 内側端 : 板が knuckle に接続する位置
-     inner = knuckle_od/2 - leaf_t; // 板の内側 x 絶対値
-     // 平板本体
      if (dir < 0) {
          // 左板 : x = -inner - leaf_w  ~  -inner
          difference() {
-             translate([-inner - leaf_w, -leaf_h/2, 0])
+             translate([-inner - leaf_w, -leaf_h/2, -leaf_t/2])
                  cube([leaf_w, leaf_h, leaf_t]);
-             // 皿穴 (knuckle から離れた側)
              sx = -inner - leaf_w + 5;
              for (i = [-1, 0, 1])
                  countersink(sx, i * screw_pitch);
          }
      } else {
          // 右板 : x = inner  ~  inner + leaf_w
          difference() {
-             translate([inner, -leaf_h/2, 0])
+             translate([inner, -leaf_h/2, -leaf_t/2])
                  cube([leaf_w, leaf_h, leaf_t]);
              sx = inner + leaf_w - 5;
              for (i = [-1, 0, 1])
                  countersink(sx, i * screw_pitch);
          }
      }
  }
  
  // ============================================================
+ // knuckle と板をつなぐウェブ
+ //   dir = -1 : 左側 (x : -inner ~ 0)
+ //   dir = +1 : 右側 (x : 0 ~ inner)
+ // knuckle 中心(X=0)から板内側端まで隙間なく接続
+ // ============================================================
+ module web(dir, y0, h) {
+     if (dir < 0)
+         translate([-inner, y0, -leaf_t/2])
+             cube([inner, h, leaf_t]);
+     else
+         translate([0, y0, -leaf_t/2])
+             cube([inner, h, leaf_t]);
+ }
+ 
+ // ============================================================
  // 左板 : knuckle を外側2個 + 中央1個 (segment 0,2,4)
  // ============================================================
  module left_leaf() {
      color("Silver") {
-         // 板を knuckle 中心高さ(z=0)に合わせる
-         translate([0, 0, -leaf_t/2])
-             leaf_plate(-1);
-         // knuckle (segment 0,2,4)
-         for (i = [0, 2, 4])
+         leaf_plate(-1);
+         for (i = [0, 2, 4]) {
              knuckle(-leaf_h/2 + i*seg, seg);
-         // knuckle と板をつなぐウェブ (左側)
-         for (i = [0, 2, 4])
-             translate([-(knuckle_od/2 - leaf_t),
-                        -leaf_h/2 + i*seg, -leaf_t/2])
-                 cube([knuckle_od/2, seg, leaf_t]);
+             web(-1, -leaf_h/2 + i*seg, seg);
+         }
      }
  }
  
  // ============================================================
  // 右板 : knuckle を中間2個 (segment 1,3)
  // ============================================================
  module right_leaf() {
      color("LightSteelBlue") {
-         translate([0, 0, -leaf_t/2])
-             leaf_plate(1);
-         for (i = [1, 3])
+         leaf_plate(1);
+         for (i = [1, 3]) {
              knuckle(-leaf_h/2 + i*seg, seg);
-         for (i = [1, 3])
-             translate([0, -leaf_h/2 + i*seg, -leaf_t/2])
-                 cube([knuckle_od/2, seg, leaf_t]);
+             web(1, -leaf_h/2 + i*seg, seg);
+         }
      }
  }
  
  // ============================================================
  // ピン軸 : Y軸に沿う円柱 (両端 1mm 飛び出す)
  // ============================================================
  module pin() {
      color("Gold")
          translate([0, -pin_len/2, 0])
              rotate([-90, 0, 0])
                  cylinder(h = pin_len, d = pin_d);
  }
  
  // ============================================================
  // 組み立て (180° 開いた状態)
  // ============================================================
  left_leaf();
  right_leaf();
  pin();
SCAD (141 lines)
// ============================================================
// 家具用 小型バット蝶番 (butt hinge)
// 開いた状態 (180°) で配置
// ============================================================

$fn = 64;

// ---------- パラメータ ----------
leaf_w      = 25;    // 板の横幅 (開く方向)
leaf_h      = 30;    // 板の縦 (ヒンジ軸方向)
leaf_t      = 2;     // 板厚

pin_d       = 4;     // ピン軸 直径
pin_len     = 32;    // ピン軸 長さ

knuckle_od  = 8;     // knuckle 外径
knuckle_id  = 4.6;   // knuckle 内径 (ピン + 0.3 クリアランス)
seg         = 6;     // knuckle 1個の高さ (30/5)

// 皿穴 (M3)
screw_pitch = 8;     // 縦方向ピッチ
cs_d        = 6;     // 皿(テーパ) 直径
cs_depth    = 1;     // 皿深さ
hole_d      = 3.2;   // 貫通穴 直径

// 板の内側端 (knuckle に接続する位置の絶対値)
inner = knuckle_od/2 - leaf_t; // = 2

// ============================================================
// knuckle (筒) : Y方向に立てた円筒 (中心 X=0,Z=0)
// ============================================================
module knuckle(y0, h) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(h = h, d = knuckle_od);
                translate([0, 0, -1])
                    cylinder(h = h + 2, d = knuckle_id);
            }
}

// ============================================================
// 皿穴 (板を貫通) : Z方向
// 板の上面 z = leaf_t/2, 下面 z = -leaf_t/2 (板は z=0 中心)
// ============================================================
module countersink(x, y) {
    translate([x, y, 0]) {
        // 貫通穴
        translate([0, 0, -leaf_t/2 - 1])
            cylinder(h = leaf_t + 2, d = hole_d);
        // 皿(テーパ) : 上面側
        translate([0, 0, leaf_t/2 - cs_depth])
            cylinder(h = cs_depth + 0.01,
                     d1 = hole_d, d2 = cs_d);
    }
}

// ============================================================
// 平板部 (板は z=0 を中心に厚さ leaf_t)
//   dir = -1 : 左板 (x<0)
//   dir = +1 : 右板 (x>0)
// ============================================================
module leaf_plate(dir) {
    if (dir < 0) {
        // 左板 : x = -inner - leaf_w  ~  -inner
        difference() {
            translate([-inner - leaf_w, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            sx = -inner - leaf_w + 5;
            for (i = [-1, 0, 1])
                countersink(sx, i * screw_pitch);
        }
    } else {
        // 右板 : x = inner  ~  inner + leaf_w
        difference() {
            translate([inner, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            sx = inner + leaf_w - 5;
            for (i = [-1, 0, 1])
                countersink(sx, i * screw_pitch);
        }
    }
}

// ============================================================
// knuckle と板をつなぐウェブ
//   dir = -1 : 左側 (x : -inner ~ 0)
//   dir = +1 : 右側 (x : 0 ~ inner)
// knuckle 中心(X=0)から板内側端まで隙間なく接続
// ============================================================
module web(dir, y0, h) {
    if (dir < 0)
        translate([-inner, y0, -leaf_t/2])
            cube([inner, h, leaf_t]);
    else
        translate([0, y0, -leaf_t/2])
            cube([inner, h, leaf_t]);
}

// ============================================================
// 左板 : knuckle を外側2個 + 中央1個 (segment 0,2,4)
// ============================================================
module left_leaf() {
    color("Silver") {
        leaf_plate(-1);
        for (i = [0, 2, 4]) {
            knuckle(-leaf_h/2 + i*seg, seg);
            web(-1, -leaf_h/2 + i*seg, seg);
        }
    }
}

// ============================================================
// 右板 : knuckle を中間2個 (segment 1,3)
// ============================================================
module right_leaf() {
    color("LightSteelBlue") {
        leaf_plate(1);
        for (i = [1, 3]) {
            knuckle(-leaf_h/2 + i*seg, seg);
            web(1, -leaf_h/2 + i*seg, seg);
        }
    }
}

// ============================================================
// ピン軸 : Y軸に沿う円柱 (両端 1mm 飛び出す)
// ============================================================
module pin() {
    color("Gold")
        translate([0, -pin_len/2, 0])
            rotate([-90, 0, 0])
                cylinder(h = pin_len, d = pin_d);
}

// ============================================================
// 組み立て (180° 開いた状態)
// ============================================================
left_leaf();
right_leaf();
pin();
i2 success
iter 2
32.3s · 3416/2541t · $0.0806
diff vs i1: +3/-2
  // ============================================================
  // 家具用 小型バット蝶番 (butt hinge)
  // 開いた状態 (180°) で配置
  // ============================================================
  
  $fn = 64;
  
  // ---------- パラメータ ----------
  leaf_w      = 25;    // 板の横幅 (開く方向)
  leaf_h      = 30;    // 板の縦 (ヒンジ軸方向)
  leaf_t      = 2;     // 板厚
  
  pin_d       = 4;     // ピン軸 直径
  pin_len     = 32;    // ピン軸 長さ
  
  knuckle_od  = 8;     // knuckle 外径
  knuckle_id  = 4.6;   // knuckle 内径 (ピン + 0.3 クリアランス)
  seg         = 6;     // knuckle 1個の高さ (30/5)
  
  // 皿穴 (M3)
  screw_pitch = 8;     // 縦方向ピッチ
  cs_d        = 6;     // 皿(テーパ) 直径
  cs_depth    = 1;     // 皿深さ
  hole_d      = 3.2;   // 貫通穴 直径
  
  // 板の内側端 (knuckle に接続する位置の絶対値)
  inner = knuckle_od/2 - leaf_t; // = 2
  
  // ============================================================
  // knuckle (筒) : Y方向に立てた円筒 (中心 X=0,Z=0)
  // ============================================================
  module knuckle(y0, h) {
      translate([0, y0, 0])
          rotate([-90, 0, 0])
              difference() {
                  cylinder(h = h, d = knuckle_od);
                  translate([0, 0, -1])
                      cylinder(h = h + 2, d = knuckle_id);
              }
  }
  
  // ============================================================
  // 皿穴 (板を貫通) : Z方向
- // 板の上面 z = leaf_t/2, 下面 z = -leaf_t/2 (板は z=0 中心)
+ // 板の上面 z = +leaf_t/2, 下面 z = -leaf_t/2 (板は z=0 中心)
+ // 皿(テーパ)は上面側に開く (ネジ頭が沈む表面)
  // ============================================================
  module countersink(x, y) {
      translate([x, y, 0]) {
          // 貫通穴
          translate([0, 0, -leaf_t/2 - 1])
              cylinder(h = leaf_t + 2, d = hole_d);
-         // 皿(テーパ) : 上面側
+         // 皿(テーパ) : 上面側 (z=+leaf_t/2 で cs_d、内側で hole_d)
          translate([0, 0, leaf_t/2 - cs_depth])
              cylinder(h = cs_depth + 0.01,
                       d1 = hole_d, d2 = cs_d);
      }
  }
  
  // ============================================================
  // 平板部 (板は z=0 を中心に厚さ leaf_t)
  //   dir = -1 : 左板 (x<0)
  //   dir = +1 : 右板 (x>0)
  // ============================================================
  module leaf_plate(dir) {
      if (dir < 0) {
          // 左板 : x = -inner - leaf_w  ~  -inner
          difference() {
              translate([-inner - leaf_w, -leaf_h/2, -leaf_t/2])
                  cube([leaf_w, leaf_h, leaf_t]);
              sx = -inner - leaf_w + 5;
              for (i = [-1, 0, 1])
                  countersink(sx, i * screw_pitch);
          }
      } else {
          // 右板 : x = inner  ~  inner + leaf_w
          difference() {
              translate([inner, -leaf_h/2, -leaf_t/2])
                  cube([leaf_w, leaf_h, leaf_t]);
              sx = inner + leaf_w - 5;
              for (i = [-1, 0, 1])
                  countersink(sx, i * screw_pitch);
          }
      }
  }
  
  // ============================================================
  // knuckle と板をつなぐウェブ
  //   dir = -1 : 左側 (x : -inner ~ 0)
  //   dir = +1 : 右側 (x : 0 ~ inner)
  // knuckle 中心(X=0)から板内側端まで隙間なく接続
  // ============================================================
  module web(dir, y0, h) {
      if (dir < 0)
          translate([-inner, y0, -leaf_t/2])
              cube([inner, h, leaf_t]);
      else
          translate([0, y0, -leaf_t/2])
              cube([inner, h, leaf_t]);
  }
  
  // ============================================================
  // 左板 : knuckle を外側2個 + 中央1個 (segment 0,2,4)
  // ============================================================
  module left_leaf() {
      color("Silver") {
          leaf_plate(-1);
          for (i = [0, 2, 4]) {
              knuckle(-leaf_h/2 + i*seg, seg);
              web(-1, -leaf_h/2 + i*seg, seg);
          }
      }
  }
  
  // ============================================================
  // 右板 : knuckle を中間2個 (segment 1,3)
  // ============================================================
  module right_leaf() {
      color("LightSteelBlue") {
          leaf_plate(1);
          for (i = [1, 3]) {
              knuckle(-leaf_h/2 + i*seg, seg);
              web(1, -leaf_h/2 + i*seg, seg);
          }
      }
  }
  
  // ============================================================
  // ピン軸 : Y軸に沿う円柱 (両端 1mm 飛び出す)
  // ============================================================
  module pin() {
      color("Gold")
          translate([0, -pin_len/2, 0])
              rotate([-90, 0, 0])
                  cylinder(h = pin_len, d = pin_d);
  }
  
  // ============================================================
  // 組み立て (180° 開いた状態)
  // ============================================================
  left_leaf();
  right_leaf();
  pin();
SCAD (142 lines)
// ============================================================
// 家具用 小型バット蝶番 (butt hinge)
// 開いた状態 (180°) で配置
// ============================================================

$fn = 64;

// ---------- パラメータ ----------
leaf_w      = 25;    // 板の横幅 (開く方向)
leaf_h      = 30;    // 板の縦 (ヒンジ軸方向)
leaf_t      = 2;     // 板厚

pin_d       = 4;     // ピン軸 直径
pin_len     = 32;    // ピン軸 長さ

knuckle_od  = 8;     // knuckle 外径
knuckle_id  = 4.6;   // knuckle 内径 (ピン + 0.3 クリアランス)
seg         = 6;     // knuckle 1個の高さ (30/5)

// 皿穴 (M3)
screw_pitch = 8;     // 縦方向ピッチ
cs_d        = 6;     // 皿(テーパ) 直径
cs_depth    = 1;     // 皿深さ
hole_d      = 3.2;   // 貫通穴 直径

// 板の内側端 (knuckle に接続する位置の絶対値)
inner = knuckle_od/2 - leaf_t; // = 2

// ============================================================
// knuckle (筒) : Y方向に立てた円筒 (中心 X=0,Z=0)
// ============================================================
module knuckle(y0, h) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(h = h, d = knuckle_od);
                translate([0, 0, -1])
                    cylinder(h = h + 2, d = knuckle_id);
            }
}

// ============================================================
// 皿穴 (板を貫通) : Z方向
// 板の上面 z = +leaf_t/2, 下面 z = -leaf_t/2 (板は z=0 中心)
// 皿(テーパ)は上面側に開く (ネジ頭が沈む表面)
// ============================================================
module countersink(x, y) {
    translate([x, y, 0]) {
        // 貫通穴
        translate([0, 0, -leaf_t/2 - 1])
            cylinder(h = leaf_t + 2, d = hole_d);
        // 皿(テーパ) : 上面側 (z=+leaf_t/2 で cs_d、内側で hole_d)
        translate([0, 0, leaf_t/2 - cs_depth])
            cylinder(h = cs_depth + 0.01,
                     d1 = hole_d, d2 = cs_d);
    }
}

// ============================================================
// 平板部 (板は z=0 を中心に厚さ leaf_t)
//   dir = -1 : 左板 (x<0)
//   dir = +1 : 右板 (x>0)
// ============================================================
module leaf_plate(dir) {
    if (dir < 0) {
        // 左板 : x = -inner - leaf_w  ~  -inner
        difference() {
            translate([-inner - leaf_w, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            sx = -inner - leaf_w + 5;
            for (i = [-1, 0, 1])
                countersink(sx, i * screw_pitch);
        }
    } else {
        // 右板 : x = inner  ~  inner + leaf_w
        difference() {
            translate([inner, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            sx = inner + leaf_w - 5;
            for (i = [-1, 0, 1])
                countersink(sx, i * screw_pitch);
        }
    }
}

// ============================================================
// knuckle と板をつなぐウェブ
//   dir = -1 : 左側 (x : -inner ~ 0)
//   dir = +1 : 右側 (x : 0 ~ inner)
// knuckle 中心(X=0)から板内側端まで隙間なく接続
// ============================================================
module web(dir, y0, h) {
    if (dir < 0)
        translate([-inner, y0, -leaf_t/2])
            cube([inner, h, leaf_t]);
    else
        translate([0, y0, -leaf_t/2])
            cube([inner, h, leaf_t]);
}

// ============================================================
// 左板 : knuckle を外側2個 + 中央1個 (segment 0,2,4)
// ============================================================
module left_leaf() {
    color("Silver") {
        leaf_plate(-1);
        for (i = [0, 2, 4]) {
            knuckle(-leaf_h/2 + i*seg, seg);
            web(-1, -leaf_h/2 + i*seg, seg);
        }
    }
}

// ============================================================
// 右板 : knuckle を中間2個 (segment 1,3)
// ============================================================
module right_leaf() {
    color("LightSteelBlue") {
        leaf_plate(1);
        for (i = [1, 3]) {
            knuckle(-leaf_h/2 + i*seg, seg);
            web(1, -leaf_h/2 + i*seg, seg);
        }
    }
}

// ============================================================
// ピン軸 : Y軸に沿う円柱 (両端 1mm 飛び出す)
// ============================================================
module pin() {
    color("Gold")
        translate([0, -pin_len/2, 0])
            rotate([-90, 0, 0])
                cylinder(h = pin_len, d = pin_d);
}

// ============================================================
// 組み立て (180° 開いた状態)
// ============================================================
left_leaf();
right_leaf();
pin();
i3 success
iter 3
29.0s · 3476/2531t · $0.0807
diff vs i2: +0/-0
  // ============================================================
  // 家具用 小型バット蝶番 (butt hinge)
  // 開いた状態 (180°) で配置
  // ============================================================
  
  $fn = 64;
  
  // ---------- パラメータ ----------
  leaf_w      = 25;    // 板の横幅 (開く方向)
  leaf_h      = 30;    // 板の縦 (ヒンジ軸方向)
  leaf_t      = 2;     // 板厚
  
  pin_d       = 4;     // ピン軸 直径
  pin_len     = 32;    // ピン軸 長さ
  
  knuckle_od  = 8;     // knuckle 外径
  knuckle_id  = 4.6;   // knuckle 内径 (ピン + 0.3 クリアランス)
  seg         = 6;     // knuckle 1個の高さ (30/5)
  
  // 皿穴 (M3)
  screw_pitch = 8;     // 縦方向ピッチ
  cs_d        = 6;     // 皿(テーパ) 直径
  cs_depth    = 1;     // 皿深さ
  hole_d      = 3.2;   // 貫通穴 直径
  
  // 板の内側端 (knuckle に接続する位置の絶対値)
  inner = knuckle_od/2 - leaf_t; // = 2
  
  // ============================================================
  // knuckle (筒) : Y方向に立てた円筒 (中心 X=0,Z=0)
  // ============================================================
  module knuckle(y0, h) {
      translate([0, y0, 0])
          rotate([-90, 0, 0])
              difference() {
                  cylinder(h = h, d = knuckle_od);
                  translate([0, 0, -1])
                      cylinder(h = h + 2, d = knuckle_id);
              }
  }
  
  // ============================================================
  // 皿穴 (板を貫通) : Z方向
  // 板の上面 z = +leaf_t/2, 下面 z = -leaf_t/2 (板は z=0 中心)
  // 皿(テーパ)は上面側に開く (ネジ頭が沈む表面)
  // ============================================================
  module countersink(x, y) {
      translate([x, y, 0]) {
          // 貫通穴
          translate([0, 0, -leaf_t/2 - 1])
              cylinder(h = leaf_t + 2, d = hole_d);
          // 皿(テーパ) : 上面側 (z=+leaf_t/2 で cs_d、内側で hole_d)
          translate([0, 0, leaf_t/2 - cs_depth])
              cylinder(h = cs_depth + 0.01,
                       d1 = hole_d, d2 = cs_d);
      }
  }
  
  // ============================================================
  // 平板部 (板は z=0 を中心に厚さ leaf_t)
  //   dir = -1 : 左板 (x<0)
  //   dir = +1 : 右板 (x>0)
  // ============================================================
  module leaf_plate(dir) {
      if (dir < 0) {
          // 左板 : x = -inner - leaf_w  ~  -inner
          difference() {
              translate([-inner - leaf_w, -leaf_h/2, -leaf_t/2])
                  cube([leaf_w, leaf_h, leaf_t]);
              sx = -inner - leaf_w + 5;
              for (i = [-1, 0, 1])
                  countersink(sx, i * screw_pitch);
          }
      } else {
          // 右板 : x = inner  ~  inner + leaf_w
          difference() {
              translate([inner, -leaf_h/2, -leaf_t/2])
                  cube([leaf_w, leaf_h, leaf_t]);
              sx = inner + leaf_w - 5;
              for (i = [-1, 0, 1])
                  countersink(sx, i * screw_pitch);
          }
      }
  }
  
  // ============================================================
  // knuckle と板をつなぐウェブ
  //   dir = -1 : 左側 (x : -inner ~ 0)
  //   dir = +1 : 右側 (x : 0 ~ inner)
  // knuckle 中心(X=0)から板内側端まで隙間なく接続
  // ============================================================
  module web(dir, y0, h) {
      if (dir < 0)
          translate([-inner, y0, -leaf_t/2])
              cube([inner, h, leaf_t]);
      else
          translate([0, y0, -leaf_t/2])
              cube([inner, h, leaf_t]);
  }
  
  // ============================================================
  // 左板 : knuckle を外側2個 + 中央1個 (segment 0,2,4)
  // ============================================================
  module left_leaf() {
      color("Silver") {
          leaf_plate(-1);
          for (i = [0, 2, 4]) {
              knuckle(-leaf_h/2 + i*seg, seg);
              web(-1, -leaf_h/2 + i*seg, seg);
          }
      }
  }
  
  // ============================================================
  // 右板 : knuckle を中間2個 (segment 1,3)
  // ============================================================
  module right_leaf() {
      color("LightSteelBlue") {
          leaf_plate(1);
          for (i = [1, 3]) {
              knuckle(-leaf_h/2 + i*seg, seg);
              web(1, -leaf_h/2 + i*seg, seg);
          }
      }
  }
  
  // ============================================================
  // ピン軸 : Y軸に沿う円柱 (両端 1mm 飛び出す)
  // ============================================================
  module pin() {
      color("Gold")
          translate([0, -pin_len/2, 0])
              rotate([-90, 0, 0])
                  cylinder(h = pin_len, d = pin_d);
  }
  
  // ============================================================
  // 組み立て (180° 開いた状態)
  // ============================================================
  left_leaf();
  right_leaf();
  pin();
SCAD (142 lines)
// ============================================================
// 家具用 小型バット蝶番 (butt hinge)
// 開いた状態 (180°) で配置
// ============================================================

$fn = 64;

// ---------- パラメータ ----------
leaf_w      = 25;    // 板の横幅 (開く方向)
leaf_h      = 30;    // 板の縦 (ヒンジ軸方向)
leaf_t      = 2;     // 板厚

pin_d       = 4;     // ピン軸 直径
pin_len     = 32;    // ピン軸 長さ

knuckle_od  = 8;     // knuckle 外径
knuckle_id  = 4.6;   // knuckle 内径 (ピン + 0.3 クリアランス)
seg         = 6;     // knuckle 1個の高さ (30/5)

// 皿穴 (M3)
screw_pitch = 8;     // 縦方向ピッチ
cs_d        = 6;     // 皿(テーパ) 直径
cs_depth    = 1;     // 皿深さ
hole_d      = 3.2;   // 貫通穴 直径

// 板の内側端 (knuckle に接続する位置の絶対値)
inner = knuckle_od/2 - leaf_t; // = 2

// ============================================================
// knuckle (筒) : Y方向に立てた円筒 (中心 X=0,Z=0)
// ============================================================
module knuckle(y0, h) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(h = h, d = knuckle_od);
                translate([0, 0, -1])
                    cylinder(h = h + 2, d = knuckle_id);
            }
}

// ============================================================
// 皿穴 (板を貫通) : Z方向
// 板の上面 z = +leaf_t/2, 下面 z = -leaf_t/2 (板は z=0 中心)
// 皿(テーパ)は上面側に開く (ネジ頭が沈む表面)
// ============================================================
module countersink(x, y) {
    translate([x, y, 0]) {
        // 貫通穴
        translate([0, 0, -leaf_t/2 - 1])
            cylinder(h = leaf_t + 2, d = hole_d);
        // 皿(テーパ) : 上面側 (z=+leaf_t/2 で cs_d、内側で hole_d)
        translate([0, 0, leaf_t/2 - cs_depth])
            cylinder(h = cs_depth + 0.01,
                     d1 = hole_d, d2 = cs_d);
    }
}

// ============================================================
// 平板部 (板は z=0 を中心に厚さ leaf_t)
//   dir = -1 : 左板 (x<0)
//   dir = +1 : 右板 (x>0)
// ============================================================
module leaf_plate(dir) {
    if (dir < 0) {
        // 左板 : x = -inner - leaf_w  ~  -inner
        difference() {
            translate([-inner - leaf_w, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            sx = -inner - leaf_w + 5;
            for (i = [-1, 0, 1])
                countersink(sx, i * screw_pitch);
        }
    } else {
        // 右板 : x = inner  ~  inner + leaf_w
        difference() {
            translate([inner, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            sx = inner + leaf_w - 5;
            for (i = [-1, 0, 1])
                countersink(sx, i * screw_pitch);
        }
    }
}

// ============================================================
// knuckle と板をつなぐウェブ
//   dir = -1 : 左側 (x : -inner ~ 0)
//   dir = +1 : 右側 (x : 0 ~ inner)
// knuckle 中心(X=0)から板内側端まで隙間なく接続
// ============================================================
module web(dir, y0, h) {
    if (dir < 0)
        translate([-inner, y0, -leaf_t/2])
            cube([inner, h, leaf_t]);
    else
        translate([0, y0, -leaf_t/2])
            cube([inner, h, leaf_t]);
}

// ============================================================
// 左板 : knuckle を外側2個 + 中央1個 (segment 0,2,4)
// ============================================================
module left_leaf() {
    color("Silver") {
        leaf_plate(-1);
        for (i = [0, 2, 4]) {
            knuckle(-leaf_h/2 + i*seg, seg);
            web(-1, -leaf_h/2 + i*seg, seg);
        }
    }
}

// ============================================================
// 右板 : knuckle を中間2個 (segment 1,3)
// ============================================================
module right_leaf() {
    color("LightSteelBlue") {
        leaf_plate(1);
        for (i = [1, 3]) {
            knuckle(-leaf_h/2 + i*seg, seg);
            web(1, -leaf_h/2 + i*seg, seg);
        }
    }
}

// ============================================================
// ピン軸 : Y軸に沿う円柱 (両端 1mm 飛び出す)
// ============================================================
module pin() {
    color("Gold")
        translate([0, -pin_len/2, 0])
            rotate([-90, 0, 0])
                cylinder(h = pin_len, d = pin_d);
}

// ============================================================
// 組み立て (180° 開いた状態)
// ============================================================
left_leaf();
right_leaf();
pin();