dwgcompare — 규칙·함정 (불변)
도면비교 플러그인을 손댈 때 반드시 먼저 읽는다. 전부 실측으로 잡은 것들이다.
🆕 신규
- 🔴[코디] 캐드 안 비교는 폐기됐다 — 이 DLL 은 겹쳐보기(DWGCV) 전용(26.9.9 페페 지시).
DWGCDWGC2DWGC_ZOOMDWGC_BENCHDWGC_OVLDWGCPAL·비교 팔레트·Ctrl+B 훅은 없다. 이 파일 아래쪽 「Ctrl+B」·비교 팔레트·마크크기 절은 이력이다(그 코드는C:\dev_attic\2026-09-09\dwgcompare-retired\). 런처 「도면비교」 버튼은 이제 DWGCV 를 부른다 — 이름만 옛것이다. - ⚠[코디] 폐기 검증은 「명령이 정말 없어졌는지」까지 본다 — 빌드 성공은 증거가 아니다.
⛒① DLL 바이너리 문자열 대조(
grep -a -c DWGCPAL dll= 0) ② accoreconsole 로 실제 호출 → 「알 수 없는 명령 "DWGC"」 가 떠야 폐기다. ③ 남긴 기능은 같은 자리에서 재검증(DWGCV_BENCH·DWGCV_VERIFY). -
⚠[코디] 캐드가 열린 PC 는 배포를 건너뛰지 말고 「캐드 끄면 설치」로 예약한다(26.9.9 페페 지시).
deploy.py가 설치본을C:\ProgramData\pcadtools-pending에 놓고 예약작업Cody\PcadTools-PendingInstall을 건다 (/sc MINUTE /mo 5) → 그 PC 가 캐드를 끄면 5분 안에 스스로 설치하고 예약작업·스테이징을 자기 손으로 지운다. 실측 함정 7개는projects/acad-tread/handoff.md「🆕 26.9.9 — 캐드 열린 PC = 캐드를 끄면 자동설치」(단일 출처). -
[코디] 화면에 그리는 크기(마크 원·번호·표 행높이)는
db.Extmin/Extmax로 잡지 마라 (2026-08-06, 페페 지적 "표시크기가 신도면을 다 뒤덮는다"). 실측 = 헤더 범위 19,788,726 vs 실제 객체 분포 292,985 → 67배.DiffEngine.RobustExtent(퍼센타일)를 쓴다. 같은 실수를 노브(SnapTol)에서 먼저 고치고 마크에서 안 고쳐 재발했다.Extmin/Extmax를 쓰는 곳이 남았는지 항상 훑어라. - [코디] 번호 글자 높이를 클러스터 크기에 비례시키지 마라 — 2026-08-06.
구도면이 신도면의 일부만 담고 있으면(주방/일반 분리 파일) 클러스터 하나가 도면 전체를 덮어
r*0.5글자가 6,727,702(도면의 23배)가 된다. 글자는 도면당 일정(baseR*0.8), 원은baseR*10까지만. 고친 뒤 같은 조건에서 원 13,455,404→11,719, 번호 6,727,702→938. - [코디] 크기 조절은 재비교 없이 — 팔레트 「마크크기」가
CompareCommands.RedrawMarks()로 마크 레이어만 다시 그린다(겹쳐보기·비교결과는 유지). 비교가 몇 초 걸리므로 크기 맞추려고 재비교하면 안 된다. 콤보는 직접 입력형(DropDown) — 프리셋 밖 값(0.5% 등)을 타이핑한다. 범위 0.1~1000%, 적용은 목록선택·Enter·포커스이탈 3경로, 잘못 친 값은 직전 값 유지 후 표기만 정규화. ⚠ Enter는SuppressKeyPress로 삼킨다 — 안 그러면 캐드 명령행으로 새 나간다. -
[코디] 기준계수 =
refDiag × 0.002(페페 지시 2026-08-06, 0.004에서 절반 = 옛 50%가 새 100%). 실측 확인: 도면 292,985 기준 100%→반경 586·1%→6. 계수를 또 바꾸면 이 줄과BaseRadius주석을 같이 고친다. -
[코디] 지문에는 "저장값"만 넣는다. 계산·렌더로 나오는 값은 절대 넣지 않는다 (2026-08-06, v2 재제작). 같은 파일 두 개를 비교했는데 변경이 6건, 10건, 32건씩 떴다. 원인은 전부 이것 하나였다 — 새 도면은 열린 Document DB, 구도면은
ReadDwgFile사이드로드 DB라서 문맥이 다르고, 아래 값들이 그 문맥에 따라 달라진다. 지문에 들어가면 그대로 오탐이 된다. | 넣으면 안 되는 값 | 왜 | |---|---| |Entity.GeometricExtents| 리젠·폰트 상태에 좌우된다. 크기·위치 모두 | |MText.Text| 서식 해석이 문맥마다 다르다 →Contents(저장 원문)를 쓴다 | | 필드(ACAD_FIELD)를 품은 텍스트·속성 | 도면을 열 때 재평가된다. 날짜 필드가 구=2026.06.15신=2026.08.06(오늘)로 갈렸다 | |Hatch.Area| 문맥의존 + 예외 | |Ole2Frame.WcsWidth/Height,Location| OLE 서버가 없으면 0으로 나온다(사이드로드에선 위치까지0,0) | 판정법 = 같은 파일을 복사해 서로 비교했을 때 변경 0이 나와야 한다. 이게 유일한 회귀 기준이다. -
[코디] bbox에서 뽑은 대표점은 "이동" 판정에 쓰지 않는다(
Ent.PosExact=false) — 2026-08-06. OLE·프록시류는 한쪽 bbox가 0이라 "10만 이동"이 10건 찍혔다. 모양이 같고 한쪽이라도 추정 대표점이면 변경 없음으로 본다. -
[코디] 톨러런스는
db.Extmin/Extmax가 아니라 실제 객체 분포(5~95 퍼센타일)에서 뽑는다 — 2026-08-06. 헤더 범위는 저 멀리 떨어진 객체 하나에 1억까지 부풀어 SnapTol이 10만이 되고, 50m 떨어진 남남끼리 "이동"으로 짝지어진다.DiffEngine.RobustExtent. -
[코디] 마크 레이어는 전용 이름을 쓴다 —
_DWGC_MARK/_DWGC_OLD— 2026-08-06. v1은_REVCLOUD를 썼는데 그건 실제 도면에도 흔한 이름이라, 재실행 시 거래처가 그려둔 진짜 리비전클라우드를 지울 수 있었다(ClearPrevious가 레이어를 통째로 비운다). -
[코디] 겹쳐보기 복제는
DuplicateRecordCloning.Ignore고정 — 2026-08-06.Replace면 구도면의 블록정의가 새 도면 정의를 덮어쓴다(파괴적). Ignore의 대가 = 정의가 바뀐 블록은 겹쳐보기에서 새 정의 모습으로 보인다. 목록에는 정확히 잡히므로 표시상 한계만 남긴다. -
[코디] 헤드리스 검증은 accoreconsole +
DWGC_BENCH— 2026-08-06. GUI 없이 실도면으로 종단 검증된다. MSYS_NO_PATHCONV=1없이 Git Bash에서 부르면/i/s가 경로로 변환돼 Usage만 찍고 만다./i/s둘 다 절대경로여야 한다(현재 디렉터리가 맞아도 상대경로면 "파일을 찾을 수 없습니다").- 스크립트 끝에
_QUIT+_N이 없으면 프롬프트에서 영원히 안 끝난다(백그라운드로 넘어가 보인다). - 로그는 UTF-16LE다.
decode('utf-16-le')안 하면 글자 사이에 공백이 낀 것처럼 보인다. - 환경변수:
DWGC_OLD(필수)DWGC_LEVELDWGC_OVERLAYDWGC_CSVDWGC_DIAG=1(지문 구성요소 덤프).
구조 (건드릴 때 위치)
Ent.cs/DiffEngine.cs= 캐드 타입 0. 그래서_test\DiffTest.exe가 AutoCAD 없이 돈다. 이 경계를 깨지 마라.DwgReader.cs= 캐드 의존 전부. 새 엔티티 타입 지원은 여기Build()에만 추가한다.- 매칭 3단 = ①핸들 ②정확일치(모양해시+양자화좌표) ③근접(공간해시). ②의 양자화 실수를 ③이 받아낸다 — 2단 구조를 1단으로 줄이면 v1의 격자경계 오탐이 그대로 돌아온다.
- 핸들 매칭은 모양 일치율 50% 이상일 때만 믿는다. 무관한 두 도면도 핸들 번호는 낮은 값부터라 우연히 겹친다.
🆕 신규 — 겹쳐보기 단축키 Ctrl+B (26.9.3)
- [페페 지시] 겹쳐보기 On/Off 를 Ctrl+B 로. 진입점 3개(팔레트 버튼 · Ctrl+B · 명령
DWGC_OVL)가 전부CompareCommands.ToggleOverlay()하나로 모인다. 표시 동기화는OverlayChanged이벤트가 맡는다. - 🔴Ctrl+B 는 AutoCAD 기본 스냅(SNAP) 토글이다 — 무조건 가로채면 스냅이 죽는다.
⛒이 도면에
_DWGC_OLD레이어가 있을 때만 먹고(RevMarker.HasOverlay), 없으면 그냥 흘려 기본동작을 살린다. - 🔴후킹 자리 =
Autodesk.AutoCAD.ApplicationServices.Core.Application.PreTranslateMessage(accoremgd).ApplicationServices.Application(acmgd) 에는 없다 — 리플렉션으로 확인하고 붙였다.PreTranslateMessageEventArgs.Message는System.Windows.Interop.MSG라 csproj 에WindowsBase참조가 필요하다(빼면 컴파일 에러). - 🔴핸들러는 모든 윈도우 메시지를 지난다 →
message != WM_KEYDOWN을 첫 줄에서 튕겨낸다. 여기서 무거운 일 하면 캐드가 전체적으로 느려진다. - 🔴메시지 훅 안에서 DB를 직접 고치지 마라(명령 진행 중일 수 있다) →
SendStringToExecute("DWGC_OVL ")로 큐에 넣는다. - 명령 이름을
DWGC_OVERLAY로 안 한 이유 = 헤드리스 벤치 환경변수DWGC_OVERLAY와 글자가 겹쳐 헷갈린다. →DWGC_OVL. - 검증 = accoreconsole 헤드리스로
DWGC_BENCH(겹침 생성) →DWGC_OVL→DWGC_OVL= OFF→ON 왕복 확인. ⏳Ctrl+B 키 가로채기 자체는 GUI 라 육안 몫(헤드리스는 키 입력이 없다).
🆕 배포 경로 — 실사용은 %LocalAppData%\pcadtools\ 다 (26.9.3)
- 🔴
%LocalAppData%\MDCAD\는 옛 개별설치 경로다 — 지금 로드되는 DLL 이 아니다(로그만 거기 쌓인다). MDCAD 의 DwgCompare.dll 은 미니PC·사무실PC 둘 다 7월 v1 잔재였다. 그걸 보고 「사무실PC가 구버전」으로 오진할 뻔했다. 판정은%LocalAppData%\pcadtools\를 본다(런처 install.ps1 의$installDir). - 🔴AutoCAD 가 떠 있으면 NETLOAD 된 DLL 은 잠긴다 → 원격 교체는
.dll.new로 먼저 올리고Move-Item -Force. 순서가 반대면(직접 덮어쓰기) 실패했을 때 멀쩡한 설치본이 깨진다. 도구 =C:\dev\pcadtools-plugin\deploy_remote_dll.ps1. - 배포 절차·대상 PC =
projects/acad-tread/handoff.md「pcadtools 배포 도구 deploy.py」(단일 출처) - 원격 복사 뒤
Unblock-File(MOTW ZoneId=3 이면 .NET 자동로드가 무음 실패 — 메모리dotnet-plugin-motw-autoload-fail).
⚠ 알려진 기존 결함 (이번 작업과 무관, 미수정)
_test\DiffTest.csproj빌드가 깨져 있다 —_test\ClipGen\ClipGen.cs가CommandMethod등 캐드 타입을 쓰는데 테스트 프로젝트엔 캐드 참조가 없다(오류 20개). 26.8.31 Clip/GeomDump 작업 때 들어온 것으로 보인다. ⇒ 엔진 자가검증 20항목을 지금은 새로 빌드해 돌릴 수 없다(옛 exe 는 남아 있어 ALL PASS 를 찍지만 그건 옛 빌드다). 회귀 기준을 되살리려면 ClipGen 을 테스트 프로젝트에서 빼거나 별도 프로젝트로 분리해야 한다.