Commit Graph

33653 Commits

Author SHA1 Message Date
forbes
e0e8e22cd2 feat: live SSE-based Database Activity panel
Some checks failed
Build and Test / build (pull_request) Failing after 17m0s
Replace the static startup-only item list with a real-time event feed:

- InitGui.py: remove the startup list_items() call that showed
  '(Unable to connect)' when not yet authenticated; show a simple
  '(Waiting for connection...)' placeholder instead
- silo_commands.py (submodule): maintain an in-memory event list
  prepended by SSE events, seeded with 10 recent items on first
  connect, with relative timestamps refreshed every 60s

The panel now shows live activity ('F01-0001 updated · just now')
instead of requiring expensive full re-fetches on every SSE event.
2026-02-12 17:27:36 -06:00
70118201b0 feat(silo): replace modal new-item dialog with MDI pre-document tab
Some checks failed
Build and Test / build (pull_request) Failing after 15m49s
Update silo submodule to include the new pre-document tab for item
creation.  Silo_New now opens an MDI tab instead of a blocking modal
dialog, allowing multiple items to be prepared in parallel.
2026-02-11 15:15:08 -06:00
forbes
b7374d7b1f fix(assembly): extend findPlacement() datum and origin handling (#55)
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Add support for missing datum and origin object types in the Assembly
solver's findPlacement() function:

- App::Plane: handle XY/XZ/YZ origin planes with correct rotations
- App::Point: handle origin point (identity placement)
- PartDesign::Line: extract edge midpoint and direction from shape
- PartDesign::Point: extract vertex position from shape geometry
  instead of returning raw obj.Placement
- Add obj.Shape.isNull() validation to all PartDesign datum branches
- PartDesign::Plane falls back to obj.Placement on invalid shape
  instead of falling through to App.Placement()

Closes #55
2026-02-08 19:53:49 -06:00
forbes
35302154ae feat: expose version to Python and add update checker (#28, #29)
All checks were successful
Build and Test / build (pull_request) Successful in 1h11m28s
Issue #28: Add version.py.in CMake template that injects
KINDRED_CREATE_VERSION at build time, making the Kindred Create
version available to Python code via 'from version import VERSION'.

Issue #29: Add update_checker.py that queries the Gitea releases
API on startup (10s deferred) to check for newer versions. Uses
stdlib urllib only, 5s timeout, never blocks the UI. Respects
user preferences for check interval, enable/disable, and skipped
versions. Logs results to Console for now — UI notification will
follow in issue #30.

Closes #28
Closes #29
2026-02-08 13:11:08 -06:00
forbes
1750949afd fix(gui): merge Silo toolbar into File toolbar via origin system (#65)
Some checks failed
Build and Test / build (pull_request) Failing after 1m41s
- Remove separate Silo workbench toolbar (now redundant)
- Remove SiloMenuManipulator (Std commands already delegate to origins)
- Remove Silo_ToggleMode (origin selector handles mode switching)
- Register Silo origin at startup via Create module
- Update docs to reflect unified origin architecture
2026-02-07 21:29:05 -06:00
forbes
772d3b3288 fix(build): update CMake install paths for silo-mod repo layout
Some checks failed
Build and Test / build (push) Has been cancelled
The silo submodule now uses silo-mod layout where the FreeCAD workbench
is at freecad/ (not pkg/freecad/). Also install the silo-client
submodule directory.
2026-02-06 12:42:02 -06:00
forbes
c59c704da3 refactor: rewire silo submodule for silo-mod split
Some checks failed
Build and Test / build (pull_request) Has been cancelled
- .gitmodules: silo.git -> silo-mod.git (FreeCAD workbench only)
- Init.py: silo/pkg/freecad -> silo/freecad (new repo layout)
- InitGui.py: same path update

The silo monorepo has been split into:
- silo-client: shared Python API client (submodule of silo-mod)
- silo-mod: FreeCAD workbench (this submodule)
- silo-calc: LibreOffice Calc extension (separate repo)
- silo: server only (no longer a Create submodule)
2026-02-06 11:15:30 -06:00
67e5598b2e fix(build): add missing Qt and Gui includes to ThemeSelectorWidget
Some checks failed
Build and Test / build (push) Successful in 1h9m41s
Release Build / build-linux (push) Failing after 18m43s
Release Build / build-macos (arm64, macos-14) (push) Has been cancelled
Release Build / build-macos (x86_64, macos-13) (push) Has been cancelled
Release Build / build-windows (push) Has been cancelled
Release Build / publish-release (push) Has been cancelled
Add QApplication, QEvent, and Gui/Application.h includes that were
missing, causing build failures with undeclared identifiers for qApp,
QEvent::LanguageChange, and Gui::Application::Instance.
2026-02-05 10:06:00 -06:00
434ae797a4 fix(ui): clean up theme selector and migration for single-theme setup
Some checks failed
Build and Test / build (pull_request) Failing after 2m30s
- Remove dead code in migrateOldTheme() that set Theme parameter for
  KindredCreate.yaml, which no longer exists in the Stylesheets build
- Remove orphaned Classic.yaml and KindredCreate.yaml parameter files
  from Stylesheets CMakeLists and from disk
- Remove unused includes in ThemeSelectorWidget.cpp (QApplication,
  QEvent, Gui/Application.h)
2026-02-04 13:26:55 -06:00
forbes
3e09e7c099 fix: prevent QThread crash and Unknown command warnings on startup
Some checks failed
Build and Test / build (push) Has been cancelled
InitGui.py: Store SiloAuthDockWidget reference on the QDockWidget to
prevent Python from garbage-collecting it while its 30-second QTimer is
still running. The lost reference caused 'QThread: Destroyed while
thread is still running' followed by abort.

ztools InitGui.py: Move addWorkbenchManipulator() call from module-level
into Initialize(), after command modules are imported. The manipulator
references ZTools_DatumCreator, ZTools_DatumManager, ZTools_EnhancedPocket,
and ZTools_RotatedLinearPattern, which don't exist until the imports run.

Also updates README.md and submodule pointers.
2026-02-01 19:58:01 -06:00
forbes
1fea7c3d2e feat(silo): dock auth panel, SSE live updates, and improved pull workflow
Some checks failed
Build and Test / build (push) Has been cancelled
- Add _setup_silo_auth_panel() to dock auth widget in right panel at startup
- Update silo submodule: SSE listener, revision pull dialog, conflict detection
2026-02-01 18:15:16 -06:00
forbes
626790904d feat(silo): add interactive database browser to activity panel
Replace the static QListWidget with a full SiloActivityPanel class
that provides:

- Search field with 300ms debounce for filtering items by name
- Type filter dropdown (All / Part / Assembly)
- Refresh button for manual reload
- QTableWidget with Part Number, Description, Type, and Updated columns
- Part Details pane that appears on row selection showing part number,
  description, type, revision, last updated date, and project tags
- Open button / double-click to open items via SiloSync.open_item()
- Info button showing revision history dialog (reuses Silo_Info pattern)
- Graceful error handling for connection failures and empty results
2026-02-01 18:15:16 -06:00
forbes
b7fdccc99a Update submodules: Silo auth integration, ZTools, GSL, AddonManager, googletest 2026-01-31 19:13:47 -06:00
forbes
36a88d0959 Add Silo auth dock widget, update silo submodule
Wire up the new Silo authentication dock panel in InitGui.py:
- _setup_silo_auth_panel() creates the Database Auth dock widget
- Tabified with the existing Database Activity panel on the right dock
- Deferred to 4500ms to ensure activity panel exists first
- Widget reference pinned on the dock panel to prevent GC

Update silo submodule to include auth widget, login flow, token
management, enhanced settings dialog, and silo-auth.svg icon.
2026-01-31 14:36:51 -06:00
forbes
8639b6fd8a fix(gui): resolve unknown command and style token errors at startup
Move ZTools command imports before workbench initialization in
InitGui.py so commands are registered before PartDesign/Sketcher
init triggers toolbar state restoration.

Import silo_commands eagerly in _setup_silo_menu() so Silo commands
exist before the WorkbenchManipulator references them.

Create KindredCreate.yaml and Classic.yaml theme parameter files
defining all style tokens (PrimaryColor, TextForegroundColor, etc.)
used by FreeCAD.qss and the overlay stylesheet. Register them in
CMakeLists.txt and set the Theme preference in KindredCreate.cfg.

Add migration in migrateOldTheme() to set Theme=KindredCreate for
existing users who have the stylesheet but not the Theme parameter.
2026-01-31 11:47:28 -06:00
forbes
eb80c07f57 UI fixes, ZTools-PartDesign merge, Silo enhancements, and BOM integration
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
2026-01-31 09:27:01 -06:00
forbes
ddefb23652 Fix Assembly solver ignoring PartDesign datum plane references
When a PartDesign::Plane (including ZTools datums like ZPlane_Mid,
ZPlane_Offset) is used as a reference in an Assembly joint,
findPlacement() returns an all-zero placement, making the joint
constraint degenerate and ineffective.

Root cause: getElementName() strips the terminal '.Plane' suffix
because it matches the hardcoded set for App::LocalCoordinateSystem
datum elements ({X, Y, Z, Point, Line, Plane}). This is correct
behavior — the issue is that findPlacement()'s 'whole part' branch
only handled App::Line objects and returned App.Placement() (zeros)
for everything else, including PartDesign::Plane datums.

The fix extends the 'whole part' branch in findPlacement() to
compute a proper placement for PartDesign::Plane objects by
extracting the plane's center-of-gravity and surface rotation from
its Shape, then converting to object-local coordinates. This matches
the existing convention used for Face elements elsewhere in the
function.

Also adds handling for PartDesign::Point datums, which hit the same
empty-element code path.

Existing App::Plane origin references (XY_Plane, etc.) are unaffected
since isDerivedFrom('PartDesign::Plane') does not match App::Plane.
2026-01-30 20:46:40 -06:00
forbes
9dc50cef72 Fix SIGSEGV in Assembly solver during document restore
AssemblyObject::onChanged() was calling updateSolveStatus() when the
Group property changed during document restore. This triggered the
solver (solve -> validateNewPlacements) while child objects were still
being deserialized, causing a segfault in validateNewPlacements() due
to accessing uninitialized data.

Add isRestoring() and isPerformingTransaction() guards matching the
pattern used by GroupExtension::onChanged() and other FreeCAD modules.
2026-01-29 23:54:10 -06:00
forbes
dbac82e731 Fix silo loading and add integration enhancements
Fix the exec() calls in Create module's Init.py and InitGui.py to pass
__file__ and __name__ in the globals dict. The silo workbench code uses
__file__ to resolve icon paths, but exec() without explicit globals
does not provide it, causing 'name __file__ is not defined' errors.

Also add three silo integration enhancements to InitGui.py:
- First-startup check: launches Silo_Settings dialog if API URL is not
  configured on first run
- File menu injection: WorkbenchManipulator inserts Silo Open, Save,
  and Commit commands into the File menu across all workbenches
- Database activity panel: dock widget showing recent silo items,
  displayed on the right side of the main window
2026-01-29 20:57:39 -06:00
forbes
3b8eb90b25 Fix ThemeSelectorWidget build: add missing includes
Add QApplication (for qApp macro), QEvent (for QEvent::LanguageChange),
and Gui/Application.h (for Gui::Application::Instance) which were
missing after the develop merge.
2026-01-29 16:38:21 -06:00
forbes
e85162947b Fix startup theme selector and migration for single-theme setup
- Rework ThemeSelectorWidget to show only KindredCreate theme
  instead of FreeCAD Classic/Light/Dark buttons that no longer exist
- Fix migrateOldTheme() to map old FreeCAD Light/Dark stylesheets
  to KindredCreate instead of throwing an exception
- Remove orphaned FreeCAD Dark.yaml and FreeCAD Light.yaml
  parameter files from Stylesheets build
2026-01-29 14:23:00 -06:00
forbes
0e5998312a Implement Phase 1: Auto-loading for ztools and Silo addons
- Add src/Mod/Create/ module to handle addon loading
- Init.py adds mods/ztools and mods/silo to sys.path at startup
- InitGui.py loads workbenches from addon InitGui.py files
- CMakeLists.txt installs Create module and mods/ directory
- Set ZToolsWorkbench as default startup workbench in preferences
2026-01-27 10:03:12 -06:00
forbes
316d4f4b52 fix assy joint flip behaviour to not overconstrain on three distance
joints
2026-01-26 06:36:00 -06:00
Captain
acdc4041fd PartDesign: Added interactive gizmo for draft operation (#27111)
* PartDesign: Add interactive gizmo for draft operation

* [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-01-25 00:00:07 +01:00
sliptonic
09e4d8c059 Merge pull request #24617 from petterreinholdtsen/cam-pre-post-dedup
CAM: Ensure pre-/postamble help text matches active values by avoiding duplication.
2026-01-24 12:03:38 -06:00
Morten Vajhøj
0e6e2f28e8 Measurement: Added support for cylindrical surfaces (#27044)
* Added support for cylindrical surfaces

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

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

* Removed unnessecary sign

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

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

* Reverted change

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-01-24 17:12:16 +01:00
PaddleStroke
23d3b4c135 Sketcher: add switch between radius and diameter (#26794) 2026-01-23 21:39:46 +00:00
Petter Reinholdtsen
e155e0a976 CAM: Ensure pre-/postamble help text matches active values by avoiding duplication
Make sure to use the active default values for preamble and postamble in the help text,
and provide the current default values as the default in the add_argument().

The only exception is uccnc_post.py, where the real default value depend on the use of
--no-comments, and sending the default argument to add_argument() would change behaviour.

This change was inspired by the changes done to fix (#20792) in
d84d9c9bd1.
2026-01-23 19:43:16 +01:00
sliptonic
7d1870ab55 Merge pull request #21220 from dbtayl/fix_adaptive_bspline
CAM: Adaptive: Fix bspline processing
2026-01-23 12:17:51 -06:00
sliptonic
ac4e587e33 Merge pull request #26426 from davidgilkaufman/adaptive_fix_small_loops
CAM: Adaptive fix small loops
2026-01-23 12:17:14 -06:00
sliptonic
c962feb1cb Merge pull request #23242 from tarman3/boundary-g0
CAM: DressupBoundary - Fix G0
2026-01-23 12:11:10 -06:00
PaddleStroke
d6c40727f7 Assembly: prevent assembly collapse when editing sketch. (#26956)
* Gui: View provider: isAutoCollapseOnDeactivation

* Update ViewProvider.h

* Update ActiveObjectList.cpp

* Update ViewProviderAssembly.cpp

* Update ActiveObjectList.cpp
2026-01-23 16:01:06 +01:00
Amon Sha
cfa3ae93ef Merge pull request #27077 from amon-sha/fix_sketcher_autoscale_segfault
Sketcher: fix segfault during autoscale
2026-01-23 15:18:25 +01:00
Furgo
21069b6f19 BIM: add regression and functional test for ArchWall's MakeBlock feature (#27002)
Co-authored-by: Roy-043 <70520633+Roy-043@users.noreply.github.com>
2026-01-23 11:37:36 +01:00
Kacper Donat
bb5b35e98b Merge pull request #24951 from PaddleStroke/asm_jointhighlight
Assembly: Highlight joint elements on joint selection
2026-01-22 20:16:56 +01:00
PaddleStroke
9d982f8b66 Assembly: Solver messages (#24623)
* Assembly: Solver messages

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

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

* Update ViewProviderAssembly.cpp

* Update src/Mod/Assembly/App/AssemblyUtils.cpp

Co-authored-by: Kacper Donat <kadet1090@gmail.com>

* Update src/Mod/Assembly/App/AssemblyUtils.cpp

Co-authored-by: Kacper Donat <kadet1090@gmail.com>

* Update src/Mod/Assembly/App/AssemblyUtils.cpp

Co-authored-by: Kacper Donat <kadet1090@gmail.com>

* Update src/Mod/Assembly/Gui/Commands.cpp

Co-authored-by: Kacper Donat <kadet1090@gmail.com>

* Update ViewProviderAssembly.cpp

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

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

* Update src/Mod/Assembly/Gui/TaskAssemblyMessages.cpp

Co-authored-by: Kacper Donat <kadet1090@gmail.com>

* Update AssemblyObject.h

* Update AssemblyObject.cpp

* Update Commands.cpp

* Update ViewProviderAssembly.cpp

* Update AssemblyObject.cpp

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

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

* Thank you

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Kacper Donat <kadet1090@gmail.com>
2026-01-22 15:21:13 +01:00
PaddleStroke
f62ebcf3cc Sketcher: Show constraint type in the list 2026-01-22 10:36:35 +01:00
Roy-043
2a37ade112 BIM: fix variable name error in ArchWall.py (#26991) 2026-01-22 10:22:14 +01:00
PaddleStroke
39cebf8aeb Sketch: Forward non-default edit mode to base class. (#27063)
Ported from Codeberg commit 66dbf277

Co-authored-by: wwmayer <wmayer@freecad.org>
2026-01-21 22:41:44 +01:00
Roy-043
9f1420507f BIM: fix Array Tools dropdown (#27060) 2026-01-21 14:49:08 +01:00
Yash Suthar
925eb1df23 Sketcher: Switch to perpendicular based instead of "de la Hire" in setting minor axis of ellipse
Signed-off-by: Yash Suthar <yashsuthar983@gmail.com>
2026-01-20 22:54:07 +01:00
Roy-043
7bd70f9db1 Draft: fix snapping to geometry on image
Fixes #26965

`self.snapObjectIndex` should be increased if the object under the cursor is not 'snappable'. This is the same principle as is used in the `cycleSnapObject` function.
2026-01-20 20:54:34 +01:00
wandererfan
4e3279d081 [TD]fix vertex display in manual frame mode 2026-01-20 20:05:05 +01:00
sliptonic
cfad1b2055 Merge pull request #26988 from Connor9220/AddTaperedBallNose
CAM: Add tapered ball nose toolbit/shape asset
2026-01-19 15:30:29 -06:00
Dan Taylor
7646e68825 CAM: Adaptive: Fix handling of BSplines (though TechDraw still has some failures that cascade) 2026-01-19 13:38:33 -06:00
Roy-043
ee4f856fc8 BIM: fix ArchReference Placement if whole file is used 2026-01-19 17:02:56 +00:00
Roy-043
b034b2adf3 Draft: fix DiscretizeEllipses preference inconsistency (#26953) 2026-01-19 10:51:19 -06:00
PaddleStroke
52608d3081 PartDesign: allow makeShellFromUpToFace to update extrusion direction
Updated makeShellFromUpToShape to accept the direction vector by reference.
This allows the method to reverse the direction internally if required
to successfully reach the target face, fixing cases where the extrusion
would otherwise fail or go the wrong way.

Note: While passing the direction as a non-const reference is a quick
fix for this regression, it is acknowledged as non-ideal and should
be considered for future refactoring.
2026-01-19 10:39:31 -06:00
Zheng, Lei
58d8515365 Part: Do not recompute visuals if shape did not change
This commit registers last rendered shape within the ViewProvider for
Part objects and short-circuits the visuals recomputed if shape did not
change.

Co-Authored-By: Kacper Donat <kadet1090@gmail.com>
2026-01-19 10:39:05 -06:00
Roy-043
fbb8e07e60 BIM: fix placement issue in BIM_View (#27015)
* BIM: fix placement issue in BIM_View

* BIM: fix placement issue in BIM_View
2026-01-19 16:30:04 +00:00