dwgcompare — handoff (현재 상태·불변 핵심)
🔴2026-09-09(수) 이후 이 DLL 이 하는 일은 「겹쳐보기(DWGCV)」 하나다. 캐드 안 비교는 폐기됐다(아래 절). 옛 목적(참고): 새 도면을 구도면과 엔티티 단위로 대조해 ①색 마크+번호 ②팔레트 목록 ③구도면 겹쳐보기. 갱신일: 2026-09-09 (KST). 함정·규칙은
rules.md(단일 출처).
✅ 26.9.9(수) — 캐드 안 도면비교 폐기 · 런처 「도면비교」 = 겹쳐보기 (3대 배포 완료)
페페 「pcadtools 에서 기존 도면비교(캐드 내 비교 기능) 폐기하고 그 이름만 받아서 겹쳐보기를 대신 넣는다. 미니PC·사무실PC·poinimos02 재설치. 캐드 사용중인 PC 는 캐드 닫히면 자동설치」(로그온 트리거로 먼저 갔다가 페페 지시로 캐드 종료 감지로 교체).
- 🔑런처엔 원래 버튼이 둘이었다(「도면비교」=DWGCPAL · 「겹쳐보기」=DWGCV) → 한 줄로 합쳤다. 직원이 아는 이름·아이콘(C·빨강)·자리를 그대로 물려받고 명령만 DWGCV. 「겹쳐보기」라는 버튼명은 없어졌다.
- 폐기 범위 = 명령·팔레트까지(페페 결정, 그릴링). 없어진 것 =
DWGCDWGC2DWGC_ZOOMDWGC_BENCHDWGC_OVLDWGCPAL· 비교 팔레트 · Ctrl+B 겹쳐보기 토글 훅(마크·스냅샷을 만드는 쪽이 없어져 토글 대상 자체가 없다). 소스 3파일(CompareCommands.csComparePalette.csCompareRunner.cs, ~1,000줄)은C:\dev_attic\2026-09-09\dwgcompare-retired\로 이동. - 엔진 파일(
DwgReaderRevMarkerDiffEngineEnt)은 남겼다 —GeomDump(겹쳐보기)가ModelSpaceIds·Warmup· 스킵 레이어명을 쓴다. 더 지우려면 그 4개를 GeomDump 로 이식해야 한다(페페 = 지금은 안 한다). - 산출 =
DwgCompare.dll19139BA1(96,256→70,144B) ·PcadTools.dllD7B27E9E. - 검증(전부 헤드리스 accoreconsole) =
DWGCV_BENCH71ms 산출 정상 ·DWGCV_VERIFYPASS(불일치 0) ·DWGC= 「알 수 없는 명령」 · DLL 문자열 대조(폐기 명령 5개 전부 0건, DWGCV 1건) · 3곳 MD5 일치. - 배포 = 미니PC·사무실PC(poinimos01) 설치 완료 · poinimos02 는 캐드가 열려 있어 「캐드 끄면 5분 안에 설치」 예약(아래 미결).
⏳ 미결
- 페페 = 캐드 열어 「도면비교」 버튼 1회 확인(사무실PC 는 이미 설치됐다 — 캐드만 재시작하면 된다).
poinimos02 는 그 PC 에서 캐드를 끄면 5분 안에 저절로 깔린다(아무것도 안 해도 된다).
현황 조회 =
PYTHONUTF8=1 python C:/dev/pcadtools-plugin/deploy.py(⏳예약 표시가 사라지고 「최신」이면 설치된 것). - ~~Ctrl+B 육안 1회~~ 무효 — 26.9.9 에 훅을 폐기했다(원문 =
archive.md).
🆕 3차 (2026-09-03) — 겹쳐보기 단축키 Ctrl+B
진입점 3개(팔레트 버튼 · Ctrl+B · 명령 DWGC_OVL)가 ToggleOverlay() 하나로 모이고,
버튼 글자·상태줄은 CompareCommands.OverlayChanged 이벤트로 어느 쪽에서 바꿔도 따라온다.
- 🔴Ctrl+B 는 캐드 기본 스냅 토글 →
_DWGC_OLD레이어가 있을 때만 가로챈다. 겹쳐보기 안 한 도면에선 스냅이 그대로 산다. - 후킹 =
Core.Application.PreTranslateMessage(accoremgd 전용) · csproj 에WindowsBase참조 추가(MSG 타입). - 훅 안에서 DB 안 고친다 →
SendStringToExecute("DWGC_OVL "). - 검증 = accoreconsole 헤드리스
DWGC_BENCH→DWGC_OVL×2 = OFF→ON 왕복 확인. DLL MD5 61108DEB 4곳 일치 (bin · dwgcompare installer · pcadtools installer ·%LocalAppData%\pcadtools\) + 사무실PC(poinimos01) 교체 완료(D99E9104→61108DEB). - ⏳페페 육안 1개 = 캐드에서 실제로 Ctrl+B 가 먹는지(헤드리스는 키 입력이 없다). AutoCAD 재시작 후 확인.
- 상세·함정 =
rules.md「🆕 겹쳐보기 단축키 Ctrl+B」·「🆕 배포 경로」.
🆕 2차 보완 (2026-08-06) — 겹쳐보기가 페페가 그린 그림대로 동작하게
증상 = "겹쳐서 보기가 잘 작동이 안 되는 거 같다". 원인 3개: ① 변경분만 겹쳤다(상한 3,000) → 빨강이 드문드문 찍힐 뿐 "겹쳐 보인다"는 느낌이 없음 ② 변경 0건이면 조기 return → 체크를 켜고 돌렸는데 아무것도 안 생김 ③ 최상위 엔티티만 빨강이라 블록 내부는 원래 색 → 어느 쪽이 구도면인지 안 갈림
고침 = PaintOverlayFull — 구도면 전체를 빨강 한 색으로.
- 🔑 DuplicateRecordCloning.MangleName 이 핵심. Ignore 는 같은 이름의 레이어·블록정의를 신도면 것으로
재사용하므로 그 색을 빨강으로 바꾸면 신도면까지 빨개진다. MangleName 은 충돌 심볼을 전부 새 레코드로 복제.
- 색 통일 3중 = 복제 레이어 색 + 최상위 엔티티 색 + 복제 블록정의 내부 엔티티까지(실무 도면은 내부가 명시색).
- 모델공간엔 블록 참조 1개(_DWGC_OLD$SNAPSHOT) + 레이어 잠금 → 빨간 선을 실수로 끌고 가는 사고 차단,
재비교 시 지울 것도 1개. 복제 심볼 접두어 _DWGC_OLD$ → [마크 지우기]가 이름만 보고 Purge.
- 목록 클릭 = 그 자리로 확대(마크 지름 6배, 화면비 유지). 옛 동작(중심만 이동)은 「클릭 시 확대」 체크 해제로.
🔴 덤으로 잡은 진짜 버그 — 같은 세션에서 두 번 비교하면 없던 변경 3건(겹쳐보기와 무관, 끄고도 재현).
원인 = 첫 접근과 두 번째 접근의 값이 다르다(지연 로딩). 1회차 읽기가 곧 워밍업이 되어 2회차 지문만 달라졌다.
→ DwgReader.Warmup(db) 신설(블록 정의만 훑음, 모델공간·겹쳐보기 스냅샷 제외). 3건 → 0건, 7.9→10.4초.
실측(16.5MB·28,205 엔티티) = 겹쳐 그림 28,214 전량·빨강 아닌 것 0·모델공간 엔티티 1·
신도면 레이어 색 변화 0건 · 재비교 오탐 0 · 겹쳐보기 36.9초(재비교 69.6초)·피크 2.9GB.
DLL 4곳 MD5 7336DEC6. 사용 매뉴얼 = devplan /dwgcompare.html(허브 카드 등록).
⏳페페 = 육안 4항목. 상세 = session-2026-08-06-overlay-rework.md
v2 재제작 (2026-08-06, 페페 지시 "재제작")
왜 갈아엎었나 — v1이 실제로 못 쓰였다. 로그(%LocalAppData%\MDCAD\dwgcompare_log.txt)에
2026-07-02 이후 Initialize/Terminate만 있고 비교 실행 기록이 0건이었다. 근본원인 5:
1. 지문이 "좌표를 격자로 반올림한 문자열 완전일치" → 격자 경계에 걸리면 같은 선이 다른 키 = 오탐 무더기.
2. 정렬을 사람이 마우스로 기준점 2번 클릭 → 오스냅 안 걸리면 dx·dy가 어긋나 전 엔티티 오탐.
3. 블록은 삽입점만 비교 → 가구도면 대부분인 블록 내부 변경을 원리적으로 못 잡음.
4. 이동판정 O(n²) + 엔티티당 문자열 수백바이트 → 30MB 도면에서 메모리·시간 폭발.
5. 명령 2단계(DWGC→창 전환→DWGC2)의 창 전환이 진입장벽.
웹조사 결론(재조사 금지): 베낄 오픈소스 DWG diff 엔진은 없다(diff-dwg=PDF 픽셀비교,
ezdxf·netDxf·ACadSharp=리더일 뿐, CAD Diff=방치). 상용=ProtoTech(유료).
내장 DWGCOMPARE(2019+, 2024 보유)는 좌표정렬 지정 UI가 없어(WCS 절대좌표) 위치 틀어진
거래처 도면에선 전부 변경으로 뜨고, 번호목록·표도 없다. → 자체 제작이 맞고 엔진만 새로 짰다.
지금 어떻게 쓰나 (명령 1개)
DWGC 또는 런처 「도면비교」 → 우측 팔레트에서 구도면 고르고 [비교 실행]. 끝.
- 구도면 = 파일 선택(기본) 또는 열린 도면 선택. 파일이면 열지 않고 사이드로드한다.
- 민감도 3단(정밀/보통/거침)만 고른다. 톨러런스 3숫자 직접입력은 없앴다(아무도 못 맞췄다).
- 마크크기 0.1~1000% (직접 입력) — 프리셋(1·2·5·10·25·50·100·200·400%) 밖 값도 타이핑.
바꾸면 재비교 없이 즉시 다시 그린다(마크 레이어만 교체). 기준계수 refDiag×0.002.
- 정렬은 자동. 결과 dx·dy가 팔레트에 찍히고, 필요하면 「오프셋 수동」으로 덮어쓴다.
- 목록 한 줄 클릭 = 그 자리로 이동(줌 비율 유지) + 3초 노랑 강조.
- 하단 [겹쳐보기] [표 삽입] [CSV] [마크 지우기].
- 명령: DWGC(팔레트) DWGCPAL(런처가 쓰는 이름) DWGC_ZOOM(번호로 이동) DWGC_BENCH(헤드리스 검증).
엔진 (핵심 3단 매칭)
- 핸들 — 구도면을 고쳐 보낸 경우 안 바뀐 객체는 핸들이 같다. O(n) 확정 매칭. 단 모양 일치율 50% 이상일 때만 신뢰(우연 충돌 방어).
- 정확일치 — (모양해시 + 양자화좌표) 다중집합 상쇄. 대부분 여기서 걸린다.
- 근접 — 남은 것만 공간해시로 SnapTol 안에서 짝짓기. ②의 양자화 실수를 ③이 받아낸다. - 정렬 = 핸들쌍 또는 이동불변 모양해시로 (dx,dy) 최빈값 투표(경계 표 갈림 방지로 3x3 이웃 합산). - 판정 = 추가/삭제/변경/텍스트변경/이동. v1엔 없던 변경이 생겨 "리사이즈=삭제4+추가4" 노이즈가 사라졌다. - 클러스터 = union-find(연쇄 병합 정확). 번호는 읽는 순서(위→아래, 좌→우). - 블록은 정의 내용을 재귀 해시(캐시) + 축척·회전·속성값까지 → 블록 내부 변경이 잡힌다. - 치수는 Measurement를 지문에 넣는다(치수값 변경 = 가장 중요한 신호).
메모리·속도
- 구도면을 Document로 열지 않는다(
ReadDwgFile사이드로드 → 비교·복제 끝나면 통째로 해제). - 엔티티당 고정 56바이트 struct(문자열 0). 문자열은 StrTable에 1회, 레이어는 ObjectId→id 캐시.
- 읽기 트랜잭션은 5000개씩 청크(한 트랜잭션으로 수십만 개 열면 래퍼가 커밋까지 다 산다).
- 실측(AutoCAD 2024, accoreconsole): 30MB·75,894엔티티 × 2 = 6.3초 / 작업세트 +107MB. 10MB·9,022엔티티 × 2 = 4.3초.
검증 (2026-08-06)
- 엔진 자가검증
_test\DiffTest.exe= 20항목 ALL PASS, AutoCAD 없이 돈다(엔진에 캐드 타입 0).dotnet build _test\DiffTest.csproj -c Release && _test\bin\Release\DiffTest.exe - 실도면 헤드리스 3종 PASS(accoreconsole +
DWGC_BENCH): 1. 같은 파일 복사본끼리 — 10MB 오탐 0 / 30MB(75,894엔티티) 오탐 0. ← 유일한 회귀 기준 2. 의도한 변경만 — 구도면에 lisp로 선3 삭제·선1 이동50·문자1 변경·원1 추가 → 정확히 6건, 그 외 0건("MH건립" → "CODY_TEST_CHANGED"까지 문자열로 표시). 3. 핸들 없는 도면(새로 그려 보낸 상황) — INSERT+EXPLODE로 핸들 전부 새로 만들고 (5000,3000) 이동 → 자동정렬이 dx=5000.000 dy=3000.000 정확 복구, 구도면 9,022개 전량 매칭·삭제 0. - 설치 DLL 심볼 확인 + MD5 3곳 일치.
- 마크 크기 수정 검증 (2026-08-06, 페페 지적 "표시크기가 신도면을 다 뒤덮는다") — 구도면을 반쪽으로 만들어 그 상황을 재현·계측: 헤더 도면범위 19,788,726 vs 실제 객체분포 292,985(67배) · 최대 클러스터 대각선 20,700,622 → 구공식 원 13,455,404 / 번호 6,727,702 → 신공식 원 11,719 / 번호 938(원 1,148배·번호 7,172배 축소). 오탐·성능 회귀 없음(자가검증 ALL PASS). 이어 페페 지시로 기준을 절반으로(옛 50%=새 100%) + 직접 입력 허용 → 같은 도면 실측 100%=반경 586 / 50%=293 / 1%=6(번호 5).
- ⏳ 페페 몫 = 육안(AutoCAD 재시작 후): ①팔레트가 우측에 뜨는지 ②[비교 실행] 한 번으로 끝나는지 ③마크 색이 유형별로 구분되는지 ④목록 클릭 시 이동+강조 ⑤[겹쳐보기]로 구도면이 빨강으로 겹쳐 보이는지 ⑥마크크기 콤보를 바꾸면 즉시 다시 그려지는지.
⏳ 다음 (페페 지시 대기)
- 구도면이 여러 파일로 나뉜 경우 — 신도면은 주방가구+일반가구 합본인데 구도면은 파일이 분리돼 있다. 지금은 한 파일만 지정할 수 있어 나머지 절반이 통째로 "추가"로 뜬다(위 재현 테스트가 정확히 그 상황). → 구도면 여러 개 선택 → 합쳐서 한쪽으로 취급하는 경로가 필요하다. 페페가 "일단 크기부터" 지시(2026-08-06).
배포
- 빌드
dotnet build C:\dev\dwgcompare-plugin\DwgCompare.csproj -c Release(dotnet SDK로 net48, VS 불필요). - DLL 3곳 동기화:
dwgcompare-plugin\dwgcompare installer\·pcadtools-plugin\pcadtools installer\·%LocalAppData%\pcadtools\(실사용, MDCAD 는 옛 경로다). 런처 「도면비교」가DWGCV로 온디맨드 NETLOAD. 3대 배포는PYTHONUTF8=1 python C:/dev/pcadtools-plugin/deploy.py push한 번이 전부다. - AutoCAD 2016~2024(2024 참조 빌드), 2025+ 미지원(.NET8). install.ps1은 UTF-8 BOM 필수.
- v1 원본 백업 =
C:\dev\_backup\dwgcompare-v1-20260806\.
한계 (알고 남긴 것)
- 모델공간만 비교(배치/페이퍼공간 제외).
- 정렬은 평행이동만. 회전·축척 다른 도면은 대상 아님.
- OLE 객체는 위치·크기를 못 믿어 이동/추가 판정에서 뺀다(내장 DWGCOMPARE도 OLE 미지원).
- 해치는 패턴·루프수·축척·각도만 비교(경계 기하는 둘레 선이 대신 잡아준다).
- 겹쳐보기는 정의가 바뀐 블록을 새 정의 모습으로 그린다(목록에는 정확히 잡힘).
- 마크 2,000곳 / 겹쳐보기 3,000건 상한, 목록 5,000줄 상한(넘으면 CSV로 전량).