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.
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.
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
Add QApplication (for qApp macro), QEvent (for QEvent::LanguageChange),
and Gui/Application.h (for Gui::Application::Instance) which were
missing after the develop merge.
- 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
- Move ComboView default dock position from Left to Right
- Remove FreeCAD Classic, FreeCAD Light, FreeCAD Dark, and Dark behave
theme packs, keeping only KindredCreate (Catppuccin Mocha)
- Increase min-height and padding on QDockWidget::title to prevent header text clipping
- Increase min-height and padding on QSint--ActionGroup QToolButton for task panel headers
- Add specific styling for spreadsheet cell editor with reduced padding for better text visibility
- 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
* 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>
* 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>
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.
* Gui: Fix property checkbox regression
* Update PropertyItemDelegate.cpp
* Gui: property checkbox: toggle with enter when it has focus
* [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>
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.
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.
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>
* BIM: Add tests for ArchComponent.AreaCalculator.isFaceVertical
* BIM: test new area calculation fallback case
* BIM: add test for composite complex surface vertical area calculation
The linter report 'private field 'decimals' is not used'. The
getDecimals() method return pack.defDecimals, which was also
used to set the value of the decimals variable in the initializer,
so the decimals variable is redundant.