vibe-openscad

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

10 run / 累計 227.2s / 累計 $0.4971

claude opus 4.7 bare

bare (provider default effort)

run detail →
render
bare render of tier-3-butt-hinge
loading STL…
success 21.0s · 748/1540t · $0.0422
SCAD (97 lines)
// Small butt hinge - 180° open state
// Pin axis along Y, leaves on Z=0 plane

$fn = 64;

// Parameters
leaf_w = 25;       // leaf width (in X direction from knuckle)
leaf_h = 30;       // leaf height (along Y, hinge axis)
leaf_t = 2;        // leaf thickness
knuckle_od = 8;    // knuckle outer diameter
knuckle_id = 4.6;  // knuckle inner diameter (pin + clearance)
pin_d = 4;         // pin diameter
pin_len = 32;      // pin length
seg = 6;           // each knuckle segment length (30/5)

// Screw hole parameters
screw_through_d = 3.2;
screw_csk_d = 6;
screw_csk_depth = 1;
screw_pitch = 8;

// ---------- Leaf with knuckles ----------
// side: "left" -> x<0, knuckles at segments 0,2,4
// side: "right" -> x>0, knuckles at segments 1,3
module leaf(side="left") {
    sign = (side=="left") ? -1 : 1;
    knuckle_segs = (side=="left") ? [0,2,4] : [1,3];
    
    difference() {
        union() {
            // Flat plate part - extends from knuckle edge outward
            // Plate runs from x = sign * (knuckle_od/2) outward by leaf_w? 
            // Actually leaf is 25mm wide; we connect plate to knuckle.
            // Plate top surface at z = leaf_t/2, bottom at z = -leaf_t/2
            // Plate extends from x near knuckle tangent to x = sign*(leaf_w + something)
            // Let's place plate from x=0 (overlapping knuckle) to x = sign*leaf_w
            if (side=="left") {
                translate([-leaf_w, 0, -leaf_t/2])
                    cube([leaf_w, leaf_h, leaf_t]);
            } else {
                translate([0, 0, -leaf_t/2])
                    cube([leaf_w, leaf_h, leaf_t]);
            }
            
            // Knuckles
            for (i = knuckle_segs) {
                translate([0, i*seg, 0])
                    rotate([-90,0,0])
                        cylinder(d=knuckle_od, h=seg);
            }
        }
        
        // Pin hole through knuckles (full length to be safe)
        translate([0, -1, 0])
            rotate([-90,0,0])
                cylinder(d=knuckle_id, h=leaf_h+2);
        
        // Cut plate where it would overlap knuckle cylinder area on opposite side
        // Remove the half of plate that's under the knuckle on wrong side
        // Plate currently extends from x=0; knuckle is centered at x=0.
        // We want plate to merge cleanly - remove plate portion inside knuckle radius on the opposite side
        if (side=="left") {
            // remove anything with x > 0 (already none, but ensure)
            translate([0, -1, -leaf_t])
                cube([knuckle_od, leaf_h+2, leaf_t*2]);
        } else {
            translate([-knuckle_od, -1, -leaf_t])
                cube([knuckle_od, leaf_h+2, leaf_t*2]);
        }
        
        // Screw holes - 3 holes along Y, centered, at far end of leaf
        // Hole X position: at distance from knuckle, near far edge
        hole_x = sign * (leaf_w - 5);  // 5mm from outer edge
        y_center = leaf_h/2;
        for (i = [-1,0,1]) {
            y = y_center + i*screw_pitch;
            // Through hole
            translate([hole_x, y, -leaf_t-0.1])
                cylinder(d=screw_through_d, h=leaf_t+0.2);
            // Countersink (taper) on top surface
            translate([hole_x, y, leaf_t/2 - screw_csk_depth])
                cylinder(d1=screw_through_d, d2=screw_csk_d, h=screw_csk_depth+0.01);
        }
    }
}

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

// ---------- Assembly (180° open) ----------
leaf(side="left");
leaf(side="right");
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
20.8s · 748/1317t · $0.0367
SCAD (91 lines)
// Butt hinge - opened 180 degrees
// Pin axis along Y, leaves in XY plane (Z=0 mid-plane of leaves)

$fn = 64;

leaf_w = 25;     // x extent of leaf (from knuckle edge outward)
leaf_h = 30;     // y extent (along pin axis)
leaf_t = 2;      // thickness
knuckle_od = 8;
knuckle_id = 4.6;
pin_d = 4;
pin_len = 32;
seg = 6;         // each knuckle segment length (30/5)

// Screw holes: 3 per leaf, pitch 8mm along Y, centered on leaf
screw_pitch = 8;
screw_through_d = 3.2;
csk_d = 6;
csk_depth = 1;

// Leaf: flat plate from x=knuckle_od/2 outward (no, plate extends from x=0 to x=leaf_w on right, mirrored on left)
// But plate must connect to knuckle. Plate centered on z=0, thickness leaf_t.
// Plate spans x in [knuckle_od/2 ... knuckle_od/2 + leaf_w] roughly, but knuckle radius 4 so plate starts at x=4.
// We'll make plate from x=0 to x=leaf_w (the part inside knuckle gets unioned with knuckle).

module leaf_plate(side) {
    // side = +1 (right, x>0) or -1 (left, x<0)
    // plate: width leaf_w in x, height leaf_h in y, thickness leaf_t in z
    // Screw hole center: place 3 holes along y, centered, at x near far end
    screw_x = side * (leaf_w - 5); // 5mm from outer edge
    difference() {
        translate([side > 0 ? 0 : -leaf_w, -leaf_h/2, -leaf_t/2])
            cube([leaf_w, leaf_h, leaf_t]);
        // screw holes (countersunk from top, +Z face)
        for (i = [-1, 0, 1]) {
            translate([screw_x, i*screw_pitch, 0]) {
                // through hole
                translate([0,0,-leaf_t/2 - 0.1])
                    cylinder(d=screw_through_d, h=leaf_t + 0.2);
                // countersink (taper) on top face
                translate([0,0,leaf_t/2 - csk_depth])
                    cylinder(d1=screw_through_d, d2=csk_d, h=csk_depth + 0.01);
            }
        }
    }
}

module knuckle_seg(y0) {
    translate([0, y0, 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);
            }
}

// Left leaf: knuckles at segments 0,2,4 (outer two + center)
module left_leaf() {
    color("silver") {
        union() {
            leaf_plate(-1);
            // segments y in [-15,-9], [-3,3], [9,15] => y0 = -15, -3, 9
            knuckle_seg(-15);
            knuckle_seg(-3);
            knuckle_seg(9);
        }
    }
}

// Right leaf: knuckles at segments 1,3 => y0 = -9, 3
module right_leaf() {
    color("silver") {
        union() {
            leaf_plate(+1);
            knuckle_seg(-9);
            knuckle_seg(3);
        }
    }
}

module pin() {
    color("gold")
        translate([0, -pin_len/2, 0])
            rotate([-90,0,0])
                cylinder(d=pin_d, h=pin_len);
}

left_leaf();
right_leaf();
pin();
mediumnot run
high (default) success
high
17.4s · 748/1401t · $0.0388
SCAD (106 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内径(クリアランス込み)
seg_h = 6;         // knuckle各セグメント高さ
n_seg = 5;         // 分割数

// 皿穴
csk_outer = 6;
csk_depth = 1;
hole_d = 3.2;

// セグメントY位置(中心)
function seg_y(i) = -leaf_h/2 + seg_h/2 + i*seg_h;

// 皿穴付き貫通(板厚方向 z)
module screw_hole() {
    // 貫通穴
    translate([0,0,-0.1])
        cylinder(d=hole_d, h=leaf_t+0.2);
    // 皿テーパ(上面 z=leaf_t/2 から下に depth)
    translate([0,0,leaf_t/2 - csk_depth])
        cylinder(d1=hole_d, d2=csk_outer, h=csk_depth + 0.01);
}

// 左板(knuckle: セグメント 0, 2, 4)
module left_leaf() {
    color("silver")
    difference() {
        union() {
            // 板本体: x<0 側に伸びる
            // knuckle と接する側は X=0 から少し内側まで
            // 板の x=0 側端は knuckle 中心に届く
            translate([-leaf_w, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            
            // knuckle 3個 (i=0,2,4)
            for (i = [0, 2, 4]) {
                translate([0, seg_y(i) - seg_h/2, 0])
                    rotate([-90, 0, 0])
                        cylinder(d=knuckle_od, h=seg_h);
            }
        }
        
        // ピン穴
        translate([0, -leaf_h/2 - 1, 0])
            rotate([-90, 0, 0])
                cylinder(d=knuckle_id, h=leaf_h + 2);
        
        // ネジ穴3個(板の縦方向 8mm 間隔、knuckleから離れた側)
        // 横方向: knuckle側から離れた位置
        screw_x = -leaf_w + 8;
        for (i = [-1, 0, 1]) {
            translate([screw_x, i*8, 0])
                screw_hole();
        }
    }
}

// 右板(knuckle: セグメント 1, 3)
module right_leaf() {
    color("silver")
    difference() {
        union() {
            translate([0, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            
            for (i = [1, 3]) {
                translate([0, seg_y(i) - seg_h/2, 0])
                    rotate([-90, 0, 0])
                        cylinder(d=knuckle_od, h=seg_h);
            }
        }
        
        translate([0, -leaf_h/2 - 1, 0])
            rotate([-90, 0, 0])
                cylinder(d=knuckle_id, h=leaf_h + 2);
        
        screw_x = leaf_w - 8;
        for (i = [-1, 0, 1]) {
            translate([screw_x, i*8, 0])
                screw_hole();
        }
    }
}

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

// 配置
left_leaf();
right_leaf();
pin();
max success
max
36.0s · 748/2511t · $0.0665
SCAD (134 lines)
// 小型バット蝶番(家具用)
// 開いた状態(180°)

$fn = 64;

// パラメータ
leaf_length = 30;      // 板の縦(ピン軸方向)
leaf_width = 25;       // 板の横(開く方向)
leaf_thick = 2;        // 板厚
pin_dia = 4;           // ピン軸直径
pin_len = 32;          // ピン長さ
knuckle_od = 8;        // knuckle 外径
knuckle_id = pin_dia + 0.3;  // 4.6mm
knuckle_seg = leaf_length / 5;  // 6mm
clearance = 0.2;       // knuckle 同士のクリアランス(モデル上は 0 でも可)

// 皿穴パラメータ
csk_outer_dia = 6;
csk_depth = 1;
csk_through_dia = 3.2;
hole_pitch = 8;

// ===== knuckle(筒)モジュール =====
// Y方向に長さ seg_len の筒を、Y=y0 を始点として作る
module knuckle(y0, seg_len) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(d = knuckle_od, h = seg_len);
                translate([0, 0, -0.1])
                    cylinder(d = knuckle_id, h = seg_len + 0.2);
            }
}

// ===== 板の平板部分(knuckle 側を knuckle と接続するための形状)=====
// 板は厚さ leaf_thick、縦 leaf_length、横 leaf_width
// 板の knuckle 側端は knuckle 外径の半分(半径 4mm)に接する位置から伸びる
// X=0(ピン軸中心)から見て、板はピン軸の中心からオフセットした位置に配置
//
// 開いた状態で板の表面(皿穴側、外側)は Z = +leaf_thick/2 にしたい
// → 平らな面の中央 Z = 0、板の上面 Z = +1、下面 Z = -1
// knuckle 外径 8mm(半径 4mm)の中心は X=0, Y は leaf 中心、Z=0
// 板はピン中心線から横方向に伸び、knuckle の外周に接続する
// 左板: x < 0 側に伸びる。板の右端(knuckle 接続側)は X = 0 で knuckle と接する
//      → 板の右端は X = 0、左端は X = -leaf_width
//      knuckle と板の重なり部分: knuckle 半径 4mm、板厚 1mm 上下
//      板を knuckle の中心側まで伸ばして hull で接続するのが一般的
// 右板: x > 0 側に伸びる。板の左端(knuckle 接続側)は X = 0
//      → 板の左端は X = 0、右端は X = +leaf_width

// 左板の平板部
module left_leaf_plate() {
    // 板の右端が knuckle 中心 X=0 まで来るようにする
    // 板: X = [-leaf_width, 0], Y = [0, leaf_length], Z = [-leaf_thick/2, +leaf_thick/2]
    translate([-leaf_width, 0, -leaf_thick/2])
        cube([leaf_width, leaf_length, leaf_thick]);
}

module right_leaf_plate() {
    // 板: X = [0, leaf_width], Y = [0, leaf_length], Z = [-leaf_thick/2, +leaf_thick/2]
    translate([0, 0, -leaf_thick/2])
        cube([leaf_width, leaf_length, leaf_thick]);
}

// ===== 皿穴モジュール =====
// 板の表面(Z = +leaf_thick/2)から見て皿穴。Z軸方向に貫通
module countersunk_hole() {
    // 貫通穴
    translate([0, 0, -leaf_thick/2 - 0.1])
        cylinder(d = csk_through_dia, h = leaf_thick + 0.2);
    // 皿穴部(テーパ): 表面で 6mm、深さ 1mm で 3.2mm に絞る
    translate([0, 0, leaf_thick/2 - csk_depth])
        cylinder(d1 = csk_through_dia, d2 = csk_outer_dia, h = csk_depth + 0.01);
}

// ===== 左板(皿穴付き、knuckle 3個付き)=====
module left_leaf() {
    difference() {
        union() {
            left_leaf_plate();
            // knuckle: 外側2個 + 中央1個
            // 5等分の区切り: Y = 0,6,12,18,24,30
            // 左板は区間 [0,6], [12,18], [24,30]
            knuckle(0, knuckle_seg);
            knuckle(2 * knuckle_seg, knuckle_seg);
            knuckle(4 * knuckle_seg, knuckle_seg);
        }
        // 皿穴 3個(板の knuckle から離れた側 = 左板では x が小さい側)
        // Y方向の位置: 中央 Y = leaf_length/2 = 15、ピッチ 8mm → Y = 7, 15, 23
        // X方向の位置: 板の中央付近、knuckle から離れた側
        // 板は X=[-25,0]、knuckle 側 = X=0 付近、離れた側 = X=-25 付近
        // 皿穴中心 X は板の中央寄り、knuckle から離れた側
        // ここでは X = -leaf_width/2 = -12.5 とする(板中央)
        // ただし「knuckle から離れた側」を強調するなら X = -leaf_width + 8 = -17 など
        // ここは板中央に配置
        for (i = [0:2]) {
            translate([-leaf_width/2 + 5, leaf_length/2 + (i-1) * hole_pitch, 0])
                countersunk_hole();
        }
        // ピン軸通し穴(knuckle 部分は既に内径あるが、念のため板部にも貫通させない)
    }
}

// ===== 右板(皿穴付き、knuckle 2個付き)=====
module right_leaf() {
    difference() {
        union() {
            right_leaf_plate();
            // knuckle: 中間2個
            // 右板は区間 [6,12], [18,24]
            knuckle(knuckle_seg, knuckle_seg);
            knuckle(3 * knuckle_seg, knuckle_seg);
        }
        // 皿穴 3個
        for (i = [0:2]) {
            translate([leaf_width/2 - 5, leaf_length/2 + (i-1) * hole_pitch, 0])
                countersunk_hole();
        }
    }
}

// ===== ピン軸 =====
module pin() {
    // Y軸方向、Y = -1 から Y = leaf_length + 1 まで(長さ 32mm)
    translate([0, -1, 0])
        rotate([-90, 0, 0])
            cylinder(d = pin_dia, h = pin_len);
}

// ===== 組み立て(180° 開いた状態)=====
// 色分けして出力
color("Silver") left_leaf();
color("Gray") right_leaf();
color("DarkGray") pin();
xhigh success
xhigh
19.4s · 748/1375t · $0.0381
SCAD (100 lines)
// Small butt hinge - opened 180 degrees
// Pin axis along Y, leaves on Z=0 plane

$fn = 64;

// ---- Parameters ----
leaf_long   = 30;   // along Y (hinge axis)
leaf_wide   = 25;   // along X (away from axis)
leaf_thick  = 2;

pin_dia     = 4;
pin_len     = 32;

knuckle_od  = 8;
knuckle_id  = pin_dia + 0.6;   // 4.6 mm hole
knuckle_seg = 6;               // 30/5

screw_clear = 3.2;
csk_dia     = 6;
csk_depth   = 1;
screw_count = 3;
screw_pitch = 8;

// ---- Knuckle (hollow cylinder) along Y ----
module knuckle(y_start, length) {
    translate([0, y_start, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(h = length, d = knuckle_od);
                translate([0, 0, -0.1])
                    cylinder(h = length + 0.2, d = knuckle_id);
            }
}

// ---- Leaf plate with countersunk holes ----
// Plate extends from x = x_inner to x = x_inner + sign*leaf_wide
// The plate's inner edge (near knuckle) is tangent to knuckle OD
module leaf_plate(direction = 1) {
    // direction = -1 (left) or +1 (right)
    inner_x = direction * (knuckle_od / 2);
    outer_x = inner_x + direction * leaf_wide;
    x_min = min(inner_x, outer_x);

    difference() {
        // Plate: top face at z=0, bottom at z=-leaf_thick
        translate([x_min, -leaf_long/2, -leaf_thick])
            cube([leaf_wide, leaf_long, leaf_thick]);

        // Screw holes - centered along plate width, on far side from knuckle
        // Position screws roughly at 2/3 from knuckle (away from knuckle)
        screw_x = inner_x + direction * (leaf_wide * 0.65);

        for (i = [0 : screw_count - 1]) {
            y = -((screw_count - 1) * screw_pitch) / 2 + i * screw_pitch;

            // Through hole
            translate([screw_x, y, -leaf_thick - 0.1])
                cylinder(h = leaf_thick + 0.2, d = screw_clear);

            // Countersink (taper) - opens upward (top surface at z=0)
            translate([screw_x, y, -csk_depth])
                cylinder(h = csk_depth + 0.01,
                         d1 = screw_clear, d2 = csk_dia);
        }
    }
}

// ---- Left leaf: knuckles at outer (0..6, 24..30) and center (12..18) ----
module left_leaf() {
    color("silver") {
        leaf_plate(-1);
        // Knuckle Y positions (relative to leaf center at y=0):
        // segments: [-15,-9], [-9,-3], [-3,3], [3,9], [9,15]
        knuckle(-15, knuckle_seg);   // outer
        knuckle(-3,  knuckle_seg);   // center
        knuckle(9,   knuckle_seg);   // outer
    }
}

// ---- Right leaf: knuckles in intermediate positions (6..12, 18..24) ----
module right_leaf() {
    color("gainsboro") {
        leaf_plate(1);
        knuckle(-9, knuckle_seg);
        knuckle(3,  knuckle_seg);
    }
}

// ---- Pin ----
module pin() {
    color("dimgray")
        translate([0, -pin_len/2, 0])
            rotate([-90, 0, 0])
                cylinder(h = pin_len, d = pin_dia);
}

// ---- Assembly (180° open) ----
left_leaf();
right_leaf();
pin();

variant: thinking

off success
off
17.4s · 748/1401t · $0.0388
SCAD (106 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内径(クリアランス込み)
seg_h = 6;         // knuckle各セグメント高さ
n_seg = 5;         // 分割数

// 皿穴
csk_outer = 6;
csk_depth = 1;
hole_d = 3.2;

// セグメントY位置(中心)
function seg_y(i) = -leaf_h/2 + seg_h/2 + i*seg_h;

// 皿穴付き貫通(板厚方向 z)
module screw_hole() {
    // 貫通穴
    translate([0,0,-0.1])
        cylinder(d=hole_d, h=leaf_t+0.2);
    // 皿テーパ(上面 z=leaf_t/2 から下に depth)
    translate([0,0,leaf_t/2 - csk_depth])
        cylinder(d1=hole_d, d2=csk_outer, h=csk_depth + 0.01);
}

// 左板(knuckle: セグメント 0, 2, 4)
module left_leaf() {
    color("silver")
    difference() {
        union() {
            // 板本体: x<0 側に伸びる
            // knuckle と接する側は X=0 から少し内側まで
            // 板の x=0 側端は knuckle 中心に届く
            translate([-leaf_w, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            
            // knuckle 3個 (i=0,2,4)
            for (i = [0, 2, 4]) {
                translate([0, seg_y(i) - seg_h/2, 0])
                    rotate([-90, 0, 0])
                        cylinder(d=knuckle_od, h=seg_h);
            }
        }
        
        // ピン穴
        translate([0, -leaf_h/2 - 1, 0])
            rotate([-90, 0, 0])
                cylinder(d=knuckle_id, h=leaf_h + 2);
        
        // ネジ穴3個(板の縦方向 8mm 間隔、knuckleから離れた側)
        // 横方向: knuckle側から離れた位置
        screw_x = -leaf_w + 8;
        for (i = [-1, 0, 1]) {
            translate([screw_x, i*8, 0])
                screw_hole();
        }
    }
}

// 右板(knuckle: セグメント 1, 3)
module right_leaf() {
    color("silver")
    difference() {
        union() {
            translate([0, -leaf_h/2, -leaf_t/2])
                cube([leaf_w, leaf_h, leaf_t]);
            
            for (i = [1, 3]) {
                translate([0, seg_y(i) - seg_h/2, 0])
                    rotate([-90, 0, 0])
                        cylinder(d=knuckle_od, h=seg_h);
            }
        }
        
        translate([0, -leaf_h/2 - 1, 0])
            rotate([-90, 0, 0])
                cylinder(d=knuckle_id, h=leaf_h + 2);
        
        screw_x = leaf_w - 8;
        for (i = [-1, 0, 1]) {
            translate([screw_x, i*8, 0])
                screw_hole();
        }
    }
}

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

// 配置
left_leaf();
right_leaf();
pin();
adaptive (default) success
adaptive
36.0s · 748/2511t · $0.0665
SCAD (134 lines)
// 小型バット蝶番(家具用)
// 開いた状態(180°)

$fn = 64;

// パラメータ
leaf_length = 30;      // 板の縦(ピン軸方向)
leaf_width = 25;       // 板の横(開く方向)
leaf_thick = 2;        // 板厚
pin_dia = 4;           // ピン軸直径
pin_len = 32;          // ピン長さ
knuckle_od = 8;        // knuckle 外径
knuckle_id = pin_dia + 0.3;  // 4.6mm
knuckle_seg = leaf_length / 5;  // 6mm
clearance = 0.2;       // knuckle 同士のクリアランス(モデル上は 0 でも可)

// 皿穴パラメータ
csk_outer_dia = 6;
csk_depth = 1;
csk_through_dia = 3.2;
hole_pitch = 8;

// ===== knuckle(筒)モジュール =====
// Y方向に長さ seg_len の筒を、Y=y0 を始点として作る
module knuckle(y0, seg_len) {
    translate([0, y0, 0])
        rotate([-90, 0, 0])
            difference() {
                cylinder(d = knuckle_od, h = seg_len);
                translate([0, 0, -0.1])
                    cylinder(d = knuckle_id, h = seg_len + 0.2);
            }
}

// ===== 板の平板部分(knuckle 側を knuckle と接続するための形状)=====
// 板は厚さ leaf_thick、縦 leaf_length、横 leaf_width
// 板の knuckle 側端は knuckle 外径の半分(半径 4mm)に接する位置から伸びる
// X=0(ピン軸中心)から見て、板はピン軸の中心からオフセットした位置に配置
//
// 開いた状態で板の表面(皿穴側、外側)は Z = +leaf_thick/2 にしたい
// → 平らな面の中央 Z = 0、板の上面 Z = +1、下面 Z = -1
// knuckle 外径 8mm(半径 4mm)の中心は X=0, Y は leaf 中心、Z=0
// 板はピン中心線から横方向に伸び、knuckle の外周に接続する
// 左板: x < 0 側に伸びる。板の右端(knuckle 接続側)は X = 0 で knuckle と接する
//      → 板の右端は X = 0、左端は X = -leaf_width
//      knuckle と板の重なり部分: knuckle 半径 4mm、板厚 1mm 上下
//      板を knuckle の中心側まで伸ばして hull で接続するのが一般的
// 右板: x > 0 側に伸びる。板の左端(knuckle 接続側)は X = 0
//      → 板の左端は X = 0、右端は X = +leaf_width

// 左板の平板部
module left_leaf_plate() {
    // 板の右端が knuckle 中心 X=0 まで来るようにする
    // 板: X = [-leaf_width, 0], Y = [0, leaf_length], Z = [-leaf_thick/2, +leaf_thick/2]
    translate([-leaf_width, 0, -leaf_thick/2])
        cube([leaf_width, leaf_length, leaf_thick]);
}

module right_leaf_plate() {
    // 板: X = [0, leaf_width], Y = [0, leaf_length], Z = [-leaf_thick/2, +leaf_thick/2]
    translate([0, 0, -leaf_thick/2])
        cube([leaf_width, leaf_length, leaf_thick]);
}

// ===== 皿穴モジュール =====
// 板の表面(Z = +leaf_thick/2)から見て皿穴。Z軸方向に貫通
module countersunk_hole() {
    // 貫通穴
    translate([0, 0, -leaf_thick/2 - 0.1])
        cylinder(d = csk_through_dia, h = leaf_thick + 0.2);
    // 皿穴部(テーパ): 表面で 6mm、深さ 1mm で 3.2mm に絞る
    translate([0, 0, leaf_thick/2 - csk_depth])
        cylinder(d1 = csk_through_dia, d2 = csk_outer_dia, h = csk_depth + 0.01);
}

// ===== 左板(皿穴付き、knuckle 3個付き)=====
module left_leaf() {
    difference() {
        union() {
            left_leaf_plate();
            // knuckle: 外側2個 + 中央1個
            // 5等分の区切り: Y = 0,6,12,18,24,30
            // 左板は区間 [0,6], [12,18], [24,30]
            knuckle(0, knuckle_seg);
            knuckle(2 * knuckle_seg, knuckle_seg);
            knuckle(4 * knuckle_seg, knuckle_seg);
        }
        // 皿穴 3個(板の knuckle から離れた側 = 左板では x が小さい側)
        // Y方向の位置: 中央 Y = leaf_length/2 = 15、ピッチ 8mm → Y = 7, 15, 23
        // X方向の位置: 板の中央付近、knuckle から離れた側
        // 板は X=[-25,0]、knuckle 側 = X=0 付近、離れた側 = X=-25 付近
        // 皿穴中心 X は板の中央寄り、knuckle から離れた側
        // ここでは X = -leaf_width/2 = -12.5 とする(板中央)
        // ただし「knuckle から離れた側」を強調するなら X = -leaf_width + 8 = -17 など
        // ここは板中央に配置
        for (i = [0:2]) {
            translate([-leaf_width/2 + 5, leaf_length/2 + (i-1) * hole_pitch, 0])
                countersunk_hole();
        }
        // ピン軸通し穴(knuckle 部分は既に内径あるが、念のため板部にも貫通させない)
    }
}

// ===== 右板(皿穴付き、knuckle 2個付き)=====
module right_leaf() {
    difference() {
        union() {
            right_leaf_plate();
            // knuckle: 中間2個
            // 右板は区間 [6,12], [18,24]
            knuckle(knuckle_seg, knuckle_seg);
            knuckle(3 * knuckle_seg, knuckle_seg);
        }
        // 皿穴 3個
        for (i = [0:2]) {
            translate([leaf_width/2 - 5, leaf_length/2 + (i-1) * hole_pitch, 0])
                countersunk_hole();
        }
    }
}

// ===== ピン軸 =====
module pin() {
    // Y軸方向、Y = -1 から Y = leaf_length + 1 まで(長さ 32mm)
    translate([0, -1, 0])
        rotate([-90, 0, 0])
            cylinder(d = pin_dia, h = pin_len);
}

// ===== 組み立て(180° 開いた状態)=====
// 色分けして出力
color("Silver") left_leaf();
color("Gray") right_leaf();
color("DarkGray") pin();
dynamicnot run

iteration: iter-png

i1 success
iter 1
20.6s · 3054/1721t · $0.0583
diff vs bare: +39/-35
  // Small butt hinge - 180° open state
  // Pin axis along Y, leaves on Z=0 plane
+ // Left leaf: x<0, knuckles at segments 0,2,4 (outer + middle)
+ // Right leaf: x>0, knuckles at segments 1,3 (between)
  
  $fn = 64;
  
  // Parameters
- leaf_w = 25;       // leaf width (in X direction from knuckle)
+ leaf_w = 25;       // leaf width (X direction from hinge axis)
  leaf_h = 30;       // leaf height (along Y, hinge axis)
  leaf_t = 2;        // leaf thickness
  knuckle_od = 8;    // knuckle outer diameter
- knuckle_id = 4.6;  // knuckle inner diameter (pin + clearance)
+ knuckle_id = 4.6;  // knuckle inner diameter (pin + 0.3 clearance per side overall 0.6? spec says +0.3)
  pin_d = 4;         // pin diameter
- pin_len = 32;      // pin length
+ pin_len = 32;      // pin length (1mm overhang each side)
  seg = 6;           // each knuckle segment length (30/5)
  
  // Screw hole parameters
  screw_through_d = 3.2;
  screw_csk_d = 6;
  screw_csk_depth = 1;
  screw_pitch = 8;
  
  // ---------- Leaf with knuckles ----------
- // side: "left" -> x<0, knuckles at segments 0,2,4
- // side: "right" -> x>0, knuckles at segments 1,3
+ // The leaf's flat plate ends tangent to the knuckle (so the plate doesn't
+ // extend across the hinge axis). The knuckle is centered at x=0, and the
+ // plate's inner edge is at x = ±knuckle_od/2 (so that when opened 180°,
+ // both plates lie in the same Z plane and clear each other).
  module leaf(side="left") {
      sign = (side=="left") ? -1 : 1;
      knuckle_segs = (side=="left") ? [0,2,4] : [1,3];
      
+     // Plate inner edge is tangent to knuckle outer cylinder
+     plate_inner = sign * knuckle_od/2;
+     plate_outer = sign * leaf_w; // total leaf width measured from axis... 
+     // Spec: leaf is 25mm wide. Interpreting "25mm" as plate width from
+     // knuckle edge outward, but typical hinge "leaf width" includes the
+     // knuckle. Here we keep flat plate part = leaf_w from axis tangent
+     // (so the visible flat is 25 mm wide as seen in top view, excluding knuckle).
+     
      difference() {
          union() {
-             // Flat plate part - extends from knuckle edge outward
-             // Plate runs from x = sign * (knuckle_od/2) outward by leaf_w? 
-             // Actually leaf is 25mm wide; we connect plate to knuckle.
-             // Plate top surface at z = leaf_t/2, bottom at z = -leaf_t/2
-             // Plate extends from x near knuckle tangent to x = sign*(leaf_w + something)
-             // Let's place plate from x=0 (overlapping knuckle) to x = sign*leaf_w
+             // Flat plate
              if (side=="left") {
-                 translate([-leaf_w, 0, -leaf_t/2])
+                 translate([-leaf_w - knuckle_od/2, 0, -leaf_t/2])
                      cube([leaf_w, leaf_h, leaf_t]);
              } else {
-                 translate([0, 0, -leaf_t/2])
+                 translate([knuckle_od/2, 0, -leaf_t/2])
                      cube([leaf_w, leaf_h, leaf_t]);
              }
              
              // Knuckles
              for (i = knuckle_segs) {
                  translate([0, i*seg, 0])
                      rotate([-90,0,0])
                          cylinder(d=knuckle_od, h=seg);
              }
+             
+             // Small fillet bridge from plate edge to knuckle (optional, small triangular block)
+             // Connect plate flush to knuckle: thin bridge along Y for each knuckle of THIS leaf
+             for (i = knuckle_segs) {
+                 translate([sign*knuckle_od/2 - (side=="left" ? 0 : 0), i*seg, -leaf_t/2])
+                     if (side=="left")
+                         translate([-0.01,0,0]) cube([0.02, seg, leaf_t]);
+                     else
+                         translate([-0.01,0,0]) cube([0.02, seg, leaf_t]);
+             }
          }
          
-         // Pin hole through knuckles (full length to be safe)
+         // Pin hole through knuckles
          translate([0, -1, 0])
              rotate([-90,0,0])
                  cylinder(d=knuckle_id, h=leaf_h+2);
          
-         // Cut plate where it would overlap knuckle cylinder area on opposite side
-         // Remove the half of plate that's under the knuckle on wrong side
-         // Plate currently extends from x=0; knuckle is centered at x=0.
-         // We want plate to merge cleanly - remove plate portion inside knuckle radius on the opposite side
-         if (side=="left") {
-             // remove anything with x > 0 (already none, but ensure)
-             translate([0, -1, -leaf_t])
-                 cube([knuckle_od, leaf_h+2, leaf_t*2]);
-         } else {
-             translate([-knuckle_od, -1, -leaf_t])
-                 cube([knuckle_od, leaf_h+2, leaf_t*2]);
-         }
-         
-         // Screw holes - 3 holes along Y, centered, at far end of leaf
-         // Hole X position: at distance from knuckle, near far edge
-         hole_x = sign * (leaf_w - 5);  // 5mm from outer edge
+         // Screw holes - 3 holes along Y, centered, on the leaf
+         hole_x = sign * (knuckle_od/2 + leaf_w - 5);  // 5mm from outer edge
          y_center = leaf_h/2;
          for (i = [-1,0,1]) {
              y = y_center + i*screw_pitch;
              // Through hole
-             translate([hole_x, y, -leaf_t-0.1])
-                 cylinder(d=screw_through_d, h=leaf_t+0.2);
-             // Countersink (taper) on top surface
+             translate([hole_x, y, -leaf_t/2 - 0.1])
+                 cylinder(d=screw_through_d, h=leaf_t + 0.2);
+             // Countersink (taper) on top surface (+Z side)
              translate([hole_x, y, leaf_t/2 - screw_csk_depth])
-                 cylinder(d1=screw_through_d, d2=screw_csk_d, h=screw_csk_depth+0.01);
+                 cylinder(d1=screw_through_d, d2=screw_csk_d, h=screw_csk_depth + 0.01);
          }
      }
  }
  
  // ---------- Pin ----------
+ // Pin length 32mm, knuckle stack length 30mm, so 1mm overhang each side
  module pin() {
      translate([0, -1, 0])
          rotate([-90,0,0])
              cylinder(d=pin_d, h=pin_len);
  }
  
  // ---------- Assembly (180° open) ----------
  leaf(side="left");
  leaf(side="right");
- pin();
+ color("gold") pin();
SCAD (101 lines)
// Small butt hinge - 180° open state
// Pin axis along Y, leaves on Z=0 plane
// Left leaf: x<0, knuckles at segments 0,2,4 (outer + middle)
// Right leaf: x>0, knuckles at segments 1,3 (between)

$fn = 64;

// Parameters
leaf_w = 25;       // leaf width (X direction from hinge axis)
leaf_h = 30;       // leaf height (along Y, hinge axis)
leaf_t = 2;        // leaf thickness
knuckle_od = 8;    // knuckle outer diameter
knuckle_id = 4.6;  // knuckle inner diameter (pin + 0.3 clearance per side overall 0.6? spec says +0.3)
pin_d = 4;         // pin diameter
pin_len = 32;      // pin length (1mm overhang each side)
seg = 6;           // each knuckle segment length (30/5)

// Screw hole parameters
screw_through_d = 3.2;
screw_csk_d = 6;
screw_csk_depth = 1;
screw_pitch = 8;

// ---------- Leaf with knuckles ----------
// The leaf's flat plate ends tangent to the knuckle (so the plate doesn't
// extend across the hinge axis). The knuckle is centered at x=0, and the
// plate's inner edge is at x = ±knuckle_od/2 (so that when opened 180°,
// both plates lie in the same Z plane and clear each other).
module leaf(side="left") {
    sign = (side=="left") ? -1 : 1;
    knuckle_segs = (side=="left") ? [0,2,4] : [1,3];
    
    // Plate inner edge is tangent to knuckle outer cylinder
    plate_inner = sign * knuckle_od/2;
    plate_outer = sign * leaf_w; // total leaf width measured from axis... 
    // Spec: leaf is 25mm wide. Interpreting "25mm" as plate width from
    // knuckle edge outward, but typical hinge "leaf width" includes the
    // knuckle. Here we keep flat plate part = leaf_w from axis tangent
    // (so the visible flat is 25 mm wide as seen in top view, excluding knuckle).
    
    difference() {
        union() {
            // Flat plate
            if (side=="left") {
                translate([-leaf_w - knuckle_od/2, 0, -leaf_t/2])
                    cube([leaf_w, leaf_h, leaf_t]);
            } else {
                translate([knuckle_od/2, 0, -leaf_t/2])
                    cube([leaf_w, leaf_h, leaf_t]);
            }
            
            // Knuckles
            for (i = knuckle_segs) {
                translate([0, i*seg, 0])
                    rotate([-90,0,0])
                        cylinder(d=knuckle_od, h=seg);
            }
            
            // Small fillet bridge from plate edge to knuckle (optional, small triangular block)
            // Connect plate flush to knuckle: thin bridge along Y for each knuckle of THIS leaf
            for (i = knuckle_segs) {
                translate([sign*knuckle_od/2 - (side=="left" ? 0 : 0), i*seg, -leaf_t/2])
                    if (side=="left")
                        translate([-0.01,0,0]) cube([0.02, seg, leaf_t]);
                    else
                        translate([-0.01,0,0]) cube([0.02, seg, leaf_t]);
            }
        }
        
        // Pin hole through knuckles
        translate([0, -1, 0])
            rotate([-90,0,0])
                cylinder(d=knuckle_id, h=leaf_h+2);
        
        // Screw holes - 3 holes along Y, centered, on the leaf
        hole_x = sign * (knuckle_od/2 + leaf_w - 5);  // 5mm from outer edge
        y_center = leaf_h/2;
        for (i = [-1,0,1]) {
            y = y_center + i*screw_pitch;
            // Through hole
            translate([hole_x, y, -leaf_t/2 - 0.1])
                cylinder(d=screw_through_d, h=leaf_t + 0.2);
            // Countersink (taper) on top surface (+Z side)
            translate([hole_x, y, leaf_t/2 - screw_csk_depth])
                cylinder(d1=screw_through_d, d2=screw_csk_d, h=screw_csk_depth + 0.01);
        }
    }
}

// ---------- Pin ----------
// Pin length 32mm, knuckle stack length 30mm, so 1mm overhang each side
module pin() {
    translate([0, -1, 0])
        rotate([-90,0,0])
            cylinder(d=pin_d, h=pin_len);
}

// ---------- Assembly (180° open) ----------
leaf(side="left");
leaf(side="right");
color("gold") pin();
i2 success
iter 2
24.4s · 3235/1763t · $0.0603
diff vs i1: +45/-54
  // Small butt hinge - 180° open state
- // Pin axis along Y, leaves on Z=0 plane
+ // Pin axis along Y, leaves on Z=0 plane (180° open)
  // Left leaf: x<0, knuckles at segments 0,2,4 (outer + middle)
  // Right leaf: x>0, knuckles at segments 1,3 (between)
  
  $fn = 64;
  
- // Parameters
- leaf_w = 25;       // leaf width (X direction from hinge axis)
- leaf_h = 30;       // leaf height (along Y, hinge axis)
- leaf_t = 2;        // leaf thickness
- knuckle_od = 8;    // knuckle outer diameter
- knuckle_id = 4.6;  // knuckle inner diameter (pin + 0.3 clearance per side overall 0.6? spec says +0.3)
- pin_d = 4;         // pin diameter
- pin_len = 32;      // pin length (1mm overhang each side)
- seg = 6;           // each knuckle segment length (30/5)
+ // ---- Parameters ----
+ leaf_w_total = 25;   // total leaf width including knuckle radius
+ leaf_h       = 30;   // leaf height (along Y, hinge axis)
+ leaf_t       = 2;    // leaf thickness
+ knuckle_od   = 8;    // knuckle outer diameter
+ knuckle_id   = 4.6;  // knuckle inner diameter (pin 4 + 0.6 clearance)
+ pin_d        = 4;    // pin diameter
+ pin_len      = 32;   // pin length (1mm overhang each end)
+ seg          = 6;    // segment length (30 / 5)
  
+ // Flat plate width (excluding the part occupied by knuckle radius)
+ plate_w = leaf_w_total - knuckle_od/2;
+ 
  // Screw hole parameters
  screw_through_d = 3.2;
- screw_csk_d = 6;
+ screw_csk_d     = 6;
  screw_csk_depth = 1;
- screw_pitch = 8;
+ screw_pitch     = 8;
  
  // ---------- Leaf with knuckles ----------
- // The leaf's flat plate ends tangent to the knuckle (so the plate doesn't
- // extend across the hinge axis). The knuckle is centered at x=0, and the
- // plate's inner edge is at x = ±knuckle_od/2 (so that when opened 180°,
- // both plates lie in the same Z plane and clear each other).
  module leaf(side="left") {
      sign = (side=="left") ? -1 : 1;
      knuckle_segs = (side=="left") ? [0,2,4] : [1,3];
-     
-     // Plate inner edge is tangent to knuckle outer cylinder
-     plate_inner = sign * knuckle_od/2;
-     plate_outer = sign * leaf_w; // total leaf width measured from axis... 
-     // Spec: leaf is 25mm wide. Interpreting "25mm" as plate width from
-     // knuckle edge outward, but typical hinge "leaf width" includes the
-     // knuckle. Here we keep flat plate part = leaf_w from axis tangent
-     // (so the visible flat is 25 mm wide as seen in top view, excluding knuckle).
-     
+ 
      difference() {
          union() {
-             // Flat plate
+             // Flat plate: inner edge tangent to knuckle outer cylinder
              if (side=="left") {
-                 translate([-leaf_w - knuckle_od/2, 0, -leaf_t/2])
-                     cube([leaf_w, leaf_h, leaf_t]);
+                 translate([-knuckle_od/2 - plate_w, 0, -leaf_t/2])
+                     cube([plate_w, leaf_h, leaf_t]);
              } else {
                  translate([knuckle_od/2, 0, -leaf_t/2])
-                     cube([leaf_w, leaf_h, leaf_t]);
+                     cube([plate_w, leaf_h, leaf_t]);
              }
-             
-             // Knuckles
+ 
+             // Knuckles (cylinders) for this leaf
              for (i = knuckle_segs) {
                  translate([0, i*seg, 0])
-                     rotate([-90,0,0])
+                     rotate([-90, 0, 0])
                          cylinder(d=knuckle_od, h=seg);
              }
-             
-             // Small fillet bridge from plate edge to knuckle (optional, small triangular block)
-             // Connect plate flush to knuckle: thin bridge along Y for each knuckle of THIS leaf
+ 
+             // Web connecting plate to knuckle (so plate flush-merges with knuckle wall)
              for (i = knuckle_segs) {
-                 translate([sign*knuckle_od/2 - (side=="left" ? 0 : 0), i*seg, -leaf_t/2])
-                     if (side=="left")
-                         translate([-0.01,0,0]) cube([0.02, seg, leaf_t]);
-                     else
-                         translate([-0.01,0,0]) cube([0.02, seg, leaf_t]);
+                 if (side=="left")
+                     translate([-knuckle_od/2, i*seg, -leaf_t/2])
+                         cube([knuckle_od/2, seg, leaf_t]);
+                 else
+                     translate([0, i*seg, -leaf_t/2])
+                         cube([knuckle_od/2, seg, leaf_t]);
              }
          }
-         
+ 
          // Pin hole through knuckles
          translate([0, -1, 0])
-             rotate([-90,0,0])
-                 cylinder(d=knuckle_id, h=leaf_h+2);
-         
-         // Screw holes - 3 holes along Y, centered, on the leaf
-         hole_x = sign * (knuckle_od/2 + leaf_w - 5);  // 5mm from outer edge
+             rotate([-90, 0, 0])
+                 cylinder(d=knuckle_id, h=leaf_h + 2);
+ 
+         // Screw holes (3 along Y), centered on the flat plate
+         hole_x = sign * (knuckle_od/2 + plate_w/2);
          y_center = leaf_h/2;
-         for (i = [-1,0,1]) {
+         for (i = [-1, 0, 1]) {
              y = y_center + i*screw_pitch;
              // Through hole
              translate([hole_x, y, -leaf_t/2 - 0.1])
                  cylinder(d=screw_through_d, h=leaf_t + 0.2);
-             // Countersink (taper) on top surface (+Z side)
+             // Countersink on +Z (visible) face
              translate([hole_x, y, leaf_t/2 - screw_csk_depth])
-                 cylinder(d1=screw_through_d, d2=screw_csk_d, h=screw_csk_depth + 0.01);
+                 cylinder(d1=screw_through_d, d2=screw_csk_d,
+                          h=screw_csk_depth + 0.01);
          }
      }
  }
  
  // ---------- Pin ----------
- // Pin length 32mm, knuckle stack length 30mm, so 1mm overhang each side
  module pin() {
      translate([0, -1, 0])
-         rotate([-90,0,0])
+         rotate([-90, 0, 0])
              cylinder(d=pin_d, h=pin_len);
  }
  
  // ---------- Assembly (180° open) ----------
- leaf(side="left");
- leaf(side="right");
- color("gold") pin();
+ color("steelblue")  leaf(side="left");
+ color("slategray")  leaf(side="right");
+ color("gold")       pin();
SCAD (92 lines)
// Small butt hinge - 180° open state
// Pin axis along Y, leaves on Z=0 plane (180° open)
// Left leaf: x<0, knuckles at segments 0,2,4 (outer + middle)
// Right leaf: x>0, knuckles at segments 1,3 (between)

$fn = 64;

// ---- Parameters ----
leaf_w_total = 25;   // total leaf width including knuckle radius
leaf_h       = 30;   // leaf height (along Y, hinge axis)
leaf_t       = 2;    // leaf thickness
knuckle_od   = 8;    // knuckle outer diameter
knuckle_id   = 4.6;  // knuckle inner diameter (pin 4 + 0.6 clearance)
pin_d        = 4;    // pin diameter
pin_len      = 32;   // pin length (1mm overhang each end)
seg          = 6;    // segment length (30 / 5)

// Flat plate width (excluding the part occupied by knuckle radius)
plate_w = leaf_w_total - knuckle_od/2;

// Screw hole parameters
screw_through_d = 3.2;
screw_csk_d     = 6;
screw_csk_depth = 1;
screw_pitch     = 8;

// ---------- Leaf with knuckles ----------
module leaf(side="left") {
    sign = (side=="left") ? -1 : 1;
    knuckle_segs = (side=="left") ? [0,2,4] : [1,3];

    difference() {
        union() {
            // Flat plate: inner edge tangent to knuckle outer cylinder
            if (side=="left") {
                translate([-knuckle_od/2 - plate_w, 0, -leaf_t/2])
                    cube([plate_w, leaf_h, leaf_t]);
            } else {
                translate([knuckle_od/2, 0, -leaf_t/2])
                    cube([plate_w, leaf_h, leaf_t]);
            }

            // Knuckles (cylinders) for this leaf
            for (i = knuckle_segs) {
                translate([0, i*seg, 0])
                    rotate([-90, 0, 0])
                        cylinder(d=knuckle_od, h=seg);
            }

            // Web connecting plate to knuckle (so plate flush-merges with knuckle wall)
            for (i = knuckle_segs) {
                if (side=="left")
                    translate([-knuckle_od/2, i*seg, -leaf_t/2])
                        cube([knuckle_od/2, seg, leaf_t]);
                else
                    translate([0, i*seg, -leaf_t/2])
                        cube([knuckle_od/2, seg, leaf_t]);
            }
        }

        // Pin hole through knuckles
        translate([0, -1, 0])
            rotate([-90, 0, 0])
                cylinder(d=knuckle_id, h=leaf_h + 2);

        // Screw holes (3 along Y), centered on the flat plate
        hole_x = sign * (knuckle_od/2 + plate_w/2);
        y_center = leaf_h/2;
        for (i = [-1, 0, 1]) {
            y = y_center + i*screw_pitch;
            // Through hole
            translate([hole_x, y, -leaf_t/2 - 0.1])
                cylinder(d=screw_through_d, h=leaf_t + 0.2);
            // Countersink on +Z (visible) face
            translate([hole_x, y, leaf_t/2 - screw_csk_depth])
                cylinder(d1=screw_through_d, d2=screw_csk_d,
                         h=screw_csk_depth + 0.01);
        }
    }
}

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

// ---------- Assembly (180° open) ----------
color("steelblue")  leaf(side="left");
color("slategray")  leaf(side="right");
color("gold")       pin();
i3 success
iter 3
14.1s · 2916/1455t · $0.0510
diff vs i2: +4/-1
  // Small butt hinge - 180° open state
  // Pin axis along Y, leaves on Z=0 plane (180° open)
  // Left leaf: x<0, knuckles at segments 0,2,4 (outer + middle)
  // Right leaf: x>0, knuckles at segments 1,3 (between)
  
  $fn = 64;
  
  // ---- Parameters ----
  leaf_w_total = 25;   // total leaf width including knuckle radius
  leaf_h       = 30;   // leaf height (along Y, hinge axis)
  leaf_t       = 2;    // leaf thickness
  knuckle_od   = 8;    // knuckle outer diameter
  knuckle_id   = 4.6;  // knuckle inner diameter (pin 4 + 0.6 clearance)
  pin_d        = 4;    // pin diameter
  pin_len      = 32;   // pin length (1mm overhang each end)
  seg          = 6;    // segment length (30 / 5)
  
  // Flat plate width (excluding the part occupied by knuckle radius)
  plate_w = leaf_w_total - knuckle_od/2;
  
  // Screw hole parameters
  screw_through_d = 3.2;
  screw_csk_d     = 6;
  screw_csk_depth = 1;
  screw_pitch     = 8;
  
+ // Pin overhang positioning: pin length 32mm, knuckles span 30mm => 1mm extra each side
+ pin_y_start = -1;
+ 
  // ---------- Leaf with knuckles ----------
  module leaf(side="left") {
      sign = (side=="left") ? -1 : 1;
      knuckle_segs = (side=="left") ? [0,2,4] : [1,3];
  
      difference() {
          union() {
              // Flat plate: inner edge tangent to knuckle outer cylinder
              if (side=="left") {
                  translate([-knuckle_od/2 - plate_w, 0, -leaf_t/2])
                      cube([plate_w, leaf_h, leaf_t]);
              } else {
                  translate([knuckle_od/2, 0, -leaf_t/2])
                      cube([plate_w, leaf_h, leaf_t]);
              }
  
              // Knuckles (cylinders) for this leaf
              for (i = knuckle_segs) {
                  translate([0, i*seg, 0])
                      rotate([-90, 0, 0])
                          cylinder(d=knuckle_od, h=seg);
              }
  
              // Web connecting plate to knuckle (so plate flush-merges with knuckle wall)
              for (i = knuckle_segs) {
                  if (side=="left")
                      translate([-knuckle_od/2, i*seg, -leaf_t/2])
                          cube([knuckle_od/2, seg, leaf_t]);
                  else
                      translate([0, i*seg, -leaf_t/2])
                          cube([knuckle_od/2, seg, leaf_t]);
              }
          }
  
          // Pin hole through knuckles
          translate([0, -1, 0])
              rotate([-90, 0, 0])
                  cylinder(d=knuckle_id, h=leaf_h + 2);
  
          // Screw holes (3 along Y), centered on the flat plate
          hole_x = sign * (knuckle_od/2 + plate_w/2);
          y_center = leaf_h/2;
          for (i = [-1, 0, 1]) {
              y = y_center + i*screw_pitch;
              // Through hole
              translate([hole_x, y, -leaf_t/2 - 0.1])
                  cylinder(d=screw_through_d, h=leaf_t + 0.2);
              // Countersink on +Z (visible) face
              translate([hole_x, y, leaf_t/2 - screw_csk_depth])
                  cylinder(d1=screw_through_d, d2=screw_csk_d,
                           h=screw_csk_depth + 0.01);
          }
      }
  }
  
  // ---------- Pin ----------
  module pin() {
-     translate([0, -1, 0])
+     translate([0, pin_y_start, 0])
          rotate([-90, 0, 0])
              cylinder(d=pin_d, h=pin_len);
  }
  
  // ---------- Assembly (180° open) ----------
  color("steelblue")  leaf(side="left");
  color("slategray")  leaf(side="right");
  color("gold")       pin();
SCAD (95 lines)
// Small butt hinge - 180° open state
// Pin axis along Y, leaves on Z=0 plane (180° open)
// Left leaf: x<0, knuckles at segments 0,2,4 (outer + middle)
// Right leaf: x>0, knuckles at segments 1,3 (between)

$fn = 64;

// ---- Parameters ----
leaf_w_total = 25;   // total leaf width including knuckle radius
leaf_h       = 30;   // leaf height (along Y, hinge axis)
leaf_t       = 2;    // leaf thickness
knuckle_od   = 8;    // knuckle outer diameter
knuckle_id   = 4.6;  // knuckle inner diameter (pin 4 + 0.6 clearance)
pin_d        = 4;    // pin diameter
pin_len      = 32;   // pin length (1mm overhang each end)
seg          = 6;    // segment length (30 / 5)

// Flat plate width (excluding the part occupied by knuckle radius)
plate_w = leaf_w_total - knuckle_od/2;

// Screw hole parameters
screw_through_d = 3.2;
screw_csk_d     = 6;
screw_csk_depth = 1;
screw_pitch     = 8;

// Pin overhang positioning: pin length 32mm, knuckles span 30mm => 1mm extra each side
pin_y_start = -1;

// ---------- Leaf with knuckles ----------
module leaf(side="left") {
    sign = (side=="left") ? -1 : 1;
    knuckle_segs = (side=="left") ? [0,2,4] : [1,3];

    difference() {
        union() {
            // Flat plate: inner edge tangent to knuckle outer cylinder
            if (side=="left") {
                translate([-knuckle_od/2 - plate_w, 0, -leaf_t/2])
                    cube([plate_w, leaf_h, leaf_t]);
            } else {
                translate([knuckle_od/2, 0, -leaf_t/2])
                    cube([plate_w, leaf_h, leaf_t]);
            }

            // Knuckles (cylinders) for this leaf
            for (i = knuckle_segs) {
                translate([0, i*seg, 0])
                    rotate([-90, 0, 0])
                        cylinder(d=knuckle_od, h=seg);
            }

            // Web connecting plate to knuckle (so plate flush-merges with knuckle wall)
            for (i = knuckle_segs) {
                if (side=="left")
                    translate([-knuckle_od/2, i*seg, -leaf_t/2])
                        cube([knuckle_od/2, seg, leaf_t]);
                else
                    translate([0, i*seg, -leaf_t/2])
                        cube([knuckle_od/2, seg, leaf_t]);
            }
        }

        // Pin hole through knuckles
        translate([0, -1, 0])
            rotate([-90, 0, 0])
                cylinder(d=knuckle_id, h=leaf_h + 2);

        // Screw holes (3 along Y), centered on the flat plate
        hole_x = sign * (knuckle_od/2 + plate_w/2);
        y_center = leaf_h/2;
        for (i = [-1, 0, 1]) {
            y = y_center + i*screw_pitch;
            // Through hole
            translate([hole_x, y, -leaf_t/2 - 0.1])
                cylinder(d=screw_through_d, h=leaf_t + 0.2);
            // Countersink on +Z (visible) face
            translate([hole_x, y, leaf_t/2 - screw_csk_depth])
                cylinder(d1=screw_through_d, d2=screw_csk_d,
                         h=screw_csk_depth + 0.01);
        }
    }
}

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

// ---------- Assembly (180° open) ----------
color("steelblue")  leaf(side="left");
color("slategray")  leaf(side="right");
color("gold")       pin();