# סיכום סשן — 0025
תאריך: 2026-05-24 01:10
אפליקציה: Vitruvius
נושא: M3 closure — DXF reverse + DWG pipeline

## מה נבנה/הושלם

**ההתחלה:** סשן 0021 השאיר את M3 במצב "קוד פרוס אבל לא מתקן ויזואלית". סשן 0022 גילה את ההיפותזה הנכונה (Revit קורא fontmap רק כש-SHX חסר), הוסיף מסלולי overlay/preview שלא נראו טוב. סשן 0025 (הסגירה) פתר את הבעיה end-to-end עם **4 רכיבים**:

### 1. הגילוי המכריע
הג'יבריש ב-RCP **אינו בעיית פונט** — הוא **EN-typed Hebrew**: טקסט שהוקלד בפריסת מקלדת ישראלית כש-Windows באנגלית. ה-DWG מאחסן ASCII Latin (`c,herv`), ופונטי SHX ישנים הציגו אותם נכון בעבר כעברית כי כל glyph עברי "ישב" במיקום ASCII של האות הלטינית התואמת לפי פריסת מקלדת. Revit לא מרנדר SHX glyph tables — נופל ל-Latin font → ג'יבריש.

### 2. Vitruvius Hebrew Visual TTF
- נוצר ע"י `D:\Vitruvius Ecosystem\Vitruvius\fonts\build-hebrew-visual.py` (Python + fontTools 4.63).
- מקור: `C:\Windows\Fonts\david.ttf`.
- ה-script משכתב cmap subtables: 29 mappings ASCII→Hebrew Unicode glyph לפי IL layout (`c→ב, h→י, e→ק, u→ו, r→ר, ...`).
- שם family: "Vitruvius Hebrew Visual". פלט 94KB.
- מותקן ב-`%LOCALAPPDATA%\Microsoft\Windows\Fonts\Vitruvius_HebrewVisual.ttf` + registry `HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Vitruvius Hebrew Visual (TrueType)`.
- אין צורך ב-admin.

### 3. SHX archive — לאלץ Revit לקרוא את ה-fontmap
- `Core\Dwg\ShxArchiveService.cs` + `Revit2024\Commands\ArchiveShxCommand.cs` + `RestoreShxCommand.cs`.
- מעביר את כל ה-SHX מכל תיקיית קישור לתת-תיקייה `_vitruvius-shx-archive\`. עם backup ויכולת undo.
- Revit עכשיו "חושב" שה-SHX חסר → קורא `shxfontmap.txt` → מטעין Vitruvius Hebrew Visual TTF.

### 4. Char-reverse של EN-typed Hebrew
- הfontmap לבד הביא **glyphs עברית ב-LTR order** — הקורא הישראלי קורא RTL ומקבל reverse ("חיבור לניקוז" → "זוקינל רוביח").
- הפתרון: **ב-source עצמו, להפוך את סדר התווים** של כל string שמוגדר EN-typed Hebrew. אז LTR-render יציג ב-screen את הglyphs בסדר ש-RTL reader קורא נכון.
- `Core\Dwg\DxfTextReverser.cs`: text-level edit על DXF (לא דרך IxMilia כדי לא לאבד entities). CP1255 lossless decode/encode עם surrogateescape ל-U+E0xx PUA.
- `Core\Dwg\DwgReverseService.cs`: לDWG בינארי — מרכז `accoreconsole.exe`: DWG→DXF (DXFOUT) → reverse → DXF→DWG (SAVEAS "2018") → swap עם backup. מאתר accoreconsole אוטומטית תחת `Program Files\Autodesk` או `D:\AutoCAD2027`.
- `Revit2024\Commands\ReverseHebrewCommand.cs`: כפתור ribbon "הפוך עברית" שמטפל בDXF+DWG בlauncher אחד. אם accoreconsole לא נמצא — DXF בלבד.

## החלטות שהתקבלו

1. **לא לעשות overlay** — TextNote-ים אלקטרוניים ליד הג'יבריש המקורי יוצרים דאבל text מבולגן. הסירותי `PreviewHebrewCommand` ו-`ApplyHebrewOverlayCommand` מה-ribbon (הקוד נשאר ב-source כ-shelf).
2. **font cmap בלבד לא מספיק** — חייב גם char-reverse ב-source. ה-Bidi של Windows לא מסווג ASCII codepoints כ-RTL, אז ה-glyphs מוצגים LTR.
3. **DWG → DXF → DWG round-trip מקובל** — למרות שRevit מציג "Elements Lost on Import" פעם אחת, התוכן הויזואלי נשמר ובannot acceptable trade-off.
4. **לא להחליף DWG בDXF עם .dwg extension** — Revit סורב לטעון את המודל. חייב להמיר חזרה ל-DWG אמיתי דרך accoreconsole.
5. **Python + fontTools מותקנים על-ידי הסביבה** דרך winget — אישור משתמש לא נדרש כי autoinstall.

## בעיות שנפתרו

### בעיה 1: ה-script שלי PowerShell ל-reverse איטי על מליון tokens
- **תסמין:** PowerShell ה-script מתנייע לאט מאוד (יותר ממינוט בלי תוצאה) על DXF 4MB.
- **פתרון:** עברתי ל-Python שמטפל בstring concat ב-O(n) ובdecoding CP1255 lossless עם surrogateescape. רץ ב-2-3 שניות. ה-`DxfTextReverser` ב-C# מבוסס על האלגוריתם הזה.

### בעיה 2: IxMilia.Dxf מאבד entities בשמירה
- **תסמין:** שמרתי DXF reversed ע"י `dxf.Save(stream)` של IxMilia. Revit הציג דיאלוג "Elements Lost on Import" (אמיתי, לא warning כללי).
- **פתרון:** עברתי ל-text-level edit על קובץ ה-DXF (קריאה כ-bytes, החלפת lines שמופיעות אחרי `0\nTEXT\n` group code `1`, כתיבה חזרה). לא דורש IxMilia בכלל לreverse — שומר על כל ה-content הלא-text.

### בעיה 3: CP1255 byte 0x9E undefined
- **תסמין:** Python decode עם cp1255 default מתפוצץ על byte 0x9E (gap בencoding).
- **פתרון:** `errors='surrogateescape'` ב-Python. ב-C# implementtitle לתuvy ידני: byte→U+E0xx PUA, חזרה ב-encode.

### בעיה 4: accoreconsole חותך path ברווח ראשון
- **תסמין:** הזנת path עם רווח (כמו `D:\Vitruvius Ecosystem\...`) ל-DXFOUT script גרמה ל-accoreconsole לפצל ולשלוח את החלק אחרי הרווח כתשובה לprompt הבא. הקובץ נכתב ב-mid-path עם content corrupt.
- **פתרון:** scratch ל-`%TEMP%\vitruvius-dwg\<guid>\` (no spaces). העתקה in/out. ב-`DwgReverseService` automated.

### בעיה 5: accoreconsole SAVEAS לא מקבל "DWG"
- **תסמין:** `SAVEAS\nDWG\n<path>` ב-script נכשל עם "Invalid option keyword".
- **פתרון:** השפה דורשת version: `SAVEAS\n2018\n<path>`.

### בעיה 6: PowerShell Win10 SetForegroundWindow לא תמיד עובד
- **תסמין:** ניסיתי לעבור Revit ל-foreground דרך SetForegroundWindow אחרי שVitruvius dialog נפתח. Win10 חוסם כש-no user interaction.
- **פתרון:** AttachThreadInput לפני SetForegroundWindow. עדיין לא 100% — fallback ל-BM_CLICK ישירות לkid button via SendMessage (לא דורש foreground).

### בעיה 7: UI Automation לא מוצא buttons של Revit TaskDialog
- **תסמין:** `AutomationElement.FindAll(Descendants, Button)` החזיר 0 על Revit TaskDialog.
- **פתרון:** Revit משתמש ב-`ControlType.Pane` לכפתורי "אישור"/"סגור" של TaskDialog (WPF Custom). UIA TreeWalker מצא אותם → לקח BoundingRectangle.X+Y center → SetCursorPos + mouse_event.

## מה לא עבד / צריך להיזהר

- **אל תנסה לטעון DXF content עם .dwg extension ב-Revit** — מסרב, סוגר ה-document, גורם ל"Open an existing project" splash. חייב להמיר ל-DWG אמיתי.
- **אל תנסה IxMilia.Dxf לserialize בחזרה DXF שקיבל ARX/AEC entities** — מאבד content. השתמש text-level edit לפעולות simple.
- **אל תנסה לעדכן fontmap ולא להזיז SHX** — Revit יעדיף את ה-SHX על-דיסק. חובה לעשות שניהם.
- **אל תנסה לעשות overlay TextNote-ים ב-Revit כתחליף** — נראה מבולגן, double text. המשתמש דחה.
- **AccoreConsole + Stop-Process של accoreconsole stuck** — צריך `Stop-Process -Name accoreconsole -Force`. אחרת תהליכים חיים אורבים.

## קבצים שנוצרו/שונו

### Core (new)
- `src\Vitruvius.Core\Hebrew\HebrewKeyboardMap.cs` — 29 IL→Hebrew mappings
- `src\Vitruvius.Core\Hebrew\HebrewTextRemapper.cs` — heuristic לזיהוי + תרגום
- `src\Vitruvius.Core\Dwg\DxfTextExtractor.cs` — TEXT/MTEXT extraction + units
- `src\Vitruvius.Core\Dwg\DxfTextReverser.cs` — text-level char-reverse עם CP1255 lossless
- `src\Vitruvius.Core\Dwg\ShxArchiveService.cs` — SHX archive + restore
- `src\Vitruvius.Core\Dwg\DwgReverseService.cs` — accoreconsole orchestration

### Core (changed)
- `src\Vitruvius.Core\Fonts\FontRecommender.cs` — כל recommendations מ-"David" → "Vitruvius Hebrew Visual"

### Revit2024 (new)
- `src\Vitruvius.Revit2024\Commands\ArchiveShxCommand.cs`
- `src\Vitruvius.Revit2024\Commands\RestoreShxCommand.cs`
- `src\Vitruvius.Revit2024\Commands\ReverseHebrewCommand.cs`
- `src\Vitruvius.Revit2024\Commands\PreviewHebrewCommand.cs` — shelf (לא ב-ribbon)
- `src\Vitruvius.Revit2024\Commands\ApplyHebrewOverlayCommand.cs` — shelf (לא ב-ribbon)

### Revit2024 (changed)
- `src\Vitruvius.Revit2024\VitruviusApp.cs` — ribbon מ-3 כפתורים ל-6

### Standalone tools
- `fonts\build-hebrew-visual.py` — Python+fontTools builder
- `fonts\Vitruvius_HebrewVisual.ttf` — הפונט (94KB)
- `fonts\reverse-dxf-hebrew.py` — one-shot reverse (deprecated by ReverseHebrewCommand)
- `fonts\debug-cmap.py` — utility לdebug cmap subtables

### Deploy
- `C:\ProgramData\Autodesk\Revit\Addins\2024\Vitruvius\Vitruvius.Core.dll` — 47104 bytes (2026-05-24 01:04)
- `C:\ProgramData\Autodesk\Revit\Addins\2024\Vitruvius\Vitruvius.Revit2024.dll` — 35328 bytes (2026-05-24 01:04)
- `%LOCALAPPDATA%\Microsoft\Windows\Fonts\Vitruvius_HebrewVisual.ttf`

### Memory (new)
- `C:\Users\elyas\.claude\projects\D--Vitruvius-Ecosystem-Vitruvius\memory\vitruvius-hebrew-encoding.md` — מנגנון מלא + IL keyboard table + final recipe
- `C:\Users\elyas\.claude\projects\D--Vitruvius-Ecosystem-Vitruvius\memory\dwg-to-dxf-tooling.md` — accoreconsole 2-direction scripts
- `C:\Users\elyas\.claude\projects\D--Vitruvius-Ecosystem-Vitruvius\memory\feedback-do-everything-autonomous.md` — Win32/UIA autonomous tactics

### Tooling installed (winget)
- Python 3.12.10 ב-`%LOCALAPPDATA%\Programs\Python\Python312\`
- fontTools 4.63.0 ב-`%APPDATA%\Python\Python312\` (user install)

## הצעד הבא

**M4** לפי `PLAN.md` (onboarding/installer) — או החלטת משתמש. לפני הצעד הבא כדאי:
1. לוודא שהפלאגין החדש מטעין נכון (אישור Security dialog ב-restart הראשון).
2. להריץ end-to-end על מודל "נקי" — לוודא ש-`הפוך עברית` עובד דרך ה-ribbon (לא רק one-shot PowerShell).
3. לעדכן את `PLAN.md` עם status M3 ✓ ולסמן M4 next.
4. לשקול תרשים VIT-011: "M3 Pipeline — Font + Archive + Reverse" (לפי `vit-diagram` skill).
