vibe-openscad

tier-2-offset-handle-mug / gemini-3-flash-preview

6 run / 累計 112.1s / 累計 $0.0100

gemini flash 3 preview bare

bare (provider default effort)

run detail →
render
bare render of tier-2-offset-handle-mug
loading STL…
success 19.0s · 232/392t · $0.0010
SCAD (31 lines)
$fn = 100;

// マグカップ本体と取手の結合
union() {
    // --- 本体 (Body) ---
    difference() {
        // 外径 80mm, 高さ 90mm の円柱
        cylinder(h=90, d=80);
        
        // 内側の中空部分 (内径 70mm, 底の厚み 6mm)
        translate([0, 0, 6])
            cylinder(h=85, d=70);
    }

    // --- 取手 (Handle) ---
    // 本体外周(X=40)から+X方向に配置、高さ中央(Z=45)に合わせる
    translate([40 - 1, 0, 45]) // 確実に接続するため1mm本体にめり込ませる
    rotate([90, 0, 90])         // X軸方向に向くよう回転
    linear_extrude(height=15, center=true) // 取手自体の厚み(幅)は15mm
    difference() {
        // 取手の外形 (D字の曲線部分)
        // 底辺から25mmの位置を円の中心とし、外側を半円にする
        hull() {
            translate([0, -25]) square([1, 50]); // 本体側の直線
            translate([25, 0]) circle(d=50);     // 外側の半円
        }
        
        // 取手の内側の空間 (高さ 30mm × 幅 25mm)
        translate([0, -15]) square([25, 30]);
    }
}

prompt

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

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

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

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

variant: thinking

off success
off
3.7s · 232/595t · $0.0016
SCAD (53 lines)
// Mug Parameters
outer_diameter = 80;
inner_diameter = 70;
mug_height = 90;
bottom_thickness = 6;

// Handle Parameters
handle_inner_h = 30; // Height of the opening
handle_inner_w = 25; // Width of the opening
handle_thickness = 8; // Thickness of the handle material

$fn = 100;

union() {
    // Mug Body
    difference() {
        // Outer Cylinder
        cylinder(h = mug_height, d = outer_diameter);
        
        // Inner Hollow
        translate([0, 0, bottom_thickness])
            cylinder(h = mug_height, d = inner_diameter);
    }

    // Handle (Positioned in +X direction)
    translate([outer_diameter / 2 - 2, 0, mug_height / 2]) { // -2 for slight overlap to ensure union
        rotate([90, 0, 90]) {
            difference() {
                // Outer D-shape (Approximated by rounded rectangle)
                hull() {
                    translate([handle_inner_h / 2, 0, 0])
                        cylinder(h = handle_thickness, d = handle_inner_h + (handle_thickness * 2), center = true);
                    translate([-handle_inner_h / 2, 0, 0])
                        cylinder(h = handle_thickness, d = handle_inner_h + (handle_thickness * 2), center = true);
                    // Square part connecting to the body
                    translate([0, -(handle_inner_w + handle_thickness) / 2, 0])
                        cube([handle_inner_h + handle_thickness * 2, 1, handle_thickness], center = true);
                }
                
                // Inner Hollow of D-shape
                hull() {
                    translate([handle_inner_h / 2, 0, 0])
                        cylinder(h = handle_thickness + 2, d = handle_inner_h, center = true);
                    translate([-handle_inner_h / 2, 0, 0])
                        cylinder(h = handle_thickness + 2, d = handle_inner_h, center = true);
                    // Cutout towards the mug wall
                    translate([0, -handle_inner_w, 0])
                        cube([handle_inner_h, handle_inner_w, handle_thickness + 2], center = true);
                }
            }
        }
    }
}
adaptivenot run
dynamic (default) success
dynamic
19.0s · 232/392t · $0.0010
SCAD (31 lines)
$fn = 100;

// マグカップ本体と取手の結合
union() {
    // --- 本体 (Body) ---
    difference() {
        // 外径 80mm, 高さ 90mm の円柱
        cylinder(h=90, d=80);
        
        // 内側の中空部分 (内径 70mm, 底の厚み 6mm)
        translate([0, 0, 6])
            cylinder(h=85, d=70);
    }

    // --- 取手 (Handle) ---
    // 本体外周(X=40)から+X方向に配置、高さ中央(Z=45)に合わせる
    translate([40 - 1, 0, 45]) // 確実に接続するため1mm本体にめり込ませる
    rotate([90, 0, 90])         // X軸方向に向くよう回転
    linear_extrude(height=15, center=true) // 取手自体の厚み(幅)は15mm
    difference() {
        // 取手の外形 (D字の曲線部分)
        // 底辺から25mmの位置を円の中心とし、外側を半円にする
        hull() {
            translate([0, -25]) square([1, 50]); // 本体側の直線
            translate([25, 0]) circle(d=50);     // 外側の半円
        }
        
        // 取手の内側の空間 (高さ 30mm × 幅 25mm)
        translate([0, -15]) square([25, 30]);
    }
}

iteration: iter-png

i1 success
iter 1
11.6s · 1756/445t · $0.0016
diff vs bare: +17/-16
  $fn = 100;
  
- // マグカップ本体と取手の結合
+ // マグカップ全体
  union() {
-     // --- 本体 (Body) ---
+     // --- 1. 本体 (Body) ---
      difference() {
-         // 外径 80mm, 高さ 90mm の円柱
-         cylinder(h=90, d=80);
+         // 外径 80mm (半径 40mm), 高さ 90mm
+         cylinder(h=90, r=40);
          
-         // 内側の中空部分 (内径 70mm, 底の厚み 6mm)
+         // 内側の中空化 (内径 70mm/半径 35mm, 底面の厚み 6mm)
+         // 確実に上部を突き抜けるよう、高さは本体より少し高く設定
          translate([0, 0, 6])
-             cylinder(h=85, d=70);
+             cylinder(h=85, r=35);
      }
  
-     // --- 取手 (Handle) ---
-     // 本体外周(X=40)から+X方向に配置、高さ中央(Z=45)に合わせる
-     translate([40 - 1, 0, 45]) // 確実に接続するため1mm本体にめり込ませる
-     rotate([90, 0, 90])         // X軸方向に向くよう回転
-     linear_extrude(height=15, center=true) // 取手自体の厚み(幅)は15mm
+     // --- 2. 取手 (Handle) ---
+     // 本体外周(X=40)から+X方向に配置、高さ方向の中央(Z=45)に配置
+     translate([39, 0, 45]) // 1mm本体にめり込ませて確実に結合(union)させる
+     rotate([90, 0, 90])    // 2D図面を立ててX軸方向に向ける
+     linear_extrude(height=12, center=true) // 取手自体の厚み(幅)は12mm
      difference() {
-         // 取手の外形 (D字の曲線部分)
-         // 底辺から25mmの位置を円の中心とし、外側を半円にする
+         // 取手の外形: D字形状 (外側が半径25mmの半円、本体側が直線)
          hull() {
-             translate([0, -25]) square([1, 50]); // 本体側の直線
-             translate([25, 0]) circle(d=50);     // 外側の半円
+             translate([0, -25]) square([1, 50]); // 本体側の平らな面
+             translate([10, 0]) circle(r=25);     // 外側の膨らみ
          }
          
-         // 取手の内側の空間 (高さ 30mm × 幅 25mm)
+         // 取手の内側の空間: 指定された 30mm(高さ) × 25mm(幅)
+         // 位置を調整して指が入るスペースを確保
          translate([0, -15]) square([25, 30]);
      }
  }
SCAD (32 lines)
$fn = 100;

// マグカップ全体
union() {
    // --- 1. 本体 (Body) ---
    difference() {
        // 外径 80mm (半径 40mm), 高さ 90mm
        cylinder(h=90, r=40);
        
        // 内側の中空化 (内径 70mm/半径 35mm, 底面の厚み 6mm)
        // 確実に上部を突き抜けるよう、高さは本体より少し高く設定
        translate([0, 0, 6])
            cylinder(h=85, r=35);
    }

    // --- 2. 取手 (Handle) ---
    // 本体外周(X=40)から+X方向に配置、高さ方向の中央(Z=45)に配置
    translate([39, 0, 45]) // 1mm本体にめり込ませて確実に結合(union)させる
    rotate([90, 0, 90])    // 2D図面を立ててX軸方向に向ける
    linear_extrude(height=12, center=true) // 取手自体の厚み(幅)は12mm
    difference() {
        // 取手の外形: D字形状 (外側が半径25mmの半円、本体側が直線)
        hull() {
            translate([0, -25]) square([1, 50]); // 本体側の平らな面
            translate([10, 0]) circle(r=25);     // 外側の膨らみ
        }
        
        // 取手の内側の空間: 指定された 30mm(高さ) × 25mm(幅)
        // 位置を調整して指が入るスペースを確保
        translate([0, -15]) square([25, 30]);
    }
}
i2 success
iter 2
39.4s · 1809/686t · $0.0023
diff vs i1: +40/-22
  $fn = 100;
  
- // マグカップ全体
+ // --- 寸法定義 ---
+ mug_outer_r = 80 / 2;   // 外径 80mm -> 半径 40mm
+ mug_inner_r = 70 / 2;   // 内径 70mm -> 半径 35mm (肉厚 5mm)
+ mug_height = 90;
+ mug_bottom_thick = 6;
+ 
+ handle_inner_w = 25;    // 取っ手内側の空間 幅 25mm
+ handle_inner_h = 30;    // 取っ手内側の空間 高さ 30mm
+ handle_thickness = 8;   // 取っ手自体の肉厚
+ handle_breadth = 15;    // 取っ手の厚み(正面から見た時の幅)
+ 
  union() {
-     // --- 1. 本体 (Body) ---
+     // 1. 本体 (Body)
      difference() {
-         // 外径 80mm (半径 40mm), 高さ 90mm
-         cylinder(h=90, r=40);
+         // 外側の円筒
+         cylinder(h=mug_height, r=mug_outer_r);
          
-         // 内側の中空化 (内径 70mm/半径 35mm, 底面の厚み 6mm)
-         // 確実に上部を突き抜けるよう、高さは本体より少し高く設定
-         translate([0, 0, 6])
-             cylinder(h=85, r=35);
+         // 内側の中空化 (底面 6mm を残す)
+         translate([0, 0, mug_bottom_thick])
+             cylinder(h=mug_height, r=mug_inner_r);
      }
  
-     // --- 2. 取手 (Handle) ---
-     // 本体外周(X=40)から+X方向に配置、高さ方向の中央(Z=45)に配置
-     translate([39, 0, 45]) // 1mm本体にめり込ませて確実に結合(union)させる
-     rotate([90, 0, 90])    // 2D図面を立ててX軸方向に向ける
-     linear_extrude(height=12, center=true) // 取手自体の厚み(幅)は12mm
-     difference() {
-         // 取手の外形: D字形状 (外側が半径25mmの半円、本体側が直線)
-         hull() {
-             translate([0, -25]) square([1, 50]); // 本体側の平らな面
-             translate([10, 0]) circle(r=25);     // 外側の膨らみ
+     // 2. 取っ手 (Handle)
+     // マグの +X 軸方向の側面 (x=40) に設置。高さ方向の中央に配置。
+     // 確実に union されるよう、本体へ 1mm めり込ませる
+     translate([mug_outer_r - 1, 0, mug_height / 2])
+     rotate([90, 0, 90]) // 2D 形状を YZ 平面に立てて X 軸方向に押し出す準備
+     linear_extrude(height=handle_breadth, center=true) {
+         difference() {
+             // 外形: D字形状 (本体側が直線、外側が半径 R の半円)
+             // 外側先端を (内側幅 25 + 肉厚 8 = 33mm) にするため
+             // 半径 R = (内側高/2 + 肉厚) = 23mm の中心を x = 10 に配置
+             hull() {
+                 // 本体側の直線接合部
+                 translate([0, -(handle_inner_h/2 + handle_thickness)])
+                     square([1, handle_inner_h + handle_thickness * 2]);
+                 
+                 // 外側の半円
+                 translate([handle_inner_w + handle_thickness - (handle_inner_h/2 + handle_thickness), 0])
+                     circle(r = handle_inner_h/2 + handle_thickness);
+             }
+             
+             // 内側の空間 (高さ 30mm × 幅 25mm)
+             translate([0, -handle_inner_h/2])
+                 square([handle_inner_w, handle_inner_h]);
          }
-         
-         // 取手の内側の空間: 指定された 30mm(高さ) × 25mm(幅)
-         // 位置を調整して指が入るスペースを確保
-         translate([0, -15]) square([25, 30]);
      }
  }
SCAD (50 lines)
$fn = 100;

// --- 寸法定義 ---
mug_outer_r = 80 / 2;   // 外径 80mm -> 半径 40mm
mug_inner_r = 70 / 2;   // 内径 70mm -> 半径 35mm (肉厚 5mm)
mug_height = 90;
mug_bottom_thick = 6;

handle_inner_w = 25;    // 取っ手内側の空間 幅 25mm
handle_inner_h = 30;    // 取っ手内側の空間 高さ 30mm
handle_thickness = 8;   // 取っ手自体の肉厚
handle_breadth = 15;    // 取っ手の厚み(正面から見た時の幅)

union() {
    // 1. 本体 (Body)
    difference() {
        // 外側の円筒
        cylinder(h=mug_height, r=mug_outer_r);
        
        // 内側の中空化 (底面 6mm を残す)
        translate([0, 0, mug_bottom_thick])
            cylinder(h=mug_height, r=mug_inner_r);
    }

    // 2. 取っ手 (Handle)
    // マグの +X 軸方向の側面 (x=40) に設置。高さ方向の中央に配置。
    // 確実に union されるよう、本体へ 1mm めり込ませる
    translate([mug_outer_r - 1, 0, mug_height / 2])
    rotate([90, 0, 90]) // 2D 形状を YZ 平面に立てて X 軸方向に押し出す準備
    linear_extrude(height=handle_breadth, center=true) {
        difference() {
            // 外形: D字形状 (本体側が直線、外側が半径 R の半円)
            // 外側先端を (内側幅 25 + 肉厚 8 = 33mm) にするため
            // 半径 R = (内側高/2 + 肉厚) = 23mm の中心を x = 10 に配置
            hull() {
                // 本体側の直線接合部
                translate([0, -(handle_inner_h/2 + handle_thickness)])
                    square([1, handle_inner_h + handle_thickness * 2]);
                
                // 外側の半円
                translate([handle_inner_w + handle_thickness - (handle_inner_h/2 + handle_thickness), 0])
                    circle(r = handle_inner_h/2 + handle_thickness);
            }
            
            // 内側の空間 (高さ 30mm × 幅 25mm)
            translate([0, -handle_inner_h/2])
                square([handle_inner_w, handle_inner_h]);
        }
    }
}
i3 success
iter 3
19.4s · 2050/719t · $0.0024
diff vs i2: +30/-27
  $fn = 100;
  
  // --- 寸法定義 ---
- mug_outer_r = 80 / 2;   // 外径 80mm -> 半径 40mm
- mug_inner_r = 70 / 2;   // 内径 70mm -> 半径 35mm (肉厚 5mm)
+ mug_outer_diam = 80;
+ mug_inner_diam = 70; // 肉厚 5mm
  mug_height = 90;
  mug_bottom_thick = 6;
  
- handle_inner_w = 25;    // 取っ手内側の空間 幅 25mm
- handle_inner_h = 30;    // 取っ手内側の空間 高さ 30mm
- handle_thickness = 8;   // 取っ手自体の肉厚
- handle_breadth = 15;    // 取っ手の厚み(正面から見た時の幅)
+ handle_inner_w = 25;    // 取手内側の空間 幅
+ handle_inner_h = 30;    // 取手内側の空間 高さ
+ handle_thickness = 8;   // 取手の構造材の厚み
+ handle_breadth = 15;    // 取手の横幅(Y軸方向の厚み)
  
+ // 外側の高さ = 内側高さ + 上下の肉厚
+ handle_outer_h = handle_inner_h + (handle_thickness * 2);
+ // 外側の半径 = 外側高さの半分
+ handle_outer_r = handle_outer_h / 2;
+ 
  union() {
-     // 1. 本体 (Body)
+     // 1. マグカップ本体
      difference() {
-         // 外側の円筒
-         cylinder(h=mug_height, r=mug_outer_r);
+         // 外郭
+         cylinder(h=mug_height, d=mug_outer_diam);
          
-         // 内側の中空化 (底面 6mm を残す)
+         // 内側の中空化
          translate([0, 0, mug_bottom_thick])
-             cylinder(h=mug_height, r=mug_inner_r);
+             cylinder(h=mug_height, d=mug_inner_diam);
      }
  
-     // 2. 取っ手 (Handle)
-     // マグの +X 軸方向の側面 (x=40) に設置。高さ方向の中央に配置。
-     // 確実に union されるよう、本体へ 1mm めり込ませる
-     translate([mug_outer_r - 1, 0, mug_height / 2])
-     rotate([90, 0, 90]) // 2D 形状を YZ 平面に立てて X 軸方向に押し出す準備
+     // 2. 取手 (Handle) - +X軸方向に配置
+     // 本体外周(x = 40)に接続。確実に結合させるため1mm食い込ませる。
+     translate([(mug_outer_diam / 2) - 1, 0, mug_height / 2])
+     rotate([90, 0, 90]) // 2D形状を垂直に立ててX軸方向に押し出し
      linear_extrude(height=handle_breadth, center=true) {
          difference() {
-             // 外形: D字形状 (本体側が直線、外側が半径 R の半円)
-             // 外側先端を (内側幅 25 + 肉厚 8 = 33mm) にするため
-             // 半径 R = (内側高/2 + 肉厚) = 23mm の中心を x = 10 に配置
+             // 取手の外形: D字形状 (本体側が直線、外側が半円)
              hull() {
-                 // 本体側の直線接合部
-                 translate([0, -(handle_inner_h/2 + handle_thickness)])
-                     square([1, handle_inner_h + handle_thickness * 2]);
+                 // 本体側の接合面
+                 translate([0, -handle_outer_h / 2])
+                     square([1, handle_outer_h]);
                  
-                 // 外側の半円
-                 translate([handle_inner_w + handle_thickness - (handle_inner_h/2 + handle_thickness), 0])
-                     circle(r = handle_inner_h/2 + handle_thickness);
+                 // 外側の半円部分
+                 // 全体の幅が (内側幅 + 肉厚) になるように配置
+                 translate([(handle_inner_w + handle_thickness) - handle_outer_r, 0])
+                     circle(r = handle_outer_r);
              }
              
-             // 内側の空間 (高さ 30mm × 幅 25mm)
-             translate([0, -handle_inner_h/2])
+             // 取手の内側の穴 (高さ 30mm × 幅 25mm)
+             translate([0, -handle_inner_h / 2])
                  square([handle_inner_w, handle_inner_h]);
          }
      }
  }
SCAD (53 lines)
$fn = 100;

// --- 寸法定義 ---
mug_outer_diam = 80;
mug_inner_diam = 70; // 肉厚 5mm
mug_height = 90;
mug_bottom_thick = 6;

handle_inner_w = 25;    // 取手内側の空間 幅
handle_inner_h = 30;    // 取手内側の空間 高さ
handle_thickness = 8;   // 取手の構造材の厚み
handle_breadth = 15;    // 取手の横幅(Y軸方向の厚み)

// 外側の高さ = 内側高さ + 上下の肉厚
handle_outer_h = handle_inner_h + (handle_thickness * 2);
// 外側の半径 = 外側高さの半分
handle_outer_r = handle_outer_h / 2;

union() {
    // 1. マグカップ本体
    difference() {
        // 外郭
        cylinder(h=mug_height, d=mug_outer_diam);
        
        // 内側の中空化
        translate([0, 0, mug_bottom_thick])
            cylinder(h=mug_height, d=mug_inner_diam);
    }

    // 2. 取手 (Handle) - +X軸方向に配置
    // 本体外周(x = 40)に接続。確実に結合させるため1mm食い込ませる。
    translate([(mug_outer_diam / 2) - 1, 0, mug_height / 2])
    rotate([90, 0, 90]) // 2D形状を垂直に立ててX軸方向に押し出し
    linear_extrude(height=handle_breadth, center=true) {
        difference() {
            // 取手の外形: D字形状 (本体側が直線、外側が半円)
            hull() {
                // 本体側の接合面
                translate([0, -handle_outer_h / 2])
                    square([1, handle_outer_h]);
                
                // 外側の半円部分
                // 全体の幅が (内側幅 + 肉厚) になるように配置
                translate([(handle_inner_w + handle_thickness) - handle_outer_r, 0])
                    circle(r = handle_outer_r);
            }
            
            // 取手の内側の穴 (高さ 30mm × 幅 25mm)
            translate([0, -handle_inner_h / 2])
                square([handle_inner_w, handle_inner_h]);
        }
    }
}