knowledge(경쟁사): Cm 사이클식·품셈 인자·식 편집기·낙찰율 — 계약/실행/기성 단계 발견
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) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Prk9BCHG1EMAywk9k8wegA
This commit is contained in:
@@ -32,6 +32,7 @@
|
|||||||
| 23 `COSTN.SMT` 전수파싱 | **단가산출 원장** — 참조 1,570·품 1,460·Q식 187개(10꼴)·운반 사이클 | (저장소 파일) |
|
| 23 `COSTN.SMT` 전수파싱 | **단가산출 원장** — 참조 1,570·품 1,460·Q식 187개(10꼴)·운반 사이클 | (저장소 파일) |
|
||||||
| 24 모듈구조 전수 | **46개 모듈 export** — `DP_Common` 73함수, 플러그인 규약, 동글, 8차 해소 | (저장소 파일) |
|
| 24 모듈구조 전수 | **46개 모듈 export** — `DP_Common` 73함수, 플러그인 규약, 동글, 8차 해소 | (저장소 파일) |
|
||||||
| 25 설정키 전수와 식템플릿 | **설정 사슬 닫기** — `PRJLST.SMT` 키 241종, 간접비 식 26개 | (저장소 파일) |
|
| 25 설정키 전수와 식템플릿 | **설정 사슬 닫기** — `PRJLST.SMT` 키 241종, 간접비 식 26개 | (저장소 파일) |
|
||||||
|
| 26 편집기와 사이클식 | **`Cm` 54꼴·품셈 인자·식 편집기·낙찰율** — 계약/실행/기성 단계 발견 | (저장소 파일) |
|
||||||
|
|
||||||
> **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`.
|
> **정본은 저장소 파일이다** — `resources/knowledge/original/경쟁사 프로그램/STmate 분석/20_분석/`.
|
||||||
> 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다.
|
> 위 Orca 링크는 보기용이며, 문서를 지식DB 자리로 옮기면서 주소가 한 번 바뀌었다.
|
||||||
@@ -104,6 +105,12 @@
|
|||||||
| 추가금액 | 화면 문자열만 | **저장 구조** `ADD_AMT_단계_행_칸` | 25번 §1.3 |
|
| 추가금액 | 화면 문자열만 | **저장 구조** `ADD_AMT_단계_행_칸` | 25번 §1.3 |
|
||||||
| 간접비 식 템플릿 | 일부 | **26개 전수** | 25번 §2 |
|
| 간접비 식 템플릿 | 일부 | **26개 전수** | 25번 §2 |
|
||||||
| 식에 조건 분기 | 몰랐음 | ⚠ **`IF(...)` 존재** — 평가기 필수 요건 | 25번 §2.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
|
분석일: 2026-09-13
|
||||||
대상: `C:\경영정보(주)`
|
대상: `C:\경영정보(주)`
|
||||||
|
|||||||
@@ -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). 다음 판의 대상이다.
|
||||||
@@ -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회
|
||||||
@@ -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개
|
||||||
@@ -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]))
|
||||||
@@ -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))
|
||||||
@@ -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("<IHH",b,4)
|
||||||
|
f=[];o=32
|
||||||
|
while b[o]!=0x0D: f.append((b[o:o+11].rstrip(b"\0").decode("cp949","replace"),b[o+16]));o+=32
|
||||||
|
reps=[]
|
||||||
|
for i in range(nrec):
|
||||||
|
r=b[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]: reps.append((v[0],v[1],v[2]))
|
||||||
|
|
||||||
|
# Prn_* export 모으기
|
||||||
|
def exports(bb):
|
||||||
|
try:
|
||||||
|
e=struct.unpack_from("<I",bb,0x3C)[0]
|
||||||
|
if bb[e:e+4]!=b"PE\0\0": return []
|
||||||
|
nsec=struct.unpack_from("<H",bb,e+6)[0]; optsz=struct.unpack_from("<H",bb,e+20)[0]
|
||||||
|
opt=e+24; dd=opt+96
|
||||||
|
erva,_=struct.unpack_from("<II",bb,dd)
|
||||||
|
if not erva: return []
|
||||||
|
secs=[];so=opt+optsz
|
||||||
|
for i in range(nsec):
|
||||||
|
s=bb[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); nn=struct.unpack_from("<I",bb,eo+24)[0]; namp=struct.unpack_from("<I",bb,eo+32)[0]
|
||||||
|
no=r2o(namp); out=[]
|
||||||
|
for i in range(min(nn,4000)):
|
||||||
|
o2=r2o(struct.unpack_from("<I",bb,no+4*i)[0])
|
||||||
|
if o2 is None: continue
|
||||||
|
out.append(bb[o2:bb.index(b"\0",o2)].decode("latin1"))
|
||||||
|
return out
|
||||||
|
except Exception: return []
|
||||||
|
|
||||||
|
prn=collections.defaultdict(list)
|
||||||
|
for p in SYS.rglob("*"):
|
||||||
|
if not p.is_file() or p.suffix.upper() not in (".CPM",".EXE"): continue
|
||||||
|
try: bb=p.read_bytes()
|
||||||
|
except Exception: continue
|
||||||
|
if bb[:2]!=b"MZ": continue
|
||||||
|
for x in exports(bb):
|
||||||
|
if x.startswith(("Prn_","Edit_","Calq_","CHANGE_","CON_","ST_QTY","Set_")): prn[x].append(p.name)
|
||||||
|
|
||||||
|
print("### SET_REP 서식 %d종 ↔ Prn_* export %d개" % (len(reps), len(prn)))
|
||||||
|
print("\n%-6s %-24s %-28s %s" % ("INDX","서식명","제목","대응 export(추정)"))
|
||||||
|
def guess(name):
|
||||||
|
k=re.sub(r"[^가-힣A-Za-z]", "", name)
|
||||||
|
cand=[]
|
||||||
|
for x in prn:
|
||||||
|
xs=x.lower()
|
||||||
|
for tok,pat in (("내역","nae"),("총괄","nae"),("일위대가","ilwi"),("단가산출","san"),
|
||||||
|
("중기","joong"),("자재단가","dan"),("목록","mok"),("원가","won"),
|
||||||
|
("집계","col"),("제비율","kan"),("기성","jab"),("변경","ch")):
|
||||||
|
if tok in name and pat in xs: cand.append(x)
|
||||||
|
return sorted(set(cand))[:3]
|
||||||
|
hit=0
|
||||||
|
for idx,nm,tt in reps:
|
||||||
|
g=guess(nm)
|
||||||
|
if g: hit+=1
|
||||||
|
print("%-6s %-24s %-28s %s" % (idx, nm[:24], tt[:28], ", ".join(g)))
|
||||||
|
print("\n이름으로 이어진 것 %d / %d" % (hit, len(reps)))
|
||||||
|
print("\nPrn_* export 이름 전수 %d개" % len(prn))
|
||||||
@@ -64,6 +64,7 @@
|
|||||||
| 23 | **`COSTN.SMT` 전수파싱** — 단가산출 원장, Q식 10꼴, 운반 사이클 |
|
| 23 | **`COSTN.SMT` 전수파싱** — 단가산출 원장, Q식 10꼴, 운반 사이클 |
|
||||||
| 24 | **모듈구조 전수** — 46개 export, 계산 공용 라이브러리 73함수, 동글 |
|
| 24 | **모듈구조 전수** — 46개 export, 계산 공용 라이브러리 73함수, 동글 |
|
||||||
| 25 | **설정키 전수와 식템플릿** — 저장키 241종, 간접비 식 26개, 설정 사슬 닫힘 |
|
| 25 | **설정키 전수와 식템플릿** — 저장키 241종, 간접비 식 26개, 설정 사슬 닫힘 |
|
||||||
|
| 26 | **편집기와 사이클식** — `Cm` 54꼴, 품셈 인자, 식 편집기, 낙찰율 |
|
||||||
|
|
||||||
## 확정된 굵직한 것
|
## 확정된 굵직한 것
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user