Stylesheet fixes (KindredCreate theme): - Add tree branch expand/collapse SVG indicators (branch_closed.svg, branch_open.svg) visible on dark background - Add QSS rules for QTreeView::branch pseudo-states - Add min-height: 20px to QHeaderView::section to fix bottom clipping - Merge QDockWidget::title and QSint--ActionGroup QToolButton padding improvements from Stylesheets copy into canonical - Add SpreadsheetGui--SheetTableView QLineEdit cell editor styling - Sync all three QSS copies (resources/preferences, src/Gui/Stylesheets, src/Gui/PreferencePacks) to canonical version ZTools-PartDesign workbench integration: - Add _ZToolsPartDesignManipulator via WorkbenchManipulator API - Injects DatumCreator, DatumManager into Part Design Helper Features toolbar - Injects EnhancedPocket into Part Design Modeling Features toolbar - Injects RotatedLinearPattern into Part Design Transformation Features toolbar - Adds corresponding PartDesign menu entries after PartDesign_Boolean Silo enhancements: - Add Silo_ToggleMode command: toggle switch in File toolbar that swaps Ctrl+O/S/N between standard FreeCAD and Silo equivalents - Add SSL certificate file browser in Silo Settings dialog (SslCertPath preference, supports .pem/.crt/.cer) - Update _get_ssl_context() to load custom CA cert before system CAs - Expand SiloMenuManipulator: Silo_New, Silo_Open, Silo_Save, Silo_Commit, Silo_Pull, Silo_Push, Silo_BOM in File menu - Integrate upstream Silo_BOM command (tabbed BOM/Where-Used dialog) Submodule updates: - silo: Silo mode toggle, SSL cert browsing, BOM menu integration - ztools: PartDesign WorkbenchManipulator and Catppuccin theme sync Documentation: - Add docs/REPOSITORY_STATE.md: comprehensive repository state report with architecture overview, submodule status, potential issues, feature stubs, and Silo integration path forward
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()insrc/Mod/Assembly/UtilsAssembly.pyextracts geometry fromPartDesign::PlaneandPartDesign::Pointobjects instead of returning zero placements.
ZTools Bug Fixes
665bdb2— Three fixes in the ztools submodule:- Removed
int()wrapper fromgetStandardButtons()(Qt6/PySide6 compatibility —StandardButtonenum is not int-castable). - Guarded
_setup_ztools_viewprovider()against C++ ViewProviders that lack aProxyattribute (PartDesign::PlaneusesViewProviderDatumPlane, pure C++). - Changed
setEditorMode(prop, 2)tosetPropertyStatus(prop, "Hidden")for persistent attachment property hiding across save/reload.
- Removed
ZTools Parametric Datums via AttachExtension
2c716b4— ZTools datum planes now leverage FreeCAD's built-inPart::AttachExtensionfor automatic parametric updates. Instead ofMapMode = "Deactivated"with manual placement, each datum type maps to a vanillaMapMode(FlatFace,ThreePointsPlane,NormalToEdge, etc.) with appropriateAttachmentSupportandAttachmentOffset. Datums update automatically when source geometry changes on recompute.
Stylesheet Fixes (Uncommitted — Staged)
- Tree branch indicators: Created
branch_closed.svgandbranch_open.svginimages_dark-light/with Catppuccin#cdd6f4chevrons. AddedQTreeView::branchimage 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 viasrc/Gui/Stylesheets/KindredCreate.qss. - Header clipping: Added
min-height: 20pxtoQHeaderView::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)
_ZToolsPartDesignManipulatorinmods/ztools/ztools/InitGui.pyusesGui.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:
SiloMenuManipulatorinsrc/Mod/Create/InitGui.pyinjectsSilo_New,Silo_Open,Silo_Save,Silo_Commit,Silo_Pull,Silo_Push, andSilo_BOMinto the File menu across all workbenches. - Toolbar toggle:
Silo_ToggleModecheckable command swapsCtrl+O/S/Nbetween 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 (
SslCertPathpreference)._get_ssl_context()loads the custom cert before system CAs. - BOM integration: Upstream BOM feature (
Silo_BOMcommand 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_DatumManagerZTools_RotatedLinearPatternZTools_EnhancedPocketZTools_AssemblyLinearPattern,ZTools_AssemblyPolarPatternZTools_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_CommitSilo_Pull,Silo_Push,Silo_Info,Silo_BOMSilo_TagProjects,Silo_Rollback,Silo_SetStatusSilo_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
-
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. -
WorkbenchManipulator command registration timing. The
_ZToolsPartDesignManipulatorappends 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. TheCreate/InitGui.pyexec()loads the workbench class butInitialize()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. -
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
-
Silo has no authentication. All API endpoints are publicly accessible. Required before multi-user deployment. See
mods/silo/docs/REPOSITORY_STATUS.mdfor full list. -
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.
-
Assembly solver
findPlacement()geometry extraction is minimal. The fix atUtilsAssembly.py:1006extracts placement fromobj.Shape.Faces[0]forPartDesign::Plane. This works for planar datums but does not handle edge cases like empty shapes or non-planar datum objects.
Medium
-
Silo_BOMdepends onget_tracked_object()which looks for aSiloPartNumberproperty 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. -
_ZToolsPartDesignManipulator.modifyMenuBar()inserts afterPartDesign_Boolean. If upstream FreeCAD renames or removes this command, the menu insertions silently fail. The toolbar appends (by toolbar name) are more robust. -
ZTools
plane_tangent_to_cylinderfalls 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. -
Silo
delete_bom_entry()uses rawurllib.requestinstead of the_request()helper method onSiloClient. This bypasses error normalization. Should be refactored to useself._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
- Authentication — LDAP/FreeIPA integration for multi-user. Silo server needs auth middleware; FreeCAD client needs credential storage in preferences.
- BOM-Assembly bridge — Auto-populate Silo BOM from FreeCAD Assembly
component links. When a user saves an assembly, extract child part numbers
from
Assembly_InsertLinkobjects and sync to Silo BOM. - File locking — Pessimistic locks on checkout (
Silo_Open) to prevent concurrent edits. Requires server-side lock table and client-side lock-status display. - Status bar integration — Show current Silo item part number, revision,
and sync status in FreeCAD's status bar. Use
FreeCADGui.getMainWindow().statusBar(). - Build system — CMake install rules for
mods/submodules so.debpackages include ztools and silo without manual intervention.