fix(782-3): 8-2 시공능력 로직 「0 이면 기본」 가드 칸 — 견본 자동값 1 로도 엉뚱한 값 안 나오게(분석 635)

- 가드 칸에 범위 [0, 원문 끝] — 견본 자동값 = 0(원문 기본): E입력 [0, 1](원문 E 표 모두 1 이하) · 굴착기 싸이클입력 [0, 30](원문 3 표 13∼30초) · 디젤 해머 α입력 [0, 4.0] · 워터제트 α입력 [0, 1.20] · 펌프준설 q입력 [0, 387] · 그래브 f입력 · k입력 [0, 1.00] · 콘크리트 운반 배출 [0, 4] · 대기 [0, 10] · 하역 [0, 2]
- 범위 없는 가드 칸(트랜처 전진 · 후진거리 · 로더 주행거리 · 스테이빌라이저 혼합횟수 · 플랜트싸이클)은 1 이어도 기본의 3배 안 — 그대로
- 압쇄기 · 골재세척 q입력 뺌(원문 q 한 값 · 1 이면 60배 어긋남) · 스테이빌라이저 유효혼합폭 최대(로터폭 − 0.4, 0)(자동값 음수 막음)
- 유압 파일 해머 강관 Ta 표 「16이하」 ↔ β 표 「16 이하」 글자 맞춤(16m 이하 줄 못 찾던 흠) · 그래브 N값 고르기 「해당 없음」 끝으로(첫 값 = 표 줄)
- 지킴 시험 test_782_3 가드 칸 자동값 덧 · 기존 로직 · 표 · 키 그대로(로직_08장 새 줄만 바뀜) · check_master 전후 같음 · 계산전부 1513 멈춤 0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-04 20:09:23 +09:00
co-authored by Claude Opus 5.5
parent 53e2c22df6
commit 8ddb5bbda7
6 changed files with 130 additions and 77 deletions
@@ -16,12 +16,14 @@ LEVEL = ["양호", "보통", "불량"]
CUT = {"대상": "결과", "자리": 3, "방법": "반올림", "출처": "건설품셈 공통 8-1-4 주①"}
def inp(name, desc, unit=None, pick=None, src=None):
def inp(name, desc, unit=None, pick=None, src=None, rng=None):
d = {"이름": name, "설명": desc}
if unit:
d["단위"] = unit
if pick is not None:
d["고르기"] = pick
if rng is not None:
d["범위"] = [D(str(x)) for x in rng] # 「0 = 기본」 칸 — 견본 자동값 = 아래 끝 0(원문 기본)
if src:
d["출처"] = src
return d
@@ -49,7 +51,7 @@ def mid(t, item):
def e_in(no, desc="작업효율을 직접 넣을 때 — 0 이면 원문 표 값"):
return inp("E입력", desc, src=f"건설품셈 공통 {no}")
return inp("E입력", desc, src=f"건설품셈 공통 {no}", rng=(0, 1)) # 원문 E 표 값 모두 1 이하
def auto(name, expr):
@@ -417,6 +419,7 @@ def excavator_inputs(no, C):
"1회 싸이클시간을 직접 넣을 때 — 0 이면 표",
"초",
src=f"건설품셈 공통 {no} 3",
rng=(0, 30), # 원문 3 표 13∼30초
),
]
@@ -37,6 +37,7 @@ def part3(C) -> list[dict]:
"α입력",
"토질계수를 직접 넣을 때(2종 이상 토층 가중평균) — 0 이면 표",
src=f"{s} 1 가 (1) 주",
rng=(0, "4.0"), # 원문 α 1.0 ∼ 4.0
),
]
common = [
@@ -193,7 +194,9 @@ def part3(C) -> list[dict]:
f"{look(f'{no} α강관', 'α', N치=chr(39) + '20 이상' + chr(39))})",
),
st("β", look(f"{no} β", "β", 항타길이="항타길이", 판두께="판두께")),
st("Ta", look(f"{no} Ta강관", "Ta", 항타길이="항타길이", 파일경="파일경"), "분/본"),
# 원문 β 표 「16 이하」 · Ta 표 「16이하」 — 같은 칸 글자가 달라 맞춤
st("Ta길이", "만약(항타길이 == '16 이하', '16이하', 항타길이)"),
st("Ta", look(f"{no} Ta강관", "Ta", 항타길이="Ta길이", 파일경="파일경"), "분/본"),
],
"α * β * Ta",
{"평균N": 15, "항타길이": "17∼32", "판두께": "12", "파일경": "500∼800"},
@@ -353,6 +356,7 @@ def vibro(C) -> list[dict]:
"α입력",
"토질계수를 직접 넣을 때(여러 토질 가중평균) — 0 이면 표",
src=f"{s} 2 나",
rng=(0, "1.20"), # 원문 α 0.60 ∼ 1.20
),
*fixes(no, 4, "2 다 (2)"),
],
@@ -103,6 +103,7 @@ def marine(C) -> list[dict]:
"746㎾당 준설능력을 직접 넣을 때(단거리 능력 (q1+q2)/2 등) — 0 이면 표",
"㎥/hr",
src=f"{s} 3",
rng=(0, 387), # 원문 q 표 32 ∼ 387
),
inp("전동환산출력", "펌프준설선의 전동환산 출력(bo)", "㎾", src=f"{s} 2"),
*es,
@@ -152,19 +153,24 @@ def grab(C) -> list[dict]:
inp(
"fN값",
"체적환산계수 표 N의 값(칸이 빈 줄 = 해당 없음)",
pick=["해당 없음", *C(f"{no} f", "N값")],
pick=[*C(f"{no} f", "N값"), "해당 없음"],
src=f"{s} 1",
),
inp("f입력", "체적환산계수를 직접 넣을 때 — 0 이면 표", src=f"{s} 1"),
inp(
"f입력",
"체적환산계수를 직접 넣을 때 — 0 이면 표",
src=f"{s} 1",
rng=(0, "1.00"),
),
inp("k분류", "버킷계수 표 토질 분류", pick=C(f"{no} k", "분류"), src=f"{s} 2"),
inp("k상태", "버킷계수 표 상태", pick=C(f"{no} k", "상태"), src=f"{s} 2"),
inp(
"kN값",
"버킷계수 표 N의 값(칸이 빈 줄 = 해당 없음)",
pick=["해당 없음", *C(f"{no} k", "N값")],
pick=[*C(f"{no} k", "N값"), "해당 없음"],
src=f"{s} 2",
),
inp("k입력", "버킷계수를 직접 넣을 때 — 0 이면 표", src=f"{s} 2"),
inp("k입력", "버킷계수를 직접 넣을 때 — 0 이면 표", src=f"{s} 2", rng=(0, "1.00")),
inp("평균수심", "평균수심", "m", src=f"{s} 3"),
inp("E1", "흙의 두께", pick=C(f"{no} E1", "구분"), src=f"{s} 4 가"),
inp("E2", "해상조건", pick=C(f"{no} E2", "구분"), src=f"{s} 4 나"),
@@ -58,7 +58,7 @@ def part2b(C) -> list[dict]:
e_in(no),
],
[
st("W", f"로터폭 - {c(no, '유효혼합폭 — Rotor 폭에서 뺌')}", "m"),
st("W", f"최대(로터폭 - {c(no, '유효혼합폭 — Rotor 폭에서 뺌')}, 0)", "m"),
st("V", c(no, "작업속도(V)"), "m/hr"),
st("P", auto("혼합횟수", c(no, "혼합횟수(평균)")), "회"),
st("E", auto("E입력", look(f"{no} E", "E", 작업조건="작업조건"))),
@@ -80,21 +80,13 @@ def part2b(C) -> list[dict]:
short,
name,
"㎥/hr",
[e_in(no, "작업효율을 직접 넣을 때 — 0 이면 원문 값")],
[
inp(
"q입력",
"작업능력을 직접 넣을 때 — 0 이면 원문 값",
"㎥/hr",
src=f"건설품셈 공통 {no}",
),
e_in(no, "작업효율을 직접 넣을 때 — 0 이면 원문 값"),
],
[
st("q", auto("q입력", c(no, q)), "㎥/hr"),
st("q", c(no, q), "㎥/hr"),
st("E", auto("E입력", c(no, "작업효율(E)"))),
],
"q * E",
{"q입력": 0, "E입력": 0},
{"E입력": 0},
memo="Q = q × E",
)
)
@@ -429,8 +421,20 @@ def concrete_haul(C) -> list[dict]:
inp("공차속도", "공차시 평균주행속도", "㎞/hr", src=f"{s} 1"),
inp("슬럼프", "슬럼프", pick=["4㎝ 이하", "5㎝ 이상"], src=f"{s} 1"),
inp("펌프조합", "콘크리트 펌프와 조합작업", pick=["아니오", "예"], src=f"{s} 1"),
inp("배출시간입력", "배출시간(t3) — 0 이면 원문 범위 가운데", "분", src=f"{s} 1"),
inp("대기시간입력", "대기시간(t4) — 0 이면 원문 범위 가운데", "분", src=f"{s} 1"),
inp(
"배출시간입력",
"배출시간(t3) — 0 이면 원문 범위 가운데",
"분",
src=f"{s} 1",
rng=(0, 4),
),
inp(
"대기시간입력",
"대기시간(t4) — 0 이면 원문 범위 가운데",
"분",
src=f"{s} 1",
rng=(0, 10),
),
e,
],
[
@@ -472,8 +476,20 @@ def concrete_haul(C) -> list[dict]:
inp("규격", "덤프트럭 규격(톤)", pick=C(f"{no} W", "규격"), src=f"{s} 2 가"),
*plant,
inp("운반거리", "편도운반거리(L · 15㎞까지)", "㎞", src=f"{s} 2 나"),
inp("하역시간입력", "하역시간(t1) — 0 이면 원문 범위 가운데", "분", src=f"{s} 2"),
inp("대기시간입력", "대기시간(t2) — 0 이면 원문 범위 가운데", "분", src=f"{s} 2"),
inp(
"하역시간입력",
"하역시간(t1) — 0 이면 원문 범위 가운데",
"분",
src=f"{s} 2",
rng=(0, 2),
),
inp(
"대기시간입력",
"대기시간(t2) — 0 이면 원문 범위 가운데",
"분",
src=f"{s} 2",
rng=(0, 10),
),
e,
],
[