autocad-plot — AutoCAD 도곽 다중 PDF 플롯 (MCP 서버 + 사용자 플러그인)
목표: AutoCAD 도면의 도곽(title-block frame)들을 reading-order로 가로 페이지에 꽉 차게 다중 PDF로 일괄 출력. 만두캐드 다중플롯 대체. 구성(둘은 같은 기능을 각각 구현 — 항상 함께 수정): ① 코디용 MCP 서버(Python/COM) ② 사용자용 네이티브 .NET 플러그인(C#, AutoCAD 안에서 직접). 갱신일: 2026-10-08 (acad-live 확장 추가)
불변 핵심 (경로·설정)
- 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) + 🆕acad-live 8종(cad_context·cad_observe·cad_inspect·cad_view·cad_draft_create·cad_draft_list·cad_draft_commit·cad_draft_cancel =live.py·live_core.py, 26.10.7). 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 (현재 상태)
- 🆕[코디] 26.10.23(금) 17:04 KST ✅ EXEDRA2 최종본 색 원복·교체 — [페페] 「회색 글자 모니터에서 안 보인다 → 원래 색, 최종본 덮어써」.
C:\dev\_work\sohan-exedra2-1023\recolor.py= r3(w\dxf4\r3b.dxf) 색을 핸들 단위로 복사(레이어·치수스타일·전 블록 엔티티·MTEXT·MLEADER, 5108개 불일치 0) + ⑥EP 확정 문구·표제란 4행 유지(4행 = 「최종(원래 색)」) → ODA 2013 → NAS…_최종.dwg(223,538B). 흑백판은EXEDRA2 이전버전\…_최종(흑백).dwg로 rename(삭제 없음). 교훈 = 그레이 250 은 캐드 검은 배경에서 안 보인다 → 흑백 요청은 PDF 출력용(플롯 스타일 monochrome.ctb)으로 풀 것, 도면 색 자체는 건드리지 말 것. - 🆕[코디] 26.10.23(금) 17:00 KST ✅ EXEDRA2 최종본 + NAS 정리 —
\\192.168.0.101\공유폴더\2026현장\진행중\10월\한샘 소요 한남 2차\포인 정리본_한샘 넥서스 소요 한남 EXEDRA2 도어,몸통보링도(26.10.23)_최종.dwg(223,574B·2013·왕복대조) = r4 + 표제란 4행(ezdxfC:\dev\_work\sohan-exedra2-1023\final.py3행 복사 y−125 → ODA 2013, AutoCAD PDF 플롯 육안 OK). 이전 버전 → 하위폴더EXEDRA2 이전버전\(rename, r4·.bak) · ⚠10.06 정리본·r2·r3 은 16:3x~16:55 사이 최상위에서 이미 사라짐(하위폴더 어디에도 없음 · 같은 때 POINIMOS01/poinpc 가 r4 를 열었음 = 사무실 쪽 정리로 추정). [페페] 비교용으로 KOFA 원본원본\…(26.10.06).dwg사본을 최상위에 put(원본 폴더 그대로). devplan 이미지final_s1_*.png교체·허브 카드 갱신. [페페] 질문 「도어 517?」 = 2070÷4=517.5 는 틈 0 값, 틈 3×5·양끝 3.5×2 빼면 512(확정값 유지). - 🆕[코디] 26.10.23(금) 16:33 KST ✅ EXEDRA2 r4 NAS 저장
…(26.10.23)_r4.dwg(223,443B·2013·왕복대조) — [페페] 그레이스케일(레이어 7·CODY 250·전 블록 ByLayer·치수스타일 색 ByLayer·글자 \C→250) + ⑥EP 전면 확정(앞뒤 보링 동일). 방식 = ezdxfC:\dev\_work\sohan-exedra2-1023\gray.py→ ODA 2013(COM 객체별 색 변경은 1초/개라 45분+ → 중단). [코디] ⑦프레임EP = ②측판(SPI) 쪽 프레임 바깥면에 나사 고정 판단(측판 앞64·뒤17 Ø2.5 열 = 프레임 고정, EP엔 프레임 보링 없음 · SALICE 매뉴얼 p37). ⏳ devplan 페이지 이미지 r4(흑백)로 교체·표제란 4행 미기입. - 🆕[코디] 26.10.23(금) 14:10 KST ✅ EXEDRA2 r3 NAS 저장
…(26.10.23)_r3.dwg(231,596B·왕복대조) — [페페] ①도어 0.25 = 갭빼기(파트도 512.25 그대로 → 생산 512 문구) ②전면(앞) 표시: 1번 평면·2번 천판 「△ 전면(앞)」, 7번 EP 「◁ 전면(앞)(검토 중)」(3번 측판 원도면 「◁ 전면」 방식) ③표제란 3행 · 도어2 가공표 상자 아래로. ⏳[페페] ⑥EP 앞 방향 검토 · 도면 확인. 잡 =C:\dev\_work\sohan-exedra2-1023\r3_job.py·fix3_job.py. RPC 끊김 1회(재시도 통과). - 🆕[코디] 26.10.23(금) 09:54 KST ✅ EXEDRA2 r2 NAS 저장
\\192.168.0.101\공유폴더\2026현장\진행중\10월\한샘 소요 한남 2차\포인 정리본_한샘 넥서스 소요 한남 EXEDRA2 도어,몸통보링도(26.10.23)_r2.dwg(231,566B·2013·왕복대조) — [페페] 도어3 200 복귀·도어 512(양끝 3.5)·평면 위 치수 3줄(180/2030/180 · 200/2070/200 · 2470, 글자 = 기존 치수스타일 사본 충환)·포켓 「숨는공간 180」 · dwg-edit 계획 move29·pts24·redo22 → diff 계획 밖 0 · 마무리 COM 잡C:\dev\_work\sohan-exedra2-1023\finish_job.py(새 치수·문구·①MLEADER 오른쪽 재생성·범례 상자·표제란 2행) · 도어 파트도 형상 512.25 유지(확인필요 5) · EP 앞=오른쪽 추정(확인필요 4). devplan 페이지 최종본 갱신. - 🆕[코디] 26.10.23(금) 소요한남 EXEDRA2 가공도 r2 준비(월드발주서 r5 8~14번 반영) — 확정: [페페] ①②천판·측판 785(벽 타일로 축소, 뒤 타일 여유 10 → 벽까지 795) · 두께 20 유지(18T+무늬목 1.4~1.8 → 생산 정수 20) · ③도어3 220(몸통 기준 철물 고정, 판끝 기준 +20) · ⑥숨은EP 795(앞 기준, 뒤 포켓 71.75) · 새 파일
포인 정리본_…(26.10.23)_r2.dwg. [코디] SALICE StarLPU=TL1+280= 792.25 ≤ 795 여유 2.75(상부 레일 792.25 유지·천판 뒤 7.25 돌출 조건) · 200 복귀+도어 +10 = 802.25 → 7.25 부족(불가). 도어3 조건 비교 페이지 devplanC:\dev\devplan\sohan2-exedra2-door3-cases.html. ⏳[페페] 도어3 턱 10→30(C안) 확정 후 DWG 작업 착수 · 작업 폴더C:\dev\_work\sohan-exedra2-1023\. - 🆕[코디] 호출명 「캐드라이브」(페페 26.10.8) — acad-live — 열린 AutoCAD 실시간 같이보기·읽기·치수/문자 초안 쓰기 MVP(26.10.7~8, [코디] worker-opus-xhigh · 시험 통과 · ⏳[페페] 실사용 1회)**.
- [페페] 26.10.7 그릴링 확정: Q1 쓰기 = 열린 원본 도면 메모리만, 코디 Save/SaveAs/QSAVE 금지, ReadOnly 거부 · Q2 기존 autocad-mcp 확장(새 MCP 금지) · Q3 기본 = 페페가 화면, 코디는 캡처·뷰 범위 읽기·Pickfirst 읽기, 필요시·지시시 줌·탭 전환 허용(복원 토큰 — 이후 페페가 바꾼 뷰는 안 덮음) · Q4 선택 객체 기준 계산 기본 + «말로만 지시»(후보 여럿이면 목록 반환 후 지정), UCS→WCS 필수, GetPoint 금지 · Q5 레이어
CODY_초안(자홍) + 스타일은 주변 객체, 「확정」=원래/지정 레이어, 「취소」=핸들 원장으로 코디 객체만 삭제(Undo 의존 금지) · Q6 미니PC 로컬 Session1 전용. - [코디] 구현:
C:\dev\tools\autocad-mcp\live.py(COM) ·live_core.py(순수 로직) ·server.py도구 8개 ·autocad_com.py(치수·속성 인터페이스 매핑 + 스레드별 연결 캐시). 원장 =%LOCALAPPDATA%\cody-acad-live\ledger.json(op_id·문서키(FullName+FINGERPRINTGUID)·핸들·서명·목표레이어·보류색) + XDataCODY_DRAFT, 캡처 =%LOCALAPPDATA%\cody-acad-live\shots\(최근 40장), 쓰기 직렬화 = named mutexLocal\cody_acad_live_write. - 안전장치: 쓰기 = mutex → IsQuiescent → FullName 정확 일치(안 열린 경로는 열지 않고 거절) → ReadOnly 거부 → 문서 토큰(FullName+공간+UCS) 재검증 → 모델공간만 → Add* 재시도 없음 → Handle 로 되읽어 XData 확인. 읽기 = 거절(RPC_E_CALL_REJECTED) 시 툴 통째 재시도. 초안 색은 ByLayer(자홍) → 확정 때 기준 치수 색 적용. 취소는 XData·서명 교차확인 — 페페가 옮기거나 지운 게 있으면 아무것도 안 지우고 멈춤.
- 검증: self-check
C:\dev\tools\autocad-mcp\test_live_core.py12/12 · 통합C:\dev\tools\autocad-mcp\_live_itest.py(DispatchEx 별도 인스턴스 + 새 도면, UCS 원점 페페 도면과 동일) 30/30 — 실도면 한국유리부지(16,125객체)를 별도 인스턴스에서 «읽기전용»으로 열어 읽기 도구·RO 거절까지. MCP stdio 핸드셰이크 = 도구 16개. 페페 도면엔 쓰기 0(쓰기 시험은 전부 별도 인스턴스). - 확인필요 4건 실측: ① Pickfirst 외부 포커스 읽기 = 된다 — 단 SelectionSet.Select 가 지운다(아래 rules) ② 비활성 탭 쓰기 후 Regen = 불필요 ③ DispatchEx 별도 인스턴스(Session1 일반권한) = 된다(27~28초) ④ Entity.Highlight 가리키기 = 화면에 보인다(DB 불변).
- ⚠ 26.10.8 00:03 경 페페 AutoCAD 가 정상 종료돼 있었다(NAS 잠금파일 .dwl 정상 삭제·크래시/행 이벤트 0·dwg mtime 10-02 그대로 = 미저장 편집 DBMOD 49 는 저장 안 됨). 코디 시험 시작 전이라 무관 — 그 전 코디 접근은 읽기 프로브뿐.
- devplan: 허브 카드
acad-live(ub=autocad-plot, url 비움) 등록. 상세 페이지 초안은 ruleguardweb-designer-required가 서브에이전트의 상담을 못 봐서(부모 transcript 만 읽음) 배치 못 함 → 초안 = 코디 스크래치devplan-draft\acad-live.html, 메인 세션 상담 후C:\dev\devplan\acad-live.html배치 + projects.json url + pagelinks TREE 1줄 필요. - ⏳ 남은 일: [페페] 실사용 1회(새 세션에서 페페 도면에 초안 1개 → 확정/취소 눈확인) · 실제 마우스 선택 상태 Pickfirst 읽기 1회 · MVP 밖 = 페이퍼공간 쓰기·지시선·블록 안 일반 문자·사선 치수 쌓기.
- 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].