knowledge(경쟁사): 세 폴더 상호참조 · COSTN.SMT 전수 파싱
세 폴더 머리에 서로를 가리키는 블록을 넣음 — 또 갈라지지 않게. 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) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA
This commit is contained in:
@@ -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:\경영정보(주)`
|
||||
|
||||
@@ -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` 행과 메모를 정확히 이을 수 있음
|
||||
@@ -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))
|
||||
@@ -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꼴, 운반 사이클 |
|
||||
|
||||
## 확정된 굵직한 것
|
||||
|
||||
|
||||
@@ -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) (이 폴더로 명세 이관, 그 문서는 요약·링크로 유지).
|
||||
|
||||
@@ -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. 공사원가 구성 트리
|
||||
|
||||
Reference in New Issue
Block a user