71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
"""구조물도 상단 그림 — 그림 치수가 **수량표와 같은 한 벌**인가 (PLAN 12장).
|
||
|
||
⚠ 옛 B07 그림은 두께 식을 따로 적어, 상부·하부 두께를 넣어도 **그림만 옛 두께**였음.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
ROOT = Path(__file__).resolve().parents[2]
|
||
if str(ROOT) not in sys.path:
|
||
sys.path.insert(0, str(ROOT))
|
||
|
||
from B08_Quantity.B08_Quantity_Engine_StructureFigure import ( # noqa: E402
|
||
attach_figures,
|
||
build_figure,
|
||
)
|
||
|
||
|
||
def _sheet(**options) -> dict:
|
||
return {
|
||
"title": "돌쌓기(메)",
|
||
"type_id": "masonry_dry",
|
||
"height_m": 2.0,
|
||
"options": {"height_m": 2.0, **options},
|
||
}
|
||
|
||
|
||
def _paths(shapes: list[dict]) -> list[dict]:
|
||
return [shape for shape in shapes if shape["kind"] == "path"]
|
||
|
||
|
||
def _area(points: list[list[float]]) -> float:
|
||
return abs(sum(x0 * y1 - x1 * y0 for (x0, y0), (x1, y1) in zip(points, points[1:]))) / 2
|
||
|
||
|
||
def test_벽_두께는_사용자가_넣은_값을_따른다() -> None:
|
||
wall = _paths(build_figure(_sheet(back_len_cm=35, face_slope_ratio=0.3)))[0]["points"]
|
||
# 식: 상부 0.35+0.30=0.65 · 하부 0.65+0.30×(2−1)=0.95 · 기울기 0.3 → 앞면 위 끝 0.6
|
||
assert wall[:4] == [[0.0, 0.0], [0.6, 2.0], [1.25, 2.0], [0.95, 0.0]]
|
||
given = _paths(
|
||
build_figure(
|
||
_sheet(
|
||
back_len_cm=35, face_slope_ratio=0.3, thickness_top_m=0.5, thickness_bottom_m=1.2
|
||
)
|
||
)
|
||
)[0]["points"]
|
||
assert given[2] == [1.1, 2.0] and given[3] == [1.2, 0.0]
|
||
|
||
|
||
def test_터파기_넓이는_수량식과_같다() -> None:
|
||
dig = _paths(build_figure(_sheet(back_len_cm=35, face_slope_ratio=0.3)))[1]
|
||
assert dig["dash"]
|
||
assert abs(_area(dig["points"]) - 2.0 * ((0.65 + 0.95) / 2 + 0.2)) < 1e-9
|
||
|
||
|
||
def test_못_그리는_장은_그림_대신_까닭이_실린다() -> None:
|
||
payload = {
|
||
"sheets": [
|
||
_sheet(),
|
||
{**_sheet(stone_cm="60~80"), "type_id": "boulder_masonry"},
|
||
_sheet(back_len_cm=45),
|
||
]
|
||
}
|
||
attach_figures(payload)
|
||
no_back, boulder, drawn = payload["sheets"]
|
||
assert no_back["figure"] is None and "뒷길이" in no_back["figure_reason"]
|
||
assert boulder["figure"] is None and "직경" in boulder["figure_reason"]
|
||
assert drawn["figure_reason"] is None and drawn["figure"]
|