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 eb6e56912e
commit cd7725227f
8 changed files with 713 additions and 14 deletions

View File

@@ -120,11 +120,66 @@ Returns 1 if succeed, 0 if not found, -1 if not supported
<UserDocu>Returns list of objects that are to be grouped in tree under this object.</UserDocu>
</Documentation>
</Methode>
<Methode Name="partialRender">
<Documentation>
<UserDocu>
partialRender(sub=None,clear=False): render only part of the object
sub: string or list of string refer to the subelement. If it is None then
reset the partial rendering.
clear: true to add, or false to remove the subelement(s) for rendering.
</UserDocu>
</Documentation>
</Methode>
<Methode Name="getElementColors">
<Documentation>
<UserDocu>
getElementColors(elementName=None) -> dict(elementName:color)
</UserDocu>
</Documentation>
</Methode>
<Methode Name="setElementColors">
<Documentation>
<UserDocu>
setElementColors(colors): set element colors
colors: color dictonary of type elementName:(r,g,b,a)
</UserDocu>
</Documentation>
</Methode>
<Methode Name="getElementPicked" Const="true">
<Documentation>
<UserDocu>getElementPicked(pickPoint): return the picked subelement</UserDocu>
</Documentation>
</Methode>
<Methode Name="getDetailPath" Const="true">
<Documentation>
<UserDocu>
getDetailPath(subname,path,append=True): return Coin detail and path of an subelement
subelement: dot separated string reference to the sub element
pPath: output coin path leading to the returned element detail
append: If true, path will be first appended with the root node and the mode
switch node of this view provider.
</UserDocu>
</Documentation>
</Methode>
<Methode Name="signalChangeIcon" Const="true">
<Documentation>
<UserDocu>Trigger icon changed signal</UserDocu>
</Documentation>
</Methode>
<Methode Name="getBoundingBox">
<Documentation>
<UserDocu>
getBoundingBox(subname=None, transform=True, view=None): obtain the bounding box of this view object
* subname: the optional subname referring a sub-object
* transform: whether to apply the transformation matrix of this view provider
* view: the MDIView, default to active view
</UserDocu>
</Documentation>
</Methode>
<Attribute Name="Annotation" ReadOnly="false">
<Documentation>
<UserDocu>A pivy Separator to add a custom scene graph to this ViewProvider</UserDocu>