You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
6.0 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkAbstractPropPicker.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkAbstractPropPicker
* @brief abstract API for pickers that can pick an instance of vtkProp
*
* vtkAbstractPropPicker is an abstract superclass for pickers that can pick
* an instance of vtkProp. Some pickers, like vtkWorldPointPicker (not a
* subclass of this class), cannot identify the prop that is
* picked. Subclasses of vtkAbstractPropPicker return a prop in the form of a
* vtkAssemblyPath when a pick is invoked. Note that an vtkAssemblyPath
* contain a list of vtkAssemblyNodes, each of which in turn contains a
* reference to a vtkProp and a 4x4 transformation matrix. The path fully
* describes the entire pick path, so you can pick assemblies or portions of
* assemblies, or just grab the tail end of the vtkAssemblyPath (which is the
* picked prop).
*
* @warning
* Because a vtkProp can be placed into different assemblies, or even in
* different leaf positions of the same assembly, the vtkAssemblyPath is
* used to fully qualify exactly which use of the vtkProp was picked,
* including its position (since vtkAssemblyPath includes a transformation
* matrix per node).
*
* @warning
* The class returns information about picked actors, props, etc. Note that
* what is returned by these methods is the top level of the assembly
* path. This can cause a lot of confusion! For example, if you pick a
* vtkAssembly, and the returned vtkAssemblyPath has as a leaf a vtkActor,
* then if you invoke GetActor(), you will get NULL, even though an actor was
* indeed picked. (GetAssembly() will return something.) Note that the safest
* thing to do is to do a GetViewProp(), which will always return something if
* something was picked. A better way to manage picking is to work with
* vtkAssemblyPath, since this completely defines the pick path from top to
* bottom in a assembly hierarchy, and avoids confusion when the same prop is
* used in different assemblies.
*
* @warning
* The returned assembly paths refer to assembly nodes that in turn refer
* to vtkProp and vtkMatrix. This association to vtkProp is not a reference
* counted association, meaning that dangling references are possible if
* you do a pick, get an assembly path, and then delete a vtkProp. (Reason:
* assembly paths create many self-referencing loops that destroy reference
* counting.)
*
* @sa
* vtkPropPicker vtkPicker vtkWorldPointPicker vtkCellPicker vtkPointPicker
* vtkAssemblyPath vtkAssemblyNode vtkAssemblyPaths vtkAbstractPicker
* vtkRenderer
*/
#ifndef vtkAbstractPropPicker_h
#define vtkAbstractPropPicker_h
#include "vtkAbstractPicker.h"
#include "vtkRenderingCoreModule.h" // For export macro
class vtkProp;
class vtkPropAssembly;
class vtkAssembly;
class vtkActor;
class vtkVolume;
class vtkProp3D;
class vtkAssemblyPath;
class vtkActor2D;
class VTKRENDERINGCORE_EXPORT vtkAbstractPropPicker : public vtkAbstractPicker
{
public:
vtkTypeMacro(vtkAbstractPropPicker, vtkAbstractPicker);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Return the vtkAssemblyPath that has been picked. The assembly path lists
* all the vtkProps that form an assembly. If no assembly is present, then
* the assembly path will have one node (which is the picked prop). The
* set method is used internally to set the path. (Note: the structure of
* an assembly path is a collection of vtkAssemblyNode, each node pointing
* to a vtkProp and (possibly) a transformation matrix.)
*/
virtual void SetPath(vtkAssemblyPath*);
vtkGetObjectMacro(Path, vtkAssemblyPath);
//@}
// The following are convenience methods to maintain API with older
// versions of VTK, and to allow query for the return type of a pick. Note:
// the functionality of these methods can also be obtained by using the
// returned vtkAssemblyPath and using the IsA() to determine type.
/**
* Return the vtkProp that has been picked. If NULL, nothing was picked.
* If anything at all was picked, this method will return something.
*/
virtual vtkProp* GetViewProp();
/**
* Return the vtkProp that has been picked. If NULL, no vtkProp3D was picked.
*/
virtual vtkProp3D* GetProp3D();
/**
* Return the vtkActor that has been picked. If NULL, no actor was picked.
*/
virtual vtkActor* GetActor();
/**
* Return the vtkActor2D that has been picked. If NULL, no actor2D was
* picked.
*/
virtual vtkActor2D* GetActor2D();
/**
* Return the vtkVolume that has been picked. If NULL, no volume was picked.
*/
virtual vtkVolume* GetVolume();
/**
* Return the vtkAssembly that has been picked. If NULL, no assembly
* was picked. (Note: the returned assembly is the first node in the
* assembly path. If the path is one node long, then the assembly and
* the prop are the same, assuming that the first node is a vtkAssembly.)
*/
virtual vtkAssembly* GetAssembly();
/**
* Return the vtkPropAssembly that has been picked. If NULL, no prop
* assembly was picked. (Note: the returned prop assembly is the first node
* in the assembly path. If the path is one node long, then the prop
* assembly and the prop are the same, assuming that the first node is a
* vtkPropAssembly.)
*/
virtual vtkPropAssembly* GetPropAssembly();
protected:
vtkAbstractPropPicker();
~vtkAbstractPropPicker() override;
void Initialize() override;
vtkAssemblyPath* Path; // this is what is picked, and includes the prop
private:
vtkAbstractPropPicker(const vtkAbstractPropPicker&) = delete;
void operator=(const vtkAbstractPropPicker&) = delete;
};
#endif