Merge remote-tracking branch 'origin/sub_desktop_1' into main_laptop_1

This commit is contained in:
2026-09-13 14:21:47 +09:00
22 changed files with 1836 additions and 0 deletions
@@ -26,6 +26,12 @@
| 17 단가조립 검증 | **일위대가·중기 시간당 사용료 구조와 손료율 실측** | (저장소 파일) |
| 18 누락 계산로직 점검 | **사슬에 빠진 칸 찾기** — 노임 환산식·단가산출 Q식·설정 스냅샷·집계표 반올림 | (저장소 파일) |
| 19 진행률 장부 | **어디까지 봤고 무엇이 남았나** — 원천별 실측 진행률, 차단점 현황 | (저장소 파일) |
| 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꼴)·운반 사이클 | (저장소 파일) |
| 24 모듈구조 전수 | **46개 모듈 export**`DP_Common` 73함수, 플러그인 규약, 동글, 8차 해소 | (저장소 파일) |
| 25 설정키 전수와 식템플릿 | **설정 사슬 닫기**`PRJLST.SMT` 키 241종, 간접비 식 26개 | (저장소 파일) |
> **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`.
> 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다.
@@ -70,6 +76,34 @@
| 계산 설정 스냅샷 | 「화면 없이 재현 불가」 | **출력 XLSX `〓 INITIAL 〓` 에 있음** | 18번 §2.3 |
| 집계표 행 금액 | 서술만 | **A** — 사사오입 100%. 호표 성분 소계(절사)와 다른 자리 | 18번 §2.4 |
| 변경설계 간접비 모드 | 「모드가 여럿」까지만 | **A 실증** — 건강·장기요양·연금은 **당초액 유지**, 나머지는 재계산 | 19번 §6, 08번 §2 |
| 간접비 항목 순서·코드 | 화면 텍스트 복원 | **A**`KAN_ORD_1/2` 코드 목록, 301~370 사전 | 20번 §2.1·§2.2 |
| 후보 슬롯 이름 | 「설정에 있을 것」 | **설치본마다 다름을 실물 확인** (유통 물가 ↔ 견적단가) | 20번 §2.3 |
| 보고서 서식 | 30종 관찰 | **카탈로그 75종** — 수공양식·표준시장 서식 존재 | 20번 §3 |
| `*.SMT` | ⛔ 암호화라고 적었음 | **정정 — 평문.** `COSTN.SMT` 단가 전개, `PRJLST.SMT` 설정 원장 | 21번 §1 |
| 프로젝트 요율 | 기준표 좌표로 찾아야 한다고 봄 | **`PRJLST.SMT`에 값으로 저장** — 좌표는 읽기에 불필요 | 21번 §3 |
| 수공형식 세부경비 8개 | 표본 없어 미상 | **항목 확정**`R_S_SUDO`·`BOKRI`·`SOMO`·`TONGSIN`·`SEGUM`·`PEGI`·`DOSEO`·`JIGUP` | 21번 §3.2 |
| 암호화의 성격 | 「기초단가가 막혔다」 | **사온 물가지 데이터 보호** — 뚫을 일이 아니라 살 일 | 21번 §4 |
| 지식DB STmate 트랙 | 하나로 알고 있었음 | **셋이 서로 몰랐음** — ①계산로직 ②STC포맷 ③프로그램분석 | 21번 §2 |
| UI 폼 | 3개만 뽑아 씀 | **선택축 272개 전수** — 폼 40개 | 22번 |
| 일괄변경 수동값 (T10) | ⛔ 실행 필요 | **화면 안내문에 있음** — 보호표시·0원 제외 | 22번 §3.1 |
| `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, 24번 §5 |
| 모듈 분석 | 핵심 12개 | **46개 전수 export** | 24번 |
| 식 평가기 함수 | `CALC_STR` 만 | **A**`DP_Common` 73함수. 조건 `IIF`·중간변수·`MFRAC` 포함 | 24번 §2 |
| 재계산 진입점 | 한 곳으로 봄 | ⚠ **31개 모듈이 `Calc_Kanjub` 보유** | 24번 §1 |
| 라이선스 | 「없음」 | **Rainbow Sentinel SuperPro 하드웨어 동글** | 24번 §4 |
| 엑셀 | 단방향 출력 | **양방향**`CONV_XLS_2_ST`·`XLS_2_BDREC` | 24번 §3 |
| 변경 차수 8차 | ⚠ 미해결 | ✅ **해소** — 한 파일 4벌, 8차는 분리형 파일 선택 | 24번 §7 |
| 프로젝트 저장키 | 일부만 | **241종 전수**`C_`금액 62·`R_`요율 39·`I_`선택 41·`D_`밑수·`S_`결과 | 25번 §1 |
| 밑수 저장 | 안 남는 줄 알았음 | **`D_`(밑수)·`S_`(결과) 짝으로 저장** | 25번 §1.1 |
| 추가금액 | 화면 문자열만 | **저장 구조** `ADD_AMT_단계_행_칸` | 25번 §1.3 |
| 간접비 식 템플릿 | 일부 | **26개 전수** | 25번 §2 |
| 식에 조건 분기 | 몰랐음 | ⚠ **`IF(...)` 존재** — 평가기 필수 요건 | 25번 §2.2 |
분석일: 2026-09-13
대상: `C:\경영정보(주)`
@@ -0,0 +1,156 @@
# 설정파일과 보고서 카탈로그 — 마지막으로 남아 있던 자리
점검일: 2026-09-13
계기: 「추가로 더 있는지」 확인. **`System` 폴더만 보고 `STmate 자료`·`STmate 압축자료` 폴더를 통째로 안 봤다.**
재현 스크립트: `40_스크립트/ini_and_report_catalog.py`
## 1. 안 보고 있던 자리
`C:\경영정보(주)` 아래에는 폴더가 넷이다.
| 폴더 | 내용 | 그동안 |
|---|---|---|
| `System` | 설치 파일 186개 | ✅ 전수 |
| `STmate 자료\설계자료\실습(맛보기)` | 맛보기 프로젝트를 **푼 것** 23개 | ⚠ **STC와 같다고 넘겼음** |
| `STmate 압축자료` | `실습(맛보기).STC` | ✅ |
| `(TMP)` | 비어 있음 | — |
DBF는 STC와 같지만 **STC에 없는 파일 셋이 있었다**`Start8x.Ini` · `STini.MEM` · `QCODE.SMT`.
## 2. `Start8x.Ini` — 설치본 전역 설정
### 2.1 ⭐ 간접비 계산 순서가 코드 목록으로 저장돼 있다
```ini
KAN_ORD_1=;301;302;303;310;304;305;306;312;313;321;307;308;309;311;361;362;363;364;365;366;367;368;369;370;
KAN_ORD_2=;351;301;302;303;310;304;305;306;312;313;331;332;333;334;335;336;337;338;307;308;309;311;361;…;370;
KAN_TYP=0
```
**두 목록의 차이가 12번 §7의 「기타경비: 일반=묶음 1개 / 수공=세부 8개」와 정확히 맞는다.**
- `KAN_ORD_1` (24개) — `313` 다음에 **`321` 하나**
- `KAN_ORD_2` (32개) — 같은 자리에 **`331`~`338` 여덟 개**, 그리고 맨 앞에 `351` 추가
**`KAN_ORD_1` = 일반형식(`T`) 순서, `KAN_ORD_2` = 수공형식(`S`) 순서**이고 `KAN_TYP`가 고른다.
### 2.2 코드 → 항목 사전 (봉화 2024 출력과 대조해 확정)
`KAN_ORD_1` 순서대로 놓고, 값이 0인 항목은 출력에서 빠진다는 규칙으로 봉화 `공사원가계산서`와 맞추면 하나도 어긋나지 않는다.
| 순서 | 코드 | 항목 | 봉화에 출력됨 |
|---:|---|---|:--:|
| 1 | `301` | 간접노무비 | ✅ |
| 2 | `302` | 산재보험료 | ✅ |
| 3 | `303` | 고용보험료 | ✅ |
| 4 | `310` | 건강보험료 | ✅ |
| 5 | `304` | 노인장기요양보험료 | ✅ |
| 6 | `305` | 연금보험료 | ✅ |
| 7 | `306` | 퇴직공제부금비 | ✗ (0) |
| 8 | `312` | 산업안전보건관리비 | ✅ |
| 9 | `313` | 안전·품질관리비 (별도내역) | ✗ (0) |
| 10 | `321` | **기타경비** (일반형식 묶음) | ✅ |
| 11 | `307` | 공사이행보증수수료 | ✗ (0) |
| 12 | `308` | 하도급대금지급보증수수료 | ✗ (0) |
| 13 | `309` | 환경보전비 | ✅ |
| 14 | `311` | 건설기계대여금 지급보증 | ✅ |
| 15~24 | `361`~`370` | 후단 공통 (일반관리비·이윤·부가세·도급·관급 계열) | — |
| — | `331`~`338` | **수공형식 세부 경비 8개** | 표본 없음 |
| — | `351` | 수공형식 선두 항목 | 표본 없음 |
출력 순서가 **정확히 이 순서**다. 등급 **A**.
**재구현은 항목을 이름이 아니라 코드로 다루고, 순서를 목록 데이터로 둘 것.** 형식을 바꾸면 목록을 갈아 끼우면 된다. `if 항목명 == "기타경비"` 같은 분기를 심으면 수공형식에서 깨진다.
### 2.3 ⚠ 후보 슬롯 이름이 설치본마다 다르다
| | 슬롯1 | 슬롯2 | 슬롯3 | 슬롯4 | **슬롯5** | 슬롯6 |
|---|---|---|---|---|---|---|
| 설치 기본 (`Start8x.Ini`) | 가격 정보 | 물가 자료 | 물가 정보 | 거래 가격 | **유통 물가** | 적용 단가 |
| 실무 프로젝트 (`INITIAL`) | 조달가격 | 물가자료 | 물가정보 | 거래가격 | **견적단가** | 적용 단가 |
**다섯 번째가 통째로 다르다.** 07번의 「슬롯 번호에 가격지 이름을 코드로 고정하지 말라」가 이보다 분명할 수 없다. 축약도 다르다(`가.정/물.자/물.정/거.래/유.통``조달/물자/물정/거래/견적`).
`JEMNM=123456`이 표시 순서다.
### 2.4 코드 종류 사전
```ini
COD_FMT_1=노무 COD_FMT_2=자재 COD_FMT_3=경비 COD_FMT_4=대가
COD_FMT_5=중기 COD_FMT_6=산근 COD_FMT_7=기타 COD_FMT_8=실적
```
설계변경증감대비표 비고 칸의 `산근 4호표` · `대가 1호표` · `M00760`이 이 사전을 쓴다. **`대가`=일위대가(`B`), `산근`=단가산출근거(`D`)**다.
`BCDNM=10 · DCDNM=14 · LCDNM=9 · MCDNM=13 · PCDNM=11 · SCDNM=15 · XCDNM=14`는 코드 종류별 기본값이며 의미는 아직 미확정(B등급).
### 2.5 `[EQUIPMENT]` — 노임 환산식과 환율의 설치 기본값
```ini
RXXNM=1/8 * 16/12 * 25/20 ← 18번 §2.1의 그 식
RXTNM=1/8*16/12*25/20
CONLD=L00007L00008L00009 ← 적용 직종 (설치 기본)
EXLNM1~4 / EXHNM1~4 = 1088 · 1289 · 1134.5 · 1134.5 ← 달러 구간별 환율
EXEUR1/2=1000 EXYEN1/2=1000
```
프로젝트의 `COND_``L00008L00009L00010`으로 **설치 기본과 다르다** — 프로젝트마다 적용 직종을 바꿀 수 있다.
### 2.6 그 밖
| 키 | 값 | 뜻 |
|---|---|---|
| `DISP_EX` | `제외금액` | 16번 §4.2의 `C*` 구역 이름이 여기서 온다 |
| `DISP_TOT` | `총 계` | |
| `UPDNCAP` | `상단:당초 , 하단:변경` | 변경설계 표시 |
| `BMKNM` | `TLMS` | 비목 코드 순서 (총계·노무·재료·경비) |
| `[NAG_HAL]` | `ST_MHAL` · `EQ_LHAL` · `EQ_MHAL` · `EQ_SHAL` = 0 | **할증률 설정 자리** — 표본은 전부 0 |
| `LMGNM=5.0` · `MKRNM=4.0` · `TMGNM=0.0` | | 미확정 (B) |
## 3. `SET_REP.DBF` — 보고서 서식 75종 카탈로그
우리 표본의 XLSX에는 **30종**이 나왔는데, 카탈로그에는 **75종**이 있다. 45종은 표본에 안 나온 것뿐이다.
| 갈래 | 서식 |
|---|---|
| 기성 | 기성부분총괄내역서 · 기성내역서 · 기성내역서(사정) · 기성내역서(기성율) · 기성검사조서(을/병) · 기성부분수량조서 |
| 견적·계약 | 견적내역서 · 견적단가대비표 · 계약,실행내역서 |
| 준공 | 준공조서(을/병) |
| 변경 | 변경내역서 · 변경내역서(변경율) · 변경총괄내역서(구.시도/시도/구도) |
| 계획 | 장비투입계획 · 인력투입계획 · 자재사용계획 |
| 실행예산 | 실행예산서Ⅰ · Ⅱ |
| 양식 변형 | 종양식 · 도공양식 · 굴착 · 구.시도/시도/구도 · **수공양식** |
| 기타 | 간이공사비 산출명세서 · 총괄집계표 · 표준시장/시장시공 목록표·집계표 |
각 행은 `INDX`(서식번호) · `NAME` · `HEADTITLE` · 열 이름 11개와 폭을 가진다. **보고서 서식이 코드가 아니라 데이터**라는 00번의 관찰이 여기서 확인된다.
**`일위대가표(수공양식)`(`0303`)과 `표준시장/시장시공` 계열이 카탈로그에 있다** — 수공·실적 형식이 실제로 지원되며 서식도 따로 있다. 우리 표본에 그 형식 프로젝트가 없을 뿐이다.
**계산** 규칙은 없다. 같은 값을 다른 묶음·다른 열로 내는 출력 변형이다.
## 4. `COSTN.SMT` · `QCODE.SMT` · `STini.MEM`
> ⛔ **이 절의 첫 판정은 틀렸다. 21번 §1에서 정정했다.** 아래는 바로잡은 내용이다.
| 파일 | 크기 | 상태 |
|---|---:|---|
| `COSTN.SMT` | 10,177 B | ✅ **평문 — 본문 문자열 276개.** 단가산출 전개 텍스트 |
| `PRJLST.SMT` | 2,759 B | ✅ **평문 — 153개.** 프로젝트별 원가계산 설정 원장 |
| `QCODE.SMT` | 512 B | 머리만, 내용 없음 |
| `STini.MEM` | 512 B | 미해독 |
처음 훑을 때 **파일 앞 4KB만** 보고 필터를 세게 걸어 놓쳤다. **본문은 `0x200`부터** 시작한다. 07번이 기대한 `&M00034M&` 참조 토큰이 **평문으로 그대로 있다.**
암호화된 것은 `BDQTY.DBF`·`SYSINFO.DBF` 둘뿐이라는 판정은 그대로 맞다. 상세는 **21번 §1·§3**과 기존 `original/원가계산/STmate/SIxMemo_구조.md`.
## 5. 이번 점검이 바꾸는 것
| 항목 | 이전 | 지금 |
|---|---|---|
| 간접비 항목 순서 | 화면 텍스트로 복원 | ✅ **코드 목록으로 확정**, 형식별 두 벌 |
| 간접비 항목 코드 | 없었음 | ✅ **301~370 사전**, 봉화 출력과 무결 대조 |
| 후보 슬롯 이름 | 「설정에 있을 것」 | ✅ **설치본마다 다름을 실물로 확인** |
| 코드 종류 사전 | 추정 | ✅ `COD_FMT_1~8` |
| 보고서 서식 | 30종 봄 | ✅ **카탈로그 75종** 전체 |
| `*.SMT` 메모 | 「토큰이 있을 것」 | ✅ **평문 — 토큰·설정 원장이 그대로** (21번 §1·§3) |
| 할증률 설정 자리 | 없었음 | ◐ `[NAG_HAL]` 발견, 표본은 전부 0 |
@@ -0,0 +1,156 @@
# 정정과 트랙 통합 — 마지막 확인에서 드러난 것
작성일: 2026-09-13
계기: 「분석이 대부분 끝났나」 최종 확인. **끝나지 않았다.** 오히려 이 확인에서 **내 오류 하나와 큰 구멍 하나**가 나왔다.
## 1. ⛔ 정정 — `*.SMT` 는 암호화가 아니다. 읽힌다.
20번 §4에 「`COSTN.SMT`·`QCODE.SMT`·`PRJLST.SMT` 본문에 읽히는 문자열 없음 — 암호화/압축」이라 적었다. **틀렸다.**
앞선 훑기가 **파일 앞 4KB만** 본 데다 필터가 셌다. 본문은 **`0x200`부터** 시작한다.
| 파일 | 크기 | 읽히는 문자열 |
|---|---:|---:|
| `COSTN.SMT` | 10,177 B | **276개** |
| `PRJLST.SMT` | 2,759 B | **153개** |
| `QCODE.SMT` | 512 B | 1개 (비어 있음) |
암호화된 것은 **`BDQTY.DBF``SYSINFO.DBF` 둘뿐**이라는 앞선 판정은 그대로 맞다.
## 2. 큰 구멍 — 지식DB에 STmate 트랙이 **셋**이고 서로 몰랐다
| 트랙 | 자리 | 담당 | 만든 때 |
|---|---|---|---|
| ① **계산 로직** | `technical_info/01_임도/05_원가정보/` (문서 10개) | 밑수·단수처리·제비율·기계경비·노임·자재 적용 | 2026-08 |
| ② **STC 포맷** | `original/원가계산/STmate/` (문서 8개) | 컨테이너·필드사전·난독화·SIxMemo·INITIAL | 2026-08-15 |
| ③ **프로그램 분석** | `original/경쟁사 프로그램/STmate 분석/` (이 폴더) | 실행모듈·폼·계산사슬·골든셋 | 2026-09-12~13 |
②의 `_meta.md`**「계산 로직은 `technical_info/01_임도/05_원가정보/`가 담당, 이 폴더는 포맷만」** 이라고 트랙 분리를 명시해 놓았다. ③을 만들 때 이것을 못 보고 시작했다.
### 그 결과 겹치거나 어긋난 것
| 내가 「새로 찾았다」한 것 | 이미 있던 곳 | 판정 |
|---|---|---|
| 내역 행 절사 · 집계표 사사오입 · 관급 천원 올림 | ①`단수처리_규칙.md`**5공사지 교차로 이미 확정**. 봉화 216건까지 같은 숫자 | **중복** |
| `〓 INITIAL 〓` 시트 | ②`XLSX_INITIAL_구조.md` — 존재·성격 이미 규명. 「셀 전수 추출」만 미착수 | **부분 중복** (전수 추출은 18번이 처음) |
| `COSTN.SMT` 토큰 | ②`SIxMemo_구조.md`**헤더·문법 이미 해독**(`&M00034M&`, `:=A01`, `Q=…`) | **중복이자 내 오판** |
| `BDQTY`·`SYSINFO` 암호화 | ②`STC_난독화_상태.md`**XOR 키스트림 부분 검증까지** 완료 | **중복** |
**정직하게 말해 ③의 상당 부분이 ①②를 다시 한 것이다.** 다만 ③에서만 나온 것도 분명하다 — 실행모듈 정적분석(은행가 반올림), 폼 복원(밑수 공식·설정 83축·간접비 코드), 골든셋 회귀(원 단위 재현), 변경설계 모드, 단가산출 Q식 전수.
## 3. ⭐ `PRJLST.SMT` — 요율이 **값으로** 저장돼 있다
가장 중요한 발견. 프로젝트마다 원가계산 설정이 **INI 형식 평문**으로 들어 있다.
```ini
[KANJUB] JAB_TYPE=0 CAL_ACTL=0 VIS_TOTL=0
[1_KANJUB] ← 차수 1
[2_KANJUB] ← 차수 2
```
### 3.1 요율 `R_*` — 전부 값으로
```ini
1_R_KANNO=10.8 간접노무비 1_R_SANBO=3.8 산재보험료
1_R_KOBO=0.67 고용보험료 1_R_KUNBO=1.4 건강보험료
1_R_YUNBO=2.41 연금보험료 1_R_ANJUN=2.48 산업안전보건관리비
1_R_T_KITA=6.1 기타경비 1_R_HADOSU=0.018 하도급보증수수료
1_R_ILBAN=4.7 일반관리비 1_R_IYUN=15 이윤
1_R_KONGSA=0.7 공사보험료 1_R_TBUGUM=0 퇴직공제부금
```
### 3.2 ⭐ 수공형식 세부 경비 8개가 여기 있다
```ini
1_R_S_SUDO 수도광열비 1_R_S_BOKRI 복리후생비
1_R_S_SOMO 소모품·사무용품비 1_R_S_TONGSIN 여비·교통비·통신비
1_R_S_SEGUM 세금·공과금 1_R_S_PEGI 폐기물처리
1_R_S_DOSEO 도서·시공도작성비 1_R_S_JIGUP 지급수수료
```
**`KAN_ORD_2``331`~`338` 여덟 개와 정확히 맞는다**(20번 §2.1). 수공형식 표본이 없어도 **항목 구성은 확정**됐다.
### 3.3 직접입력 금액 `C_*` — 변경설계 「당초액 유지」의 실제 자리
```ini
1_C_KUNBO=649160 건강보험료 직접입력 금액
1_C_YUNBO=1117483 연금보험료 직접입력 금액
1_C_ANJUN=1994098 안전관리비
1_C_IYUN_M=37182 이윤 보정액 ← 16번 §4.4 끝전조정의 저장 자리
1_C_KONGSA_J=119300000
```
**19번 §6에서 「건강·장기요양·연금은 당초액 유지」라 실증한 것의 저장 자리가 이것이다.** 요율이 아니라 **금액을 직접 써 넣는다.**
### 3.4 선택 인덱스 `I_*` — 폼의 83축과 직결
```ini
1_I_KONG_TYPE=0 공사종류 1_I_KONG_KIKAN=2 공사기간
1_I_ANJUN_TYPE=0 안전비 공종 1_I_KUN_TYPE=6 건물종류
1_I_JEOLSA=5 공급가액 절사 1_I_TBUGUM=3 퇴직공제 구분
1_I_BUGA=0 부가세 방식 1_I_KOBO_TYPE=0 고용보험 등급
1_I_MTYP · 1_I_LTYP · 1_I_MXA · 1_I_MXK ← 실적형식 전용 (12번 §10.1-2)
```
12번이 폼에서 뽑은 축 이름(`cmBx_Kong_Type`·`cmBx_AnJun_Type`·`cmBx_JeolSa`…)과 **일대일로 맞는다.**
### 3.5 ⇒ 요율 좌표(T1)는 재구현 필수가 아니다
**프로젝트를 읽을 때는 `PRJLST.SMT`의 `R_*` 값을 그대로 쓰면 된다.** 기준표 좌표는 「새 프로젝트를 만들며 기준표에서 고르는」 경로에만 필요하다.
| 쓰임 | 좌표 필요? |
|---|---|
| STmate 프로젝트 **읽기·검산** | ❌ — `PRJLST.SMT`에 값이 있음 |
| Aislo에서 **새로 요율을 고르기** | ⭕ — 다만 Aislo는 **현행 법령**에서 고르면 됨 |
| STmate와 **같은 기준표 선택 재현** | ⭕ — 하지만 목표가 아님 |
⇒ 13번 T1의 우선순위를 **1위에서 내린다.** 19번 §7의 「규모·기간 의존 요율 좌표」도 같은 이유로 격하한다.
## 4. 암호화의 성격 — 프로그램이 아니라 **사온 데이터**를 지킨다
| | 암호화 41개 | 평문 43개 |
|---|---|---|
| 무엇 | `*.BSC` · `*.CSTA` · `*.STBSC` 단가 자료 | `JB_*` 제비율 요율표 |
| 성격 | **유료 구독 데이터** | **법정 공개 자료** |
암호화된 파일은 **전부 파일명에 출처 기관과 반기가 박혀 있다.**
```
2025(상,국교,해수부,조달청)_표준시장.CSTA 국토부·해수부·조달청 표준시장단가
2026(상_노임,기계경비).STBSC 대한건설협회 노임 + 건설기계 경비
2026(상_표준일위대가_토목).STBSC 표준품셈 일위대가
2026-상-시설공통자재.STBSC 나라장터 시설공통자재
JDCODE_M.BSC 19 MB 자재 코드·단가 57,580건
```
**결정적 근거는 후보 슬롯 이름이 국내 물가지 이름 그대로**라는 점이다.
| 슬롯 | 이름 | 실체 |
|---|---|---|
| 1 | 조달가격 / 가격 정보 | 조달청 가격정보 |
| 2 | **물가자료** | 한국물가협회 |
| 3 | **물가정보** | 한국물가정보 |
| 4 | 거래가격 | 거래가격지 |
| 5 | 유통 물가 / 견적단가 | 유통물가 또는 업체 견적 |
즉 STmate는 **물가지 네댓 곳에서 사온 단가를 자기 포맷으로 담아 반기마다 배포**하며, 암호화는 **그 데이터의 저작권 보호**다. 프로그램 로직을 숨기려는 것이 아니다 — 계산 모듈(`*.CPM`)은 암호화돼 있지 않고 프로젝트 파일도 대부분 평문이다.
### Aislo 에 뜻하는 것 — 뚫을 일이 아니라 살 일
| 무엇 | STmate | Aislo 현재 |
|---|---|---|
| 계산 규칙 | 암호화 안 됨 | ✅ 다 읽었음 |
| 법정 요율(제비율) | 평문 | ✅ 현행법에서 직접 |
| 품셈 `q·K·f·E·Cm` | 출력에 평문 | ✅ `건설공사_표준품셈` 보유 |
| 노임 | 암호화 배포 | ✅ `노임단가_건설업_대한건설협회` |
| 유가·환율 | 암호화 배포 | ✅ `유가_오피넷` · `환율_한국은행ECOS` |
| 시설공통자재 | 암호화 배포 | ✅ `자재단가/나라장터_시설공통자재` |
| **물가지 자재단가** | 암호화 배포 | ⛔ **구독 필요 — 유일한 실질 격차** |
| 표준시장단가 | 암호화 배포 | ◐ 조달청 공표 자료로 대체 가능 |
## 5. 이 문서 이후 해야 할 것
1. **①②③ 트랙을 잇는 색인** — 세 폴더 머리에 서로를 가리키는 줄을 넣어 다시 갈라지지 않게 할 것
2. ③의 계산 규칙을 ①`technical_info/05_원가정보/`**승격** — ①이 Aislo 구현의 정본이므로
3. ②의 미해명(`SMT` 10바이트 인덱스, 레코드 경계)과 ③의 성과를 합칠 것
4. `COSTN.SMT` 전개 텍스트 **전수 파싱** — ②가 문법을 해독해 뒀으므로 바로 가능
@@ -0,0 +1,156 @@
# UI 폼 분석 — 화면에 남아 있던 계산 규칙
점검일: 2026-09-13
계기: 「추가 UI 정보도 분석했는지」 확인. **안 했다.** 폼 233개 중 **3개만** 뽑아 썼다.
원자료: `30_원자료/ui_form_catalog.txt` · 재현 스크립트: `40_스크립트/ui_form_sweep.py`, `form_extract.py`, `form_catalog.py`
## 1. 그동안 얼마나 봤나
| | 개수 |
|---|---:|
| 폼을 가진 PE 모듈 | 46 |
| 폼 자원 (중복 포함) | **233** |
| 서로 다른 폼 이름 | **190** |
| **그동안 뽑아 쓴 것** | **3**`TWM_KANJUB`·`TWM_KAN_RATE`·`TPM_KAN_RATE` |
계산 분석에 필요한 제비율·계산설정 화면만 뽑고 나머지는 손대지 않았다.
## 2. 이번에 전수로 훑음
파싱에 성공한 STmate 고유 폼에서 캡션과 선택지를 뽑았다.
| | 개수 |
|---|---:|
| 선택지를 가진 폼 | **40** |
| **선택축** | **272** |
12번 §10.1-2가 계산설정 폼 하나에서 뽑은 **83축의 세 배가 넘는다.**
### 폼 이름 규칙
```
PM_* 인쇄 폼 — SET_REP 의 보고서 서식 75종과 대응
w* / wM_* 편집 창·모달
frm* 보조 창
```
`ST_P_Nae`(22) · `STmate.Cpm`(30) · `ST_Boq`(13)에 폼이 몰려 있다.
## 3. 화면에서 새로 나온 계산 규칙
### 3.1 `wM_Edt_Hal` — 기준단가 수정 (단가 일괄보정)
```text
적용단가 = 기준단가 × [ ] % , 소수 [ ] 자리 미만 [절사 / 반올림]
※ 단【 적용단가 】가 "0" 원인것과 보호표시된 것은 수정안됨
```
**일괄변경에서 「보호표시(수동 고정)된 항목과 적용단가 0원인 항목은 건너뛴다.**」 13번 **T10(일괄변경 수동값 우선순위)**의 핵심이 화면 안내문에 적혀 있다. 등급 **A**(화면 문구 기준).
### 3.2 `wM_Rate` — 비목별 일괄 보정, 절사/반올림 × 소수 0~4위
`ST_Boq.CPM`의 노무비·재료비·경비·중기·일식 보정 창에 **비목마다 같은 짝**이 있다.
```text
wcBx_Pnt1_M / _L / _X / _W → 0 절사하여 · 1 반올림 하여
wcBx_Pnt2_M / _L / _X / _W → 0~4 소수 n 위값을 적용
rd_Qty1 / rd_Amt1 / rd_Amt2 → 내역서 전체 · 선택된 항목만
```
⇒ **단수처리가 전역 설정 하나가 아니라 비목(M·L·X·W)마다 따로**다. 09번 §4의 「출력별 정책을 데이터로」가 여기서도 확인된다.
### 3.3 `wM_Sel_Prn` — `ACTTYP`·`ACTOPT` 의 뜻이 풀렸다
`PRJLST.ACTTYP`·`ACTOPT``INITIAL``ACTYP`·`ACTOP`가 무엇인지 몰랐다. 화면이 답한다.
```text
cb_ACTTYP 노무비외 비목 적용안함 / 노무비외 재료비로 적용 / 노무비외 경비로 적용
cb_ACTOPT 노무비 1원미만 버림 / 소수 비교후 노무비 우선보정 / 소수 비교후 타금액 우선보정
```
**표준시장단가(실적) 적용 방식**이다. 설치 폴더의 파일명과 정확히 대응한다.
```
2025(상_표준시장[노임외 경비적용],국교,해수부).STBSC
2025(상_표준시장[노임외 재료비적용],국교,해수부).STBSC
```
봉화 2024는 `ACTYP=1`·`ACTOP=2`**「노임외 재료비로 적용」 + 「소수 비교후 타금액 우선보정」**이다.
`cb_PCLASS`(당초/변경/분할설계)와 `cb_CHASU`(1~8차변경)도 여기 있다 — **변경 차수가 최대 8차**까지다. `COSTN`의 접미사 1~4(최대 3차변경)와 다르므로, **차수 저장 구조가 4벌 슬롯만이 아니다.**
### 3.4 `wM_Set_Sys` — `Start8x.Ini` 의 미확정 키가 풀렸다
20번 §2.4에서 「`KCDNM`·`ACDNM`·`ZCDNM`·`JCDNM`·`ECDNM`·`BPNNM`은 의미 미확정(B)」이라 적었다. 화면이 답한다.
```text
cmBx_KCD / ACD / JCD / ECD / BPN → 0 자리 · 1 자리 · 2 자리
cmBx_ZCD → 2 자리 · 3 자리
```
**전부 소수 자리수 설정**이다. `Start8x.Ini`의 `KCDNM=1 ACDNM=1 ZCDNM=2 JCDNM=0 ECDNM=0 BPNNM=1`이 그대로 자리수다. 등급 **A**.
같은 화면에서 두 가지가 더 풀린다.
```text
cmBX_EXR 환율 적용 범위 — 시간당중기사용료 단독적용 / 중기 / 대가 / 산근 / 내역 전체
cmBx_Sel_RX 노임 환산 계수 갈래 — 계수 ; 터널구간 / 계수-1 ; 장대터널
/ 계수-2 ; 펌프준설선 / 계수-3 ; GRAB준설선 / 계수-4 ; 버켓준설선
```
`[EQUIPMENT]``RX1NM`~`RX4NM`은 **작업 조건별 노임 환산식 네 벌**이다(18번 §2.1의 `RXTNM`이 기본). `EXRNM`은 환율을 어디까지 적용할지다.
### 3.5 `wM_KanJub_K` — 부가세 방식이 하나 더 있다
기성 제잡비 계산서 화면의 부가세 선택지가 **12번 §10.1과 다르다.**
```text
(0) 직접입력 (1) 공급가액의 10% (2) 재료비의 10% (3) 재료비+산출경비의 10%
```
12번이 본 설계용 화면은 `공급가액의 10% / 재료비의 10% / 없음 / 산림조합 형식 / 산림조합-면세품`이었다. **기성 계산은 선택지 집합이 다르다.** 계류보전 프로젝트의 부가세가 10%가 아니었던 것(19번 §6 주석)과 이어질 수 있다.
`rd_Filter`는 집계 수준을 고르는 축이다 — `소계(+=) 이상 / 계(+==) / 합계(+===) / 총계(+====) / 총합계(+=====)`. **`BOQ11``T*`·`E*` 계층 깊이와 대응**한다(16번 §4.1).
### 3.6 `wM_Mrg_BSC` — 기준자료 갱신 매칭 규칙
```text
매칭 기준(5단계) 호환규정코드 / 시설코드 / 명칭·규격·단위 / 호환+명+규+단 / 명칭·단위 / 설정안함
명칭·단가·조달코드 업데이트 안함(복사처적용) / 업데이트(복사원적용)
+ 조달코드는 「복사처 우선」·「복사원 우선」까지 4택
```
⇒ 반기마다 새 기준자료가 오면 **무엇을 키로 잡아 기존 프로젝트 단가를 갱신할지**가 여기서 정해진다. 재구현 시 같은 축이 필요하다.
### 3.7 `wM_JabPum` · `wQtyList` — 코드 종류 전체 목록
```text
모든단가 · 노무비 · 재료비 · 경비 · 일위대가 · 중기비 · 단가산출 · 견적단가 · 대가,산근 · 그림코드
```
`COD_FMT_1~8`(20번 §2.4)보다 넓다. **`그림코드`**가 따로 있다 — 도면 참조 코드가 단가 체계 안에 있다.
## 4. 이번 점검이 바꾸는 것
| 항목 | 이전 | 지금 |
|---|---|---|
| UI 분석 범위 | 폼 3 / 190 | **선택축 272개 전수 카탈로그** |
| 일괄변경 수동값 우선순위 (T10) | ⛔ 실행 필요 | ✅ **화면 안내문에 있음** — 보호표시·0원은 제외 |
| 비목별 단수처리 | 전역 설정으로 봄 | ✅ **M·L·X·W 각각 절사/반올림 × 소수 0~4위** |
| `ACTTYP`·`ACTOPT` | 뜻 모름 | ✅ **표준시장단가 적용 방식·끝전 보정 우선순위** |
| `KCDNM` 등 6개 키 | 미확정 (B) | ✅ **소수 자리수 설정** |
| `RX1NM`~`RX4NM` | 미상 | ✅ **작업조건별 노임 환산식 4벌** (터널·준설선 계열) |
| 변경 차수 | 최대 3차(접미사 1~4)로 봄 | ⚠ **화면은 8차까지** — 저장 구조 재확인 필요 |
| 부가세 방식 | 설계용 5택 | ⚠ **기성용은 다른 4택** |
## 5. 남은 UI 작업
| 순위 | 할 일 | 왜 |
|---:|---|---|
| 1 | `PM_*` 인쇄 폼 ↔ `SET_REP` 75종 **대응표** | 어느 서식이 어느 계산을 쓰는지 |
| 2 | `wBoq`(398 KB)·`wM_Edit_San`(81 KB) 깊이 파싱 | 내역·단가산출 **편집 규칙** |
| 3 | 변경 차수 **8차** 저장 구조 확인 | `COSTN` 접미사 4벌과 어긋남 |
| 4 | 272개 선택축 ↔ `PRJLST.SMT` 키 대응 | 설정 저장 자리 완성 |
**UI 는 「화면 모양」이 아니라 계산 옵션의 원장이다.** 아직 캘 것이 남았다.
@@ -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,121 @@
# 모듈 구조 전수 — 46개 모듈의 export 와 플러그인 규약
점검일: 2026-09-13
계기: 11번은 **핵심 CPM 12개**만 다뤘다. 나머지 **32개 모듈**이 손대지 않은 채였다.
재현 스크립트: `40_스크립트/module_export_sweep.py`
## 1. 플러그인 규약 — `Calc_Kanjub`
**46개 모듈 중 31개가 `Calc_Kanjub` 를 내보낸다.** 편집·인쇄·변환 무엇이든 **제비율 재계산을 스스로 부를 수 있는 공통 진입점**이다.
```text
Calc_Kanjub 31개 모듈이 공유
```
⇒ 「어느 화면에서 무엇을 고쳐도 제비율이 다시 돌 수 있다」는 뜻이다. 13번 **T8(UI 명령별 재계산 범위)**이 왜 어려운지가 여기서 보인다 — 재계산 진입점이 한 곳이 아니라 **모듈마다** 있다.
## 2. ⭐ `DP_Common.CPM` — 계산 공용 라이브러리 73함수
11번 §4.1은 `CALC_STR`만 언급했다. **실제 함수 집합 전체**는 이렇다.
### 2.1 식 평가
```text
CALC_STR 식 문자열 평가
CALC_STR_PART 부분 평가
CALC_STR_URC URC(자원참조) 포함 평가 ← &M00034M& 계열을 푸는 자리
GET_URC_TYP 참조 종류 판정
GET_VARI_VAL 변수 읽기 SET_VARI_VAL 변수 쓰기 ← :=A01 중간라벨
```
### 2.2 반올림·수치 — 11번 §4.2의 원 함수가 전부 여기 있다
```text
MROUNDUD 반올림 계열 MROUNDUP 올림 MTRUNC 절사
MINT 정수화 MFRAC 소수부
GET_ROUND_CUT 설정에 따라 위를 고르는 디스패처
MSTRTODBL · MSTRTOINT · ISNUM · ISINT · CH_FNTOVAL · FLOATTOSTR_ · EXTTOSTR
```
**`MFRAC`(소수부)가 새로 나왔다.** 18번 §2.2의 「`Q`를 소수 2자리로 먼저 확정」·17번 §2의 「성분 소계 절사」처럼 **소수부를 따로 다루는 자리**가 실제로 함수로 있다.
### 2.3 조건·논리
```text
IIF IFI IFO CHK_TRUE_CLSTR COUNT_LOGICAL
```
⇒ 식 문자열에 **조건 분기**가 들어간다. 11번 §4.1의 「선택 토큰(`[+LAB]`·`[+ANJ_B]`)을 옵션에 따라 포함/제거」가 이 함수들로 처리된다.
### 2.4 문자열·기타
`ADDBJVAL` · `ADDBSL` · `ADDSPSTR` · `CHANGE_STR` · `COPY_LEFT/RIGHT` · `LEFT_STR` · `RIGHT_STR` · `SEP_STR` · `REPLICA_STR` · `COUNT_STR` · `MPOS` · `NPOS` · `BPOS` · `DIS_FMT` · **`AMTTOHAN`**(금액 한글 변환 — 「금 일억삼천사백이십만원정」) · 파일 조작 20여 개.
**재구현 지침** — 식 평가기는 `+ - * /``ROUND` 계열만으로 부족하다. **`IIF`·`IFI`·`IFO` 조건 함수와 `GET_VARI_VAL`/`SET_VARI_VAL` 중간변수**까지 갖춰야 한다.
## 3. `ST_P_XLS.CPM` — XLSX 입출력 72함수
| 함수 | 뜻 |
|---|---|
| `MAKE_XLS` · `SHOW_XLS` · `FREE_XLS` | 엑셀 생성·표시·해제 |
| **`CONV_XLS_2_ST`** | **엑셀 → STmate 역등록** |
| **`XLS_2_BDREC`** | 엑셀 → `BDQTY` 레코드 |
| **`Prn_FMLA_INFO`** | **수식 정보 출력** — 출력 XLSX에 수식이 남는 까닭 |
| `MK_BSCBOQ_EXL` · `MK_EXL_BSCBOQ` | 기준 BOQ 양방향 |
| `Prn_*_EXL` 약 55개 | `SET_REP` 서식마다 엑셀판 |
⇒ **엑셀이 단순 출력이 아니라 양방향 교환 경로**다. `〓 INITIAL 〓` 시트(18번 §2.3)가 재등록 메타인 까닭이 `CONV_XLS_2_ST`에 있다.
**`XLS_2_BDREC`** — 암호화된 `BDQTY`**엑셀에서 만들 수 있다.** 뒤집으면 `BDQTY` 내용이 엑셀 수량산출 양식과 대응한다는 뜻이다.
## 4. `SX32W.CPM` — 라이선스는 하드웨어 동글
```text
RNBOsproInitialize · RNBOsproFindFirstUnit · RNBOsproQuery · RNBOsproRead
RNBOsproGetKeyInfo · RNBOsproGetSubLicense · RNBOsproSetDeveloperCode
RNBOsproCheckTerminalService · RNBOsproSetHeartBeat · RNBOsproReleaseLicense …29개
```
**Rainbow(현 Thales) Sentinel SuperPro** API다. `ST_BdSN.CPM``Chk_BD_SN`·`Chk_REG_SN`(시리얼 검사)이 함께 있다.
⇒ **라이선스가 소프트 키가 아니라 USB 동글**이다. 13번의 통제시험 T1~T11이 왜 「영구 불가」인지가 확정됐다 — 동글이 없으면 실행 자체가 안 된다.
## 5. 그 밖에 드러난 모듈
| 모듈 | export | 뜻 |
|---|---:|---|
| `ST_U_Archive.CPM` | 16 | **STC 압축·해제**`Chk_STC_Ver`(버전) · `ComP_Data` · `UnPack`/`UnPack1`/`UnPack_No` |
| `ST_P_Excav.CPM` | 15 | **굴착 전용 내역 양식**`Prn_Nae_Ex1_*` · `Ex2_*` 계열. 도로공사 양식 |
| `ST_P_Nae.CPM` | 30 | 내역·원가 인쇄 본진 |
| `ST_P_List.CPM` | 11 | 목록표 계열 |
| **`ST_Jabpum.CPM`** | 6 | **`Edt_Hal_Amt` vs `Edt_Hal_Rate`** — 할증을 **금액과 율 두 갈래**로 편집. 07번 §4의 「수량 할증 ≠ 금액 가산」이 export 이름에 그대로 |
| `ST_U_ADL.CPM` | 6 | 온라인 갱신 — `ST_Down_File` · `ST_UP_INFO_R` · `ST_SND_Mail` |
| `ST_Com_V.CPM` | 10 | `GET_*_R` 계열 — 모듈 간 자원 조회 규약 |
| `ST_Func_C.CPM` | 7 | `SUM_TOT` · `CON_TOT` · `ZERO_TOT` · `PCN_TO_T` · `OPTIMIZ`**계층 합산** |
| `CPMARC`/`CPMUNA` | 4+4 | ZIP 압축·해제 (Info-ZIP) |
| `STmexe.Cpm` | 2 | `Chk_Exe` · `Chk_New_Exe` — 자기 갱신 |
## 6. 이번 점검이 바꾸는 것
| 항목 | 이전 | 지금 |
|---|---|---|
| 모듈 분석 범위 | 핵심 12개 | **46개 전수 export** |
| 식 평가기 함수 집합 | `CALC_STR`만 알았음 | ✅ **73함수** — 조건(`IIF`)·중간변수·`MFRAC`까지 |
| 재계산 진입점 | 한 곳으로 봄 | ⚠ **31개 모듈이 `Calc_Kanjub` 보유** — T8이 어려운 까닭 |
| 라이선스 | 「없음」까지만 | ✅ **Rainbow Sentinel SuperPro 하드웨어 동글** |
| 엑셀 | 단방향 출력으로 봄 | ✅ **양방향**`CONV_XLS_2_ST` · `XLS_2_BDREC` |
| 할증 | 한 갈래로 봄 | ✅ **금액·율 두 갈래** (`Edt_Hal_Amt`/`Edt_Hal_Rate`) |
| 변경 차수 8차 의문 | 미해결 | ✅ **해소** — 아래 |
## 7. 변경 차수 8차 의문 해소
22번 §3.3에서 「화면은 8차인데 `COSTN` 접미사는 4벌」이라 남겨 둔 것을 확인했다.
| 근거 | 결과 |
|---|---|
| `PRJLST.SMT` 차수 섹션 | 표본 7건 모두 **최대 `[1_KANJUB]`·`[2_KANJUB]`** |
| DBF 접미사 | `PRJLST`·`BOQ11`·`COSTN` 모두 **1~4 네 벌** |
| 바이너리 문자열 | **`1차변경`~`3차변경`만** 존재. 4~8차 없음 |
| `BOQ1*` / `BOQ2*` | `BOQ1` 15개 모듈, **`BOQ2`는 0개** |
**한 파일이 담는 것은 4벌(원설계 + 3차변경)이 맞다.** 화면의 1~8차는 **분리형으로 파일을 이어 갔을 때 그 파일들을 고르는 인쇄 선택**이다(16번 §4.6의 차수 인계). 저장 구조 의문은 없다.
@@ -0,0 +1,149 @@
# 설정키 전수와 간접비 식 템플릿 — 설정 사슬 닫기
점검일: 2026-09-13
재현 스크립트: `40_스크립트/settings_key_map.py` · 원자료 `30_원자료/prjlst_smt_keys.txt`
## 1. `PRJLST.SMT` 저장키 **241종**
21번 §3에서 일부만 봤던 것을 전수로 세었다. 접두어가 뜻을 가른다.
| 접두 | 뜻 | 개수 |
|---|---|---:|
| `C_` | **금액 직접입력** | 62 |
| `R_` | **요율** | 39 |
| `I_` | **선택 인덱스** | 41 |
| `B_` | 켬/끔 | 12 |
| `D_` | **밑수** | 26 |
| `S_` | **산출액** | 30 |
| `ADD_*` | **추가금액** | 22 |
| 그 밖 | `JAB_TYPE` · `CAL_ACTL` · `VIS_TOTL` · `Y_KONGSU` | 9 |
### 1.1 ⭐ `D_` 와 `S_` 가 짝을 이룬다 — 밑수와 결과를 함께 저장
```text
D_KANNO / S_KANNO 간접노무비 D_SANBO / S_SANBO 산재보험료
D_KUNBO / S_KUNBO 건강보험료 D_YUNBO / S_YUNBO 연금보험료
D_ANJUN / S_ANJUN 안전관리비 D_T_KITA / S_T_KITA 기타경비
D_HWAN / S_HWAN 환경보전비 D_ILBAN / S_ILBAN 일반관리비
D_HADOSU / S_HADOSU 하도급보증 D_EQIPSU / S_EQIPSU 건설기계보증
D_S_SUDO / S_S_SUDO … 수공 세부경비 8종도 같은 짝
```
**항목마다 「어떤 밑수에 곱했고 얼마가 나왔는지」를 프로젝트에 남긴다.** 09번 §2의 `indirect_result(base_amount, rate, raw_amount, rounded_amount)` 계약이 실제 저장 구조와 맞는다.
`S_DAMT_L` · `S_DAMT_M` · `S_DAMT_S` · `S_KAMT_M` 은 직접비 성분 합계다.
### 1.2 고용개선지원비가 4종으로 나뉜다
```text
C_EIS_HOLLAB C_EIS_HOLPAY C_EIS_INCENT C_EIS_SOCINS C_EIS_SUPPAY
R_EIS_HOLIR1 R_EIS_HOLIR2 R_EIS_INCENT R_EIS_SOCIR2
D_EIS_* / S_EIS_*
```
12번 §3.2가 「일반형식에 별도 묶음이 있다」고만 적은 **고용개선지원비**가 실제로 **휴업수당·장려금·사회보험·지원금 네 갈래**다.
### 1.3 ⭐ 추가금액 저장 구조
```text
ADD_CNT_1 ~ ADD_CNT_4 단계별 행 수
ADD_NAME_2_01 · ADD_UNIT_2_01 · ADD_BIGO_2_01 이름·단위·비고
ADD_AMT_2_01_1 ~ ADD_AMT_2_01_5 금액 (단계별 5칸)
ADD_AMT_3_01_1 ~ ADD_AMT_3_01_5
ADD_BUGA_2_01 부가세 포함 여부
```
`_2_`·`_3_` = **삽입 단계**, `_01` = 행 번호, `_1~5` = **단계별 포함 칸**. 11번 §9가 화면 문자열로 본 「단계 3~6 삽입」이 저장 구조로 확인된다.
### 1.4 형식 전용 키
```text
실적형식만 I_MTYP · I_LTYP · I_MXA · I_MXK · R_R_DM · R_R_DL · R_R_L · R_R_DMDL · R_R_DML
수공형식만 C_S_* / R_S_* / D_S_* / S_S_* (수도광열·복리후생·소모품·통신·세금·폐기물·도서·지급수수료)
```
`R_R_DM`·`R_R_DL`·`R_R_L`·`R_R_DMDL`·`R_R_DML`**`rGrd_RateB`의 열 이름(`재`·`직노`·`노`·`재+직노`·`재+노`) 그대로**다(02번 §RATE_B). 수공형식 밑수 배분 계수가 여기 저장된다.
## 2. 간접비 식 템플릿 — 바이너리 전수 **26개**
11번 §6이 일부만 보여 준 것을 모두 뽑았다. **대괄호는 런타임 치환 변수**다.
### 2.1 밑수가 다른 기본 꼴
```text
ROUNDDOWN( [T_AMT] * [RAT_1] ) 총액 기반
ROUNDDOWN( [LAMT] * [RAT_1] ) 노무 기반
ROUNDDOWN( [M_AMT] * [RAT_1] ) 재료 기반
ROUNDDOWN( ([L_AMT][+LAB]) * [RAT_1] ) 노무 + 선택토큰
ROUNDDOWN( ([T_AMT]-[M_AMT]) * [RAT_1] ) 총액 − 재료 ← 이윤
ROUNDDOWN( ([M_AMT]+[L_AMT]+[S_AMT]) * … ) 세 성분 합
```
`[+LAB]`는 **옵션에 따라 켜고 끄는 항**이다 — `DP_Common``CHK_TRUE_CLSTR`가 판정한다(24번 §2.3).
### 2.2 ⭐ 조건 분기가 식 안에 있다
```text
IF( ([LAMT]+[M_AMT]) … )
IF( ([L_AMT]+[M_AMT]) … )
```
**식 평가기에 `IF`가 필요하다.** 24번 §2.3의 `IIF`·`IFI`·`IFO` 함수가 이것을 처리한다. 사칙연산과 `ROUND` 계열만으로는 재현이 안 된다.
### 2.3 앞 결과를 밑수로 쓰는 꼴
```text
ROUNDDOWN( [C_KUNBO] * [RAT_1] )
```
**건강보험료의 「직접입력 금액」(`C_KUNBO`)에 요율을 곱한다** — 노인장기요양보험료다. 16번 §3에서 `장기요양 = 건강보험료 × 12.95%`로 실증한 것의 식 원문이며, **밑수가 요율 계산 결과가 아니라 `C_` 직접입력 칸**이라는 점이 19번 §6의 「당초액 유지」와 이어진다.
### 2.4 복합 보험식 — 세 항을 각각 절사 후 다시 절사
```text
ROUNDDOWN( ROUNDDOWN([LAMT]*[RAT_1]*[RAT_2]/100*1.4, 0)
+ ROUNDDOWN([LAMT]*[RAT_KY]*[RAT_3]/100, 0)
+ ROUNDDOWN([LAMT]*[RAT_1]*[RAT_2]/100*[RAT_4]/100, 0), 자리 )
```
### 2.5 변경설계 두 꼴
```text
[C_AMT_B] + ROUNDDOWN( [C_AMT_B] * (([C_TAMT_C]-[C_TAMT_B])/[C_TAMT_B]) ) 방법 A
[C_AMT_B] + ROUNDDOWN( ([C_TAMT_C]-[C_TAMT_B]) * [RAT_1] ) 방법 B
```
### 2.6 사급자재 VAT 제외
```text
+ [C_SAGUP_C] / 1.1
```
`cmBx_Kwan_Sa``사급자재대/1.1` 선택(12번 §10.1)이 식으로 들어간다.
## 3. 설정 사슬이 닫혔다
```text
화면 선택축 272개 (22번)
↓ 고르면
PRJLST.SMT 저장키 241종 (이 문서 §1)
↓ C_/R_/I_/B_ 값이
간접비 식 템플릿 26개 (§2)의 [RAT_n]·[C_*] 자리에 치환
↓ DP_Common 73함수로 평가 (24번 §2)
↓ 항목마다 D_(밑수)·S_(결과) 로 되돌아 저장
공사원가계산서 출력 (16번에서 원 단위 재현 완료)
```
**입력(화면) → 저장(SMT) → 식(템플릿) → 평가기(함수) → 결과(출력)** 다섯 칸이 모두 이어졌다.
## 4. 이번 점검이 바꾸는 것
| 항목 | 이전 | 지금 |
|---|---|---|
| 프로젝트 저장키 | 일부만 봄 | ✅ **241종 전수**, 접두어 6갈래 |
| 밑수 저장 | 안 남는 줄 알았음 | ✅ **`D_`(밑수)·`S_`(결과) 짝으로 저장** |
| 추가금액 | 화면 문자열로만 | ✅ **저장 구조** `ADD_AMT_단계_행_칸` |
| 고용개선지원비 | 「별도 묶음」 | ✅ **4갈래** (휴업수당·장려금·사회보험·지원금) |
| 수공 밑수 배분 | `RATE_B` 표만 | ✅ **`R_R_DM`·`DL`·`L`·`DMDL`·`DML`** 저장키 |
| 간접비 식 | 일부 | ✅ **26개 전수** |
| 식에 조건 분기 | 몰랐음 | ⚠ **`IF(...)` 존재** — 평가기 필수 요건 |
@@ -0,0 +1,61 @@
### CPM/EXE export 전수 — 모듈 44개, export 408개(중복포함)
11번이 다룬 핵심 12개 말고 **32개 모듈**이 남아 있었음
CPMARC.CPM 4개 GetZipDllPrivVersion, GetZipDllVersion, ZipDllExec, ___CPPdebugHook
CPMUNA.CPM 4개 GetUnzDllPrivVersion, GetUnzDllVersion, UnzDllExec, ___CPPdebugHook
DP_Common.CPM 73개 ADDBJVAL, ADDBSL, ADDSPSTR, AMTTOHAN, BPOS, CALC_STR, CALC_STR_PART, CALC_STR_URC, CHANGE_STR, C
DP_MinMsg.CPM 3개 GETNEWCODE_NAME, GETSPCHAR, MINIMSG
ST_BdSN.CPM 3개 Chk_BD_SN, Chk_BD_USE, Chk_REG_SN
✅ ST_Boq.CPM 4개 Add_From_MRG, Calc_Kanjub, Edit_Boq, Edit_Bqm
ST_Com_V.CPM 10개 GET_CAL_R, GET_COM_R, GET_IMS_R, GET_MRG_R, GET_PBL_R, GET_PRN_R, GET_SFC_R, GET_STM_R, GET_SYS_
ST_EdSan.CPM 3개 Calc_Kanjub, Edit_EQ_SYNC, Edit_SanKun
✅ ST_EdiLWi.CPM 2개 Calc_Kanjub, Edit_iLW
ST_FindUse.CPM 3개 Calc_Kanjub, Find_BDQ, Find_BOQ
ST_Func_C.CPM 7개 CON_TOT, OPTIMIZ, PCN_TO_T, SUM_TOT, VALTOPOS, ZERO_TO, ZERO_TOT
ST_Jabpum.CPM 6개 Calc_Kanjub, Edit_Dan, Edit_Strg, Edt_Hal_Amt, Edt_Hal_Rate, View_JabPum
✅ ST_KanJub.CPM 5개 Calc_Kanjub, Edit_KanJub, Edit_KanJub_K, Edit_Kan_Rate, Prn_Kan_Rate
ST_Merge_Code.CPM 1개 Calc_Kanjub
ST_PList.CPM 3개 Calc_Kanjub, Call_MRG, Call_PLIST
✅ ST_P_Collect.CPM 5개 Calc_Kanjub, Prn_Col_Dan, Prn_Col_Dan_L, Prn_Col_X, Prn_Col_X_L
✅ ST_P_ConEst.CPM 9개 Calc_Kanjub, Prn_Jab_K, Prn_Nae_C1, Prn_Nae_C2, Prn_Nae_C3, Prn_Nae_Est, Prn_Nae_K1, Prn_Nae_K2,
ST_P_Excav.CPM 15개 Calc_Kanjub, Prn_Nae_Ex1_0, Prn_Nae_Ex1_1, Prn_Nae_Ex1_2, Prn_Nae_Ex1_C1, Prn_Nae_Ex1_C2, Prn_Na
✅ ST_P_Joong.CPM 7개 Calc_Kanjub, Prn_Joong, Prn_Joong2, Prn_Joong2_L, Prn_Joong_C, Prn_Joong_C_L, Prn_Joong_L
ST_P_List.CPM 11개 Calc_Kanjub, Prn_AList, Prn_Comp_M, Prn_Comp_M1, Prn_Comp_M1_L, Prn_Dan, Prn_Dan_L, Prn_SanMok,
ST_P_Nae.CPM 30개 Calc_Kanjub, Prn_Boq_Not, Prn_Bqm, Prn_Jab, Prn_Jab_P, Prn_Nae, Prn_NaeW, Prn_NaeW_P, Prn_Nae_B,
ST_P_San.CPM 3개 Calc_Kanjub, Prn_San_L, Prn_San_P
ST_P_XLS.CPM 72개 CONV_XLS_2_ST, Calc_Kanjub, Chk_Xls_File, FIND_PRT_INDX, FREE_XLS, MAKE_XLS, MK_BSCBOQ_EXL, MK_E
ST_P_iLWi.CPM 3개 Calc_Kanjub, Prn_iLWi, Prn_iLWi_S
ST_Prt.CPM 4개 Calc_Kanjub, GS_Prn_Rec, Prn_Prt, Rep_Print
✅ ST_SanCal.CPM 2개 Calc_Kanjub, Calq_San
ST_Sys.CPM 2개 Calc_Kanjub, Set_Sys_1
ST_U_ADL.CPM 6개 Get_Real_Time, ST_Down_File, ST_NEW_INFO, ST_SND_Mail, ST_UP_DNINFO, ST_UP_INFO_R
ST_U_Archive.CPM 16개 Calc_Kanjub, Chk_ArcName, Chk_Data, Chk_STC_Ver, Chk_STDir, ComP_CurBOQ, ComP_Data, ComP_FOLD, C
✅ ST_U_ChgAmt.CPM 2개 CHANGE_AMT, Calc_Kanjub
✅ ST_U_ChgCode.CPM 10개 Calc_Kanjub, Chg_Code_All, Chg_Code_Plus, Chg_Code_Sel, Chk_Chg_Code_1, Chk_True_Rep_Code, Exec_
✅ ST_U_ConBD.CPM 4개 CONBD_USD_QTY, CON_QTY, CON_QTY9, Calc_Kanjub
✅ ST_U_Convert.CPM 20개 Appn_Tag_REP, CHK_K_FLD, Calc_Kanjub, Conv_BOQ, Conv_Equip, Conv_Jodal_ST8, Conv_ST8_Jodal, Conv
ST_U_DelCode.CPM 6개 Calc_Kanjub, Chk_True_Del_1, Del_Code_A_T, Del_Code_A_X, Del_Code_Sel, Exec_Delete_Code
ST_U_DelPrj.CPM 3개 Calc_Kanjub, Delete_Prj, Merge_Prj
ST_U_Indx.CPM 2개 Calc_Kanjub, INDX_ALL
ST_U_Merge.CPM 2개 Calc_Kanjub, ST_MERGE
ST_VSetup.EXE 2개 _MainWndProc@16, _StubFileWrite@12
STmate.Cpm 1개 Calc_Kanjub
✅ STmateQty8.CPM 4개 Calc_Kanjub, FIND_QCODE, Free_Qty, ST_QTY
STmexe.Cpm 2개 Chk_Exe, Chk_New_Exe
SX32W.CPM 29개 RNBOsproActivate, RNBOsproCheckTerminalService, RNBOsproCleanup, RNBOsproDecrement, RNBOsproEnum
UNWISE.EXE 4개 _ItemDlg@16, _MainWndProc@16, _PromptDlg@16, _SharedDlg@16
View_Old_San.CPM 1개 Show_Old_San
### 여러 모듈이 공유하는 export (플러그인 공통 규약)
Calc_Kanjub 31개 모듈
___CPPdebugHook 2개 모듈
Prn_Boq_Not 2개 모듈
Prn_Nae_ColL 2개 모듈
Prn_Nae_ColM 2개 모듈
Prn_Nae_ColX 2개 모듈
Prn_Nae_Cont1 2개 모듈
Prn_Nae_Cont2 2개 모듈
_MainWndProc@16 2개 모듈
GetZipDllPrivVersion 1개 모듈
GetZipDllVersion 1개 모듈
ZipDllExec 1개 모듈
@@ -0,0 +1,95 @@
### PRJLST.SMT 저장키 241종 (접두 차수 제거)
■ C_ 금액 직접입력 62개
C_ANJUN C_ANJUN1_G C_ANJUN2_G C_ANJUNP C_ANJUN_B
C_ANJUN_G C_BUGA_M C_BUSAN C_BUSAN_B C_DOSEOH
C_EIS_HOLLAB C_EIS_HOLPAY C_EIS_INCENT C_EIS_SOCINS C_EIS_SUPPAY
C_EQIPSU C_EXCEPT_B C_HADOSU C_HWAN C_ILBAN
C_IYUN_M C_KANNO C_KAN_M C_KN_SA C_KOBO
C_KONGSA C_KONGSA_J C_KONGSU C_KONGSU_A C_KONGSU_MA
C_KUNBO C_KWANGUP C_KWANGUP_D C_KWANGUP_K C_NBUGAM
C_PSAMT_B C_PUMJIL_B C_PURCHAS C_SAGUP C_SANBO
C_SANGSI C_SLVBO C_S_ANJUN_B C_S_BOKRI C_S_DOSEO
C_S_JIGUP C_S_PEGI C_S_PUMJIL C_S_SEGUM C_S_SIGONG
C_S_SOMO C_S_SUDO C_S_TONGSIN C_TBUGUM C_T_ANJUN_N
C_T_JODAL C_T_KITA C_T_KOLJAE C_T_K_MAT C_T_PEGI
C_UPDNKWN C_YUNBO
■ R_ 요율 39개
R_ANJUN R_ANJUN1 R_ANJUN2 R_ANJUNP R_DOSEOH
R_EIS_HOLIR1 R_EIS_HOLIR2 R_EIS_INCENT R_EIS_SOCIR2 R_EQIPSU
R_HADOSU R_HWAN R_ILBAN R_IYUN R_KANNO
R_KOBO R_KONGSA R_KONGSU R_KUNBO R_R_DL
R_R_DM R_R_DMDL R_R_DML R_R_L R_SANBO
R_SLVBO R_S_BOKRI R_S_DOSEO R_S_JIGUP R_S_PEGI
R_S_SEGUM R_S_SIGONG R_S_SIGONG_1 R_S_SOMO R_S_SUDO
R_S_TONGSIN R_TBUGUM R_T_KITA R_YUNBO
■ I_ 선택 인덱스 41개
I_ANJUNAUTO I_ANJUN_B I_ANJUN_K I_ANJUN_TYPE I_ANPUM
I_AN_DN_TYPE I_BF_CH_BO I_BID_TYPE I_BUGA I_COST_BO
I_DOGUP I_DOG_JEOL I_EQIP I_HWAN I_ILBAN
I_IYUN I_JEOLSA I_KAN_JEOLSA I_KN_SA_TYPE I_KOBO_TYPE
I_KONG_KIKAN I_KONG_TYPE I_KOSU_TYPE I_KUNBO I_KUN_TYPE
I_KWN_COMB I_KWN_JEOLSA I_KWN_K_JEOLSA I_KWN_K_UPDN I_KWN_UPDN
I_LTYP I_MTYP I_MXA I_MXK I_NAG_RATE
I_POS_SA I_SET_BASE I_TBUGUM I_TOT_ADD I_TOT_JEOL
I_YUNBO
■ B_ 켬/끔 12개
B_ANJUN_B B_BUGA_UP B_BUSAN_B B_CHANGE B_EXCEPT_B
B_KONGSA B_KWANGUP_D B_KWANGUP_K B_NBUGAM B_PSAMT_B
B_PUMJIL_B B_T_JODAL
■ Y_ 연도·기타 1개
Y_KONGSU
■ 기타_ 섹션·기타 86개
ADD_AMT_2_01_1 ADD_AMT_2_01_2 ADD_AMT_2_01_3 ADD_AMT_2_01_4 ADD_AMT_2_01_5
ADD_AMT_3_01_1 ADD_AMT_3_01_2 ADD_AMT_3_01_3 ADD_AMT_3_01_4 ADD_AMT_3_01_5
ADD_BIGO_2_01 ADD_BIGO_3_01 ADD_BUGA_2_01 ADD_CNT_1 ADD_CNT_2
ADD_CNT_3 ADD_CNT_4 ADD_NAME_2_01 ADD_NAME_3_01 ADD_UNIT_2_01
ADD_UNIT_3_01 CAL_ACTL D_ANJUN D_ANJUNP D_EIS_HOLLAB
D_EIS_INCENT D_EIS_SOCINS D_EIS_SUPPAY D_EQIPSU D_HADOSU
D_HWAN D_ILBAN D_KANNO D_KOBO D_KONGSA
D_KONGSU D_KUNBO D_SANBO D_SLVBO D_S_BOKRI
D_S_DOSEO D_S_JIGUP D_S_PEGI D_S_SEGUM D_S_SIGONG
D_S_SOMO D_S_SUDO D_S_TONGSIN D_TBUGUM D_T_KITA
D_YUNBO JAB_TYPE S_ANJUN S_ANJUNP S_DAMT_L
S_DAMT_M S_DAMT_S S_EIS_HOLLAB S_EIS_INCENT S_EIS_SOCINS
S_EIS_SUPPAY S_EQIPSU S_HADOSU S_HWAN S_ILBAN
S_KAMT_M S_KANNO S_KOBO S_KONGSA S_KONGSU
S_KUNBO S_SANBO S_SLVBO S_S_BOKRI S_S_DOSEO
S_S_JIGUP S_S_PEGI S_S_SEGUM S_S_SIGONG S_S_SOMO
S_S_SUDO S_S_TONGSIN S_TBUGUM S_T_KITA S_YUNBO
VIS_TOTL
### 간접비 식 템플릿 — 바이너리에서 전수
서로 다른 템플릿 26개 (상위 30)
ROUNDDOWN( [T_AMT] * [RAT_1] 62
ROUNDDOWN( [LAMT] * [RAT_1] 31
ROUNDDOWN( ([L_AMT][+LAB]) * [RAT_1] 31
[C_AMT_B]+ROUNDDOWN( [C_AMT_B] * (([C_TAMT_C]-[C_TAMT_B])/[C_TAMT_B]) 31
(([LAMT][+LAB])- 31
[C_AMT_B]+ROUNDDOWN( ([C_TAMT_C]-[C_TAMT_B]) * [RAT_1] 31
([LAMT][+LAB]) 31
ROUNDDOWN( [C_KUNBO] * [RAT_1] 31
ROUNDDOWN( ([LAMT][+LAB]) * [RAT_1] 31
[LAMT][+LAB] 31
([LAMT]+[M_AMT] 31
IF(([LAMT]+[M_AMT]) 31
([LAMT]+[M_AMT])) 31
([L_AMT]+[M_AMT]) 31
IF(([L_AMT]+[M_AMT]) 31
([L_AMT]+[M_AMT])) 31
ROUNDDOWN( ([T_AMT]-[M_AMT]) * [RAT_1] 31
ROUNDDOWN( ROUNDDOWN([LAMT]*[RAT_1]*[RAT_2]/100*1.4 31
0) + ROUNDDOWN([LAMT]*[RAT_KY]*[RAT_3]/100 31
0) + ROUNDDOWN([LAMT]*[RAT_1]*[RAT_2]/100*[RAT_4]/100 31
ROUNDDOWN( ([M_AMT]+[L_AMT]+[S_AMT] 31
ROUNDDOWN([T_AMT] * [RAT_1] 31
ROUNDDOWN([M_AMT] * [RAT_1] 31
+[C_SAGUP_C]/1.1 31
[C_SAGUP_C]/1.1 31
ROUNDDOWN([TAMT] * [RATE] 3
@@ -0,0 +1,335 @@
### 파싱 성공한 STmate 고유 폼 150개
■ PM_Prn_Ord ST_Prt.CPM «보고서 파일의 인쇄순서를 지정합니다.»
cBx_BTyp 당초 설계, 변경 설계, 분할 설계, 실적 공사, 할증 내역, 견적 내역, 계약 내역, 실행 예산, 기성 내역, 설계 변경, 굴착/복구, 굴착 변경
■ PM_Prt ST_Prt.CPM «설계예산시스템 인쇄메뉴»
cmBx_FntTyp 굴림체, 궁서체, 바탕체, 돋움체
cmBx_BigoFld 코드번호 인쇄, 번호(호표) 인쇄, 분류번호 인쇄, 시설코드 인쇄, 호환규정코드, 적용기준일, 수공분류코드
cmBx_CodeFld 코드번호 인쇄, 번호(호표) 인쇄, 분류번호 인쇄, 시설코드 인쇄, 호환규정코드
cmBx_PosQty 수량 / 단위, 단위 / 수량, 표 준
cmBx_BigoFld2 코드번호 인쇄, 번호(호표) 인쇄, 분류번호 인쇄, 시설코드 인쇄, 호환규정코드, 적용기준일, 수공분류코드
cmBx_SHTyp 일반양식 인쇄, 토개공양식 인쇄, 수자원공사양식 인쇄
cmBx_SanLP 기본방향(세로) 인쇄, 횡 방향(가로) 인쇄
cmBx_SanMOK 일반양식 인쇄, 산근양식 인쇄
■ PM_Sel_St ST_Prt.CPM «인쇄할 공종을 선택하세요»
rd_Filter 소 계(+=) 이상, 계(+==) 이상, 합 계(+===) 이상, 총 계(+====) 이상, 총합계(+=====
Rg_Bk 아래로, 위로
■ mMinMsg_ DP_MinMsg.CPM «종류»
ListBox1 기호1, 기호2, 영어/숫자, 한글자모, 그리스어, 선문자, 단위기호, 원문자, 괄호문자, 히라가다, 가다가나, 러시아어, 특수외국어, 분수/첨자
■ uM_ConstType ST_U_Convert.CPM «건축공사 사업내용《 건축공사 중 신축 또는 신축에 준하»
cn_Cn_Code1 서울특별시; 11, 부산광역시; 26, 대구광역시; 27, 인천광역시; 28, 광주광역시; 29, 대전광역시; 30, 울산광역시; 31, 세종특별자치시; 36
cn_Cn_Code2 서울특별시; 11, 부산광역시; 26, 대구광역시; 27, 인천광역시; 28, 광주광역시; 29, 대전광역시; 30, 울산광역시; 31, 세종특별자치시; 36
cn_Bd_Type 일반청사; 연면적 10,000㎡ 미만 공용청사(경찰서, 우체국 포함), 대형청사; 연면적 10,000㎡ 이상 공용청사(경찰서, 우체국 포함), 일반형초중고;
cn_Dm_Const 철거공사 포함; 기존 부지에 있는 시설물을 철거하고 공사, 철거공사 미포함; 기존/신축 부지에 시설물만 공사
cn_Cl_Area 비혼잡지역(일반); 공사와 관련된 현장주변의 장애요인이 적고 공사수행환경이 복잡하지 않은 지역, 혼잡지역(특수); 공사에 따른 민원발생 소지가 높고, 특수지반
cn_Gr_Shape 일반지반; 터파기 등 기초공사 수행에 어려움이 없는 지반, 특수지반;
cn_Sh_Const 흙막이공사가 없는 경우, 흙막이공사가 있는 경우
cn_St_Type 철골조; 주요 구조부가 철골조로 구성된 경우, 철골철근콘크리트조; 주요 구조부가 철골철근콘크리트로 구성된 경우, 철근콘크리트조; 주요 구조부가 철근콘크리로 구
■ uM_Merge ST_U_Merge.CPM «데이타 병합 【 복사처 <= 복사원 】»
Rdo_BD 각 기준에 따라 설정, 일식단가(W코드)로 생성
Rdo_X 일위대가 기준대로 처리, 일식단가(W코드)로 생성
RdoL 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성)
RdoM 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성)
RdoS 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성)
RdoB 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성)
RdoD 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성)
RdoW 복사처적용 (동일항목 코드치환), 복사원적용 (동일항목 내용복사), 신규등록 (단가다른코드 신규생성)
■ uM_XML_Info ST_U_Convert.CPM «공사원가호환규정 포맷(XML) 변환»
ed_PrjTyp 토목공사, 건축공사, 설비공사, 전기공사, 통신공사, 조경공사, 소방공사, 국가유산수리공사
■ wBoq ST_Boq.CPM «공종목록표»
cBox01 = 이상, == 이상, === 이상, ==== 이상 , ===== 이상, ====== 이상
RGrpTo 내역서, 열린 보관함
cBox02 = 이상, == 이상, === 이상, ==== 이상 , ===== 이상, ====== 이상
■ wBoqRate ST_Boq.CPM «할증율 적용:»
Rdo 전체(재,노,경 같은 비율), 비목별(재,노,경 각각)
■ wExpnd ST_Boq.CPM «일위대가표 풀기»
RGrpToT 소계(=), 계(==), 합계(===)
CMBoxUpDn 절삭하여, 반올림하여
CMBoxDot 소수 4위값을 적용, 소수 3위값을 적용, 소수 2위값을 적용, 소수 1위값을 적용, 소수 0위값을 적용
■ wITNum ST_Boq.CPM «내역서의 공종번호 자동입력»
RdoFirstChar 공란처리, . 입력, ( 입력, - 입력, 추가입력
RdoLastChar 공란처리, . 입력, ) 입력
CBoxType 가..하,거..허 ~ 그..흐,기..히 (14x10=140개 까지만 처리), a .. z,a1..z1 ~ a8..z8,a9..z9 (26x10=260개 까
CBoxLeft 여백 0 Byte, 여백 1 Byte, 여백 2 Byte, 여백 3 Byte, 여백 4 Byte, 여백 5 Byte, 여백 6 Byte, 여백 7 Byte,
Fmt_Typ 0, 00, 000
cBx_itNum_B 『직전공종(계표시)의 공종번호』, 『직전공종길이 여백으로 채움』
cBx_OnlyIT 공종(계표시) / 단가코드 모두적용., 공종(계표시)에만 구분적용., 단가코드에만 구분적용.
cBx_Bl_Lev 하위 전체공종 반영, 9레벨(=========) 미만에서 초기화, == 레벨 미만에서 초기화, === 레벨 미만에서 초기화,
■ wKongJong ST_Boq.CPM «공종 목록표»
RdoLevel 소계 (+=), 계 (+==), 합계 (+===), 총계 (+====), 총합계(+=====), 총대계(+======)
RdoFirstChar - 입력, 없슴
RdoIndex 코드번호 순, 명 칭 순, 분류번호 순
RdoFilt 일위대가/산근전체, 대공종 해당목록만
■ wMBoq ST_Boq.CPM «주공종 집계표(계표시 확인)»
CBox01 1레벨( 소 계 ) 이상, 2레벨( 계 ) 이상, 3레벨( 합 계 ) 이상, 4레벨( 총 계 ) 이상, 5레벨(총 합 계) 이상, 6레벨(총 대
■ wM_Boq_ExecX ST_Boq.CPM «시간/단위당 중기실행단가 계산 및 입력»
wCm_Jeol 1원, 10원, 100원, 1,000원, 10,000원, 100,000원
wCm_OPT 기본보정, 노 무 비, 재 료 비, 경 비
■ wM_Box_H STmate.Cpm «불러간 목록»
RG_MComp 변동없음, 1 단가, 2 단가, 3 단가, 4 단가, 5 단가, 최소단가
■ wM_Boxa STmate.Cpm «단가목록표»
RG_MComp 변동없음, 1 단가, 2 단가, 3 단가, 4 단가, 5 단가, 최소단가
rg_FLT_M_PP 모 두 보 임, 10 : 새들분수전, 11 : K.P 자재, 12 : 엘보, 13 : 직관, 14 : 소켓, 15 : S.T.S 자재, 16 : 니플, 17
rg_FLT_B_PP 모 두 보 임, 30 : 토공, 31 : 포장공, 32 : 포장깨기/절단, 30~32 : 토공사, 40 : 분기공, 41 : 관접합, 42 : 관연결, 43
■ wM_Conv_A2W STmate.Cpm «실적단가를 일식단가로 변환등록»
wcBx_SelJOD 비목율( 단가 => 노,재,경 ), 조달청 발표단가 변환적용
cBx_Stndard 공종(실적)코드 ↔ 분류번호로 연결, 공종(실적)코드 ↔ 시설코드로 연결, 명칭, 규격, 단위 로 연결
■ wM_Conv_Mode ST_PList.CPM «설계자료 → 계약자료로 변환등록»
cBx_Sel_QTY 당초 수량/단가 적용, 변경 수량/단가 적용
cBx_Lev 소계 이상, 계 이상, 합계 이상, 총계 이상, 총합계 이상, 총대계 이상, 광역계 이상, 광역총계이상, 광역대계이상
■ wM_Edit_EQ ST_EdSan.CPM «표준중기공식 편집.»
cBx_INS_X 공 식, 공식+코드
■ wM_Edit_San ST_EdSan.CPM «단가산출근거 수정[ D00001: 무근콘크리트 깨기 ]»
RdosmMode 열블럭, 행블럭, 일 반
cBoxFunc 각종 지원함수, ∏, INT(0), SIN(0), COS(0), TAN(0), SQRT(1) , √(1), ROUND(1,0), ROUNDDOWN(1,0),
cBox_Trans 코드 * 수량(0) =, 명칭 코드 * 수량(0) =, 명칭 규격 코드 * 수량(0) =, 명칭 규격 코드 * 수량(0) 단위 =, 코드번호
ComOp /, *
ComQty Q, A, T, N
cmBx_IFORCE XML비호환 메세지 숨김, XML비호환시 보이기
cBx_SBMOK 0 각 해당비목 적용, 1 재료비로 적용, 2 노무비로 적용, 3 경 비로 적용
■ wM_Edit_XRate ST_EdiLWi.CPM «시간당 손료계수 수정»
cBx_Sel 계 입력, 각계수 입력
■ wM_Edit_iLWi ST_EdiLWi.CPM «일위대가표 수정»
wcBx_RXX 초기값설정 개별적용, 기 본 노임산출계수, 기 타 노임산출계수, 기타-1노임산출계수, 기타-2노임산출계수, 기타-3노임산출계수, 기타-4노임산출계수
cBx_SBMOK 0 각 해당비목 적용, 1 재료비로 적용, 2 노무비로 적용, 3 경 비로 적용
■ wM_Edt_Hal ST_Jabpum.CPM «기준단가 수정»
wcBx_Up 절사, 반올림
■ wM_Expnd ST_Boq.CPM «일위대가표 및 단가산출근거 풀어넣기»
wcBx_Pnt1_M 0 절사하여, 1 반올림 하여
wcBx_Pnt2_M 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용
wcBx_Pnt1_L 0 절사하여, 1 반올림 하여
wcBx_Pnt2_L 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용
wcBx_Pnt1_X 0 절사하여, 1 반올림 하여
wcBx_Pnt2_X 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용
wcBx_Pnt1_W 0 절사하여, 1 반올림 하여
wcBx_Pnt2_W 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용
■ wM_Expnd10 ST_Boq.CPM «일위대가표 풀기»
RGrpToT 입력안함, 소계(=), 계(==), 합계(===)
Add1_PRIN 재료비의, 노무비의, 경비의, 전체의
Add1_PROUT 재료비로 계산, 노무비로 계산, 경비로 계산, 해당비목 계산
Add2_PRIN 재료비의, 노무비의, 경비의, 전체의
Add2_PROUT 재료비로 계산, 노무비로 계산, 경비로 계산, 해당비목 계산
■ wM_GetAMT ST_KanJub.CPM «잡비 금액 불러오기»
rd_Filter 모두보기, 소 계(+=), 계(+==), 합 계(+===), 총 계(+====), 총합계(+=====)
■ wM_Host STmate8.Exe «서버의 IP주소를 입력하고 IP접속( 또는 Enter »
rgPrgTyp 일반, LAN, EDU, OnLine, 북측
■ wM_JDCode STmate.Cpm «공사원가 호환규정코드 찾기 / 입력»
wCb_Base 명칭, 명칭/규격, 분류번호, 시설코드, 선택안함
wCb_Srch 명칭/규격/단위, 호환규정코드, 군급목록번호, 중기품셈코드, 시설코드번호
wCb_Other 기본, 자재, 경비, 중기, 실적/기타
wCb_Method 분류별 조회, 코드..명칭 조회
■ wM_JabPum ST_Jabpum.CPM «닫기 (&Q)»
cBoxCode 모든단가, 노무비, 재료비, 경비, 일위대가, 중기비, 단가산출, 견적단가, 대가,산근, 그림코드
cBox_IFORM 명칭,규격 으로검색, 산근내용 으로검색
■ wM_KanJub ST_KanJub.CPM «제잡비 계산»
Cmbx_PORD1_H 당초 / 변경 대비인쇄, 변 경 분 만 인 쇄
cBx_K_JeolSa 간접비 절사없음, 간접비 10원미만 절사, 간접비 100원미만 절사, 간접비 1,000원미만 절사, 간접비 10,000원미
cBx_Chasu 원설계, 1차변경, 2차변경, 3차변경
cBx_W_Type 제잡비 원가계산방식, 제잡비 표준시장방식
cBx_Jeol_T 총공사비에서 조정, 10원 미만, 100원 미만, 1,000원 미만, 10,000원 미만, 100,
Ed_C_AnJun_K_T 없음, 관급/사급 내용, 사급자재대
Ed_C_AnJun_B_T , 의 1.2배
Ed_C_KUNBO_T ㄴ.1)직노, 당해 상시근로자노무비
■ wM_KanJub_K ST_KanJub.CPM «< 기성 제잡비 계산서 >»
rd_Filter 소 계(+=) 이상, 계(+==) 이상, 합 계(+===) 이상, 총 계(+====) 이상, 총합계(+=====) 이상
cmBx_Buga (0) 직접입력, (1) 공급가액의 10%, (2) 재료비의 10%, (3) 재료비+산출경비의 10%
cmBx_JeolSa 총공사비에서 조정, 10원 미만, 100원 미만, 1,000원 미만, 10,000원 미만, 100,
cmBx_Tot_Jeol 이윤금액 직접입력, 10원 미만, 100원 미만, 1,000원 미만, 10,000원 미만, 100,
■ wM_Mk_Cont STmate.Cpm «당초설계 → 계약내역 변환등록»
cBx_Lev 소계 이상, 계 이상, 합계 이상, 총계 이상, 총합계 이상, 총대계 이상, 광역계 이상, 광역총계이상, 광역대계이상
■ wM_Mrg_BSC STmate.Cpm «자료파일 업데이트»
cBx_Sel1 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함
cBx_Sel2 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함
cBx_Sel3 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함
cBx_Sel4 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함
cBx_Sel5 호환규정코드, 시설코드, 명칭/규격/단위, 호환+명+규+단, 명칭/단위, 설정안함
rg_Name 업데이트 안함(복사처적용), 업데이트 (복사원적용)
rg_Amt 업데이트 안함(복사처적용), 업데이트 (복사원적용)
rg_JDCOD 업데이트 안함(복사처적용), 업데이트 (복사원적용), 복사처 우선적용 업데이트, 복사원 우선적용 업데이트
■ wM_Rate ST_Boq.CPM «노무비»
rd_Qty1 내역서 전체, 선택된 항목만
rd_Amt1 내역서 전체, 선택된 항목만
rd_Amt2 내역서 전체, 선택된 항목만
wcBx_Pnt1 0 절사하여, 1 반올림 하여
wcBx_Pnt2 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용
wcBx_Pnt1_M 0 절사하여, 1 반올림 하여
wcBx_Pnt2_M 0 소수 0위값을 적용, 1 소수 1위값을 적용, 2 소수 2위값을 적용, 3 소수 3위값을 적용, 4 소수 4위값을 적용
wcBx_Pnt1_L 0 절사하여, 1 반올림 하여
■ wM_Req_ON STmate.Cpm «유지보수기간 연장신청»
wEd_Sub 12개월, 6개월, 3개월
■ wM_Sel_Prn STmate.Cpm «인쇄할 영역을 선택하세요»
cb_PCLASS 당초설계, 변경설계, 분할설계
cb_PRTYPE 해당코드 상위의 7레벨공종이하 내역전체, 해당코드 상위의 해당레벨(하위레벨제외)
cb_ACTTYP 노무비외 비목 적용안함, 노무비외 재료비로 적용, 노무비외 경비로 적용
cb_ACTOPT 노무비 1원미만 버림, 소수 비교후 노무비 우선보정, 소수 비교후 타금액 우선보정
cb_CHASU 1차변경, 2차변경, 3차변경, 4차변경, 5차변경, 6차변경, 7차변경, 8차변경
■ wM_Set_Sys ST_Sys.CPM «초기값 입력및 수정»
cmBx_Sel_RX 계수 ;터널구간, 계수-1;장대터널, 계수-2;펌프준설선, 계수-3;GRAB준설선, 계수-4;버켓준설선
cmBX_EXR 시간당중기사용료 단독적용, 중기, 대가, 산근, 내역 전체
cmBx_KCD 0 자리, 1 자리, 2 자리
cmBx_ACD 0 자리, 1 자리, 2 자리
cmBx_ZCD 2 자리, 3 자리
cmBx_JCD 0 자리, 1 자리, 2 자리
cmBx_ECD 0 자리, 1 자리, 2 자리
cmBx_BPN 0 자리, 1 자리, 2 자리
■ wM_Stmate_Merge_Code ST_Merge_Code.CPM «설계예산시스템 코드병합»
rg_Set_Sys 선택코드만 병합, 선택코드+하위기초단가코드 병합, 모든코드(하위 산근,대가포함) 병합, 코드병합 취소
■ wQtyList STmateQty8.CPM «수량산출서»
cBoxCode 모든단가, 노무비, 재료비, 경비, 일위대가, 중기비, 단가산출, 견적단가, 대가,산근
■ wSrch_PL ST_PList.CPM «프로젝트 DATA검색(명칭, 규격)»
wcBx_Type 노무비, 재료비, 경비, 중기비, 일위대가, 단가산출, 일식/표준시장, 내역서
선택지를 가진 폼 40개, 선택축 272개
### STmate 고유 폼 — 모듈별
■ STmate.Cpm 30개
M_Chk_Pw PM_Req_AS frmAddTip frmEditor
frmTips wM_About wM_Box_H wM_Boxa
wM_Conv_A2W wM_DM_Com wM_D_Restore wM_Dm_1
wM_Dm_2 wM_Down_Center wM_Get_Info wM_Get_Value
wM_JDCode wM_JajeXLS wM_Mk_Cont wM_Mrg_BSC
wM_Req_AS wM_Req_ON wM_Rw_On wM_Sel_Prn
wM_Show_Info wM_Status wM_Stmate_Start_8x wM_Xls_Comp
wM_iLWi_San wPrjList
■ ST_P_Nae.CPM 22개
PM_Boq_Not PM_Bqm PM_Jab PM_Jab_P
PM_Nae PM_NaeW PM_NaeW_P PM_Nae_B
PM_Nae_Col PM_Nae_Col_ML PM_Nae_Cont PM_Nae_K0
PM_Nae_P PM_Nae_P_K0 PM_Nae_Plan_A PM_Nae_Plan_K
PM_Won_A PM_Won_A_C PM_Won_A_L PM_Wonga
PM_Wonga_C PM_Wonga_L
■ ST_Boq.CPM 13개
wBoq wBoqRate wExpnd wITNum
wKongJong wMBoq wM_Boq_ExecX wM_Expnd
wM_Expnd10 wM_From_XLS wM_Rate wM_Ref_Lst
wSameCode
■ ST_P_ConEst.CPM 8개
PM_JAB_K PM_NAE_C1 PM_NAE_C2 PM_NAE_C3
PM_NAE_K1 PM_NAE_K2 PM_NAE_K3 PM_Nae_Est
■ ST_PList.CPM 8개
wM_Add_Prj wM_Conv_Mode wM_Get_Node wM_Get_Value
wM_ST_Restore wPList wST_Dir wSrch_PL
■ ST_P_List.CPM 7개
PM_Comp_M PM_Dan PM_Dan_L PM_SanMok
PM_SanMok_L PM_SanMok_P PM_iLMok
■ ST_P_Excav.CPM 6개
PM_NAE_Ex2 PM_NAE_Ex2T PM_Nae_Ex1 PM_Nae_Ex1T
PM_Nae_ExC PM_Nae_ExCT
■ ST_P_Joong.CPM 6개
PM_JOONG PM_JOONG2 PM_JOONG2_L PM_JOONG_L
PM_Joong_C PM_Joong_C_L
■ ST_KanJub.CPM 5개
PM_KAN_RATE wM_GetAMT wM_KAN_RATE wM_KanJub
wM_KanJub_K
■ ST_Jabpum.CPM 4개
wM_Edit_Strorage wM_Edt_Hal wM_Inst_CD wM_JabPum
■ ST_P_Collect.CPM 4개
PM_Col_Dan PM_Col_Dan_L PM_Col_X PM_Col_X_L
■ ST_Prt.CPM 4개
PM_Jab_Ord PM_Prn_Ord PM_Prt PM_Sel_St
■ ST_Viewer.exe 4개
wM_About wM_Extr wM_Main__Viewer wM_Sub
■ DP_MinMsg.CPM 3개
mMinMsg_ wInDlgImg wInDlgMemo
■ ST_EdSan.CPM 3개
wM_Edit_EQ wM_Edit_San wM_Edit_USER
■ ST_Sys.CPM 3개
wM_Set_Init wM_Set_JLab wM_Set_Sys
■ ST_U_ChgCode.CPM 3개
uM_ChgCode uM_Chg_Plus uM_ReplCode
■ ST_U_ConBD.CPM 3개
uM_ConBD uM_ConQTY uM_ConQTY9
■ ST_U_Convert.CPM 3개
uM_BSC_M uM_ConstType uM_XML_Info
■ ST_Merge_Code.CPM 3개
wM_Stmate_Merge_Code wM_Sub wSrch_PL
■ JDLCHK.Size.dll 2개
frm_CheckProgress frm_JDLAnno
■ ST_Com_V.CPM 2개
wInDlgImg wInDlgMemo
■ ST_EdiLWi.CPM 2개
wM_Edit_XRate wM_Edit_iLWi
■ ST_FindUse.CPM 2개
wM_FindBoq wM_FindUse
■ ST_P_iLWi.CPM 2개
PM_iLWi PM_iLWi_S
■ ST_P_San.CPM 2개
PM_San_L PM_San_P
■ ST_U_ADL.CPM 2개
NMShow wM_ADL
■ ST_Func_C.CPM 2개
wInDlgImg wInDlgMemo
■ ST_Wal.CPM 2개
wM_Get_GJ wM_Stmate_Get_Wal
■ JDLCHK.Tab.dll 1개
frm_CheckProgress
■ JDLCHK.Tab_33.dll 1개
frm_CheckProgress
■ ST_U_Archive.CPM 1개
uM_Archive
■ ST_U_ChgAmt.CPM 1개
uM_Chg_Amt
■ ST_U_DelCode.CPM 1개
uM_DelCode
■ ST_U_DelPrj.CPM 1개
uM_DelPrj
■ ST_U_Indx.CPM 1개
uM_Indx
■ ST_U_Merge.CPM 1개
uM_Merge
■ STmateQty8.CPM 1개
wQtyList
■ ST_U_APatch.CPM 1개
wM_Stmate_APatch
■ STmate8.Exe 1개
wM_Host
■ View_Old_San.CPM 1개
M_Hrp_San
### 갈래별 (총 172개)
모달 편집 66개
인쇄 63개
편집 창 19개
기타 17개
보조 창 7개
@@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
"""STmate 고유 폼 목록을 모듈·갈래별로 정리."""
import sys, io, pathlib, re, collections
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
ROOT = pathlib.Path(r"C:\경영정보(주)\System")
THIRD = re.compile(r"^(Dclhrp60|designide60|RTL60|VCL60|DBRTL60|BDERTL60|RealGrid|Apollo|dsnide)", re.I)
HRLIB = {"HReportUf","HRPageRf","HRPreVUf","HRSaveUf","LoginDialog","PasswordDialog","HRGridCUf",
"HRGridFUf","HRGroupUf","HRLinkFf","HRPrintUf","HRExprUf","HRFieldUf","HRSortUf"}
def forms(b):
out=[]
for m in re.finditer(rb"TPF0", b):
s=m.end()
if s>=len(b): continue
n=b[s]
if not (3<=n<=40): continue
cls=b[s+1:s+1+n]
if not re.fullmatch(rb"T[A-Za-z0-9_]+", cls): continue
s2=s+1+n
if s2>=len(b): continue
n2=b[s2]
if not (1<=n2<=40): continue
nm=b[s2+1:s2+1+n2]
if not re.fullmatch(rb"[A-Za-z_][A-Za-z0-9_]*", nm): continue
out.append(nm.decode("latin1"))
return out
per={}
for p in sorted(ROOT.rglob("*")):
if not p.is_file() or THIRD.match(p.stem): continue
try: b=p.read_bytes()
except Exception: continue
if b[:2]!=b"MZ": continue
f=[x for x in forms(b) if x not in HRLIB]
if f: per[p.name]=sorted(set(f))
def kind(n):
if n.startswith("PM_"): return "인쇄"
if n.startswith(("wM_","M_")): return "모달 편집"
if n.startswith("w"): return "편집 창"
if n.startswith("frm"): return "보조 창"
return "기타"
cnt=collections.Counter(); tot=0
print("### STmate 고유 폼 — 모듈별")
for nm,f in sorted(per.items(), key=lambda x:-len(x[1])):
if not f: continue
tot+=len(f)
for x in f: cnt[kind(x)]+=1
print("\n%-24s %2d" % (nm, len(f)))
for i in range(0,len(f),4):
print(" " + " ".join("%-22s"%x for x in f[i:i+4]))
print("\n\n### 갈래별 (총 %d개)"%tot)
for k,v in cnt.most_common(): print(" %-10s %3d" % (k,v))
@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
"""PE 안의 이름 붙은 Delphi 폼(TPF0)을 뽑아 .dfm 으로 저장. 원본은 읽기만."""
import sys, io, re, pathlib
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
ROOT = pathlib.Path(r"C:\경영정보(주)\System")
OUT = pathlib.Path(r"C:\Users\umsan\AppData\Local\Temp\claude\D--aislo-wt-sub\df75230a-b05b-4088-ad34-bb0c9da0a312\scratchpad\forms")
OUT.mkdir(exist_ok=True)
want = sys.argv[1:] or ["wM_Edt_Hal","wM_JabPum","wM_Edit_San","wM_Set_Init","wM_Set_Sys","wBoq","wBoqRate"]
found = {}
for p in sorted(ROOT.rglob("*")):
if not p.is_file(): continue
try: b=p.read_bytes()
except Exception: continue
if b[:2]!=b"MZ": continue
for m in re.finditer(rb"TPF0", b):
s=m.end()
if s>=len(b): continue
n=b[s]
if not (3<=n<=40): continue
cls=b[s+1:s+1+n]
if not re.fullmatch(rb"T[A-Za-z0-9_]+", cls): continue
s2=s+1+n; n2=b[s2] if s2<len(b) else 0
if not (1<=n2<=40): continue
nm=b[s2+1:s2+1+n2]
try: nms=nm.decode("latin1")
except Exception: continue
if nms not in want or nms in found: continue
# 끝 찾기: 다음 TPF0 또는 넉넉히 자름
nxt=b.find(b"TPF0", m.end())
end = nxt if nxt>0 else min(len(b), m.start()+400000)
blob = b[m.start():end]
f = OUT/("%s.dfm"%nms)
f.write_bytes(blob)
found[nms]=(p.name, len(blob))
for k in want:
if k in found: print("%-16s %-22s %7d B" % (k, found[k][0], found[k][1]))
else: print("%-16s 못 찾음" % k)
@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
"""Start8x.Ini 설정과 SET_REP 보고서 카탈로그를 뽑는다. 원본은 읽기만."""
import sys, io, struct, pathlib, re
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
D = pathlib.Path(r"C:\경영정보(주)\STmate 자료\설계자료\실습(맛보기)")
print("### Start8x.Ini — 절별 키")
txt = (D/"Start8x.Ini").read_bytes().decode("cp949","replace")
sec="(머리)"
for line in txt.splitlines():
line=line.strip()
if not line: continue
if line.startswith("["): sec=line; print("\n"+sec); continue
print(" %s" % line[:110])
print("\n\n### 간접비 순서 코드")
for k in ("KAN_ORD_1","KAN_ORD_2"):
m=re.search(k+r"=(.*)", txt)
if m:
codes=[c for c in m.group(1).split(";") if c.strip()]
print(" %s %d개: %s" % (k, len(codes), ", ".join(codes)))
a=set(re.search(r"KAN_ORD_1=(.*)",txt).group(1).split(";"))
b=set(re.search(r"KAN_ORD_2=(.*)",txt).group(1).split(";"))
print(" 1에만: %s" % sorted(x for x in a-b if x.strip()))
print(" 2에만: %s" % sorted(x for x in b-a if x.strip()))
print("\n\n### SET_REP.DBF — 보고서 서식 카탈로그")
b2=(D/"SET_REP.DBF").read_bytes(); nrec,hlen,rlen=struct.unpack_from("<IHH",b2,4)
f=[];o=32
while b2[o]!=0x0D: f.append((b2[o:o+11].rstrip(b"\0").decode("cp949","replace"),b2[o+16]));o+=32
n=0
for i in range(nrec):
r=b2[hlen+i*rlen:hlen+(i+1)*rlen]; v=[];c=1
for nm,ln in f: v.append(r[c:c+ln].decode("cp949","replace").strip()); c+=ln
if v[1]: n+=1; print(" %-5s %-24s %s" % (v[0], v[1][:24], v[2][:30]))
print(" → 서식 %d" % n)
@@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
"""CPM 46개 모듈의 export 함수 전수 — 11번은 핵심 12개만 했음."""
import sys, io, pathlib, struct, collections, re
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
ROOT = pathlib.Path(r"C:\경영정보(주)\System")
def exports(b):
try:
e=struct.unpack_from("<I",b,0x3C)[0]
if b[e:e+4]!=b"PE\0\0": return []
nsec=struct.unpack_from("<H",b,e+6)[0]; optsz=struct.unpack_from("<H",b,e+20)[0]
opt=e+24; magic=struct.unpack_from("<H",b,opt)[0]
dd=opt+(96 if magic==0x10b else 112)
erva,esz=struct.unpack_from("<II",b,dd)
if not erva: return []
secs=[]; so=opt+optsz
for i in range(nsec):
s=b[so+i*40:so+i*40+40]
vsz,va,rsz,ptr=struct.unpack_from("<IIII",s,8); secs.append((va,vsz,ptr,rsz))
def r2o(r):
for va,vsz,ptr,rsz in secs:
if va<=r<va+max(vsz,rsz): return ptr+(r-va)
eo=r2o(erva)
if eo is None: return []
nnames=struct.unpack_from("<I",b,eo+24)[0]
namp=struct.unpack_from("<I",b,eo+32)[0]
no=r2o(namp)
out=[]
for i in range(min(nnames,4000)):
nr=struct.unpack_from("<I",b,no+4*i)[0]
o=r2o(nr)
if o is None: continue
end=b.index(b"\0",o)
out.append(b[o:end].decode("latin1"))
return out
except Exception: return []
per={}; allx=collections.Counter()
for p in sorted(ROOT.rglob("*")):
if not p.is_file() or p.suffix.upper() not in (".CPM",".EXE"): continue
try: b=p.read_bytes()
except Exception: continue
if b[:2]!=b"MZ": continue
x=exports(b)
if x: per[p.name]=sorted(x)
for n in x: allx[n]+=1
DONE={"ST_Boq.CPM","ST_EdiLWi.CPM","ST_KanJub.CPM","ST_SanCal.CPM","STmateQty8.CPM","ST_P_Joong.CPM",
"ST_P_Collect.CPM","ST_P_ConEst.CPM","ST_U_ChgAmt.CPM","ST_U_ChgCode.CPM","ST_U_ConBD.CPM","ST_U_Convert.CPM"}
print("### CPM/EXE export 전수 — 모듈 %d개, export %d개(중복포함)" % (len(per), sum(len(v) for v in per.values())))
print(" 11번이 다룬 핵심 12개 말고 **%d개 모듈**이 남아 있었음\n" % len([k for k in per if k not in DONE]))
for nm,x in sorted(per.items()):
mark = "" if nm in DONE else " "
print("%s %-22s %2d%s" % (mark, nm[:22], len(x), ", ".join(x)[:96]))
print("\n### 여러 모듈이 공유하는 export (플러그인 공통 규약)")
for n,c in allx.most_common(12): print(" %-22s %2d개 모듈" % (n,c))
@@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
"""변경 차수 저장 구조 — DBF 슬롯 4벌 vs 화면 8차의 어긋남을 가른다."""
import sys, io, re, pathlib, zipfile, struct, collections
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
ROOT = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서")
def fields(b):
f=[];o=32
while b[o]!=0x0D: f.append(b[o:o+11].rstrip(b"\0").decode("cp949","replace")); o+=32
return f
print("### ① PRJLST.SMT 의 차수 섹션")
for p in sorted(ROOT.rglob("*.STC")):
try: z=zipfile.ZipFile(p); b=z.read("PRJLST.SMT")
except Exception: continue
secs=sorted({s for s in re.findall(r"\[([0-9]+)_KANJUB\]",
"".join(ch for ch in b[0x200:].decode("cp949","replace")))}, key=int)
print(" %-46s 섹션 %s" % (p.stem[:46], secs or "없음"))
print("\n### ② DBF 의 차수 슬롯 (접미사 숫자)")
for p in list(sorted(ROOT.rglob("*.STC")))[:2]:
z=zipfile.ZipFile(p)
print("\n-- %s" % p.stem[:50])
for t in ("PRJLST.DBF","BOQ11.DBF","COSTN.DBF"):
try: f=fields(z.read(t))
except Exception: continue
sfx=collections.Counter()
for n in f:
m=re.search(r"(\d)$", n)
if m: sfx[m.group(1)]+=1
print(" %-12s 필드 %3d개 접미사별: %s" % (t, len(f), dict(sorted(sfx.items()))))
print("\n### ③ 화면·코드가 말하는 차수 상한")
SYS=pathlib.Path(r"C:\경영정보(주)\System")
pat=[rb"[1-9]\xec\xb0\xa8\xeb\xb3\x80\xea\xb2\xbd"] # UTF-8 'n차변경' — cp949 로 다시
import re as _re
need=[("%d차변경"%i).encode("cp949") for i in range(1,10)]
hit=collections.Counter()
for p in SYS.rglob("*"):
if not p.is_file(): continue
try: b=p.read_bytes()
except Exception: continue
if b[:2]!=b"MZ": continue
for i,n in enumerate(need,1):
if n in b: hit[i]+=1
print(" 'n차변경' 문자열을 가진 모듈 수: %s" % dict(sorted(hit.items())))
for tok in (b"BOQ1", b"BOQ2"):
c=sum(1 for p in SYS.rglob("*") if p.is_file() and p.suffix.upper()==".CPM" and tok in p.read_bytes())
print(" '%s' 를 가진 CPM 모듈 %d" % (tok.decode(), c))
@@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
"""화면 선택축 ↔ PRJLST.SMT 저장키 대응, 그리고 간접비 식 템플릿 전수."""
import sys, io, re, pathlib, zipfile, collections
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
PRAC = pathlib.Path(r"D:\aislo-wt\sub\resources\knowledge\original\실무문서")
SYS = pathlib.Path(r"C:\경영정보(주)\System")
# ── PRJLST.SMT 키 모으기 ─────────────────────────
keys=collections.Counter()
for p in sorted(PRAC.rglob("*.STC")):
try: b=zipfile.ZipFile(p).read("PRJLST.SMT")
except Exception: continue
txt=b[0x200:].decode("cp949","replace")
for k in re.findall(r"([0-9]?_?[A-Z][A-Z0-9_]{2,})=", txt): keys[re.sub(r"^\d_","",k)]+=1
print("### PRJLST.SMT 저장키 %d종 (접두 차수 제거)" % len(keys))
grp=collections.defaultdict(list)
for k in keys:
m=re.match(r"^([CRIBY])_(.+)$", k)
grp[m.group(1) if m else "기타"].append(k)
LBL={"C":"금액 직접입력","R":"요율","I":"선택 인덱스","B":"켬/끔","Y":"연도·기타","기타":"섹션·기타"}
for g in ("C","R","I","B","Y","기타"):
if g not in grp: continue
v=sorted(grp[g])
print("\n%s_ %s %d" % (g, LBL[g], len(v)))
for i in range(0,len(v),5): print(" " + " ".join("%-20s"%x for x in v[i:i+5]))
# ── 간접비 식 템플릿 전수 (바이너리) ─────────────
print("\n\n### 간접비 식 템플릿 — 바이너리에서 전수")
TMPL=re.compile(rb"[A-Z_\[\]0-9+\-*/(). ]*\[[A-Z_0-9]{2,12}\][A-Z_\[\]0-9+\-*/(). ]{4,80}")
found=collections.Counter()
for p in SYS.rglob("*"):
if not p.is_file() or p.suffix.upper()!=".CPM": continue
try: b=p.read_bytes()
except Exception: continue
for m in TMPL.finditer(b):
s=m.group().decode("latin1").strip()
if s.count("[")<1 or len(s)<10: continue
if not re.search(r"[*/+]", s): continue
if re.search(r"[a-z]", s): continue
found[s]+=1
print(" 서로 다른 템플릿 %d개 (상위 30)" % len(found))
for s,c in found.most_common(30): print(" %-72s %2d" % (s[:72], c))
@@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
"""SIxMemo(*.SMT) 본문 덤프 — 0x200 부터가 본문. 원본은 읽기만."""
import sys, io, re, pathlib
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
D = pathlib.Path(r"C:\경영정보(주)\STmate 자료\설계자료\실습(맛보기)")
for f in ("PRJLST.SMT","COSTN.SMT","QCODE.SMT"):
b=(D/f).read_bytes()
out=[]
for m in re.finditer(rb"[\x20-\x7e\xa1-\xfe]{3,}", b[0x200:]):
try: out.append((0x200+m.start(), m.group().decode("cp949")))
except Exception: pass
print("\n" + "="*92)
print("### %s %d B 본문 문자열 %d" % (f, len(b), len(out)))
for off,s in out: print(" 0x%05X %s" % (off, s[:86]))
@@ -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))
@@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
"""STmate 고유 폼 전수 — 캡션·선택지를 뽑아 UI 카탈로그를 만든다. 원본은 읽기만."""
import sys, io, re, pathlib, importlib.util, collections
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
spec=importlib.util.spec_from_file_location("pd", r"D:\aislo-wt\sub\resources\knowledge\original\경쟁사 프로그램\STmate 분석\40_스크립트\parse_dfm.py")
pd=importlib.util.module_from_spec(spec); spec.loader.exec_module(pd)
ROOT=pathlib.Path(r"C:\경영정보(주)\System")
THIRD=re.compile(r"^(Dclhrp60|designide60|RTL60|VCL60|DBRTL60|BDERTL60|RealGrid|Apollo|dsnide|JDLCHK)",re.I)
HRLIB={"HReportUf","HRPageRf","HRPreVUf","HRSaveUf","LoginDialog","PasswordDialog"}
def blobs(b):
out=[]; pos=[m.start() for m in re.finditer(rb"TPF0", b)]
for i,s in enumerate(pos):
e = pos[i+1] if i+1<len(pos) else len(b)
p=s+4
if p>=len(b): continue
n=b[p]
if not (3<=n<=40): continue
cls=b[p+1:p+1+n]
if not re.fullmatch(rb"T[A-Za-z0-9_]+", cls): continue
p2=p+1+n; n2=b[p2] if p2<len(b) else 0
if not (1<=n2<=40): continue
nm=b[p2+1:p2+1+n2]
if not re.fullmatch(rb"[A-Za-z_][A-Za-z0-9_]*", nm): continue
out.append((nm.decode("latin1"), b[s:e]))
return out
def walk(n, out):
if isinstance(n,dict):
pr=n.get("properties") or {}
cap=pr.get("Caption")
items=None
for k,v in pr.items():
if k.lower().endswith("items.strings") or k=="Items": items=v
if isinstance(cap,str) and any(ord(c)>127 for c in cap): out["cap"].append(cap.strip())
if isinstance(items,list) and items: out["items"].append((n.get("name",""), [str(x) for x in items]))
for c in n.get("children",[]) or []: walk(c,out)
cat={}
for p in sorted(ROOT.rglob("*")):
if not p.is_file() or THIRD.match(p.stem): continue
try: b=p.read_bytes()
except Exception: continue
if b[:2]!=b"MZ": continue
for nm, blob in blobs(b):
if nm in HRLIB or nm in cat: continue
try:
r=pd.Reader(blob); r.take(4); root=r.component(root=True)
except Exception: continue
o={"cap":[],"items":[]}; walk(root,o)
if o["cap"] or o["items"]: cat[nm]=(p.name,o)
print("### 파싱 성공한 STmate 고유 폼 %d\n" % len(cat))
tot_i=0
for nm,(mod,o) in sorted(cat.items()):
if not o["items"]: continue
tot_i+=len(o["items"])
title=o["cap"][0] if o["cap"] else ""
print("%-20s %-20s %s" % (nm[:20], mod[:20], ("«%s»"%title[:30]) if title else ""))
for cn, its in o["items"][:8]:
print(" %-18s %s" % (cn[:18], ", ".join(its)[:88]))
print("\n선택지를 가진 폼 %d개, 선택축 %d" % (sum(1 for _,(_,o) in cat.items() if o["items"]), tot_i))
@@ -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:\경영정보(주)`**원본은 손대지 않음**, 여기에만 정리물을 둠.
옆 폴더 `../오솔길 분석/` 과 같은 얼개.
@@ -45,6 +58,12 @@
| 17 | **단가조립 검증** — 일위대가·중기 시간당 사용료 구조, 손료율 실측 |
| 18 | **누락 계산로직 점검** — 노임 환산식·단가산출 Q식·설정 스냅샷 |
| 19 | **진행률 장부** — 어디까지 봤고 무엇이 남았나 |
| 20 | **설정파일과 보고서 카탈로그** — 간접비 코드 사전, 서식 75종 |
| 21 | **정정과 트랙 통합**`SMT` 정정, 지식DB 세 트랙, 암호화의 성격 |
| 22 | **UI 폼 분석** — 선택축 272개, 화면에 남아 있던 계산 규칙 |
| 23 | **`COSTN.SMT` 전수파싱** — 단가산출 원장, Q식 10꼴, 운반 사이클 |
| 24 | **모듈구조 전수** — 46개 export, 계산 공용 라이브러리 73함수, 동글 |
| 25 | **설정키 전수와 식템플릿** — 저장키 241종, 간접비 식 26개, 설정 사슬 닫힘 |
## 확정된 굵직한 것
@@ -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. 공사원가 구성 트리