בלי M5, התרחיש הזה שובר את הזרימה:
אדריכל לא ילך אחורה לכפתור בכל פעם. M5 מבטל את הצעד הזה לגמרי.
RunSilently(doc, paths) כדי שגם ה-handler האוטומטי יוכל לקרוא לו, לא רק הכפתור.DocumentChanged, ב-shutdown משחררים.DLL גדל מ-54KB ל-59KB. שום שינוי ב-UI שאתה רואה — רק יוצא לדרך לבד כשצריך.
DocumentChanged שאומר "ה-CADLinkType הזה השתנה".CADLinkType (בלי הרעש של כל אלפי האלמנטים שמשתנים בעת רינדור).mtime של הדיסק מול FixedAt שב-cache. רק אם mtime > FixedAt — היועץ דרס. אחרת — זה הקובץ שלנו, מתעלמים. (ראה למה זה קריטי בהמשך.)ExternalEvent.Raise(). זה לא מריץ כלום עכשיו — רק שם בתור.Execute שלנו. כאן מותר לשנות את המסמך.FixGibberishCommand.RunSilently — fontmap, ארכוב SHX, היפוך עברית, ועושה Reload תכנותי על הקישור.FixedAt ל-now. צץ ה-toast: "תוקנו אוטומטית X קישורים שעודכנו". סה"כ ~5 שניות מ-Reload עד "נגמר".ה-Reload התכנותי שאנחנו עושים בשלב 8 — גם הוא יורה את DocumentChanged. בלי שום הגנה, היינו נכנסים ללולאה כזאת:
Revit היה קורס תוך 30 שניות, או שהמשתמש היה מקבל "טוסט סיים" אינסופי.
הצינור עושה cache.Record אחרי שכתב את הקובץ.
אז FixedAt תמיד מאוחר יותר מ-mtime של הקובץ שלנו.
כש-DocumentChanged יחזור מה-Reload התכנותי שלנו, ה-handler יראה
mtime ≤ FixedAt ויפסיק שם. לא יחזיר. הלולאה נשברת.
רק כתיבה חיצונית (היועץ) שדוחפת את ה-mtime קדימה מעבר ל-FixedAt הישן — עוברת. בדיוק מה שרצינו.
Revit אוסר על שינוי המסמך מתוך אירועי DB.Events. אם תקרא ל-cadType.Reload() בתוך ה-DocumentChanged callback ישירות, אתה מקבל exception ובאיזשהו מקום למעלה במחסנית התוכנית קורסת.
הדפוס המאושר של Revit הוא ExternalEvent:
Execute(UIApplication) שלנו.זה גם הסיבה שיש _pendingPaths כ-buffer — בין הצתת האירוע לבין הריצה בפועל יכולים לעבור כמה אירועים, וצריך לאסוף את כולם למקום אחד.
אם משהו השתבש — לוג ב-%APPDATA%\Vitruvius\diagnostic.log מראה כל תג של reload.detect / reload.skip / reload.exec.
M6 — UI מלא. כרגע יש כפתור אחד (SplitButton) עם dropdown. M6 הוא: ScanResultsWindow, SettingsWindow, RestoreWindow מעוצבים — חוויה מקצועית במקום TaskDialog. אומדן: 2-3 ימים.
אחרי M6: M7 update checker · M8 license stub · M9 installer · M10 tests · M11 בטא.