"""L 字アングルブラケット（パイプライン確認用のサンプル）。

画像から起こす作品を追加したら、この作品は削除してかまわない。
"""

import cadquery as cq

# ---- 寸法（mm） --------------------------------------------------------
WIDTH = 60.0          # Y 方向の幅
BASE_LENGTH = 70.0    # 底板の X 方向長さ
WALL_HEIGHT = 55.0    # 立ち上がりの高さ
THICKNESS = 6.0       # 板厚
OUTER_FILLET = 8.0    # 外周角の丸み

HOLE_DIA = 6.6        # M6 バカ穴
HOLE_MARGIN = 16.0    # 板端から穴中心までの距離
HOLE_PITCH = 28.0     # 幅方向の穴ピッチ

RIB_THICKNESS = 5.0   # 補強リブ
RIB_LENGTH = 42.0
RIB_HEIGHT = 36.0


def _profile() -> cq.Workplane:
    """XZ 平面に L 断面を描いて、幅方向へ押し出す。"""
    return (
        cq.Workplane("XZ")
        .moveTo(0, 0)
        .lineTo(BASE_LENGTH, 0)
        .lineTo(BASE_LENGTH, THICKNESS)
        .lineTo(THICKNESS, THICKNESS)
        .lineTo(THICKNESS, WALL_HEIGHT)
        .lineTo(0, WALL_HEIGHT)
        .close()
        .extrude(WIDTH / 2, both=True)
    )


def _rib() -> cq.Workplane:
    """L の内側に入れる三角リブ。"""
    return (
        cq.Workplane("XZ")
        .moveTo(THICKNESS, THICKNESS)
        .lineTo(THICKNESS + RIB_LENGTH, THICKNESS)
        .lineTo(THICKNESS, THICKNESS + RIB_HEIGHT)
        .close()
        .extrude(RIB_THICKNESS / 2, both=True)
    )


def build() -> cq.Workplane:
    result = _profile().union(_rib())

    # 底板の先端の、平面視での角を丸める
    base_end = cq.selectors.BoxSelector(
        (BASE_LENGTH - 1, -WIDTH, -1),
        (BASE_LENGTH + 1, WIDTH, THICKNESS + 1),
    )
    result = result.edges("|Z").edges(base_end).fillet(OUTER_FILLET)

    # 立ち上がり上端の面取り（板厚 6 mm に対して控えめに）
    wall_top = cq.selectors.BoxSelector(
        (-1, -WIDTH, WALL_HEIGHT - 1),
        (THICKNESS + 1, WIDTH, WALL_HEIGHT + 1),
    )
    result = result.edges("|Y").edges(wall_top).fillet(2.0)

    offsets = (-HOLE_PITCH / 2, HOLE_PITCH / 2)

    # 底板の取付穴（Z 方向に貫通）
    base_holes = (
        cq.Workplane("XY")
        .pushPoints([(BASE_LENGTH - HOLE_MARGIN, y) for y in offsets])
        .circle(HOLE_DIA / 2)
        .extrude(THICKNESS * 2, both=True)
    )

    # 立ち上がりの取付穴（X 方向に貫通）
    wall_holes = (
        cq.Workplane("YZ")
        .pushPoints([(y, WALL_HEIGHT - HOLE_MARGIN) for y in offsets])
        .circle(HOLE_DIA / 2)
        .extrude(THICKNESS * 2, both=True)
    )

    return result.cut(base_holes).cut(wall_holes)


if __name__ == "__main__":
    cq.exporters.export(build(), "preview.stl")
