dwgcompare — handoff (현재 상태·불변 핵심)
목적: 거래처가 변경표시 없이 보내는 새 도면을 구도면과 엔티티 단위로 대조해 ①변경 지점에 유형별 색 마크+번호 ②팔레트 목록(클릭=그 자리로 이동) ③구도면 겹쳐보기로 보여준다. 갱신일: 2026-08-06 (KST) — v2 전면 재제작. 함정·규칙은
rules.md(단일 출처).
🆕 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%\MDCAD\(실사용). 런처가DWGCPAL로 온디맨드 NETLOAD. - 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로 전량).