* BIM: Implement smart base removal for Walls
Previously, removing the Base object from an Arch Wall would cause the
wall to reset its position to the document origin and could lead to
unintended geometric changes for complex walls.
This commit introduces a "smart debasing" mechanism integrated into the
Component Task Panel's "Remove" button:
- For walls based on a single straight line, the operation now preserves
the wall's global position and parametric `Length`, making it an
independent object.
- For walls with complex bases (multi-segment, curved), a warning dialog
is now presented to the user, explaining the consequences (shape
alteration and position reset) before allowing the operation to
proceed.
This is supported by new API functions `Arch.is_debasable()` and
`Arch.debaseWall()`, which contain the core logic for the feature.
Fixes: https://github.com/FreeCAD/FreeCAD/issues/24453
* BIM: Move wall debasing logic into ArchWall proxy
The logic for handling the removal of a wall's base object was previously
implemented directly within the generic `ComponentTaskPanel` in
`ArchComponent.py`. This created a tight coupling, forcing the generic
component UI to have specific knowledge about the `ArchWall` type.
This commit refactors the implementation to follow a more object-oriented
and polymorphic design:
1. A new overridable method, `handleComponentRemoval(subobject)`, has been
added to the base `ArchComponent` proxy class. Its default implementation
maintains the standard removal behavior.
2. The `_Wall` proxy class in `ArchWall.py` now overrides this method. All
wall-specific debasing logic, including the eligibility check and the
user-facing warning dialog, now resides entirely within this override.
3. The `ComponentTaskPanel.removeElement` method has been simplified. It is
now a generic dispatcher that calls `handleComponentRemoval` on the
proxy of the object being edited, with no specific knowledge of object types.
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* BIM: Correct user warning
The operation can indeed be undone.
Co-authored-by: Roy-043 <70520633+Roy-043@users.noreply.github.com>
---------
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Roy-043 <70520633+Roy-043@users.noreply.github.com>
* BIM: Prevent crash when removing a wall's base component
When a user selected a wall's base object in the Tree View and used the
`Arch_Remove` command, a traceback occurred due to an `AttributeError`.
The `removeComponents` function was incorrectly checking for the `.Base`
attribute on a list of subtractions (`s.Base`) instead of on the parent
host object (`h.Base`).
This commit corrects the reference to check against the parent object,
resolving the crash and allowing the component to be removed.
Fixes: https://github.com/FreeCAD/FreeCAD/issues/24532
Authored-by: furgo16 <148809153+furgo16@users.noreply.github.com>
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
---------
Co-authored-by: Furgo <148809153+furgo16@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* BIM: Fix Site view provider initialization and constraints
This commit fixes bugs in the `_ViewProviderSite` lifecycle, ensuring
that sun path properties are correctly initialized with valid defaults
and that their constraints are reliably restored when a document is
opened.
Previously, two main problems existed:
1. New Objects: When a new `Site` object was created, its sun path
properties (e.g., `SunDateMonth`) would default to 0, which is an
invalid value. The property editor in the GUI would also lack the
appropriate min/max constraints.
2. Restored Objects: When a document containing a `Site` was opened, the
property constraints were not reapplied. This happened because the
view provider's initialization logic was not being reliably triggered
due to race conditions during the document deserialization process.
These issues are addressed now by a deferred initialization sequence:
- For New Objects: In `_ViewProviderSite.__init__`, constraint and
default value setup is deferred using `QTimer.singleShot(0)`. The
`restoreConstraints` method also now sets sensible defaults (e.g.,
month 6, day 21) when it detects a new object.
- For Restored Objects: The data object's `_Site.onDocumentRestored`
hook is now used as a trigger to start the view provider's
initialization. This is a necessary workaround, as the `ViewProvider`
lacks its own restoration hook. This method now ensures the view
provider's properties are present and then schedules
`restoreConstraints` to run via `QTimer`.
* BIM: add ArchSite GUI tests and fixtures
- Additionally clean up and document the CMakeLists.txt file for better
maintainability and readability
* BIM: Enable GUI tests on CI
- The line to enable the BIM workbench has been commented out, as
previously it occasioned a timeout error on CI
- The BIM GUI tests have been uncommented out to enable them
* Add custom template path support for WebGL export
- Extract hardcoded template into separate file and store in Mod/BIM/Resources/templates
- Remove hardcoded template from code
- Add new section to Import-Export Preference page ("WebGL"). This introduces two new parameters
- Make export() return bool to indicate success or failure for controlled headless export
- Add new unit tests for WebGL export to ensure functionality
- Update CMakeLists.txt to include the new template resource
* Apply suggestions from code review
Changes to literals, suggested after DWG review
Co-authored-by: Max Wilfinger <6246609+maxwxyz@users.noreply.github.com>
* Removed unused import
* Removed unused import
---------
Co-authored-by: Max Wilfinger <6246609+maxwxyz@users.noreply.github.com>
Co-authored-by: Yorik van Havre <yorik.vanhavre@gmail.com>