Files
create/docs/REPOSITORY_STATE.md
forbes af9837abf1 cherry-pick #5: theme QSS refinements (eb80c07f57)
Resolved conflicts: kept HEAD versions of QSS (has later refinements),
InitGui.py (has newer origin architecture), and silo submodule.
2026-02-13 14:06:36 -06:00

15 KiB

Kindred Create Repository State Report

Generated: 2026-01-31 Branch: main Parent repo: create-0070 @ 364a7057ef Submodules:

  • ztools @ 8d1f195 (ztools-0065, main)
  • silo @ c778825 (silo-0062, main)

Recent Changes (This Session)

Assembly Solver Fix

  • 610fd43 — PartDesign datum planes (including ZTools datums) now work correctly as joint references in Assembly. findPlacement() in src/Mod/Assembly/UtilsAssembly.py extracts geometry from PartDesign::Plane and PartDesign::Point objects instead of returning zero placements.

ZTools Bug Fixes

  • 665bdb2 — Three fixes in the ztools submodule:
    • Removed int() wrapper from getStandardButtons() (Qt6/PySide6 compatibility — StandardButton enum is not int-castable).
    • Guarded _setup_ztools_viewprovider() against C++ ViewProviders that lack a Proxy attribute (PartDesign::Plane uses ViewProviderDatumPlane, pure C++).
    • Changed setEditorMode(prop, 2) to setPropertyStatus(prop, "Hidden") for persistent attachment property hiding across save/reload.

ZTools Parametric Datums via AttachExtension

  • 2c716b4 — ZTools datum planes now leverage FreeCAD's built-in Part::AttachExtension for automatic parametric updates. Instead of MapMode = "Deactivated" with manual placement, each datum type maps to a vanilla MapMode (FlatFace, ThreePointsPlane, NormalToEdge, etc.) with appropriate AttachmentSupport and AttachmentOffset. Datums update automatically when source geometry changes on recompute.

Stylesheet Fixes (Uncommitted — Staged)

  • Tree branch indicators: Created branch_closed.svg and branch_open.svg in images_dark-light/ with Catppuccin #cdd6f4 chevrons. Added QTreeView::branch image rules for expand/collapse states.
  • Spinbox/combobox arrows: Synced all three QSS copies so the CSS border-triangle arrow fix (previously only in resources/preferences/) now applies at runtime via src/Gui/Stylesheets/KindredCreate.qss.
  • Header clipping: Added min-height: 20px to QHeaderView::section.
  • QSS sync: All four copies (resources/preferences/, src/Gui/Stylesheets/, src/Gui/PreferencePacks/, mods/ztools/CatppuccinMocha/) are now byte-identical. Merged dock widget padding and spreadsheet cell editor styling improvements that existed only in the Stylesheets copy.

ZTools-PartDesign Merge (Uncommitted — Staged)

  • _ZToolsPartDesignManipulator in mods/ztools/ztools/InitGui.py uses Gui.addWorkbenchManipulator() to inject ZTools commands into PartDesign's C++ toolbars:
    • ZTools_DatumCreator + ZTools_DatumManager → "Part Design Helper Features"
    • ZTools_EnhancedPocket → "Part Design Modeling Features"
    • ZTools_RotatedLinearPattern → "Part Design Transformation Features"
    • Same commands also inserted into the Part Design menu after PartDesign_Boolean.

Silo Enhancements (Uncommitted — Staged)

  • File menu integration: SiloMenuManipulator in src/Mod/Create/InitGui.py injects Silo_New, Silo_Open, Silo_Save, Silo_Commit, Silo_Pull, Silo_Push, and Silo_BOM into the File menu across all workbenches.
  • Toolbar toggle: Silo_ToggleMode checkable command swaps Ctrl+O/S/N between standard FreeCAD file commands and Silo equivalents. Appended to the global File toolbar via the manipulator.
  • SSL certificate browsing: Settings dialog now includes a file browser for custom CA certificates (SslCertPath preference). _get_ssl_context() loads the custom cert before system CAs.
  • BOM integration: Upstream BOM feature (Silo_BOM command with tabbed dialog — BOM + Where Used) merged with local changes and added to the Create File menu manipulator.

Architecture Overview

create-0070/                          Kindred Create (FreeCAD 1.0+ fork)
├── src/
│   ├── Mod/
│   │   ├── Assembly/                 Assembly solver (OndselSolver)
│   │   ├── PartDesign/              Part modeling (C++ workbench)
│   │   ├── Sketcher/                2D constraint sketcher
│   │   ├── Create/                  Kindred bootstrap module (Python)
│   │   │   └── InitGui.py          Loads ztools+silo, installs manipulators
│   │   └── ...                      Other FreeCAD modules
│   └── Gui/
│       ├── Stylesheets/             QSS themes + arrow/branch SVGs
│       ├── PreferencePacks/         Preference pack bundles
│       └── WorkbenchManipulatorPython.cpp  Menu/toolbar injection API
├── mods/
│   ├── ztools/                      [submodule] ztools-0065
│   │   └── ztools/
│   │       ├── InitGui.py           ZToolsWorkbench + PartDesign manipulator
│   │       └── ztools/
│   │           ├── commands/        Datum, pattern, pocket, assembly, spreadsheet
│   │           ├── datums/core.py   Datum creation with AttachExtension
│   │           └── resources/       Icons, theme utilities
│   └── silo/                        [submodule] silo-0062
│       └── pkg/freecad/
│           ├── InitGui.py           SiloWorkbench
│           └── silo_commands.py     12 commands + SiloClient API
└── resources/
    └── preferences/KindredCreate/   Canonical QSS + preference pack

Integration Flow

FreeCAD startup
  └─ src/Mod/Create/InitGui.py exec()
       ├─ exec(mods/ztools/ztools/InitGui.py)
       │    ├─ registers ZToolsWorkbench
       │    └─ installs _ZToolsPartDesignManipulator (global)
       ├─ exec(mods/silo/pkg/freecad/InitGui.py)
       │    └─ registers SiloWorkbench
       └─ QTimer.singleShot(2000):
            ├─ _setup_silo_menu()
            │    └─ installs SiloMenuManipulator (global)
            │         ├─ modifyMenuBar: Silo commands in File menu
            │         └─ modifyToolBars: Silo_ToggleMode in File toolbar
            ├─ _check_silo_first_start()
            └─ _setup_silo_activity_panel()

Submodule Status

ztools (ztools-0065)

Commit Description
8d1f195 Add PartDesign WorkbenchManipulator and sync Catppuccin theme
005348b Leverage FreeCAD AttachExtension for parametric datum updates
0e95d1c Fix Qt6 StandardButton TypeError and C++ ViewProvider Proxy errors
98bd444 Fix workbench init and spreadsheet syntax errors

Custom commands: 9 registered

  • ZTools_DatumCreator, ZTools_DatumManager
  • ZTools_RotatedLinearPattern
  • ZTools_EnhancedPocket
  • ZTools_AssemblyLinearPattern, ZTools_AssemblyPolarPattern
  • ZTools_SpreadsheetStyle{Bold,Italic,Underline}, ZTools_SpreadsheetAlign{Left,Center,Right}, ZTools_Spreadsheet{BgColor,TextColor,QuickAlias}

Datum types supported: offset_from_face, offset_from_plane, midplane, 3_points, normal_to_edge, angled, tangent_to_cylinder

silo (silo-0062)

Commit Description
c778825 Add Silo mode toggle, SSL cert browsing, and BOM menu integration
8c06899 (upstream) Various fixes
bce7d5a Add BOM handling and routes to API and web UI
3a79d89 feat: add BOM system with API, database repository, and FreeCAD command
8e44ed2 Fix SIGSEGV: defer document open after dialog close

FreeCAD commands: 12 registered

  • Silo_Open, Silo_New, Silo_Save, Silo_Commit
  • Silo_Pull, Silo_Push, Silo_Info, Silo_BOM
  • Silo_TagProjects, Silo_Rollback, Silo_SetStatus
  • Silo_Settings, Silo_ToggleMode

API surface: 38 REST routes covering items, revisions, files, BOM, projects, schemas, and Odoo integration stubs. See mods/silo/docs/REPOSITORY_STATUS.md for full route table.

BOM API methods (new):

  • get_bom(), get_bom_expanded(), get_bom_where_used()
  • add_bom_entry(), update_bom_entry(), delete_bom_entry()

Potential Issues

Critical

  1. Three QSS copies can drift again. The canonical source is resources/preferences/KindredCreate/KindredCreate.qss. The other copies (src/Gui/Stylesheets/, src/Gui/PreferencePacks/, mods/ztools/CatppuccinMocha/) must be kept in sync manually. Consider a build step or symlinks to eliminate duplication.

  2. WorkbenchManipulator command registration timing. The _ZToolsPartDesignManipulator appends commands by name (e.g. ZTools_DatumCreator). If the ZTools workbench has not been initialized (first activation) when the user switches to PartDesign, the commands may not be registered yet. The Create/InitGui.py exec() loads the workbench class but Initialize() only runs on first activation. The manipulator API tolerates missing commands silently (toolbar append returns without error), but the buttons won't appear until ZTools initializes. Mitigation: force-activate ZToolsWorkbench during Create module load, or defer manipulator installation.

  3. Silo toggle mode shortcut persistence. _swap_shortcuts() stores original shortcuts in a module-level dict (_original_shortcuts). If FreeCAD crashes with Silo mode ON, the original shortcuts are lost and standard commands will have no keyboard shortcuts on next launch. Consider persisting original shortcuts to preferences.

High

  1. Silo has no authentication. All API endpoints are publicly accessible. Required before multi-user deployment. See mods/silo/docs/REPOSITORY_STATUS.md for full list.

  2. No unit tests for silo FreeCAD commands or ztools. Python code has zero test coverage. The Go backend also lacks tests per the silo status report.

  3. Assembly solver findPlacement() geometry extraction is minimal. The fix at UtilsAssembly.py:1006 extracts placement from obj.Shape.Faces[0] for PartDesign::Plane. This works for planar datums but does not handle edge cases like empty shapes or non-planar datum objects.

Medium

  1. Silo_BOM depends on get_tracked_object() which looks for a SiloPartNumber property on document objects. Documents not registered with Silo show a warning dialog. The UX could be improved with a one-click registration flow from the BOM dialog.

  2. _ZToolsPartDesignManipulator.modifyMenuBar() inserts after PartDesign_Boolean. If upstream FreeCAD renames or removes this command, the menu insertions silently fail. The toolbar appends (by toolbar name) are more robust.

  3. ZTools plane_tangent_to_cylinder falls back to manual placement because the TangentPlane MapMode requires a vertex reference not currently collected by the UI. This is the only datum type that does not benefit from automatic parametric updates.

  4. Silo delete_bom_entry() uses raw urllib.request instead of the _request() helper method on SiloClient. This bypasses error normalization. Should be refactored to use self._request("DELETE", ...).


Feature Stubs and TODOs

From silo REPOSITORY_STATUS

Feature Status Location
Odoo ERP integration Stub (returns "not yet implemented") internal/odoo/
Part number date segments Broken (formatDate() returns error) internal/partnum/generator.go:102
Location/Inventory APIs Tables exist, no handlers migrations/001_initial.sql
File locking Not implemented
Authentication/Authorization Not implemented
CSRF protection Not implemented Web UI only
CSV import transaction rollback Not implemented bom_handlers.go

From ztools

Feature Status Location
Tangent-to-cylinder attachment Manual fallback (no vertex ref) datums/core.py
Angled datum live editing AttachmentOffset rotation not updated in panel datum_viewprovider.py
Assembly pattern undo support Not implemented assembly_pattern_commands.py

From Create integration plan

Phase Feature Status
1 Addon auto-loading Done (src/Mod/Create/InitGui.py)
2 Enhanced Pocket as C++ feature Not started
3 Datum C++ helpers Not started (Python AttachExtension approach used instead)
4 Theme system refinement Partially done (QSS synced, not moved to Create module)
5 Silo deep integration Done (manipulator-based menu/toolbar injection)
6 Build system integration Not started

File Change Summary (Uncommitted)

Parent repo (create-0070)

File Change
resources/preferences/KindredCreate/KindredCreate.qss Branch indicators, header min-height, dock/actiongroup improvements, spreadsheet cell editor
src/Gui/Stylesheets/KindredCreate.qss Synced with canonical
src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss Synced with canonical
src/Gui/Stylesheets/images_dark-light/branch_closed.svg New: right-pointing chevron
src/Gui/Stylesheets/images_dark-light/branch_open.svg New: down-pointing chevron
src/Mod/Create/InitGui.py Expanded SiloMenuManipulator (BOM, full commands, toolbar toggle)
mods/silo Submodule pointer updated
mods/ztools Submodule pointer updated

ztools submodule (committed + pushed)

File Change
ztools/InitGui.py Added _ZToolsPartDesignManipulator
CatppuccinMocha/CatppuccinMocha.qss Synced with canonical KindredCreate.qss

silo submodule (committed + pushed)

File Change
pkg/freecad/silo_commands.py SSL cert browsing, Silo_ToggleMode, BOM merge
pkg/freecad/InitGui.py Added Silo_ToggleMode to toolbar

Silo Integration Path

Based on mods/silo/docs/REPOSITORY_STATUS.md and the existing docs/INTEGRATION_PLAN.md, the integration path forward is:

Completed

  • Addon auto-loading via src/Mod/Create/InitGui.py
  • Global File menu injection via WorkbenchManipulator
  • Toolbar toggle for Silo mode (shortcut swapping)
  • SSL certificate configuration for internal CAs
  • BOM command integrated into File menu

Next Steps

  1. Authentication — LDAP/FreeIPA integration for multi-user. Silo server needs auth middleware; FreeCAD client needs credential storage in preferences.
  2. BOM-Assembly bridge — Auto-populate Silo BOM from FreeCAD Assembly component links. When a user saves an assembly, extract child part numbers from Assembly_InsertLink objects and sync to Silo BOM.
  3. File locking — Pessimistic locks on checkout (Silo_Open) to prevent concurrent edits. Requires server-side lock table and client-side lock-status display.
  4. Status bar integration — Show current Silo item part number, revision, and sync status in FreeCAD's status bar. Use FreeCADGui.getMainWindow().statusBar().
  5. Build system — CMake install rules for mods/ submodules so .deb packages include ztools and silo without manual intervention.