vibe-openscad

tier-3-butt-hinge / gpt-5-nano-2025-08-07

7 run / 累計 1323.7s / 累計 $0.0450

openai gpt 5 nano 2025-08-07 bare

bare (provider default effort)

run detail →
render
bare render of tier-3-butt-hinge
loading STL…
success 239.4s · 592/25418t · $0.0102
SCAD (109 lines)
// OpenSCAD: 2 leaves + pin axis butt hinge (180° open state)

// Dimensions (mm)
leaf_w  = 25;
leaf_h  = 30;
leaf_t  = 2;

knuckle_d = 8;     // outer knuckle diameter
knuckle_r = knuckle_d/2;
pin_d     = 4;     // pin diameter
pin_r     = pin_d/2;
hole_d    = 4.6;   // inner hole diameter for knuckle/pin clearance (approx)
hole_r    = hole_d/2;

// Arrays defining knuckle positions along Y (as described)
left_knuckles_y  = [-12, 0, 12];   // 3 knuckles on left leaf (X ~ -4)
right_knuckles_y = [-6, 6];       // 2 knuckles on right leaf (X ~ +4)

left_holes_y  = [-12, 0, 12];      // interleaved knuckle holes on left (Y positions)
right_holes_y = [-6, 6];            // interleaved knuckle holes on right (Y positions)

// Base left leaf (X negative side)
module left_leaf() {
    difference() {
        // Base plate for left leaf: X from -25 to 0, Y from -15 to 15, Z from 0 to 2
        translate([-25, -15, 0])
            cube([25, 30, 2], center = false);

        // Left knuckles: cylindrical bosses (outer diameter 8 mm) along Y
        for (y = left_knuckles_y) {
            translate([-4, y, 1])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = knuckle_r, center = true);
        }

        // Holes for pin along Y (inner diameter 4.6 mm)
        for (y = left_holes_y) {
            translate([0, y, 0])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = hole_r, center = true);
        }

        // M3 mounting holes (approximate via simple through-hole cylinders)
        // 3 holes with 8 mm pitch along Y; using through holes (simplified)
        for (y = [-12, -4, 4]) {
            translate([0, y, 0])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = 1.6, center = true);
        }
    }
}

// Base right leaf (X positive side)
module right_leaf() {
    difference() {
        // Base plate for right leaf: X from 0 to 25, Y -15 to 15, Z 0 to 2
        translate([0, -15, 0])
            cube([25, 30, 2], center = false);

        // Right knuckles: cylindrical bosses along Y
        for (y = right_knuckles_y) {
            translate([4, y, 1])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = knuckle_r, center = true);
        }

        // Holes for pin along Y (inner diameter 4.6 mm)
        for (y = right_holes_y) {
            translate([0, y, 0])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = hole_r, center = true);
        }

        // M3 mounting holes (simplified)
        for (y = [-6, 0, 6]) {
            translate([0, y, 0])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = 1.6, center = true);
        }
    }
}

// Pin axis (along Y, centered at origin, length 32 mm to protrude 1 mm past each leaf)
module pin_axis() {
    // Cylinder along Y by rotating a Z-axis cylinder
    rotate([0, 0, 0])
        rotate([90, 0, 0])
            cylinder(h = 32, r = pin_r, center = true);
}

// Assemble hinge in 180° open state:
// - left leaf at X < 0
// - right leaf rotated 180° around hinge axis (Y) to lie in the same plane as left leaf (open state)
module hinge_open_state() {
    union() {
        left_leaf();
        // Opened state: rotate the right leaf around hinge axis (Y) by 180°
        rotate([0, 180, 0])
            right_leaf();
        // Pin passes through both leaves
        pin_axis();
    }
}

// Increase resolution for circles/arcs if desired
$fn = 60;

// Output final model
hinge_open_state();
パラメータ (6)
スライダを動かすと 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 render_error render
render_error
32.6s · 592/3188t · $0.0013
openscad stl render failed (exit 1): ERROR: Parser error: syntax error in file ../../../../../tmp/render-KQqIvz/input.scad, line 132
Can't parse file '/tmp/render-KQqIvz/input.scad'!

SCAD (139 lines)
// Butt hinge for furniture (3 parts: left plate, right plate, pin axis)
// Opened 180 degrees, plates in same plane (Y axis is hinge axis, X is opening direction, Z is plate thickness)

// Parameters (adjustable)
plate_length_Y = 30;      // along Y
plate_width_X  = 25;       // along X (opening direction)
plate_thick    = 2;        // Z thickness
knuckle_outer_D = 8;        // outer diameter of knuckle
knuckle_inner_D = 4.6;      // inner diameter (pin clearance)
knuckle_count  = 5;         // 5 knuckles along Y
knuckle_pitch  = 6;         // 6 mm between knuckles
pin_d          = 4;         // pin diameter
pin_len        = 32;        // total pin length through knuckles
// The knuckles sit around the pin along Y, centered at Y = -12, -6, 0, 6, 12

// Holes for M3 countersunk (皿穴) at each plate away from knuckles
m3_counterbore_d = 6;        // countersunk hole diameter (表面直径)
m3_counterbore_depth = 1;     // countersunk depth
m3_thru_d = 3.2;               // through hole for M3 bolt

$fn = 100;

// Helper: position left plate (x from -plate_width_X to 0)
module left_plate(){
    difference(){
        // main plate
        translate([-plate_width_X, -plate_length_Y/2, -plate_thick/2])
            cube([plate_width_X, plate_length_Y, plate_thick], center = false);

        // through hole for hinge pin at each knuckle position (4.6 mm diameter clearance hole)
        for(i=[-2,-1,0,1,2]){
            Y = i*knuckle_pitch;
            // Centerline along Y, hole through entire plate thickness
            translate([ -plate_width_X, Y - 1, 0 ])
                // Create hole partially by aligning to the plate: use a vertical cylinder along Z
                // Since plate is flat in Z, we use translate and rotate to drill perpendicularly to Z
                // We want a through hole in the plate along Z: use cylinder along Z axis
                cylinder(h = plate_thick + 0.1, d = knuckle_inner_D + 0.4, center = true);
        }

        // Knuckle sleeves (external 8 mm diameter, around the pin) on the left plate side
        // For visualization/assembly: hollow cylinders with inner hole for pin
        translate([ -plate_width_X/2, -plate_length_Y/2, -plate_thick/2 ])
            rotate([0,0,0])
            difference(){
                // Outer knuckle cylinders positioned along Y at 5 centers on left plate side
                // We'll place the left plate knuckles (3) at Y = -12, 0, 12
            }
        // We implement knuckles as cylindrical sleeves: from left plate side toward center
        // Here simply draw 3 sleeves near the plate face (visual aid)
        for(y=[-12,0,12]){
            translate([ -plate_width_X + plate_thick/2, y, 0 ])
                rotate([0,90,0])
                cylinder(h = plate_thick, d = knuckle_outer_D, center = true);
        }
    }
}

// Helper: position right plate
module right_plate(){
    difference(){
        translate([0, -plate_length_Y/2, -plate_thick/2])
            cube([plate_width_X, plate_length_Y, plate_thick], center = false);

        // pin clearance holes through right plate
        for(i=[-2,-1,0,1,2]){
            Y = i*knuckle_pitch;
            translate([0, Y, 0])
                cylinder(h = plate_thick + 0.1, d = knuckle_inner_D + 0.4, center = true);
        }

        // Knuckles on right plate: 2 knuckles at Y = -6, 6
        for(y=[-6,6]){
            translate([ plate_width_X/2, y, 0 ])
                rotate([0,90,0])
                cylinder(h = plate_thick, d = knuckle_outer_D, center = true);
        }
    }
}

// Pin axis: cylindrical rod along Y, diameter 4 mm, length 32 mm
module pin_axis(){
    // The pin should pass through both plates and knuckles
    translate([0, -pin_len/2, 0])
        cylinder(h = pin_len, d = pin_d, center = true);
}

// Knuckle sleeves (outer diameter 8 mm, inner diameter 4.6 mm) around the pin
// These are conceptual: model as a set of hollow cylinders centered on X=0, at given Y,
// with their axis along Y (coaxial with pin). Since plates are offset in X, the sleeves straddle the pin.

module knuckles_around_pin(){
    // We will place 5 knuckles along Y at X=0, with y centers as described
    // Left plate knuckles: at Y = -12, 0, 12
    // Right plate knuckles: at Y = -6, 6
    // Outer sleeve length along X-direction is plate_thick (2mm) on each side
    // For visualization, create hollow cylinders around the pin axis
    knuckle_positions = [ -12, -6, 0, 6, 12 ];
    for(i=[0:4]){
        y = knuckle_positions[i];
        // Outer sleeve centered at X=0, Y=y
        translate([0, y, 0])
            // Create hollow cylinder: outer diameter 8, inner hole 4.6, length spanning both plates
            rotate([0,90,0])
            difference(){
                cylinder(h = plate_thick*2 + 0.1, d = knuckle_outer_D, center = true);
                cylinder(h = plate_thick*2 + 0.1, d = knuckle_inner_D, center = true);
            }
    }
}

// Now assemble all parts with plates in open 180 deg configuration
// We place left and right plates in same plane when opened, i.e., rotate right plate by 180 degrees about pin axis (Y)
// Also position so that plate flat surfaces align in a single plane (Z ~ 0)

module assembly_open180(){
    // Open 180 degrees: rotate right plate around Y axis by 180° so the flat faces coincide
    // Place left plate at X<0, right plate at X>0 before rotation
    // Base plane for reference
    translate([ -plate_width_X, 0, 0 ]) {
        // Left plate
        left_plate();
    }
    // Right plate, rotated around Y axis by 180° about pin axis at X=0
    translate([ 0, 0, 0 ]) {
        rotate([0,180,0])
            right_plate();
    }
    // Pin axis centered at X=0, Y = 0 (center between plates)
    // The pin passes through both knuckles
    pin_pos_gizmo = translate([0, 0, 0])
        pin_axis();

    // Knuckle sleeves visualization for whole hinge
    knuckles_around_pin();
}

// Main
assembly_open180();
medium (default) success
medium
239.4s · 592/25418t · $0.0102
SCAD (109 lines)
// OpenSCAD: 2 leaves + pin axis butt hinge (180° open state)

// Dimensions (mm)
leaf_w  = 25;
leaf_h  = 30;
leaf_t  = 2;

knuckle_d = 8;     // outer knuckle diameter
knuckle_r = knuckle_d/2;
pin_d     = 4;     // pin diameter
pin_r     = pin_d/2;
hole_d    = 4.6;   // inner hole diameter for knuckle/pin clearance (approx)
hole_r    = hole_d/2;

// Arrays defining knuckle positions along Y (as described)
left_knuckles_y  = [-12, 0, 12];   // 3 knuckles on left leaf (X ~ -4)
right_knuckles_y = [-6, 6];       // 2 knuckles on right leaf (X ~ +4)

left_holes_y  = [-12, 0, 12];      // interleaved knuckle holes on left (Y positions)
right_holes_y = [-6, 6];            // interleaved knuckle holes on right (Y positions)

// Base left leaf (X negative side)
module left_leaf() {
    difference() {
        // Base plate for left leaf: X from -25 to 0, Y from -15 to 15, Z from 0 to 2
        translate([-25, -15, 0])
            cube([25, 30, 2], center = false);

        // Left knuckles: cylindrical bosses (outer diameter 8 mm) along Y
        for (y = left_knuckles_y) {
            translate([-4, y, 1])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = knuckle_r, center = true);
        }

        // Holes for pin along Y (inner diameter 4.6 mm)
        for (y = left_holes_y) {
            translate([0, y, 0])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = hole_r, center = true);
        }

        // M3 mounting holes (approximate via simple through-hole cylinders)
        // 3 holes with 8 mm pitch along Y; using through holes (simplified)
        for (y = [-12, -4, 4]) {
            translate([0, y, 0])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = 1.6, center = true);
        }
    }
}

// Base right leaf (X positive side)
module right_leaf() {
    difference() {
        // Base plate for right leaf: X from 0 to 25, Y -15 to 15, Z 0 to 2
        translate([0, -15, 0])
            cube([25, 30, 2], center = false);

        // Right knuckles: cylindrical bosses along Y
        for (y = right_knuckles_y) {
            translate([4, y, 1])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = knuckle_r, center = true);
        }

        // Holes for pin along Y (inner diameter 4.6 mm)
        for (y = right_holes_y) {
            translate([0, y, 0])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = hole_r, center = true);
        }

        // M3 mounting holes (simplified)
        for (y = [-6, 0, 6]) {
            translate([0, y, 0])
                rotate([90, 0, 0])
                    cylinder(h = 30, r = 1.6, center = true);
        }
    }
}

// Pin axis (along Y, centered at origin, length 32 mm to protrude 1 mm past each leaf)
module pin_axis() {
    // Cylinder along Y by rotating a Z-axis cylinder
    rotate([0, 0, 0])
        rotate([90, 0, 0])
            cylinder(h = 32, r = pin_r, center = true);
}

// Assemble hinge in 180° open state:
// - left leaf at X < 0
// - right leaf rotated 180° around hinge axis (Y) to lie in the same plane as left leaf (open state)
module hinge_open_state() {
    union() {
        left_leaf();
        // Opened state: rotate the right leaf around hinge axis (Y) by 180°
        rotate([0, 180, 0])
            right_leaf();
        // Pin passes through both leaves
        pin_axis();
    }
}

// Increase resolution for circles/arcs if desired
$fn = 60;

// Output final model
hinge_open_state();
high no_code nocode
no_code
278.5s
model returned empty response (stopReason=in_progress)
SCAD (1 lines)

no SCAD

maxnot run
xhighnot run

iteration: iter-png

i1 success
iter 1
214.5s · 2439/22819t · $0.0092
diff vs bare: +71/-71
- // OpenSCAD: 2 leaves + pin axis butt hinge (180° open state)
+ // OpenSCAD: 改善版 butt hinge (180° 開き) - 左板/右板/ピン軸
+ // 寸法は元の指示に準拠: 左右板 30x25x2, ピン軸 Ø4, 全体 knuckle Ø8, 内径 Ø4.6 (ピン間隙 0.3mm クリアランス)
+ // knuckle は縦方向 Y に 6mm刻み、左3個・右2個、左右別々の位置に配置
+ // 左板 x<0, 右板 x>0, 開いた状態は Y 軸中心線を共有して同一平面
  
- // Dimensions (mm)
- leaf_w  = 25;
- leaf_h  = 30;
- leaf_t  = 2;
+ // 板の基本寸法
+ leaf_W = 25;
+ leaf_H = 30;
+ leaf_T = 2;
  
- knuckle_d = 8;     // outer knuckle diameter
- knuckle_r = knuckle_d/2;
- pin_d     = 4;     // pin diameter
- pin_r     = pin_d/2;
- hole_d    = 4.6;   // inner hole diameter for knuckle/pin clearance (approx)
- hole_r    = hole_d/2;
+ // knuckle/ピンの寸法
+ knuckle_OD = 8;        // 外径
+ knuckle_R  = knuckle_OD/2;
+ pin_D      = 4;        // ピン径
+ pin_R      = pin_D/2;
+ hole_d     = 4.6;      // knuckle 内径 (ピン間隙)
+ hole_R     = hole_d/2;
  
- // Arrays defining knuckle positions along Y (as described)
- left_knuckles_y  = [-12, 0, 12];   // 3 knuckles on left leaf (X ~ -4)
- right_knuckles_y = [-6, 6];       // 2 knuckles on right leaf (X ~ +4)
+ // knuckle の配置(Y軸方向に 6mmごとに分割)
+ left_knuckles_Y  = [-12, 0, 12]; // 左板: 外側2個 + 中央1個
+ right_knuckles_Y = [-6, 6];      // 右板: 中間2個
  
- left_holes_y  = [-12, 0, 12];      // interleaved knuckle holes on left (Y positions)
- right_holes_y = [-6, 6];            // interleaved knuckle holes on right (Y positions)
+ // 左右板それぞれの knuckle から離れた側の皿穴(M3)位置
+ // 穴ピッチ 8mm(縦方向)、直径6mmのテーパ+ 直径3.2mm 貫通穴
+ // テーパはTop面近傍1mm深さ
+ M3_pocket_Y_left  = [-12, -4, 4];
+ M3_pocket_Y_right = [-6, 0, 6];
  
- // Base left leaf (X negative side)
+ // 内部ヘルパー: knuckle(左用/右用)を X 軸正方向または負方向に配置
+ module left_knuckle(y) {
+     translate([-4, y, 1])
+         rotate([90, 0, 0])
+             cylinder(h = leaf_H, r = knuckle_R, center = true);
+ }
+ module right_knuckle(y) {
+     translate([4, y, 1])
+         rotate([90, 0, 0])
+             cylinder(h = leaf_H, r = knuckle_R, center = true);
+ }
+ 
+ // M3皿穴の実装( countersink + through hole )
+ module m3_hole_at(x, y) {
+     // countersink (6mm diam, depth 1mm from top surface)
+     // 上面は z = leaf_T、下は z = leaf_T - 1
+     translate([x, y, leaf_T - 1])
+         cylinder(h = 1, r1 = 3, r2 = 0, center = false);
+ 
+     // 貫通穴 (3.2mm dia) 貫通高さは板厚分
+     translate([x, y, 0])
+         cylinder(h = leaf_T, r = 1.6, center = false);
+ }
+ 
+ // 左板 (X < 0)
  module left_leaf() {
      difference() {
-         // Base plate for left leaf: X from -25 to 0, Y from -15 to 15, Z from 0 to 2
+         // 左板: 原点基準で -25 <= X <= 0
          translate([-25, -15, 0])
              cube([25, 30, 2], center = false);
  
-         // Left knuckles: cylindrical bosses (outer diameter 8 mm) along Y
-         for (y = left_knuckles_y) {
-             translate([-4, y, 1])
-                 rotate([90, 0, 0])
-                     cylinder(h = 30, r = knuckle_r, center = true);
-         }
+         // knuckle(左板 / 左側の外側2個 + 中央1個)
+         for (y = left_knuckles_Y)
+             left_knuckle(y);
  
-         // Holes for pin along Y (inner diameter 4.6 mm)
-         for (y = left_holes_y) {
-             translate([0, y, 0])
-                 rotate([90, 0, 0])
-                     cylinder(h = 30, r = hole_r, center = true);
-         }
- 
-         // M3 mounting holes (approximate via simple through-hole cylinders)
-         // 3 holes with 8 mm pitch along Y; using through holes (simplified)
-         for (y = [-12, -4, 4]) {
-             translate([0, y, 0])
-                 rotate([90, 0, 0])
-                     cylinder(h = 30, r = 1.6, center = true);
-         }
+         // knuckle から離れた側の M3皿穴
+         for (y = M3_pocket_Y_left)
+             m3_hole_at(-4, y);
      }
  }
  
- // Base right leaf (X positive side)
+ // 右板 (X > 0)
  module right_leaf() {
      difference() {
-         // Base plate for right leaf: X from 0 to 25, Y -15 to 15, Z 0 to 2
+         // 右板: 0 <= X <= 25
          translate([0, -15, 0])
              cube([25, 30, 2], center = false);
  
-         // Right knuckles: cylindrical bosses along Y
-         for (y = right_knuckles_y) {
-             translate([4, y, 1])
-                 rotate([90, 0, 0])
-                     cylinder(h = 30, r = knuckle_r, center = true);
-         }
+         // knuckle(右板 / 中間2個)
+         for (y = right_knuckles_Y)
+             right_knuckle(y);
  
-         // Holes for pin along Y (inner diameter 4.6 mm)
-         for (y = right_holes_y) {
-             translate([0, y, 0])
-                 rotate([90, 0, 0])
-                     cylinder(h = 30, r = hole_r, center = true);
-         }
- 
-         // M3 mounting holes (simplified)
-         for (y = [-6, 0, 6]) {
-             translate([0, y, 0])
-                 rotate([90, 0, 0])
-                     cylinder(h = 30, r = 1.6, center = true);
-         }
+         // knuckle から離れた側の M3皿穴
+         for (y = M3_pocket_Y_right)
+             m3_hole_at(4, y);
      }
  }
  
- // Pin axis (along Y, centered at origin, length 32 mm to protrude 1 mm past each leaf)
+ // ピン軸(Y軸方向、+Y方向)
+ // 開いた状態では両板の平面が一致するよう、X=0 の中心線を通る
  module pin_axis() {
-     // Cylinder along Y by rotating a Z-axis cylinder
-     rotate([0, 0, 0])
-         rotate([90, 0, 0])
-             cylinder(h = 32, r = pin_r, center = true);
+     // Z軸方向の円柱をY軸方向に回転して配置
+     rotate([90, 0, 0])
+         cylinder(h = 32, r = pin_R, center = true);
  }
  
- // Assemble hinge in 180° open state:
- // - left leaf at X < 0
- // - right leaf rotated 180° around hinge axis (Y) to lie in the same plane as left leaf (open state)
+ // 完成品: 180° 開いた状態で配置
  module hinge_open_state() {
      union() {
          left_leaf();
-         // Opened state: rotate the right leaf around hinge axis (Y) by 180°
          rotate([0, 180, 0])
              right_leaf();
-         // Pin passes through both leaves
          pin_axis();
      }
  }
  
- // Increase resolution for circles/arcs if desired
+ // 解像度
  $fn = 60;
  
- // Output final model
+ // 出力
  hinge_open_state();
SCAD (109 lines)
// OpenSCAD: 改善版 butt hinge (180° 開き) - 左板/右板/ピン軸
// 寸法は元の指示に準拠: 左右板 30x25x2, ピン軸 Ø4, 全体 knuckle Ø8, 内径 Ø4.6 (ピン間隙 0.3mm クリアランス)
// knuckle は縦方向 Y に 6mm刻み、左3個・右2個、左右別々の位置に配置
// 左板 x<0, 右板 x>0, 開いた状態は Y 軸中心線を共有して同一平面

// 板の基本寸法
leaf_W = 25;
leaf_H = 30;
leaf_T = 2;

// knuckle/ピンの寸法
knuckle_OD = 8;        // 外径
knuckle_R  = knuckle_OD/2;
pin_D      = 4;        // ピン径
pin_R      = pin_D/2;
hole_d     = 4.6;      // knuckle 内径 (ピン間隙)
hole_R     = hole_d/2;

// knuckle の配置(Y軸方向に 6mmごとに分割)
left_knuckles_Y  = [-12, 0, 12]; // 左板: 外側2個 + 中央1個
right_knuckles_Y = [-6, 6];      // 右板: 中間2個

// 左右板それぞれの knuckle から離れた側の皿穴(M3)位置
// 穴ピッチ 8mm(縦方向)、直径6mmのテーパ+ 直径3.2mm 貫通穴
// テーパはTop面近傍1mm深さ
M3_pocket_Y_left  = [-12, -4, 4];
M3_pocket_Y_right = [-6, 0, 6];

// 内部ヘルパー: knuckle(左用/右用)を X 軸正方向または負方向に配置
module left_knuckle(y) {
    translate([-4, y, 1])
        rotate([90, 0, 0])
            cylinder(h = leaf_H, r = knuckle_R, center = true);
}
module right_knuckle(y) {
    translate([4, y, 1])
        rotate([90, 0, 0])
            cylinder(h = leaf_H, r = knuckle_R, center = true);
}

// M3皿穴の実装( countersink + through hole )
module m3_hole_at(x, y) {
    // countersink (6mm diam, depth 1mm from top surface)
    // 上面は z = leaf_T、下は z = leaf_T - 1
    translate([x, y, leaf_T - 1])
        cylinder(h = 1, r1 = 3, r2 = 0, center = false);

    // 貫通穴 (3.2mm dia) 貫通高さは板厚分
    translate([x, y, 0])
        cylinder(h = leaf_T, r = 1.6, center = false);
}

// 左板 (X < 0)
module left_leaf() {
    difference() {
        // 左板: 原点基準で -25 <= X <= 0
        translate([-25, -15, 0])
            cube([25, 30, 2], center = false);

        // knuckle(左板 / 左側の外側2個 + 中央1個)
        for (y = left_knuckles_Y)
            left_knuckle(y);

        // knuckle から離れた側の M3皿穴
        for (y = M3_pocket_Y_left)
            m3_hole_at(-4, y);
    }
}

// 右板 (X > 0)
module right_leaf() {
    difference() {
        // 右板: 0 <= X <= 25
        translate([0, -15, 0])
            cube([25, 30, 2], center = false);

        // knuckle(右板 / 中間2個)
        for (y = right_knuckles_Y)
            right_knuckle(y);

        // knuckle から離れた側の M3皿穴
        for (y = M3_pocket_Y_right)
            m3_hole_at(4, y);
    }
}

// ピン軸(Y軸方向、+Y方向)
// 開いた状態では両板の平面が一致するよう、X=0 の中心線を通る
module pin_axis() {
    // Z軸方向の円柱をY軸方向に回転して配置
    rotate([90, 0, 0])
        cylinder(h = 32, r = pin_R, center = true);
}

// 完成品: 180° 開いた状態で配置
module hinge_open_state() {
    union() {
        left_leaf();
        rotate([0, 180, 0])
            right_leaf();
        pin_axis();
    }
}

// 解像度
$fn = 60;

// 出力
hinge_open_state();
i2 success
iter 2
179.9s · 2549/17946t · $0.0073
diff vs i1: +52/-56
- // OpenSCAD: 改善版 butt hinge (180° 開き) - 左板/右板/ピン軸
- // 寸法は元の指示に準拠: 左右板 30x25x2, ピン軸 Ø4, 全体 knuckle Ø8, 内径 Ø4.6 (ピン間隙 0.3mm クリアランス)
- // knuckle は縦方向 Y に 6mm刻み、左3個・右2個、左右別々の位置に配置
- // 左板 x<0, 右板 x>0, 開いた状態は Y 軸中心線を共有して同一平面
+ // 修正後 OpenSCAD: 家具用小型 butt hinge (180° 開き) - 左板/右板/ピン軸
+ // 前提仕様を厳密に反映するよう knuckle を中空構造で再実装し、
+ // knuckle 内径 4.6mm(ピン径 4mm に対する 0.3mmクリアランス)を確保します。
  
- // 板の基本寸法
- leaf_W = 25;
- leaf_H = 30;
- leaf_T = 2;
+ // 基本寸法
+ leaf_W = 25;      // 板の横幅 (X方向)
+ leaf_H = 30;      // 縦寸法 (Y方向)
+ leaf_T = 2;       // 厚さ (Z方向)
  
- // knuckle/ピンの寸法
- knuckle_OD = 8;        // 外径
+ // knuckle / ピン
+ knuckle_OD = 8;     // 外径
  knuckle_R  = knuckle_OD/2;
- pin_D      = 4;        // ピン径
- pin_R      = pin_D/2;
- hole_d     = 4.6;      // knuckle 内径 (ピン間隙)
+ hole_d     = 4.6;   // knuckle 内径
  hole_R     = hole_d/2;
+ pin_D      = 4;     // ピン径
+ pin_R      = pin_D/2;
  
- // knuckle の配置(Y軸方向に 6mmごとに分割)
- left_knuckles_Y  = [-12, 0, 12]; // 左板: 外側2個 + 中央1個
- right_knuckles_Y = [-6, 6];      // 右板: 中間2個
+ // knuckle のY方向分割
+ left_knuckles_Y  = [-12, 0, 12];  // 左板: 外側2個 + 中央1個
+ right_knuckles_Y = [-6, 6];       // 右板: 中間2個
  
- // 左右板それぞれの knuckle から離れた側の皿穴(M3)位置
- // 穴ピッチ 8mm(縦方向)、直径6mmのテーパ+ 直径3.2mm 貫通穴
- // テーパはTop面近傍1mm深さ
+ // knuckle から離れた側の皿穴位置(M3)
  M3_pocket_Y_left  = [-12, -4, 4];
- M3_pocket_Y_right = [-6, 0, 6];
+ M3_pocket_Y_right = [-12, -4, 4];
  
- // 内部ヘルパー: knuckle(左用/右用)を X 軸正方向または負方向に配置
- module left_knuckle(y) {
-     translate([-4, y, 1])
+ // 筐体カラーのための座標系に合わせたオフセット
+ // 左板: X=-25〜0、右板: X=0〜25、Z=0〜2
+ // knuckle は X 軸方向に -4(左)/ +4(右)を中心とする
+ $fn = 60;
+ 
+ // knuckle: 単一の knuckle を左・右で使い分け、外径 8mm/内径 4.6mm の中空筒を Y 軸方向に配置
+ module hollow_knuckle(isLeft, y) {
+     x = isLeft ? -4 : 4;
+     translate([x, y, 1])
          rotate([90, 0, 0])
-             cylinder(h = leaf_H, r = knuckle_R, center = true);
+             difference() {
+                 // 外筒 (knuckle 外径)
+                 cylinder(h = leaf_H, r = knuckle_R, center = true);
+                 // 内穴 (ピン軸径 + 0.3mm クリアランス → 4.6mm)
+                 cylinder(h = leaf_H, r = hole_R, center = true);
+             }
  }
- module right_knuckle(y) {
-     translate([4, y, 1])
-         rotate([90, 0, 0])
-             cylinder(h = leaf_H, r = knuckle_R, center = true);
- }
  
- // M3皿穴の実装( countersink + through hole )
+ // M3 皿穴 + テーパ付き countersink
  module m3_hole_at(x, y) {
-     // countersink (6mm diam, depth 1mm from top surface)
-     // 上面は z = leaf_T、下は z = leaf_T - 1
+     // countersink: 表面から depth 1mm, dia 6mm
      translate([x, y, leaf_T - 1])
          cylinder(h = 1, r1 = 3, r2 = 0, center = false);
  
-     // 貫通穴 (3.2mm dia) 貫通高さは板厚分
+     // 貫通穴: 3.2mm dia
      translate([x, y, 0])
          cylinder(h = leaf_T, r = 1.6, center = false);
  }
  
- // 左板 (X < 0)
+ // 左板 (X<0)
  module left_leaf() {
-     difference() {
-         // 左板: 原点基準で -25 <= X <= 0
+     union() {
+         // 左板本体
          translate([-25, -15, 0])
              cube([25, 30, 2], center = false);
  
-         // knuckle(左板 / 左側の外側2個 + 中央1個)
+         // knuckle(左板: 外側2個 + 中央1個)
          for (y = left_knuckles_Y)
-             left_knuckle(y);
+             hollow_knuckle(true, y);
  
-         // knuckle から離れた側の M3皿穴
+         // knuckle から離れた側の M3 皿穴
          for (y = M3_pocket_Y_left)
-             m3_hole_at(-4, y);
+             m3_hole_at(-20, y);
      }
  }
  
- // 右板 (X > 0)
+ // 右板 (X>0)
  module right_leaf() {
-     difference() {
-         // 右板: 0 <= X <= 25
+     union() {
+         // 右板本体
          translate([0, -15, 0])
              cube([25, 30, 2], center = false);
  
-         // knuckle(右板 / 中間2個)
+         // knuckle(右板: 中間2個)
          for (y = right_knuckles_Y)
-             right_knuckle(y);
+             hollow_knuckle(false, y);
  
-         // knuckle から離れた側の M3皿穴
+         // knuckle から離れた側の M3 皿穴
          for (y = M3_pocket_Y_right)
-             m3_hole_at(4, y);
+             m3_hole_at(20, y);
      }
  }
  
- // ピン軸(Y軸方向、+Y方向)
- // 開いた状態では両板の平面が一致するよう、X=0 の中心線を通る
+ // ピン軸(Y軸方向、+Y 方向に伸びる)
  module pin_axis() {
-     // Z軸方向の円柱をY軸方向に回転して配置
      rotate([90, 0, 0])
          cylinder(h = 32, r = pin_R, center = true);
  }
  
- // 完成品: 180° 開いた状態で配置
+ // 完成した180°開きの状態
  module hinge_open_state() {
      union() {
          left_leaf();
-         rotate([0, 180, 0])
-             right_leaf();
+         rotate([0, 180, 0]) right_leaf();
          pin_axis();
      }
  }
  
- // 解像度
- $fn = 60;
- 
  // 出力
  hinge_open_state();
SCAD (105 lines)
// 修正後 OpenSCAD: 家具用小型 butt hinge (180° 開き) - 左板/右板/ピン軸
// 前提仕様を厳密に反映するよう knuckle を中空構造で再実装し、
// knuckle 内径 4.6mm(ピン径 4mm に対する 0.3mmクリアランス)を確保します。

// 基本寸法
leaf_W = 25;      // 板の横幅 (X方向)
leaf_H = 30;      // 縦寸法 (Y方向)
leaf_T = 2;       // 厚さ (Z方向)

// knuckle / ピン
knuckle_OD = 8;     // 外径
knuckle_R  = knuckle_OD/2;
hole_d     = 4.6;   // knuckle 内径
hole_R     = hole_d/2;
pin_D      = 4;     // ピン径
pin_R      = pin_D/2;

// knuckle のY方向分割
left_knuckles_Y  = [-12, 0, 12];  // 左板: 外側2個 + 中央1個
right_knuckles_Y = [-6, 6];       // 右板: 中間2個

// knuckle から離れた側の皿穴位置(M3)
M3_pocket_Y_left  = [-12, -4, 4];
M3_pocket_Y_right = [-12, -4, 4];

// 筐体カラーのための座標系に合わせたオフセット
// 左板: X=-25〜0、右板: X=0〜25、Z=0〜2
// knuckle は X 軸方向に -4(左)/ +4(右)を中心とする
$fn = 60;

// knuckle: 単一の knuckle を左・右で使い分け、外径 8mm/内径 4.6mm の中空筒を Y 軸方向に配置
module hollow_knuckle(isLeft, y) {
    x = isLeft ? -4 : 4;
    translate([x, y, 1])
        rotate([90, 0, 0])
            difference() {
                // 外筒 (knuckle 外径)
                cylinder(h = leaf_H, r = knuckle_R, center = true);
                // 内穴 (ピン軸径 + 0.3mm クリアランス → 4.6mm)
                cylinder(h = leaf_H, r = hole_R, center = true);
            }
}

// M3 皿穴 + テーパ付き countersink
module m3_hole_at(x, y) {
    // countersink: 表面から depth 1mm, dia 6mm
    translate([x, y, leaf_T - 1])
        cylinder(h = 1, r1 = 3, r2 = 0, center = false);

    // 貫通穴: 3.2mm dia
    translate([x, y, 0])
        cylinder(h = leaf_T, r = 1.6, center = false);
}

// 左板 (X<0)
module left_leaf() {
    union() {
        // 左板本体
        translate([-25, -15, 0])
            cube([25, 30, 2], center = false);

        // knuckle(左板: 外側2個 + 中央1個)
        for (y = left_knuckles_Y)
            hollow_knuckle(true, y);

        // knuckle から離れた側の M3 皿穴
        for (y = M3_pocket_Y_left)
            m3_hole_at(-20, y);
    }
}

// 右板 (X>0)
module right_leaf() {
    union() {
        // 右板本体
        translate([0, -15, 0])
            cube([25, 30, 2], center = false);

        // knuckle(右板: 中間2個)
        for (y = right_knuckles_Y)
            hollow_knuckle(false, y);

        // knuckle から離れた側の M3 皿穴
        for (y = M3_pocket_Y_right)
            m3_hole_at(20, y);
    }
}

// ピン軸(Y軸方向、+Y 方向に伸びる)
module pin_axis() {
    rotate([90, 0, 0])
        cylinder(h = 32, r = pin_R, center = true);
}

// 完成した180°開きの状態
module hinge_open_state() {
    union() {
        left_leaf();
        rotate([0, 180, 0]) right_leaf();
        pin_axis();
    }
}

// 出力
hinge_open_state();
i3 success
iter 3
139.6s · 2465/16514t · $0.0067
diff vs i2: +29/-24
- // 修正後 OpenSCAD: 家具用小型 butt hinge (180° 開き) - 左板/右板/ピン軸
- // 前提仕様を厳密に反映するよう knuckle を中空構造で再実装し、
- // knuckle 内径 4.6mm(ピン径 4mm に対する 0.3mmクリアランス)を確保します。
+ // 修正点: knuckle の長さを各セグメント6mmに修正、180°開放時の回転軸をヒンジ軸(X=0, Z中心線)周りに適用するよう修正
+ // 左板/右板/ピン軸を組み合わせた完成品(180°開き)を1ファイル内で出力
  
  // 基本寸法
  leaf_W = 25;      // 板の横幅 (X方向)
  leaf_H = 30;      // 縦寸法 (Y方向)
  leaf_T = 2;       // 厚さ (Z方向)
  
  // knuckle / ピン
  knuckle_OD = 8;     // 外径
  knuckle_R  = knuckle_OD/2;
- hole_d     = 4.6;   // knuckle 内径
+ hole_d     = 4.6;   // knuckle 内径(ピン軸 + 0.3mmクリアランス)
  hole_R     = hole_d/2;
  pin_D      = 4;     // ピン径
  pin_R      = pin_D/2;
  
- // knuckle のY方向分割
+ // knuckle の Y 方向分割(各セグメントの長さは 6mm)
  left_knuckles_Y  = [-12, 0, 12];  // 左板: 外側2個 + 中央1個
  right_knuckles_Y = [-6, 6];       // 右板: 中間2個
  
- // knuckle から離れた側の皿穴位置(M3)
+ // knuckle から離れた側の皿穴(M3)
  M3_pocket_Y_left  = [-12, -4, 4];
  M3_pocket_Y_right = [-12, -4, 4];
  
- // 筐体カラーのための座標系に合わせたオフセット
- // 左板: X=-25〜0、右板: X=0〜25、Z=0〜2
- // knuckle は X 軸方向に -4(左)/ +4(右)を中心とする
+ // 左板/右板の位置
+ // 左板: X ∈ [-25, 0], Y ∈ [-15, 15], Z ∈ [0, 2]
+ // 右板: X ∈ [0, 25],  Y ∈ [-15, 15], Z ∈ [0, 2]
  $fn = 60;
  
- // knuckle: 単一の knuckle を左・右で使い分け、外径 8mm/内径 4.6mm の中空筒を Y 軸方向に配置
+ // knuckle: 左右それぞれのセグメントを X 軸方向に -4/+4 にずらして配置
  module hollow_knuckle(isLeft, y) {
      x = isLeft ? -4 : 4;
      translate([x, y, 1])
          rotate([90, 0, 0])
+             // 各セグメントは長さ6mm
              difference() {
-                 // 外筒 (knuckle 外径)
-                 cylinder(h = leaf_H, r = knuckle_R, center = true);
-                 // 内穴 (ピン軸径 + 0.3mm クリアランス → 4.6mm)
-                 cylinder(h = leaf_H, r = hole_R, center = true);
+                 // 外筒
+                 cylinder(h = 6, r = knuckle_R, center = true);
+                 // 内穴 (ピン軸 + 0.3mm クリアランス = 4.6mm)
+                 cylinder(h = 6, r = hole_R, center = true);
              }
  }
  
  // M3 皿穴 + テーパ付き countersink
  module m3_hole_at(x, y) {
-     // countersink: 表面から depth 1mm, dia 6mm
+     // countersink: 表面から depth 1mm, diameter 6mm
      translate([x, y, leaf_T - 1])
          cylinder(h = 1, r1 = 3, r2 = 0, center = false);
  
-     // 貫通穴: 3.2mm dia
+     // 貫通穴: 直径 3.2mm
      translate([x, y, 0])
          cylinder(h = leaf_T, r = 1.6, center = false);
  }
  
- // 左板 (X<0)
+ // 左板(X<0)
  module left_leaf() {
      union() {
          // 左板本体
          translate([-25, -15, 0])
              cube([25, 30, 2], center = false);
  
          // knuckle(左板: 外側2個 + 中央1個)
          for (y = left_knuckles_Y)
              hollow_knuckle(true, y);
  
          // knuckle から離れた側の M3 皿穴
          for (y = M3_pocket_Y_left)
              m3_hole_at(-20, y);
      }
  }
  
- // 右板 (X>0)
+ // 右板(X>0)
  module right_leaf() {
      union() {
          // 右板本体
          translate([0, -15, 0])
              cube([25, 30, 2], center = false);
  
          // knuckle(右板: 中間2個)
          for (y = right_knuckles_Y)
              hollow_knuckle(false, y);
  
          // knuckle から離れた側の M3 皿穴
          for (y = M3_pocket_Y_right)
              m3_hole_at(20, y);
      }
  }
  
  // ピン軸(Y軸方向、+Y 方向に伸びる)
  module pin_axis() {
      rotate([90, 0, 0])
          cylinder(h = 32, r = pin_R, center = true);
  }
  
  // 完成した180°開きの状態
  module hinge_open_state() {
-     union() {
-         left_leaf();
-         rotate([0, 180, 0]) right_leaf();
-         pin_axis();
-     }
+     // 左板を固定
+     left_leaf();
+ 
+     // 右板をヒンジ軸を中心に180°開くよう回転(X=0, Z=leaf_T/2 を基準に回転軸を設定)
+     translate([0, 0, leaf_T/2])
+         rotate([0, 180, 0])
+             translate([0, 0, -leaf_T/2])
+                 right_leaf();
+ 
+     // ピン軸
+     pin_axis();
  }
  
- // 出力
  hinge_open_state();
SCAD (110 lines)
// 修正点: knuckle の長さを各セグメント6mmに修正、180°開放時の回転軸をヒンジ軸(X=0, Z中心線)周りに適用するよう修正
// 左板/右板/ピン軸を組み合わせた完成品(180°開き)を1ファイル内で出力

// 基本寸法
leaf_W = 25;      // 板の横幅 (X方向)
leaf_H = 30;      // 縦寸法 (Y方向)
leaf_T = 2;       // 厚さ (Z方向)

// knuckle / ピン
knuckle_OD = 8;     // 外径
knuckle_R  = knuckle_OD/2;
hole_d     = 4.6;   // knuckle 内径(ピン軸 + 0.3mmクリアランス)
hole_R     = hole_d/2;
pin_D      = 4;     // ピン径
pin_R      = pin_D/2;

// knuckle の Y 方向分割(各セグメントの長さは 6mm)
left_knuckles_Y  = [-12, 0, 12];  // 左板: 外側2個 + 中央1個
right_knuckles_Y = [-6, 6];       // 右板: 中間2個

// knuckle から離れた側の皿穴(M3)
M3_pocket_Y_left  = [-12, -4, 4];
M3_pocket_Y_right = [-12, -4, 4];

// 左板/右板の位置
// 左板: X ∈ [-25, 0], Y ∈ [-15, 15], Z ∈ [0, 2]
// 右板: X ∈ [0, 25],  Y ∈ [-15, 15], Z ∈ [0, 2]
$fn = 60;

// knuckle: 左右それぞれのセグメントを X 軸方向に -4/+4 にずらして配置
module hollow_knuckle(isLeft, y) {
    x = isLeft ? -4 : 4;
    translate([x, y, 1])
        rotate([90, 0, 0])
            // 各セグメントは長さ6mm
            difference() {
                // 外筒
                cylinder(h = 6, r = knuckle_R, center = true);
                // 内穴 (ピン軸 + 0.3mm クリアランス = 4.6mm)
                cylinder(h = 6, r = hole_R, center = true);
            }
}

// M3 皿穴 + テーパ付き countersink
module m3_hole_at(x, y) {
    // countersink: 表面から depth 1mm, diameter 6mm
    translate([x, y, leaf_T - 1])
        cylinder(h = 1, r1 = 3, r2 = 0, center = false);

    // 貫通穴: 直径 3.2mm
    translate([x, y, 0])
        cylinder(h = leaf_T, r = 1.6, center = false);
}

// 左板(X<0)
module left_leaf() {
    union() {
        // 左板本体
        translate([-25, -15, 0])
            cube([25, 30, 2], center = false);

        // knuckle(左板: 外側2個 + 中央1個)
        for (y = left_knuckles_Y)
            hollow_knuckle(true, y);

        // knuckle から離れた側の M3 皿穴
        for (y = M3_pocket_Y_left)
            m3_hole_at(-20, y);
    }
}

// 右板(X>0)
module right_leaf() {
    union() {
        // 右板本体
        translate([0, -15, 0])
            cube([25, 30, 2], center = false);

        // knuckle(右板: 中間2個)
        for (y = right_knuckles_Y)
            hollow_knuckle(false, y);

        // knuckle から離れた側の M3 皿穴
        for (y = M3_pocket_Y_right)
            m3_hole_at(20, y);
    }
}

// ピン軸(Y軸方向、+Y 方向に伸びる)
module pin_axis() {
    rotate([90, 0, 0])
        cylinder(h = 32, r = pin_R, center = true);
}

// 完成した180°開きの状態
module hinge_open_state() {
    // 左板を固定
    left_leaf();

    // 右板をヒンジ軸を中心に180°開くよう回転(X=0, Z=leaf_T/2 を基準に回転軸を設定)
    translate([0, 0, leaf_T/2])
        rotate([0, 180, 0])
            translate([0, 0, -leaf_T/2])
                right_leaf();

    // ピン軸
    pin_axis();
}

hinge_open_state();