dwgcompare — 규칙·함정 (불변)
도면비교 플러그인을 손댈 때 반드시 먼저 읽는다. 전부 실측으로 잡은 것들이다.
🆕 신규
- [코디] 화면에 그리는 크기(마크 원·번호·표 행높이)는
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% 이상일 때만 믿는다. 무관한 두 도면도 핸들 번호는 낮은 값부터라 우연히 겹친다.