autocad-plot — AutoCAD 도곽 다중 PDF 플롯 (MCP 서버 + 사용자 플러그인)
목표: AutoCAD 도면의 도곽(title-block frame)들을 reading-order로 가로 페이지에 꽉 차게 다중 PDF로 일괄 출력. 만두캐드 다중플롯 대체. 구성(둘은 같은 기능을 각각 구현 — 항상 함께 수정): ① 코디용 MCP 서버(Python/COM) ② 사용자용 네이티브 .NET 플러그인(C#, AutoCAD 안에서 직접). 갱신일: 2026-06-24
불변 핵심 (경로·설정)
- MCP 서버 =
C:\dev\tools\autocad-mcp\(server.py/frames.py/plot_engine.py/autocad_com.py/constants.py). 등록 =.claude.jsonmcpServersautocad-plot→Python312\python.exe C:\dev\tools\autocad-mcp\server.py(2026-06-23 tools/로 이동·경로 갱신). 도구 8종(acad_status·list_open_drawings·list_plot_devices·get_canonical_media_names·detect_frames·frames_for_block·frames_for_layer·plot_frames). Python 3.12 전용(pywin32·mcp·pypdf). 새 코드는 다음 세션 로드. - 사용자 플러그인 =
C:\dev\autocad-plot-plugin\AcadPlotPlugin_decompiled\(소스, 배포DLL 디컴파일 복원본) +mdplot installer\(설치본). 명령 MDPLOT/MDPLOTAUTO/MDPLOTNAME/MDPLOTSIZE/MDNAMES/MDDEVICES/MDPALETTE. 구버전 백업 =C:\dev\backups\autocad-plot-plugin_*. - 자동로드(이 미니PC): AutoCAD가 로드하는 실체 =
%LocalAppData%\MDCAD\AcadPlotPlugin.dll. 레지스트리HKCU\...\AutoCAD\R24.3\ACAD-7101[:412]\Applications\MDCAD(LOADER=그 경로·LOADCTRLS=0x2 시작자동로드·MANAGED=1), TRUSTEDPATHS에%LocalAppData%\MDCAD포함(무경고). DLL 교체는 AutoCAD 종료 상태에서. - 빌드:
.NET SDK(미니PC=8.0.422 사용자영역%LocalAppData%\Microsoft\dotnet, dotnet-install로 설치).dotnet build AcadPlotPlugin.csproj -c Release→bin\Release\AcadPlotPlugin.dll. csproj 참조 HintPath는 PC별 AutoCAD 버전으로 조정(이 PC=2024, 사무실 크로스버전=2016). net48/x64.
NOW (현재 상태)
- MDPLOT 선택 하이라이트 강화(2026-06-25, 빌드·배포 완료·사용자 눈확인 대기): 페페 요청="출력물 블록 선택 시 하이라이트 강조 + 지정 해제 시 해제, 형태는 기존 '출력할 블록 하이라이트'(노란 테두리)와 동일". 질문 후 둘 다 채택. ① 1단계(도곽 종류 지정) 토글: 이미 지정한 종류를 다시 클릭하면 지정 해제 + 그 종류 하이라이트(노란 테두리+
Highlight()) 제거(기존=재클릭 무동작). ② 2단계(범위 드래그 선택) 하이라이트: 선택에 들어오는 '지정 종류 일치' 블록에 동일 노란 테두리 강조, Shift+클릭 등으로 빠지면 즉시 제거. 추적을Dictionary<ObjectId,Polyline>(1단계hi·2단계selHi)로 통일, 공통 헬퍼AddHi/RemoveHi+AddFrameMark(반환형)+EraseFrameMark. 함정(reflection 실측):SelectionAdded/SelectionRemoved는PromptSelectionOptions가 아니라Editor(문서 전역) 이벤트라GetSelection동안만 구독/해제(finally); EventArgs의AddedObjects/RemovedObjects는ObjectId[]가 아니라SelectionSet→.GetObjectIds().Commands.cs1파일,dotnet build -c Release0오류(39424B),%LocalAppData%\MDCAD\+installer\배포(백업backups/autocad-plot-plugin_dll_20260625/{live,installer}-old). ⚠1·2단계 하이라이트가 같은 블록에 겹칠 수 있음(테두리 동일좌표라 시각 무해). 잔여=AutoCAD 재시작 후 MDPLOT 눈확인(헤드리스 검증 불가, 빌드/API는 실측 확정). - ✅ 전부 정상 작동 사용자 확인 완료(2026-06-24 #6): 방향(#4)·중복인쇄·과대하이라이트·프린터(#5) 모두 사용자 "정상" 확인. 프린터 첫 로딩 지연 최적화는 취소(지연=윈도우 드라이버·스풀러 콜드 초기화로 AutoCAD 밖 영역, 플러그인은 대화상자에서 드라이버 선워밍 이미 함; 안전한 큰 최적화 없어 잘 도는 출력코드 리스크 회피. 더 빠른 길=PDF를 프린터로 전송). autocad-plot 다중플롯 안정화 완료.
- 후속수정 #5 중복인쇄·과대하이라이트·프린터(2026-06-24, 완료·확인됨): COM 진단으로 원인 확정. ① 중복인쇄=도면이 한 자리에 도곽 블록 2개씩 겹침(중심 44곳×2)→
FrameFinder.FramesFromIds중심근접 dedup(IsDuplicate). ② 과대 하이라이트=같은 이름 더 큰 묶음도곽(21002×14850·6개)을 이름매칭이 끌어옴→Matches를 '크기 있으면 같은 크기만'. ③ 프린터=기본프린터('관리자')는 치수있는 가로A3 제공(420×297 확인, OrientedMedia 이미 동작)이나 'Default Windows System Printer'류는 'A3'만→OrientedMedia outchosenLandscape+물리프린터는 PlotRotation=90 보정(PDF는 회전금지). 빌드0오류 DLL 37888B 배포. ⚠ 물리인쇄·MDPLOT 중복제거는 사용자 눈확인 필요. 진단=_diag_blocks.py(삭제). - 방향 근본해결·라이브검증 완료(2026-06-24 #4, 최종): 코디가 COM으로 실제 B14 도면 열고 PyMuPDF로 검증. 도곽=가로 시트(12599×8909 √2; 앞서 '세로'로 본 건 회전된 출력 착시). DWG-To-PDF는 세로(297x420)·가로(420x297) A3 canonical 둘 다 제공. 검증: 가로 canonical+회전0 = 가로 페이지+내용 똑바로(MATCH, 4장 1191×842 꽉참). 근본원인=코드가 목록 첫 A3(세로)를 골라 가로 도곽이 세로 용지에 얹혔고 회전90으로 보정하다 눕혔던 것. 수정=도곽 방향에 맞는 canonical 선택+회전0(둘 다): MCP
_size_variants+루프 per-frame(라이브 PASS), 플러그인OrientedMedia+Degrees000+MatchEnabled(빌드0오류, DLL 37376B 배포). 잔여=사용자 MDPLOT로 PDF·프린터 눈확인(플러그인 PlottingServices 경로는 직접검증 불가, 레시피는 장치레벨 검증됨). 폴백 DLL=backups\...live-old. - ~~MatchEnabled 복원 #3~~: 부분진단(맞으나 불완전). 위 #4가 진짜 원인(canonical 방향 선택)까지 해결. 실측=도면 내용 자체가 세로(content 524×741 ratio 0.71, 전 페이지)→사용자는 세로 출력을 원함. 발견: 페이지 박스 방향은 회전이 결정하는데 DWG-To-PDF는 회전0°=세로 정규화, 물리 프린터는 회전0°=가로 정규화(장치별 반대)→회전제거만으론 PDF만 세로, 프린터는 여전히 가로. 진짜 원인=
PlotInfoValidator.MediaMatchingPolicy가 원본MatchEnabled(용지를 도곽 방향에 자동정렬)→(MatchingPolicy)2(자동정렬 안 함)로 바뀐 것. 수정=① 회전 항상 0°(plugin+MCP) ② pluginMediaMatchingPolicy=MatchEnabled복원. 효과 예상: PDF=세로, 프린터=세로 자동정렬. dotnet build(0오류)→배포. ⚠ 라이브 검증 실패(코디 programmatic acad.exe 실행=플러그인 자동로드 안 됨+MCP ROT 비가시) → 사용자가 AutoCAD 재시작 후 MDPLOT 눈확인 필요. ⚠ PDF '출력 오류'=직전 PDF 뷰어 열림→파일 잠김 추정(재출력 전 닫기). 폴백=원본 DLLC:\dev\backups\autocad-plot-plugin_dll_20260623\AcadPlotPlugin.dll.live-old. - 회전 정책 폐기 — 세로(0°) 기준 환원 완료(2026-06-24 #2, 최종): 사용자 실측 PDF(47p) 확인=1p 세로용지+가로내용, 2p~ 가로용지+내용 옆으로 누움 → 전 페이지 용지·블록 불일치. 2026-06-23 PlotRotation=90° 가로화는 오판이라 전면 제거. 근본원인=도곽 window를
(landscape && w>=h)?90:0로 프레임마다 회전 → w≥h 프레임이 옆으로 눕고 페이지 방향 들쭉날쭉. 수정=회전 항상 0°. ScaleToFit+미디어매칭이 용지를 프레임 자연방향에 맞추므로 회전 0이면 각 장이 똑바로 서서 용지와 일치(페이지 방향은 섞일 수 있으나 각 장 정상). 플러그인Plotter.cs=SetPlotRotation(Degrees000)고정, MCPplot_engine.py_rotation_for=항상 0°(둘 다 회전 안 함, 동기화). 빌드(0오류)→%LocalAppData%\MDCAD\+installer\배포. 잔여=AutoCAD 재시작 후 MDPLOT로 PDF·프린터 재출력 눈확인(autoload 적용). PyMuPDF 진단=tools/autocad-mcp/_pdfcheck/. - ~~프린터 PDF/프린터 분리(2026-06-24 #1)~~: 폐기됨 — 위 #2가 회전 자체를 제거(분리 불필요).
- 가로 '꽉참' 출력 버그 근본수정 완료(2026-06-23, 비전 실측): 증상=용지 세로·내용만 회전·안 꽉참. 실측 확정=① canonical 용지명의 W×H 순서로는 페이지 방향이 안 바뀐다(AutoCAD가 A3 등 표준규격을 세로로 정규화) ② 세로 A3 용지 명시 + PlotRotation=90° → A3 가로 페이지 + ScaleToFit 꽉참(PyMuPDF 렌더로 확인). 정책=용지는 '크기/종횡비'로만 고르고(명시 없으면 A3) 방향은 회전으로 맞춤.
- MCP:
plot_engine.py_choose_media(A3 기본)+_rotation_for(도곽 폭≥높이면 90°, 프레임별)+PlotRotation/PaperUnits스냅샷복원.plot_frames(landscape=True). 비전검증 PASS(GS오산 도곽→A3 가로 1191×842pt 꽉참). - 플러그인 DLL:
Plotter.csApplyMediaAndOrientation+ChooseMedia(MCP와 동일 로직). 미니PC에서 빌드(0오류)→자동로드 경로 교체→자동로드 검증 PASS(로드로그PluginApp.Initialize신규기록). - 미결/주의: DLL의 PlotEngine 출력 자체 비전테스트는 MDPLOTSIZE가 동일크기 전량출력이라 생략(로직은 MCP 비전검증과 동일) → 실사용 MDPLOT 1회 눈확인 권장. 2024 빌드라 2016 직원PC 배포는 사무실 2016 재빌드 별개.
함정DB
- PDF 출력 검증 = PyMuPDF(fitz)로 렌더→이미지 Read (진단 하니스
tools/autocad-mcp/_diag_orientation.py보존). AutoCAD COM 일시거부(RPC_E_CALL_REJECTED)는call_with_retry로 흡수. MCP 도구는 stdout 금지(JSON-RPC). 빌드는global using때문에 레거시 csc 불가→.NET SDK 필요.
관련
- 메모리 [[autocad-mcp-plot-server]]. 루트
HANDOFF.mdNOW에 세션 경과. 별개 프로젝트: [poincad].