# סיכום סשן — 0021
תאריך: 2026-05-22 09:30
אפליקציה: Vitruvius
נושא: M3 — FontRecommender + shxfontmap.txt patching (הקוד תקין, ה-fix לא עובד)

## מה נבנה/הושלם
### Core
1. **`src\Vitruvius.Core\Fonts\FontRecommender.cs`** — טבלת המלצות SHX→TTF פנימית. API:
   - `FontRecommendation { ShxFont, RecommendedTtf, Confidence, Reason }` — immutable
   - `enum RecommendationConfidence { None, Low, Medium, High }`
   - `Recommend(string shxFontName)` → תמיד מחזיר אובייקט (לעולם לא null); כשאין mapping → `RecommendedTtf=null, Confidence=None`
   - `RecommendAll(IEnumerable<string>)` → רשימה ממוינת
   - טבלה: 13 mappings — txt/txtn/simplex/romans/romanc/romant/isocp + 6 פונטי עברית אדריכליים (MIRYL/mirym/IRON/GALIL/techno_m/oron2/atir) → רובם David, isocp→Arial, hd→FrankRuehl

2. **`src\Vitruvius.Core\Fonts\ShxFontMapWriter.cs`** — קורא/מגבה/כותב את `shxfontmap.txt`:
   - `DefaultRevit2024MapPath()` — מחזיר `%APPDATA%\Autodesk\Revit\Autodesk Revit 2024\shxfontmap.txt`
   - `Read(path)` → `ShxFontMap` עם NonManagedLines + ManagedEntries + מילון משולב
   - `Apply(path, recommendations)` → `ApplyResult` עם backup timestamped (`.vitruvius-bak-YYYY-MM-DD_HH-mm-ss.txt`), merge, skip-if-user-mapped, update-if-managed
   - **חוקי merge:**
     - בלי המלצה → SkippedNoRecommendation
     - SHX ממופה ע"י משהו אחר (user/Revit installer) → SkippedAlreadyMapped (לא דורסים)
     - SHX ממופה ע"י Vitruvius בעבר → UpdatedManaged
     - SHX חדש → Added
   - **בלוק managed** מסומן ב-`# vitruvius-managed-begin/end` + `# vitruvius-managed-key:<shx>` לכל entry
   - **Encoding:** קריאה עם detection (BOM check; ברירת מחדל = system codepage 1255 ב-Windows ישראלי), כתיבה ב-UTF-8 no-BOM (Revit קורא ASCII font names בלי בעיה)

3. **תיקון Bug קריטי ב-`TextStyleDetector.cs`:** `AddIfShx` סינן רק שמות שמסתיימים ב-`.shx`. DXF כותב את רוב ה-styles בלי סיומת (`MIRYL`, `GALIL`, `txt`) — לפי הקונבנציה של AutoCAD (font slot ללא ext = ".shx" בנתיב חיפוש פונטים). 28/29 styles פוספסו לפני התיקון. תוקן:
   - `NormalizeShxName(font)` — אם ext ריק או לא TTF/OTF/TTC → מתייחס כ-SHX, מוסיף `.shx`
   - `TrueTypeExtensions` blocklist (.ttf/.otf/.ttc)
   - תוצאה: סריקה זיהתה 11 SHX (היה 1)

### Revit
4. **`src\Vitruvius.Revit2024\Commands\ApplyFontMapCommand.cs`** — `[Transaction(ReadOnly)]`:
   - Stage 1: scan + collect SHX (משתמש ב-`RevitDwgLinkProvider`+`DwgLinkScanner`+`TextStyleDetector`)
   - Stage 2: recommend
   - Stage 3: preview TaskDialog עם summary (added/updated/skipped counts) + ExpandedContent (per-row)
   - Stage 4: confirm → apply (OK/Cancel buttons)
   - Stage 5: post-flight dialog עם backup path + הצעת Reload ידני

5. **Ribbon:** עודכן ל-Scan → Apply → About. `VitruviusApp.OnStartup` מוסיף את הכפתור החדש בין השניים.

### Deploy
- Build נקי בכל הסבבים
- 4 ארכובי DLL לתיקיית OLD\ עם timestamps (`2026-05-20_23-04`, `2026-05-21_10-02`)
- Vitruvius.Core.dll 27.5KB · Vitruvius.Revit2024.dll 15.5KB

## אימות חי — סדרת ניסיונות
### ניסיון 1 (לפני bug fix)
- Scan זיהה 1 SHX (`txt.shx`). Apply דילג כי `Txt.shx → Arial` קיים ב-shxfontmap.txt מהתקנת Revit.
- מסקנה שגויה התחלתית: "Hebrew works because Arial" — אבל המשתמש הסביר שזה היה תקין גם לפני (Arial על Windows כן מטפל בעברית).

### ניסיון 2 (אחרי מחיקה ידנית של `Txt.shx Arial`)
- מחיקה ידנית של השורה דרך PowerShell, backup לרישום.
- Apply הוסיף `txt.shx → David`. Reload של DXF link.
- תוצאה ויזואלית: **"רחצה" עברית קריאה** — אבל ה-user הצביע שזה בכלל לא משתנה (היה קריא גם לפני, Arial בלבד מספיק לעברית).
- מסקנה: הג'יבריש האמיתי (`sukyi`, `jhcur kbheuz`) **לא בא מ-txt.shx**.

### חקירה — קריאת DXF ישירות
- מצאתי את הקישורים מקומית ב-`D:\Vitruvius Ecosystem\Vitruvius\test naterials\1325-01001 - Standard\`
- Parse של STYLE table ב-DXF: **29 styles עם 9 פונטי SHX שונים** — txt, MIRYL, mirym, IRON, GALIL, oron2, ROMANT, romanc, romans, techno_m, txtn, ltypeshp.shx
- ה-detector שלנו פספס את כולם חוץ מ-txt.shx (היחיד עם סיומת מפורשת)

### ניסיון 3 (אחרי bug fix + הרחבת recommender)
- Scan זיהה 11 SHX (כל מה שמופיע ב-STYLE table). ✓
- Apply: 10 added + 1 updated. shxfontmap.txt נכתב מושלם, בלוק managed-by-Vitruvius עם כל ה-mappings → David. ✓
- Close+Reopen של המודל (`G:\האחסון שלי\עבודות\לוטן\מבנה רואי\A_Mivne roi\A_Mivne roi.rvt`).
- **הג'יבריש לא זז** — `c,herv`, `bheuz nzdi`, `jhcur kbheuz`, `vihur`, `sukyiq/m/t/` עדיין שם.

## ההיפותזה הסבירה ביותר (לאמת בסשן הבא לפני קוד)
**Revit/AutoCAD קוראים `shxfontmap.txt` רק כשקובץ ה-SHX חסר על הדיסק.** בתיקיית הקישור — **כל קבצי ה-SHX הקריטיים קיימים פיזית**: txt.shx, MIRYL.shx, GALIL.shx, IRON.shx, mirym.shx, oron2.shx, romanc.shx, romans.shx, ROMANT.shx, techno_m.shx, txtn.shx, atir.shx, AUTOIRON.SHX, CAES-L$.shx, Wplus.shx.

Revit מוצא את ה-SHX → מרנדר ישירות עם הפונט המקורי → fontmap שלנו לא נקרא בכלל.

## בעיות שנפתרו
1. **Detector miss 28/29 styles** — בעיית `EndsWith(".shx")`. תוקן ל-NormalizeShxName.
2. **Apply skipped Txt.shx → Arial** — לוגיקה בטוחה של "לא לדרוס משתמש" נכונה אבל חוסמת את ה-fix. תיקון עתידי: Override checkbox.

## מה לא עבד / להיזהר
1. **אסור** להניח ש-shxfontmap.txt משפיע אוטומטית כש-SHX קיים בתיקיית הקישור — הוא לא.
2. **אסור** להסיק "תקין" מ-"רחצה קריאה" — Arial כבר מטפל בעברית; ההוכחה היחידה היא טקסט שהיה ג'יבריש והפך לקריא.
3. **אסור** לסנן SHX רק לפי `EndsWith(".shx")` — AutoCAD כותב לרוב בלי סיומת.
4. **שים לב:** `LongPressMoveUpdateDetails` style API — לא לסבך עם Manage Links כשworkset לא editable (כפתור disabled).

## ההחלטות שהתקבלו
1. **Override checkbox נדחה** — לא רלוונטי אם הבעיה היא בכלל לא ב-fontmap. מחכה לאימות ההיפותזה.
2. **DWG בינארי נדחה** — הג'יבריש בא מ-DXF הקריא (אומתי דרך STYLE table parsing), לא מ-DWG הבינארי. אין מה לרדוף עכשיו אחרי DWG reader.
3. **נתיב מודל הוחלף** — מ-cloud BIM360 ל-`G:\האחסון שלי\עבודות\לוטן\מבנה רואי\A_Mivne roi\A_Mivne roi.rvt` (החלטת משתמש: רק קובץ זה מותר).
4. **Override של "managed by Vitruvius" semantics** — אם הריצה השנייה של Apply נותנת `נכתב: לא — כל ההמלצות כבר היו במקומן`, זה אומר שמיפויים managed זהים לא נחשבים שינוי (no-op). הלוגיקה תקינה.

## קבצים שנוצרו/שונו
| קובץ | פעולה |
|---|---|
| `src\Vitruvius.Core\Fonts\FontRecommender.cs` | נוצר — 13 mappings |
| `src\Vitruvius.Core\Fonts\ShxFontMapWriter.cs` | נוצר — read/backup/merge |
| `src\Vitruvius.Core\Dwg\TextStyleDetector.cs` | תוקן — NormalizeShxName + TrueTypeExtensions |
| `src\Vitruvius.Revit2024\Commands\ApplyFontMapCommand.cs` | נוצר — full apply flow |
| `src\Vitruvius.Revit2024\VitruviusApp.cs` | עודכן — כפתור "החל תיקון" בריבון |
| `_M3-override-decision.html` | נוצר — RTL UI לדיון |
| `C:\Users\elyas\AppData\Roaming\Autodesk\Revit\Autodesk Revit 2024\shxfontmap.txt` | מכיל בלוק vitruvius-managed עם 11 entries → David |
| `~\shxfontmap.vitruvius-manual-bak-2026-05-21_08-56-08.txt` | backup ידני |
| `~\shxfontmap.vitruvius-bak-2026-05-21_09-07-16.txt` | backup אוטומטי מ-Apply ראשון |
| `~\shxfontmap.vitruvius-bak-2026-05-22_08-52-57.txt` | backup אוטומטי מ-Apply שני |
| `Addins\2024\Vitruvius\OLD\2026-05-20_23-04\` | ארכיב 4 DLLs |
| `Addins\2024\Vitruvius\OLD\2026-05-21_10-02\` | ארכיב 4 DLLs |

## הצעד הבא בסשן 0022 — מחקר לפני קוד
**אל תכתוב קוד נוסף לפני אימות ההיפותזה.**

### Test A (חובה — 10 דקות)
1. פתח את התיקייה `G:\האחסון שלי\עבודות\לוטן\מבנה רואי\A_Mivne roi\1325-01001 - Standard\` (או הנתיב המקביל מתחת ל-G:\)
2. צור תת-תיקייה `OLD_for_test\`
3. העבר את `MIRYL.shx`, `GALIL.shx`, `IRON.shx`, `mirym.shx`, `oron2.shx` לתת-התיקייה
4. פתח את המודל ב-Revit. הם יחסרו — Revit ייאלץ לעבור ל-fontmap.
5. אם הג'יבריש הפך לעברית קריאה = **ההיפותזה אושרה**.
6. אם הג'יבריש נשאר = ההיפותזה הופרכה, צריך אבחנה אחרת.

### לאחר Test A
- **אם אושר:** דיון עם המשתמש על מסלול קבוע — האם הפלאגין צריך להעביר אוטומטית את ה-SHX לתיקייה צדדית? לתת אופציה למשתמש? לבדוק אם יש Revit setting שמכריח prefer-fontmap?
- **אם הופרך:** debug עמוק יותר. אופציות: (1) DWG בינארי הוא המקור — לאמת עם ODA File Converter. (2) הטקסט בעצמו לא Hebrew encoded — בעיית CP1255 בקובץ המקור. (3) Revit משתמש בפונט אחר ש-style מצביע אליו בעקיפין.

### Override checkbox — נדחה
אם ההיפותזה אושרה, Override checkbox לא רלוונטי בכלל (shxfontmap לא יקרא בכל מקרה כשה-SHX קיים). אם הופרך, אולי נחזור לזה.
