VIT — 011

M5 — תיקון אוטומטי בעת Reload של DWG

Vitruvius · DocumentChanged → ExternalEvent → RunSilently · סשן 0027 · v1.0

A
B
C
D
Trigger
מקור השינוי · אדם או קוד
היועץ דורס את ה-DWG
קובץ בדיסק נכתב מחדש · mtime מתעדכן
Manage Links → Reload
המשתמש מבקש מ-Revit לקרוא את הקובץ המעודכן
Revit מצית DocumentChanged
CADLinkType modified · main thread · בתוך event subscription
Loop נוסף אפשרי
גם cadType.Reload() שלנו ב-RunPipeline יורה את אותו event
DwgReloadHandler · OnDocumentChanged
בתוך ה-event · אסור לשנות מסמך
DwgReloadHandler
IExternalEventHandler · נרשם ב-VitruviusApp.OnStartup
ElementClassFilter(CADLinkType)
e.GetModifiedElementIds(filter) — מוריד עשרות IDs לפריט בודד
VitruviusStateCache.Get(path)
state.json — %APPDATA%\Vitruvius\ · רק קישורים שתוקנו בעבר
mtime guard
File.GetLastWriteTimeUtc(path) > entry.FixedAt — בלבד אם הקובץ נכתב אחרי התיקון האחרון שלנו
_pendingPaths · Raise()
buffer של נתיבים + ExternalEvent.Raise() — מתור ל-idle ולא רץ מיד
Idle · Execute(UIApplication)
מחוץ ל-event · מותר לשנות מסמך
ExternalEvent.Execute
Revit מתקשר חזרה ב-idle loop · main thread · context בטוח
snapshot + clear
מעתיק _pendingPaths ומנקה — events חדשים שיגיעו אח"כ ייצרו Raise חדש
FixGibberishCommand.RunSilently
scan פנימי · סינון ל-paths המבוקשים · RunPipeline בלי דיאלוג
RunPipeline
fontmap blanket → ShxArchive → DxfReverser / DwgReverseService → CADLinkType.Reload
cache.Record(path, ...)
אחרי כתיבת הקובץ → FixedAt = UtcNow > mtime · זה מה שמכבה את ה-loop
Result
תוצר נראה למשתמש
VitruviusToast
"תוקנו אוטומטית X קישורים שעודכנו" · 3s · לא-מודאלי
Revit מרנדר עברית קריאה
DXF/DWG מהופך · fontmap → Vitruvius Hebrew Visual TTF
state.json עודכן
FixedAt חדש > mtime → Reload-echo הבא יסונן ב-guard
החשש של היועץ פתור
אין צורך בלחיצה ידנית · עדכון מהיועץ מתוקן תוך ~5 שניות
🛡 LOOP PREVENTION — mtime > FixedAt
ה-pipeline שלנו עושה cache.Record אחרי שה-DxfTextReverser/DwgReverseService כתבו את הקובץ. FixedAt = UtcNow בנקודה הזאת הוא תמיד גדול מ-File.GetLastWriteTimeUtc(path) של אותו קובץ. כש-cadType.Reload() שלנו יורה את DocumentChanged הבא, ה-handler יראה mtime ≤ FixedAt ויסנן החוצה. רק כתיבה חיצונית (היועץ דורס) שמדחפת את ה-mtime מעבר ל-FixedAt הישן — מצליחה לעבור. בלי ה-guard: Reload תכנותי → DocumentChanged → re-fix → Reload תכנותי → ... לולאה אינסופית.
Trigger (אדם/קוד)
בתוך event (read-only)
Idle (mutation מותרת)
תוצר משתמש
Guard (מונע loop)
Project Vitruvius
Drawing M5 Flow Diagram
Subject Auto Re-fix on DWG Reload
Session 0027
Ref. No. VIT — 011
Vitruvius Design Language · 2026