Merge pull request #23710 from kadet1090/fix-transform-basefeature-outside-body

Gui: Add handling for BaseFeatures outside of Body edge case
This commit is contained in:
Chris Hennes
2025-09-22 11:15:53 -05:00
committed by GitHub
4 changed files with 35 additions and 0 deletions

View File

@@ -72,9 +72,25 @@ void ViewProviderBase::setupContextMenu(QMenu* menu, QObject* receiver, const ch
if (!base->Placement.testStatus(App::Property::Immutable) &&
!base->Placement.testStatus(App::Property::ReadOnly) &&
!base->Placement.testStatus(App::Property::Hidden)) {
// Handling of the edge case where some base features are outside the body
// that should not happen, but it was possible to do in older FreeCAD versions.
// This ensures that for older files it still works correctly.
if (!getBodyViewProvider()) {
ViewProviderPartExt::setupContextMenu(menu, receiver, member);
}
ViewProvider::setupContextMenu(menu, receiver, member);
}
}
Gui::ViewProvider* ViewProviderBase::startEditing(int ModNum)
{
if (!getBodyViewProvider()) {
return ViewProviderPartExt::startEditing(ModNum);
}
return ViewProvider::startEditing(ModNum);
}
bool ViewProviderBase::setEdit(int ModNum)
{
@@ -82,6 +98,12 @@ bool ViewProviderBase::setEdit(int ModNum)
if (!base->Placement.testStatus(App::Property::Immutable) &&
!base->Placement.testStatus(App::Property::ReadOnly) &&
!base->Placement.testStatus(App::Property::Hidden)) {
// same as in setupContextMenu
if (!getBodyViewProvider()) {
return ViewProviderPartExt::setEdit(ModNum);
}
return ViewProvider::setEdit(ModNum);
}

View File

@@ -41,6 +41,8 @@ public:
bool doubleClicked() override;
void setupContextMenu(QMenu* menu, QObject* receiver, const char* member) override;
Gui::ViewProvider* startEditing(int ModNum) override;
protected:
bool setEdit(int ModNum) override;
};

View File

@@ -453,3 +453,13 @@ void ViewProviderBody::dropObject(App::DocumentObject* obj)
}
}
}
bool ViewProviderBody::canDragObjectToTarget(App::DocumentObject* obj,
App::DocumentObject* target) const
{
if (obj->isDerivedFrom<PartDesign::Feature>()) {
return target && target->is<PartDesign::Body>();
}
return ViewProviderPart::canDragObjectToTarget(obj, target);
}

View File

@@ -88,6 +88,7 @@ public:
bool canDropObject(App::DocumentObject*) const override;
/** Add an object to the view provider by drag and drop */
void dropObject(App::DocumentObject*) override;
bool canDragObjectToTarget(App::DocumentObject* obj, App::DocumentObject* target) const override;
protected:
/// Copy over all visual properties to the child features