vibe-openscad

tier-2-offset-handle-mug / google/gemma-4-12b-qat

4 run / 累計 594.3s / 累計 $0

google (self-hosted) gemma-4-12b-qat bare

bare (provider default effort)

run detail →
render
bare render of tier-2-offset-handle-mug
loading STL…
success 178.2s · 246/6969t
SCAD (44 lines)
// マグカップの設計パラメータ
mug_outer_radius = 40;
mug_inner_radius = 35;
mug_height = 90;
mug_bottom_thickness = 6;

handle_outer_radius = 35;
handle_inner_width = 25;
handle_inner_height = 30;
handle_thickness = 10; // D字の厚み(内側の空間に対する肉厚)

$fn = 100;

// 本体
difference() {
    // 外側の円筒
    cylinder(h = mug_height, r = mug_outer_radius);
    
    // 内側の空洞(底面の厚みを考慮して上方向にずらす)
    translate([0, 0, mug_bottom_thickness])
        cylinder(h = mug_height, r = mug_inner_radius);
}

// 取っ手 (Handle)
union() {
    difference() {
        // 取っ手の外形 (D字形状)
        // x=39.5の位置で中心を置くことで、半径40のマグ本体とわずかに重なり(0.5mm)を確保しマニフォールドを維持
        difference() {
            rotate([0, 90])
            translate([39.5, 0, mug_height / 2])
            cylinder(h = handle_outer_radius * 2, r = handle_outer_radius, center = true);
            
            // x < 39.5 の部分を削り取り、x > 39.5 の側(+X方向)のみを残す
            translate([-100, -100, -100])
            cube([39.5, 100, 100]);
        }
        
        // 取っ手の内側の空間 (指が入る穴)
        // 取っ手は x=39.5 から始まり、幅25mmなので x=64.5 まで
        translate([39.5, 0, mug_height / 2])
        cube([handle_inner_width, handle_thickness, handle_inner_height]);
    }
}
パラメータ (8) —
スライダを動かすと openscad-wasm で再レンダリング

prompt

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

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

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

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

iteration: iter-png

i1 success →
iter 1
163.6s · 1047/12045t
diff vs bare: +60/-16
  // マグカップの設計パラメータ
  mug_outer_radius = 40;
  mug_inner_radius = 35;
  mug_height = 90;
  mug_bottom_thickness = 6;
  
- handle_outer_radius = 35;
- handle_inner_width = 25;
- handle_inner_height = 30;
- handle_thickness = 10; // D字の厚み(内側の空間に対する肉厚)
+ handle_radius = 25;
+ handle_height = 30;
+ handle_width = 25; // 内側の空間の幅(X方向)
+ handle_thickness = 10; // 取っ手の厚み(Y方向)
  
  $fn = 100;
  
  // 本体
  difference() {
      // 外側の円筒
      cylinder(h = mug_height, r = mug_outer_radius);
      
      // 内側の空洞(底面の厚みを考慮して上方向にずらす)
      translate([0, 0, mug_bottom_thickness])
          cylinder(h = mug_height, r = mug_inner_radius);
  }
  
  // 取っ手 (Handle)
  union() {
      difference() {
          // 取っ手の外形 (D字形状)
-         // x=39.5の位置で中心を置くことで、半径40のマグ本体とわずかに重なり(0.5mm)を確保しマニフォールドを維持
+         // Z軸方向(高さ方向)に伸びる円柱を、X=40の位置でカットして半円にする
+         // これにより、X=40の面が直線(本体との接合部)、X>40の面が半円になる
+         translate([40, 45, 45])
+         rotate([0, 0, 0]) // Z軸方向の円柱
+         cylinder(h = handle_height, r = handle_radius, center = true);
+         
+         // X軸のマイナス方向をカット(本体側を直線にする)
+         // 39.5の位置でカットすることで、本体表面との重なりを確保しマニフォールドを維持
+         cube([39.5, 100, 100]);
+         
+         // 取っ手の上下の余分な部分をカット(高さ30mmに制限)
+         // 中心が45なので、30〜60の範囲を残す
+         cube([100, 100, 100]) translate([0, -30, 0]); // 下側カット
+         cube([100, 100, 100]) translate([0, 30, 60]); // 上側カット(※位置調整が必要な場合はここを調整)
+         
+         // 正確な高さ制限のための差分処理(より厳密な範囲指定)
+         translate([0, -100, 30]) cube([100, 100, 60]); // 下側を30の高さで切り取る
+         translate([0, -100, 60]) cube([100, 100, 90]); // 上側を60の高さで切り取る(実際は30-60の範囲)
+         
+         // 上記を整理したシンプルな高さ制限:
+         // cylinder(h=30, r=25, center=true) は Z方向に 30〜60 の範囲を占める。
+         // よって、追加の高さカットは不要。
+         
+         // 取っ手の内側の空間(指が入る穴)
+         // 高さ30mm × 幅25mm の空間をくり抜く
+         translate([40, 35, 30])
+         cube([handle_width, handle_thickness * 2, handle_height]);
+     }
+ }
+ 
+ // 修正後の構造を整理した最終コード
+ // 以下のブロックを統合して再定義
+ module final_mug() {
+     difference() {
+         // 本体
+         cylinder(h = mug_height, r = mug_outer_radius);
+         translate([0, 0, mug_bottom_thickness])
+             cylinder(h = mug_height, r = mug_inner_radius);
+     }
+ 
+     union() {
          difference() {
-             rotate([0, 90])
-             translate([39.5, 0, mug_height / 2])
-             cylinder(h = handle_outer_radius * 2, r = handle_outer_radius, center = true);
+             // 取っ手外形
+             // Z軸方向に高さ30mm、中心を45に配置
+             // X方向の半径25mmの円柱の半分(X>40の部分)
+             translate([40, 45, 45])
+             cylinder(h = handle_height, r = handle_radius, center = true);
              
-             // x < 39.5 の部分を削り取り、x > 39.5 の側(+X方向)のみを残す
-             translate([-100, -100, -100])
+             // 本体との接合部を直線にするためのカット
              cube([39.5, 100, 100]);
+             
+             // 内側の空間(指が入る穴)をくり抜く
+             // 幅25mm (X方向)、高さ30mm (Z方向)
+             translate([40, 35, 30])
+             cube([handle_width, 30, handle_height]);
          }
-         
-         // 取っ手の内側の空間 (指が入る穴)
-         // 取っ手は x=39.5 から始まり、幅25mmなので x=64.5 まで
-         translate([39.5, 0, mug_height / 2])
-         cube([handle_inner_width, handle_thickness, handle_inner_height]);
      }
- }
+ }
+ 
+ // 実行
+ final_mug();
SCAD (88 lines)
// マグカップの設計パラメータ
mug_outer_radius = 40;
mug_inner_radius = 35;
mug_height = 90;
mug_bottom_thickness = 6;

handle_radius = 25;
handle_height = 30;
handle_width = 25; // 内側の空間の幅(X方向)
handle_thickness = 10; // 取っ手の厚み(Y方向)

$fn = 100;

// 本体
difference() {
    // 外側の円筒
    cylinder(h = mug_height, r = mug_outer_radius);
    
    // 内側の空洞(底面の厚みを考慮して上方向にずらす)
    translate([0, 0, mug_bottom_thickness])
        cylinder(h = mug_height, r = mug_inner_radius);
}

// 取っ手 (Handle)
union() {
    difference() {
        // 取っ手の外形 (D字形状)
        // Z軸方向(高さ方向)に伸びる円柱を、X=40の位置でカットして半円にする
        // これにより、X=40の面が直線(本体との接合部)、X>40の面が半円になる
        translate([40, 45, 45])
        rotate([0, 0, 0]) // Z軸方向の円柱
        cylinder(h = handle_height, r = handle_radius, center = true);
        
        // X軸のマイナス方向をカット(本体側を直線にする)
        // 39.5の位置でカットすることで、本体表面との重なりを確保しマニフォールドを維持
        cube([39.5, 100, 100]);
        
        // 取っ手の上下の余分な部分をカット(高さ30mmに制限)
        // 中心が45なので、30〜60の範囲を残す
        cube([100, 100, 100]) translate([0, -30, 0]); // 下側カット
        cube([100, 100, 100]) translate([0, 30, 60]); // 上側カット(※位置調整が必要な場合はここを調整)
        
        // 正確な高さ制限のための差分処理(より厳密な範囲指定)
        translate([0, -100, 30]) cube([100, 100, 60]); // 下側を30の高さで切り取る
        translate([0, -100, 60]) cube([100, 100, 90]); // 上側を60の高さで切り取る(実際は30-60の範囲)
        
        // 上記を整理したシンプルな高さ制限:
        // cylinder(h=30, r=25, center=true) は Z方向に 30〜60 の範囲を占める。
        // よって、追加の高さカットは不要。
        
        // 取っ手の内側の空間(指が入る穴)
        // 高さ30mm × 幅25mm の空間をくり抜く
        translate([40, 35, 30])
        cube([handle_width, handle_thickness * 2, handle_height]);
    }
}

// 修正後の構造を整理した最終コード
// 以下のブロックを統合して再定義
module final_mug() {
    difference() {
        // 本体
        cylinder(h = mug_height, r = mug_outer_radius);
        translate([0, 0, mug_bottom_thickness])
            cylinder(h = mug_height, r = mug_inner_radius);
    }

    union() {
        difference() {
            // 取っ手外形
            // Z軸方向に高さ30mm、中心を45に配置
            // X方向の半径25mmの円柱の半分(X>40の部分)
            translate([40, 45, 45])
            cylinder(h = handle_height, r = handle_radius, center = true);
            
            // 本体との接合部を直線にするためのカット
            cube([39.5, 100, 100]);
            
            // 内側の空間(指が入る穴)をくり抜く
            // 幅25mm (X方向)、高さ30mm (Z方向)
            translate([40, 35, 30])
            cube([handle_width, 30, handle_height]);
        }
    }
}

// 実行
final_mug();
i2 success →
iter 2
139.9s · 1627/10245t
diff vs i1: +36/-70
  // マグカップの設計パラメータ
- mug_outer_radius = 40;
- mug_inner_radius = 35;
- mug_height = 90;
- mug_bottom_thickness = 6;
+ mug_outer_r = 40;      // 外径 80mm -> 半径 40mm
+ mug_inner_r = 35;      // 内径 70mm -> 半径 35mm
+ mug_height = 90;       // 高さ 90mm
+ mug_bottom_t = 6;      // 底の厚み 6mm
  
- handle_radius = 25;
- handle_height = 30;
- handle_width = 25; // 内側の空間の幅(X方向)
- handle_thickness = 10; // 取っ手の厚み(Y方向)
+ handle_r = 30;         // 取っ手の外側の半径(空間を確保するため30に設定)
+ handle_h = 30;         // 取っ手の高さ 30mm
+ handle_hole_w = 25;    // 取っ手の内側の空間の幅 25mm
+ handle_hole_h = 30;    // 取っ手の内側の空間の高さ 30mm
  
  $fn = 100;
  
  // 本体
  difference() {
      // 外側の円筒
-     cylinder(h = mug_height, r = mug_outer_radius);
+     cylinder(h = mug_height, r = mug_outer_r);
      
      // 内側の空洞(底面の厚みを考慮して上方向にずらす)
-     translate([0, 0, mug_bottom_thickness])
-         cylinder(h = mug_height, r = mug_inner_radius);
+     translate([0, 0, mug_bottom_t])
+         cylinder(h = mug_height, r = mug_inner_r);
  }
  
  // 取っ手 (Handle)
  union() {
      difference() {
-         // 取っ手の外形 (D字形状)
-         // Z軸方向(高さ方向)に伸びる円柱を、X=40の位置でカットして半円にする
-         // これにより、X=40の面が直線(本体との接合部)、X>40の面が半円になる
-         translate([40, 45, 45])
-         rotate([0, 0, 0]) // Z軸方向の円柱
-         cylinder(h = handle_height, r = handle_radius, center = true);
+         union() {
+             // 取っ手本体 (D字形状)
+             // 中心を x=40 (マグの表面), y=40, z=45 に配置
+             // cylinder(h=30, r=30, center=true) は Z方向に30、X方向に-30〜30、Y方向に-30〜30を占める
+             translate([40, 40, 45])
+             difference() {
+                 cylinder(h = handle_h, r = handle_r, center = true);
+                 
+                 // X方向のカット:
+                 // x=35の位置でカットすることで、マグの表面(x=40)より少し内側から
+                 // 取っ手を開始させ、直線的な「D字」の背面を作りつつ、
+                 // マグの曲面に対して確実に接続されるようにする
+                 cube([35, 100, 100]);
+             }
+             
+             // 接続補強 (Connection Bridge)
+             // マグの曲面と 取っ手の平面を確実に結合するための接合部
+             // x=30からx=35の範囲を埋めることで、マニフォールドを維持
+             translate([30, 30, 30])
+             cube([10, 40, 30]);
+         }
          
-         // X軸のマイナス方向をカット(本体側を直線にする)
-         // 39.5の位置でカットすることで、本体表面との重なりを確保しマニフォールドを維持
-         cube([39.5, 100, 100]);
-         
-         // 取っ手の上下の余分な部分をカット(高さ30mmに制限)
-         // 中心が45なので、30〜60の範囲を残す
-         cube([100, 100, 100]) translate([0, -30, 0]); // 下側カット
-         cube([100, 100, 100]) translate([0, 30, 60]); // 上側カット(※位置調整が必要な場合はここを調整)
-         
-         // 正確な高さ制限のための差分処理(より厳密な範囲指定)
-         translate([0, -100, 30]) cube([100, 100, 60]); // 下側を30の高さで切り取る
-         translate([0, -100, 60]) cube([100, 100, 90]); // 上側を60の高さで切り取る(実際は30-60の範囲)
-         
-         // 上記を整理したシンプルな高さ制限:
-         // cylinder(h=30, r=25, center=true) は Z方向に 30〜60 の範囲を占める。
-         // よって、追加の高さカットは不要。
-         
-         // 取っ手の内側の空間(指が入る穴)
-         // 高さ30mm × 幅25mm の空間をくり抜く
+         // 取っ手の内側の空間(指が入る穴)をくり抜く
+         // 取っ手の厚み(x=40〜x=70)の範囲に配置
          translate([40, 35, 30])
-         cube([handle_width, handle_thickness * 2, handle_height]);
+         cube([handle_hole_w, handle_hole_h, handle_hole_h]);
      }
- }
- 
- // 修正後の構造を整理した最終コード
- // 以下のブロックを統合して再定義
- module final_mug() {
-     difference() {
-         // 本体
-         cylinder(h = mug_height, r = mug_outer_radius);
-         translate([0, 0, mug_bottom_thickness])
-             cylinder(h = mug_height, r = mug_inner_radius);
-     }
- 
-     union() {
-         difference() {
-             // 取っ手外形
-             // Z軸方向に高さ30mm、中心を45に配置
-             // X方向の半径25mmの円柱の半分(X>40の部分)
-             translate([40, 45, 45])
-             cylinder(h = handle_height, r = handle_radius, center = true);
-             
-             // 本体との接合部を直線にするためのカット
-             cube([39.5, 100, 100]);
-             
-             // 内側の空間(指が入る穴)をくり抜く
-             // 幅25mm (X方向)、高さ30mm (Z方向)
-             translate([40, 35, 30])
-             cube([handle_width, 30, handle_height]);
-         }
-     }
- }
- 
- // 実行
- final_mug();
+ }
SCAD (54 lines)
// マグカップの設計パラメータ
mug_outer_r = 40;      // 外径 80mm -> 半径 40mm
mug_inner_r = 35;      // 内径 70mm -> 半径 35mm
mug_height = 90;       // 高さ 90mm
mug_bottom_t = 6;      // 底の厚み 6mm

handle_r = 30;         // 取っ手の外側の半径(空間を確保するため30に設定)
handle_h = 30;         // 取っ手の高さ 30mm
handle_hole_w = 25;    // 取っ手の内側の空間の幅 25mm
handle_hole_h = 30;    // 取っ手の内側の空間の高さ 30mm

$fn = 100;

// 本体
difference() {
    // 外側の円筒
    cylinder(h = mug_height, r = mug_outer_r);
    
    // 内側の空洞(底面の厚みを考慮して上方向にずらす)
    translate([0, 0, mug_bottom_t])
        cylinder(h = mug_height, r = mug_inner_r);
}

// 取っ手 (Handle)
union() {
    difference() {
        union() {
            // 取っ手本体 (D字形状)
            // 中心を x=40 (マグの表面), y=40, z=45 に配置
            // cylinder(h=30, r=30, center=true) は Z方向に30、X方向に-30〜30、Y方向に-30〜30を占める
            translate([40, 40, 45])
            difference() {
                cylinder(h = handle_h, r = handle_r, center = true);
                
                // X方向のカット:
                // x=35の位置でカットすることで、マグの表面(x=40)より少し内側から
                // 取っ手を開始させ、直線的な「D字」の背面を作りつつ、
                // マグの曲面に対して確実に接続されるようにする
                cube([35, 100, 100]);
            }
            
            // 接続補強 (Connection Bridge)
            // マグの曲面と 取っ手の平面を確実に結合するための接合部
            // x=30からx=35の範囲を埋めることで、マニフォールドを維持
            translate([30, 30, 30])
            cube([10, 40, 30]);
        }
        
        // 取っ手の内側の空間(指が入る穴)をくり抜く
        // 取っ手の厚み(x=40〜x=70)の範囲に配置
        translate([40, 35, 30])
        cube([handle_hole_w, handle_hole_h, handle_hole_h]);
    }
}
i3 success →
iter 3
112.7s · 1239/8354t
diff vs i2: +18/-24
  // マグカップの設計パラメータ
  mug_outer_r = 40;      // 外径 80mm -> 半径 40mm
  mug_inner_r = 35;      // 内径 70mm -> 半径 35mm
  mug_height = 90;       // 高さ 90mm
  mug_bottom_t = 6;      // 底の厚み 6mm
  
- handle_r = 30;         // 取っ手の外側の半径(空間を確保するため30に設定)
  handle_h = 30;         // 取っ手の高さ 30mm
+ handle_w = 30;         // 取っ手の幅 (Y方向) 30mm
+ handle_d = 40;         // 取っ手の奥行き (X方向) 40mm
  handle_hole_w = 25;    // 取っ手の内側の空間の幅 25mm
  handle_hole_h = 30;    // 取っ手の内側の空間の高さ 30mm
  
  $fn = 100;
  
  // 本体
  difference() {
      // 外側の円筒
      cylinder(h = mug_height, r = mug_outer_r);
      
      // 内側の空洞(底面の厚みを考慮して上方向にずらす)
      translate([0, 0, mug_bottom_t])
          cylinder(h = mug_height, r = mug_inner_r);
  }
  
  // 取っ手 (Handle)
  union() {
-     difference() {
-         union() {
-             // 取っ手本体 (D字形状)
-             // 中心を x=40 (マグの表面), y=40, z=45 に配置
-             // cylinder(h=30, r=30, center=true) は Z方向に30、X方向に-30〜30、Y方向に-30〜30を占める
-             translate([40, 40, 45])
-             difference() {
-                 cylinder(h = handle_h, r = handle_r, center = true);
+     translate([38, 0, 30]) { // x=38に配置することでマグ本体と確実に結合 (x=40の表面に食い込ませる)
+         difference() {
+             union() {
+                 // D字形状の構築
+                 // 前半部分:直線的なブロック (高さ30, 幅30, 奥行き25)
+                 cube([handle_d - 15, handle_w, handle_h]);
                  
-                 // X方向のカット:
-                 // x=35の位置でカットすることで、マグの表面(x=40)より少し内側から
-                 // 取っ手を開始させ、直線的な「D字」の背面を作りつつ、
-                 // マグの曲面に対して確実に接続されるようにする
-                 cube([35, 100, 100]);
+                 // 後半部分:半円形の端 (半径15)
+                 // これにより「外側が半円、本体側が直線」のD字形状を実現
+                 translate([handle_d - 15, 0, 0])
+                     rotate([0, 0, 90])
+                     cylinder(h = handle_w, r = 15, center = true);
              }
              
-             // 接続補強 (Connection Bridge)
-             // マグの曲面と 取っ手の平面を確実に結合するための接合部
-             // x=30からx=35の範囲を埋めることで、マニフォールドを維持
-             translate([30, 30, 30])
-             cube([10, 40, 30]);
+             // 取っ手の内側の空間(指が入る穴)をくり抜く
+             // 幅25mm、高さ30mmの空間を確保
+             // 取っ手の中央付近に配置
+             translate([10, -handle_hole_h/2, 0])
+                 cube([handle_hole_w, handle_hole_h, handle_hole_h]);
          }
-         
-         // 取っ手の内側の空間(指が入る穴)をくり抜く
-         // 取っ手の厚み(x=40〜x=70)の範囲に配置
-         translate([40, 35, 30])
-         cube([handle_hole_w, handle_hole_h, handle_hole_h]);
      }
  }
SCAD (48 lines)
// マグカップの設計パラメータ
mug_outer_r = 40;      // 外径 80mm -> 半径 40mm
mug_inner_r = 35;      // 内径 70mm -> 半径 35mm
mug_height = 90;       // 高さ 90mm
mug_bottom_t = 6;      // 底の厚み 6mm

handle_h = 30;         // 取っ手の高さ 30mm
handle_w = 30;         // 取っ手の幅 (Y方向) 30mm
handle_d = 40;         // 取っ手の奥行き (X方向) 40mm
handle_hole_w = 25;    // 取っ手の内側の空間の幅 25mm
handle_hole_h = 30;    // 取っ手の内側の空間の高さ 30mm

$fn = 100;

// 本体
difference() {
    // 外側の円筒
    cylinder(h = mug_height, r = mug_outer_r);
    
    // 内側の空洞(底面の厚みを考慮して上方向にずらす)
    translate([0, 0, mug_bottom_t])
        cylinder(h = mug_height, r = mug_inner_r);
}

// 取っ手 (Handle)
union() {
    translate([38, 0, 30]) { // x=38に配置することでマグ本体と確実に結合 (x=40の表面に食い込ませる)
        difference() {
            union() {
                // D字形状の構築
                // 前半部分:直線的なブロック (高さ30, 幅30, 奥行き25)
                cube([handle_d - 15, handle_w, handle_h]);
                
                // 後半部分:半円形の端 (半径15)
                // これにより「外側が半円、本体側が直線」のD字形状を実現
                translate([handle_d - 15, 0, 0])
                    rotate([0, 0, 90])
                    cylinder(h = handle_w, r = 15, center = true);
            }
            
            // 取っ手の内側の空間(指が入る穴)をくり抜く
            // 幅25mm、高さ30mmの空間を確保
            // 取っ手の中央付近に配置
            translate([10, -handle_hole_h/2, 0])
                cube([handle_hole_w, handle_hole_h, handle_hole_h]);
        }
    }
}