アングルブラケット(サンプル)

パイプライン確認用の L 字ブラケット。画像から起こした作品を追加したら削除してよい。

2026-08-13PLAsamplebracket

制作メモ

ビルドとサイト生成の動作確認のために置いてあるサンプル作品です。 元画像はありません。実際の作品は works/<slug>/images/ に元画像を置き、 work.yaml の source_images に登録します。

モデリング方針

  • XZ 平面に L 断面を描き、幅方向へ両側押し出し(extrude(..., both=True))
  • 内側に三角リブを 1 枚追加して曲げ剛性を確保
  • 取付穴は M6 バカ穴 φ6.6 を各面 2 個、ピッチ 28 mm

割り切ったところ

  • L 内側のすみ肉は入れていない(リブとの干渉を避けるため)
  • 面取りは外周の角のみ

CADQuery ソース

model.py — 90 行

"""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")