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.

168 lines
5.9 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkTableToGraph.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.
=========================================================================*/
/*-------------------------------------------------------------------------
Copyright 2008 Sandia Corporation.
Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
the U.S. Government retains certain rights in this software.
-------------------------------------------------------------------------*/
/**
* @class vtkTableToGraph
* @brief convert a vtkTable into a vtkGraph
*
*
* vtkTableToGraph converts a table to a graph using an auxiliary
* link graph. The link graph specifies how each row in the table
* should be converted to an edge, or a collection of edges. It also
* specifies which columns of the table should be considered part of
* the same domain, and which columns should be hidden.
*
* A second, optional, table may be provided as the vertex table.
* This vertex table must have one or more domain columns whose values
* match values in the edge table. The linked column name is specified in
* the domain array in the link graph. The output graph will only contain
* vertices corresponding to a row in the vertex table. For heterogeneous
* graphs, you may want to use vtkMergeTables to create a single vertex table.
*
* The link graph contains the following arrays:
*
* (1) The "column" array has the names of the columns to connect in each table row.
* This array is required.
*
* (2) The optional "domain" array provides user-defined domain names for each column.
* Matching domains in multiple columns will merge vertices with the same
* value from those columns. By default, all columns are in the same domain.
* If a vertex table is supplied, the domain indicates the column in the vertex
* table that the edge table column associates with. If the user provides a
* vertex table but no domain names, the output will be an empty graph.
* Hidden columns do not need valid domain names.
*
* (3) The optional "hidden" array is a bit array specifying whether the column should be
* hidden. The resulting graph will contain edges representing connections
* "through" the hidden column, but the vertices for that column will not
* be present. By default, no columns are hidden. Hiding a column
* in a particular domain hides all columns in that domain.
*
* The output graph will contain three additional arrays in the vertex data.
* The "domain" column is a string array containing the domain of each vertex.
* The "label" column is a string version of the distinct value that, along
* with the domain, defines that vertex. The "ids" column also contains
* the distinguishing value, but as a vtkVariant holding the raw value instead
* of being converted to a string. The "ids" column is set as the vertex pedigree
* ID attribute.
*/
#ifndef vtkTableToGraph_h
#define vtkTableToGraph_h
#include "vtkGraphAlgorithm.h"
#include "vtkInfovisCoreModule.h" // For export macro
class vtkBitArray;
class vtkMutableDirectedGraph;
class vtkStringArray;
class vtkTable;
class VTKINFOVISCORE_EXPORT vtkTableToGraph : public vtkGraphAlgorithm
{
public:
static vtkTableToGraph* New();
vtkTypeMacro(vtkTableToGraph, vtkGraphAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Add a vertex to the link graph. Specify the column name, the domain name
* for the column, and whether the column is hidden.
*/
void AddLinkVertex(const char* column, const char* domain = nullptr, int hidden = 0);
/**
* Clear the link graph vertices. This also clears all edges.
*/
void ClearLinkVertices();
/**
* Add an edge to the link graph. Specify the names of the columns to link.
*/
void AddLinkEdge(const char* column1, const char* column2);
/**
* Clear the link graph edges. The graph vertices will remain.
*/
void ClearLinkEdges();
//@{
/**
* The graph describing how to link the columns in the table.
*/
vtkGetObjectMacro(LinkGraph, vtkMutableDirectedGraph);
void SetLinkGraph(vtkMutableDirectedGraph* g);
//@}
/**
* Links the columns in a specific order.
* This creates a simple path as the link graph.
*/
void LinkColumnPath(
vtkStringArray* column, vtkStringArray* domain = nullptr, vtkBitArray* hidden = nullptr);
//@{
/**
* Specify the directedness of the output graph.
*/
vtkSetMacro(Directed, bool);
vtkGetMacro(Directed, bool);
vtkBooleanMacro(Directed, bool);
//@}
/**
* Get the current modified time.
*/
vtkMTimeType GetMTime() override;
/**
* A convenience method for setting the vertex table input. This
* is mainly for the benefit of the VTK client/server layer,
* vanilla VTK code should use e.g:
* table_to_graph->SetInputConnection(1, vertex_table->output());
*/
void SetVertexTableConnection(vtkAlgorithmOutput* in);
protected:
vtkTableToGraph();
~vtkTableToGraph() override;
/**
* Validate that the link graph is in the appropriate format.
*/
int ValidateLinkGraph();
int FillInputPortInformation(int port, vtkInformation* info) override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestDataObject(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
bool Directed;
vtkMutableDirectedGraph* LinkGraph;
vtkStringArray* VertexTableDomains;
private:
vtkTableToGraph(const vtkTableToGraph&) = delete;
void operator=(const vtkTableToGraph&) = delete;
};
#endif