Commit Graph

33762 Commits

Author SHA1 Message Date
forbes
264e82179d feat(create): server integration for silo viewer widgets
All checks were successful
Build and Test / build (pull_request) Successful in 29m45s
Wire live data fetching, SSE subscriptions, and server write-back into
the History, Metadata, and Dependency viewer widgets.

Changes:
- Add server integration helpers (_init_server, _is_online,
  _get_part_number, offline banner) with lazy silo_commands import
- SiloHistoryViewer: Refresh button fetches live revisions via
  SiloClient.get_revisions(); SSE revision_created auto-refreshes
- SiloMetadataEditor: Save pushes to server (update_metadata,
  patch_lifecycle, patch_tags); SSE item_updated refreshes form
  when no local edits pending; offline banner
- SiloDependencyTable: Server-side UUID resolution via
  resolve_dependencies(); Download button for unresolved items;
  Refresh re-checks status; three-state icons (resolved/
  downloadable/missing)
- All viewers show 'Offline — showing cached data' banner when
  disconnected and disable server-dependent controls

Bump silo submodule to track new silo-client API methods:
  get_metadata, update_metadata, patch_lifecycle, patch_tags,
  resolve_dependencies (silo-client PR #19)

Closes kindred/silo-mod#43
2026-02-18 19:36:04 -06:00
forbes
9748384e7d art(create): placeholder tree-node icons for Silo viewer nodes (#42)
All checks were successful
Build and Test / build (pull_request) Successful in 29m26s
Add 10 SVG placeholder icons copied from existing silo action icons.
These provide immediate visual feedback in the document tree while
proper Catppuccin-themed icons are designed later.

Icons: silo-group, silo-manifest, silo-metadata, silo-history,
silo-approvals, silo-dependencies, silo-job, silo-macro,
silo-jobs-group, silo-macros-group

Also adds install(DIRECTORY) rule for resources/icons/ in CMakeLists.

Closes #42
2026-02-18 18:53:55 -06:00
forbes
bb14d7b0ef feat(create): remaining viewers — dependencies, jobs, macros, approvals (#41)
All checks were successful
Build and Test / build (pull_request) Successful in 31m3s
Add four viewer widgets for the remaining Silo tree node types:

- SiloApprovalsViewer: ECO approval status cards with colored status
  icons, state badge, and Open in Silo Web UI button
- SiloDependencyTable: QTableView with resolution status (checks open
  documents for matching part_uuid)
- SiloJobViewer: YAML source editor with Edit/Lock toggle, monospace
  font, dirty tracking, and unsaved-changes guard
- SiloMacroEditor: Python source editor with Run Now (exec in FreeCAD
  context), Save button, and dirty tracking

Also extends the viewer factory with prefix-based routing for
silo/jobs/*.yaml and silo/macros/*.py entries.

Closes #41
2026-02-18 18:46:06 -06:00
forbes
29f4a7b110 feat(create): history viewer — revision timeline display (#40)
All checks were successful
Build and Test / build (pull_request) Successful in 29m36s
Add SiloHistoryViewer widget that opens in an MDI subwindow when the
user double-clicks the History node in the Silo tree. Displays revision
cards newest-first with revision number, Catppuccin-themed lifecycle
status badges, author, timestamp, and commit comment.

Changes:
- silo_viewers.py: SiloHistoryViewer with revision card layout,
  status badge QSS, scroll area, empty-history placeholder

Closes #40
2026-02-18 18:41:56 -06:00
forbes
e947822c7a feat(create): metadata editor — editable form with dirty tracking and save-back (#39)
All checks were successful
Build and Test / build (pull_request) Successful in 30m48s
Add SiloMetadataEditor widget that opens in an MDI subwindow when the
user double-clicks the Metadata node in the Silo tree. Supports editing
lifecycle state, tags (add/remove chips), and schema-defined fields with
type-inferred widgets (QCheckBox, QDoubleSpinBox, QLineEdit).

Changes:
- silo_viewers.py: SiloMetadataEditor with dirty tracking, Save/Reset
  buttons, unsaved-changes close guard, and tag chip management
- silo_objects.py: mark_dirty()/is_dirty()/clear_dirty() on proxy
- kc_format.py: fix entries=None before hooks; _metadata_save_hook
  writes dirty RawContent back to silo/ cache on document save

Closes #39
2026-02-18 17:11:05 -06:00
forbes
90728414a9 feat(create): manifest viewer — read-only MDI widget for silo/manifest.json (#38)
All checks were successful
Build and Test / build (pull_request) Successful in 29m13s
Add SiloManifestViewer widget that opens in an MDI subwindow when the
user double-clicks the Manifest node in the Silo tree. Displays all
manifest.json fields in a read-only QFormLayout with copy buttons for
Part UUID and Silo Instance.

New files:
- silo_viewers.py: SiloManifestViewer widget + create_viewer_widget()
  factory with _VIEWER_REGISTRY for future viewer classes

Modified files:
- silo_viewproviders.py: doubleClicked() wired to open MDI subwindow
  with deduplication via widget objectName()
- CMakeLists.txt: add silo_viewers.py to install list

Closes #38
2026-02-18 16:48:34 -06:00
forbes
65f24b23eb feat(create): silo tree foundation for .kc files (#37)
All checks were successful
Build and Test / build (pull_request) Successful in 29m13s
Add document tree infrastructure that creates Silo metadata nodes when
a .kc file is opened. Nodes appear under a "Silo" group and represent
the silo/ ZIP directory entries (manifest, metadata, history, etc.).

New files:
- silo_objects.py: SiloViewerObject proxy with Transient properties
- silo_viewproviders.py: SiloViewerViewProvider with icon stubs
- silo_tree.py: SiloTreeBuilder with conditional node creation
- silo_document.py: SiloDocumentObserver singleton + registration

Modified files:
- kc_format.py: pre_reinject hook system for silo/ entry mutation
- InitGui.py: 600ms timer registration for document observer
- CMakeLists.txt: install list for 4 new Python files

Closes #37
2026-02-18 16:36:29 -06:00
5d8a253956 feat(create): add C++ module scaffold with App/ and Gui/ targets (#251)
Some checks failed
Build and Test / build (pull_request) Failing after 2m2s
Establish build infrastructure for Kindred-specific C++ features:

- CreateGlobal.h: export macros (CreateExport, CreateGuiExport)
- App/: CreateApp shared library (PyMOD_INIT_FUNC, Py::ExtensionModule)
- Gui/: CreateGui shared library (links CreateApp + FreeCADGui)
- CMakeLists.txt: add_subdirectory(App) + conditional add_subdirectory(Gui)

Scaffold only — no features. Follows the Assembly module pattern.
Existing Python Init.py/InitGui.py bootstrap unchanged.
2026-02-17 11:50:44 -06:00
64edae4c04 refactor: migrate ztools and Silo to kindred-addon-sdk (#250)
Some checks failed
Build and Test / build (pull_request) Failing after 1m51s
Route platform API calls through kindred_sdk wrappers:

ZTools:
- Replace hardcoded MOCHA dict with kindred_sdk.get_theme_tokens()
- Add sdk dependency to package.xml

Silo:
- Replace FreeCADGui.registerEditingOverlay() with kindred_sdk.register_overlay()
- Replace FreeCADGui.addOrigin()/removeOrigin() with kindred_sdk wrappers
- Replace hardcoded _MOCHA palette subset with kindred_sdk.get_theme_tokens()
- Add sdk dependency to package.xml

Create module:
- Replace dock panel boilerplate with kindred_sdk.register_dock_panel()

Behavior is identical before and after — this is a refactor only.

Closes #250
2026-02-17 08:59:56 -06:00
e667aceead feat(addon-system): create kindred-addon-sdk package (#249)
Some checks failed
Build and Test / build (pull_request) Failing after 1m40s
Add mods/sdk/ with the kindred_sdk Python package providing a stable
API layer for addon integration with Kindred Create platform features.

Modules:
- context: editing context/overlay registration wrappers
- theme: YAML-driven palette system (Catppuccin Mocha)
- origin: FileOrigin registration helpers
- dock: deferred dock panel registration
- compat: version detection utilities

The SDK loads at priority 0 (before all other addons) via the existing
manifest-driven loader. Theme colors are defined in a single YAML
palette file instead of hardcoded Python dicts, enabling future theme
support and eliminating color duplication across addons.

Closes #249
2026-02-17 08:36:27 -06:00
34964066a0 Merge pull request 'feat(addon-system): add <kindred> package.xml extensions and schema docs' (#257) from feat/package-xml-schema into main
Some checks failed
Deploy Docs / build-and-deploy (push) Successful in 46s
Build and Test / build (push) Failing after 2m1s
Reviewed-on: #257
2026-02-17 13:15:47 +00:00
forbes
9dd43a7cc3 feat: addon registry with runtime introspection API (#253)
All checks were successful
Build and Test / build (pull_request) Successful in 44m33s
Add FreeCAD.getAddonRegistry() function for runtime addon introspection.

Changes to addon_loader.py:
- Add contexts field to AddonManifest for tracking context IDs
- Add register_context() method for addons to declare contexts at runtime
- Add contexts() method returning {context_id: [addon_names]} mapping
- Parse <contexts> element from <kindred> in package.xml
- Add getAddonRegistry() function returning the registry singleton

Changes to Init.py:
- Expose getAddonRegistry as FreeCAD.getAddonRegistry after loading

Usage:
  registry = FreeCAD.getAddonRegistry()
  registry.get('ztools')        # AddonManifest for ztools
  registry.loaded()             # list of loaded addons
  registry.is_loaded('silo')    # True/False
  registry.contexts()           # {context_id: [addon_names]}

Closes #253
2026-02-16 17:33:28 -06:00
98d1877472 feat(addon-system): add <kindred> package.xml extensions and schema docs
Some checks failed
Build and Test / build (pull_request) Failing after 2m59s
Add <kindred> elements to ztools (priority=50) and silo (priority=60)
package.xml files declaring min_create_version, load_priority,
pure_python, and context metadata.

Fix addon_loader.py topological sort to use level-by-level processing
with (priority, name) sorting within each level, replacing
static_order() which did not guarantee deterministic ordering.

Add docs/src/development/package-xml-schema.md documenting the full
field reference, schema example, and backward compatibility notes.

Closes #252
2026-02-16 14:21:27 -06:00
60ceb47e4f feat(bootstrap): replace exec()-based addon loading with manifest-driven loader
All checks were successful
Build and Test / build (pull_request) Successful in 34m4s
Add addon_loader.py implementing a six-stage pipeline: scan mods/ for
package.xml files, parse standard fields and optional <kindred>
extensions via ElementTree, validate version compatibility, resolve
load order via graphlib.TopologicalSorter (with legacy fallback),
exec() Init.py/InitGui.py, and populate a runtime AddonRegistry
exposed as FreeCAD.KindredAddons.

Replace hard-coded addon lists in Init.py and InitGui.py with calls
to addon_loader.load_addons(). All QTimer-based Silo integration code
in InitGui.py is unchanged.

Backward compatible: addons without <kindred> elements load with no
constraints using the existing ztools-then-silo order.

Closes #248
2026-02-16 13:13:46 -06:00
forbes
2fa1672edf fix(assembly): guard onChanged against solver during document restore
Some checks failed
Build and Test / build (pull_request) Has been cancelled
During document restore, PropertyLinkList::Restore sets the Group property
on AssemblyObject, triggering onChanged → updateSolveStatus → solve →
validateNewPlacements. At this point joints reference objects that haven't
been restored yet, causing a null pointer dereference (SIGSEGV).

Add an isRestoring() guard to skip solver invocation during restore,
matching the existing pattern in AssemblyLink::onChanged().
2026-02-15 18:45:00 -06:00
forbes
128d7e0710 fix: re-add Create module to CMake build
Some checks failed
Build and Test / build (pull_request) Has been cancelled
The Create module (src/Mod/Create/) was lost from src/Mod/CMakeLists.txt
during the rebase onto upstream FreeCAD 1.2.0-dev. Without it:
- Mod/Create/ is never installed, so the bootstrap that loads ztools
  and silo never runs
- mods/ztools/ and mods/silo/ are never installed
- Startup shows 'Ignoring unknown SiloWorkbench/ZToolsWorkbench'

Also adds kc_format.py to the Create install list (was missing).
2026-02-15 17:03:38 -06:00
forbes
1dbeff7758 fix(ui): rebalance Auth/Activity dock panel sizes
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Use resizeDocks() to give Database Activity 80% of the vertical space
in the right dock area, keeping Database Auth compact at 120px.

Closes #190, Closes #191
2026-02-15 09:43:31 -06:00
forbes
4a54e9b7cd feat(silo): update silo submodule — DAG API methods (#215)
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Adds push_dag() and get_dag() to SiloClient:
- push_dag: PUT /api/items/{pn}/dag with nodes + edges
- get_dag: GET /api/items/{pn}/dag with optional revision filter

Closes #215
2026-02-14 15:09:08 -06:00
forbes
8f02c0d6f2 fix: Insert Component uses Silo browser when available
All checks were successful
Build and Test / build (pull_request) Successful in 40m7s
When the silo workbench is loaded, Insert Component now opens the
Silo part browser (OpenItemWidget) instead of the OS file dialog.
Users can search both the Silo database and local files to find
components to insert.

Falls back to the OS file dialog if silo-mod is not installed.
Also adds .kc file support to the fallback file dialog filter.

Closes #202
2026-02-14 15:03:13 -06:00
forbes
bae7c22e60 fix: add Create module to CMake build
Some checks failed
Build and Test / build (pull_request) Has been cancelled
The Create module (src/Mod/Create/) was never included in the build
because src/Mod/CMakeLists.txt did not call add_subdirectory(Create).

This meant:
- Mod/Create/InitGui.py was never installed, so the workbench loader
  (setup_kindred_workbenches) that loads silo and ztools never ran
- The install rules for mods/silo/freecad/ and mods/silo/silo-client/
  never executed, leaving the silo workbench files missing
- kc_format.py was also not listed in the Create install rule

Fixes the 'Ignoring unknown SiloWorkbench' error on startup.
2026-02-14 14:46:51 -06:00
forbes
04835c3629 feat: .kc Layer 1 — manifest auto-creation and platform file associations
Some checks failed
Build and Test / build (pull_request) Has been cancelled
kc_format.py:
- Auto-create silo/manifest.json with default fields (UUID, timestamps,
  username) when saving a .kc file that lacks one
- Update modified_at timestamp on each save
- KC_VERSION = 1.0

Platform integration:
- kindred-create.desktop: add application/x-kindred-create MIME type
- kindred-create.xml: register .kc glob patterns with dedicated MIME type
  (application/x-kindred-create), separate from .fcstd type
2026-02-14 12:47:01 -06:00
forbes
444aaac1ee fix: start page always closes on document open (#192)
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Remove the closeStart preference check so the start page MDI tab
always closes when a document is opened or created. Re-enable
QListView updates before closing to prevent Qt hang during widget
destruction.

Add hideEvent override as a safety net to re-enable disabled
QListView updates whenever the start page is hidden.
2026-02-14 12:42:17 -06:00
forbes
531526e70d fix: add missing Qt/Gui includes for ThemeSelectorWidget
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Build and Test / build (push) Successful in 1h10m43s
Add #include <QApplication> (for qApp macro), #include <QEvent> (for
QEvent::LanguageChange), and #include <Gui/Application.h> (for
Gui::Application::Instance) which were transitively available in
FreeCAD 1.0 but not in 1.2.
2026-02-14 11:21:54 -06:00
forbes
9809ff852c feat: .kc file format — Layer 1 (format registration)
Cherry-picked from feat/kc-file-format-layer1 (723a8c98d5).
- Document.cpp: checkFileName() accepts .kc extension
- FreeCADInit.py: register .kc import type
- Dialog filters: Save As, Save Copy, Merge, Project Utility
- kc_format.py: DocumentObserver preserves silo/ entries across saves
- InitGui.py: register kc_format observer on startup
2026-02-13 14:10:36 -06:00
forbes
54f8006e24 cherry-pick #32: MDI pre-document tab for Silo new item (70118201b0) 2026-02-13 14:09:44 -06:00
forbes
b37667d56d cherry-pick #4: startup theme selector fix (e85162947b) 2026-02-13 14:06:09 -06:00
forbes
630b08ea23 cherry-pick #3: dock task panel right, remove non-Kindred themes (bb3f3ac6d6) 2026-02-13 14:06:01 -06:00
forbes
9be9f9420a cherry-pick #1: initial Kindred branding + assembly joint fix
Cherry-picked 316d4f4b52 with conflict resolution:
- CMakeLists.txt: merged Kindred version vars with upstream 1.2.0-dev base
- src/Main/*.cpp: applied Kindred branding (banner, copyright, license)
- Resolved add/add conflicts for files already copied in Phase 1
- Includes assembly joint flip overconstrain fix
2026-02-13 14:05:31 -06:00
forbes
87a0af0b0f phase 1: copy Kindred-only files onto upstream/main (FreeCAD 1.2.0-dev)
Wholesale copy of all Kindred Create additions that don't conflict with
upstream FreeCAD code:

- kindred-icons/ (1444 Catppuccin Mocha SVG icon overrides)
- src/Mod/Create/ (Kindred Create workbench)
- src/Gui/ Kindred source files (FileOrigin, OriginManager,
  OriginSelectorWidget, CommandOrigin, BreadcrumbToolBar, EditingContext)
- src/Gui/Icons/ (Kindred branding and silo icons)
- src/Gui/PreferencePacks/KindredCreate/
- src/Gui/Stylesheets/ (KindredCreate.qss, images_dark-light/)
- package/ (rattler-build recipe)
- docs/ (architecture, guides, specifications)
- .gitea/ (CI workflows, issue templates)
- mods/silo, mods/ztools submodules
- .gitmodules (Kindred submodule URLs)
- resources/ (kindred-create.desktop, kindred-create.xml)
- banner-logo-light.png, CONTRIBUTING.md
2026-02-13 14:03:58 -06:00
Loke Strøm
5d81f8ac16 Sketcher: Fix: Arc of ellipse when first and second X coordinates are the same (#27327) 2026-02-13 11:57:27 -06:00
Roy-043
a8757f7947 Draft: fix depency of patharray normal on view direction
Change normal calculation to use get_shape_normal
2026-02-13 11:47:44 -06:00
Chris Hennes
9e042ff480 PD: Improve error handling for RevolMethod::ToFirst 2026-02-13 17:48:13 +01:00
Paweł Biegun
1752fd59f9 Measurement: Add on the fly measurement unit change (#27462)
Enables the user to change the unit of the measurement temporarily to convert to a different unit. This is useful when the user sometimes needs to get a dimension of the model in a different unit than the one it was designed in.
2026-02-12 14:35:54 +00:00
Roy-043
7912f84136 BIM+Draft: fix Placement task panel issue for Arch_SectionPlane and Draft_WorkingPlaneProxy (#27101)
* BIM+Draft: fix Placement Task Panel issue for Arch_SectionPlane and Draft_WorkingPlaneProxy

* BIM+Draft: fix Placement Task Panel issue for Arch_SectionPlane and Draft_WorkingPlaneProxy
2026-02-12 12:39:46 +00:00
Roy-043
db5fff6ccc BIM: fix BuildingPart issues with Arch_Reference 2026-02-12 11:35:55 +00:00
PaddleStroke
6abb2b447f Assembly: Isolate grounded objects on selection (#24952)
* Assembly: Isolate grounded objects on selection

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update ViewProviderAssembly.cpp

* Update ViewProviderAssembly.cpp

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Chris Hennes <chennes@pioneerlibrarysystem.org>
2026-02-12 09:43:46 +01:00
Chris Hennes
076c5916b5 Sketcher: Remove unneeded parameters from seekConstraintPosition 2026-02-11 19:49:31 +01:00
Yash Suthar
3d14203fa4 Draft: fix Draft_Label MaxChars property (#27478)
* Draft: fix Draft_Label MaxChars property

Signed-off-by: Yash Suthar <yashsuthar983@gmail.com>

* Minor tweak: moved/replaced call to self.onChanged

---------

Signed-off-by: Yash Suthar <yashsuthar983@gmail.com>
Co-authored-by: Roy-043 <70520633+Roy-043@users.noreply.github.com>
2026-02-11 17:58:42 +00:00
Chris Hennes
ecbe21ca03 Sketcher: Annotate unused parameter 2026-02-10 19:10:36 +01:00
Roy-043
54c0c2f83c Draft: fix ghost preview of Draft_Labels
Draft_Labels have a unique Placement implementation. A ghost preview therefore cannot be generated in the standard manner. This was missed in #18795 (my bad).
2026-02-10 11:43:22 -06:00
Yash Suthar
2cd45b07f7 Sketcher: Fix snap while drag and fix drag for arc
Signed-off-by: Yash Suthar <yashsuthar983@gmail.com>
2026-02-10 10:20:11 -06:00
Roy-043
0eaf14373f BIM: fix case of some titles (#27474) 2026-02-10 15:41:05 +00:00
PaddleStroke
3d0df45cd4 Assembly: BOM: take mirrored state of links in account. (#26113) 2026-02-10 09:10:03 -06:00
Caio Venâncio do Rosário
bf51a00dfd Draft: Fix switchUi method bug (#27422)
* Draft: Fix switchUi method bug

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-02-10 10:33:35 +01:00
Christoph Niethammer
1046c3682a Fix typos (#26576)
* Fix typos in code documentation

Signed-off-by: Christoph Niethammer <christoph.niethammer@gmail.com>

* Update tool tip for links 'copyOnChange' property

The tool tip for the copyOnChange property was missing the "tracking"
option and had some typos. For details see the wiki documentation at
https://wiki.freecad.org/Std_LinkMake and commit
d1b6bb78d1.

Signed-off-by: Christoph Niethammer <christoph.niethammer@gmail.com>

---------

Signed-off-by: Christoph Niethammer <christoph.niethammer@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Chris Hennes <chennes@pioneerlibrarysystem.org>
2026-02-09 19:15:50 -06:00
sliptonic
4497ce0146 Merge pull request #22204 from jffmichi/camsim
CAM: integrate new simulator as MDI widget into main window
2026-02-09 11:40:06 -06:00
tarman3
353459f1fe CAM: Profile - fix _getCutAreaCrossSection() 2026-02-09 11:12:11 -06:00
drwho495
72b1076788 Remove hasher check and migrate CAM files 2026-02-09 11:00:23 -06:00
Chris Hennes
6a1da227cd Merge pull request #27346 from TomPcz/sketcher-label-offset
Sketcher: Fix dimension label alignment and inactive strikethrough
2026-02-09 10:58:39 -06:00
Billy Huddleston
6e34b79da4 CAM: Update SVG annotation IDs for tool shapes
Renamed several SVG text element IDs in tool shape files that did not
match the expected naming conventions used. This ensures that the tool
parameters are correctly recognized and utilized by the Tool library
editor.

src/Mod/CAM/Tools/Shape/bullnose.svg:
- Changed text element id from "torus_radius" to "corner_radius"

src/Mod/CAM/Tools/Shape/radius.svg:
- Changed text element id from "cutting_edge_height-7" to
"cutting_radius"
- Changed text element id from "diameter-9" to "tip_diameter"

src/Mod/CAM/Tools/Shape/svg_source/bullnose.svg:
- Changed text element id from "torus_radius" to "corner_radius"

src/Mod/CAM/Tools/Shape/svg_source/radius.svg:
- Changed text element id from "cutting_edge_height-7" to
"cutting_radius"
- Changed text element id from "diameter-9" to "tip_diameter"
2026-02-09 10:55:53 -06:00