autocad-plot — 규칙·함정
AutoCAD COM/환경 공통. 플롯 파이프라인 자체는
handoff.md.
🆕 신규
- 🆕[코디] 26.10.24 소요한남 2차 전체도면 흑백 PDF — ①Bash(Session0)에서 DispatchEx AutoCAD 로 PlotToFile 하면 빈 PDF(1.4KB) 가 «성공»으로 나온다 → 헤드리스 플롯은 accoreconsole
-PLOT(용지 = canonicalISO_full_bleed_A3_(420.00_x_297.00_MM)그대로 받음 · 현지화 이름/공백판은 거부 ·OSMODE 0먼저 · 시트당 ≈40초). 생성기 =C:\dev\_tmp\hannam2_pdf\+ 세션 scratchpadmkscr.py·merge_gray.py②DWG To PDF.pc3 가 완료 후 PDF-XChange 를 페페 화면에 띄우고 파일을 잠근다(COM 경로) ③monochrome.ctb 가 못 바꾼 트루컬러 벡터·사진은 PyMuPDF 후처리로 회색(RG/rg→휘도G/g, 사진=회색 JPEG 85) ·rewrite_images(set_to_gray)는 사진을 줄무늬로 깨뜨림 ④「선 얇게」 =PlotWithLineweights=False(plot_engine.pylineweights인자 신설, 기본 True 유지). - 🆕[코디] 26.10.23 [페페] 도면 객체 색을 그레이로 바꾸지 마라 — 캐드 화면(검은 배경)에서 250 회색 글자가 안 보인다는 지적으로 EXEDRA2 최종본 색을 원래대로 되돌렸다. 「밝은 색이 안 보인다·흑백으로」는 출력(PDF 플롯 스타일 monochrome.ctb) 쪽에서 해결하고, DWG 색은 원도면 그대로 둔다. 되돌리기 =
C:\dev\_work\sohan-exedra2-1023\recolor.py(이전 리비전 DXF 색을 핸들 단위로 복사).
-12. [코디] 26.10.21 TREAD 규격표 — AutoCAD .NET Database 래퍼는 접근마다 다른 객체(ReferenceEquals(doc.Database, doc.Database)==false) → ConditionalWeakTable·ReferenceEquals 키 캐시는 영영 안 맞는다(기존 c판 판정 캐시가 그랬다). 키 = db.UnmanagedObject.
-11. [코디] 26.10.21 — accoreconsole 에서 acmgd UI 형식(PaletteSet · ImpliedSelectionChanged · DocumentExtension.GetAcadDocument)을 JIT 하면 프로세스가 조용히 죽는다(exit 127) → 헤드리스 시험 경로는 그 형식을 부르는 메서드와 분리하고 SkipHooksForTest 로 막는다.
-10. [코디] 26.10.20 에넥스 라온 대전 — COM SaveAs(out, 60)(2013) 이 「도면 저장 - 버전 충돌」 대화상자에서 무한 대기: 원본(AC1027)에 AEC 사용자 객체가 있으면 이전 버전 저장이 막히고 대화상자엔 «닫기»뿐(명령 링크 없음 · 닫기 눌러도 SaveAs 안 돌아옴 → 20분 hang). 같은 원본이 한 번은 통과했다(재현 불안정). 처방 = SaveAs(out, 64)(2018 = AutoCAD 2024 네이티브) → 0.6초 저장. 결과 파일이 AC1032 가 되니 보고에 «2018 형식» 명시. 진단 = 작업 스크립트 안 spy 스레드가 acad pid 의 #32770 창을 uiautomation 으로 읽어 log 에 남김(C:\dev\_work\raon-daejeon\acad_flap.py spy()).
-9. [코디] 26.10.16 남판교 3차 재제작 표기(평면 참조1·2 → 입면 사각형+MLEADER 64·타입별 리스트·엑셀) — ①COM MLEADER 는 착지점(도그레그 끝)이 화살표보다 왼쪽이면 문자를 왼쪽에 붙인다 → 문자 위치는 착지 방향 보고 따로 보정(안 하면 겹침·시트 밖) ②원본이 작업 중 재저장될 수 있다 → 표기 직전·업로드 직전 NAS 원본 해시 재확인 ③Session1 예약작업 이름은 작업자마다 달리(같은 \Cody\tmp-gui 를 다른 작업자가 지움). 도구 = C:\dev\_work\nampangyo-3cha-1016\(spec·resolve·annotate_job·verify_job·diff_dxf·corr·make_xlsx·s1). MLEADER 문자 = 기존 치수문자의 약 2배(120 vs 57.5)가 페페 「잘 보이게」 기준 후보.
-8. [코디] 26.10.12 같은 건 2차 — ①겹침 판정을 ezdxf 글자폭으로 하면 굴림이 AutoCAD 실폭보다 5~8% 좁게 잡혀 겹침을 놓친다 → 폭 ×1.08 보정 + MTEXT 줄간격 «정확히(Exactly)»(«최소»는 AutoCAD에서 더 벌어져 블록끼리 겹침) ②숨김 AutoCAD 로 육안 확인 = PDF 플롯만 된다(이미지 내보내기는 창 Visible 필요 → 금지) ③AutoCAD 작업 세션 2개가 동시에 돌면 한쪽 COM 이 「RPC 서버 없음」으로 죽는다 → 동시 실행은 순서를 정한다. [페페] 파트 가공도 보링 = 같은 사양 그룹당 대표 구멍 1곳만 MLEADER(사양+개수), 줄간격 넉넉히·블록 겹침 0.
-7. [코디] 26.10.12 소요한남 EXEDRA2 가공도 MLEADER 주석 실측 — ①ezdxf 로 넣은 MLEADER 를 ODA 로 DWG 저장하면 프록시 그래픽이 붙어 ezdxf PNG 렌더에서 MLEADER 가 안 보인다(AutoCAD 재오픈은 정상) → 렌더 때만 메모리에서 프록시 떼고 그린다 ②지시선 색 ByBlock 이면 PNG 에서 흰색 = 안 보임 → 색 명시. [페페] 주석 = MLEADER(LINE+TEXT 금지)·글자 최소 60(비율 자리는 도면 기존 글자와 동일). 도구 = C:\dev\_work\sohan-exedra2-1012\(annotate·verify·nas_finish).
-6. [코디] 26.10.11 [페페]「캐드 열 때 글꼴 선택 등이 명령창으로만 나온다」 → 원인 = FILEDIA=0 이 레지스트리(FixedProfile\General Configuration\FileDialog)에 굳음. 자동화가 SetVariable("FILEDIA",0) 후 안 되돌리면 숨김 인스턴스 종료 때 프로파일에 써져 페페 캐드까지 바뀐다(범인 = C:\dev\tools\dwg-flatten\flatten.py finalize·preview → 닫기 전 1 복원 추가). FILEDIA 를 0 으로 내리는 코드는 반드시 닫기 전 1 복원. 복구 = C:\dev\tools\autocad-mcp\set_filedia.py(Session 1 = schtasks /IT + 숨김 vbs).
-5. [페페] 26.10.8 DWG 수정은 도구에만 맡기지 않는다 — 코디/에이전트가 먼저 도면을 읽고 작업계획서(대상·전후 치수·고정 기준·제외·도구 예외 작업 목록)를 쓴 뒤 도구를 돌리고, 도구 plan 결과가 작업계획서와 어긋나면 원인부터 찾는다. 본문 = C:\Users\delix\.claude\skills\dwg-edit\SKILL.md §0 첫 줄.
-4. [코디] 26.10.8 DWG 치수 형상 편집(DispatchEx 별도 인스턴스) 함정 — 회전치수 정의점은 COM 속성이 없고 x방향만 줄이는 TransformBy 는 「균일하지 않게 축척할 수 없습니다」로 거부, 외부 COM→VL.Application entmod 는 nil·멈춤 → 같은 치수스타일·레이어로 새 치수 생성 후 원본 삭제로 우회(핸들 바뀜). schtasks /IT 로 띄운 인스턴스는 「피호출자가 호출을 거부」 재시도 필요. 선례 = 아이파크 107-2802 작은방입구 상부장 460→455(0928 107동2802호_상부장수정.dwg). 다음부턴 도구·스킬로 — 도구 = C:\dev\tools\dwg-edit\(nas 받기/새파일 put · s1run(Session1 schtasks) · dump · stretch plan(창 crossing → move/pts/redo, 건축선 --exclude) · apply_job(대조→적용→치수 재생성→SaveAs 원본버전·measure 재오픈) · render · diff --expect(계획 밖 변경 0 판정) · selftest_all.py --acad), 스킬 = C:\Users\delix\.claude\skills\dwg-edit\SKILL.md(절차·함정·보고 양식). 이번 건을 도구로 재현 = 수동 결과와 변경 34건·새 치수 9개 동일(적용 36초).
-3. 🔑acad-live(열린 AutoCAD COM 같이보기·초안 쓰기) 함정 — 26.10.7~8 [코디] 실측(본문 = C:\dev\tools\autocad-mcp\live.py 머리말 · 페이지 초안 = devplan acad-live).
- 🔴SelectionSet.Select 는 모드(창·crossing·ALL)·필터·결과 0건과 무관하게 페페의 Pickfirst(선택·그립)를 지운다(4→0). SelectionSets.Add/Delete·속성 읽기·Highlight·ActiveSelectionSet 읽기는 안 지운다 → Pickfirst 는 «맨 먼저» 읽고, 페페가 선택 중이면 읽기 검색을 건너뛴다.
- 🔴IAcadDimRotated.Rotation 은 early/late binding 모두 항상 0.0(0.3rad·90° 로 만든 치수도, Measurement 는 각도 반영) → 방향은 bbox 폭/높이 vs Measurement 로 가로/세로를 추정한다. ExtLine1Point 도 회전치수엔 없다(TextPosition 으로 치수선 근사).
- ⚠좌표계가 API 마다 다르다: SelectionSet.Select 창 점 = UCS(WCS 로 넘기면 0건 일치) · ZoomWindow/ZoomCenter 점 = WCS(ZoomCenter Magnify = VIEWSIZE 높이) · VIEWCTR = UCS · UCSORG/UCSXDIR/UCSYDIR = WCS. 창 선택은 «보이는 범위»만 믿을 수 있다(화면 밖 창 = 진실 0건인데 4건) → 화면 밖은 acSelectionSetAll+관계필터(-4, 그룹 10 / LINE 은 11 도).
- ⚠관계필터의 점 값은 VARIANT(VT_ARRAY|VT_R8) 를 VT_VARIANT 배열 안에 중첩해야 한다 — 파이썬 튜플은 E_INVALIDARG.
- ⚠RPC_E_CALL_REJECTED 는 Documents.Add/Open·Activate·ZoomExtents·Regen 직후 아무 호출에서나 난다(별도 인스턴스에서 잦음, 페페 상주 캐드에선 수백 호출 0건). 거절된 호출은 실행되지 않으므로 읽기 툴은 통째 재시도, 쓰기는 «같은 값 재설정» 속성만 재시도하고 Add/Delete 는 재시도 없이 거절 사유를 돌려준다. pywin32 312 엔 CoRegisterMessageFilter 가 없다.
- 🔑미니PC «로컬» VS Code 세션의 Bash·MCP 는 Session 1 — DispatchEx("AutoCAD.Application") 별도 인스턴스가 된다(27~28초, Visible=False, Quit 정상). 아래 -2. 「Bash(Session 0)에선 안 뜬다」는 Remote-SSH 세션 얘기다. 별도 인스턴스 창은 WS_EX_TOOLWINDOW + 화면 밖(-32000) 후 Visible 이면 작업표시줄·화면에 안 뜨고 PrintWindow 캡처는 된다.
- 🔑캡처는 MDI 자식 안 캔버스 창(클래스 Afx:…:28:…, 크기 = SCREENSIZE)을 직접 PrintWindow* → 픽셀 1:1, 오프셋 보정 불필요. 비활성 문서에 COM 으로 쓴 객체는 활성화하자마자 보인다(Regen 불필요). Entity.Highlight(True) 는 화면에 보이고 DB 를 안 바꾼다.
-2. 🔑배치탭 범벅 도면을 모델공간 통합본으로 굽는 길 = EXPORTLAYOUT + -PURGE(2026-09-17 실측, 나진 MH LL-F/UL-C · 스킬 dwg-flatten). 절차·함정 전부 = C:\Users\delix\.claude\skills\dwg-flatten\SKILL.md, 도구 = C:\dev\tools\dwg-flatten\go.py.
- 🔴AutoCAD COM 은 Bash(Session 0)에서 아예 안 뜬다 — DispatchEx("AutoCAD.Application") 가 서버 실행이 실패했습니다(-2146959355). 떠 있는 인스턴스에 GetActiveObject 로 붙는 것만 막히는 게 아니라 새로 띄우는 것도 막힌다. ⛒schtasks /create … /it + 숨김 .vbs(창 0개).
- 🔑EXPORTLAYOUT 산출물은 퍼지 전엔 10배로 부푼다 — xref 원본 블록 정의를 통째로 끌고 들어온다(실측 166.8MB → 퍼지 후 11.6MB, UL-C 38.5→10.0MB). (command "_.-PURGE" "_A" "*" "_N") 을 반드시 붙인다. 퍼지 전후 미리보기 PNG 가 사실상 동일(14,532→14,429 bytes)해서 «안 쓰는 정의만» 빠진 게 확인됐다.
- ⚠-EXPORTLAYOUT(대시 버전)은 없다 → FILEDIA=0 + LISP (command "_.EXPORTLAYOUT" "<경로>"). 큰 도면은 5~20분 걸리고 그동안 산출 파일이 0바이트로 보인다(멈춘 게 아니다 — private 메모리·CPU 로 판정).
- ⚠떠돌이 객체 한두 개(표본 0.3~0.8%)가 도면범위를 10배로 벌린다 → ZOOM EXTENTS 가 콩알만 해진다. ⛒표본 2~98% 구간(=시트 뭉치)으로 ZoomWindow 한 상태로 저장하면 열자마자 도면이 꽉 찬다(지우지 않아도 된다).
- ⚠통합본 검증을 «블록 내부 전수 크롤»로 하지 마라 — COM 왕복이라 수십 분(중단했다). 최상위 엔티티 수 대조(원본 페이퍼공간 ≈ 통합본 모델공간) + $0$ 바인드 xref 레이어 존재 + PNG 육안이 빠르고 확실하다.
- ⚠Block.IsXRef=False 인데 경로 문자열이 남아 있는 블록이 있다(플래그 0) — xref 가 아니다, 경로 교정 대상 아님.
-1. 🔑넥서스 가구도면의 SPECIFICATION 사양표는 「SHEET TITLE」 앵커로 가른다 — 도곽 블록(폼) 좌표는 못 쓴다(2026-09-15 실측, 나진 MH LL-F/UL-C). 폼 INSERT 20개는 전부 xref 쪽 좌표(x≈-50만)에 있어 실제 시트와 안 맞는다. ⛒시트 앵커 = 표제란 텍스트 SHEET TITLE(시트당 정확히 1개, 피치 12600×8910 과 일치). 시트 범위는 앵커 기준 x −10500~+4600 · y −3400~+5510, 시트명은 앵커 오른쪽 3000 · 아래 120~450 의 첫 텍스트.
- 사양표는 시트마다 좌·우 두 벌이다(좌 = 앵커−10500~−500 / 우 = 앵커+1500~+4700). ⚠좌열을 −6200 까지만 잡으면 위치명 칸(가장 왼쪽)이 통째로 잘려 「신발장 사양이 없다」로 오판한다(실측 1회).
- 표 한 행 = y ±35 밴드로 묶고 x 순 정렬. 열 순서 = 위치 → 그룹(몸통/문틀/DOOR) → 부위(몸통 마감·뒷판 자재…) → 값. 값이 라벨보다 40~50 아래에 찍힌 행이 있어 밴드 없이 y 완전일치로 묶으면 값이 사라진다.
- 실물 = C:\dev\_work\najin-color-check\{_dump_dwg,_spec_table,_sheet_one}.py(ODA→DXF→ezdxf, 레이아웃 전체+virtual_entities 2단).
-
🔴도곽이 모델공간에 없으면
detect_frames는 빈손이다 — 페이퍼공간 레이아웃을 봐라(2026-09-08 실측, 용산 나진상가 도면). 넥서스/한샘 계열 가구도면은 모델공간 엔티티 11개, 레이아웃PLAN에 15,164개 로 시트를 전부 페이퍼공간에 깔아둔다(도곽 블록넥서스도면갑지1/폼= 12600×8910 = 1:30 A3, 2배 도곽 25200×17820 = 1:60). 판정 =doc.Layouts별Block.Count비교 1회. - 재사용 방법(도구 코드 안 고침) =frames.detect_frames는doc.ModelSpace만 보므로ModelSpace자리에doc.Layouts("PLAN").Block을 끼운 shim 객체를 넘기면 그대로 돈다. 출력 루프만 페이퍼공간용으로 복제(mlay = doc.Layouts(name)+plot.SetLayoutsToPlot([name]), 나머지 설정·용지선택·ScaleToFit·회전0° 는plot_engine과 동일). 실물 =C:\dev\_work\najin-yongsan\najin_plot.py(31장 A3 PDF 성공). - 시트 선별 = 블록 프레임 중 폭 12000 이상이면 도곽(그 이하는 상세·화살표 블록). 중심 근접 중복 제거는 플러그인과 같은 처방. - ⚠PS1 에 한글 경로를 쓰면 UTF-8 BOM 필수 — BOM 없으면 PowerShell 5.1 이 cp949 로 읽어 경로가 깨지고MISSING <깨진경로>로 조용히 넘어간다(실측 1회 헛돎). -
🔴「파일 열기가 대화상자 대신 명령창으로 주소를 묻는다」 = 시스템변수
FILEDIA=0(2026-08-29 실측, 페페 신고). 대체 글꼴 지정이 명령창으로 뜨는 것도 같은 범인 — 그 대화상자가 파일 선택 대화상자라 FILEDIA 를 탄다. 증상 2개가 원인 1개다. 판정·수정 =PYTHONUTF8=1 python C:/dev/tools/autocad-mcp/set_filedia.py(실행 중이면 붙어서 즉시, 없으면 숨김 인스턴스로 띄워 고치고 정상 종료). 사람이 직접 = 명령행에FILEDIA→1. - 지속 위치는 프로파일이고, AutoCAD 는 정상 종료할 때 쓴다 → 프로세스를 taskkill 하면 안 남는다. 검증은 새 인스턴스를 다시 띄워 시작값을 읽는 것(실측: 재기동 후FILEDIA=1확인). 레지스트리...\R24.3\...\Profiles\<프로파일>\Variables를 뒤져도 FILEDIA 는 안 보인다 — 레지스트리 grep 으로 판정하려 들지 마라. - 범인 조사 = 우리 자산은 무죄로 확인(설치본%LOCALAPPDATA%\pcadtools\*.dll에FILEDIA문자열 0건 · 사용자acaddoc.lsp는 TREAD 재정의뿐). 재발하면 외부 스크립트/LISP 를 의심한다. - 곁가지 정상값(같이 찍힌다) =CMDDIA=1 · ATTDIA=1 · ATTREQ=1 · EXPERT=0.EXPERT가 0 이 아니면 경고 대화상자가 통째로 억제된다. -
⚠AutoCAD COM 은 late binding 함정 2개(2026-08-29 실측). ①시스템변수는 Application 이 아니라 Document 에 있다 —
app.GetVariable/SetVariable은AttributeError,app.ActiveDocument.GetVariable(...)이 맞다. ②app.Quit()은_FlagAsMethod("Quit")를 먼저 해야 호출된다(안 하면AttributeError: AutoCAD.Application.Quit), 그러고도 바쁘면RPC_E_CALL_REJECTED(피호출자가 호출을 거부했습니다)라 재시도 루프 필수. 종료 전Documents.Close(False)로 저장 대화상자를 막는 건 기존 규칙 그대로.