From 540488de559305e73d174c8d888d4f1ac7170b89 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 13 Sep 2026 14:25:35 +0900 Subject: [PATCH 1/2] =?UTF-8?q?knowledge(=EA=B2=BD=EC=9F=81=EC=82=AC):=20C?= =?UTF-8?q?m=20=EC=82=AC=EC=9D=B4=ED=81=B4=EC=8B=9D=C2=B7=ED=92=88?= =?UTF-8?q?=EC=85=88=20=EC=9D=B8=EC=9E=90=C2=B7=EC=8B=9D=20=ED=8E=B8?= =?UTF-8?q?=EC=A7=91=EA=B8=B0=C2=B7=EB=82=99=EC=B0=B0=EC=9C=A8=20=E2=80=94?= =?UTF-8?q?=20=EA=B3=84=EC=95=BD/=EC=8B=A4=ED=96=89/=EA=B8=B0=EC=84=B1=20?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=20=EB=B0=9C=EA=B2=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cm(사이클 시간) 식 54꼴 - t1+t2+t3+t4 4단계가 최다. 5·6단계도 있음 - 운반은 L/V1+L/V2+0.25 — 거리/적차속도 + 거리/공차속도 + 상수. 임도 토공 운반에 그대로 쓸 수 있음 - 굴삭기는 선회각별 사이클 초 (90도 18초, 135도 20초) 품셈 인자 실측 — q(버킷용량)·K(버킷계수)·f(토량환산)·E(작업효율)·V1~V4(속도)· t1~t6(단계시간)·P=qo*eo(출력) - ⚠ f 가 1/1.3 같은 분수 문자열로 적힘. 미리 소수로 접으면 자릿수가 어긋남 wM_Edit_San 은 단순 입력이 아니라 식 편집기 - 손료계산(F6)·계산(F9)·중기공식 편집·함수 입력·연산기호·변수명 - 문법 강조·문법 오류 검사·문법설명 보기 - COSTN.SMT 전개 텍스트가 이 편집기의 산출물. 재구현하려면 식 언어와 검사기 필요 ⚠ 낙찰율 NAGCD 발견 — 계산 사슬에 없던 것 - wBoq 단가 그리드 23열의 마지막이 NAGCD(낙찰율) - wM_Edit_San 에 결과값에 낙찰율적용·계약단가·결과금액조정 - 우리가 판 8단계는 설계까지임. 계약·실행예산·기성·준공 단계가 더 있고 계산 규칙이 다를 수 있음 (기성 제잡비는 실제로 부가세 선택지가 다름) 그 밖 - 내역 계층 표기가 += ~ +===== 로 레벨을 나타냄 - Prn_* export 152개를 SET_REP 74종과 이어 64종 대응 문서 26 신규, 스크립트 3개·원자료 2개 추가. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA --- .../20_분석/00_분석_요약과_읽는법.md | 7 + .../20_분석/26_편집기와_사이클식.md | 135 ++++++++++++++++++ .../STmate 분석/30_원자료/cycle_formulas.txt | 63 ++++++++ .../STmate 분석/30_원자료/print_form_map.txt | 81 +++++++++++ .../STmate 분석/40_스크립트/big_form_parse.py | 43 ++++++ .../40_스크립트/cycle_formula_extract.py | 41 ++++++ .../STmate 분석/40_스크립트/print_form_map.py | 69 +++++++++ .../경쟁사 프로그램/STmate 분석/README.md | 1 + 8 files changed, 440 insertions(+) create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/26_편집기와_사이클식.md create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/cycle_formulas.txt create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/print_form_map.txt create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/big_form_parse.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/cycle_formula_extract.py create mode 100644 resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/print_form_map.py diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md index 537aa721..1a849b18 100644 --- a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/00_분석_요약과_읽는법.md @@ -32,6 +32,7 @@ | 23 `COSTN.SMT` 전수파싱 | **단가산출 원장** — 참조 1,570·품 1,460·Q식 187개(10꼴)·운반 사이클 | (저장소 파일) | | 24 모듈구조 전수 | **46개 모듈 export** — `DP_Common` 73함수, 플러그인 규약, 동글, 8차 해소 | (저장소 파일) | | 25 설정키 전수와 식템플릿 | **설정 사슬 닫기** — `PRJLST.SMT` 키 241종, 간접비 식 26개 | (저장소 파일) | +| 26 편집기와 사이클식 | **`Cm` 54꼴·품셈 인자·식 편집기·낙찰율** — 계약/실행/기성 단계 발견 | (저장소 파일) | > **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`. > 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다. @@ -104,6 +105,12 @@ | 추가금액 | 화면 문자열만 | **저장 구조** `ADD_AMT_단계_행_칸` | 25번 §1.3 | | 간접비 식 템플릿 | 일부 | **26개 전수** | 25번 §2 | | 식에 조건 분기 | 몰랐음 | ⚠ **`IF(...)` 존재** — 평가기 필수 요건 | 25번 §2.2 | +| `Cm` 사이클 식 | 안 봤음 | **54꼴** — 운반은 `L/V1+L/V2+상수`, 선회각별 초 | 26번 §1 | +| 품셈 인자 | 이름만 | **관측값** — `f`가 `1/1.3` 분수 문자열로 적힘 | 26번 §2 | +| 단가산출 편집 | 입력 화면 | **식 편집기** — 문법검사·손료계산 내장 | 26번 §3 | +| **낙찰율 `NAGCD`** | **몰랐음** | ⚠ **단가 그리드에 낙찰율 열.** 계약·실행·기성 단계 미분석 | 26번 §4·§8 | +| 계층 표기 | `T*`/`E*` | **`+=` ~ `+=====` 가 레벨** | 26번 §5 | +| `PM_*` ↔ `SET_REP` | 없음 | **64/74 대응** | 26번 §6 | 분석일: 2026-09-13 대상: `C:\경영정보(주)` diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/26_편집기와_사이클식.md b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/26_편집기와_사이클식.md new file mode 100644 index 00000000..f47e4745 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/26_편집기와_사이클식.md @@ -0,0 +1,135 @@ +# 편집 화면과 사이클 식 — 마지막 UI 층 + +점검일: 2026-09-13 +재현 스크립트: `40_스크립트/cycle_formula_extract.py` · `big_form_parse.py` · `print_form_map.py` + +## 1. ⭐ `Cm`(사이클 시간) 식 — 54가지 꼴 + +23번 §3이 `Q`식 10꼴을 찾았다. **그 분모인 `Cm`이 더 다양하다.** + +| 꼴 | 횟수 | 쓰임 | +|---|---:|---| +| `t1+t2+t3+t4` | 37 | **4단계 사이클** — 적재·왕복·적하·대기 | +| `t1+t2+t3+t4+t5` | 17 | 5단계 | +| `t1+t2+t3+t4+t5+t6` | 8 | 6단계 | +| **`L/V1+L/V2+0.25`** | 19 | **운반 — 거리/적차속도 + 거리/공차속도 + 0.25** | +| `L/40+L/43+0.25` | 2 | 같은 꼴에 속도를 직접 씀 | +| `18'sec(90˚)'` · `20'sec(135˚)'` | 다수 | **굴삭기 선회각별 사이클 초** | +| `2*20÷42` · `23.75+10` | 4 | 개별 산정 | + +⇒ **운반 계산이 `거리 ÷ 적차속도 + 거리 ÷ 공차속도 + 상수`** 꼴이다. 임도 토공 운반에 그대로 쓸 수 있다. +선회각(`90˚`/`135˚`)이 사이클 초를 바꾼다 — `18초`(90°) vs `20초`(135°). + +## 2. 품셈 인자 실측 + +`COSTN.SMT` 본문 8,096줄에서 인자 정의를 모았다. + +| 인자 | 뜻 | 관측값 | +|---|---|---| +| `q` | 버킷용량(㎥) | **0.7**(75) · 0.4 · 0.2 | +| `K`·`k` | 버킷계수 | 0.7 · **0.55** · 0.9 | +| `f` | 토량환산계수 | **분수 그대로** — `1/1.3` · `1/1.15` · `1/1.125` · `1/1.175` · `0.9/1.25` · `1.15/1.4` | +| `E` | 작업효율 | 0.9 · 0.6 · 0.45 · 0.35 | +| `V1`~`V4` | 주행속도(km/h) | 30 · 35 · 10 · 15 | +| `t1`~`t6` | 사이클 단계 시간 | 0.7 · 1.1 … | +| `P` | 출력 | **`qo*eo`** (기본출력 × 효율) — `qo`=3.2, `eo`=0.92 | +| `S` | — | 0.006 | + +⚠ **`f`가 `1/1.3` 같은 분수 문자열로 적힌다.** 18번 §2.1의 「좌→우 순차 평가」가 여기서도 필요하다 — 미리 소수로 접으면 자릿수가 어긋난다. + +## 3. `wM_Edit_San` — 단가산출은 **식 편집기**다 + +625 컴포넌트, 기능 캡션 173개. 단순 입력 화면이 아니다. + +```text +손료계산(F6) 중기 손료 계산기 내장 +계산(F9) · 계산결과(Alt+F9) +중기공식 편집 사용자문자 편집 +[함수 입력] · 연산기호 · 변수명 +입력/설정/문법오류 · 문법 강조기능 · 문법설명 보기 ← 식 문법 검사기 +금액변수 초기화 · 금액변수, 제외금액초기화 +특수코드(잡재료비...) +【결과적용 비목 ː 결과값에 낙찰율적용 · 결과금액조정 · 계약단가 +단가가 0원인 비목은 입력안함 +목록표 호출 → 노무비·재료비·경비·일위대가표·중기사용료·단가산출근거·일식/견적·그림코드 +``` + +⇒ **사용자가 식을 직접 쓰고 프로그램이 문법을 검사한다.** `COSTN.SMT`의 전개 텍스트(23번)가 바로 이 편집기의 산출물이다. 재구현하려면 **식 언어와 검사기**가 필요하다. + +## 4. ⚠ `낙찰율`(`NAGCD`) — 계산 사슬에 없던 것 + +`wBoq`의 단가 그리드 **23열 중 마지막이 `NAGCD`(낙찰율)**이고, `wM_Edit_San`에도 `결과값에 낙찰율적용`·`계약단가`가 있다. + +```text +RGrdCostB / CostD / CostX / CostM / CostL (코드 종류별 5벌) + 코드 · 명칭 · 규격 · 단위 + TAMT1·LAMT1·MAMT1·SAMT1 ← 차수 1 + … TAMT4·LAMT4·MAMT4·SAMT4 ← 차수 4 + BQCODE · EQCODE + NAGCD ← 낙찰율 +``` + +⇒ **낙찰율이 단가 수준에 붙는다.** 설계 → 계약 단계에서 낙찰율을 먹여 **계약단가**를 만드는 경로가 있다. `SET_REP`의 `계약,실행내역서`·`실행예산서Ⅰ/Ⅱ`(20번 §3)와 이어진다. + +`PRJLST.SMT`의 `I_NAG_RATE`·`Y_KONGSU`, `Start8x.Ini`의 `[NAG_HAL]`(20번 §2.6)도 같은 갈래다. + +**우리 계산 사슬 8단계(19번 §4)는 「설계」까지다.** 계약·실행·기성 단계는 아직 안 다뤘다. + +## 5. `wBoq` — 내역 편집 화면 + +935 컴포넌트, 기능 캡션 267개. 계산에 닿는 것만 추리면 이렇다. + +```text +일괄할증 할증 일괄 적용 +제외금액 표시 C* 구역 (16번 §4.2) +계표시(레벨) 1단계 상향/하향 계층 레벨 조작 +T. 주석문 → 계시작(+=~+=====)으로 변환 계층 표기와 주석의 변환 +수량산출서에서 내역수량 및 공종 가져오기 +일위대가표 풀어넣기 호표를 내역 행으로 전개 +실행예산서 작업 / 실행예산작업=> +내역보관함 (1)(2)(3) 작업 중 임시 보관 3벌 +단가 불러오기 — 일위대가·단가산출·건설기계·자재·노임·경비·견적·실적 +``` + +⇒ **`계시작(+=~+=====)` 표기가 `BOQ11`의 `T*`/`E*` 계층(16번 §4.1)과 이어진다.** `=` 개수가 레벨이다 — `wM_KanJub_K`의 `rd_Filter`(22번 §3.5)와 같은 표기. + +## 6. `PM_*` 인쇄 폼 ↔ `SET_REP` 75종 + +`Prn_*` export **152개**를 모아 `SET_REP` 74종과 이름으로 이었다 — **64종이 이어졌다.** + +이어지지 않은 10종은 계획·조서 계열이다. + +```text +장비투입계획 · 인력투입계획 · 자재사용계획 +실행예산서Ⅰ · Ⅱ +간이공사비 산출명세서 +기성검사조서(을/병) · 준공조서(을/병) +``` + +⇒ 이들은 **`Prn_` 접두가 아닌 다른 경로**(`Rep_Print`·`GS_Prn_Rec`, 24번 §5)로 출력되거나, 우리 설치본에 해당 모듈이 없다. + +한 서식이 여러 `Prn_*`에 대응하는 것은 **양식 변형**(횡/종·`_L`·`_EXL`) 때문이다 — `_L`은 가로, `_EXL`은 엑셀판(24번 §3). + +## 7. 이번 점검이 바꾸는 것 + +| 항목 | 이전 | 지금 | +|---|---|---| +| `Cm` 사이클 식 | 안 봤음 | ✅ **54꼴** — 운반은 `L/V1+L/V2+상수` | +| 품셈 인자 | Q식 인자 이름만 | ✅ **관측값** — `q`·`K`·`f`(분수)·`E`·`V`·`t`·`P=qo*eo` | +| 단가산출 편집 | 입력 화면으로 봄 | ✅ **식 편집기** — 문법검사·손료계산·함수입력 | +| **낙찰율 `NAGCD`** | **몰랐음** | ⚠ **단가 수준에 낙찰율 열이 있음.** 계약·실행 단계 미분석 | +| 내역 계층 표기 | `T*`/`E*` 만 | ✅ **`+=` ~ `+=====` 가 레벨** | +| `PM_*` ↔ `SET_REP` | 없음 | ✅ **64/74 대응** | + +## 8. 남은 것 — 계약·실행·기성 단계 + +우리가 판 것은 **설계 단계**다. 프로그램에는 그 뒤가 더 있다. + +| 단계 | 흔적 | +|---|---| +| **계약** | `NAGCD` 낙찰율 · `계약단가` · `계약,실행내역서`(0623) · `당초설계 → 계약내역 변환등록`(`wM_Mk_Cont`) | +| **실행예산** | `실행예산서Ⅰ/Ⅱ`(0673·0674) · `wBoq`의 `실행예산서 작업` | +| **기성** | `기성부분총괄내역서`(0632)~`기성부분수량조서`(0638) · `wM_KanJub_K`(기성 제잡비) · `Prn_Jab_K` | +| **준공** | `준공조서(을/병)`(0646·0647) | + +⚠ 이 넷은 **계산 규칙이 설계와 다를 수 있다** — 실제로 기성 제잡비는 부가세 선택지가 다르다(22번 §3.5). 다음 판의 대상이다. diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/cycle_formulas.txt b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/cycle_formulas.txt new file mode 100644 index 00000000..bf2e8a7f --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/cycle_formulas.txt @@ -0,0 +1,63 @@ +### Cm(사이클 시간) 식 — 서로 다른 꼴 54개 / 본문 8096줄 + 'm3/hr' 239 + 'm2/hr' 38 + t1+t2+t3+t4 37 + '㎥/hr' 22 + L/V1+L/V2+0.25 19 + t1+t2+t3+t4+t5 17 + 20'sec(135˚)',E 17 + 20'sec(135)' 16 + 18'sec(135˚)',E 15 + 18'sec(90)' 14 + 18'sec(90˚)',E 12 + '㎥/Hr' 11 + t1+t2+t3+t4+t5+t6 8 + '회/hr' 8 + 18'sec(90˚)' 7 + t1+t2+t3+t4+t5' 7 + 20'(135°)' 5 + 'ton/hr' 5 + '톤/hr' 5 + 18'sec(90˚)',E1 4 + '대/hr' 4 + 2*20÷42 4 + 23.75+10 4 + 20'sec(135˚)' 3 + t1+t2+t3+t4' 3 + L/40+L/43+0.25 2 + +### 인자 정의 (상위 34) + q = 0.7 75회 + E = 0.9 37회 + Cm = t1+t2+t3+t4= 23회 + k = 0.7 22회 + k = 0.55 21회 + V2 = 35 19회 + K = 0.55 18회 + f = 1 18회 + K = 0.9 18회 + k = 0.9 18회 + P = qo*eo= 18회 + V3 = 10 18회 + V4 = 15 18회 + t4 = 0.7 15회 + K = 0.7 14회 + f = 1/1.3= 14회 + f = 1.0 13회 + qo = 3.2 12회 + f = 1/1.15= 12회 + E = 0.6 11회 + q = 0.4 11회 + f = 0.9/1.25= 11회 + E = 0.45 11회 + t3 = 1.1 11회 + Cm = t1+t2+t3+t4+t5= 10회 + E = 0.35 10회 + f = 1/1.125= 10회 + f = 1.15/1.4= 10회 + eo = 0.92 10회 + V1 = 30 9회 + f = 1/1.175= 8회 + S = 0.006 8회 + q = 0.2 8회 + V1 = 35 8회 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/print_form_map.txt b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/print_form_map.txt new file mode 100644 index 00000000..222f6e90 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/print_form_map.txt @@ -0,0 +1,81 @@ +### SET_REP 서식 74종 ↔ Prn_* export 152개 + +INDX 서식명 제목 대응 export(추정) +0101 재료비목록표 재료비 목록표 Prn_SanMok, Prn_SanMok_EXL, Prn_SanMok_L +0102 노무비목록표 노무비 목록표 Prn_SanMok, Prn_SanMok_EXL, Prn_SanMok_L +0103 경비목록표 경비 목록표 Prn_SanMok, Prn_SanMok_EXL, Prn_SanMok_L +0104 W코드목록표 일식/견적 목록표 Prn_SanMok, Prn_SanMok_EXL, Prn_SanMok_L +0105 자재단가대비표 자재단가 대비표 Edit_Dan, Prn_Col_Dan, Prn_Col_Dan_EXL +0201 환율및기초자료 환율및 기초자료 +0202 중기목록표 중기 목록표 Prn_Joong, Prn_Joong2, Prn_Joong2_L +0203 시간당중기사용료 중 기 사 용 료 Prn_Joong, Prn_Joong2, Prn_Joong2_L +0301 일위대가목록표 일위대가 목록표 Prn_SanMok, Prn_SanMok_EXL, Prn_SanMok_L +0302 일위대가표 일 위 대 가 표 Prn_iLWi, Prn_iLWi_EXL, Prn_iLWi_S +0303 일위대가표(수공양식) 일 위 대 가 표 Prn_iLWi, Prn_iLWi_EXL, Prn_iLWi_S +0401 단가산출근거목록표 단가산출근거 목록표 Calq_San, Edit_SanKun, Prn_SanMok +0402 단가산출근거 단 가 산 출 근 거 Calq_San, Edit_SanKun, Prn_SanMok +0501 재료비수량집계표 재료비 수량,금액 집계표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0502 노무비수량집계표 노무비 수량,금액 집계표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0503 경비수량집계표 경 비 수량,금액 집계표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0504 W코드수량집계표 일식/견적 수량,금액 집계표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0505 중기시간집계표 중기 시간,금액 집계표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0601 총괄내역서 총 괄 설 계 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0602 총괄내역서(종양식) 총 괄 설 계 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0603 내역서 설 계 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0604 내역서(종양식) 설 계 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0605 분할내역서(횡양식) 분 할 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0606 내역서(도공양식) 설 계 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0607 사,관급내역서 관 급 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0613 견적내역서 견 적 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0614 견적내역서(종양식) 견 적 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0615 견적단가대비표 견 적 단 가 대 비 표 +0623 계약,실행내역서 계 약 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0624 계약,실행내역서(종양식) 계 약 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0632 기성부분총괄내역서 기성부분 총괄내역서 Prn_Jab, Prn_Jab_EXL, Prn_Jab_K +0633 기성내역서 기 성 내 역 서 Prn_Jab, Prn_Jab_EXL, Prn_Jab_K +0634 기성내역서(사정) 기 성 내 역 서 Prn_Jab, Prn_Jab_EXL, Prn_Jab_K +0635 기성내역서(기성율) 기 성 내 역 서 Prn_Jab, Prn_Jab_EXL, Prn_Jab_K +0636 기성검사조서(을) 기성부분 감독/검사 조서(을) Prn_Jab, Prn_Jab_EXL, Prn_Jab_K +0637 기성검사조서(병) 기성부분 감독/검사 조서(병) Prn_Jab, Prn_Jab_EXL, Prn_Jab_K +0638 기성부분수량조서 기 성 부 분 수 량 조 서 Prn_Jab, Prn_Jab_EXL, Prn_Jab_K +0643 변경내역서 설 계 변 경 내 역 서 CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0644 변경내역서(종양식) 설 계 변 경 내 역 서 CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0645 설계변경내역서(변경율) 설 계 변 경 내 역 서 CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0646 준공조서(을) 준공 감독/검사조서(을) +0647 준공조서(병) 준공 감독/검사조서(병) +0648 설계변경증감대비표 설 계 변 경 증 감 대 비 표 CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0206 실적단가목록표 실적공사비 단가목록표 Prn_SanMok, Prn_SanMok_EXL, Prn_SanMok_L +0608 공사원가계산서 공 사 원 가 계 산 서 Prn_Won_A, Prn_Won_A_C, Prn_Won_A_EXL +0609 총괄집계표 총 괄 집 계 표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0651 총괄내역서(구.시도) 총 괄 내 역 서 (구.시도) Prn_Nae, Prn_NaeW, Prn_NaeW_P +0652 총괄내역서(시도) 총 괄 내 역 서 (시도) Prn_Nae, Prn_NaeW, Prn_NaeW_P +0653 총괄내역서(구도) 총 괄 내 역 서 (구도) Prn_Nae, Prn_NaeW, Prn_NaeW_P +0654 설계내역서(굴착) 설 계 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0655 설계내역서(구.시도) 설 계 내 역 서 (구.시도) Prn_Nae, Prn_NaeW, Prn_NaeW_P +0656 설계내역서(시도) 설 계 내 역 서 (시도) Prn_Nae, Prn_NaeW, Prn_NaeW_P +0661 변경총괄내역서(구.시도) 변 경 총 괄 내 역 서 (구.시도) CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0662 변경총괄내역서(시도) 변 경 총 괄 내 역 서 (시도) CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0663 변경총괄내역서(구도) 변 경 총 괄 내 역 서 (구도) CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0664 변경내역서(굴착) 변 경 내 역 서 CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0665 변경내역서(구.시도) 변 경 내 역 서 (구.시도) CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0666 변경내역서(시도) 변 경 내 역 서 (시도) CHANGE_AMT, CHANGE_STR, CHANGE_STR_LO +0671 장비투입계획 장 비 투 입 계 획 +0672 총괄내역서(비교) 총 괄 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0673 실행예산서Ⅰ 실 행 예 산 서 +0674 실행예산서Ⅱ 실 행 예 산 서 +0675 재료비집계표 재 료 비 집 계 표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0676 노무비집계표 노 무 비 집 계 표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0677 중장비집계표 중 장 비 집 계 표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0678 자재사용계획 자 재 사 용 계 획 +0679 인력투입계획 인 력 투 입 계 획 +0693 내역서 설 계 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0694 내역서(종양식) 설 계 내 역 서 Prn_Nae, Prn_NaeW, Prn_NaeW_P +0695 간이명세서 간이공사비 산출명세서 +0106 포준시장목록표 표준시장/시장시공 목록표 Prn_SanMok, Prn_SanMok_EXL, Prn_SanMok_L +0506 일위대가수량집계표 일위대가 수량,금액 집계표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L +0507 단가산출근거수량집계표 단가산출근거 수량,금액 집계표 Calq_San, Edit_SanKun, Prn_Col_Dan +0508 표준시장집계표 표준시장/시장시공 수량,금액 집계표 Prn_Col_Dan, Prn_Col_Dan_EXL, Prn_Col_Dan_L + +이름으로 이어진 것 64 / 74 + +Prn_* export 이름 전수 152개 diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/big_form_parse.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/big_form_parse.py new file mode 100644 index 00000000..ffaa3047 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/big_form_parse.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +"""큰 편집 폼 깊이 파싱 + PM_* 인쇄폼 ↔ SET_REP 서식 대응.""" +import sys, io, re, pathlib, struct, 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) +F=pathlib.Path(r"C:\Users\umsan\AppData\Local\Temp\claude\D--aislo-wt-sub\df75230a-b05b-4088-ad34-bb0c9da0a312\scratchpad\forms") + +def walk(n, out, d=0): + if isinstance(n,dict): + pr=n.get("properties") or {} + out.append((d, n.get("class",""), n.get("name",""), pr)) + for c in n.get("children",[]) or []: walk(c,out,d+1) + return out + +for f in ("wBoq","wM_Edit_San"): + p=F/(f+".dfm") + if not p.exists(): print("없음 %s"%f); continue + try: + r=pd.Reader(p.read_bytes()); r.take(4); root=r.component(root=True) + except Exception as e: print("%s 파싱 실패 %s"%(f,e)); continue + ns=walk(root,[]) + print("\n" + "="*96) + print("### %s 컴포넌트 %d개" % (f, len(ns))) + # 그리드 열 제목 + for d,cls,nm,pr in ns: + cols=pr.get("Columns") + if isinstance(cols,list) and cols: + tt=[ (c.get("Title.Caption") or "").replace("\r"," / ").strip() for c in cols ] + fl=[ (c.get("FieldName") or "") for c in cols ] + print("\n ▣ 그리드 %s 열 %d개" % (nm, len(cols))) + for t,fn in zip(tt,fl): + if t or fn: print(" %-26s ← %s" % (t[:26], fn)) + # 액션·버튼 캡션 + caps=[str(pr.get("Caption")) for d,cls,nm,pr in ns + if isinstance(pr.get("Caption"),str) and any(ord(c)>127 for c in pr["Caption"])] + uniq=[] + for c in caps: + c=c.strip() + if c and c not in uniq: uniq.append(c) + print("\n 기능 캡션 %d개" % len(uniq)) + for i in range(0,min(len(uniq),60),3): + print(" " + " ".join("%-28s"%x[:28] for x in uniq[i:i+3])) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/cycle_formula_extract.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/cycle_formula_extract.py new file mode 100644 index 00000000..3ed6c9c4 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/cycle_formula_extract.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +"""COSTN.SMT 의 Cm(사이클) 식과 인자 정의를 꼴별로 모은다.""" +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\실무문서") +SRC = [pathlib.Path(r"C:\경영정보(주)\STmate 자료\설계자료\실습(맛보기)\COSTN.SMT")] + sorted(PRAC.rglob("*.STC")) + +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 + +RE_CM = re.compile(r"\bCm\d?\s*=\s*([^=\n]{4,90})") +RE_DEF = re.compile(r"\b([A-Za-z]\w{0,3})\s*[:=]\s*([^,\n]{1,40})") +cm=collections.Counter(); defs=collections.Counter(); 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 + for ln in body(b): + lines+=1 + for m in RE_CM.findall(ln): + t=re.sub(r"\s+","",m).rstrip("=") + if len(t)>3: cm[t[:70]]+=1 + if "'" not in ln and re.match(r"^\s*[A-Za-z]\w{0,3}\s*[:=]", ln): + for k,v in RE_DEF.findall(ln): + vv=re.sub(r"\s+","",v) + if len(k)<=4 and vv: defs[(k,vv[:24])]+=1 + +print("### Cm(사이클 시간) 식 — 서로 다른 꼴 %d개 / 본문 %d줄" % (len(cm), lines)) +for s,c in cm.most_common(26): print(" %-70s %3d" % (s, c)) +print("\n### 인자 정의 (상위 34)") +for (k,v),c in defs.most_common(34): print(" %-5s = %-26s %3d회" % (k, v, c)) diff --git a/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/print_form_map.py b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/print_form_map.py new file mode 100644 index 00000000..b1855026 --- /dev/null +++ b/resources/knowledge/original/경쟁사 프로그램/STmate 분석/40_스크립트/print_form_map.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +"""PM_* 인쇄 폼·export ↔ SET_REP 서식 75종 대응.""" +import sys, io, re, pathlib, struct, collections +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") +SYS=pathlib.Path(r"C:\경영정보(주)\System") +D=pathlib.Path(r"C:\경영정보(주)\STmate 자료\설계자료\실습(맛보기)") + +# SET_REP 75종 +b=(D/"SET_REP.DBF").read_bytes(); nrec,hlen,rlen=struct.unpack_from(" Date: Sun, 13 Sep 2026 14:25:50 +0900 Subject: [PATCH 2/2] =?UTF-8?q?knowledge(=EC=B6=95C):=20=EB=91=90=20?= =?UTF-8?q?=EC=B6=95=EA=B3=BC=20=EC=9D=BC=EC=9C=84=EB=8C=80=EA=B0=80=20?= =?UTF-8?q?=EA=B3=84=EC=95=BD=20=EB=AA=85=EC=84=B8=20=E2=80=94=20=EC=9E=90?= =?UTF-8?q?=EC=9B=90=EC=B6=95=20=EC=8B=A4=EC=B8=A1=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_0154EMdwPYNPuKc9eZv8SLEX --- docs/raw/verification/2026-09-13_축C_명세.md | 223 +++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 docs/raw/verification/2026-09-13_축C_명세.md diff --git a/docs/raw/verification/2026-09-13_축C_명세.md b/docs/raw/verification/2026-09-13_축C_명세.md new file mode 100644 index 00000000..16344740 --- /dev/null +++ b/docs/raw/verification/2026-09-13_축C_명세.md @@ -0,0 +1,223 @@ +# 축 C 명세 — 두 축과 그것을 잇는 표 + +작성 2026-09-13 · **브레인(데스크탑 메인)** · 코드 창 둘이 따를 계약 + +> **왜 이 문서가 있나** — 랩탑 메인(1장 축)과 랩탑 서브(3장 구조물도)가 **서로 안 만나면서도 +> 나중에 맞물리게** 하려면 계약이 먼저 있어야 함. `PLAN.md` 는 「무엇을 할 것인가」이고 +> 이 문서는 「그것이 어떤 모양이어야 하는가」임. + +--- + +## 0. 한 줄 요약 + +**공종 축**(수량이 붙는 자리)과 **자원 축**(돈이 붙는 자리)을 따로 두고, +**일위대가가 둘을 잇는 표**로 선다. + +``` +공종 축 FP-09-03-01 돌쌓기(찰) ← B08 이 수량을 붙임 + │ + └── 일위대가 = 잇는 표 ← 라이브러리가 저장하는 것 + ├─ 자원 M-야면석 0.88 ton/㎡ + ├─ 자원 L-조경공 0.21 인 + └─ 자원 L-보통인부 0.15 인 + ← B09 가 돈을 붙임 +``` + +--- + +## 1. ⚠ 실측 — 지금 무엇이 서 있나 (2026-09-13 브레인 확인) + +**「자원 축 뒤 패스를 만든다」는 틀린 말임. 이미 있고 이미 돌았음.** + +| 무엇 | 자리 | 상태 | +| --- | --- | --- | +| 공종 축 마스터 | `resources/data_work_item_master/work_item_master_2026-01-01.json` | ✅ 섬 | +| 자원 축 산출물 | `resources/data_cost_resource_axis/resource_axis_2026-01-01.json` | ✅ **418줄** | +| 못 맞춘 목록 | `resources/data_cost_resource_axis/unmatched_2026-01-01.json` | ⚠ **497줄** | +| 뒤 패스 코드 | `B09_Estimation/B09_Estimation_ResourceAxis*.py` (6파일) | ✅ 섬 | + +**`stats` 실측** + +``` +rows 418 · unmatched 497 +skipped_forms : coefficient 19 · reference 64 · undetermined 75 +policy : axis=resource_only · work_item_axis_owner=B08 + material_amounts_are_before_surcharge=true +``` + +**⇒ 남은 일은 「만들기」가 아니라 「채우기」임.** + +못 맞춘 497줄의 주된 사유는 파일 안에 그대로 적혀 있음 — +**「카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)」.** +즉 막힌 것은 **단가가 아니라 이름·코드 목록조차 없는 것**임. +(예: `보통휘발유 (주연료)` · `체인오일 (일반오일)` — 이름은 품셈에 있는데 받을 코드가 없음) + +--- + +## 2. 공종 축 + +### 코드 모양 — 이미 도는 규약을 그대로 씀 + +``` +FP-<절>-<절>-<절> 예) FP-04-02-02 (벌목, 5m 미만) +``` + +- 정본은 **품셈 절 번호**. 표의 행은 그 절의 **조건별 변형**(`variant` 칸)임 +- **이름은 표시용, 잇기는 코드로.** 이름으로 맞추는 코드가 남아 있으면 그것이 곧 결함임 +- 부모·잎이 있음 — `FP-09-15` 는 부모이고 잎이 답구간·답외구간임. + **부모 코드에 수량을 붙이지 말 것** + +### 자체 확장 코드 — 접두를 갈라 둘 것 + +품셈에 없는 공종의 자리. **품셈 코드와 한 눈에 갈려야** 함. + +``` +AX-<갈래>-<번호> + AX-ST-* 구조물 일위대가 (라이브러리가 낳는 것) + AX-GS-* 관급자재 + AX-ET-* 품셈에 없는 공종 (첫 사례: 지장목제거) +``` + +⚠ **접두를 정하는 것은 랩탑 메인 몫이나, 정하면 이 문서에 적고 브레인에게 알릴 것.** +두 창이 다른 접두를 쓰면 나중에 통째로 뜯어야 함. + +--- + +## 3. 자원 축 + +### 한 줄의 모양 — 실물 그대로 (고치지 말 것) + +```json +{ + "work_item_code": "FP-04-02-02", + "resource_kind": "labor", + "resource_code": "1037", + "resource_name": "벌목부", + "resource_spec": "", + "amount": "2.14", + "amount_unit": "", + "variant": "5m 미만", + "pum_form": "requirement", + "pum_table_id": "F0087", + "raw_row_index": 1 +} +``` + +### 지켜야 할 것 다섯 — 이미 코드 머리에 적혀 있음 + +1. **`pum_form` 을 먼저 볼 것.** `productivity` = **1 ÷ 값** · `requirement` = **값 ÷ 밑수**. + ⚠ **뒤집으면 20배 틀림** +2. `coefficient`·`reference` 는 **공종이 아님** — 일위대가 항목으로 세우지 말 것. + `undetermined` 는 **값을 쓰지 말 것** +3. **규격(`resource_spec`)이 없으면 매칭 성공이 아님.** 「굴착기」와 「굴착기 0.7㎥」는 단가가 다름 +4. 못 맞춘 것은 **빈칸이 아니라 `unmatched` 목록**으로 +5. **자재는 할증 전 값.** 할증은 자재총괄 한 곳뿐 + +### 자원 종류와 단가 층은 **다른 것** + +헷갈리면 값이 두 배가 되거나 사라짐. + +| 축 | 값 | 무엇인가 | +| --- | --- | --- | +| **자원 종류** (`resource_kind`) | `labor` · `material` · `machine` | 품셈 줄이 무엇을 부르나 | +| **단가 층** (`PriceKind`) | `M·L·S·X·B·D·W` | 단가가 어느 겹에 사나 | + +단가 층 넷의 차례 (STC `COSTN` 186행 실측) — +`S 중기취득가(천원) → X 시간당 중기사용료 → B 일위대가 → D 단가산출`, +`L 노임`·`M 자재`는 카탈로그 층(상세 없이 값이 바로 있음). + +--- + +## 4. 일위대가 — 잇는 표 + +- **한 줄** = 공종 코드 하나 + 그에 딸린 자원 줄 여럿 +- 금액은 **어느 층이든 재료·노무·경비 3분할**이고 `합계 = 재료 + 노무 + 경비` +- **재귀** — 구조물 일위대가(`AX-ST-*`)가 다른 공종의 하위 일위대가로 들어감. + ⚠ 순환 참조 막이 필요 · 깊이 한도는 **사용자 답 대기** + +--- + +## 5. 별칭표 + +**한 파일에만 둘 것.** 지금 `B08_Quantity_Engine_Handoff_Mapping.py` 등 여러 곳에 흩어져 있음. + +``` +우리 이름 → 코드 ← 남의 이름 +리핑암 → FP-… ← 파쇄암 (실재 · 코드에 주석으로 있음) +노면다짐 → FP-… ← 노면고르기 (답 대기) +``` + +- 방향은 **양쪽 다** — 우리 이름으로도, 실무·품셈 이름으로도 코드를 찾을 수 있어야 함 +- **한 이름이 두 코드에 걸리면 오류로 세울 것.** 조용히 첫째를 고르면 안 됨 + +--- + +## 6. 이중계상 경계 — 축으로 판정 + +지금은 **주석 경고뿐**임. 코드가 잡게 세울 것. + +| 규칙 | 판정 자리 | +| --- | --- | +| 구조물 터파기·되메우기는 **토공집계로만** | 공종 축 — 같은 물량이 두 공종 코드에 붙으면 오류 | +| 콘크리트 배합 성분(시멘트·모래·자갈)은 **일위대가만 쪼갬** | 자원 축 — 자재총괄에 배합 성분이 뜨면 오류 | +| 자재 할증은 **자재총괄 한 곳** | `material_amounts_are_before_surcharge=true` 정책 이미 있음 | + +원문 규칙은 `docs/raw/plans/2026-09-13b_plan_구컨셉_전문_재편전.md` 8-7절. +**세우기 전에 반드시 대조할 것.** + +--- + +## 7. 반올림 — 자리마다 다름 (STmate 실증, 17·18번) + +⚠ **한 가지로 통일하면 틀림.** 자리마다 다른 것이 실측 결과임. + +| 자리 | 규칙 | 근거 | +| --- | --- | --- | +| **호표 안 성분 소계** | **절사** | 중기사용료 398건 100% · 일위대가 345건 94.2% | +| **집계표 행 금액** | `ROUND` | 자원·일위대가·중기 집계표 | +| **내역에 실릴 때** | 정수 절사 | 착공내역서 178건 100% | +| **단가산출 성분단가** | 소수 1자리 절사 | 211건 중 137건 설명 | +| 내부 계산 | 은행가(최근접-짝수) | STmate 내부. ⚠ 뽑은 엑셀은 사사오입이라 20개 경계 중 10개가 갈림 | + +**식을 접지 말 것 둘** + +- **노임 시간당 환산** — 식 문자열을 **좌→우 순차 평가**. + 계수로 미리 곱하면 `267,360 × 0.20833… = 55,699.99…` → **55,699** 로 1원 틀림. + 좌→우는 모든 단계가 정수라 **55,700**. 18건 중 계수 선계산은 14/18 만 맞음 +- **단가산출 Q 식** — `Q = 3600 × q × K × f × E / Cm`. + ⚠ **Q 를 소수 2자리로 먼저 확정한 뒤 나눌 것**(`55,700/15.708 = 3,545.96` ≠ `55,700/15.71 = 3,545.5`) + +**중기 시간당 사용료 조립** — 손료(경비) · 운전원(노무) · 주연료(재료) · 잡품(재료). +⚠ **잡품은 수량 × 단가가 아니라 연료비 × 비율의 가산 행**임. + +--- + +## 8. 검산 계약 — 무엇이 「끝났다」인가 + +**STmate 골든셋 재현이 초록이면 끝.** + +- 기준점 — 실무 6건 · 내역 1,515행을 **원 단위로 재현한 실증본** + (`…/STmate 분석/20_분석/16_골든셋_회귀_결과.md`) +- 시험 자리 — `resources/tester/` (git 추적 대상) +- **시험 코드는 코드 창이 짜고 판정은 브레인이 함** + +⚠ 골든셋은 **계산 엔진**을 재는 것이지 **기준자료**를 재는 것이 아님. +기초단가 원천(자재 57,580 · 노임 460 · 중기 833 · 표준시장단가 4,921건)은 전부 암호화라 +영영 못 가져옴 — 그 자리는 **사용자 수동입력 + 빨간 테두리**로 둠. + +--- + +## 9. 아직 안 정한 것 + +- 자체 확장 코드 **접두** — 랩탑 메인이 정해 이 문서에 적을 것 +- 일위대가 **재귀 깊이 한도** — 사용자 답 대기 +- **옆도랑파기 갈래 수**(우리 둘 ↔ 실무 셋) · **노면고르기 ↔ 노면다짐** — 사용자 답 대기 +- **`undetermined` 75표** 판정 — 사람이 봐야 함. 값을 쓰면 뒤집힌 채 들어감 +- **기계·자재 카탈로그 확보** — 못 맞춘 497줄의 주된 사유. 단가보다 먼저 **이름·코드 목록**이 필요함 + +--- + +## 10. 고칠 때 + +이 문서는 **브레인이 관리함.** 코드 창이 계약을 바꿔야 하면 **고치지 말고 브레인에게 알릴 것** — +두 창이 각자 고치면 계약이 두 벌이 됨.