feat(794-2a2): M01 보강 — 자재 운반 GF 둘 · 기계 채집 자체 GX · 덤프운반 GF000284 적재기계 · 덤프 고르기
- GF000335 시멘트운반 · GF000336 철근운반(산림 10-1 · 10-2) — 운임 = 자재 구역화물(톤급 · 거리 줄) ÷ 1.1 ÷ 적재 톤 · 하차 품 = 입력(기본값 없음 · 옛 판 값은 설명 참고만) - GX000004 깬잡석 · 야면석 · 고임돌 · 파쇄석 채집(기계) — 굴착기 1회 N개 · 건설 공통 8-2-3(GC001147) · 상차 · 소운반 덤프 8-2-8(GC001155) · 실무 봉화#3 Q 12.38 · 9.44 재현 - GF000284 입력 끝에 적재기계(굴착기 0.2~1.0 · 로더 타이어 1.34 · 1.72) · 덤프(15 · 8 · 24ton) — 첫째 = 원문 · 기존 셈 그대로(54 조합 전후 같음) - 빌더 build_로직_M01보강_794_2a2.py = M01 [저장] 길 · 지킴 시험 test_794_2a2_m01_add.py Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,436 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""M01 보강(794-2a2 · 요구 653 · 분석 652-794-2a 2 장 번 1 · 3 · 9) — 로직 셋 더함 · GF000284 넓힘.
|
||||
|
||||
돌리기: ./venv/Scripts/python.exe resources/master_data/scripts/build_로직_M01보강_794_2a2.py
|
||||
- 저장 = M01 화면 [저장] 길(`M01_MasterData_Store.save` — 대장 키 · 검사 · 글 모양 유지) · 한 번 돌림(있으면 멈춤).
|
||||
- 1 자재 운반 — 산림 10-1 시멘트운반 · 10-2 철근운반 GF 둘: 운임 = 자재 구역화물(톤급 · 거리 이내) ÷ 적재 톤 ·
|
||||
하차 = 보통인부 품 입력(원문 「인도조건에 따라」 · 품 수 없음 · 옛 판 값은 설명에 참고로만).
|
||||
- 9 기계 채집 — 자체 GX 한 줄: 굴착기 1 회 N 개(q = N ÷ ㎡당 개수) · 건설 공통 8-2-3 작업량(GC001147) ·
|
||||
상차 · 소운반 덤프 8-2-8(GC001155) · 근거 = 산림 13-2-4 주② · 13-2-3 주⑪.
|
||||
- 3 덤프 조합 — GF000284 입력 끝에 적재기계 · 덤프 고르기(첫째 = 원문 굴착기 0.7㎥ · 15ton = 기존 셈 그대로).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import sys
|
||||
from decimal import Decimal as D
|
||||
from pathlib import Path
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
MASTER = HERE.parent
|
||||
sys.path.insert(0, str(MASTER.parents[1]))
|
||||
from M01_MasterData import M01_MasterData_Store as st # noqa: E402
|
||||
|
||||
F10 = "로직_산림품셈_10장_자재․장비_운반.json"
|
||||
FX = "로직_자체.json"
|
||||
REGIONS = [
|
||||
"전국평균", "전국", "서울", "경기", "강원", "충북", "충남", "전북", "경북",
|
||||
"경남", "부산", "제주", "대구", "인천", "대전", "울산", "세종", "전남광주",
|
||||
] # fmt: skip
|
||||
ROCK = ["암석작업(연암・보통암・경암)", "해당 없음", "전석섞인토사"]
|
||||
NAMES = (
|
||||
"시멘트운반(구역화물 운임 + 하차비)",
|
||||
"철근운반(구역화물 운임 + 하차비)",
|
||||
"깬잡석 · 야면석 · 고임돌 · 파쇄석 채집(기계)",
|
||||
)
|
||||
|
||||
|
||||
# ── 1 자재 운반 ─────────────────────────────────────────────────────────
|
||||
def _freight() -> tuple[list[str], list[str]]:
|
||||
"""구역화물 줄 규격 「<톤급>, <거리>」 → (톤급 목록 · 거리 목록) — 2.0톤이하는 뺌 · 원문 10.5톤 첫째."""
|
||||
rows = json.loads((MASTER / "재료_자재품목.json").read_text(encoding="utf-8"))["줄"]
|
||||
tons, kms = [], []
|
||||
for r in rows:
|
||||
if r.get("이름") != "구역화물" or ", " not in str(r.get("규격")):
|
||||
continue
|
||||
ton, km = r["규격"].split(", ")
|
||||
tons += [ton] if ton not in tons and not ton.endswith("이하") else []
|
||||
kms += [km] if km not in kms else []
|
||||
tons.remove("10.5톤")
|
||||
return ["10.5톤", *tons], kms
|
||||
|
||||
|
||||
def _chain(name: str, pairs: list[tuple[str, D]], last: D) -> str:
|
||||
"""고른 글 → 수 — 만약(name == 'a', 1, 만약(…, last))."""
|
||||
text = str(last)
|
||||
for label, value in reversed(pairs):
|
||||
text = f"만약({name} == '{label}', {value}, {text})"
|
||||
return text
|
||||
|
||||
|
||||
def haul(no: str, what: str, unit: str, per: str, old: str) -> dict:
|
||||
tons, kms = _freight()
|
||||
t_pairs = [(t, D(t.removesuffix("톤"))) for t in tons[1:]]
|
||||
sack = no == "10-1"
|
||||
mid = [
|
||||
{"이름": "적재량", "식": _chain("톤급", t_pairs, D("10.5")), "단위": "ton"},
|
||||
]
|
||||
if sack:
|
||||
mid.append(
|
||||
{"이름": "포수", "식": "1000 / 40", "단위": "포/ton", "출처": "산림품셈 10-1 주"}
|
||||
)
|
||||
div = "1.1 * 적재량 * 포수" if sack else "1.1 * 적재량"
|
||||
return {
|
||||
"원문번호": no,
|
||||
"이름": f"{what}(구역화물 운임 + 하차비)",
|
||||
"결과단위": unit,
|
||||
"출처": f"산림품셈 {no}",
|
||||
"소유": "공용",
|
||||
"비고": (
|
||||
f"운반비 = 구역화물 운임(자재 「구역화물」 톤급 · 거리 이내 줄 · 원/회) ÷ 적재 톤{per}"
|
||||
" · 해석: 적재 톤 = 톤급 · ÷ 1.1 = 운임의 부가세 뺌(실무 · 원문 없음)"
|
||||
" · 하차비 = 보통인부 하차 품(입력 · 원문 「1회 · 인도조건에 따라」 · 품 수 없음)"
|
||||
f" · 옛 판 참고(현행 원문 없음): {old}"
|
||||
),
|
||||
"시험입력": {"톤급": "10.5톤", "거리": "20km", "하차품": D("0.0489")},
|
||||
"입력": [
|
||||
{
|
||||
"이름": "톤급",
|
||||
"설명": "구역화물 차 톤급 — 원문 10.5ton",
|
||||
"고르기": tons,
|
||||
"출처": f"산림품셈 {no}",
|
||||
},
|
||||
{
|
||||
"이름": "거리",
|
||||
"설명": "운반 거리 구간(이내) — 구역화물 운임표 거리",
|
||||
"고르기": kms,
|
||||
"출처": f"산림품셈 {no}",
|
||||
},
|
||||
{
|
||||
"이름": "하차품",
|
||||
"설명": f"하차 보통인부 품(ton당) — 인도조건에 따라 · 옛 판 참고 {old}",
|
||||
"단위": "인/ton",
|
||||
"출처": f"산림품셈 {no}",
|
||||
"비고": "기본값 없음 — 설계자 입력",
|
||||
},
|
||||
],
|
||||
"중간": mid,
|
||||
"호표": [
|
||||
{
|
||||
"종류": "재료",
|
||||
"요소": {
|
||||
"구분": "운송·용역",
|
||||
"상세구분": "화물운임",
|
||||
"검색어": "구역화물 {톤급}, {거리}",
|
||||
},
|
||||
"이름": "구역화물 운임",
|
||||
"단위": "회",
|
||||
"수량": f"1 / ({div})",
|
||||
"비목": "경비",
|
||||
"출처": f"산림품셈 {no}",
|
||||
},
|
||||
{
|
||||
"종류": "인력",
|
||||
"요소": "LB000002",
|
||||
"이름": "보통인부(하차)",
|
||||
"단위": "인",
|
||||
"수량": "하차품 / 포수" if sack else "하차품",
|
||||
"비목": "노무비",
|
||||
"출처": f"산림품셈 {no}",
|
||||
},
|
||||
],
|
||||
"덧줄": [],
|
||||
"끝수": None,
|
||||
}
|
||||
|
||||
|
||||
# ── 9 기계 채집 ─────────────────────────────────────────────────────────
|
||||
K_ROCK = "버킷에 넣기 어렵고 불규칙한 공극이 생기는 것으로서 발파 또는 리퍼작업 등에 의하여 얻어진 암과 파쇄암, 호박돌, 역 등인 경우"
|
||||
DIGGERS = ["0201-0070", "0201-0020", "0201-0040", "0201-0060", "0201-0080", "0201-0100"]
|
||||
DUMPS = [("0602-0025", D("2.5")), ("0602-0045", D("4.5")), ("0602-0060", D(6)), ("0602-0080", D(8))]
|
||||
|
||||
|
||||
def gather() -> dict:
|
||||
q147 = (
|
||||
"로직(GC001147, 버킷용량=q, 규격구분=규격구분, 선회각도=선회각도, "
|
||||
f"버킷조건='{K_ROCK}', 현장조건='흐트러진 상태', 등급=등급, 토질명='파쇄암', "
|
||||
"E보정='해당 없음', 협소현장='해당 없음', f=1, E입력=0, 싸이클입력=0)"
|
||||
)
|
||||
q155 = (
|
||||
"로직(GC001155, 적재용량=덤프T, 단위중량=쌓기무게, 체적변화율=1, f=1, 운반거리=운반거리, "
|
||||
"도로상태='교차가 힘든 산간지도로 및 제방 등의 도로', 적하토질='모래, 역, 호박돌', "
|
||||
"적하조건=적하조건, 적재장소='적재장소가 좁아서 목적장소에 진입하는데 불편을 느낄 때', "
|
||||
"덮개='해당 없음', 세륜='안 함', 적재방법='적재기계', 적재싸이클=cm, 적재버킷=q, "
|
||||
"버킷계수=K, 적재효율=E, 인력종류='석재류', 적재시간입력=0, E입력=0)"
|
||||
)
|
||||
dig = "로직(GC000267, 기계=굴착기, 지역=지역, 보정작업=보정작업)"
|
||||
return {
|
||||
"원문번호": "13-2-4",
|
||||
"구분": "자체",
|
||||
"상세구분": "13장 구조물",
|
||||
"이름": NAMES[2],
|
||||
"결과단위": "원/㎡",
|
||||
"출처": "자체",
|
||||
"소유": "공용",
|
||||
"비고": (
|
||||
"깬잡석 · 야면석 · 고임돌 · 파쇄석 기계 채집 — 원문 품 없음: 산림 13-2-4 주② 「기계화 시공이 가능한"
|
||||
" 지역은 상기 품을 적용하지 않는다」 · 13-2-3 주⑪ 「건설 8-2-3 굴착기 참조」 · 실무 = 8-2-3 Q 식 +"
|
||||
" 1회 개수 · 해석: q = 1회 개수 ÷ ㎡당 개수(㎡ · f = 1) · K = 암·파쇄암 · E = 파쇄암 표(흐트러진)"
|
||||
" · 상차 = 채집과 같은 Q · 소운반 = 건설 공통 8-2-8(적재기계 = 같은 굴착기 · 산간지도로 · 좁은 적재장소)"
|
||||
),
|
||||
"시험입력": {
|
||||
"버킷개수": D(4),
|
||||
"쌓기개수": D(16),
|
||||
"굴착기": "0201-0070",
|
||||
"선회각도": D(90),
|
||||
"등급": "보통",
|
||||
"보정작업": ROCK[0],
|
||||
"상차": "포함",
|
||||
"덤프": "0602-0025",
|
||||
"운반거리": D("0.2"),
|
||||
"쌓기무게": D("0.575"),
|
||||
"적하조건": "불량",
|
||||
"지역": "전국평균",
|
||||
}, # fmt: skip
|
||||
"입력": [
|
||||
{"이름": "버킷개수", "설명": "굴착기가 한 번에 담는 돌 개수", "단위": "개"},
|
||||
{
|
||||
"이름": "쌓기개수",
|
||||
"설명": "쌓기 1㎡에 드는 돌 개수(돌 뒷길이에 따름)",
|
||||
"단위": "개/㎡",
|
||||
},
|
||||
{
|
||||
"이름": "굴착기",
|
||||
"설명": "채집 · 상차 굴착기(무한궤도)",
|
||||
"고르기": DIGGERS,
|
||||
"출처": "건설품셈 공통 8-2-3",
|
||||
},
|
||||
{
|
||||
"이름": "선회각도",
|
||||
"설명": "선회 각도",
|
||||
"단위": "도",
|
||||
"고르기": [D(90), D(135), D(45), D(180)],
|
||||
"출처": "건설품셈 공통 8-2-3 3",
|
||||
},
|
||||
{
|
||||
"이름": "등급",
|
||||
"설명": "작업 조건 등급(파쇄암 작업효율)",
|
||||
"고르기": ["보통", "불량"],
|
||||
"출처": "건설품셈 공통 8-2-3 2",
|
||||
},
|
||||
{
|
||||
"이름": "보정작업",
|
||||
"설명": "암석 작업이면 기계손료 가산",
|
||||
"고르기": ROCK,
|
||||
"출처": "건설품셈 공통 8-1-7 1",
|
||||
},
|
||||
{"이름": "상차", "설명": "채집한 돌을 덤프에 싣는지", "고르기": ["포함", "안 함"]},
|
||||
{
|
||||
"이름": "덤프",
|
||||
"설명": "소운반 덤프트럭",
|
||||
"고르기": [d for d, _ in DUMPS],
|
||||
"출처": "건설품셈 공통 8-2-8",
|
||||
},
|
||||
{
|
||||
"이름": "운반거리",
|
||||
"설명": "소운반 편도 거리 — 0 이면 소운반 없음",
|
||||
"단위": "㎞",
|
||||
"출처": "건설품셈 공통 8-2-8",
|
||||
},
|
||||
{"이름": "쌓기무게", "설명": "쌓기 1㎡ 돌 무게", "단위": "t/㎡"},
|
||||
{
|
||||
"이름": "적하조건",
|
||||
"설명": "덤프 적하 작업조건",
|
||||
"고르기": ["불량", "보통", "양호"],
|
||||
"출처": "건설품셈 공통 8-2-8 4",
|
||||
},
|
||||
{
|
||||
"이름": "지역",
|
||||
"설명": "기계 연료값을 고를 지역",
|
||||
"고르기": REGIONS,
|
||||
"출처": "건설품셈 공통 8-1-7 5",
|
||||
},
|
||||
],
|
||||
"중간": [
|
||||
{"이름": "q", "식": "반올림(버킷개수 / 쌓기개수, 2)", "단위": "㎡"},
|
||||
{
|
||||
"이름": "규격구분",
|
||||
"식": "만약(굴착기 == '0201-0020' 또는 굴착기 == '0201-0040', '0.12∼0.4', "
|
||||
"만약(굴착기 == '0201-0100', '1.0∼1.2', '0.6∼0.8'))",
|
||||
},
|
||||
{"이름": "K", "식": f"찾기(CC000042, 현장조건='{K_ROCK}').K"},
|
||||
{
|
||||
"이름": "E",
|
||||
"식": "찾기(CC000043, 현장조건='흐트러진 상태', 등급=등급, 토질명='파쇄암').E",
|
||||
},
|
||||
{"이름": "cm", "식": "찾기(CC000045, 규격=규격구분, 각도=선회각도).시간", "단위": "초"},
|
||||
{"이름": "Q", "식": q147, "단위": "㎡/hr", "출처": "건설품셈 공통 8-2-3"},
|
||||
{"이름": "덤프T", "식": _chain("덤프", DUMPS[1:], DUMPS[0][1]), "단위": "ton"},
|
||||
{"이름": "Q2", "식": q155, "단위": "㎡/hr", "출처": "건설품셈 공통 8-2-8"},
|
||||
],
|
||||
"호표": [
|
||||
{"종류": "로직", "요소": dig, "이름": "굴착기(채집)", "단위": "시간", "수량": "1 / Q"},
|
||||
{
|
||||
"종류": "로직",
|
||||
"요소": dig,
|
||||
"이름": "굴착기(상차)",
|
||||
"단위": "시간",
|
||||
"수량": "만약(상차 == '포함', 1 / Q, 0)",
|
||||
},
|
||||
{
|
||||
"종류": "로직",
|
||||
"요소": "로직(GC000269, 기계=덤프, 지역=지역, 보정작업=보정작업)",
|
||||
"이름": "덤프트럭(소운반)",
|
||||
"단위": "시간",
|
||||
"수량": "만약(운반거리 > 0, 1 / Q2, 0)",
|
||||
},
|
||||
],
|
||||
"덧줄": [],
|
||||
"끝수": None,
|
||||
}
|
||||
|
||||
|
||||
# ── 3 덤프 조합 ─────────────────────────────────────────────────────────
|
||||
LOADERS = ["0302-0134", "0302-0172"]
|
||||
BUCKET = [("0201-0020", "0.2"), ("0201-0040", "0.4"), ("0201-0060", "0.6"), ("0201-0080", "0.8"),
|
||||
("0201-0100", "1.0"), ("0302-0134", "1.34"), ("0302-0172", "1.72")] # fmt: skip
|
||||
LOOSE = "흐트러진 산적상태에서 적재하는 것으로 위 상태보다 약간 삽날이 들어가기 어려운 토질로서 버킷에 가득 채울 수 있는 것, 즉 점토, 역질토"
|
||||
LUMP = "버킷에 넣기 어렵고 허술하며 불규칙한 공극이 생긴 것, 예를 들면 발파 또는 리퍼로 깎은 암괴, 호박돌, 역 등"
|
||||
|
||||
|
||||
def dump(row: dict) -> dict:
|
||||
"""GF000284 — 입력 끝에 적재기계 · 덤프 · 0.7 · 20 · 0.85 · 15 수를 고른 값으로(기본 = 그 수)."""
|
||||
old = {m["이름"]: m for m in row["중간"]}
|
||||
assert "q0" not in old, "이미 넓힘"
|
||||
k_loader = f"만약(암 == 0, 찾기(CC000048, 현장조건='{LOOSE}').계수, 찾기(CC000049, 현장조건='{LUMP}').계수)"
|
||||
loader_cm = (
|
||||
"찾기(CC000051, 기종='타이어식').m * 찾기(CC000052, 항목='편도주행거리(표준)').값 + "
|
||||
"찾기(CC000047, 기종='타이어식', 작업방법='산적상태에서 담을 때', 현장조건='용이한 경우').t1 + "
|
||||
"찾기(CC000052, 항목='기본시간(t2, 기어변화 등)').값"
|
||||
)
|
||||
swap = {
|
||||
"Q1": ("3600 * 0.7 * K * (1 / L) * E0 / 찾기(QF000336, 구분='㎝(초)').값", "3600 * q0 * K * (1 / L) * E0 / Cm"),
|
||||
"q": ("15 / 감마 * L", "덤프T / 감마 * L"),
|
||||
"n": ("q / (0.7 * K)", "q / (q0 * K)"),
|
||||
"Cmt": ("20 * n / (60 * 0.85)", "Cms * n / (60 * Es)"),
|
||||
} # fmt: skip
|
||||
mid = []
|
||||
for m in row["중간"]:
|
||||
m = dict(m)
|
||||
if m["이름"] in swap:
|
||||
a, b = swap[m["이름"]]
|
||||
assert m["식"].count(a) == 1, m["이름"]
|
||||
m["식"] = m["식"].replace(a, b)
|
||||
if m["이름"] == "K":
|
||||
m["식"] = f"만약(로더 == 1, {k_loader}, {m['식']})"
|
||||
m["출처"] += " · 건설품셈 공통 8-2-5 2"
|
||||
if m["이름"] == "E0":
|
||||
m["식"] = (
|
||||
"만약(로더 == 1, 찾기(CC000050, 현장조건='흐트러진 상태', 등급='보통', "
|
||||
f"토질명=만약(암 == 0, '모래, 사질토', '파쇄암')).E, {m['식']})"
|
||||
)
|
||||
m["출처"] += " · 건설품셈 공통 8-2-5 3"
|
||||
if m["이름"] == "Q1":
|
||||
for x in [
|
||||
{"이름": "로더cm", "식": loader_cm, "단위": "초", "출처": "건설품셈 공통 8-2-5 1"},
|
||||
{
|
||||
"이름": "Cm",
|
||||
"식": "만약(로더 == 1, 로더cm, 만약(적재기계 == '0201-0070', "
|
||||
"찾기(QF000336, 구분='㎝(초)').값, 찾기(CC000045, 규격=규격구분, 각도=180).시간))",
|
||||
"단위": "초",
|
||||
"출처": "산림품셈 10-12-1 주⑤ · 건설품셈 공통 8-2-3 3",
|
||||
},
|
||||
{
|
||||
"이름": "Cms",
|
||||
"식": "만약(로더 == 1, 로더cm, 만약(적재기계 == '0201-0070', 20, "
|
||||
"찾기(CC000045, 규격=규격구분, 각도=135).시간))",
|
||||
"단위": "초",
|
||||
"출처": "산림품셈 10-12-1 2. 운반 · 건설품셈 공통 8-2-3 3",
|
||||
},
|
||||
{
|
||||
"이름": "Es",
|
||||
"식": "만약(로더 == 1, E0, 0.85)",
|
||||
"출처": "산림품셈 10-12-1 2. 운반",
|
||||
},
|
||||
{
|
||||
"이름": "덤프T",
|
||||
"식": "만약(덤프 == '0602-0080', 8, 만약(덤프 == '0602-0240', 24, 15))",
|
||||
"단위": "ton",
|
||||
"출처": "산림품셈 10-12-1 주① · 건설품셈 공통 8-2-8",
|
||||
},
|
||||
]:
|
||||
mid.append(x)
|
||||
mid.append(m)
|
||||
if m["이름"] == "암":
|
||||
mid += [
|
||||
{"이름": "로더", "식": "만약(적재기계 == '0302-0134' 또는 적재기계 == '0302-0172', 1, 0)"},
|
||||
{"이름": "q0", "식": _chain("적재기계", [(a, D(b)) for a, b in BUCKET], D("0.7")), "단위": "㎥"},
|
||||
{"이름": "규격구분", "식": "만약(q0 <= 0.4, '0.12∼0.4', 만약(q0 <= 0.8, '0.6∼0.8', '1.0∼1.2'))"},
|
||||
] # fmt: skip
|
||||
lines = [dict(x) for x in row["호표"]]
|
||||
a0 = "로직(GC000267, 기계='0201-0070', 지역=지역, 보정작업=보정작업)"
|
||||
a1 = "로직(GC000269, 기계='0602-0150', 지역=지역, 보정작업=보정작업)"
|
||||
assert lines[0]["요소"] == a0 and lines[1]["요소"] == a1
|
||||
lines[0]["요소"] = (
|
||||
"로직(GC000267, 기계=적재기계, 지역=지역, 보정작업=만약(로더 == 1, '해당 없음', 보정작업))"
|
||||
)
|
||||
lines[1]["요소"] = "로직(GC000269, 기계=덤프, 지역=지역, 보정작업=보정작업)"
|
||||
more = [
|
||||
{
|
||||
"이름": "적재기계",
|
||||
"설명": "덤프에 싣는 기계 — 원문 굴착기 0.7㎥",
|
||||
"고르기": ["0201-0070", *DIGGERS[1:], *LOADERS],
|
||||
"출처": "산림품셈 10-12-1 주① · 건설품셈 공통 8-2-3 · 8-2-5",
|
||||
},
|
||||
{
|
||||
"이름": "덤프",
|
||||
"설명": "덤프트럭 톤급 — 원문 15ton",
|
||||
"고르기": ["0602-0150", "0602-0080", "0602-0240"],
|
||||
"출처": "산림품셈 10-12-1 주① · 건설품셈 공통 8-2-8",
|
||||
},
|
||||
]
|
||||
memo = (
|
||||
" · 적재기계 · 덤프 고르기(794-2a2) — 첫째 = 원문(굴착기 0.7㎥ · 15ton · 셈 같음) · 다른 굴착기 ="
|
||||
" 8-2-3 싸이클 표(적재 180° · 운반 적재 135° — 0.7㎥ 이면 22 · 20초와 같음) · K · E0 · Es 는 산림 값 ·"
|
||||
" 해석: 로더(타이어) cm = m·ℓ + t1 + t2(8-2-5 · 산적 · 용이 · 표준 8m) · K = 산적 흐트러진 · 암은"
|
||||
" 자연·기타 넣기 어려움 · E = 흐트러진 보통 · Es = E · 손료 보정 없음(8-1-7 1 = 무한궤도만)"
|
||||
)
|
||||
return {
|
||||
**row,
|
||||
"비고": row["비고"] + memo,
|
||||
"입력": row["입력"] + more,
|
||||
"중간": mid,
|
||||
"호표": lines,
|
||||
}
|
||||
|
||||
|
||||
def main() -> None:
|
||||
files, _ = st.loaded()
|
||||
have = {
|
||||
r.get("이름") for d in files.values() if d.get("그룹") == "로직" for r in d.get("줄", [])
|
||||
}
|
||||
if any(n in have for n in NAMES):
|
||||
raise SystemExit("이미 넣음 — 멈춤")
|
||||
gf = next(r for r in files[F10]["줄"] if r["키"] == "GF000284")
|
||||
cement = haul(
|
||||
"10-1",
|
||||
"시멘트운반",
|
||||
"원/포",
|
||||
" ÷ 포수(40kg 포대 · 원문 주)",
|
||||
"적상 0.18 · 적하 0.13 인/ton",
|
||||
)
|
||||
rebar = haul("10-2", "철근운반", "원/ton", "", "철근 하차 11분/ton(2인 1조)")
|
||||
batch = [
|
||||
{
|
||||
"file": F10,
|
||||
"version": st.read(F10)[1],
|
||||
"changes": [
|
||||
{"op": "edit", "key": "GF000284", "row": dump(gf)},
|
||||
{"op": "add", "row": cement},
|
||||
{"op": "add", "row": rebar},
|
||||
],
|
||||
},
|
||||
{"file": FX, "version": st.read(FX)[1], "changes": [{"op": "add", "row": gather()}]},
|
||||
]
|
||||
print(st.save(batch))
|
||||
files, _ = st.loaded()
|
||||
for d in (files[F10], files[FX]):
|
||||
for r in d["줄"]:
|
||||
if r.get("이름") in NAMES:
|
||||
print(r["키"], r["이름"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.stdout.reconfigure(encoding="utf-8")
|
||||
main()
|
||||
Reference in New Issue
Block a user