vibe-openscad

tier-2-offset-handle-mug / claude-fable-5-1

6 run / 累計 494.5s / 累計 $1.66

claude fable 5.1 bare

bare (provider default effort)

run detail →
render
bare render of tier-2-offset-handle-mug
loading STL…
success 41.1s · 345/2907t · $0.1488
SCAD (73 lines)
// ===== マグカップ(取手は +X 方向のみ) =====
$fn = 128;

// --- 本体パラメータ ---
outer_d  = 80;   // 外径
inner_d  = 70;   // 内径
height   = 90;   // 高さ
bottom_t = 6;    // 底面の厚み

outer_r = outer_d / 2;
inner_r = inner_d / 2;

// --- 取手パラメータ ---
handle_w = 10;        // 取手の幅(Y 方向)
handle_t = 8;         // 取手(環)の肉厚
open_h   = 30;        // 指を入れる空間の高さ
open_w   = 25;        // 指を入れる空間の幅(本体表面から外側へ)
handle_z = height / 2; // 取手の中心高さ(マグ中央)
embed    = 2;         // 本体への食い込み量(確実に union するため)

// --- 本体 ---
module body() {
    difference() {
        cylinder(r = outer_r, h = height);
        translate([0, 0, bottom_t])
            cylinder(r = inner_r, h = height);
    }
}

// --- 取手の 2D プロファイル(XZ 平面、D 字形状) ---
module handle_profile_2d() {
    ri = open_h / 2;                 // 内側半円の半径 = 15
    ro = ri + handle_t;              // 外側半円の半径 = 23
    cx = outer_r + (open_w - ri);    // 半円の中心 X = 50
    x_in = outer_r - embed;          // 本体側の直線位置(本体に少し食い込む)

    difference() {
        // 外形 D:直線部(矩形)+外側半円、本体側でクリップ
        intersection() {
            union() {
                translate([x_in, -ro]) square([cx - x_in, 2 * ro]);
                translate([cx, 0])      circle(r = ro);
            }
            translate([x_in, -ro - 1]) square([100, 2 * ro + 2]);
        }
        // 内側の空間 D:高さ 30 × 幅 25(本体表面から)
        intersection() {
            union() {
                translate([outer_r, -ri]) square([cx - outer_r, 2 * ri]);
                translate([cx, 0])         circle(r = ri);
            }
            translate([outer_r, -ri - 1]) square([100, 2 * ri + 2]);
        }
    }
}

// --- 取手(+X 側の側面のみ) ---
module handle() {
    translate([0, 0, handle_z])
        rotate([90, 0, 0])              // XY 平面 → XZ 平面へ(Y 方向に押し出し)
            linear_extrude(height = handle_w, center = true)
                handle_profile_2d();
}

// --- 組み立て ---
module mug() {
    union() {
        body();
        handle();
    }
}

mug();
パラメータ (9) —
スライダを動かすと openscad-wasm で再レンダリング

prompt

OpenSCAD で、向きが指定されたマグカップを作ってください。

本体:
- 外径 80mm、内径 70mm(肉厚 5mm)、高さ 90mm の円筒形マグ
- 底面の厚みは 6mm
- 内側は飲み物を入れられるよう中空

取手(handle):
- マグの **+X 軸方向の側面のみ** に付ける(他の方向には付けない)
- 取手は D 字形状(外側が半円、本体側が直線)で、本体外周にしっかり接続する
- 取手の内側の空間は高さ 30mm × 幅 25mm(指 3 本ぐらい入る)
- 取手はマグの高さ方向の中央付近に付ける
- 本体と取手は確実に union され、マニフォールド(隙間や宙吊りなし)を保つ

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

variant: effort

low success →
low
13.4s · 345/717t · $0.0393
SCAD (58 lines)
// マグカップ(取手は +X 方向)
$fn = 96;

outer_d   = 80;    // 外径
inner_d   = 70;    // 内径
height    = 90;    // 全高
bottom_t  = 6;     // 底の厚み

// 取手パラメータ
handle_gap_h = 30; // 取手内側の高さ
handle_gap_w = 25; // 取手内側の幅(本体表面から)
handle_t     = 8;  // 取手の太さ(断面の幅)
handle_depth = 12; // 取手の厚み(Y方向)
handle_z     = height / 2; // 取手中心の高さ

outer_r = outer_d / 2;

// 本体
module body() {
    difference() {
        cylinder(h = height, d = outer_d);
        translate([0, 0, bottom_t])
            cylinder(h = height, d = inner_d);
    }
}

// 取手の D 字プロファイル(XZ 平面、X: 本体外側方向)
// 本体側は直線、外側は半円
module handle_profile_2d(w, h) {
    // w: 直線部から半円の最外点までの幅, h: 直線部の高さ
    // 半円は直線部の端に接続
    hull() {
        square([0.01, h], center = true);
        translate([w - h / 2, 0]) circle(d = h);
    }
}

module handle() {
    inner_h = handle_gap_h;
    inner_w = handle_gap_w;
    outer_h = inner_h + 2 * handle_t;
    outer_w = inner_w + handle_t;

    // 本体内部に少し食い込ませて確実に union する
    overlap = 3;
    translate([outer_r - overlap, 0, handle_z])
        rotate([90, 0, 0])
            linear_extrude(height = handle_depth, center = true)
                difference() {
                    handle_profile_2d(outer_w + overlap, outer_h);
                    translate([overlap, 0]) handle_profile_2d(inner_w, inner_h);
                }
}

union() {
    body();
    handle();
}
mediumnot run
—
high (default) success →
high
41.1s · 345/2907t · $0.1488
SCAD (73 lines)
// ===== マグカップ(取手は +X 方向のみ) =====
$fn = 128;

// --- 本体パラメータ ---
outer_d  = 80;   // 外径
inner_d  = 70;   // 内径
height   = 90;   // 高さ
bottom_t = 6;    // 底面の厚み

outer_r = outer_d / 2;
inner_r = inner_d / 2;

// --- 取手パラメータ ---
handle_w = 10;        // 取手の幅(Y 方向)
handle_t = 8;         // 取手(環)の肉厚
open_h   = 30;        // 指を入れる空間の高さ
open_w   = 25;        // 指を入れる空間の幅(本体表面から外側へ)
handle_z = height / 2; // 取手の中心高さ(マグ中央)
embed    = 2;         // 本体への食い込み量(確実に union するため)

// --- 本体 ---
module body() {
    difference() {
        cylinder(r = outer_r, h = height);
        translate([0, 0, bottom_t])
            cylinder(r = inner_r, h = height);
    }
}

// --- 取手の 2D プロファイル(XZ 平面、D 字形状) ---
module handle_profile_2d() {
    ri = open_h / 2;                 // 内側半円の半径 = 15
    ro = ri + handle_t;              // 外側半円の半径 = 23
    cx = outer_r + (open_w - ri);    // 半円の中心 X = 50
    x_in = outer_r - embed;          // 本体側の直線位置(本体に少し食い込む)

    difference() {
        // 外形 D:直線部(矩形)+外側半円、本体側でクリップ
        intersection() {
            union() {
                translate([x_in, -ro]) square([cx - x_in, 2 * ro]);
                translate([cx, 0])      circle(r = ro);
            }
            translate([x_in, -ro - 1]) square([100, 2 * ro + 2]);
        }
        // 内側の空間 D:高さ 30 × 幅 25(本体表面から)
        intersection() {
            union() {
                translate([outer_r, -ri]) square([cx - outer_r, 2 * ri]);
                translate([cx, 0])         circle(r = ri);
            }
            translate([outer_r, -ri - 1]) square([100, 2 * ri + 2]);
        }
    }
}

// --- 取手(+X 側の側面のみ) ---
module handle() {
    translate([0, 0, handle_z])
        rotate([90, 0, 0])              // XY 平面 → XZ 平面へ(Y 方向に押し出し)
            linear_extrude(height = handle_w, center = true)
                handle_profile_2d();
}

// --- 組み立て ---
module mug() {
    union() {
        body();
        handle();
    }
}

mug();
max success →
max
149.4s · 345/9347t · $0.4708
SCAD (70 lines)
// ============================================================
//  マグカップ(向き固定:底面 Z=0、上向き +Z、取手は +X 方向のみ)
// ============================================================
$fn = 96;

// ---------- 本体寸法 ----------
outer_d  = 80;   // 外径
inner_d  = 70;   // 内径(肉厚 5mm)
mug_h    = 90;   // 高さ
bottom_t = 6;    // 底面の厚み

// ---------- 取手寸法 ----------
handle_inner_h = 30;        // 取手内側空間の高さ(Z 方向)
handle_inner_w = 25;        // 取手内側空間の幅(X 方向)
handle_t       = 8;         // 取手の断面太さ(XZ 面内)
handle_depth   = 12;        // 取手の奥行き(Y 方向の厚み)
handle_embed   = 4;         // 本体肉厚への埋め込み量(内側空洞には届かない)
handle_z       = mug_h / 2; // 取手中心の高さ(マグの中央)

// ------------------------------------------------------------
//  D 字 2D 形状
//   u=-back 側が直線(本体側)、+u 側が半円(外側)
//   r        : 半円の半径(= 高さの半分)
//   straight : 直線部から半円中心までの距離
//   back     : 直線側へ延ばす量(本体への埋め込み用)
// ------------------------------------------------------------
module d_shape(r, straight, back) {
    intersection() {
        union() {
            translate([-back, -r]) square([back + straight, 2 * r]);
            translate([straight, 0]) circle(r = r);
        }
        // 半円の左側はみ出しを切り落として直線にする
        translate([-back, -r - 1]) square([back + straight + r + 2, 2 * r + 2]);
    }
}

// ------------------------------------------------------------
//  取手(+X 側面に接続、断面を Y 方向へ押し出し)
// ------------------------------------------------------------
module handle() {
    r_in     = handle_inner_h / 2;        // 内側半円の半径 = 15
    straight = handle_inner_w - r_in;     // 内側直線部の長さ = 10 → 幅 25

    translate([outer_d / 2, 0, handle_z])   // 本体外周(X=40)、高さ中央へ
        rotate([90, 0, 0])                  // 2D の (u,v) → (X,Z)
            linear_extrude(height = handle_depth, center = true)
                difference() {
                    d_shape(r_in + handle_t, straight, handle_embed); // 外形
                    d_shape(r_in,            straight, handle_embed); // 内側空間
                }
}

// ------------------------------------------------------------
//  マグ本体 + 取手
//   本体と取手を union した後に内側空洞をくり抜くことで、
//   取手の埋め込み部が空洞に露出せずマニフォールドを保つ
// ------------------------------------------------------------
module mug() {
    difference() {
        union() {
            cylinder(h = mug_h, d = outer_d);   // 外筒
            handle();                           // +X 方向の取手
        }
        translate([0, 0, bottom_t])
            cylinder(h = mug_h, d = inner_d);   // 内側空洞(底厚 6mm を残す)
    }
}

mug();
xhigh success →
xhigh
100.1s · 345/7489t · $0.3779
SCAD (63 lines)
// マグカップ(取手は +X 軸方向の側面のみ)
$fn = 128;

// ---- 本体パラメータ ----
outer_d  = 80;            // 外径
inner_d  = 70;            // 内径(肉厚 5mm)
mug_h    = 90;            // 高さ
bottom_t = 6;             // 底面の厚み
outer_r  = outer_d / 2;
inner_r  = inner_d / 2;

// ---- 取手パラメータ ----
grip_w       = 25;        // 取手内側の空間の幅 (X 方向)
grip_h       = 30;        // 取手内側の空間の高さ (Z 方向)
handle_bar   = 8;         // 取手の棒の太さ(D 断面方向)
handle_depth = 12;        // 取手の奥行き(Y 方向の厚み)
embed        = 4;         // 本体壁へ食い込ませる量(確実に union させる)
handle_zc    = mug_h / 2; // 取手の中心高さ(高さ方向の中央)

// D 字形の 2D 形状
//   x0: 直線側(本体側)の X 位置, w: 全幅, h: 全高, zc: 中心高さ
module d_shape(x0, w, h, zc) {
    r  = h / 2;
    cx = x0 + w - r;          // 外側半円の中心 X
    intersection() {
        union() {
            translate([x0, zc - r]) square([w - r, h]);   // 直線部
            translate([cx, zc]) circle(r = r);            // 半円部
        }
        // 直線側 (x < x0) にはみ出さないようにクリップ
        translate([x0, zc - r - 1]) square([w + 2, h + 2]);
    }
}

// マグ本体(中空)
module body() {
    difference() {
        cylinder(h = mug_h, r = outer_r);
        translate([0, 0, bottom_t])
            cylinder(h = mug_h, r = inner_r);   // 底 6mm を残して上まで貫通
    }
}

// 取手(+X 側のみ)
module handle() {
    // XY 平面で D 形状を作り、Y 方向に押し出して XZ 平面に立てる
    rotate([90, 0, 0])
        linear_extrude(height = handle_depth, center = true)
            difference() {
                // 外形: 本体壁に embed 分だけ食い込ませて確実に接続
                d_shape(outer_r - embed,
                        grip_w + handle_bar + embed,
                        grip_h + 2 * handle_bar,
                        handle_zc);
                // 内側の空間(指 3 本分): 高さ 30 x 幅 25
                d_shape(outer_r, grip_w, grip_h, handle_zc);
            }
}

union() {
    body();
    handle();
}

variant: thinking

offnot run
—
adaptive (default) success →
adaptive
149.4s · 345/9347t · $0.4708
SCAD (70 lines)
// ============================================================
//  マグカップ(向き固定:底面 Z=0、上向き +Z、取手は +X 方向のみ)
// ============================================================
$fn = 96;

// ---------- 本体寸法 ----------
outer_d  = 80;   // 外径
inner_d  = 70;   // 内径(肉厚 5mm)
mug_h    = 90;   // 高さ
bottom_t = 6;    // 底面の厚み

// ---------- 取手寸法 ----------
handle_inner_h = 30;        // 取手内側空間の高さ(Z 方向)
handle_inner_w = 25;        // 取手内側空間の幅(X 方向)
handle_t       = 8;         // 取手の断面太さ(XZ 面内)
handle_depth   = 12;        // 取手の奥行き(Y 方向の厚み)
handle_embed   = 4;         // 本体肉厚への埋め込み量(内側空洞には届かない)
handle_z       = mug_h / 2; // 取手中心の高さ(マグの中央)

// ------------------------------------------------------------
//  D 字 2D 形状
//   u=-back 側が直線(本体側)、+u 側が半円(外側)
//   r        : 半円の半径(= 高さの半分)
//   straight : 直線部から半円中心までの距離
//   back     : 直線側へ延ばす量(本体への埋め込み用)
// ------------------------------------------------------------
module d_shape(r, straight, back) {
    intersection() {
        union() {
            translate([-back, -r]) square([back + straight, 2 * r]);
            translate([straight, 0]) circle(r = r);
        }
        // 半円の左側はみ出しを切り落として直線にする
        translate([-back, -r - 1]) square([back + straight + r + 2, 2 * r + 2]);
    }
}

// ------------------------------------------------------------
//  取手(+X 側面に接続、断面を Y 方向へ押し出し)
// ------------------------------------------------------------
module handle() {
    r_in     = handle_inner_h / 2;        // 内側半円の半径 = 15
    straight = handle_inner_w - r_in;     // 内側直線部の長さ = 10 → 幅 25

    translate([outer_d / 2, 0, handle_z])   // 本体外周(X=40)、高さ中央へ
        rotate([90, 0, 0])                  // 2D の (u,v) → (X,Z)
            linear_extrude(height = handle_depth, center = true)
                difference() {
                    d_shape(r_in + handle_t, straight, handle_embed); // 外形
                    d_shape(r_in,            straight, handle_embed); // 内側空間
                }
}

// ------------------------------------------------------------
//  マグ本体 + 取手
//   本体と取手を union した後に内側空洞をくり抜くことで、
//   取手の埋め込み部が空洞に露出せずマニフォールドを保つ
// ------------------------------------------------------------
module mug() {
    difference() {
        union() {
            cylinder(h = mug_h, d = outer_d);   // 外筒
            handle();                           // +X 方向の取手
        }
        translate([0, 0, bottom_t])
            cylinder(h = mug_h, d = inner_d);   // 内側空洞(底厚 6mm を残す)
    }
}

mug();
dynamicnot run
—