knowledge(경쟁사): UI 폼 전수 분석 — 선택축 272개, 화면에 남아 있던 계산 규칙

폼 233개(고유 190개) 중 3개만 뽑아 쓰고 있었음. 전수로 훑어 폼 40개에서
선택축 272개를 뽑음. 계산설정 폼 하나에서 뽑았던 83축의 세 배가 넘음.

화면에서 새로 나온 계산 규칙
- wM_Edt_Hal: 적용단가 = 기준단가 x 율%, 소수 n 자리 미만 절사/반올림.
  「적용단가 0원인 것과 보호표시된 것은 수정 안 됨」 = T10 일괄변경 수동값
  우선순위가 화면 안내문에 있음
- wM_Rate: 단수처리가 전역이 아니라 비목(M·L·X·W)마다 절사/반올림 x 소수 0~4위
- wM_Sel_Prn: ACTTYP = 표준시장단가 적용 방식(노임외 비목 적용안함/재료비로/
  경비로), ACTOPT = 끝전 보정 우선순위. 설치폴더의 STBSC 파일명과 정확히 대응.
  봉화는 ACTYP=1 ACTOP=2 = 「노임외 재료비로 적용 + 소수 비교후 타금액 우선보정」
  ⚠ 변경 차수가 화면에서 8차까지임. COSTN 접미사 4벌과 어긋나므로 재확인 필요
- wM_Set_Sys: KCDNM·ACDNM·ZCDNM·JCDNM·ECDNM·BPNNM 이 전부 소수 자리수 설정.
  20번에서 미확정으로 둔 것이 풀림. EXRNM 은 환율 적용 범위, RX1NM~RX4NM 은
  작업조건별 노임 환산식 4벌(터널·장대터널·펌프/GRAB/버켓준설선)
- wM_KanJub_K: 기성 계산은 부가세 선택지가 설계용과 다름 (재료비+산출경비의 10% 추가)
- wM_Mrg_BSC: 반기 기준자료 갱신의 매칭 키 5단계와 덮어쓰기 정책
- wM_JabPum·wQtyList: 코드 종류 전체 목록에 「그림코드」가 따로 있음

문서 22 신규, UI 카탈로그 원자료와 스크립트 3개 추가.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA
This commit is contained in:
2026-09-13 14:10:47 +09:00
co-authored by Claude Opus 5
parent 198cd3120f
commit f0319e311e
7 changed files with 650 additions and 0 deletions
@@ -28,6 +28,7 @@
| 19 진행률 장부 | **어디까지 봤고 무엇이 남았나** — 원천별 실측 진행률, 차단점 현황 | (저장소 파일) |
| 20 설정파일과 보고서 카탈로그 | **`Start8x.Ini`·`SET_REP`** — 간접비 코드 사전 301~370, 서식 75종 | (저장소 파일) |
| 21 정정과 트랙 통합 | **`SMT` 판정 정정 · 지식DB 트랙 셋 통합 · `PRJLST.SMT` 설정 원장 · 암호화의 성격** | (저장소 파일) |
| 22 UI 폼 분석 | **폼 233개 중 3개만 봤던 것** — 선택축 272개, `ACTTYP`·자리수 키·일괄변경 규칙 | (저장소 파일) |
> **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`.
> 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다.
@@ -80,6 +81,11 @@
| 수공형식 세부경비 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 |
분석일: 2026-09-13
대상: `C:\경영정보(주)`
@@ -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,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,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))
@@ -47,6 +47,7 @@
| 19 | **진행률 장부** — 어디까지 봤고 무엇이 남았나 |
| 20 | **설정파일과 보고서 카탈로그** — 간접비 코드 사전, 서식 75종 |
| 21 | **정정과 트랙 통합**`SMT` 정정, 지식DB 세 트랙, 암호화의 성격 |
| 22 | **UI 폼 분석** — 선택축 272개, 화면에 남아 있던 계산 규칙 |
## 확정된 굵직한 것