docs: comprehensive documentation refresh — remove stale references, add missing content
All checks were successful
Build and Test / build (pull_request) Successful in 24m46s

Root documentation:
- README.md: add Datums description, update addon load order and SDK references,
  fix project structure tree, update issue reporting guidance
- CONTRIBUTING.md: update submodule table (remove ztools, add gears/datums/solver),
  fix QSS guidance (single canonical source, not three copies)
- docs/ARCHITECTURE.md: update bootstrap flow (5 addons, split deferred timers
  between Create core and Silo addon), update load order and source layout
- docs/COMPONENTS.md: add Datums and Solver sections, update Gears description,
  fix Silo origin registration reference
- docs/KNOWN_ISSUES.md: create missing file referenced by CLAUDE.md and CONTRIBUTING.md
- docs/INTEGRATION_PLAN.md: update layer 5 diagram, fix load order references,
  update Phase 6 install rules, fix Layer 2/3/5 descriptions
- docs/OVERVIEW.md: add datums submodule entry
- docs/UPSTREAM.md: update Phase 1 directory table and Phase 4 submodule list

mdBook documentation (docs/src/):
- SUMMARY.md: replace dead architecture/ links with existing reference pages,
  remove deleted silo-server files, add new silo-server pages
- introduction.md: rewrite — replace ztools with current addons (Silo, Gears,
  Datums, KCSDK), update version to v0.1.5/FreeCAD 1.2.0
- guide/getting-started.md: update first-run addon list
- guide/installation.md: update verification console output
- guide/workbenches.md: rewrite — replace ztools with Gears, Datums, Solver
- guide/building.md: update submodule table, fix error message guidance
- development/contributing.md: fix scope example and issue reporting
- development/repo-structure.md: rewrite — add SDK, datums, gears, solver,
  reference/ folder; update submodule and key files tables
- development/writing-an-addon.md: fix priority range table
- reference/create-module-bootstrap.md: rewrite — reflect addon_loader system,
  split deferred timers between Create core and Silo addon
- reference/datum-creator.md: update from ZTools to datums addon paths and naming
- reference/glossary.md: add KCSDK entry, update FreeCAD version, remove ztools
  entry, update repository URLs table
This commit is contained in:
forbes
2026-03-03 13:52:53 -06:00
parent 53f39d6368
commit 7f02fd182e
20 changed files with 247 additions and 155 deletions

View File

@@ -66,8 +66,10 @@ Kindred Create uses git submodules for addon workbenches:
| Submodule | Path | Repository |
|-----------|------|------------|
| ztools | `mods/ztools` | `git.kindred-systems.com/forbes/ztools` |
| silo-mod | `mods/silo` | `git.kindred-systems.com/kindred/silo-mod` |
| gears | `mods/gears` | `git.kindred-systems.com/kindred/gears` |
| datums | `mods/datums` | `git.kindred-systems.com/kindred/datums` |
| solver | `mods/solver` | `git.kindred-systems.com/kindred/solver` |
To update a submodule:
@@ -87,15 +89,9 @@ git submodule update --init --recursive
## Theme and QSS changes
The Catppuccin Mocha theme has **three QSS copies** that must be kept in sync:
The Catppuccin Mocha theme canonical source is `src/Gui/Stylesheets/KindredCreate.qss`. The copy at `src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss` is **generated at build time** via `configure_file()` in CMake -- do not edit it directly.
1. `resources/preferences/KindredCreate/KindredCreate.qss` (canonical)
2. `src/Gui/Stylesheets/KindredCreate.qss`
3. `src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss`
When modifying the theme, apply changes to all three files. Note that the copies have intentional differences (e.g., tree branch rendering style), so do not blindly copy between them -- apply edits individually.
See [KNOWN_ISSUES.md](docs/KNOWN_ISSUES.md) for the planned QSS consolidation.
Only edit `src/Gui/Stylesheets/KindredCreate.qss` when modifying the theme.
## Preference pack

File diff suppressed because one or more lines are too long

View File

@@ -19,22 +19,27 @@ FreeCAD startup
├─ addon_loader.load_addons(gui=True)
│ └─ for each addon in order:
│ └─ exec(InitGui.py)
│ ├─ sdk (priority 0): logs "SDK loaded"
│ ├─ gears (priority 40): registers GearsWorkbench
silo (priority 60): registers SiloWorkbench
└─ schedules deferred Silo overlay registration (2500ms)
│ ├─ sdk (priority 0): logs "SDK loaded"
│ ├─ solver (priority 10): registers KindredSolverBackend
gears (priority 40): registers GearsWorkbench
├─ datums (priority 45): registers Create_DatumCreator
│ └─ silo (priority 60): registers SiloWorkbench
│ └─ schedules deferred Silo setup (overlay, panels, observer)
├─ EditingContextResolver singleton created (MainWindow constructor)
│ ├─ registers built-in contexts (PartDesign, Sketcher, Assembly, Spreadsheet)
│ ├─ connects to signalInEdit/signalResetEdit/signalActiveDocument/signalActivateView
│ └─ BreadcrumbToolBar connected to contextChanged signal
└─ Deferred setup (QTimer):
Create core (src/Mod/Create/InitGui.py):
├─ 500ms: _register_kc_format() → .kc file format
├─ 1500ms: _register_silo_origin() → registers Silo FileOrigin
├─ 2000ms: _setup_silo_auth_panel() → "Database Auth" dock
├─ 2500ms: Silo overlay registration → "Silo Origin" toolbar overlay
├─ 3000ms: _check_silo_first_start() → settings prompt
├─ 4000ms: _setup_silo_activity_panel() → "Database Activity" dock
└─ 10000ms: _check_for_updates() → update checker (Gitea API)
Silo addon (mods/silo/InitGui.py):
├─ 500ms: kindred:// URL handler
├─ 600ms: document observer (.kc tree building)
├─ 2000ms: auth dock panel (via kindred_sdk.register_dock_panel)
├─ 2500ms: Silo overlay registration → "Silo Origin" toolbar overlay
├─ 3000ms: first-start settings check
└─ 4000ms: activity dock panel (via kindred_sdk.register_dock_panel)
```
### Addon lifecycle
@@ -61,7 +66,7 @@ The loader (`addon_loader.py`) processes addons in this order:
5. **Load** — execute `Init.py` (console) then `InitGui.py` (GUI) for each addon
6. **Register** — populate `FreeCAD.KindredAddons` registry with addon state
Current load order: **sdk** (0) → **gears** (40) → **silo** (60)
Current load order: **sdk** (0) → **solver** (10) → **gears** (40) → **datums** (45) → **silo** (60)
## Key source layout
@@ -101,12 +106,18 @@ mods/gears/ [submodule → gears.git] Gears workbench
mods/solver/ [submodule → solver.git] Solver addon
└── ... Solver plugin support
mods/silo/ [submodule → silo-mod.git] FreeCAD workbench
├── freecad/package.xml Manifest (priority 60, depends on sdk)
mods/datums/ [submodule → datums.git] Unified datum creator
├── package.xml Manifest (priority 45, depends on sdk)
├── Init.py / InitGui.py Bootstrap
└── datums/ Python package (command, core, panel, detection, edit_panel)
mods/silo/ [submodule → silo-mod.git] PLM workbench
├── package.xml Manifest (priority 60, depends on sdk)
├── Init.py sys.path setup for silo-client
├── InitGui.py Consolidated GUI bootstrap (workbench, panels, observer, overlay)
├── silo-client/ [submodule → silo-client.git] shared API client
│ └── silo_client/ SiloClient, SiloSettings, CATEGORY_NAMES
└── freecad/ FreeCAD workbench (Python)
├── InitGui.py SiloWorkbench + overlay registration (via SDK)
├── silo_commands.py Commands + FreeCADSiloSettings adapter
└── silo_origin.py FileOrigin backend for Silo (via SDK)

View File

@@ -2,7 +2,28 @@
## Gears workbench
Gears (`mods/gears/`) is a default addon providing parametric gear generation. Added as a submodule in the `feat/gears-addon` branch and merged to main.
Gears (`mods/gears/`) is a parametric gear generation addon. Provides `GearWorkbench` with gear generation and analysis tools. Code lives in `freecad/gears/` (workbench) and `pygears/` (computational library). Priority 40, depends on SDK.
---
## Datums
Datums (`mods/datums/`) is a unified datum creator that replaces the three stock PartDesign datum commands (Plane, Line, Point) with a single `Create_DatumCreator` command. Features:
- 16 smart creation modes (7 plane, 4 axis, 5 point)
- Auto-detection engine that selects the best mode from geometry selection
- Mode override combo for manual selection
- Dynamic parameter UI (offset, angle, position, XYZ)
- Edit panel with real-time parameter updates via AttachExtension
- Injected into `partdesign.body` and `partdesign.feature` contexts via SDK
Source: `mods/datums/datums/` (command.py, core.py, panel.py, detection.py, edit_panel.py). Priority 45, depends on SDK.
---
## Solver
Solver (`mods/solver/`) is an assembly solver research addon (GNN-based). Pure Python, priority 10. Provides `KindredSolverBackend` for experimental assembly constraint solving.
---
@@ -47,7 +68,7 @@ These appear in the File menu and "Origin Tools" toolbar across all workbenches
**Global integration** via the origin system in `src/Gui/`:
- File toolbar: `Std_Origin` selector widget + `Std_New`/`Std_Open`/`Std_Save` (delegate to current origin)
- Origin Tools toolbar: `Origin_Commit`/`Origin_Pull`/`Origin_Push`/`Origin_Info`/`Origin_BOM` (auto-disable by capability)
- Silo origin registered at startup by `src/Mod/Create/InitGui.py`
- Silo origin registered at startup by `mods/silo/InitGui.py` via `kindred_sdk.register_origin()`
**Dock panels:**
- Database Auth (2000ms) -- Login/logout and API token management

View File

@@ -1,10 +1,10 @@
# Integration Plan
Strategy for integrating ztools and Silo as built-in addons while maintaining clear boundaries with FreeCAD core.
Strategy for integrating Kindred addons as built-in components while maintaining clear boundaries with FreeCAD core.
## Goals
1. **Native feel** -- ztools and Silo behave as first-class citizens, not bolted-on addons
1. **Native feel** -- Addons behave as first-class citizens, not bolted-on extras
2. **Clean boundaries** -- Clear separation between FreeCAD core, Kindred extensions, and addon code
3. **Minimal core modifications** -- Preserve FreeCAD's container models (Part, Body, Assembly)
4. **Maintainability** -- Easy to pull upstream FreeCAD changes without merge conflicts
@@ -18,12 +18,11 @@ Strategy for integrating ztools and Silo as built-in addons while maintaining cl
├─────────────────────────────────────────────────────────────┤
│ Layer 5: Kindred Addons (mods/) │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ Silo │ │ Gears │
│ │ Open/Save/Commit│ │ Parametric gear
│ │ Part numbering generation │
│ │ Revision control│ │ │
│ BOM management │ │ │
│ └──────────────────┘ └──────────────────┘ │
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ │ Silo │ │ Gears Datums │ │ Solver
│ │ PLM/VCS │ │ Gear gen │ │ Datum │ │ Assembly │
│ │ BOM mgmt │ │ │ │ creator │ │ research │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
├─────────────────────────────────────────────────────────────┤
│ Layer 4: Kindred Addon SDK (mods/sdk/) │
│ ┌─────────────────────────────────────────────────────────┐│
@@ -58,7 +57,7 @@ FreeCAD's fundamental data structures: `PartDesign::Body`, `PartDesign::Pocket`,
### Layer 2: FreeCAD Python API -- use as-is
The Python API provides everything needed for feature creation, command registration, and geometry access. ZTools and Silo operate entirely through this layer. Stable FreeCAD APIs (`Gui.addCommand()`, `Gui.addWorkbench()`, `Gui.addWorkbenchManipulator()`) are called directly they do not need SDK wrappers.
The Python API provides everything needed for feature creation, command registration, and geometry access. Addons operate through this layer. Stable FreeCAD APIs (`Gui.addCommand()`, `Gui.addWorkbench()`, `Gui.addWorkbenchManipulator()`) are called directly -- they do not need SDK wrappers.
### Layer 3: Kindred Create Module -- `src/Mod/Create/`
@@ -67,9 +66,9 @@ The Create module serves two roles:
**Python bootstrap** (`Init.py`, `InitGui.py`, `addon_loader.py`):
- Scans `mods/` for `package.xml` manifests with `<kindred>` extensions
- Validates version compatibility, resolves dependencies via topological sort
- Loads addons in priority order (sdk → ztools → silo)
- Loads addons in priority order (sdk → solver → gears → datums → silo)
- Populates `FreeCAD.KindredAddons` registry for runtime introspection
- Sets up deferred Silo dock panels, origin registration, and update checker
- Sets up deferred .kc format registration and update checker
**C++ module scaffold** (`App/`, `Gui/`, `CreateGlobal.h`):
- `CreateApp.so` and `CreateGui.so` shared libraries
@@ -91,7 +90,7 @@ The SDK is loaded first (priority 0) and has no dependencies.
### Layer 5: Kindred Addons -- `mods/`
Pure Python addons with `package.xml` manifests. Self-contained with `Init.py`, `InitGui.py`, and `<kindred>` metadata. Developed and versioned independently as git submodules. Must declare `<dependency>sdk</dependency>` to use SDK APIs. Current addons: **silo** (PLM), **gears** (parametric gear generation).
Pure Python addons with `package.xml` manifests. Self-contained with `Init.py`, `InitGui.py`, and `<kindred>` metadata. Developed and versioned independently as git submodules. Must declare `<dependency>sdk</dependency>` to use SDK APIs. Current addons: **solver** (assembly research), **gears** (parametric gear generation), **datums** (unified datum creator), **silo** (PLM).
---
@@ -158,9 +157,9 @@ Theme colors are now centralized in the SDK's YAML palette (`mods/sdk/kindred_sd
### Phase 6: Build system integration -- DONE
**Goal:** CMake install rules for `mods/` submodules so packages include ztools, Silo, and SDK automatically.
**Goal:** CMake install rules for `mods/` submodules so packages include all addons automatically.
**Implementation:** `src/Mod/Create/CMakeLists.txt` includes install rules for all addons (`mods/ztools`, `mods/silo`, `mods/sdk`) and the C++ module scaffold (`App/`, `Gui/`). Build-time code generation: `version.py.in``version.py` via `configure_file()`.
**Implementation:** `src/Mod/Create/CMakeLists.txt` includes install rules for all addons (`mods/sdk`, `mods/solver`, `mods/gears`, `mods/datums`, `mods/silo`) and the C++ module scaffold (`App/`, `Gui/`). Build-time code generation: `version.py.in``version.py` via `configure_file()`.
**CI/CD status:** Release workflows (`.gitea/workflows/release.yml`) build for Linux (AppImage + .deb), macOS (DMG for Intel + Apple Silicon), and Windows (.exe NSIS installer + .7z archive). Builds run on public runners in dockerized mode. Releases are triggered by `v*` tags. See `docs/CI_CD.md` for details.

26
docs/KNOWN_ISSUES.md Normal file
View File

@@ -0,0 +1,26 @@
# Known Issues
**Last updated:** 2026-03-03
## Silo
1. **Auth not production-hardened** -- LDAP/OIDC backends are coded but need infrastructure deployment. Currently only local (bcrypt) auth is tested in production.
2. **No unit tests** for Silo FreeCAD commands or Go backend.
3. **`Silo_BOM` requires Silo-tracked document** -- Unregistered documents show a warning with no inline registration path.
## Assembly
4. **Solver datum handling is minimal** -- Joints referencing datum planes/points may produce incorrect placement. The Kindred fork carries patches to `findPlacement()` for `PartDesign::Plane`, `PartDesign::Point`, `App::Plane`, and `App::Point`, but coverage is incomplete for complex assemblies.
## Theme
5. **QSS edits** -- Only edit `src/Gui/Stylesheets/KindredCreate.qss`. The PreferencePacks copy at `src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss` is generated at build time via `configure_file()`.
## Platform
6. **CI/CD is Linux x86_64 only** -- macOS and Windows build presets are defined but no CI runners are configured.
7. **Wayland fractional scaling** -- Some HiDPI scaling issues remain on Wayland with fractional scaling factors.
## Archived Addons
8. **ztools and QuickNav archived** -- These addons are in `reference/ztools/` and `reference/quicknav/` for reference only. They are not built or loaded. ZTools commands are being reimplemented through the KCSDK system and the datums addon.

View File

@@ -24,6 +24,7 @@
|-----------|------|--------|---------------|
| silo-mod | `mods/silo` | `git.kindred-systems.com/kindred/silo-mod` | `cc6a79f` |
| gears | `mods/gears` | `git.kindred-systems.com/kindred/gears` | `1e26c39` |
| datums | `mods/datums` | `git.kindred-systems.com/kindred/datums` | — |
| solver | `mods/solver` | `git.kindred-systems.com/kindred/solver` | `cd7f66f` |
| OndselSolver | `src/3rdParty/OndselSolver` | `git.kindred-systems.com/kindred/solver` | `fe41fa3` |
| GSL | `src/3rdParty/GSL` | `github.com/microsoft/GSL` | `756c91a` |

View File

@@ -37,9 +37,11 @@ These files/directories exist only in Kindred Create and can be copied directly
| Directory | Description |
|-----------|-------------|
| `icons/kindred/` | 1444 Catppuccin Mocha SVG icon overrides |
| `mods/silo/` | Silo workbench submodule (`silo-mod`) |
| `mods/ztools/` | ZTools workbench submodule |
| `src/Mod/Create/` | Kindred Create workbench (InitGui.py, kc_format.py, update_checker.py, version.py.in) |
| `mods/silo/` | Silo PLM workbench submodule (`silo-mod`) |
| `mods/gears/` | Gears workbench submodule |
| `mods/datums/` | Datums addon submodule |
| `mods/solver/` | Solver addon submodule |
| `src/Mod/Create/` | Kindred Create module (InitGui.py, kc_format.py, update_checker.py, version.py.in) |
| `package/` | rattler-build packaging recipe |
| `docs/` | Kindred documentation (architecture, specifications, guides) |
| `.gitea/` | CI workflows, issue templates, runner configs |
@@ -194,7 +196,7 @@ Files touched: `src/Mod/Assembly/App/AssemblyObject.cpp`, `src/Mod/Assembly/Util
| `CMakeLists.txt` | Re-apply Kindred version variables on top of upstream 1.2.0-dev |
| `package/rattler-build/recipe.yaml` | Update for new version, verify dependency pins |
| `.gitea/workflows/` | Verify CI still works with updated source |
| Submodule pins | Re-add `mods/silo`, `mods/ztools` submodules |
| Submodule pins | Re-add `mods/silo`, `mods/gears`, `mods/datums`, `mods/solver` submodules |
| `src/3rdParty/OndselSolver` | Verify our fork is still needed or if upstream fixed the issues |
---

View File

@@ -15,11 +15,9 @@
# Architecture
- [Overview](./architecture/overview.md)
- [Python as Source of Truth](./architecture/python-source-of-truth.md)
- [Silo Server](./architecture/silo-server.md)
- [Signal Architecture](./architecture/signal-architecture.md)
- [KCSolve: Pluggable Solver](./architecture/ondsel-solver.md)
- [Bootstrap and Addon Loading](./reference/create-module-bootstrap.md)
- [KCSDK C++ Layer](./reference/kcsdk-python.md)
- [KCSolve: Pluggable Solver](./reference/kcsolve-python.md)
# Development
@@ -33,7 +31,6 @@
# Silo Server
- [Overview](./silo-server/overview.md)
- [Specification](./silo-server/SPECIFICATION.md)
- [Configuration](./silo-server/CONFIGURATION.md)
- [Deployment](./silo-server/DEPLOYMENT.md)
@@ -45,7 +42,9 @@
- [Component Audit](./silo-server/COMPONENT_AUDIT.md)
- [Status System](./silo-server/STATUS.md)
- [Gap Analysis](./silo-server/GAP_ANALYSIS.md)
- [Frontend Spec](./silo-server/frontend-spec.md)
- [Modules](./silo-server/MODULES.md)
- [Projects and Approvals](./silo-server/PROJECTS_AND_APPROVALS.md)
- [Workers](./silo-server/WORKERS.md)
- [Installation](./silo-server/INSTALL.md)
- [Solver Service](./silo-server/SOLVER.md)
- [Roadmap](./silo-server/ROADMAP.md)

View File

@@ -37,7 +37,7 @@ Use [Conventional Commits](https://www.conventionalcommits.org/):
| `art:` | Icons, theme, visual assets |
Scope is optional but encouraged:
- `feat(ztools): add datum point creation mode`
- `feat(datums): add datum point creation mode`
- `fix(gui): correct menu icon size on Wayland`
- `chore: update silo submodule`
@@ -45,7 +45,7 @@ Scope is optional but encouraged:
Report issues at the [issue tracker](https://git.kindred-systems.com/kindred/create/issues). When reporting:
1. Note whether the issue involves Kindred Create additions (ztools, Silo, theme) or base FreeCAD
1. Note whether the issue involves Kindred Create additions (Silo, Gears, Datums, theme) or base FreeCAD
2. Include version info from **Help > About FreeCAD > Copy to clipboard**
3. Provide reproduction steps and attach example files (FCStd as ZIP) if applicable

View File

@@ -6,6 +6,7 @@ create/
│ ├── App/ # Core application (C++)
│ ├── Base/ # Base classes (C++)
│ ├── Gui/ # GUI framework and stylesheets (C++)
│ │ └── SDK/ # KCSDK C++ library (libKCSDK)
│ ├── Main/ # Application entry points
│ ├── Mod/ # FreeCAD modules (~37)
│ │ ├── Create/ # Kindred bootstrap module
@@ -17,9 +18,15 @@ create/
│ └── 3rdParty/
│ ├── OndselSolver/ # Assembly solver (submodule)
│ └── GSL/ # Guidelines Support Library (submodule)
├── mods/ # Kindred addon workbenches (submodules)
│ ├── ztools/ # ztools workbench
── silo/ # Silo parts database
├── mods/ # Kindred addon modules
│ ├── sdk/ # Addon SDK — stable API contract (priority 0)
── solver/ # Assembly solver research (submodule, priority 10)
│ ├── gears/ # Gears workbench (submodule, priority 40)
│ ├── datums/ # Unified datum creator (submodule, priority 45)
│ └── silo/ # Silo PLM workbench (submodule, priority 60)
├── reference/ # Archived addons (not built)
│ ├── ztools/ # Archived — commands migrated to datums + core
│ └── quicknav/ # Archived — navigation addon
├── icons/ # Icon theming (kindred overrides, palettes, retheme script)
│ ├── kindred/ # Hand-crafted Catppuccin Mocha SVG overrides (~1444 icons)
│ ├── mappings/ # Color palette CSVs (FCAD.csv, kindred.csv)
@@ -29,10 +36,7 @@ create/
│ └── icons/ # Platform icons (.ico, .icns, hicolor)
├── package/ # Packaging scripts
│ ├── debian/ # Debian package
── ubuntu/ # Ubuntu-specific
│ ├── fedora/ # RPM package
│ ├── rattler-build/ # Cross-platform bundles (AppImage, DMG, NSIS)
│ └── WindowsInstaller/ # NSIS installer definition
── rattler-build/ # Cross-platform bundles (AppImage, DMG, NSIS)
├── .gitea/workflows/ # CI/CD pipelines
│ ├── build.yml # Build + test on push/PR
│ └── release.yml # Release on tag push
@@ -41,9 +45,6 @@ create/
│ └── lib/ # Google Test framework (submodule)
├── cMake/ # CMake helper modules
├── docs/ # Documentation (this book)
├── tools/ # Dev utilities (build, lint, profile)
├── contrib/ # IDE configs (VSCode, CLion, debugger)
├── data/ # Example and test data
├── CMakeLists.txt # Root build configuration
├── CMakePresets.json # Platform build presets
├── pixi.toml # Pixi environment and tasks
@@ -57,8 +58,10 @@ create/
| Submodule | Path | Source | Purpose |
|-----------|------|--------|---------|
| ztools | `mods/ztools` | `git.kindred-systems.com/forbes/ztools` | Unified workbench |
| silo-mod | `mods/silo` | `git.kindred-systems.com/kindred/silo-mod` | Parts database |
| silo-mod | `mods/silo` | `git.kindred-systems.com/kindred/silo-mod` | PLM workbench |
| gears | `mods/gears` | `git.kindred-systems.com/kindred/gears` | Parametric gear generation |
| datums | `mods/datums` | `git.kindred-systems.com/kindred/datums` | Unified datum creator |
| solver | `mods/solver` | `git.kindred-systems.com/kindred/solver` | Assembly solver research |
| OndselSolver | `src/3rdParty/OndselSolver` | `git.kindred-systems.com/kindred/solver` | Assembly solver |
| GSL | `src/3rdParty/GSL` | `github.com/microsoft/GSL` | C++ guidelines library |
| AddonManager | `src/Mod/AddonManager` | `github.com/FreeCAD/AddonManager` | Extension manager |
@@ -69,8 +72,11 @@ create/
| File | Purpose |
|------|---------|
| `src/Mod/Create/Init.py` | Console-phase bootstrap — loads addons |
| `src/Mod/Create/InitGui.py` | GUI-phase bootstrap — registers workbenches, deferred setup |
| `src/Mod/Create/InitGui.py` | GUI-phase bootstrap — kc_format, update checker |
| `src/Mod/Create/addon_loader.py` | Manifest-driven addon loader with dependency resolution |
| `src/Gui/FileOrigin.h` | Abstract file origin interface (Kindred addition) |
| `src/Gui/EditingContext.h` | Editing context resolver (Kindred addition) |
| `src/Gui/SDK/` | KCSDK C++ library — stable addon API |
| `src/Gui/Stylesheets/KindredCreate.qss` | Catppuccin Mocha theme |
| `pixi.toml` | Build tasks and dependencies |
| `CMakeLists.txt` | Root CMake configuration |

View File

@@ -50,8 +50,8 @@ Every addon needs a `package.xml` with a `<kindred>` extension block. The `<work
| Range | Use |
|-------|-----|
| 0-9 | SDK and core infrastructure |
| 10-49 | Foundation addons |
| 50-99 | Standard addons (ztools, silo) |
| 10-49 | Foundation addons (solver, gears, datums) |
| 50-99 | Standard addons (silo) |
| 100+ | Optional/user addons |
See [Package.xml Schema Extensions](./package-xml-schema.md) for the full schema.

View File

@@ -19,12 +19,14 @@ If cloned without `--recursive`:
git submodule update --init --recursive
```
The repository includes six submodules:
The repository includes several submodules:
| Submodule | Path | Source |
|-----------|------|--------|
| ztools | `mods/ztools` | `git.kindred-systems.com/forbes/ztools` |
| silo-mod | `mods/silo` | `git.kindred-systems.com/kindred/silo-mod` |
| gears | `mods/gears` | `git.kindred-systems.com/kindred/gears` |
| datums | `mods/datums` | `git.kindred-systems.com/kindred/datums` |
| solver | `mods/solver` | `git.kindred-systems.com/kindred/solver` |
| OndselSolver | `src/3rdParty/OndselSolver` | `git.kindred-systems.com/kindred/solver` |
| GSL | `src/3rdParty/GSL` | `github.com/microsoft/GSL` |
| AddonManager | `src/Mod/AddonManager` | `github.com/FreeCAD/AddonManager` |
@@ -98,7 +100,7 @@ ccache is auto-detected by CMake at configure time.
## Common problems
**Submodules not initialized:** If you see missing file errors for ztools or Silo, run `pixi run initialize` or `git submodule update --init --recursive`.
**Submodules not initialized:** If you see missing file errors for addon modules, run `pixi run initialize` or `git submodule update --init --recursive`.
**Pixi not found:** Install pixi from <https://pixi.sh>.

View File

@@ -33,7 +33,7 @@ See [Installation](./installation.md) for prebuilt package details and [Building
On first launch, Kindred Create:
1. Loads **ztools** commands and the **Silo** workbench via the Create bootstrap module
1. Loads addon modules (SDK, Solver, Gears, Datums, Silo) via the Create bootstrap module
2. Opens the **PartDesign** workbench as the default (with context-driven toolbars)
3. Prompts for Silo server configuration if not yet set up
4. Checks for application updates in the background (after ~10 seconds)

View File

@@ -32,12 +32,14 @@ The AppImage is a self-contained bundle using squashfs with zstd compression. No
Launch Kindred Create and check the console output (View > Report View) for:
```
Create: Loaded ztools Init.py
Create: Loaded silo Init.py
Create module initialized
addon_loader: loading sdk (priority 0)
addon_loader: loading solver (priority 10)
addon_loader: loading gears (priority 40)
addon_loader: loading datums (priority 45)
addon_loader: loading silo (priority 60)
```
This confirms the bootstrap module loaded both workbenches. If Silo is not configured, you will see a settings prompt on first launch.
This confirms the bootstrap module loaded all addons. If Silo is not configured, you will see a settings prompt on first launch.
## Uninstalling

View File

@@ -1,23 +1,27 @@
# Workbenches
Kindred Create ships two custom workbenches on top of FreeCAD's standard set.
Kindred Create ships several addon modules on top of FreeCAD's standard set.
## ztools
## Gears
A unified workbench that consolidates part design, assembly, and sketcher tools into a single interface. It is the **default workbench** when Kindred Create launches.
A parametric gear generation workbench for creating involute spur gears, helical gears, and other gear profiles directly within FreeCAD assemblies.
ztools commands are also injected into the PartDesign workbench menus and toolbars via a manipulator mechanism, so they are accessible even when working in stock PartDesign.
## Datums
See the [ztools guide](./ztools.md) for details.
A unified datum creator that replaces the three stock PartDesign datum commands (Plane, Line, Point) with a single `Create_DatumCreator` command. Provides 16 smart creation modes with auto-detection from geometry selection. Injected into PartDesign body and feature contexts via the SDK.
## Silo
A parts database workbench for managing CAD files, part numbers, revisions, and bills of materials across teams. Silo commands (New, Open, Save, Commit, Pull, Push, Info, BOM) are integrated into the File menu and toolbar across **all** workbenches via the origin system.
A parts lifecycle management workbench for managing CAD files, part numbers, revisions, and bills of materials across teams. Silo commands (New, Open, Save, Commit, Pull, Push, Info, BOM) are integrated into the File menu and toolbar across **all** workbenches via the origin system.
Silo requires a running server instance. On first launch, Kindred Create prompts for server configuration.
See the [Silo guide](./silo.md) for details.
## Solver
An experimental assembly solver research addon using GNN-based constraint solving.
## Stock FreeCAD workbenches
All standard FreeCAD workbenches are available: PartDesign, Sketcher, Assembly, TechDraw, Draft, BIM, CAM, FEM, Mesh, Spreadsheet, and others. Kindred Create does not remove or disable any stock functionality.

View File

@@ -1,30 +1,36 @@
# Kindred Create
Kindred Create is a fork of [FreeCAD](https://www.freecad.org) 1.0+ that adds integrated tooling for professional engineering workflows. It ships custom workbenches and a dark theme on top of FreeCAD's parametric modeling core.
Kindred Create is a fork of [FreeCAD](https://www.freecad.org) 1.0+ that adds integrated tooling for professional engineering workflows. It ships custom workbenches, a C++ SDK extension layer, and a dark theme on top of FreeCAD's parametric modeling core.
- **License:** LGPL 2.1+
- **Organization:** [Kindred Systems LLC](https://www.kindred-systems.com)
- **Build system:** CMake + [pixi](https://pixi.sh)
- **Current version:** Kindred Create v0.1.0 (FreeCAD base v1.0.0)
- **Current version:** Kindred Create v0.1.5 (FreeCAD base v1.2.0)
## Key features
**[ztools](./guide/ztools.md)** A unified workbench that consolidates part design, assembly, and sketcher tools into a single interface. Adds custom datum creation (planes, axes, points with 16 creation modes), pattern tools for assemblies, an enhanced pocket with flip-side cutting, and spreadsheet formatting commands.
**[Silo](./guide/silo.md)** -- A parts lifecycle management system for managing CAD files, part numbers, revisions, and bills of materials across teams. Includes a Go REST API server backed by PostgreSQL and MinIO, with FreeCAD commands for opening, saving, and syncing files directly from the application.
**[Silo](./guide/silo.md)** — A parts database system for managing CAD files, part numbers, revisions, and bills of materials across teams. Includes a Go REST API server backed by PostgreSQL and MinIO, with FreeCAD commands for opening, saving, and syncing files directly from the application.
**Gears** -- A parametric gear generation workbench for creating involute spur gears, helical gears, and other gear profiles directly within FreeCAD assemblies.
**Catppuccin Mocha theme** A dark theme applied across the entire application, including the 3D viewport, sketch editor, spreadsheet view, and tree view. Uses spanning-line branch indicators instead of disclosure arrows, with tuned preference defaults for document handling, selection behavior, and notifications.
**Datums** -- A unified datum creator that replaces the three stock PartDesign datum commands (Plane, Line, Point) with a single command providing 16 smart creation modes with auto-detection from geometry selection.
**Origin system** A pluggable file backend abstraction. The origin selector in the File toolbar lets you switch between local filesystem operations and Silo database operations. Silo commands (Commit, Pull, Push, Info, BOM) are available across all workbenches when Silo is the active origin.
**KCSDK** -- A C++ shared library (`libKCSDK`) with pybind11 bindings providing stable interfaces for dock panels, toolbars, menus, themes, and editing contexts. Python addons access it through the `kindred_sdk` wrapper package.
**Update checker** — On startup, Kindred Create checks the Gitea releases API for newer versions and logs the result. Configurable check interval and skip-version preferences.
**Catppuccin Mocha theme** -- A dark theme applied across the entire application, including the 3D viewport, sketch editor, spreadsheet view, and tree view. Uses spanning-line branch indicators instead of disclosure arrows, with tuned preference defaults for document handling, selection behavior, and notifications.
**Origin system** -- A pluggable file backend abstraction. The origin selector in the File toolbar lets you switch between local filesystem operations and Silo database operations. Silo commands (Commit, Pull, Push, Info, BOM) are available across all workbenches when Silo is the active origin.
**Update checker** -- On startup, Kindred Create checks the Gitea releases API for newer versions and logs the result. Configurable check interval and skip-version preferences.
## How it relates to FreeCAD
Kindred Create is a fork/distribution of FreeCAD 1.0+. The design minimizes core modifications custom functionality is delivered through submodule addons (ztools, Silo) that follow FreeCAD's standard workbench pattern. If the addon submodules are missing, Kindred Create still functions as a themed FreeCAD.
Kindred Create is a fork/distribution of FreeCAD 1.0+. The design minimizes core modifications -- custom functionality is delivered through submodule addons (Silo, Gears, Datums, Solver) that follow FreeCAD's standard workbench pattern. If the addon submodules are missing, Kindred Create still functions as a themed FreeCAD.
The primary additions to FreeCAD's core are:
- The **origin system** (`FileOrigin` interface in `src/Gui/`) for pluggable file backends
- The **editing context system** (`EditingContextResolver` in `src/Gui/`) for context-driven UI
- The **KCSDK** C++ library (`src/Gui/SDK/`) for addon integration
- The **Create bootstrap module** (`src/Mod/Create/`) that loads addons at startup
- The **Catppuccin Mocha theme** (`KindredCreate.qss`) and preference pack
- Patches to **Assembly** (`findPlacement()` datum/origin handling)

View File

@@ -5,41 +5,42 @@ The Create module (`src/Mod/Create/`) is the integration layer that bootstraps K
**Source files:**
- `src/Mod/Create/Init.py` -- console-phase addon loading
- `src/Mod/Create/InitGui.py` -- GUI-phase workbench loading and deferred timers
- `src/Mod/Create/InitGui.py` -- GUI-phase addon loading and deferred timers
- `src/Mod/Create/addon_loader.py` -- manifest-driven loader with dependency resolution
- `src/Mod/Create/update_checker.py` -- Gitea releases API polling
- `src/Mod/Create/kc_format.py` -- .kc file format round-trip preservation
## Loading Mechanism
FreeCAD loads module `Init.py` and `InitGui.py` files using **direct `exec()`**, not Python's import system. The C++ startup code scans `Mod/` directories, reads each file as text, compiles it, and executes it in an isolated namespace:
FreeCAD loads module `Init.py` and `InitGui.py` files using **direct `exec()`**, not Python's import system. The C++ startup code scans `Mod/` directories, reads each file as text, compiles it, and executes it in an isolated namespace.
```python
source = init_py.read_text(encoding="utf-8")
code = compile(source, init_py, "exec")
exec(code)
```
Modules loaded this way are **not** added to `sys.modules`. Each execution gets a fresh globals dict with no caching or dependency resolution.
The addon loader (`addon_loader.py`) then discovers addons in `mods/` via their `package.xml` manifests, resolves dependencies via topological sort, and loads them in priority order.
## Phase 1: Console (`Init.py`)
Runs immediately at application startup, before any GUI is available.
`setup_kindred_addons()` discovers and loads two built-in addons from `mods/`:
`addon_loader.load_addons(gui=False)` discovers and loads addons from `mods/`:
| Addon | Path | Purpose |
|-------|------|---------|
| ztools | `mods/ztools/ztools/` | Part design, assembly, and sketcher tools |
| silo | `mods/silo/freecad/` | Database integration and version control |
| Addon | Priority | Purpose |
|-------|----------|---------|
| sdk | 0 | Stable API contract |
| solver | 10 | Assembly solver research |
| gears | 40 | Parametric gear generation |
| datums | 45 | Unified datum creator |
| silo | 60 | PLM workbench |
For each addon:
1. Build the path from `FreeCAD.getHomePath() + "mods/" + addon_path`
2. Add to `sys.path` if not already present
3. Find `Init.py` in the addon directory
4. Execute it with `exec(compile(source, init_file, "exec"), exec_globals)`
1. Discover `package.xml` manifest (depth 1 or 2)
2. Parse `<kindred>` extensions (version bounds, priority, dependencies)
3. Validate version compatibility
4. Resolve load order via topological sort on dependencies
5. Add addon dir to `sys.path`
6. Execute `Init.py`
7. Register in `FreeCAD.KindredAddons`
Failures are logged to `FreeCAD.Console.PrintWarning()` and do not prevent other addons from loading.
Failures are logged to `FreeCAD.Console` and do not prevent other addons from loading.
## Phase 2: GUI (`InitGui.py`)
@@ -47,35 +48,36 @@ Runs after the console phase, when `FreeCADGui` is available.
### Synchronous
`setup_kindred_workbenches()` loads `InitGui.py` from the same two addons (ztools, silo), registering their workbenches and GUI commands.
`addon_loader.load_addons(gui=True)` loads `InitGui.py` from each addon in the same resolved order, registering workbenches and GUI commands.
### Deferred Timers
### Deferred Timers (Create core)
Six `QTimer.singleShot` calls stagger initialization to let the GUI event loop settle:
Two `QTimer.singleShot` calls in `src/Mod/Create/InitGui.py`:
| Delay | Function | Purpose |
|-------|----------|---------|
| 500 ms | `_register_kc_format()` | Register .kc file format observer |
| 1500 ms | `_register_silo_origin()` | Register Silo as a file origin |
| 2000 ms | `_setup_silo_auth_panel()` | Dock the Database Auth panel |
| 3000 ms | `_check_silo_first_start()` | Show settings dialog on first run |
| 4000 ms | `_setup_silo_activity_panel()` | Dock the Database Activity panel |
| 10000 ms | `_check_for_updates()` | Poll Gitea for new releases |
Every timer callback is wrapped in `try/except`. Failures log to `FreeCAD.Console.PrintLog()` and do not crash the application.
### Deferred Timers (Silo addon)
The Silo addon manages its own deferred setup in `mods/silo/InitGui.py`:
| Delay | Function | Purpose |
|-------|----------|---------|
| 500 ms | `_handle_startup_urls()` | Process kindred:// URLs |
| 600 ms | `_register_silo_document_observer()` | .kc tree building observer |
| 2000 ms | `_setup_silo_auth_panel()` | "Database Auth" dock panel |
| 2500 ms | Silo overlay registration | "Silo Origin" toolbar overlay |
| 3000 ms | `_check_silo_first_start()` | Settings prompt on first run |
| 4000 ms | `_setup_silo_activity_panel()` | "Database Activity" dock panel |
Every timer callback is wrapped in `try/except`. Failures log to `FreeCAD.Console` and do not crash the application.
### Timer Details
**_register_kc_format (500 ms)** -- Imports `kc_format` and calls `kc_format.register()`, which installs a `DocumentObserver` with `slotStartSaveDocument` / `slotFinishSaveDocument` hooks. These cache `silo/` ZIP entries before FreeCAD's C++ save rewrites the archive, then re-inject them afterwards. Only processes `.kc` files.
**_register_silo_origin (1500 ms)** -- Imports `silo_origin` and calls `silo_origin.register_silo_origin()`, making Silo available in the origin selector dropdown alongside LocalFileOrigin.
**_setup_silo_auth_panel (2000 ms)** -- Creates a `QDockWidget` titled "Database Auth" containing a `SiloAuthDockWidget` from `silo_commands`. Docked on the right side of the main window. Guards against duplicates by checking if the widget already exists.
**_check_silo_first_start (3000 ms)** -- Reads `User parameter:BaseApp/Preferences/Mod/KindredSilo`. On the very first launch (when `FirstStartChecked` is not set), runs the `Silo_Settings` command if no API URL is configured.
**_setup_silo_activity_panel (4000 ms)** -- Creates a "Database Activity" dock widget showing the 20 most recent Silo items (part number, description, date). Falls back to "(Unable to connect to Silo database)" on connection failure.
**_check_for_updates (10000 ms)** -- Calls `update_checker._run_update_check()` in the background.
## Update Checker
@@ -112,21 +114,32 @@ The checker never shows a dialog -- it only logs to `FreeCAD.Console`.
FreeCAD startup
|
Init.py (exec'd, immediate)
+-- setup_kindred_addons()
| +-- ztools/Init.py (exec'd)
| +-- silo/freecad/Init.py (exec'd)
+-- addon_loader.load_addons(gui=False)
| +-- sdk/Init.py
| +-- solver/Init.py
| +-- gears/Init.py
| +-- datums/Init.py
| +-- silo/Init.py
|
[GUI startup]
|
InitGui.py (exec'd, immediate)
+-- setup_kindred_workbenches()
| +-- ztools/InitGui.py (exec'd)
| +-- silo/freecad/InitGui.py (exec'd)
+-- addon_loader.load_addons(gui=True)
| +-- sdk/InitGui.py
| +-- solver/InitGui.py
| +-- gears/InitGui.py
| +-- datums/InitGui.py
| +-- silo/InitGui.py (schedules its own deferred timers)
|
+-- QTimer 500ms --> kc_format.register()
+-- QTimer 1500ms --> silo_origin.register_silo_origin()
+-- QTimer 2000ms --> SiloAuthDockWidget
+-- QTimer 3000ms --> Silo first-start check
+-- QTimer 4000ms --> Database Activity panel
Create core timers:
+-- QTimer 500ms --> kc_format.register()
+-- QTimer 10000ms --> update_checker._run_update_check()
Silo addon timers (scheduled from silo/InitGui.py):
+-- QTimer 500ms --> kindred:// URL handler
+-- QTimer 600ms --> document observer
+-- QTimer 2000ms --> auth dock panel
+-- QTimer 2500ms --> Silo overlay
+-- QTimer 3000ms --> first-start check
+-- QTimer 4000ms --> activity dock panel
```

View File

@@ -1,11 +1,14 @@
# Datum Creator System
The ZTools Datum Creator (`ZTools_DatumCreator`) creates parametric datum planes, axes, and points. It auto-detects the datum type from selected geometry and provides a unified task panel with 16 creation modes.
The Datum Creator (`Create_DatumCreator`) creates parametric datum planes, axes, and points. It auto-detects the datum type from selected geometry and provides a unified task panel with 16 creation modes.
**Source files:**
- `mods/ztools/ztools/ztools/commands/datum_commands.py` -- UI, selection handling, mode detection
- `mods/ztools/ztools/ztools/datums/core.py` -- geometry computation and FreeCAD object creation
- `mods/datums/datums/command.py` -- UI, selection handling, mode detection
- `mods/datums/datums/core.py` -- geometry computation and FreeCAD object creation
- `mods/datums/datums/detection.py` -- auto-detection algorithm
- `mods/datums/datums/panel.py` -- task panel UI
- `mods/datums/datums/edit_panel.py` -- edit panel with real-time parameter updates
## Geometry Classification
@@ -90,7 +93,7 @@ The detected mode is displayed with a category color:
```
+-------------------------------------+
| ZTools Datum Creator |
| Datum Creator |
+-------------------------------------+
| Selection |
| [icon] Element Name [Remove] |
@@ -167,11 +170,7 @@ Each `core.*` function:
1. Creates the FreeCAD object (`PartDesign::Plane` in a body, `Part::Plane` at document level)
2. Computes the placement from the source geometry
3. Configures attachment (MapMode, AttachmentSupport, offset) for parametric updates
4. Stores ZTools metadata in custom properties:
- `ZTools_Type` -- creation method identifier (e.g. `"offset_from_face"`)
- `ZTools_Params` -- parameters as JSON (e.g. `{"distance": 10}`)
- `ZTools_SourceRefs` -- source geometry references as JSON
5. Applies Catppuccin Mocha styling (mauve at 70% transparency for planes)
6. Optionally links parameters to a spreadsheet alias
4. Applies Catppuccin Mocha styling (mauve at 70% transparency for planes)
5. Optionally links parameters to a spreadsheet alias
Auto-naming uses the format `ZPlane_Offset_001`, incrementing the index for each new datum of the same type.
Auto-naming uses the format `DatumPlane_Offset_001`, incrementing the index for each new datum of the same type.

View File

@@ -12,11 +12,13 @@
**FileOrigin** — Abstract C++ interface in `src/Gui/` that defines a pluggable file backend. Implementations: `LocalFileOrigin` (filesystem) and `SiloOrigin` (database).
**FreeCAD** — Open-source parametric 3D CAD platform. Kindred Create is based on FreeCAD v1.0.0. Website: <https://www.freecad.org>
**FreeCAD** — Open-source parametric 3D CAD platform. Kindred Create is based on FreeCAD v1.2.0. Website: <https://www.freecad.org>
**Kindred Create** — The full application: a FreeCAD fork plus Kindred's addon workbenches, theme, and tooling.
**Manipulator** — FreeCAD mechanism for injecting commands from one workbench into another's menus and toolbars. Used by ztools to add commands to PartDesign.
**KCSDK** — Kindred Create SDK. A C++ shared library (`libKCSDK`) with pybind11 bindings (`kcsdk` Python module) providing stable interfaces for dock panels, toolbars, menus, themes, and editing contexts.
**Manipulator** — FreeCAD mechanism for injecting commands from one workbench into another's menus and toolbars.
**MinIO** — S3-compatible object storage server. Used by Silo to store binary `.FCStd` files.
@@ -38,15 +40,15 @@
**Workbench** — FreeCAD's plugin/module system. Each workbench provides a set of tools, menus, and toolbars for a specific task domain.
**ztools** — Kindred's unified workbench combining Part Design, Assembly, and Sketcher tools with custom datum creation and assembly patterns.
## Repository URLs
| Repository | URL |
|------------|-----|
| Kindred Create | <https://git.kindred-systems.com/kindred/create> |
| ztools | <https://git.kindred-systems.com/forbes/ztools> |
| silo-mod | <https://git.kindred-systems.com/kindred/silo-mod> |
| gears | <https://git.kindred-systems.com/kindred/gears> |
| datums | <https://git.kindred-systems.com/kindred/datums> |
| solver | <https://git.kindred-systems.com/kindred/solver> |
| OndselSolver | <https://git.kindred-systems.com/kindred/solver> |
| GSL | <https://github.com/microsoft/GSL> |
| AddonManager | <https://github.com/FreeCAD/AddonManager> |