ViewProvider(DocumentObject): new APIs for context aware selection

Context aware selection makes it possible to select the same Coin3D node
in different hierarchies (i.e. context) without ambiguity.

New/modified APIs in ViewProvider (the first two are the most crucial
APIs for context aware selection to work):

* getElementPicked(), supercedes getElement(). Given a Coin3D pick
  point, this function returns a dot separated subname reference as a
  path leads to the selected object.

* getDetailPath(), supercedes getDetail(). Given a subname reference,
  this function returns an SoFullPath leads to the Coin3D node of the
  selected object or sub-element (with SoDetail).

* (has)HiddenMarker(), check/return a special text marker for context
  aware override of object visibility.

* partialRender(), render only part of the object based on given
  subname references. It can render, e.g. some faces of a solid, or
  some children of a container. It uses the 'secondary' extension of
  SoSelectionElementAction to select which elements to render or hide.
  The actually rendering functionality will be added in the following
  patch.

* update()/onChanged(), modified to sync Visibility property from
  DocumentObject.

* useNewSelectionModel(), modified to return the default true view
  parameter. This is for test in the early stage of Link development,
  probably not needed anymore.

* getBoundingBox(), a convenience function to obtain the bounding box
  of a sub-object/element regardless of object's visibility. It uses
  getDetailPath() and SoGetBoundingBoxAction to obtain bounding box
  through Coin3D. It will be used in later sub-element box selection
  functionality.

New/modified APIs in ViewProviderDocumentObject:

* getElementPicked()/getDetailPath() provides actual implementation to
  support container like (sub)object selection without ambiguity. It
  relies on DocumentObject::getSubObject() to walk the path.

* reattach(), called when undo deleteion

* forceUpdate()/isUpdateForced(), force update even if object is
  invisible. These are used by Link to force update the visual of a
  linked object regardless of its visibility.

* getLinkedViewProvider(), return the linked view provider with
  hierarchy.

ViewProviderDocumentObjectPy:

* Object attribute is made writtable. Assigning it is equaivalant of
  calling ViewProviderDocumentObject::attach() in Python.
This commit is contained in:
Zheng, Lei
2019-06-22 10:23:35 +08:00
committed by wmayer
parent 2c12e1d3af
commit f5d92fdae7
8 changed files with 713 additions and 14 deletions

View File

@@ -24,9 +24,10 @@
#ifndef GUI_VIEWPROVIDER_DOCUMENTOBJECT_H
#define GUI_VIEWPROVIDER_DOCUMENTOBJECT_H
#include <Inventor/SoType.h>
#include "ViewProvider.h"
#include <App/DocumentObject.h>
#include <Inventor/SoType.h>
class SoMaterial;
class SoDrawStyle;
@@ -59,9 +60,12 @@ public:
// Display properties
App::PropertyEnumeration DisplayMode;
App::PropertyBool Visibility;
App::PropertyBool ShowInTree;
App::PropertyEnumeration OnTopWhenSelected;
virtual void attach(App::DocumentObject *pcObject);
virtual void updateData(const App::Property*);
virtual void reattach(App::DocumentObject *);
virtual void update(const App::Property*) override;
/// Set the active mode, i.e. the first item of the 'Display' property.
void setActiveMode();
/// Hide the object in the view
@@ -69,6 +73,13 @@ public:
/// Show the object in the view
virtual void show(void);
virtual bool canDropObjectEx(App::DocumentObject *, App::DocumentObject *,
const char *, const std::vector<std::string> &) const override;
virtual int replaceObject(App::DocumentObject*, App::DocumentObject*) override;
virtual bool showInTree() const;
/// Get a list of TaskBoxes associated with this object
virtual void getTaskViewContent(std::vector<Gui::TaskView::TaskContent*>&) const;
@@ -83,6 +94,22 @@ public:
/// Get the python wrapper for that ViewProvider
PyObject* getPyObject();
/// return a hit element given the picked point which contains the full node path
virtual bool getElementPicked(const SoPickedPoint *, std::string &subname) const override;
/// return the coin node detail and path to the node of the subname
virtual bool getDetailPath(const char *subname, SoFullPath *pPath, bool append, SoDetail *&det) const override;
/* Force update visual
*
* These method exists because some view provider skips visual update when
* hidden (e.g. PartGui::ViewProviderPartExt). Call this function to force
* visual update.
*/
//@{
virtual void forceUpdate(bool enable = true) {(void)enable;}
virtual bool isUpdateForced() const {return false;}
//@}
/** @name Restoring view provider from document load */
//@{
virtual void startRestoring();
@@ -96,6 +123,20 @@ public:
const char* group=0, const char* doc=0,
short attr=0, bool ro=false, bool hidden=false) override;
/** Return the linked view object
*
* This function is mainly used for GUI navigation (e.g.
* StdCmdLinkSelectLinked).
*
* @param subname: output as the subname referencing the linked object
* @param recursive: whether to follow the link recursively
*
* @return Returns the linked view provider. If none, it shall return
* itself.
*/
virtual ViewProviderDocumentObject *getLinkedViewProvider(
std::string *subname=0, bool recursive=false) const;
virtual std::string getFullName() const override;
protected: