Skip to content

feat(labs): chấm tự động lab L02–L06 trên AutoCAD thật - #32

Merged
Tmphi merged 2 commits into
mainfrom
feat/lab-grader
Oct 15, 2026
Merged

Tmphi merged 2 commits into
mainfrom
feat/lab-grader

Conversation

@Tmphi

@Tmphi Tmphi commented Oct 15, 2026

Copy link
Copy Markdown
Owner

Phần còn lại của GĐ2 (bài tập chấm tự động): bộ chấm cho lab L02–L06 của T10, chạy trên AutoCAD thật bằng accoreconsole /isolate (không đổi thiết lập AutoCAD của máy).

.\labs\run-lab.ps1 -Lab L02          # chấm bài làm
.\labs\run-lab.ps1 -Solution         # chấm lời giải mẫu (người bảo trì)
.\labs\run-lab.ps1 -SaveSample       # lưu bản vẽ mẫu ra labs\out\lab-sample.dwg

Có gì

  • labs/L02…L05/: file bài làm có sẵn chữ ký và TODO. labs/LoiGiai/: lời giải mẫu. labs/Grader/: lệnh chấm LAB_GRADE_*. labs/run-lab.ps1: build, chạy từng phiên accoreconsole, in [PASS]/[FAIL]/[SKIP] kèm lý do.
  • 20 kiểm tra:
    • L02: layer; đếm theo DxfName mà không mở entity nào (đọc Transaction.GetAllObjects()); tên thật của dynamic block *U…; không có gì mở ForWrite; Layout1.
    • L03: mỗi thí nghiệm một phiên riêng, kiểm rằng code tái hiện đúng hiện tượng.
    • L04: prompt thật, UCS xoay 30°; kiểm toạ độ WCS và kiểm rằng không prompt khi đang mở transaction (event PromptingForPoint).
    • L05: DOOR đã chỉnh, không chọn nhầm WINDOW; OnLayersExact (B-17).
    • L06: RemoveMetadata Erase Xrecord (B-09).
  • CadContext thật chạy trong accoreconsole nhờ shim cho GetAcadDocument (COM của AcMgd, chỉ dùng để gom Undo).
  • Bản vẽ mẫu: accoreconsole không có Block Editor để tự dựng dynamic block, nên DOOR/WINDOW được chép từ bộ dynamic block mẫu cài cùng AutoCAD. Vì vậy bản vẽ không nằm trong repo. Máy không có bộ mẫu thì các kiểm tra cần chúng báo SKIP.
  • L05 phần 2, L06 (sửa code v1.0.0): làm trong một git worktree, chấm từ repo chính bằng -FrameworkRoot <worktree>.

Phát hiện khi làm (đã sửa tài liệu)

  • Sửa đối tượng mở ForRead không ném exception. AutoCAD dừng hẳn: INTERNAL ERROR: !dbobji.cpp@8668: eNotOpenForWrite. Đã thử gán ColorIndex, AppendEntity, Erase. GetObject trên transaction đã Dispose cũng vậy: FATAL ERROR: Unhandled Access Violation. T01 §4.2, T03 B2 và T10 L03 trước đây ghi là exception, nên học viên làm theo sẽ làm sập AutoCAD đang dùng. Giờ các trang đó ghi đúng hành vi, và hai thí nghiệm chạy qua runner.
  • T10 quy tắc 6 không làm theo được. Quy tắc này bảo chép tests/integration/HeadlessLab/ sang v1.0.0. Làm vậy thì HeadlessLab không biên dịch được (thiếu file framework mới), và plugin v1.0.0 báo 4 lỗi vì csproj cũ biên dịch nhầm nó vào plugin. Đã thay bằng cách làm qua worktree.
  • Crash của accoreconsole mở hộp thoại Error Report (CER, senddmp.exe). Runner đóng đúng hộp thoại do phiên của nó mở, nên không gửi gì cho Autodesk.
  • Script hết dòng mà lệnh còn chờ nhập thì accoreconsole crash nếu stdin đóng. Runner giữ stdin mở, nên trường hợp này thành hết giờ có báo lỗi rõ.

Đã kiểm (AutoCAD 2024, accoreconsole)

  • Lời giải mẫu: 20/20 đạt. Code khởi đầu: 17 kiểm tra của L02–L05 phần 1 đỏ hết. 3 kiểm tra framework xanh trên main (lỗi đã sửa ở PR fix: resolve the technical backlog (B-01…B-29) + HeadlessLab on real AutoCAD #6); trên worktree v1.0.0 thì đỏ, áp bản sửa thì xanh.
  • 16 bài làm sai mà trông hợp lý (đếm bằng GetObject, br.Name, LayerTable ForWrite, ModelSpace thay cho CurrentSpace, Commit ở TN1, ForWrite ở TN2, chỉ đọc thuộc tính ở TN3, LockDocument ở TN4, Execute nối tiếp ở TN5, không đổi màu ở TN6, không đổi UCS → WCS, bản thô có đổi hệ, prompt trong Execute, hỏi thừa một điểm, filter thiếu `*U*, không lọc lại theo tên thật): cả 16 đều bị bắt, đúng kiểm tra, đúng lý do.
  • Bản vẽ mẫu lưu ra DWG 2018 (AC1032), chấm lại trên chính file đó: đạt. Nhánh SKIP: thử bằng cách tạm đổi tên file mẫu.
  • Dự án sinh từ template (--IncludeDemos false, hive tạm): plugin build sạch, lab build cả hai bản, chấm L02 và L03-TN5 đạt.
  • Repo: CadCoreFramework.sln Release -warnaserror 0 cảnh báo; 376/376 test (net48 và net8). labs/Labs.csproj Release -warnaserror, cả code khởi đầu lẫn lời giải. Job docs: link, ⏱, mermaid, code mẫu, bài tập đều 0 lỗi. Workflow và dependabot.yml qua schema SchemaStore.

Chưa kiểm

  • AutoCAD có giao diện: chưa thử NETLOAD labs\bin\Debug\net48\CadCoreFramework.Labs.dll và các lệnh TRAIN_DUMP, TRAIN_DOORS, TRAIN_LINE2P, LAB_SAMPLE (labs/README "Thử tay trong AutoCAD"). training/README ghi rõ mục này là chưa thử.
  • Hành vi fatal error của TN2/TN3 mới thấy trên accoreconsole. Tài liệu chỉ khẳng định cho accoreconsole.

🤖 Generated with Claude Code

tranminhphitmp-create and others added 2 commits October 16, 2026 01:26
- labs/: starter files (L02–L05), reference solutions (LoiGiai/), grader
  commands and run-lab.ps1. 20 checks; the real CadContext runs headless
  through a GetAcadDocument shim.
- Sample drawing (LAB_SAMPLE / -SaveSample) with dynamic blocks cloned from
  the Autodesk sample set installed with AutoCAD; SKIP when it is missing.
- L05 part 2 and L06 grade v1.0.0 code from a git worktree (-FrameworkRoot).
- Runner closes the CER dialog its own crashed session opened, and keeps
  stdin open so an extra prompt times out instead of crashing.
- Docs: modifying a ForRead object and GetObject on a disposed transaction
  abort AutoCAD (fatal error), they do not throw; fix T01, T03, T10. Drop the
  T10 rule-6 advice to copy HeadlessLab onto v1.0.0 (it does not build).
- CI builds labs (starter + solutions); Dependabot scans /labs; plugin
  excludes labs\**.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In a multi-line pwsh step only the last command's exit code decides the
step result, so a broken starter build was masked by a passing solutions
build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Tmphi
Tmphi merged commit 6c48e8f into main Oct 15, 2026
2 checks passed
@Tmphi
Tmphi deleted the feat/lab-grader branch October 15, 2026 23:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants