10.2 KB · 수정 2026-08-06 15:03
목차

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단 매칭)

  1. 핸들 — 구도면을 고쳐 보낸 경우 안 바뀐 객체는 핸들이 같다. O(n) 확정 매칭. 단 모양 일치율 50% 이상일 때만 신뢰(우연 충돌 방어).
  2. 정확일치 — (모양해시 + 양자화좌표) 다중집합 상쇄. 대부분 여기서 걸린다.
  3. 근접 — 남은 것만 공간해시로 SnapTol 안에서 짝짓기. ②의 양자화 실수를 ③이 받아낸다. - 정렬 = 핸들쌍 또는 이동불변 모양해시로 (dx,dy) 최빈값 투표(경계 표 갈림 방지로 3x3 이웃 합산). - 판정 = 추가/삭제/변경/텍스트변경/이동. v1엔 없던 변경이 생겨 "리사이즈=삭제4+추가4" 노이즈가 사라졌다. - 클러스터 = union-find(연쇄 병합 정확). 번호는 읽는 순서(위→아래, 좌→우). - 블록은 정의 내용을 재귀 해시(캐시) + 축척·회전·속성값까지 → 블록 내부 변경이 잡힌다. - 치수는 Measurement를 지문에 넣는다(치수값 변경 = 가장 중요한 신호).

메모리·속도

검증 (2026-08-06)

⏳ 다음 (페페 지시 대기)

배포

한계 (알고 남긴 것)