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.
233 lines
7.3 KiB
C++
233 lines
7.3 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: TestDiagram.cxx
|
|
|
|
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 vtkGraphItem
|
|
* @brief A 2D graphics item for rendering a graph.
|
|
*
|
|
*
|
|
* This item draws a graph as a part of a vtkContextScene. This simple
|
|
* class has minimal state and delegates the determination of visual
|
|
* vertex and edge properties like color, size, width, etc. to
|
|
* a set of virtual functions. To influence the rendering of the graph,
|
|
* subclass this item and override the property functions you wish to
|
|
* customize.
|
|
*/
|
|
|
|
#ifndef vtkGraphItem_h
|
|
#define vtkGraphItem_h
|
|
|
|
#include "vtkContextItem.h"
|
|
#include "vtkViewsInfovisModule.h" // For export macro
|
|
|
|
#include "vtkColor.h" // For color types in API
|
|
#include "vtkNew.h" // For vtkNew ivars
|
|
#include "vtkVector.h" // For vector types in API
|
|
|
|
class vtkGraph;
|
|
class vtkImageData;
|
|
class vtkIncrementalForceLayout;
|
|
class vtkRenderWindowInteractor;
|
|
class vtkTooltipItem;
|
|
|
|
class VTKVIEWSINFOVIS_EXPORT vtkGraphItem : public vtkContextItem
|
|
{
|
|
public:
|
|
static vtkGraphItem* New();
|
|
vtkTypeMacro(vtkGraphItem, vtkContextItem);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* The graph that this item draws.
|
|
*/
|
|
virtual void SetGraph(vtkGraph* graph);
|
|
vtkGetObjectMacro(Graph, vtkGraph);
|
|
//@}
|
|
|
|
/**
|
|
* Exposes the incremental graph layout for updating parameters.
|
|
*/
|
|
virtual vtkIncrementalForceLayout* GetLayout();
|
|
|
|
//@{
|
|
/**
|
|
* Begins or ends the layout animation.
|
|
*/
|
|
virtual void StartLayoutAnimation(vtkRenderWindowInteractor* interactor);
|
|
virtual void StopLayoutAnimation();
|
|
//@}
|
|
|
|
/**
|
|
* Incrementally updates the graph layout.
|
|
*/
|
|
virtual void UpdateLayout();
|
|
|
|
protected:
|
|
vtkGraphItem();
|
|
~vtkGraphItem() override;
|
|
|
|
/**
|
|
* Paints the graph. This method will call RebuildBuffers()
|
|
* if the graph is dirty, then call PaintBuffers().
|
|
*/
|
|
bool Paint(vtkContext2D* painter) override;
|
|
|
|
/**
|
|
* Builds a cache of data from the graph by calling the virtual functions
|
|
* such as VertexColor(), EdgeColor(), etc. This will only get called when
|
|
* the item is dirty (i.e. IsDirty() returns true).
|
|
*/
|
|
virtual void RebuildBuffers();
|
|
|
|
/**
|
|
* Efficiently draws the contents of the buffers built in RebuildBuffers.
|
|
* This occurs once per frame.
|
|
*/
|
|
virtual void PaintBuffers(vtkContext2D* painter);
|
|
|
|
/**
|
|
* Returns true if the underlying vtkGraph has been modified since the last
|
|
* RebuildBuffers, signalling a new RebuildBuffers is needed. When the graph
|
|
* was modified, it assumes the buffers will be rebuilt, so it updates
|
|
* the modified time of the last build. Override this function if you have
|
|
* a subclass that uses any information in addition to the vtkGraph to determine
|
|
* visual properties that may be dynamic.
|
|
*/
|
|
virtual bool IsDirty();
|
|
|
|
/**
|
|
* Returns the number of vertices in the graph. Generally you do not need
|
|
* to override this method as it simply queries the underlying vtkGraph.
|
|
*/
|
|
virtual vtkIdType NumberOfVertices();
|
|
|
|
/**
|
|
* Returns the number of edges in the graph. Generally you do not need
|
|
* to override this method as it simply queries the underlying vtkGraph.
|
|
*/
|
|
virtual vtkIdType NumberOfEdges();
|
|
|
|
/**
|
|
* Returns the number of edge control points for a particular edge. The
|
|
* implementation returns GetNumberOfEdgePoints(edge) + 2 for the specified edge
|
|
* to incorporate the source and target vertex positions as initial
|
|
* and final edge points.
|
|
*/
|
|
virtual vtkIdType NumberOfEdgePoints(vtkIdType edge);
|
|
|
|
/**
|
|
* Returns the edge width. Override in a subclass to change the edge width.
|
|
* Note: The item currently supports one width per edge, queried on the first point.
|
|
*/
|
|
virtual float EdgeWidth(vtkIdType edge, vtkIdType point);
|
|
|
|
/**
|
|
* Returns the edge color. Override in a subclass to change the edge color.
|
|
* Each edge control point may be rendered with a separate color with interpolation
|
|
* on line segments between points.
|
|
*/
|
|
virtual vtkColor4ub EdgeColor(vtkIdType edge, vtkIdType point);
|
|
|
|
/**
|
|
* Returns the edge control point positions. You generally do not need to
|
|
* override this method, instead change the edge control points on the
|
|
* underlying vtkGraph with SetEdgePoint(), AddEdgePoint(), etc., then call
|
|
* Modified() on the vtkGraph and re-render the scene.
|
|
*/
|
|
virtual vtkVector2f EdgePosition(vtkIdType edge, vtkIdType point);
|
|
|
|
/**
|
|
* Returns the vertex size in pixels, which is remains the same at any zoom level.
|
|
* Override in a subclass to change the graph vertex size.
|
|
* Note: The item currently supports one size per graph, queried on the first vertex.
|
|
*/
|
|
virtual float VertexSize(vtkIdType vertex);
|
|
|
|
/**
|
|
* Returns the color of each vertex. Override in a subclass to change the
|
|
* graph vertex colors.
|
|
*/
|
|
virtual vtkColor4ub VertexColor(vtkIdType vertex);
|
|
|
|
/**
|
|
* Returns the marker type for each vertex, as defined in vtkMarkerUtilities.
|
|
* Override in a subclass to change the graph marker type.
|
|
* Note: The item currently supports one marker type for all vertices,
|
|
* queried on the first vertex.
|
|
*/
|
|
virtual int VertexMarker(vtkIdType vertex);
|
|
|
|
/**
|
|
* Returns the position of each vertex. You generally do not need to override
|
|
* this method. Instead, change the vertex positions with vtkGraph's SetPoint(),
|
|
* then call Modified() on the graph and re-render the scene.
|
|
*/
|
|
virtual vtkVector2f VertexPosition(vtkIdType vertex);
|
|
|
|
/**
|
|
* Returns the tooltip for each vertex. Override in a subclass to change the tooltip
|
|
* text.
|
|
*/
|
|
virtual vtkStdString VertexTooltip(vtkIdType vertex);
|
|
|
|
/**
|
|
* Process events and dispatch to the appropriate member functions.
|
|
*/
|
|
static void ProcessEvents(
|
|
vtkObject* caller, unsigned long event, void* clientData, void* callerData);
|
|
|
|
/**
|
|
* Return index of hit vertex, or -1 if no hit.
|
|
*/
|
|
virtual vtkIdType HitVertex(const vtkVector2f& pos);
|
|
|
|
//@{
|
|
/**
|
|
* Handle mouse events.
|
|
*/
|
|
bool MouseMoveEvent(const vtkContextMouseEvent& event) override;
|
|
bool MouseLeaveEvent(const vtkContextMouseEvent& event) override;
|
|
bool MouseEnterEvent(const vtkContextMouseEvent& event) override;
|
|
bool MouseButtonPressEvent(const vtkContextMouseEvent& event) override;
|
|
bool MouseButtonReleaseEvent(const vtkContextMouseEvent& event) override;
|
|
bool MouseWheelEvent(const vtkContextMouseEvent& event, int delta) override;
|
|
//@}
|
|
|
|
/**
|
|
* Whether this graph item is hit.
|
|
*/
|
|
bool Hit(const vtkContextMouseEvent& event) override;
|
|
|
|
/**
|
|
* Change the position of the tooltip based on the vertex hovered.
|
|
*/
|
|
virtual void PlaceTooltip(vtkIdType v);
|
|
|
|
private:
|
|
vtkGraphItem(const vtkGraphItem&) = delete;
|
|
void operator=(const vtkGraphItem&) = delete;
|
|
|
|
struct Internals;
|
|
Internals* Internal;
|
|
|
|
vtkGraph* Graph;
|
|
vtkMTimeType GraphBuildTime;
|
|
vtkNew<vtkImageData> Sprite;
|
|
vtkNew<vtkIncrementalForceLayout> Layout;
|
|
vtkNew<vtkTooltipItem> Tooltip;
|
|
};
|
|
|
|
#endif
|