vibe-openscad

tier-2-offset-handle-mug / claude-opus-4-7

10 run / 累計 128.4s / 累計 $0.2871

claude opus 4.7 bare

bare (provider default effort)

run detail →
render
bare render of tier-2-offset-handle-mug
loading STL…
success 14.5s · 348/824t · $0.0223
SCAD (65 lines)
// マグカップ

$fn = 100;

// 本体パラメータ
outer_d = 80;
inner_d = 70;
height = 90;
bottom_thickness = 6;

// 取手パラメータ
handle_inner_h = 30;   // 取手内側の高さ
handle_inner_w = 25;   // 取手内側の幅(本体からの突き出し)
handle_thickness = 8;  // 取手の太さ(指を握る部分の太さ)

module mug_body() {
    difference() {
        cylinder(d = outer_d, h = height);
        translate([0, 0, bottom_thickness])
            cylinder(d = inner_d, h = height);
    }
}

module handle() {
    // 取手の外形と内側の空間
    // 取手は +X 側に配置
    // 外側 D 形状: 全体高さ = handle_inner_h + 2*handle_thickness
    // 全体幅 = handle_inner_w + handle_thickness(本体側は本体内に埋め込む)
    
    handle_outer_h = handle_inner_h + 2 * handle_thickness;
    handle_outer_w = handle_inner_w + handle_thickness;
    
    // 中央高さに配置
    z_center = height / 2;
    
    // 本体側へ少し食い込ませて確実にunion
    x_start = outer_d/2 - 2;
    
    translate([x_start, 0, z_center])
        rotate([90, 0, 0])
            linear_extrude(height = handle_outer_h, center = true)
                difference() {
                    // 外形 D 字
                    hull() {
                        // 本体側の直線部分(細い長方形)
                        translate([0, -handle_outer_h/2 + handle_outer_h/2, 0])
                            square([0.1, handle_outer_h], center = true);
                        // 外側の半円
                        translate([handle_outer_w - handle_outer_h/2, 0])
                            circle(d = handle_outer_h);
                    }
                    // 内側の穴(D字の内側)
                    hull() {
                        translate([handle_thickness, 0, 0])
                            square([0.1, handle_inner_h], center = true);
                        translate([handle_thickness + handle_inner_w - handle_inner_h/2, 0])
                            circle(d = handle_inner_h);
                    }
                }
}

union() {
    mug_body();
    handle();
}
パラメータ (7)
スライダを動かすと openscad-wasm で再レンダリング

prompt

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

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

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

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

variant: effort

low success
low
11.0s · 348/789t · $0.0215
SCAD (72 lines)
$fn = 100;

outer_d = 80;
inner_d = 70;
height = 90;
bottom_thk = 6;

handle_inner_h = 30;
handle_inner_w = 25;
handle_thk = 6;

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

module handle() {
    // D-shape handle on +X side, centered vertically
    outer_h = handle_inner_h + 2 * handle_thk;
    outer_w = handle_inner_w + handle_thk; // straight side at body, semicircle outside
    
    cz = height / 2;
    // Place so straight side is at x = body surface (slightly inside for union)
    x0 = outer_d/2 - 2; // overlap into body for manifold union
    
    translate([x0, 0, cz])
        difference() {
            // outer D: rectangle + semicircle on +x side
            hull() {
                translate([0, -outer_h/2 + outer_h/2, -outer_h/2])
                    cube([0.01, outer_h, outer_h], center = false)
                    ;
            }
            // simpler approach below
        }
}

// Simpler handle implementation
module d_handle() {
    outer_h = handle_inner_h + 2 * handle_thk;
    cz = height / 2;
    x0 = outer_d/2 - 2;
    
    translate([x0, 0, cz - outer_h/2])
    difference() {
        // outer D shape (extruded)
        linear_extrude(height = outer_h)
            hull() {
                translate([0, -outer_h/2, 0])
                    square([0.1, outer_h]);
                translate([handle_inner_w + handle_thk, 0, 0])
                    circle(d = outer_h);
            }
        // inner hole
        translate([0, 0, handle_thk])
            linear_extrude(height = handle_inner_h)
                hull() {
                    translate([0, -handle_inner_h/2, 0])
                        square([0.1, handle_inner_h]);
                    translate([handle_inner_w, 0, 0])
                        circle(d = handle_inner_h);
                }
    }
}

union() {
    body();
    d_handle();
}
mediumnot run
high (default) success
high
13.9s · 348/1051t · $0.0280
SCAD (84 lines)
// マグカップ

$fn = 100;

// 本体パラメータ
outer_d = 80;
inner_d = 70;
height = 90;
bottom_thickness = 6;

// 取手パラメータ
handle_inner_h = 30;   // 取手の内側の空間高さ
handle_inner_w = 25;   // 取手の内側の空間幅
handle_thickness = 8;  // 取手の太さ
handle_depth = 10;     // 取手の奥行き(押し出し方向)

module mug_body() {
    difference() {
        cylinder(d = outer_d, h = height);
        translate([0, 0, bottom_thickness])
            cylinder(d = inner_d, h = height - bottom_thickness + 1);
    }
}

module handle() {
    // 取手は +X 方向に付く D 字形状
    // 外側のD字 - 内側のD字 で輪郭を作り、Y方向に押し出す
    
    outer_w = handle_inner_w + 2 * handle_thickness;
    outer_h = handle_inner_h + 2 * handle_thickness;
    
    // 本体側のX位置(本体外周にしっかり食い込ませる)
    base_x = outer_d / 2 - 2;
    
    translate([base_x, -handle_depth/2, height/2])
        rotate([-90, 0, 0])
            linear_extrude(height = handle_depth)
                difference() {
                    // 外側D字
                    union() {
                        square([outer_w/2, outer_h], center = false)
                            ;
                        translate([0, outer_h/2 - outer_h/2 + 0, 0]);
                        // 半円部分
                    }
                    // 内側D字をくり抜く
                }
}

// 上記が複雑なので書き直し
module d_shape(w, h) {
    // 左端が直線(x=0)、右側が半円のD字
    // w: 全体の幅、h: 高さ
    // 半円の半径 = h/2、矩形部分の幅 = w - h/2
    rect_w = w - h/2;
    union() {
        if (rect_w > 0)
            translate([0, -h/2]) square([rect_w, h]);
        translate([rect_w, 0]) circle(d = h);
    }
}

module handle2() {
    outer_w = handle_inner_w + handle_thickness; // 直線部+半円分相当に調整
    outer_h = handle_inner_h + 2 * handle_thickness;
    inner_w = handle_inner_w;
    inner_h = handle_inner_h;
    
    base_x = outer_d / 2 - 3; // 本体に少し食い込ませる
    
    translate([base_x, 0, height/2])
        rotate([90, 0, 0])
            linear_extrude(height = handle_depth, center = true)
                difference() {
                    d_shape(outer_w + handle_thickness, outer_h);
                    translate([0, 0])
                        d_shape(inner_w + handle_thickness/2, inner_h);
                }
}

union() {
    mug_body();
    handle2();
}
max success
max
14.4s · 348/1125t · $0.0299
SCAD (84 lines)
// マグカップ
$fn = 100;

// パラメータ
outer_d = 80;       // 外径
inner_d = 70;       // 内径
height = 90;        // 高さ
bottom_t = 6;       // 底厚
wall_t = (outer_d - inner_d) / 2;  // 肉厚 5mm

// 取手のパラメータ
handle_inner_h = 30;   // 取手内側の高さ
handle_inner_w = 25;   // 取手内側の幅
handle_thickness = 8;  // 取手の太さ(断面の厚み)

module mug_body() {
    difference() {
        cylinder(d = outer_d, h = height);
        translate([0, 0, bottom_t])
            cylinder(d = inner_d, h = height - bottom_t + 1);
    }
}

module handle() {
    // D字形取手:外側が半円、本体側が直線
    // 取手の中心はマグ高さの中央
    handle_outer_h = handle_inner_h + 2 * handle_thickness;
    handle_outer_w = handle_inner_w + handle_thickness;
    
    translate([outer_d/2 - 1, 0, height/2])
        rotate([90, 0, 90])
            linear_extrude(height = handle_outer_w + 1)
                difference() {
                    // 外形:D字(半円+直線で閉じた形)
                    union() {
                        // 上下の長方形を含めた外形
                        square([handle_outer_h, handle_outer_h/2 + 1], center = false);
                        translate([0, 0])
                            square([handle_outer_h, 1], center = false);
                        // 半円部分は外側に
                        translate([handle_outer_h/2, 0])
                            scale([1, 1])
                                difference() {
                                    union() {
                                        translate([-handle_outer_h/2, 0])
                                            square([handle_outer_h, handle_outer_h/2]);
                                    }
                                }
                    }
                }
}

// よりシンプルで確実な取手の実装
module handle_simple() {
    handle_outer_h = handle_inner_h + 2 * handle_thickness;
    
    translate([0, 0, height/2])
        rotate([90, 0, 0])
            linear_extrude(height = handle_thickness, center = true)
                difference() {
                    // 外形:本体側が直線、外側が半円のD字
                    hull() {
                        // 本体側の長方形
                        translate([outer_d/2 - 1, -handle_outer_h/2])
                            square([1, handle_outer_h]);
                        // 外側の半円(D字の丸い部分)
                        translate([outer_d/2 + handle_inner_w/2 + handle_thickness/2, 0])
                            circle(d = handle_outer_h);
                    }
                    // 内側の空間(指が入る部分)
                    hull() {
                        translate([outer_d/2 + handle_thickness - 1, -handle_inner_h/2])
                            square([1, handle_inner_h]);
                        translate([outer_d/2 + handle_inner_w/2 + handle_thickness/2, 0])
                            circle(d = handle_inner_h);
                    }
                }
}

// 全体の組み立て
union() {
    mug_body();
    handle_simple();
}
xhigh success
xhigh
15.9s · 348/1079t · $0.0287
SCAD (70 lines)
// マグカップ パラメータ
outer_d = 80;      // 外径
inner_d = 70;      // 内径
mug_h   = 90;      // 高さ
bottom_t = 6;      // 底厚

// 取手パラメータ
handle_inner_h = 30; // 取手内側の空間 高さ
handle_inner_w = 25; // 取手内側の空間 幅(径方向)
handle_thick   = 8;  // 取手の太さ(円管の直径方向の太さ)
handle_depth   = 12; // 取手のZ軸に垂直な厚み(押し出し方向)

$fn = 96;

module mug_body() {
    difference() {
        cylinder(d = outer_d, h = mug_h);
        translate([0, 0, bottom_t])
            cylinder(d = inner_d, h = mug_h - bottom_t + 1);
    }
}

module handle_2d() {
    // 外側半径と内側半径
    r_outer = handle_inner_w/2 + handle_thick + handle_inner_h/2 - handle_inner_w/2;
    // シンプルに: 外側半円の半径 = 内側高さ/2 + 太さ
    // ここでは内側形状を 高さ handle_inner_h × 幅 handle_inner_w の角丸長方形にする方針ではなく
    // D字形状にするため、以下のように構築する
    
    // 外側 D 形状(半円 + 直線):
    // 半円の半径 = handle_inner_h/2 + handle_thick
    R = handle_inner_h/2 + handle_thick;
    // 取手全体の幅(径方向) = handle_inner_w + handle_thick (本体側は本体に埋め込む)
    
    difference() {
        // 外形:本体接続部(矩形)+ 半円 で D 字
        union() {
            // 本体側の矩形部分(本体外周から外側へ伸びる接続部)
            // x: 0 ~ handle_inner_w
            translate([-1, -R])
                square([handle_inner_w + 1, 2*R]);
            // 外側半円
            translate([handle_inner_w, 0])
                circle(r = R);
        }
        // 内側のくり抜き(指が入る空間)
        union() {
            translate([-1, -handle_inner_h/2])
                square([handle_inner_w - handle_thick + 1 + 0.01, handle_inner_h]);
            translate([handle_inner_w - handle_thick, 0])
                circle(r = handle_inner_h/2);
        }
    }
}

module handle() {
    // +X 方向に取手を配置
    // 本体外周(x = outer_d/2)に接続するため、取手の起点を内側に少し食い込ませる
    overlap = 2;
    translate([outer_d/2 - overlap, 0, mug_h/2 - handle_depth/2])
        rotate([0, 0, 0])
            linear_extrude(height = handle_depth)
                handle_2d();
}

// 本体と取手をunion、内側くり抜きは本体側で完結しているのでそのままunionでOK
union() {
    mug_body();
    handle();
}

variant: thinking

off success
off
13.9s · 348/1051t · $0.0280
SCAD (84 lines)
// マグカップ

$fn = 100;

// 本体パラメータ
outer_d = 80;
inner_d = 70;
height = 90;
bottom_thickness = 6;

// 取手パラメータ
handle_inner_h = 30;   // 取手の内側の空間高さ
handle_inner_w = 25;   // 取手の内側の空間幅
handle_thickness = 8;  // 取手の太さ
handle_depth = 10;     // 取手の奥行き(押し出し方向)

module mug_body() {
    difference() {
        cylinder(d = outer_d, h = height);
        translate([0, 0, bottom_thickness])
            cylinder(d = inner_d, h = height - bottom_thickness + 1);
    }
}

module handle() {
    // 取手は +X 方向に付く D 字形状
    // 外側のD字 - 内側のD字 で輪郭を作り、Y方向に押し出す
    
    outer_w = handle_inner_w + 2 * handle_thickness;
    outer_h = handle_inner_h + 2 * handle_thickness;
    
    // 本体側のX位置(本体外周にしっかり食い込ませる)
    base_x = outer_d / 2 - 2;
    
    translate([base_x, -handle_depth/2, height/2])
        rotate([-90, 0, 0])
            linear_extrude(height = handle_depth)
                difference() {
                    // 外側D字
                    union() {
                        square([outer_w/2, outer_h], center = false)
                            ;
                        translate([0, outer_h/2 - outer_h/2 + 0, 0]);
                        // 半円部分
                    }
                    // 内側D字をくり抜く
                }
}

// 上記が複雑なので書き直し
module d_shape(w, h) {
    // 左端が直線(x=0)、右側が半円のD字
    // w: 全体の幅、h: 高さ
    // 半円の半径 = h/2、矩形部分の幅 = w - h/2
    rect_w = w - h/2;
    union() {
        if (rect_w > 0)
            translate([0, -h/2]) square([rect_w, h]);
        translate([rect_w, 0]) circle(d = h);
    }
}

module handle2() {
    outer_w = handle_inner_w + handle_thickness; // 直線部+半円分相当に調整
    outer_h = handle_inner_h + 2 * handle_thickness;
    inner_w = handle_inner_w;
    inner_h = handle_inner_h;
    
    base_x = outer_d / 2 - 3; // 本体に少し食い込ませる
    
    translate([base_x, 0, height/2])
        rotate([90, 0, 0])
            linear_extrude(height = handle_depth, center = true)
                difference() {
                    d_shape(outer_w + handle_thickness, outer_h);
                    translate([0, 0])
                        d_shape(inner_w + handle_thickness/2, inner_h);
                }
}

union() {
    mug_body();
    handle2();
}
adaptive (default) success
adaptive
15.9s · 348/1079t · $0.0287
SCAD (70 lines)
// マグカップ パラメータ
outer_d = 80;      // 外径
inner_d = 70;      // 内径
mug_h   = 90;      // 高さ
bottom_t = 6;      // 底厚

// 取手パラメータ
handle_inner_h = 30; // 取手内側の空間 高さ
handle_inner_w = 25; // 取手内側の空間 幅(径方向)
handle_thick   = 8;  // 取手の太さ(円管の直径方向の太さ)
handle_depth   = 12; // 取手のZ軸に垂直な厚み(押し出し方向)

$fn = 96;

module mug_body() {
    difference() {
        cylinder(d = outer_d, h = mug_h);
        translate([0, 0, bottom_t])
            cylinder(d = inner_d, h = mug_h - bottom_t + 1);
    }
}

module handle_2d() {
    // 外側半径と内側半径
    r_outer = handle_inner_w/2 + handle_thick + handle_inner_h/2 - handle_inner_w/2;
    // シンプルに: 外側半円の半径 = 内側高さ/2 + 太さ
    // ここでは内側形状を 高さ handle_inner_h × 幅 handle_inner_w の角丸長方形にする方針ではなく
    // D字形状にするため、以下のように構築する
    
    // 外側 D 形状(半円 + 直線):
    // 半円の半径 = handle_inner_h/2 + handle_thick
    R = handle_inner_h/2 + handle_thick;
    // 取手全体の幅(径方向) = handle_inner_w + handle_thick (本体側は本体に埋め込む)
    
    difference() {
        // 外形:本体接続部(矩形)+ 半円 で D 字
        union() {
            // 本体側の矩形部分(本体外周から外側へ伸びる接続部)
            // x: 0 ~ handle_inner_w
            translate([-1, -R])
                square([handle_inner_w + 1, 2*R]);
            // 外側半円
            translate([handle_inner_w, 0])
                circle(r = R);
        }
        // 内側のくり抜き(指が入る空間)
        union() {
            translate([-1, -handle_inner_h/2])
                square([handle_inner_w - handle_thick + 1 + 0.01, handle_inner_h]);
            translate([handle_inner_w - handle_thick, 0])
                circle(r = handle_inner_h/2);
        }
    }
}

module handle() {
    // +X 方向に取手を配置
    // 本体外周(x = outer_d/2)に接続するため、取手の起点を内側に少し食い込ませる
    overlap = 2;
    translate([outer_d/2 - overlap, 0, mug_h/2 - handle_depth/2])
        rotate([0, 0, 0])
            linear_extrude(height = handle_depth)
                handle_2d();
}

// 本体と取手をunion、内側くり抜きは本体側で完結しているのでそのままunionでOK
union() {
    mug_body();
    handle();
}
dynamicnot run

iteration: iter-png

i1 success
iter 1
9.9s · 1938/890t · $0.0319
diff vs bare: +30/-32
  // マグカップ
  
  $fn = 100;
  
  // 本体パラメータ
  outer_d = 80;
  inner_d = 70;
  height = 90;
  bottom_thickness = 6;
  
  // 取手パラメータ
  handle_inner_h = 30;   // 取手内側の高さ
  handle_inner_w = 25;   // 取手内側の幅(本体からの突き出し)
- handle_thickness = 8;  // 取手の太さ(指を握る部分の太さ)
+ handle_thickness = 8;  // 取手の太さ
  
  module mug_body() {
      difference() {
          cylinder(d = outer_d, h = height);
          translate([0, 0, bottom_thickness])
-             cylinder(d = inner_d, h = height);
+             cylinder(d = inner_d, h = height - bottom_thickness + 0.01);
      }
  }
  
  module handle() {
-     // 取手の外形と内側の空間
-     // 取手は +X 側に配置
-     // 外側 D 形状: 全体高さ = handle_inner_h + 2*handle_thickness
-     // 全体幅 = handle_inner_w + handle_thickness(本体側は本体内に埋め込む)
+     // 取手は XZ 平面上に置いた 2D D 字形状を作り、Y 方向に押し出す
+     // 取手全体: 高さ(Z) = handle_inner_h + 2*handle_thickness
+     //          幅(X)  = handle_inner_w + handle_thickness(本体側の壁分)
      
-     handle_outer_h = handle_inner_h + 2 * handle_thickness;
-     handle_outer_w = handle_inner_w + handle_thickness;
+     handle_outer_h = handle_inner_h + 2 * handle_thickness; // Z 方向
+     handle_outer_w = handle_inner_w + handle_thickness;     // X 方向
      
-     // 中央高さに配置
      z_center = height / 2;
+     // 本体外周に少し食い込ませて確実に union
+     x_base = outer_d/2 - 1;
      
-     // 本体側へ少し食い込ませて確実にunion
-     x_start = outer_d/2 - 2;
-     
-     translate([x_start, 0, z_center])
-         rotate([90, 0, 0])
-             linear_extrude(height = handle_outer_h, center = true)
-                 difference() {
-                     // 外形 D 字
-                     hull() {
-                         // 本体側の直線部分(細い長方形)
-                         translate([0, -handle_outer_h/2 + handle_outer_h/2, 0])
-                             square([0.1, handle_outer_h], center = true);
-                         // 外側の半円
-                         translate([handle_outer_w - handle_outer_h/2, 0])
-                             circle(d = handle_outer_h);
+     translate([x_base, 0, z_center])
+         rotate([90, 0, 0])  // XZ平面の2D図形をXY平面で描き、Y押し出し→rotateで縦に
+             translate([0, 0, -handle_thickness/2])
+                 linear_extrude(height = handle_thickness)
+                     difference() {
+                         // 外形 D 字 (XY平面で X方向に伸びる、Y軸が高さ方向)
+                         hull() {
+                             // 本体側の直線部(Y軸方向の薄い長方形)
+                             translate([0, 0])
+                                 square([0.1, handle_outer_h], center = true);
+                             // 外側の半円
+                             translate([handle_outer_w - handle_outer_h/2, 0])
+                                 circle(d = handle_outer_h);
+                         }
+                         // 内側の穴 (D字の内側)
+                         hull() {
+                             translate([handle_thickness, 0])
+                                 square([0.1, handle_inner_h], center = true);
+                             translate([handle_thickness + handle_inner_w - handle_inner_h/2, 0])
+                                 circle(d = handle_inner_h);
+                         }
                      }
-                     // 内側の穴(D字の内側)
-                     hull() {
-                         translate([handle_thickness, 0, 0])
-                             square([0.1, handle_inner_h], center = true);
-                         translate([handle_thickness + handle_inner_w - handle_inner_h/2, 0])
-                             circle(d = handle_inner_h);
-                     }
-                 }
  }
  
  union() {
      mug_body();
      handle();
  }
SCAD (63 lines)
// マグカップ

$fn = 100;

// 本体パラメータ
outer_d = 80;
inner_d = 70;
height = 90;
bottom_thickness = 6;

// 取手パラメータ
handle_inner_h = 30;   // 取手内側の高さ
handle_inner_w = 25;   // 取手内側の幅(本体からの突き出し)
handle_thickness = 8;  // 取手の太さ

module mug_body() {
    difference() {
        cylinder(d = outer_d, h = height);
        translate([0, 0, bottom_thickness])
            cylinder(d = inner_d, h = height - bottom_thickness + 0.01);
    }
}

module handle() {
    // 取手は XZ 平面上に置いた 2D D 字形状を作り、Y 方向に押し出す
    // 取手全体: 高さ(Z) = handle_inner_h + 2*handle_thickness
    //          幅(X)  = handle_inner_w + handle_thickness(本体側の壁分)
    
    handle_outer_h = handle_inner_h + 2 * handle_thickness; // Z 方向
    handle_outer_w = handle_inner_w + handle_thickness;     // X 方向
    
    z_center = height / 2;
    // 本体外周に少し食い込ませて確実に union
    x_base = outer_d/2 - 1;
    
    translate([x_base, 0, z_center])
        rotate([90, 0, 0])  // XZ平面の2D図形をXY平面で描き、Y押し出し→rotateで縦に
            translate([0, 0, -handle_thickness/2])
                linear_extrude(height = handle_thickness)
                    difference() {
                        // 外形 D 字 (XY平面で X方向に伸びる、Y軸が高さ方向)
                        hull() {
                            // 本体側の直線部(Y軸方向の薄い長方形)
                            translate([0, 0])
                                square([0.1, handle_outer_h], center = true);
                            // 外側の半円
                            translate([handle_outer_w - handle_outer_h/2, 0])
                                circle(d = handle_outer_h);
                        }
                        // 内側の穴 (D字の内側)
                        hull() {
                            translate([handle_thickness, 0])
                                square([0.1, handle_inner_h], center = true);
                            translate([handle_thickness + handle_inner_w - handle_inner_h/2, 0])
                                circle(d = handle_inner_h);
                        }
                    }
}

union() {
    mug_body();
    handle();
}
i2 success
iter 2
11.2s · 2004/1021t · $0.0355
diff vs i1: +10/-11
  // マグカップ
  
  $fn = 100;
  
  // 本体パラメータ
  outer_d = 80;
  inner_d = 70;
  height = 90;
  bottom_thickness = 6;
  
  // 取手パラメータ
- handle_inner_h = 30;   // 取手内側の高さ
- handle_inner_w = 25;   // 取手内側の幅(本体からの突き出し)
- handle_thickness = 8;  // 取手の太さ
+ handle_inner_h = 30;   // 取手内側の高さ(Z方向)
+ handle_inner_w = 25;   // 取手内側の幅(本体からの突き出し方向 = X)
+ handle_thickness = 8;  // 取手の太さ(Y方向の厚み)
  
  module mug_body() {
      difference() {
          cylinder(d = outer_d, h = height);
          translate([0, 0, bottom_thickness])
              cylinder(d = inner_d, h = height - bottom_thickness + 0.01);
      }
  }
  
  module handle() {
-     // 取手は XZ 平面上に置いた 2D D 字形状を作り、Y 方向に押し出す
-     // 取手全体: 高さ(Z) = handle_inner_h + 2*handle_thickness
-     //          幅(X)  = handle_inner_w + handle_thickness(本体側の壁分)
+     // XZ 平面に D 字形状を 2D で描き、Y 方向に linear_extrude して厚みを付ける。
+     // 描画後、X-Z 平面の 2D を扱うため、いったん XY で描いて rotate([90,0,0]) で立てる。
      
-     handle_outer_h = handle_inner_h + 2 * handle_thickness; // Z 方向
-     handle_outer_w = handle_inner_w + handle_thickness;     // X 方向
+     handle_outer_h = handle_inner_h + 2 * handle_thickness; // Z 方向の総高さ
+     handle_outer_w = handle_inner_w + handle_thickness;     // X 方向の総幅(本体面から外へ)
      
      z_center = height / 2;
      // 本体外周に少し食い込ませて確実に union
      x_base = outer_d/2 - 1;
      
      translate([x_base, 0, z_center])
-         rotate([90, 0, 0])  // XZ平面の2D図形をXY平面で描き、Y押し出し→rotateで縦に
+         rotate([90, 0, 0])  // XY平面で描いた図形のY軸→Z軸に立てる
              translate([0, 0, -handle_thickness/2])
                  linear_extrude(height = handle_thickness)
                      difference() {
-                         // 外形 D 字 (XY平面で X方向に伸びる、Y軸が高さ方向)
+                         // 外形 D 字: 左端(本体側)は直線、右側は半円
                          hull() {
-                             // 本体側の直線部(Y軸方向の薄い長方形)
+                             // 本体側の直線部(Y軸方向に伸びる細長い長方形)
                              translate([0, 0])
                                  square([0.1, handle_outer_h], center = true);
                              // 外側の半円
                              translate([handle_outer_w - handle_outer_h/2, 0])
                                  circle(d = handle_outer_h);
                          }
                          // 内側の穴 (D字の内側)
                          hull() {
                              translate([handle_thickness, 0])
                                  square([0.1, handle_inner_h], center = true);
                              translate([handle_thickness + handle_inner_w - handle_inner_h/2, 0])
                                  circle(d = handle_inner_h);
                          }
                      }
  }
  
  union() {
      mug_body();
      handle();
  }
SCAD (62 lines)
// マグカップ

$fn = 100;

// 本体パラメータ
outer_d = 80;
inner_d = 70;
height = 90;
bottom_thickness = 6;

// 取手パラメータ
handle_inner_h = 30;   // 取手内側の高さ(Z方向)
handle_inner_w = 25;   // 取手内側の幅(本体からの突き出し方向 = X)
handle_thickness = 8;  // 取手の太さ(Y方向の厚み)

module mug_body() {
    difference() {
        cylinder(d = outer_d, h = height);
        translate([0, 0, bottom_thickness])
            cylinder(d = inner_d, h = height - bottom_thickness + 0.01);
    }
}

module handle() {
    // XZ 平面に D 字形状を 2D で描き、Y 方向に linear_extrude して厚みを付ける。
    // 描画後、X-Z 平面の 2D を扱うため、いったん XY で描いて rotate([90,0,0]) で立てる。
    
    handle_outer_h = handle_inner_h + 2 * handle_thickness; // Z 方向の総高さ
    handle_outer_w = handle_inner_w + handle_thickness;     // X 方向の総幅(本体面から外へ)
    
    z_center = height / 2;
    // 本体外周に少し食い込ませて確実に union
    x_base = outer_d/2 - 1;
    
    translate([x_base, 0, z_center])
        rotate([90, 0, 0])  // XY平面で描いた図形のY軸→Z軸に立てる
            translate([0, 0, -handle_thickness/2])
                linear_extrude(height = handle_thickness)
                    difference() {
                        // 外形 D 字: 左端(本体側)は直線、右側は半円
                        hull() {
                            // 本体側の直線部(Y軸方向に伸びる細長い長方形)
                            translate([0, 0])
                                square([0.1, handle_outer_h], center = true);
                            // 外側の半円
                            translate([handle_outer_w - handle_outer_h/2, 0])
                                circle(d = handle_outer_h);
                        }
                        // 内側の穴 (D字の内側)
                        hull() {
                            translate([handle_thickness, 0])
                                square([0.1, handle_inner_h], center = true);
                            translate([handle_thickness + handle_inner_w - handle_inner_h/2, 0])
                                circle(d = handle_inner_h);
                        }
                    }
}

union() {
    mug_body();
    handle();
}
i3 success
iter 3
7.9s · 2013/896t · $0.0325
diff vs i2: +7/-7
  // マグカップ
  
  $fn = 100;
  
  // 本体パラメータ
  outer_d = 80;
  inner_d = 70;
  height = 90;
  bottom_thickness = 6;
  
  // 取手パラメータ
  handle_inner_h = 30;   // 取手内側の高さ(Z方向)
  handle_inner_w = 25;   // 取手内側の幅(本体からの突き出し方向 = X)
- handle_thickness = 8;  // 取手の太さ(Y方向の厚み)
+ handle_thickness = 8;  // 取手の太さ(径方向の太さ)
+ handle_depth = 12;     // 取手の Y 方向の厚み(指がかかる面の幅)
  
  module mug_body() {
      difference() {
          cylinder(d = outer_d, h = height);
          translate([0, 0, bottom_thickness])
              cylinder(d = inner_d, h = height - bottom_thickness + 0.01);
      }
  }
  
  module handle() {
-     // XZ 平面に D 字形状を 2D で描き、Y 方向に linear_extrude して厚みを付ける。
-     // 描画後、X-Z 平面の 2D を扱うため、いったん XY で描いて rotate([90,0,0]) で立てる。
+     // XZ 平面で D 字の外形と内側の穴を作り、Y 方向に linear_extrude で厚み(handle_depth)を付ける
      
      handle_outer_h = handle_inner_h + 2 * handle_thickness; // Z 方向の総高さ
      handle_outer_w = handle_inner_w + handle_thickness;     // X 方向の総幅(本体面から外へ)
      
      z_center = height / 2;
      // 本体外周に少し食い込ませて確実に union
      x_base = outer_d/2 - 1;
      
      translate([x_base, 0, z_center])
-         rotate([90, 0, 0])  // XY平面で描いた図形のY軸→Z軸に立てる
-             translate([0, 0, -handle_thickness/2])
-                 linear_extrude(height = handle_thickness)
+         rotate([90, 0, 0])  // XY平面で描いた2DをZ方向に立てる(Y軸→Z軸)
+             translate([0, 0, -handle_depth/2])
+                 linear_extrude(height = handle_depth)
                      difference() {
                          // 外形 D 字: 左端(本体側)は直線、右側は半円
                          hull() {
-                             // 本体側の直線部(Y軸方向に伸びる細長い長方形)
+                             // 本体側の直線部(Z方向に伸びる細長い長方形)
                              translate([0, 0])
                                  square([0.1, handle_outer_h], center = true);
                              // 外側の半円
                              translate([handle_outer_w - handle_outer_h/2, 0])
                                  circle(d = handle_outer_h);
                          }
                          // 内側の穴 (D字の内側)
                          hull() {
                              translate([handle_thickness, 0])
                                  square([0.1, handle_inner_h], center = true);
                              translate([handle_thickness + handle_inner_w - handle_inner_h/2, 0])
                                  circle(d = handle_inner_h);
                          }
                      }
  }
  
  union() {
      mug_body();
      handle();
  }
SCAD (62 lines)
// マグカップ

$fn = 100;

// 本体パラメータ
outer_d = 80;
inner_d = 70;
height = 90;
bottom_thickness = 6;

// 取手パラメータ
handle_inner_h = 30;   // 取手内側の高さ(Z方向)
handle_inner_w = 25;   // 取手内側の幅(本体からの突き出し方向 = X)
handle_thickness = 8;  // 取手の太さ(径方向の太さ)
handle_depth = 12;     // 取手の Y 方向の厚み(指がかかる面の幅)

module mug_body() {
    difference() {
        cylinder(d = outer_d, h = height);
        translate([0, 0, bottom_thickness])
            cylinder(d = inner_d, h = height - bottom_thickness + 0.01);
    }
}

module handle() {
    // XZ 平面で D 字の外形と内側の穴を作り、Y 方向に linear_extrude で厚み(handle_depth)を付ける
    
    handle_outer_h = handle_inner_h + 2 * handle_thickness; // Z 方向の総高さ
    handle_outer_w = handle_inner_w + handle_thickness;     // X 方向の総幅(本体面から外へ)
    
    z_center = height / 2;
    // 本体外周に少し食い込ませて確実に union
    x_base = outer_d/2 - 1;
    
    translate([x_base, 0, z_center])
        rotate([90, 0, 0])  // XY平面で描いた2DをZ方向に立てる(Y軸→Z軸)
            translate([0, 0, -handle_depth/2])
                linear_extrude(height = handle_depth)
                    difference() {
                        // 外形 D 字: 左端(本体側)は直線、右側は半円
                        hull() {
                            // 本体側の直線部(Z方向に伸びる細長い長方形)
                            translate([0, 0])
                                square([0.1, handle_outer_h], center = true);
                            // 外側の半円
                            translate([handle_outer_w - handle_outer_h/2, 0])
                                circle(d = handle_outer_h);
                        }
                        // 内側の穴 (D字の内側)
                        hull() {
                            translate([handle_thickness, 0])
                                square([0.1, handle_inner_h], center = true);
                            translate([handle_thickness + handle_inner_w - handle_inner_h/2, 0])
                                circle(d = handle_inner_h);
                        }
                    }
}

union() {
    mug_body();
    handle();
}