diff --git a/B08_Quantity/B08_Quantity_Engine_UnitQuantity.py b/B08_Quantity/B08_Quantity_Engine_UnitQuantity.py index f23a2dcd..b92aaac4 100644 --- a/B08_Quantity/B08_Quantity_Engine_UnitQuantity.py +++ b/B08_Quantity/B08_Quantity_Engine_UnitQuantity.py @@ -293,7 +293,9 @@ STONE_MASONRY = { # ⚠ **구조물마다 다른 값이다** — 실무 관측: 반중력식 옹벽 0.32 m/m · 돌기슭막이 0.39 m · # 돌골막이 0.5 m/개소(2026-09-08 랩탑 보조). 여기 0.5 하나로 돌고 있으니 그 사실을 # 적어 둔다 — 관측 원단위가 있는 종류는 그 표가 이기고, 없는 종류만 이 값으로 선다. - "weep_hole_length_m": 0.5, # 물구멍관 1개소당 관 길이 + # ⓘ 2026-09-13 — 돌쌓기(기슭막이)는 **평균두께**로 갈음(브레인 판정). + # 이 값은 골막이 정본용으로만 남음. + "weep_hole_length_m": 0.5, # 물구멍관 1개소당 관 길이 — 골막이 "mortar_m3_per_m2": 0.009, # 줄눈 모르터 (찰쌓기만) # ⚠ 터파기 여유폭·되메우기 두께는 **공용 한 벌**로 옮겼다 # (`common_util/common_util_excavation.py` — 화면 B06 과 짝인 TS 가 있다). @@ -1066,7 +1068,7 @@ def stone_masonry( ) # ⚠ 여기서 멈춘다 — 모르터를 시멘트·모래로 쪼개지 않는다(㉢). - # 물구멍 — 벽면적 2㎡당 1개소, 개소당 0.5m. + # 물구멍 — 벽면적 2㎡당 1개소, 개소당 관 길이 = **평균두께**(관이 벽을 가로지름). # ⚠ 이것은 **관(파이프) 자재**이지 공제 대상이 아니다. 품셈 1-2-1 이 「공제하지 않는다」고 # 말하는 물구멍은 **콘크리트 체적에서 뺄 구멍**이고, 여기 값은 그 구멍에 넣는 **관 길이**다. # ⚠⚠ **㉥ 이중계상** — 품셈 13-6-2·13-7-2 [주]③ 은 제잡비 **윗단** 값에 @@ -1078,17 +1080,17 @@ def stone_masonry( # 이름에 붙인다(`물구멍 Ø50`). 지어내지 않고 규격 없는 이름으로 둔다. # ⚠ 「미확정」만 적으면 사용자가 무엇을 정해야 하는지 모른다 — # **지금 무슨 값으로 돌고 있는지**를 함께 적는다(원단위 미확보와 같은 방식). - # ⓘ 정본은 개소당 관 길이를 **평균두께**로 잡는다(H=2.0 에서 0.83m). 우리는 상수 0.5m 라 - # 그만큼 짧게 선다 — 관은 벽을 가로지르므로 정본 쪽이 이치에 맞는다(미결). + # ⭐ 2026-09-13 브레인 판정(PLAN 10장) — 개소당 관 길이 = **평균두께**. 정본이 그렇게 잡고 + # 관은 벽을 가로지르므로 이치에도 맞음. 옛 상수 0.5m 는 그만큼 짧게 섰음. + # ⚠ 골막이(`_Revetment`)는 그 정본이 0.5 라 그대로 둠 — 여기는 기슭막이 계열만. hole_area, hole_dia, hole_basis = weep_hole_spec(options) components.append( Component( "물구멍관", "m", - masonry_area / hole_area * constants["weep_hole_length_m"], + masonry_area / hole_area * thickness, DESTINATION["물구멍관"], - f"돌쌓기 ÷ {hole_area:g}㎡/개소 × {constants['weep_hole_length_m']:g} m/개소" - f" · {hole_basis}", + f"돌쌓기 ÷ {hole_area:g}㎡/개소 × 평균두께 {thickness:.2f} m/개소 · {hole_basis}", spec=f"Ø{hole_dia}", ) ) diff --git a/resources/library_structure/masonry_wet.json b/resources/library_structure/masonry_wet.json index 31b8b90a..90081391 100644 --- a/resources/library_structure/masonry_wet.json +++ b/resources/library_structure/masonry_wet.json @@ -176,8 +176,8 @@ "seq": 9, "name": "물구멍관", "spec": "Ø{HOLE_DIA}", - "formula": "A/HOLE_AREA*0.5", - "formula_text": "돌쌓기 ÷ 개소당 벽면적 × 0.5 m/개소 (실무 관측 2㎡ · 법은 2~3㎡당 1개소 이상)", + "formula": "A/HOLE_AREA*(IF(TOP_IN>0,TOP_IN,L3/100+0.3)+IF(BOT_IN>0,BOT_IN,IF(TOP_IN>0,TOP_IN,L3/100+0.3)+0.3*MAX(H-1,0)))/2", + "formula_text": "돌쌓기 ÷ 개소당 벽면적 × 평균두께(관이 벽을 가로지름) — 2㎡ 기본 · 품셈 [주]⑤ 2~3㎡당 1개소 이상 · PVC Ø50(3~6㎝)", "refs": { "A": 1 }, "unit": "m", "destination": "material", diff --git a/resources/tester/test_b08_unit_quantity.py b/resources/tester/test_b08_unit_quantity.py index 2a90299c..d5b25d16 100644 --- a/resources/tester/test_b08_unit_quantity.py +++ b/resources/tester/test_b08_unit_quantity.py @@ -271,6 +271,18 @@ def test_물구멍_잠정값이_근거에_적힐것() -> None: assert "2~3㎡" in basis # 법이 정한 범위 +def test_물구멍관_길이는_평균두께() -> None: + """2026-09-13 브레인 판정(PLAN 10장) — 개소당 관 길이 = 평균두께(옛 상수 0.5m 아님). + + H=2.0 · 뒷길이 45 → 상부 0.75 · 하부 1.05 · 평균 0.90. 1:0.3 · 2㎡/개소. + """ + result = expand(돌쌓기찰(height=2.0, length=10.0, back_len_cm=45, face_slope_ratio=0.3)) + 돌쌓기 = 성분(result, "돌쌓기").amount + 물구멍관 = 성분(result, "물구멍관") + assert 물구멍관.amount == pytest.approx(돌쌓기 / 2.0 * 0.90) + assert "평균두께 0.90" in 물구멍관.basis + + def test_큰돌쌓기를_돌쌓기_식으로_돌리지_않을것() -> None: """⚠ 2026-09-07 발견 — 큰돌쌓기는 품셈 **13-6**, 돌쌓기는 **13-4** 로 **규격 축이 다르다**. 돌쌓기는 뒷길이(35·45·55·60㎝), 큰돌쌓기는 직경(40~60·60~80·80~100㎝).