vibe-openscad

tier-3-butt-hinge / claude-fable-5-1

6 run / 累計 1054.7s / 累計 $4.36

claude fable 5.1 bare

bare (provider default effort)

run detail →
render
bare render of tier-3-butt-hinge
loading STL…
success 69.7s · 745/5572t · $0.2860
SCAD (115 lines)
// ============================================================
//  家具用 小型バット蝶番(butt hinge)  開いた状態(180°)
//  構成: 左板(leaf_L) / 右板(leaf_R) / ピン軸(pin)
//  座標系: ピン軸中心線 = Y軸(+Y方向)、板の面は Z に直交
//          左板: x<0 側、右板: x>0 側
// ============================================================

$fn = 64;

// ---------- 寸法パラメータ ----------
leaf_w      = 25;          // 板の横幅(開く方向 = X、軸中心から先端まで)
leaf_h      = 30;          // 板の縦(ヒンジ軸方向 = Y)
leaf_t      = 2;           // 板厚

pin_d       = 4;           // ピン軸直径
pin_over    = 1;           // knuckle からの飛び出し(片側)
pin_len     = leaf_h + 2 * pin_over;   // = 32

knuckle_od  = 8;           // knuckle 外径
clearance   = 0.3;         // ピンとの径クリアランス
knuckle_id  = pin_d + clearance;       // = 4.6
seg_n       = 5;           // knuckle 分割数
seg_len     = leaf_h / seg_n;          // = 6
knuckle_gap = 0.2;         // 隣接 knuckle 同士の Y 方向すきま

left_segs   = [0, 2, 4];   // 左板の knuckle(外側2 + 中央1)
right_segs  = [1, 3];      // 右板の knuckle(中間2)

screw_d     = 3.2;         // M3 貫通穴
cs_d        = 6;           // 皿穴 表面径
cs_depth    = 1;           // 皿穴 深さ
screw_pitch = 8;           // 穴ピッチ(Y方向)
screw_x     = 16;          // 軸中心から穴中心までの距離(X方向)

open_angle  = 180;         // 開き角度(180 = 完全に開いた平面状態)

// ---------- ユーティリティ ----------
// i 番目セグメントの Y 範囲(内側の境目のみ gap を空ける)
function seg_y0(i) = i * seg_len       + (i > 0         ? knuckle_gap / 2 : 0);
function seg_y1(i) = (i + 1) * seg_len - (i < seg_n - 1 ? knuckle_gap / 2 : 0);

// Y 軸方向の円柱
module cyl_y(d, y0, y1) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            cylinder(d = d, h = y1 - y0);
}

// ---------- knuckle(筒部) ----------
module knuckle(i) {
    cyl_y(knuckle_od, seg_y0(i), seg_y1(i));
}

// ---------- 皿穴付きネジ穴(+Z 面が表面) ----------
module screw_hole(x, y) {
    translate([x, y, 0]) {
        // 貫通穴
        cylinder(d = screw_d, h = leaf_t + 2, center = true);
        // 皿(テーパ)
        translate([0, 0, leaf_t / 2 - cs_depth])
            cylinder(d1 = screw_d, d2 = cs_d, h = cs_depth + 0.01);
    }
}

// ---------- 板(leaf) ----------
// side = -1 : 左板(x<0)、side = +1 : 右板(x>0)
module leaf(side, segs) {
    plate_len = leaf_w - knuckle_od / 2;   // knuckle 外周から先端までの長さ
    difference() {
        union() {
            // 板本体(knuckle 外周から外側へ)
            translate([side > 0 ? knuckle_od / 2 : -leaf_w, 0, -leaf_t / 2])
                cube([plate_len, leaf_h, leaf_t]);

            for (i = segs) {
                // 筒部
                knuckle(i);
                // 筒部と板をつなぐ部分
                translate([side > 0 ? 0 : -knuckle_od / 2, seg_y0(i), -leaf_t / 2])
                    cube([knuckle_od / 2, seg_y1(i) - seg_y0(i), leaf_t]);
            }
        }
        // ピン穴(クリアランス込み)
        cyl_y(knuckle_id, -1, leaf_h + 1);

        // M3 皿穴 ×3(板の縦方向に 8mm ピッチ、中央寄せ)
        for (k = [-1, 0, 1])
            screw_hole(side * screw_x, leaf_h / 2 + k * screw_pitch);
    }
}

// ---------- ピン軸 ----------
module pin() {
    cyl_y(pin_d, -pin_over, leaf_h + pin_over);   // 長さ 32mm、両端 1mm 飛び出し
}

// ============================================================
//  組み立て(開いた状態 180°)
// ============================================================
module hinge_assembly() {
    // 左板(x<0)
    color("SteelBlue")
        leaf(-1, left_segs);

    // 右板(x>0) — open_angle を変えると Y 軸まわりに回転
    color("LightSteelBlue")
        rotate([0, 180 - open_angle, 0])
            leaf(+1, right_segs);

    // ピン軸
    color("Silver")
        pin();
}

hinge_assembly();
パラメータ (15) —
スライダを動かすと 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
15.9s · 745/1231t · $0.0690
SCAD (85 lines)
// Small butt hinge for furniture — open 180°
// Pin axis = Y axis (+Y), leaves lie in Z-normal plane

$fn = 64;

// ---------- parameters ----------
leaf_len   = 30;   // along Y (hinge axis)
leaf_w     = 25;   // along X (opening direction)
leaf_t     = 2;    // thickness (Z)

pin_d      = 4;
pin_len    = 32;
clearance  = 0.3;
kn_od      = 8;
kn_id      = pin_d + clearance;   // 4.6
kn_seg     = leaf_len / 5;        // 6 mm

hole_pitch = 8;
hole_d     = 3.2;
csk_d      = 6;
csk_depth  = 1;
hole_x     = 18;   // distance from pin axis to screw line

// ---------- helpers ----------
module knuckle(y0, y1) {
    // cylinder along Y from y0 to y1, centered on X=0, Z=0
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            cylinder(d = kn_od, h = y1 - y0);
}

module pin_bore() {
    translate([0, -1, 0])
        rotate([-90, 0, 0])
            cylinder(d = kn_id, h = leaf_len + 2);
}

module screw_hole() {
    // through hole + countersink on top face (+Z)
    union() {
        translate([0, 0, -1])
            cylinder(d = hole_d, h = leaf_t + 2);
        translate([0, 0, leaf_t - csk_depth])
            cylinder(d1 = hole_d, d2 = csk_d, h = csk_depth + 0.01);
        translate([0, 0, leaf_t - 0.001])
            cylinder(d = csk_d, h = 1);
    }
}

// Generic leaf; sgn = -1 for left (x<0), +1 for right (x>0)
// segs = list of knuckle segment indices (0..4)
module leaf(sgn, segs) {
    difference() {
        union() {
            // plate: from knuckle to outer edge, top face at Z=leaf_t/2
            translate([sgn > 0 ? 0 : -leaf_w, 0, -leaf_t / 2])
                cube([leaf_w, leaf_len, leaf_t]);
            // knuckles
            for (i = segs)
                knuckle(i * kn_seg, (i + 1) * kn_seg);
        }
        // pin bore
        pin_bore();
        // gap cuts between knuckles (so adjacent segments don't touch)
        for (i = [0 : 4])
            if (len(search(i, segs)) == 0)
                translate([-kn_od, i * kn_seg - 0.15, -kn_od])
                    cube([2 * kn_od, kn_seg + 0.3, 2 * kn_od]);
        // screw holes
        for (j = [-1, 0, 1])
            translate([sgn * hole_x, leaf_len / 2 + j * hole_pitch, -leaf_t / 2])
                screw_hole();
    }
}

module pin() {
    translate([0, -1, 0])
        rotate([-90, 0, 0])
            cylinder(d = pin_d, h = pin_len);
}

// ---------- assembly (open 180°) ----------
color("silver")     leaf(-1, [0, 2, 4]);  // left leaf: outer 2 + center
color("lightgray")  leaf( 1, [1, 3]);     // right leaf: middle 2
color("gold")       pin();
mediumnot run
—
high (default) success →
high
69.7s · 745/5572t · $0.2860
SCAD (115 lines)
// ============================================================
//  家具用 小型バット蝶番(butt hinge)  開いた状態(180°)
//  構成: 左板(leaf_L) / 右板(leaf_R) / ピン軸(pin)
//  座標系: ピン軸中心線 = Y軸(+Y方向)、板の面は Z に直交
//          左板: x<0 側、右板: x>0 側
// ============================================================

$fn = 64;

// ---------- 寸法パラメータ ----------
leaf_w      = 25;          // 板の横幅(開く方向 = X、軸中心から先端まで)
leaf_h      = 30;          // 板の縦(ヒンジ軸方向 = Y)
leaf_t      = 2;           // 板厚

pin_d       = 4;           // ピン軸直径
pin_over    = 1;           // knuckle からの飛び出し(片側)
pin_len     = leaf_h + 2 * pin_over;   // = 32

knuckle_od  = 8;           // knuckle 外径
clearance   = 0.3;         // ピンとの径クリアランス
knuckle_id  = pin_d + clearance;       // = 4.6
seg_n       = 5;           // knuckle 分割数
seg_len     = leaf_h / seg_n;          // = 6
knuckle_gap = 0.2;         // 隣接 knuckle 同士の Y 方向すきま

left_segs   = [0, 2, 4];   // 左板の knuckle(外側2 + 中央1)
right_segs  = [1, 3];      // 右板の knuckle(中間2)

screw_d     = 3.2;         // M3 貫通穴
cs_d        = 6;           // 皿穴 表面径
cs_depth    = 1;           // 皿穴 深さ
screw_pitch = 8;           // 穴ピッチ(Y方向)
screw_x     = 16;          // 軸中心から穴中心までの距離(X方向)

open_angle  = 180;         // 開き角度(180 = 完全に開いた平面状態)

// ---------- ユーティリティ ----------
// i 番目セグメントの Y 範囲(内側の境目のみ gap を空ける)
function seg_y0(i) = i * seg_len       + (i > 0         ? knuckle_gap / 2 : 0);
function seg_y1(i) = (i + 1) * seg_len - (i < seg_n - 1 ? knuckle_gap / 2 : 0);

// Y 軸方向の円柱
module cyl_y(d, y0, y1) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            cylinder(d = d, h = y1 - y0);
}

// ---------- knuckle(筒部) ----------
module knuckle(i) {
    cyl_y(knuckle_od, seg_y0(i), seg_y1(i));
}

// ---------- 皿穴付きネジ穴(+Z 面が表面) ----------
module screw_hole(x, y) {
    translate([x, y, 0]) {
        // 貫通穴
        cylinder(d = screw_d, h = leaf_t + 2, center = true);
        // 皿(テーパ)
        translate([0, 0, leaf_t / 2 - cs_depth])
            cylinder(d1 = screw_d, d2 = cs_d, h = cs_depth + 0.01);
    }
}

// ---------- 板(leaf) ----------
// side = -1 : 左板(x<0)、side = +1 : 右板(x>0)
module leaf(side, segs) {
    plate_len = leaf_w - knuckle_od / 2;   // knuckle 外周から先端までの長さ
    difference() {
        union() {
            // 板本体(knuckle 外周から外側へ)
            translate([side > 0 ? knuckle_od / 2 : -leaf_w, 0, -leaf_t / 2])
                cube([plate_len, leaf_h, leaf_t]);

            for (i = segs) {
                // 筒部
                knuckle(i);
                // 筒部と板をつなぐ部分
                translate([side > 0 ? 0 : -knuckle_od / 2, seg_y0(i), -leaf_t / 2])
                    cube([knuckle_od / 2, seg_y1(i) - seg_y0(i), leaf_t]);
            }
        }
        // ピン穴(クリアランス込み)
        cyl_y(knuckle_id, -1, leaf_h + 1);

        // M3 皿穴 ×3(板の縦方向に 8mm ピッチ、中央寄せ)
        for (k = [-1, 0, 1])
            screw_hole(side * screw_x, leaf_h / 2 + k * screw_pitch);
    }
}

// ---------- ピン軸 ----------
module pin() {
    cyl_y(pin_d, -pin_over, leaf_h + pin_over);   // 長さ 32mm、両端 1mm 飛び出し
}

// ============================================================
//  組み立て(開いた状態 180°)
// ============================================================
module hinge_assembly() {
    // 左板(x<0)
    color("SteelBlue")
        leaf(-1, left_segs);

    // 右板(x>0) — open_angle を変えると Y 軸まわりに回転
    color("LightSteelBlue")
        rotate([0, 180 - open_angle, 0])
            leaf(+1, right_segs);

    // ピン軸
    color("Silver")
        pin();
}

hinge_assembly();
max success →
max
354.8s · 745/29097t · $1.46
SCAD (111 lines)
// ============================================================
//  家具用 小型バット蝶番 (butt hinge) ― 180° 開いた状態
//  パーツ: 左板 leaf_left() / 右板 leaf_right() / ピン軸 pin()
//
//  座標系:
//    - ピン軸中心線 = Y 軸 (+Y 方向に伸びる)、knuckle は X=0 中心
//    - 板の平面は Z 軸に直交。左板は x<0、右板は x>0 に伸びる
//    - 板の「表面(皿穴側)」を z=0 (ピン軸を含む平面) に置き、
//      板厚は z ∈ [-leaf_t, 0] とする。実物のバット蝶番と同様に、
//      表面同士が合わさる向きに 0° まで干渉なく折り畳める配置。
// ============================================================

$fn = 72;

// ---------- 寸法 ----------
leaf_len    = 30;      // 板 縦 (Y, ヒンジ軸方向)
leaf_w      = 25;      // 板 横 (X, 開く方向)  ピン軸中心からの寸法
leaf_t      = 2;       // 板厚 (Z)

pin_d       = 4;       // ピン軸 直径
pin_len     = 32;      // ピン軸 長さ (両端 1mm ずつ knuckle から突出)
pin_clear   = 0.3;     // ピン穴クリアランス (穴径 = 4.6)

knuckle_od  = 8;       // knuckle 外径
n_knuckle   = 5;       // knuckle 分割数 (左 3 / 右 2)
knuckle_len = leaf_len / n_knuckle;   // = 6mm
knuckle_gap = 0.2;     // 隣接 knuckle 間 / 板ノッチの回転クリアランス (0 で厳密 6mm)

hole_d      = 3.2;     // M3 貫通穴
csk_d       = 6;       // 皿穴 表面径
csk_depth   = 1;       // 皿穴 テーパ深さ
hole_pitch  = 8;       // 皿穴ピッチ (Y 方向)
hole_x      = 17;      // ピン軸から皿穴中心までの距離 (X)

open_angle  = 180;     // 開き角 [deg]  180 = 全開(同一平面)、0 = 閉

eps = 0.01;

// ---------- 補助 ----------
// Y 軸方向に伸びる円柱 (y0 → y1)
module ycyl(d, y0, y1) {
    translate([0, y0, 0]) rotate([-90, 0, 0]) cylinder(d = d, h = y1 - y0);
}

// i 番目 (0..4) の knuckle 筒。隣に相手側 knuckle が来る端だけ gap/2 縮める
module knuckle_seg(i) {
    y0 = i * knuckle_len       + (i == 0             ? 0 : knuckle_gap / 2);
    y1 = (i + 1) * knuckle_len - (i == n_knuckle - 1 ? 0 : knuckle_gap / 2);
    ycyl(knuckle_od, y0, y1);
}

// 相手側 knuckle が入る位置の板ノッチ (半径 knuckle_od/2 + gap まで切り欠く)
module knuckle_notch(i) {
    r  = knuckle_od / 2 + knuckle_gap;
    y0 = i * knuckle_len - knuckle_gap / 2;
    translate([-r, y0, -knuckle_od])
        cube([2 * r, knuckle_len + knuckle_gap, 2 * knuckle_od]);
}

// M3 皿穴 (表面 z=0 から下向き)
module csk_hole() {
    // 貫通穴 φ3.2
    translate([0, 0, -leaf_t - 1]) cylinder(d = hole_d, h = leaf_t + 2);
    // テーパ: 深さ 1mm で φ3.2 → 表面で φ6 (面一致回避のため eps 分延長)
    k = (csk_depth + eps) / csk_depth;
    translate([0, 0, -csk_depth])
        cylinder(d1 = hole_d, d2 = hole_d + (csk_d - hole_d) * k, h = csk_depth + eps);
}

// ---------- 板 ----------
// side = -1: 左板 (x<0, knuckle 0,2,4)   side = +1: 右板 (x>0, knuckle 1,3)
module leaf(side) {
    own   = [for (i = [0 : n_knuckle - 1]) if ((i % 2 == 0) == (side < 0)) i];
    other = [for (i = [0 : n_knuckle - 1]) if ((i % 2 == 0) != (side < 0)) i];

    difference() {
        union() {
            // 平板 30 × 25 × t2  (表面 z=0, 裏面 z=-leaf_t)
            translate([side < 0 ? -leaf_w : 0, 0, -leaf_t])
                cube([leaf_w, leaf_len, leaf_t]);
            // 自分側の knuckle 筒
            for (i = own) knuckle_seg(i);
        }
        // 相手側 knuckle 用ノッチ
        for (i = other) knuckle_notch(i);
        // ピン穴 φ4.6 (全長貫通)
        ycyl(pin_d + pin_clear, -1, leaf_len + 1);
        // M3 皿穴 ×3 (ピッチ 8mm, 縦中央基準)
        for (k = [-1, 0, 1])
            translate([side * hole_x, leaf_len / 2 + k * hole_pitch, 0]) csk_hole();
    }
}

module leaf_left()  { leaf(-1); }
module leaf_right() { leaf(+1); }

// ---------- ピン軸 ----------
// φ4 × 32、y = -1 → 31 (knuckle 両端から 1mm ずつ突出)
module pin() {
    ycyl(pin_d, -(pin_len - leaf_len) / 2, leaf_len + (pin_len - leaf_len) / 2);
}

// ---------- 組み立て ----------
module hinge(angle = 180) {
    color("Silver")    leaf_left();
    // 右板はピン軸 (Y 軸) 回りに回転。180° で同一平面、0° で左板表面上に重なる
    color("DarkGray")  rotate([0, -(180 - angle), 0]) leaf_right();
    color("Goldenrod") pin();
}

hinge(open_angle);
xhigh success →
xhigh
189.7s · 745/15713t · $0.7931
SCAD (133 lines)
// ============================================================
//  家具用 小型バット蝶番(butt hinge)
//  3 パーツ構成: 左板 / 右板 / ピン軸  … 180° 開いた状態で配置
//
//  座標系
//   - ピン軸の中心線 = Y 軸(ピンは +Y 方向)
//   - 板の平らな面は Z 軸に直交
//   - 左板は x<0 側、右板は x>0 側に伸びる
//   - knuckle は X=0, Z=0 を中心とし、Y 方向に 6mm ずつ並ぶ
//
//  板は取付面(下面)が knuckle 外周に接する位置に置いているため、
//  右板を Y 軸まわりに回転させても左板と干渉せず 0° まで閉じられる。
// ============================================================

$fn = 72;

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

pin_d       = 4;     // ピン軸 直径
pin_len     = 32;    // ピン軸 長さ(両端 1mm ずつ突出)
pin_clear   = 0.3;   // ピンと穴の片側クリアランス
bore_d      = pin_d + 2*pin_clear;   // knuckle 内径 = 4.6mm

knuckle_od  = 8;     // knuckle 外径
knuckle_r   = knuckle_od/2;
n_seg       = 5;                     // 縦 30mm を 5 等分
seg_len     = leaf_len/n_seg;        // = 6mm
knuckle_gap = 0.2;   // 隣接 knuckle 端面間の軸方向すき間
notch_clear = 0.3;   // 相手 knuckle との半径方向すき間

left_segs   = [0, 2, 4];   // 左板 knuckle: 外側 2 個 + 中央 1 個
right_segs  = [1, 3];      // 右板 knuckle: 中間 2 個

leaf_z0     = -knuckle_r;  // 板の下面(取付面)の Z。knuckle 外周に接する

// ねじ穴(M3 皿穴)
hole_x      = 17;    // 軸から穴中心までの距離(knuckle から離れた側)
hole_pitch  = 8;     // 縦方向ピッチ
hole_n      = 3;
hole_d      = 3.2;   // 貫通穴
cs_d        = 6;     // 皿穴 表面径
cs_depth    = 1;     // 皿穴 深さ

open_angle  = 180;   // 開き角(動作確認用。180 = 完全に開いた状態)

eps = 0.01;

// ---------------- 補助モジュール ----------------

// Y 軸に沿った円柱(y0 → y1)
module ycyl(d, y0, y1) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            cylinder(d = d, h = y1 - y0);
}

// knuckle i の Y 範囲(隣接部にすき間、両端は板端いっぱい)
function seg_y0(i) = i*seg_len + (i > 0         ? knuckle_gap/2 : 0);
function seg_y1(i) = (i+1)*seg_len - (i < n_seg-1 ? knuckle_gap/2 : 0);

// knuckle(筒部)
module knuckle(i) {
    ycyl(knuckle_od, seg_y0(i), seg_y1(i));
}

// 相手 knuckle が入る切り欠き(半径方向にクリアランス付き)
module notch(i) {
    ycyl(knuckle_od + 2*notch_clear,
         i*seg_len     - knuckle_gap/2,
         (i+1)*seg_len + knuckle_gap/2);
}

// M3 皿穴(表面 d6 → 深さ 1mm でテーパ + d3.2 貫通)
module screw_hole(x, y) {
    top = leaf_z0 + leaf_t;          // 板の表面(皿穴側)
    translate([x, y, 0]) {
        // 貫通穴
        translate([0, 0, leaf_z0 - 1])
            cylinder(d = hole_d, h = leaf_t + 2);
        // 皿テーパ
        translate([0, 0, top - cs_depth])
            cylinder(d1 = hole_d, d2 = cs_d, h = cs_depth);
        // 表面上の逃げ
        translate([0, 0, top - eps])
            cylinder(d = cs_d, h = 1);
    }
}

// ---------------- 板(leaf) ----------------
// side: -1 = 左板(x<0), +1 = 右板(x>0)
module leaf(side, segs, other_segs) {
    difference() {
        union() {
            // 平板(相手 knuckle 用の切り欠き付き)
            difference() {
                translate([side > 0 ? 0 : -leaf_w, 0, leaf_z0])
                    cube([leaf_w, leaf_len, leaf_t]);
                for (i = other_segs) notch(i);
            }
            // 自分の knuckle
            for (i = segs) knuckle(i);
        }
        // ピン穴(全長貫通)
        ycyl(bore_d, -1, leaf_len + 1);
        // 皿穴 3 個(縦方向 8mm ピッチ、板中央に対称)
        for (k = [0 : hole_n - 1])
            screw_hole(side * hole_x,
                       leaf_len/2 + (k - (hole_n - 1)/2) * hole_pitch);
    }
}

// ---------------- ピン軸 ----------------
module pin() {
    ext = (pin_len - leaf_len)/2;    // 両端の突出量 = 1mm
    ycyl(pin_d, -ext, leaf_len + ext);
}

// ---------------- 組み立て ----------------
// 左板(knuckle 3 個: 0,2,4)
color("Silver")
    leaf(-1, left_segs, right_segs);

// 右板(knuckle 2 個: 1,3) … open_angle < 180 で +Z 側へ折れる
color("LightGray")
    rotate([0, -(180 - open_angle), 0])
        leaf(+1, right_segs, left_segs);

// ピン軸
color("Goldenrod")
    pin();

variant: thinking

offnot run
—
adaptive (default) success →
adaptive
354.8s · 745/29097t · $1.46
SCAD (111 lines)
// ============================================================
//  家具用 小型バット蝶番 (butt hinge) ― 180° 開いた状態
//  パーツ: 左板 leaf_left() / 右板 leaf_right() / ピン軸 pin()
//
//  座標系:
//    - ピン軸中心線 = Y 軸 (+Y 方向に伸びる)、knuckle は X=0 中心
//    - 板の平面は Z 軸に直交。左板は x<0、右板は x>0 に伸びる
//    - 板の「表面(皿穴側)」を z=0 (ピン軸を含む平面) に置き、
//      板厚は z ∈ [-leaf_t, 0] とする。実物のバット蝶番と同様に、
//      表面同士が合わさる向きに 0° まで干渉なく折り畳める配置。
// ============================================================

$fn = 72;

// ---------- 寸法 ----------
leaf_len    = 30;      // 板 縦 (Y, ヒンジ軸方向)
leaf_w      = 25;      // 板 横 (X, 開く方向)  ピン軸中心からの寸法
leaf_t      = 2;       // 板厚 (Z)

pin_d       = 4;       // ピン軸 直径
pin_len     = 32;      // ピン軸 長さ (両端 1mm ずつ knuckle から突出)
pin_clear   = 0.3;     // ピン穴クリアランス (穴径 = 4.6)

knuckle_od  = 8;       // knuckle 外径
n_knuckle   = 5;       // knuckle 分割数 (左 3 / 右 2)
knuckle_len = leaf_len / n_knuckle;   // = 6mm
knuckle_gap = 0.2;     // 隣接 knuckle 間 / 板ノッチの回転クリアランス (0 で厳密 6mm)

hole_d      = 3.2;     // M3 貫通穴
csk_d       = 6;       // 皿穴 表面径
csk_depth   = 1;       // 皿穴 テーパ深さ
hole_pitch  = 8;       // 皿穴ピッチ (Y 方向)
hole_x      = 17;      // ピン軸から皿穴中心までの距離 (X)

open_angle  = 180;     // 開き角 [deg]  180 = 全開(同一平面)、0 = 閉

eps = 0.01;

// ---------- 補助 ----------
// Y 軸方向に伸びる円柱 (y0 → y1)
module ycyl(d, y0, y1) {
    translate([0, y0, 0]) rotate([-90, 0, 0]) cylinder(d = d, h = y1 - y0);
}

// i 番目 (0..4) の knuckle 筒。隣に相手側 knuckle が来る端だけ gap/2 縮める
module knuckle_seg(i) {
    y0 = i * knuckle_len       + (i == 0             ? 0 : knuckle_gap / 2);
    y1 = (i + 1) * knuckle_len - (i == n_knuckle - 1 ? 0 : knuckle_gap / 2);
    ycyl(knuckle_od, y0, y1);
}

// 相手側 knuckle が入る位置の板ノッチ (半径 knuckle_od/2 + gap まで切り欠く)
module knuckle_notch(i) {
    r  = knuckle_od / 2 + knuckle_gap;
    y0 = i * knuckle_len - knuckle_gap / 2;
    translate([-r, y0, -knuckle_od])
        cube([2 * r, knuckle_len + knuckle_gap, 2 * knuckle_od]);
}

// M3 皿穴 (表面 z=0 から下向き)
module csk_hole() {
    // 貫通穴 φ3.2
    translate([0, 0, -leaf_t - 1]) cylinder(d = hole_d, h = leaf_t + 2);
    // テーパ: 深さ 1mm で φ3.2 → 表面で φ6 (面一致回避のため eps 分延長)
    k = (csk_depth + eps) / csk_depth;
    translate([0, 0, -csk_depth])
        cylinder(d1 = hole_d, d2 = hole_d + (csk_d - hole_d) * k, h = csk_depth + eps);
}

// ---------- 板 ----------
// side = -1: 左板 (x<0, knuckle 0,2,4)   side = +1: 右板 (x>0, knuckle 1,3)
module leaf(side) {
    own   = [for (i = [0 : n_knuckle - 1]) if ((i % 2 == 0) == (side < 0)) i];
    other = [for (i = [0 : n_knuckle - 1]) if ((i % 2 == 0) != (side < 0)) i];

    difference() {
        union() {
            // 平板 30 × 25 × t2  (表面 z=0, 裏面 z=-leaf_t)
            translate([side < 0 ? -leaf_w : 0, 0, -leaf_t])
                cube([leaf_w, leaf_len, leaf_t]);
            // 自分側の knuckle 筒
            for (i = own) knuckle_seg(i);
        }
        // 相手側 knuckle 用ノッチ
        for (i = other) knuckle_notch(i);
        // ピン穴 φ4.6 (全長貫通)
        ycyl(pin_d + pin_clear, -1, leaf_len + 1);
        // M3 皿穴 ×3 (ピッチ 8mm, 縦中央基準)
        for (k = [-1, 0, 1])
            translate([side * hole_x, leaf_len / 2 + k * hole_pitch, 0]) csk_hole();
    }
}

module leaf_left()  { leaf(-1); }
module leaf_right() { leaf(+1); }

// ---------- ピン軸 ----------
// φ4 × 32、y = -1 → 31 (knuckle 両端から 1mm ずつ突出)
module pin() {
    ycyl(pin_d, -(pin_len - leaf_len) / 2, leaf_len + (pin_len - leaf_len) / 2);
}

// ---------- 組み立て ----------
module hinge(angle = 180) {
    color("Silver")    leaf_left();
    // 右板はピン軸 (Y 軸) 回りに回転。180° で同一平面、0° で左板表面上に重なる
    color("DarkGray")  rotate([0, -(180 - angle), 0]) leaf_right();
    color("Goldenrod") pin();
}

hinge(open_angle);
dynamicnot run
—