vibe-openscad

tier-2-offset-handle-mug / gemini-2.5-flash-lite

6 run / 累計 26.8s / 累計 $0.0029

gemini flash-lite 2.5 bare

bare (provider default effort)

run detail →
render
bare render of tier-2-offset-handle-mug
loading STL…
success 4.0s · 232/957t · $0.0004
SCAD (87 lines)
// マグカップのパラメータ
mug_outer_diameter = 80;
mug_wall_thickness = 5;
mug_height = 90;
mug_bottom_thickness = 6;

// 取手のパラメータ
handle_inner_height = 30;
handle_inner_width = 25;
handle_thickness = 8; // 本体との接続部を考慮した厚み

// マグ本体の計算
mug_outer_radius = mug_outer_diameter / 2;
mug_inner_radius = mug_outer_radius - mug_wall_thickness;
mug_body_height = mug_height - mug_bottom_thickness;

// マグ本体の作成
module mug_body() {
    difference() {
        // 外側の円筒
        cylinder(h = mug_height, r = mug_outer_radius, $fn = 100);
        // 内側の円筒 (飲み物用空間)
        translate([0, 0, mug_bottom_thickness])
            cylinder(h = mug_body_height, r = mug_inner_radius, $fn = 100);
    }
}

// 取手の作成
module mug_handle() {
    // 取手の中心位置をマグの高さの中央付近に設定
    handle_center_z = mug_height / 2;

    // 取手の外側の半円の半径
    handle_outer_radius = mug_inner_width / 2 + handle_thickness;
    // 取手の内側の半円の半径
    handle_inner_radius = mug_inner_width / 2;

    // 取手の幅 (本体との接続部を含む)
    handle_width = mug_outer_radius + handle_thickness;

    // 取手の形状を定義
    module handle_shape() {
        // D字形状の外側半円
        intersection() {
            cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
            translate([0, 0, -handle_thickness/2])
                cube([handle_outer_radius*2, handle_outer_radius*2, handle_thickness*2], center=true);
        }
        // D字形状の内側直線部分 (くり抜き用)
        translate([handle_inner_radius, 0, 0])
            cube([handle_width - handle_inner_radius, handle_inner_width, handle_thickness], center=true);
    }

    // 本体に接続する部分の形状
    module connection_part() {
        cylinder(h = handle_thickness, r1 = mug_outer_radius, r2 = mug_outer_radius, $fn = 100);
    }

    // 取手の作成と配置
    rotate([0, 90, 0]) { // X軸方向に回転させて +X 軸方向に向ける
        translate([mug_outer_radius + handle_thickness / 2, 0, handle_center_z]) {
            difference() {
                // 外側の形状
                union() {
                    // 半円部分
                    rotate([0, 0, 90])
                        cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
                    // 直線部分 (半円と繋がる)
                    translate([-handle_outer_radius, -handle_outer_radius, 0])
                        cube([handle_outer_radius, handle_outer_radius*2, handle_thickness], center=true);
                }
                // 内側のくり抜き
                translate([handle_inner_radius, 0, 0])
                    cylinder(h = handle_thickness, r = handle_inner_radius, $fn = 100);
                // 内側の直線部分 (指が入る空間)
                translate([handle_inner_radius + handle_inner_width/2, 0, 0])
                    cube([handle_inner_width, handle_inner_height, handle_thickness], center=true);
            }
        }
    }
}

// マグカップ全体を作成
union() {
    mug_body();
    mug_handle();
}
パラメータ (7)
スライダを動かすと openscad-wasm で再レンダリング

prompt

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

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

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

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

variant: thinking

off render_error render
render_error
3.7s · 232/907t · $0.0004
openscad stl render failed (exit 1): ERROR: Parser error: syntax error in file ../../../../../tmp/render-8h8qlV/input.scad, line 31
Can't parse file '/tmp/render-8h8qlV/input.scad'!

SCAD (83 lines)
// マグカップのパラメータ
outer_diameter = 80;
inner_diameter = 70;
wall_thickness = (outer_diameter - inner_diameter) / 2;
height = 90;
bottom_thickness = 6;

// 取手のパラメータ
handle_inner_height = 30;
handle_inner_width = 25;
handle_thickness = 5; // 本体との接続部分の厚み
handle_outer_radius = (handle_inner_width / 2) + handle_thickness;
handle_inner_radius = handle_inner_width / 2;
handle_connection_height_offset = (height - handle_inner_height) / 2; // 取手を高さ中央に配置するためのオフセット

// マグ本体の作成
module mug_body() {
    difference() {
        // 外側の円筒
        cylinder(h = height, d = outer_diameter, $fn = 100);
        // 内側の円筒 (飲み物用空間)
        translate([0, 0, bottom_thickness]) {
            cylinder(h = height - bottom_thickness, d = inner_diameter, $fn = 100);
        }
    }
}

// 取手の作成
module mug_handle() {
    // 取手の内側の空間の形状を定義
    handle_inner_shape = linear_extrude(height = handle_thickness, $fn = 100) {
        square([handle_inner_width, handle_inner_height], center = true);
    };

    // 取手の外側の形状を定義 (D字の半円部分)
    handle_outer_shape = linear_extrude(height = handle_thickness, $fn = 100) {
        hull() {
            translate([0, 0, 0]) circle(r = handle_outer_radius, $fn = 100);
            translate([handle_inner_width, 0, 0]) circle(r = handle_outer_radius, $fn = 100);
        }
    };

    // 取手の全体形状
    union() {
        // 外側の形状 (半円部分)
        translate([0, 0, handle_connection_height_offset]) {
            rotate([0, 90, 0]) { // Y軸周りに回転して本体に接続する向きにする
                union() {
                    // 円筒部分
                    cylinder(h = handle_thickness, d = handle_outer_radius * 2, $fn = 100);
                    // 半円部分を補完する部分
                    translate([0, 0, -handle_outer_radius]) { // Y軸方向にずらす
                        hull() {
                            translate([0, 0, 0]) circle(r = handle_outer_radius, $fn = 100);
                            translate([0, 0, handle_inner_height]) circle(r = handle_outer_radius, $fn = 100);
                        }
                    }
                }
            }
        }

        // 取手の内側の空間をくり抜く
        translate([0, 0, handle_connection_height_offset]) {
            rotate([0, 90, 0]) { // Y軸周りに回転して本体に接続する向きにする
                translate([0, 0, -handle_inner_height / 2]) { // Y軸中央に配置
                    handle_inner_shape;
                }
            }
        }
    }
}

// マグカップ本体と取手を結合
union() {
    mug_body();

    // 取手を本体の +X 軸方向に配置
    translate([outer_diameter / 2, 0, 0]) { // 本体外周に接続
        rotate([0, 0, 90]) { // Z軸周りに回転して+X方向へ
            mug_handle();
        }
    }
}
adaptivenot run
dynamic (default) success
dynamic
4.0s · 232/957t · $0.0004
SCAD (87 lines)
// マグカップのパラメータ
mug_outer_diameter = 80;
mug_wall_thickness = 5;
mug_height = 90;
mug_bottom_thickness = 6;

// 取手のパラメータ
handle_inner_height = 30;
handle_inner_width = 25;
handle_thickness = 8; // 本体との接続部を考慮した厚み

// マグ本体の計算
mug_outer_radius = mug_outer_diameter / 2;
mug_inner_radius = mug_outer_radius - mug_wall_thickness;
mug_body_height = mug_height - mug_bottom_thickness;

// マグ本体の作成
module mug_body() {
    difference() {
        // 外側の円筒
        cylinder(h = mug_height, r = mug_outer_radius, $fn = 100);
        // 内側の円筒 (飲み物用空間)
        translate([0, 0, mug_bottom_thickness])
            cylinder(h = mug_body_height, r = mug_inner_radius, $fn = 100);
    }
}

// 取手の作成
module mug_handle() {
    // 取手の中心位置をマグの高さの中央付近に設定
    handle_center_z = mug_height / 2;

    // 取手の外側の半円の半径
    handle_outer_radius = mug_inner_width / 2 + handle_thickness;
    // 取手の内側の半円の半径
    handle_inner_radius = mug_inner_width / 2;

    // 取手の幅 (本体との接続部を含む)
    handle_width = mug_outer_radius + handle_thickness;

    // 取手の形状を定義
    module handle_shape() {
        // D字形状の外側半円
        intersection() {
            cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
            translate([0, 0, -handle_thickness/2])
                cube([handle_outer_radius*2, handle_outer_radius*2, handle_thickness*2], center=true);
        }
        // D字形状の内側直線部分 (くり抜き用)
        translate([handle_inner_radius, 0, 0])
            cube([handle_width - handle_inner_radius, handle_inner_width, handle_thickness], center=true);
    }

    // 本体に接続する部分の形状
    module connection_part() {
        cylinder(h = handle_thickness, r1 = mug_outer_radius, r2 = mug_outer_radius, $fn = 100);
    }

    // 取手の作成と配置
    rotate([0, 90, 0]) { // X軸方向に回転させて +X 軸方向に向ける
        translate([mug_outer_radius + handle_thickness / 2, 0, handle_center_z]) {
            difference() {
                // 外側の形状
                union() {
                    // 半円部分
                    rotate([0, 0, 90])
                        cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
                    // 直線部分 (半円と繋がる)
                    translate([-handle_outer_radius, -handle_outer_radius, 0])
                        cube([handle_outer_radius, handle_outer_radius*2, handle_thickness], center=true);
                }
                // 内側のくり抜き
                translate([handle_inner_radius, 0, 0])
                    cylinder(h = handle_thickness, r = handle_inner_radius, $fn = 100);
                // 内側の直線部分 (指が入る空間)
                translate([handle_inner_radius + handle_inner_width/2, 0, 0])
                    cube([handle_inner_width, handle_inner_height, handle_thickness], center=true);
            }
        }
    }
}

// マグカップ全体を作成
union() {
    mug_body();
    mug_handle();
}

iteration: iter-png

i1 success
iter 1
4.7s · 1515/843t · $0.0005
diff vs bare: +21/-27
  // マグカップのパラメータ
  mug_outer_diameter = 80;
  mug_wall_thickness = 5;
  mug_height = 90;
  mug_bottom_thickness = 6;
  
  // 取手のパラメータ
  handle_inner_height = 30;
  handle_inner_width = 25;
  handle_thickness = 8; // 本体との接続部を考慮した厚み
  
  // マグ本体の計算
  mug_outer_radius = mug_outer_diameter / 2;
  mug_inner_radius = mug_outer_radius - mug_wall_thickness;
  mug_body_height = mug_height - mug_bottom_thickness;
  
  // マグ本体の作成
  module mug_body() {
      difference() {
          // 外側の円筒
          cylinder(h = mug_height, r = mug_outer_radius, $fn = 100);
          // 内側の円筒 (飲み物用空間)
          translate([0, 0, mug_bottom_thickness])
              cylinder(h = mug_body_height, r = mug_inner_radius, $fn = 100);
      }
  }
  
  // 取手の作成
  module mug_handle() {
      // 取手の中心位置をマグの高さの中央付近に設定
      handle_center_z = mug_height / 2;
  
      // 取手の外側の半円の半径
      handle_outer_radius = mug_inner_width / 2 + handle_thickness;
      // 取手の内側の半円の半径
      handle_inner_radius = mug_inner_width / 2;
  
      // 取手の幅 (本体との接続部を含む)
-     handle_width = mug_outer_radius + handle_thickness;
+     handle_connection_width = mug_outer_radius; // 本体との接続面を考慮
  
      // 取手の形状を定義
      module handle_shape() {
-         // D字形状の外側半円
-         intersection() {
-             cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
-             translate([0, 0, -handle_thickness/2])
-                 cube([handle_outer_radius*2, handle_outer_radius*2, handle_thickness*2], center=true);
+         union() {
+             // 外側のD字形状
+             intersection() {
+                 // 外側の半円
+                 cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
+                 // 内側の直線部分をカバーするための立方体
+                 translate([0, 0, -handle_thickness/2])
+                     cube([handle_outer_radius*2, handle_outer_radius*2, handle_thickness*2], center=true);
+             }
+             // 本体との接続部
+             cylinder(h = handle_thickness, r1 = mug_outer_radius, r2 = mug_outer_radius, $fn = 100);
          }
-         // D字形状の内側直線部分 (くり抜き用)
-         translate([handle_inner_radius, 0, 0])
-             cube([handle_width - handle_inner_radius, handle_inner_width, handle_thickness], center=true);
      }
  
-     // 本体に接続する部分の形状
-     module connection_part() {
-         cylinder(h = handle_thickness, r1 = mug_outer_radius, r2 = mug_outer_radius, $fn = 100);
-     }
- 
      // 取手の作成と配置
      rotate([0, 90, 0]) { // X軸方向に回転させて +X 軸方向に向ける
-         translate([mug_outer_radius + handle_thickness / 2, 0, handle_center_z]) {
+         translate([mug_outer_radius, 0, handle_center_z]) {
              difference() {
-                 // 外側の形状
                  union() {
-                     // 半円部分
-                     rotate([0, 0, 90])
-                         cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
-                     // 直線部分 (半円と繋がる)
-                     translate([-handle_outer_radius, -handle_outer_radius, 0])
-                         cube([handle_outer_radius, handle_outer_radius*2, handle_thickness], center=true);
+                     // 外側の半円形状 (本体から離れた部分)
+                     translate([handle_thickness, 0, 0])
+                         rotate([0, 0, 90])
+                             cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
+                     // 本体との接続部分
+                     cube([handle_thickness, handle_inner_width, handle_thickness], center=true);
                  }
-                 // 内側のくり抜き
-                 translate([handle_inner_radius, 0, 0])
-                     cylinder(h = handle_thickness, r = handle_inner_radius, $fn = 100);
-                 // 内側の直線部分 (指が入る空間)
-                 translate([handle_inner_radius + handle_inner_width/2, 0, 0])
+                 // 内側のくり抜き (指が入る空間)
+                 translate([handle_thickness + handle_inner_width/2, 0, 0])
                      cube([handle_inner_width, handle_inner_height, handle_thickness], center=true);
              }
          }
      }
  }
  
  // マグカップ全体を作成
  union() {
      mug_body();
      mug_handle();
  }
SCAD (81 lines)
// マグカップのパラメータ
mug_outer_diameter = 80;
mug_wall_thickness = 5;
mug_height = 90;
mug_bottom_thickness = 6;

// 取手のパラメータ
handle_inner_height = 30;
handle_inner_width = 25;
handle_thickness = 8; // 本体との接続部を考慮した厚み

// マグ本体の計算
mug_outer_radius = mug_outer_diameter / 2;
mug_inner_radius = mug_outer_radius - mug_wall_thickness;
mug_body_height = mug_height - mug_bottom_thickness;

// マグ本体の作成
module mug_body() {
    difference() {
        // 外側の円筒
        cylinder(h = mug_height, r = mug_outer_radius, $fn = 100);
        // 内側の円筒 (飲み物用空間)
        translate([0, 0, mug_bottom_thickness])
            cylinder(h = mug_body_height, r = mug_inner_radius, $fn = 100);
    }
}

// 取手の作成
module mug_handle() {
    // 取手の中心位置をマグの高さの中央付近に設定
    handle_center_z = mug_height / 2;

    // 取手の外側の半円の半径
    handle_outer_radius = mug_inner_width / 2 + handle_thickness;
    // 取手の内側の半円の半径
    handle_inner_radius = mug_inner_width / 2;

    // 取手の幅 (本体との接続部を含む)
    handle_connection_width = mug_outer_radius; // 本体との接続面を考慮

    // 取手の形状を定義
    module handle_shape() {
        union() {
            // 外側のD字形状
            intersection() {
                // 外側の半円
                cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
                // 内側の直線部分をカバーするための立方体
                translate([0, 0, -handle_thickness/2])
                    cube([handle_outer_radius*2, handle_outer_radius*2, handle_thickness*2], center=true);
            }
            // 本体との接続部
            cylinder(h = handle_thickness, r1 = mug_outer_radius, r2 = mug_outer_radius, $fn = 100);
        }
    }

    // 取手の作成と配置
    rotate([0, 90, 0]) { // X軸方向に回転させて +X 軸方向に向ける
        translate([mug_outer_radius, 0, handle_center_z]) {
            difference() {
                union() {
                    // 外側の半円形状 (本体から離れた部分)
                    translate([handle_thickness, 0, 0])
                        rotate([0, 0, 90])
                            cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
                    // 本体との接続部分
                    cube([handle_thickness, handle_inner_width, handle_thickness], center=true);
                }
                // 内側のくり抜き (指が入る空間)
                translate([handle_thickness + handle_inner_width/2, 0, 0])
                    cube([handle_inner_width, handle_inner_height, handle_thickness], center=true);
            }
        }
    }
}

// マグカップ全体を作成
union() {
    mug_body();
    mug_handle();
}
i2 success
iter 2
5.6s · 1401/1176t · $0.0006
diff vs i1: +60/-34
  // マグカップのパラメータ
  mug_outer_diameter = 80;
  mug_wall_thickness = 5;
  mug_height = 90;
  mug_bottom_thickness = 6;
  
  // 取手のパラメータ
  handle_inner_height = 30;
  handle_inner_width = 25;
  handle_thickness = 8; // 本体との接続部を考慮した厚み
  
  // マグ本体の計算
  mug_outer_radius = mug_outer_diameter / 2;
  mug_inner_radius = mug_outer_radius - mug_wall_thickness;
  mug_body_height = mug_height - mug_bottom_thickness;
  
  // マグ本体の作成
  module mug_body() {
      difference() {
          // 外側の円筒
          cylinder(h = mug_height, r = mug_outer_radius, $fn = 100);
          // 内側の円筒 (飲み物用空間)
          translate([0, 0, mug_bottom_thickness])
-             cylinder(h = mug_body_height, r = mug_inner_radius, $fn = 100);
+             cylinder(h = mug_body_height + 0.1, r = mug_inner_radius, $fn = 100); // 少し高めに設定して完全にくり抜く
      }
  }
  
  // 取手の作成
  module mug_handle() {
      // 取手の中心位置をマグの高さの中央付近に設定
      handle_center_z = mug_height / 2;
  
      // 取手の外側の半円の半径
-     handle_outer_radius = mug_inner_width / 2 + handle_thickness;
-     // 取手の内側の半円の半径
-     handle_inner_radius = mug_inner_width / 2;
+     handle_outer_radius_base = mug_outer_radius; // 本体外周に接続
+     handle_outer_radius_arc = mug_inner_width / 2 + handle_thickness; // D字のカーブ部分
  
-     // 取手の幅 (本体との接続部を含む)
-     handle_connection_width = mug_outer_radius; // 本体との接続面を考慮
- 
      // 取手の形状を定義
-     module handle_shape() {
-         union() {
-             // 外側のD字形状
-             intersection() {
-                 // 外側の半円
-                 cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
-                 // 内側の直線部分をカバーするための立方体
-                 translate([0, 0, -handle_thickness/2])
-                     cube([handle_outer_radius*2, handle_outer_radius*2, handle_thickness*2], center=true);
+     module handle_shape(pos_x, pos_y, pos_z) {
+         translate([pos_x, pos_y, pos_z]) {
+             rotate([0, 90, 0]) { // X軸方向に向ける
+                 union() {
+                     // D字のカーブ部分
+                     // 半円の円柱
+                     cylinder(h = handle_thickness, r = handle_outer_radius_arc, $fn = 100);
+                     // 本体に接続する直線部分
+                     translate([handle_outer_radius_arc - handle_thickness, 0, 0])
+                         cube([handle_thickness, handle_outer_radius_arc*2, handle_thickness], center=true);
+                 }
              }
-             // 本体との接続部
-             cylinder(h = handle_thickness, r1 = mug_outer_radius, r2 = mug_outer_radius, $fn = 100);
          }
      }
  
-     // 取手の作成と配置
-     rotate([0, 90, 0]) { // X軸方向に回転させて +X 軸方向に向ける
-         translate([mug_outer_radius, 0, handle_center_z]) {
-             difference() {
-                 union() {
-                     // 外側の半円形状 (本体から離れた部分)
-                     translate([handle_thickness, 0, 0])
-                         rotate([0, 0, 90])
-                             cylinder(h = handle_thickness, r = handle_outer_radius, $fn = 100);
-                     // 本体との接続部分
-                     cube([handle_thickness, handle_inner_width, handle_thickness], center=true);
-                 }
-                 // 内側のくり抜き (指が入る空間)
-                 translate([handle_thickness + handle_inner_width/2, 0, 0])
-                     cube([handle_inner_width, handle_inner_height, handle_thickness], center=true);
+     // 取手の内側くり抜き
+     module handle_hollow(pos_x, pos_y, pos_z) {
+         translate([pos_x, pos_y, pos_z]) {
+             rotate([0, 90, 0]) { // X軸方向に向ける
+                 translate([handle_thickness, 0, 0]) // 本体からのオフセット
+                     rotate([0, 0, 90])
+                         cylinder(h = handle_thickness + 0.1, r = handle_inner_width/2, $fn = 100); // 少し厚みを持たせて完全にくり抜く
              }
          }
      }
+     
+     // 取手本体
+     handle_pos_x = mug_outer_radius;
+     handle_pos_y = 0;
+     handle_pos_z = handle_center_z;
+ 
+     difference() {
+         union() {
+             // 外側のD字形状 (本体への接続部を含む)
+             linear_extrude(height = handle_thickness, center = true) {
+                 polygon(points = [
+                     [0, -handle_outer_radius_arc],
+                     [0, handle_outer_radius_arc],
+                     [handle_outer_radius_arc, handle_outer_radius_arc],
+                     [handle_outer_radius_arc, -handle_outer_radius_arc],
+                     [0, -handle_outer_radius_arc]
+                 ]);
+             }
+             // 本体との接続部分
+             translate([handle_outer_radius_arc - handle_thickness, 0, 0])
+                 cube([handle_thickness, handle_outer_radius_arc * 2, handle_thickness], center = true);
+         }
+         // 内側のくり抜き
+         translate([handle_thickness, 0, 0])
+             linear_extrude(height = handle_thickness + 0.1, center = true) {
+                 polygon(points = [
+                     [0, -handle_inner_width/2],
+                     [0, handle_inner_width/2],
+                     [handle_inner_width, handle_inner_width/2],
+                     [handle_inner_width, -handle_inner_width/2],
+                     [0, -handle_inner_width/2]
+                 ]);
+             }
+     }
  }
  
+ 
  // マグカップ全体を作成
  union() {
      mug_body();
-     mug_handle();
+     // 取手を本体の +X 軸方向の側面に取り付ける
+     translate([mug_outer_radius, 0, 0])
+         rotate([0, 90, 0])
+             mug_handle();
  }
SCAD (107 lines)
// マグカップのパラメータ
mug_outer_diameter = 80;
mug_wall_thickness = 5;
mug_height = 90;
mug_bottom_thickness = 6;

// 取手のパラメータ
handle_inner_height = 30;
handle_inner_width = 25;
handle_thickness = 8; // 本体との接続部を考慮した厚み

// マグ本体の計算
mug_outer_radius = mug_outer_diameter / 2;
mug_inner_radius = mug_outer_radius - mug_wall_thickness;
mug_body_height = mug_height - mug_bottom_thickness;

// マグ本体の作成
module mug_body() {
    difference() {
        // 外側の円筒
        cylinder(h = mug_height, r = mug_outer_radius, $fn = 100);
        // 内側の円筒 (飲み物用空間)
        translate([0, 0, mug_bottom_thickness])
            cylinder(h = mug_body_height + 0.1, r = mug_inner_radius, $fn = 100); // 少し高めに設定して完全にくり抜く
    }
}

// 取手の作成
module mug_handle() {
    // 取手の中心位置をマグの高さの中央付近に設定
    handle_center_z = mug_height / 2;

    // 取手の外側の半円の半径
    handle_outer_radius_base = mug_outer_radius; // 本体外周に接続
    handle_outer_radius_arc = mug_inner_width / 2 + handle_thickness; // D字のカーブ部分

    // 取手の形状を定義
    module handle_shape(pos_x, pos_y, pos_z) {
        translate([pos_x, pos_y, pos_z]) {
            rotate([0, 90, 0]) { // X軸方向に向ける
                union() {
                    // D字のカーブ部分
                    // 半円の円柱
                    cylinder(h = handle_thickness, r = handle_outer_radius_arc, $fn = 100);
                    // 本体に接続する直線部分
                    translate([handle_outer_radius_arc - handle_thickness, 0, 0])
                        cube([handle_thickness, handle_outer_radius_arc*2, handle_thickness], center=true);
                }
            }
        }
    }

    // 取手の内側くり抜き
    module handle_hollow(pos_x, pos_y, pos_z) {
        translate([pos_x, pos_y, pos_z]) {
            rotate([0, 90, 0]) { // X軸方向に向ける
                translate([handle_thickness, 0, 0]) // 本体からのオフセット
                    rotate([0, 0, 90])
                        cylinder(h = handle_thickness + 0.1, r = handle_inner_width/2, $fn = 100); // 少し厚みを持たせて完全にくり抜く
            }
        }
    }
    
    // 取手本体
    handle_pos_x = mug_outer_radius;
    handle_pos_y = 0;
    handle_pos_z = handle_center_z;

    difference() {
        union() {
            // 外側のD字形状 (本体への接続部を含む)
            linear_extrude(height = handle_thickness, center = true) {
                polygon(points = [
                    [0, -handle_outer_radius_arc],
                    [0, handle_outer_radius_arc],
                    [handle_outer_radius_arc, handle_outer_radius_arc],
                    [handle_outer_radius_arc, -handle_outer_radius_arc],
                    [0, -handle_outer_radius_arc]
                ]);
            }
            // 本体との接続部分
            translate([handle_outer_radius_arc - handle_thickness, 0, 0])
                cube([handle_thickness, handle_outer_radius_arc * 2, handle_thickness], center = true);
        }
        // 内側のくり抜き
        translate([handle_thickness, 0, 0])
            linear_extrude(height = handle_thickness + 0.1, center = true) {
                polygon(points = [
                    [0, -handle_inner_width/2],
                    [0, handle_inner_width/2],
                    [handle_inner_width, handle_inner_width/2],
                    [handle_inner_width, -handle_inner_width/2],
                    [0, -handle_inner_width/2]
                ]);
            }
    }
}


// マグカップ全体を作成
union() {
    mug_body();
    // 取手を本体の +X 軸方向の側面に取り付ける
    translate([mug_outer_radius, 0, 0])
        rotate([0, 90, 0])
            mug_handle();
}
i3 success
iter 3
4.9s · 1734/1066t · $0.0006
diff vs i2: +49/-57
  // マグカップのパラメータ
  mug_outer_diameter = 80;
  mug_wall_thickness = 5;
  mug_height = 90;
  mug_bottom_thickness = 6;
  
  // 取手のパラメータ
  handle_inner_height = 30;
  handle_inner_width = 25;
  handle_thickness = 8; // 本体との接続部を考慮した厚み
  
  // マグ本体の計算
  mug_outer_radius = mug_outer_diameter / 2;
  mug_inner_radius = mug_outer_radius - mug_wall_thickness;
- mug_body_height = mug_height - mug_bottom_thickness;
+ mug_body_height_for_inner_cylinder = mug_height - mug_bottom_thickness; // 内側円筒の高さ計算用
  
  // マグ本体の作成
  module mug_body() {
      difference() {
          // 外側の円筒
          cylinder(h = mug_height, r = mug_outer_radius, $fn = 100);
          // 内側の円筒 (飲み物用空間)
          translate([0, 0, mug_bottom_thickness])
-             cylinder(h = mug_body_height + 0.1, r = mug_inner_radius, $fn = 100); // 少し高めに設定して完全にくり抜く
+             cylinder(h = mug_body_height_for_inner_cylinder, r = mug_inner_radius, $fn = 100);
      }
  }
  
  // 取手の作成
  module mug_handle() {
      // 取手の中心位置をマグの高さの中央付近に設定
      handle_center_z = mug_height / 2;
  
-     // 取手の外側の半円の半径
-     handle_outer_radius_base = mug_outer_radius; // 本体外周に接続
-     handle_outer_radius_arc = mug_inner_width / 2 + handle_thickness; // D字のカーブ部分
+     // D字形状の半円部分の外径
+     handle_arc_outer_diameter = handle_inner_width + 2 * handle_thickness;
+     handle_arc_outer_radius = handle_arc_outer_diameter / 2;
+     
+     // D字形状の直線部分の長さ (本体に接続する部分)
+     handle_straight_length = mug_outer_radius - handle_arc_outer_radius;
  
-     // 取手の形状を定義
-     module handle_shape(pos_x, pos_y, pos_z) {
-         translate([pos_x, pos_y, pos_z]) {
+     // 取手本体
+     union() {
+         // D字のカーブ部分
+         translate([handle_straight_length, 0, 0]) { // 直線部分の長さに合わせてオフセット
              rotate([0, 90, 0]) { // X軸方向に向ける
-                 union() {
-                     // D字のカーブ部分
-                     // 半円の円柱
-                     cylinder(h = handle_thickness, r = handle_outer_radius_arc, $fn = 100);
-                     // 本体に接続する直線部分
-                     translate([handle_outer_radius_arc - handle_thickness, 0, 0])
-                         cube([handle_thickness, handle_outer_radius_arc*2, handle_thickness], center=true);
-                 }
+                 cylinder(h = handle_thickness, r = handle_arc_outer_radius, $fn = 100);
              }
          }
-     }
- 
-     // 取手の内側くり抜き
-     module handle_hollow(pos_x, pos_y, pos_z) {
-         translate([pos_x, pos_y, pos_z]) {
-             rotate([0, 90, 0]) { // X軸方向に向ける
-                 translate([handle_thickness, 0, 0]) // 本体からのオフセット
-                     rotate([0, 0, 90])
-                         cylinder(h = handle_thickness + 0.1, r = handle_inner_width/2, $fn = 100); // 少し厚みを持たせて完全にくり抜く
+         // 本体に接続する直線部分
+         translate([handle_straight_length / 2, 0, 0]) {
+             rotate([0, 90, 0]) {
+                 cube([handle_straight_length, handle_arc_outer_diameter, handle_thickness], center = true);
              }
          }
      }
-     
-     // 取手本体
-     handle_pos_x = mug_outer_radius;
-     handle_pos_y = 0;
-     handle_pos_z = handle_center_z;
+ }
  
-     difference() {
-         union() {
-             // 外側のD字形状 (本体への接続部を含む)
-             linear_extrude(height = handle_thickness, center = true) {
-                 polygon(points = [
-                     [0, -handle_outer_radius_arc],
-                     [0, handle_outer_radius_arc],
-                     [handle_outer_radius_arc, handle_outer_radius_arc],
-                     [handle_outer_radius_arc, -handle_outer_radius_arc],
-                     [0, -handle_outer_radius_arc]
-                 ]);
+ // 取手の内側くり抜き
+ module handle_hollow() {
+     // D字形状の半円部分の内径
+     handle_arc_inner_diameter = handle_inner_width;
+     handle_arc_inner_radius = handle_arc_inner_diameter / 2;
+ 
+     // D字形状の直線部分の内側 (指が入る空間)
+     handle_inner_straight_length = handle_inner_width;
+     
+     union() {
+         // 内側のカーブ部分
+         translate([handle_thickness, 0, 0]) { // 本体との接続部の厚み分オフセット
+             rotate([0, 90, 0]) {
+                 cylinder(h = handle_thickness, r = handle_arc_inner_radius, $fn = 100);
              }
-             // 本体との接続部分
-             translate([handle_outer_radius_arc - handle_thickness, 0, 0])
-                 cube([handle_thickness, handle_outer_radius_arc * 2, handle_thickness], center = true);
          }
-         // 内側のくり抜き
-         translate([handle_thickness, 0, 0])
-             linear_extrude(height = handle_thickness + 0.1, center = true) {
-                 polygon(points = [
-                     [0, -handle_inner_width/2],
-                     [0, handle_inner_width/2],
-                     [handle_inner_width, handle_inner_width/2],
-                     [handle_inner_width, -handle_inner_width/2],
-                     [0, -handle_inner_width/2]
-                 ]);
+         // 内側の直線部分 (指が入る空間)
+         translate([handle_thickness + handle_inner_width / 2, 0, 0]) {
+             rotate([0, 90, 0]) {
+                 cube([handle_inner_straight_length, handle_inner_width, handle_thickness], center = true);
              }
+         }
      }
  }
  
  
  // マグカップ全体を作成
  union() {
      mug_body();
+     
      // 取手を本体の +X 軸方向の側面に取り付ける
-     translate([mug_outer_radius, 0, 0])
-         rotate([0, 90, 0])
-             mug_handle();
+     translate([mug_outer_radius, 0, mug_height / 2]) { // マグの外周に配置し、高さを中央に
+         rotate([0, 0, 90]) { // Y軸周りに90度回転させて +X 軸方向に向ける
+             union() {
+                 mug_handle();
+                 // 内側のくり抜きを配置
+                 translate([handle_thickness/2 + handle_inner_width/2, 0, 0]) { // 取手の厚みと内側空間のオフセットを考慮
+                     handle_hollow();
+                 }
+             }
+         }
+     }
  }
SCAD (99 lines)
// マグカップのパラメータ
mug_outer_diameter = 80;
mug_wall_thickness = 5;
mug_height = 90;
mug_bottom_thickness = 6;

// 取手のパラメータ
handle_inner_height = 30;
handle_inner_width = 25;
handle_thickness = 8; // 本体との接続部を考慮した厚み

// マグ本体の計算
mug_outer_radius = mug_outer_diameter / 2;
mug_inner_radius = mug_outer_radius - mug_wall_thickness;
mug_body_height_for_inner_cylinder = mug_height - mug_bottom_thickness; // 内側円筒の高さ計算用

// マグ本体の作成
module mug_body() {
    difference() {
        // 外側の円筒
        cylinder(h = mug_height, r = mug_outer_radius, $fn = 100);
        // 内側の円筒 (飲み物用空間)
        translate([0, 0, mug_bottom_thickness])
            cylinder(h = mug_body_height_for_inner_cylinder, r = mug_inner_radius, $fn = 100);
    }
}

// 取手の作成
module mug_handle() {
    // 取手の中心位置をマグの高さの中央付近に設定
    handle_center_z = mug_height / 2;

    // D字形状の半円部分の外径
    handle_arc_outer_diameter = handle_inner_width + 2 * handle_thickness;
    handle_arc_outer_radius = handle_arc_outer_diameter / 2;
    
    // D字形状の直線部分の長さ (本体に接続する部分)
    handle_straight_length = mug_outer_radius - handle_arc_outer_radius;

    // 取手本体
    union() {
        // D字のカーブ部分
        translate([handle_straight_length, 0, 0]) { // 直線部分の長さに合わせてオフセット
            rotate([0, 90, 0]) { // X軸方向に向ける
                cylinder(h = handle_thickness, r = handle_arc_outer_radius, $fn = 100);
            }
        }
        // 本体に接続する直線部分
        translate([handle_straight_length / 2, 0, 0]) {
            rotate([0, 90, 0]) {
                cube([handle_straight_length, handle_arc_outer_diameter, handle_thickness], center = true);
            }
        }
    }
}

// 取手の内側くり抜き
module handle_hollow() {
    // D字形状の半円部分の内径
    handle_arc_inner_diameter = handle_inner_width;
    handle_arc_inner_radius = handle_arc_inner_diameter / 2;

    // D字形状の直線部分の内側 (指が入る空間)
    handle_inner_straight_length = handle_inner_width;
    
    union() {
        // 内側のカーブ部分
        translate([handle_thickness, 0, 0]) { // 本体との接続部の厚み分オフセット
            rotate([0, 90, 0]) {
                cylinder(h = handle_thickness, r = handle_arc_inner_radius, $fn = 100);
            }
        }
        // 内側の直線部分 (指が入る空間)
        translate([handle_thickness + handle_inner_width / 2, 0, 0]) {
            rotate([0, 90, 0]) {
                cube([handle_inner_straight_length, handle_inner_width, handle_thickness], center = true);
            }
        }
    }
}


// マグカップ全体を作成
union() {
    mug_body();
    
    // 取手を本体の +X 軸方向の側面に取り付ける
    translate([mug_outer_radius, 0, mug_height / 2]) { // マグの外周に配置し、高さを中央に
        rotate([0, 0, 90]) { // Y軸周りに90度回転させて +X 軸方向に向ける
            union() {
                mug_handle();
                // 内側のくり抜きを配置
                translate([handle_thickness/2 + handle_inner_width/2, 0, 0]) { // 取手の厚みと内側空間のオフセットを考慮
                    handle_hollow();
                }
            }
        }
    }
}