From fce44f142307e23fe87ba434236410faa6035c08 Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Thu, 14 Nov 2019 21:20:07 +0800 Subject: [PATCH] Gui: track editing object placement change --- src/Gui/Document.cpp | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index 38e6514709..4cc095cc4f 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -90,10 +90,14 @@ struct DocumentP bool _changeViewTouchDocument; int _editMode; ViewProvider* _editViewProvider; + App::DocumentObject* _editingObject; ViewProviderDocumentObject* _editViewProviderParent; std::string _editSubname; std::string _editSubElement; Base::Matrix4D _editingTransform; + View3DInventorViewer* _editingViewer; + std::set _editObjs; + Application* _pcAppWnd; // the doc/Document App::Document* _pcDocument; @@ -154,7 +158,9 @@ Document::Document(App::Document* pcDocument,Application * app) d->_pcAppWnd = app; d->_pcDocument = pcDocument; d->_editViewProvider = 0; + d->_editingObject = 0; d->_editViewProviderParent = 0; + d->_editingViewer = 0; d->_editMode = 0; // Setup the connections @@ -405,8 +411,16 @@ bool Document::setEdit(Gui::ViewProvider* p, int ModNum, const char *subname) FC_LOG("object '" << sobj->getFullName() << "' refuse to edit"); return false; } - if(view3d) + + auto sobjs = obj->getSubObjectList(subname); + d->_editObjs.clear(); + d->_editObjs.insert(sobjs.begin(),sobjs.end()); + d->_editingObject = sobj; + + if(view3d) { view3d->getViewer()->setEditingViewProvider(d->_editViewProvider,ModNum); + d->_editingViewer = view3d->getViewer(); + } Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog(); if (dlg) dlg->setDocumentName(this->getDocument()->getName()); @@ -422,6 +436,7 @@ const Base::Matrix4D &Document::getEditingTransform() const { } void Document::setEditingTransform(const Base::Matrix4D &mat) { + d->_editObjs.clear(); d->_editingTransform = mat; View3DInventor *activeView = dynamic_cast(getActiveView()); if (activeView) @@ -465,6 +480,9 @@ void Document::_resetEdit(void) App::GetApplication().closeActiveTransaction(); } d->_editViewProviderParent = 0; + d->_editingViewer = 0; + d->_editObjs.clear(); + d->_editingObject = 0; if(Application::Instance->editDocument() == this) Application::Instance->setEditDocument(0); } @@ -760,6 +778,21 @@ void Document::slotChangedObject(const App::DocumentObject& Obj, const App::Prop if (viewProvider) { try { viewProvider->update(&Prop); + if(d->_editingViewer + && d->_editingObject + && d->_editViewProviderParent + && (Prop.isDerivedFrom(App::PropertyPlacement::getClassTypeId()) + || strstr(Prop.getName(),"Scale")) + && d->_editObjs.count(&Obj)) + { + Base::Matrix4D mat; + auto sobj = d->_editViewProviderParent->getObject()->getSubObject( + d->_editSubname.c_str(),0,&mat); + if(sobj == d->_editingObject && d->_editingTransform!=mat) { + d->_editingTransform = mat; + d->_editingViewer->setEditingTransform(d->_editingTransform); + } + } } catch(const Base::MemoryException& e) { FC_ERR("Memory exception in " << Obj.getFullName() << " thrown: " << e.what());