- 장 · 측점 한 장 원지반 층 잠금 지움(종단 그대로) - 장의 측점마다 그림 · 표 · 글 groupId 하나 · cross_placements group_id - 화면 덧그림(설계선 · 구조물)도 같은 groupId - 새 시험 test_180_b07_cross_group Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TNMXVCZXMpHpVvqmFkeChL
86 lines
3.0 KiB
Python
86 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""180-1 B07 횡단 장 — 원지반선 고르기 · 측점 한 벌 groupId.
|
|
|
|
못박는 것
|
|
- 횡단 장 · 측점 한 장의 원지반 층은 안 잠김(종단은 그대로 잠김).
|
|
- 측점마다 groupId 하나(원지반 · 계획선 · 표 · 글 전부) · 측점끼리 다름.
|
|
- 칸 격자선 · 도각엔 groupId 없음.
|
|
- cross_placements 의 group_id = 그 측점 엔티티 값(화면 덧그림이 같은 묶음).
|
|
"""
|
|
|
|
from B07_DesignDetail.B07_DesignDetail_Engine_Cad import (
|
|
FRAME_LAYER_ID,
|
|
GROUND_LAYER_ID,
|
|
build_cross_drawing,
|
|
)
|
|
from B07_DesignDetail.B07_DesignDetail_Engine_Cad_Sheet import (
|
|
build_cross_sheet,
|
|
plan_cross_sheets,
|
|
)
|
|
from B07_DesignDetail.B07_DesignDetail_Engine_Template import use_project_templates
|
|
|
|
|
|
def _source(chainage: float) -> dict:
|
|
return {
|
|
"chainage_m": chainage,
|
|
"samples": [
|
|
{"valid": True, "offset_m": float(x), "elevation_m": 100.0 + 0.1 * x}
|
|
for x in range(-5, 6)
|
|
],
|
|
}
|
|
|
|
|
|
def _design_line() -> list[dict]:
|
|
return [{"offset_m": x, "elevation_m": 100.0} for x in (-3.0, 0.0, 3.0)]
|
|
|
|
|
|
def _drawing() -> dict:
|
|
use_project_templates(None)
|
|
chainages = [0.0, 20.0, 40.0, 60.0]
|
|
sheet = plan_cross_sheets(chainages, {"default": [2, 2]})[0]
|
|
sections = [
|
|
{
|
|
"chainage": c,
|
|
"source": _source(c),
|
|
"design_line": _design_line(),
|
|
"design": {"structure_note": "L형 측구"},
|
|
"quantity_table": {"ground": 1.0, "planned": 0.5},
|
|
"title": f"No.{int(c // 20)}",
|
|
}
|
|
for c in chainages
|
|
]
|
|
return build_cross_sheet(sheet, sections)
|
|
|
|
|
|
def _ground_locked(drawing: dict) -> bool:
|
|
return next(layer for layer in drawing["layers"] if layer["id"] == GROUND_LAYER_ID)["isLocked"]
|
|
|
|
|
|
def test_원지반_층_안_잠김() -> None:
|
|
assert _ground_locked(_drawing()) is False
|
|
single = build_cross_drawing(_source(0.0), "cross_00000m", _design_line(), None, None, "")
|
|
assert _ground_locked(single) is False
|
|
|
|
|
|
def test_측점마다_groupId_하나() -> None:
|
|
drawing = _drawing()
|
|
placements = drawing["cross_placements"]
|
|
assert len(placements) == 4
|
|
group_ids = [p["group_id"] for p in placements]
|
|
assert len(set(group_ids)) == 4 # 측점끼리 다름
|
|
grouped = [e for e in drawing["entities"] if "groupId" in e]
|
|
assert {e["groupId"] for e in grouped} == set(group_ids)
|
|
for group_id in group_ids:
|
|
members = [e for e in grouped if e["groupId"] == group_id]
|
|
layers = {e["layerId"] for e in members}
|
|
types = {e["type"] for e in members}
|
|
assert GROUND_LAYER_ID in layers and "Table" in types and "Text" in types
|
|
# 격자선 · 도각은 묶지 않음
|
|
assert all("groupId" not in e for e in drawing["entities"] if e["layerId"] == FRAME_LAYER_ID)
|
|
assert all(e["layerId"] != FRAME_LAYER_ID for e in grouped)
|
|
|
|
|
|
def test_groupId_결정적() -> None:
|
|
first = [p["group_id"] for p in _drawing()["cross_placements"]]
|
|
assert first == [p["group_id"] for p in _drawing()["cross_placements"]]
|