Merge remote-tracking branch 'origin/sub_laptop_1' into main_laptop_1

This commit is contained in:
2026-09-21 22:02:50 +09:00
3 changed files with 67 additions and 4 deletions
@@ -0,0 +1,42 @@
# 첫 조합으로 열면 「맞는 줄 0개」 인 로직 (2026-09-21)
첫 조합 = 화면이 처음 보이는 값 — 입력의 「고르기」 첫 값 · 「범위」 위끝 · 빈 칸은 수 1.
로직의 「시험입력」 칸은 일괄 시험 계산만 씀 — 화면은 안 읽음.
로직 1,354개를 첫 조합으로 돌린 결과 표 찾기가 0 줄인 것 **53 → 51**(둘 고침).
## 고친 것 — 고르기 첫 값이 원문에 없는 조합 (2줄)
| 로직 | 첫 조합(옛) | 표 | 고침 |
|---|---|---|---|
| `GF000219` 13-4-1 돌쌓기 메쌓기(인력) | 뒷길이 25 · 견치돌 · 골쌓기 | QF000421 | 「돌」 고르기 차례를 바꿔 첫 값 = 깬잡석 (25 · 깬잡석 · 골쌓기 = 원문 첫 줄) |
| `GF000223` 13-5-1 돌붙임(인력) | 뒷길이 25 · 메붙임 · 깬돌 | QF000432 | 같음 — 첫 값 = 깬잡석 (25 · 깬잡석 = 원문에 있음) |
- 원문 표는 뒷길이 25 에 깬잡석 · 호박돌만 둠(견치돌은 35 부터 · 깬돌은 30 부터) — 값은 하나도 안 고치고 **고르기 차례만** 바꿈.
- 시험입력 칸이 아니라 고르기 차례를 고른 까닭: 화면은 시험입력을 안 읽어 고쳐도 첫 화면이 그대로 멈춤.
- `GF000223` 은 조합을 고친 뒤에도 「MP000065 틈메우기돌 값 없음」 에서 멈춤 — 재료 채우기 몫(`ref/_없는_재료.md`).
## 남은 51줄 — 빈 칸(수)이 1 로 채워져 0 줄
고르기가 아니라 **설계자가 넣을 수**(규격 ㎜ · 직경 · 연장 따위)가 비어 1 이 들어간 탓.
화면에서 사용자가 실제 값을 넣으면 풀림 — 데이터 흠이 아님.
| 파일 | 줄 | 걸린 조건(보기) |
|---|---|---|
| 건설품셈 01장 배관공사 | 18 | `규격(㎜)=1` · `관규격(㎜)=1` |
| 건설품셈 04장 펌프·공기설비 | 7 | `규격(㎾이하)=1` |
| 건설품셈 05장 밸브설비 | 6 | `규격(㎜)=1` |
| 건설품셈 06장 측정기기 | 5 | `규격(mm)=1` |
| 산림품셈 13장 구조물(큰돌) | 5 | `직경=1` |
| 건설품셈 05장 기초공사 | 4 | `혼합층연장=1` 이 「토질=혼합층」 을 켬 |
| 건설품셈 03장 보온공사 | 3 | `배관규격(mm)=1` |
| 건설품셈 02장 덕트공사 | 2 | `규격(mm)=1` |
| 산림품셈 07장 집재·운재 | 1 | `최대집재거리=1` · `집재재적=1` |
건설품셈 05장 기초공사 4줄(`GC000176` · `GC000189` · `GC000191` · `GC000195`)은 수를 넣어도 비트·말뚝직경 조합이 원문에 없는 자리가 있음 — 그 목록은 각 로직 비고의 「원문에 없는 조합」.
## 다음
1. 빈 칸 51줄은 화면에서 「값을 넣어야 계산됨」 안내로 풀림(화면 몫 — 이 창 밖).
2. 고르기 조합이 아예 없는 자리는 로직 비고의 「원문에 없는 조합」 이 이미 적음 — 화면에 그 안내를 띄우는 것이 다음 걸음.
3. 되풀이 검사: `resources/tester/test_masterdata_check.py::test_첫_고르기_조합은_원문에_있는_줄`.
@@ -288,11 +288,11 @@
"결과단위": "원/㎡",
"출처": "산림품셈 13-4-1",
"소유": "공용",
"비고": "「원문에 없는 조합: 뒷길이=25 · 돌=견치돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=견치돌 · 쌓기=켜쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=켜쌓기 / 뒷길이=30 · 돌=견치돌 · 쌓기=골쌓기 외 5」",
"비고": "고르기 첫 값 = 원문에 있는 조합(뒷길이 25 · 깬잡석 · 골쌓기) · 「원문에 없는 조합: 뒷길이=25 · 돌=견치돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=견치돌 · 쌓기=켜쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=켜쌓기 / 뒷길이=30 · 돌=견치돌 · 쌓기=골쌓기 외 5」",
"시험입력": {"높이": 4.0, "돌": "깬잡석"},
"입력": [
{ "이름": "뒷길이", "설명": "쌓을 돌의 뒤쪽 길이", "단위": "㎝", "고르기": [25, 30, 35, 45, 55, 60, 75] },
{ "이름": "돌", "설명": "쌓을 돌 종류", "고르기": ["견치돌", "깬돌", "깬잡석", "호박돌 및 야면석"] },
{ "이름": "돌", "설명": "쌓을 돌 종류", "고르기": ["깬잡석", "견치돌", "깬돌", "호박돌 및 야면석"] },
{ "이름": "쌓기", "설명": "돌을 어긋나게 쌓는지 줄 맞춰 쌓는지", "고르기": ["골쌓기", "켜쌓기"] },
{ "이름": "높이", "설명": "쌓는 벽 높이", "단위": "m" },
{ "이름": "초과증가율", "설명": "기준 높이를 넘어 더 드는 품 비율", "단위": "%", "범위": [80, 100] }
@@ -677,7 +677,7 @@
"결과단위": "원/㎡",
"출처": "산림품셈 13-5-1",
"소유": "공용",
"비고": "해석: 채움 콘크리트 = 레디믹스트콘크리트 · 해석: 돌 이름을 채움·고임돌 표 종별로 맞춤(조약돌·호박돌 및 야면석 → 야면석 · 채움은 호박돌) · 줄눈 모르타르는 원문대로 메붙임에도 얹음 · 뒷길이 70 은 찾기 실패 — 원문 표에 70 없음 · 「원문에 없는 조합: 뒷길이=25 · 붙임=메붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=메붙임 · 돌=호박돌 및 야면석 / 뒷길이=25 · 붙임=찰붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=찰붙임 · 돌=조약돌 및 야면석 / 뒷길이=30 · 붙임=메붙임 · 돌=호박돌 및 야면석 외 17」",
"비고": "고르기 첫 값 = 원문에 있는 조합(뒷길이 25 · 메붙임 · 깬잡석) · 해석: 채움 콘크리트 = 레디믹스트콘크리트 · 해석: 돌 이름을 채움·고임돌 표 종별로 맞춤(조약돌·호박돌 및 야면석 → 야면석 · 채움은 호박돌) · 줄눈 모르타르는 원문대로 메붙임에도 얹음 · 뒷길이 70 은 찾기 실패 — 원문 표에 70 없음 · 「원문에 없는 조합: 뒷길이=25 · 붙임=메붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=메붙임 · 돌=호박돌 및 야면석 / 뒷길이=25 · 붙임=찰붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=찰붙임 · 돌=조약돌 및 야면석 / 뒷길이=30 · 붙임=메붙임 · 돌=호박돌 및 야면석 외 17」",
"시험입력": {"뒷길이": 30, "붙임": "메붙임", "돌": "깬돌", "굵은골재최대치수": 25, "강도": 18, "슬럼프": "080"},
"입력": [
{
@@ -746,8 +746,8 @@
{
"이름": "돌",
"고르기": [
"깬돌",
"깬잡석",
"깬돌",
"조약돌 및 야면석",
"호박돌 및 야면석"
]
+21
View File
@@ -472,6 +472,27 @@ def test_범위_입력은_막음(whole):
)
def test_첫_고르기_조합은_원문에_있는_줄(whole):
"""화면은 고르기 첫 값으로 열림 — 그 조합이 표에 있어야 함(13장 돌쌓기·돌붙임)."""
rows = {
str(row[""]): row
for data in cm.load(["로직_산림품셈_13장_구조물.json"]).values()
for row in data[""]
}
for key in ("GF000219", "GF000223"): # 13-4-1 메쌓기 · 13-5-1 돌붙임
row = rows[key]
given = {
spec["이름"]: spec["고르기"][0]
if spec.get("고르기")
else (spec["범위"][1] if spec.get("범위") else Decimal(1))
for spec in row["입력"]
}
try:
mf.run(whole, key, given)
except mf.FormulaError as err: # 다른 막힘(재료 값 없음)은 여기 몫이 아님
assert "맞는 줄 0개" not in str(err), f"{key} · {err}"
def test_견본_파일_검사_통과(whole):
files = cm.load(SAMPLES)
assert len(files) == len(SAMPLES)