From 6bcc872851f0052f8908dedc9866092e7518ddd9 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 14:13:10 +0900 Subject: [PATCH] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):=20?= =?UTF-8?q?=EC=84=B8=20=ED=8F=B4=EB=8D=94=20=EC=83=81=ED=98=B8=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=C2=B7=20COSTN.SMT=20=EC=A0=84=EC=88=98=20=ED=8C=8C?= =?UTF-8?q?=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 세 폴더 머리에 서로를 가리키는 블록을 넣음 — 또 갈라지지 않게. technical_info/01_임도/05_원가정보/원가계산_체계.md, original/원가계산/STmate/_meta.md, original/경쟁사 프로그램/STmate 분석/README.md 셋 다. 2026-09-13 에 ③이 ①②를 모르고 시작해 중복 분석한 사실도 함께 적음. COSTN.SMT 전수 파싱 — ②트랙이 해독해 둔 문법을 그대로 씀 - 맛보기 1건 + 실무 STC 7건에서 자원참조 1,570·품 1,460·Q식 187· 중간라벨 162·할증률 92 검출 - 참조되는 자원은 중기(X) 1,504 로 압도적. 노무 58·재료 7·경비 1. 단가산출은 거의 전부 중기 시간당 사용료를 작업량으로 나누는 계산임 - 중기 한 대를 참조하면 노무·재료·경비 세 성분을 각각 따로 끌어옴 (L 548·S 524·M 498). 총액 하나로 저장하면 안 되는 이유 - ⚠ Q 식이 한 꼴이 아님. 최소 10가지. 3600 계열(초)과 60 계열(분), 포설은 60*L*D*H*E*f/(N*Cm). 하드코딩 금지, 텍스트 평가 경로 필요 - 운반 계산이 적재시간+왕복시간+적하시간 으로 사이클을 쌓음. km/hr·km·m/min 인자가 함께 나옴. 임도 토공 운반에 직접 쓸모 - 할증률 92건이 품목마다 제각각 (2%·3%·5%·24%·52%·0.443%). BDQTY 입력 원장은 여전히 막혔으나 적용값은 읽힘 문서 23 신규, 파싱 스크립트 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 5 + .../20_분석/23_COSTN_SMT_전수파싱.md | 117 ++++++++++++++++++ .../40_스크립트/smt_expansion_parse.py | 62 ++++++++++ .../경쟁사 프로그램/STmate 분석/README.md | 14 +++ .../original/원가계산/STmate/_meta.md | 13 ++ .../01_임도/05_원가정보/원가계산_체계.md | 13 ++ 6 files changed, 224 insertions(+) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/23_COSTN_SMT_전수파싱.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_expansion_parse.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 5cbb149c..9a23889c 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -29,6 +29,7 @@ | 20 설정파일과 보고서 카탈로그 | **`Start8x.Ini`·`SET_REP`** — 간접비 코드 사전 301~370, 서식 75종 | (저장소 파일) | | 21 정정과 트랙 통합 | **⛔ `SMT` 판정 정정 · 지식DB 트랙 셋 통합 · `PRJLST.SMT` 설정 원장 · 암호화의 성격** | (저장소 파일) | | 22 UI 폼 분석 | **폼 233개 중 3개만 봤던 것** — 선택축 272개, `ACTTYP`·자리수 키·일괄변경 규칙 | (저장소 파일) | +| 23 `COSTN.SMT` 전수파싱 | **단가산출 원장** — 참조 1,570·품 1,460·Q식 187개(10꼴)·운반 사이클 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -86,6 +87,10 @@ | `ACTTYP`·`ACTOPT` | 뜻 모름 | **A** — 표준시장 적용 방식·끝전 보정 우선순위 | 22번 §3.3 | | `KCDNM` 등 6키 | 미확정 | **A** — 소수 자리수 설정 | 22번 §3.4 | | 변경 차수 | 최대 3차로 봄 | ⚠ **화면은 8차** — 저장 구조 재확인 필요 | 22번 §3.3 | +| `COSTN.SMT` 내용 | 「평문」까지만 | **전수 파싱** — 중기 참조 1,504건, 성분 셋을 각각 | 23번 | +| `Q` 식 | 한 꼴로 알았음 | ⚠ **최소 10가지 꼴** — 하드코딩 금지 | 23번 §3 | +| 운반 사이클 | 안 봤음 | **적재+왕복+적하** 구조·인자 확인 | 23번 §4 | +| 할증률 | `BDQTY` 암호화로 막힘 | ◐ **적용값 92건은 읽힘** | 23번 §5 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/23_COSTN_SMT_전수파싱.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/23_COSTN_SMT_전수파싱.md new file mode 100644 index 00000000..7f257889 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/23_COSTN_SMT_전수파싱.md @@ -0,0 +1,117 @@ +# `COSTN.SMT` 전수 파싱 — 단가산출 원장 + +파싱일: 2026-09-13 +문법 출처: **`original/원가계산/STmate/SIxMemo_구조.md`** (②트랙, 2026-08-15) — 그쪽이 해독해 둔 문법을 그대로 씀. +대상: 맛보기 1건 + 실무 STC 7건의 `COSTN.SMT` +재현 스크립트: `40_스크립트/smt_expansion_parse.py` + +## 1. 무엇이 들어 있나 + +`COSTN.SMT`는 **단가 하나하나의 산출 전개 텍스트**다. `BDQTY.DBF`가 암호화돼 막힌 자리를 **이 파일이 평문으로 대신 채운다.** + +```text +'1. 포설(그레이다 3.6 m)' + L=2.9'm', H=0.2'm', D=50 , f=1.0 + E=0.50 , N=4'회' + Cm=0.06*(50/4+50/4.0)+2*0.5= + Q=60*L*D*H*E*f/(N*Cm)='㎥/Hr' + '노무비' &X00006L& / Q = + '재료비' &X00006M& / Q = + '경 비' &X00006S& / Q = +``` + +## 2. 전수 집계 + +| 요소 | 검출 | +|---|---:| +| **자원 참조** `&코드&` | **1,570** | +| **품** (수량 + 단위) | **1,460** | +| **`Q` 식** | **187** | +| **중간 라벨** `:=A01` | **162** | +| **할증률** `n'%'` | **92** | + +### 참조되는 자원 종류 — 중기가 압도적 + +| 앞글자 | 뜻 | 건수 | +|---|---|---:| +| **`X`** | **중기** | **1,504** | +| `L` | 노무 | 58 | +| `M` | 재료 | 7 | +| `S` | 경비 | 1 | + +⇒ 단가산출(`D`코드)은 거의 전부 **중기 시간당 사용료를 작업량으로 나누는 계산**이다. 17번 §3(중기 호표)과 18번 §2.2(Q식)가 이 구조의 양 끝이다. + +### 가져오는 성분 — 세 성분을 고루 + +| 끝글자 | 뜻 | 건수 | +|---|---|---:| +| `L` | 노무비 성분 | 548 | +| `S` | 경비 성분 | 524 | +| `M` | 재료비 성분 | 498 | + +⇒ **중기 한 대를 참조하면 노무·재료·경비 세 성분을 각각 따로 끌어온다.** `&X00006L&` / `&X00006M&` / `&X00006S&`가 한 벌로 나온다. 07번 §1의 「총액 하나로만 저장하면 간접비 산정기초가 달라진다」가 여기서 확인된다. + +## 3. `Q` 식은 한 꼴이 아니다 — 187개, 최소 10가지 꼴 + +18번 §2.2는 `Q = 3600·q·K·f·E/Cm` 한 꼴만 봤다. **실제로는 작업 종류마다 다르다.** + +| 꼴 | 횟수 | 쓰임 | +|---|---:|---| +| `3600*q*K*f*E/Cm` | 56 | 굴삭 계열 (버킷) | +| `3600*q*k*E*f/Cm` | 26 | 같은 식, 인자 순서·대소문자만 다름 | +| `60*q1*F*E/Cm` | 16 | 분 단위 계열 | +| `60*P*f*E/Cm` | 12 | 출력(P) 기반 | +| `60*q1*f*E/Cm` | 10 | | +| `3600*q*K*f*E1/Cm1` | 4 | 인자에 번호가 붙은 변형 | +| `3600*q*K*f*E/Cms` | 4 | | +| `60*q*F*E/Cm` · `60*q*f*E1/Cm` | 각 4 | | +| `60*L*D*H*E*f/(N*Cm)` | — | 포설 계열 (길이·폭·두께) | + +⇒ **재구현은 `Q` 식을 하드코딩하면 안 된다.** 텍스트에 적힌 식을 그대로 평가하는 경로가 필요하다 — 18번 §2.1의 「좌→우 순차 평가」와 같은 요구다. + +`3600`(초→시간)과 `60`(분→시간) 두 계열이고, `Cm`(사이클 시간)의 단위가 각각 초·분이다. + +## 4. 단위 분포 — 운반 계산 인자가 드러난다 + +| 단위 | 횟수 | | 단위 | 횟수 | +|---|---:|---|---|---:| +| 분 | 216 | | `m/min` | 44 | +| 인 | 115 | | `(적재시간)` | 35 | +| `km/hr` | 85 | | `(왕복시간)` | 35 | +| `km` | 69 | | `hr` | 34 | +| `(적하시간)` | 64 | | `sec(135)` | 31 | +| `m` | 56 | | `Km` | 29 | + +⇒ **운반(덤프·도자) 계산이 `적재시간 + 왕복시간 + 적하시간`으로 사이클을 쌓는다.** `km/hr`(주행속도)·`km`(운반거리)가 함께 나오므로 `Cm = 적재 + 거리/속도 왕복 + 적하 + 대기` 꼴이다. 임도 설계에서 토공 운반이 큰 몫이라 Aislo에 직접 쓸모가 있다. + +`sec(135)`처럼 **괄호 안에 조건(선회각 등)이 붙는다** — 18번 §2.2의 `Cm = 15 sec (90°)`와 같은 표기다. + +## 5. 할증률 — 92건, 값이 다양 + +| 값 | 횟수 | | 값 | 횟수 | +|---|---:|---|---|---:| +| 2% | 33 | | 24% | 3 | +| 3% | 22 | | 8% | 3 | +| 5% | 9 | | 52% | 3 | +| 1% | 6 | | 11% | 2 | +| 9% | 6 | | 0.443% | 2 | + +⇒ **할증은 품목·작업마다 제각각**이며 일괄 적용값이 아니다. `52%`·`24%` 같은 큰 값은 잡재료·공구손료 계열로 보인다(07번 §4의 「금액 가산」). `0.443%` 같은 값은 개별 산정 결과다. + +⚠ `BDQTY`의 `X_HAL` 실값은 여전히 못 보지만, **적용된 할증률 자체는 이 텍스트에 남는다.** + +## 6. 이번 파싱이 바꾸는 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| `COSTN.SMT` | 21번에서 「평문」까지만 | ✅ **전수 파싱** — 참조 1,570·품 1,460·Q식 187 | +| 단가산출 참조 구조 | Q식 한 꼴만 봄 | ✅ **중기 참조 1,504건, 세 성분 각각** | +| `Q` 식 | 한 꼴로 알았음 | ⚠ **최소 10가지 꼴** — 하드코딩 금지 | +| 운반 사이클 | 안 봤음 | ✅ **적재+왕복+적하** 구조와 인자 | +| 할증률 | `BDQTY` 암호화로 막힘 | ◐ **적용값 92건은 읽힘** (입력 원장은 여전히 막힘) | + +## 7. 남은 것 + +1. 호표 단위로 갈라 **`D`코드 ↔ 전개 텍스트 ↔ 참조 중기 호표**를 잇기 — 지금은 요소별 집계까지만 +2. `Cm` 식 전수 수집 — 운반 사이클 공식을 꼴별로 정리 +3. ②트랙의 미해명 **10바이트 메모 인덱스** — 이것이 풀리면 `COSTN.DBF` 행과 메모를 정확히 이을 수 있음 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_expansion_parse.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_expansion_parse.py new file mode 100644 index 00000000..8279d1c0 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/smt_expansion_parse.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +"""COSTN.SMT 전개 텍스트 전수 파싱 — 자원 참조·품·할증·중간라벨·Q식. +문법 출처: original/원가계산/STmate/SIxMemo_구조.md (2026-08-15).""" +import sys, io, re, pathlib, zipfile, collections, json +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") + +SRC = [pathlib.Path(r"C:\경영정보(주)\STmate 자료\설계자료\실습(맛보기)\COSTN.SMT")] +for p in sorted(pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서").rglob("*.STC")): + SRC.append(p) + +RE_REF = re.compile(r"&([A-Z])(\d{5})([A-Z])&") # &M00034M& 종류·번호·성분 +RE_LABEL = re.compile(r":=\s*([A-Z]\d{2})") # :=A01 +RE_QTY = re.compile(r"([\d.]+)\s*'([^']{1,8})'") # 0.31'Kg' +RE_PCT = re.compile(r"([\d.]+)\s*'%'") # 5'%' +RE_Q = re.compile(r"\bQ\s*=\s*([^=\n']{3,60})") # Q = 3600*q*K*f*E/Cm + +def body(b): + out=[] + for m in re.finditer(rb"[\x20-\x7e\xa1-\xfe]{3,}", b[0x200:]): + try: out.append(m.group().decode("cp949")) + except Exception: pass + return out + +tot=collections.Counter(); refs=collections.Counter(); comp=collections.Counter() +qforms=collections.Counter(); pcts=collections.Counter(); units=collections.Counter() +files=0; lines=0 +for s in SRC: + try: + if s.suffix.upper()==".STC": + z=zipfile.ZipFile(s) + nm=next((n for n in z.namelist() if n.upper()=="COSTN.SMT"), None) + if not nm: continue + b=z.read(nm) + else: b=s.read_bytes() + except Exception: continue + if b[8:15]!=b"SIxMemo": continue + files+=1 + for ln in body(b): + lines+=1 + for k,n,c in RE_REF.findall(ln): + refs[k]+=1; comp[c]+=1; tot["참조"]+=1 + for l in RE_LABEL.findall(ln): tot["중간라벨"]+=1 + for v,u in RE_QTY.findall(ln): + if u!="%": units[u]+=1; tot["품(수량+단위)"]+=1 + for v in RE_PCT.findall(ln): pcts[v]+=1; tot["할증%"]+=1 + for q in RE_Q.findall(ln): + qq=re.sub(r"\s+","",q) + if len(qq)>4 and any(ch in qq for ch in "*/"): qforms[qq[:44]]+=1; tot["Q식"]+=1 + +print("### COSTN.SMT 전수 파싱 — 파일 %d개, 본문 줄 %d개" % (files, lines)) +print("\n요소별 검출") +for k,v in tot.most_common(): print(" %-14s %5d" % (k,v)) +print("\n자원 참조 종류 (앞글자)") +for k,v in refs.most_common(): print(" %s %5d" % (k,v)) +print("\n가져오는 성분 (끝글자)") +for k,v in comp.most_common(): print(" %s %5d" % (k,v)) +print("\n할증률 값 분포 (상위 12)") +for k,v in pcts.most_common(12): print(" %-8s %4d회" % (k+"%", v)) +print("\n단위 분포 (상위 12)") +for k,v in units.most_common(12): print(" %-8s %4d회" % (k,v)) +print("\nQ식 꼴 (상위 10)") +for k,v in qforms.most_common(10): print(" %-46s %3d회" % (k,v)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md index 2473be42..8ca6af67 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/README.md @@ -1,5 +1,18 @@ # STmate 분석 +> ## 🔗 STmate 지식은 **세 폴더**에 나뉘어 있음 — 갈라지지 않게 서로를 가리킴 +> +> | 트랙 | 자리 | 담당 | +> |---|---|---| +> | ① **계산 로직** | `technical_info/01_임도/05_원가정보/` | 밑수·단수처리·제비율·기계경비·노임·자재 적용. **Aislo 구현의 정본** | +> | ② **STC 포맷** | `original/원가계산/STmate/` | 컨테이너·필드사전·난독화·SIxMemo·INITIAL. import/export 명세 | +> | ③ **프로그램 분석** | `original/경쟁사 프로그램/STmate 분석/` | 실행모듈·UI 폼·계산사슬·골든셋 회귀 | +> +> ⚠ **새 STmate 작업을 시작하기 전에 세 폴더를 모두 볼 것.** 2026-09-13 에 ③이 ①②를 모르고 시작해 +> 단수처리 규칙·`INITIAL` 시트·`SMT` 문법·`BDQTY` 난독화를 다시 분석한 일이 있음 (③의 `21_정정과_트랙통합.md`). + + + 경쟁사 설계예산 프로그램 **STmate**(경영정보(주)) 를 정적으로 뜯어본 기록. 원본은 저장소 밖 `C:\경영정보(주)` — **원본은 손대지 않음**, 여기에만 정리물을 둠. 옆 폴더 `../오솔길 분석/` 과 같은 얼개. @@ -48,6 +61,7 @@ | 20 | **설정파일과 보고서 카탈로그** — 간접비 코드 사전, 서식 75종 | | 21 | **정정과 트랙 통합** — `SMT` 정정, 지식DB 세 트랙, 암호화의 성격 | | 22 | **UI 폼 분석** — 선택축 272개, 화면에 남아 있던 계산 규칙 | +| 23 | **`COSTN.SMT` 전수파싱** — 단가산출 원장, Q식 10꼴, 운반 사이클 | ## 확정된 굵직한 것 diff --git a/resources/knowledge/original/원가계산/STmate/_meta.md b/resources/knowledge/original/원가계산/STmate/_meta.md index 8eea58eb..0f59b081 100644 --- a/resources/knowledge/original/원가계산/STmate/_meta.md +++ b/resources/knowledge/original/원가계산/STmate/_meta.md @@ -6,6 +6,19 @@ status: draft 목적: STC(STmate 프로젝트 파일) import/export 구현을 위한 컨테이너·DBF 명세·검증 근거 축적 --- +> ## 🔗 STmate 지식은 **세 폴더**에 나뉘어 있음 — 갈라지지 않게 서로를 가리킴 +> +> | 트랙 | 자리 | 담당 | +> |---|---|---| +> | ① **계산 로직** | `technical_info/01_임도/05_원가정보/` | 밑수·단수처리·제비율·기계경비·노임·자재 적용. **Aislo 구현의 정본** | +> | ② **STC 포맷** | `original/원가계산/STmate/` | 컨테이너·필드사전·난독화·SIxMemo·INITIAL. import/export 명세 | +> | ③ **프로그램 분석** | `original/경쟁사 프로그램/STmate 분석/` | 실행모듈·UI 폼·계산사슬·골든셋 회귀 | +> +> ⚠ **새 STmate 작업을 시작하기 전에 세 폴더를 모두 볼 것.** 2026-09-13 에 ③이 ①②를 모르고 시작해 +> 단수처리 규칙·`INITIAL` 시트·`SMT` 문법·`BDQTY` 난독화를 다시 분석한 일이 있음 (③의 `21_정정과_트랙통합.md`). + + + > **왜 이 폴더인가**: STC는 설계자가 발주처에 제출하는 **최종 산출물**이며, Aislo도 STC **불러오기(import)·내보내기(export)가 필수 요구사항**이다(사용자 확정 2026-08-15). 따라서 STC 포맷 해석은 연구성 작업이 아니라 **납품 호환성 확보를 위한 구현 선행 명세**다. > 계산 로직(밑수·절사·채택 규칙)은 `technical_info/01_임도/05_원가정보/`가 담당하고, 이 폴더는 **포맷 구조·필드 사전·검증 근거**만 담는다. 두 트랙은 분리한다. > 실무 관측 진입점 = [original/실무문서/_STC포맷분석.md](../../실무문서/_STC포맷분석.md) (이 폴더로 명세 이관, 그 문서는 요약·링크로 유지). diff --git a/resources/knowledge/technical_info/01_임도/05_원가정보/원가계산_체계.md b/resources/knowledge/technical_info/01_임도/05_원가정보/원가계산_체계.md index 2ddc86aa..82193c90 100644 --- a/resources/knowledge/technical_info/01_임도/05_원가정보/원가계산_체계.md +++ b/resources/knowledge/technical_info/01_임도/05_원가정보/원가계산_체계.md @@ -9,6 +9,19 @@ status: draft last_updated: 2026-08-14 --- +> ## 🔗 STmate 지식은 **세 폴더**에 나뉘어 있음 — 갈라지지 않게 서로를 가리킴 +> +> | 트랙 | 자리 | 담당 | +> |---|---|---| +> | ① **계산 로직** | `technical_info/01_임도/05_원가정보/` | 밑수·단수처리·제비율·기계경비·노임·자재 적용. **Aislo 구현의 정본** | +> | ② **STC 포맷** | `original/원가계산/STmate/` | 컨테이너·필드사전·난독화·SIxMemo·INITIAL. import/export 명세 | +> | ③ **프로그램 분석** | `original/경쟁사 프로그램/STmate 분석/` | 실행모듈·UI 폼·계산사슬·골든셋 회귀 | +> +> ⚠ **새 STmate 작업을 시작하기 전에 세 폴더를 모두 볼 것.** 2026-09-13 에 ③이 ①②를 모르고 시작해 +> 단수처리 규칙·`INITIAL` 시트·`SMT` 문법·`BDQTY` 난독화를 다시 분석한 일이 있음 (③의 `21_정정과_트랙통합.md`). + + + 관련 문서: [제비율](제비율.md) · [설계·감리대가](설계·감리대가.md) · [원가_기초데이터_원천](원가_기초데이터_원천.md) · [노임단가_적용](노임단가_적용.md) · [자재단가_적용](자재단가_적용.md) · [기계경비_산정](기계경비_산정.md) · [수량산출_일반](../04_수량분석정보/수량산출_일반.md) · [품셈_적용기준](../04_수량분석정보/품셈_적용기준.md) ## 1. 공사원가 구성 트리