PD: Forward transform requests to Body

This commit is contained in:
Kacper Donat
2024-12-11 23:39:04 +01:00
parent 736fbee539
commit a3bf63bae2
5 changed files with 52 additions and 16 deletions

View File

@@ -382,6 +382,9 @@ void TaskTransform::setSelectionMode(SelectionMode mode)
draggerPickStyle->style = SoPickStyle::SHAPE_ON_TOP;
draggerPickStyle->setOverride(false);
blockSelection(true);
vp->setTransformOrigin(vp->getTransformOrigin());
break;
}
@@ -492,6 +495,11 @@ void TaskTransform::onAlignRotationChanged()
void TaskTransform::onAlignToOtherObject()
{
if (selectionMode == SelectionMode::SelectAlignTarget) {
setSelectionMode(SelectionMode::None);
return;
}
setSelectionMode(SelectionMode::SelectAlignTarget);
}

View File

@@ -49,6 +49,7 @@
#include "ViewProviderDragger.h"
#include "Utilities.h"
#include <ViewProviderLink.h>
#include <App/DocumentObjectGroup.h>
#include <Base/Tools.h>
@@ -123,15 +124,17 @@ void ViewProviderDragger::setupContextMenu(QMenu* menu, QObject* receiver, const
ViewProvider* ViewProviderDragger::startEditing(int mode)
{
_linkDragger = nullptr;
forwardedViewProvider = nullptr;
auto ret = ViewProviderDocumentObject::startEditing(mode);
if (!ret) {
return ret;
}
return _linkDragger ? _linkDragger : ret;
return forwardedViewProvider ? forwardedViewProvider : ret;
}
bool ViewProviderDragger::checkLink()
bool ViewProviderDragger::forwardToLink()
{
// Trying to detect if the editing request is forwarded by a link object,
// usually by doubleClicked(). If so, we route the request back. There shall
@@ -150,26 +153,24 @@ bool ViewProviderDragger::checkLink()
return false;
}
auto sobj = vpParent->getObject()->getSubObject(subname.c_str());
if (!sobj || sobj == getObject() || sobj->getLinkedObject(true) != getObject()) {
if (vpParent == this) {
return false;
}
auto vp = Application::Instance->getViewProvider(sobj);
if (!vp) {
if (!vpParent->isDerivedFrom<ViewProviderLink>()) {
return false;
}
_linkDragger = vp->startEditing(ViewProvider::Transform);
forwardedViewProvider = vpParent->startEditing(ViewProvider::Transform);
return _linkDragger != nullptr;
return forwardedViewProvider != nullptr;
}
bool ViewProviderDragger::setEdit(int ModNum)
{
Q_UNUSED(ModNum);
if (checkLink()) {
if (forwardToLink()) {
return true;
}
@@ -208,8 +209,8 @@ void ViewProviderDragger::setEditViewer(Gui::View3DInventorViewer* viewer, int M
if (csysDragger && viewer) {
csysDragger->setUpAutoScale(viewer->getSoRenderManager()->getCamera());
auto mat = viewer->getDocument()->getEditingTransform();
mat *= getObjectPlacement().inverse().toMatrix();
auto originPlacement = App::GeoFeature::getGlobalPlacement(getObject()) * getObjectPlacement().inverse();
auto mat = originPlacement.toMatrix();
viewer->getDocument()->setEditingTransform(mat);
viewer->setupEditingRoot(csysDragger, &mat);

View File

@@ -90,6 +90,8 @@ protected:
void onChanged(const App::Property* prop) override;
bool forwardToLink();
/**
* Returns a newly create dialog for the part to be placed in the task view
* Must be reimplemented in subclasses.
@@ -97,6 +99,7 @@ protected:
virtual TaskView::TaskDialog* getTransformDialog();
CoinPtr<SoFCCSysDragger> csysDragger = nullptr;
ViewProvider *forwardedViewProvider = nullptr;
private:
static void dragStartCallback(void *data, SoDragger *d);
@@ -105,9 +108,6 @@ private:
void updateDraggerPosition();
bool checkLink();
ViewProvider *_linkDragger = nullptr;
Base::Placement draggerPlacement { };
};

View File

@@ -81,7 +81,16 @@ void ViewProvider::setupContextMenu(QMenu* menu, QObject* receiver, const char*
bool ViewProvider::setEdit(int ModNum)
{
if (ModNum == ViewProvider::Default ) {
if (ModNum == ViewProvider::Transform) {
if (forwardToLink()) {
return true;
}
// this is feature so we need to forward the transform to the body
forwardedViewProvider = getBodyViewProvider();
return forwardedViewProvider->startEditing(ModNum);
}
else if (ModNum == ViewProvider::Default) {
// When double-clicking on the item for this feature the
// object unsets and sets its edit mode without closing
// the task panel
@@ -194,6 +203,22 @@ void ViewProvider::onChanged(const App::Property* prop) {
PartGui::ViewProviderPartExt::onChanged(prop);
}
Gui::ViewProvider* ViewProvider::startEditing(int ModNum)
{
// in case of transform we forward the request to body
if (ModNum == Transform) {
forwardedViewProvider = nullptr;
if (!ViewProviderPart::startEditing(ModNum)) {
return nullptr;
}
return forwardedViewProvider;
}
return ViewProviderPart::startEditing(ModNum);
}
void ViewProvider::setTipIcon(bool onoff) {
isSetTipIcon = onoff;

View File

@@ -55,6 +55,8 @@ public:
void updateData(const App::Property*) override;
void onChanged(const App::Property* prop) override;
Gui::ViewProvider* startEditing(int ModNum) override;
void setTipIcon(bool onoff);
//body mode means that the object is part of a body and that the body is used to set the