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.

179 lines
4.9 KiB
C

/*=========================================================================
Program: ParaView
Module: vtkExodusIIReaderParser.h
Copyright (c) Kitware, Inc.
All rights reserved.
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html 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 vtkExodusIIReaderParser
* @brief internal parser used by vtkExodusIIReader.
*
* vtkExodusIIReaderParser is an internal XML parser used by vtkExodusIIReader.
* This is not for public use.
*/
#ifndef vtkExodusIIReaderParser_h
#define vtkExodusIIReaderParser_h
#include "vtkIOExodusModule.h" // For export macro
#include "vtkSmartPointer.h"
#include "vtkXMLParser.h"
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <vector>
class vtkMutableDirectedGraph;
class vtkStringArray;
class vtkUnsignedCharArray;
class VTKIOEXODUS_EXPORT vtkExodusIIReaderParser : public vtkXMLParser
{
public:
static vtkExodusIIReaderParser* New();
vtkTypeMacro(vtkExodusIIReaderParser, vtkXMLParser);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Returns the SIL.
* This is valid only after Go().
*/
vtkGetObjectMacro(SIL, vtkMutableDirectedGraph);
//@}
/**
* Trigger parsing of the XML file.
*/
void Go(const char* filename);
// Returns if the parser has some information about the block with given "id".
// This is valid only after Go().
bool HasInformationAboutBlock(int id)
{
return (this->BlockID_To_VertexID.find(id) != this->BlockID_To_VertexID.end());
}
/**
* Given a block "id" return the name as determined from the xml.
* This is valid only after Go().
*/
std::string GetBlockName(int id);
//@{
/**
* Fills up the blockIdsSet with the block ids referred to by the XML.
* This is valid only after Go().
*/
void GetBlockIds(std::set<int>& blockIdsSet)
{
std::map<int, vtkIdType>::iterator iter;
for (iter = this->BlockID_To_VertexID.begin(); iter != this->BlockID_To_VertexID.end(); ++iter)
{
blockIdsSet.insert(iter->first);
}
}
//@}
protected:
vtkExodusIIReaderParser();
~vtkExodusIIReaderParser() override;
void StartElement(const char* tagName, const char** attrs) override;
void EndElement(const char* tagName) override;
void FinishedParsing();
const char* GetValue(const char* attr, const char** attrs)
{
int i;
for (i = 0; attrs[i]; i += 2)
{
const char* name = strrchr(attrs[i], ':');
if (!name)
{
name = attrs[i];
}
else
{
name++;
}
if (strcmp(attr, name) == 0)
{
return attrs[i + 1];
}
}
return nullptr;
}
// Convenience methods to add vertices/edges to the SIL.
vtkIdType AddVertexToSIL(const char* name);
vtkIdType AddChildEdgeToSIL(vtkIdType src, vtkIdType dst);
vtkIdType AddCrossEdgeToSIL(vtkIdType src, vtkIdType dst);
/**
* Returns the vertex id for the "part" with given
* part_number_instance_string formed as
* "{part-number} Instance: {part-instance}"
*/
vtkIdType GetPartVertex(const char* part_number_instance_string);
// For each of the blocks, this maps the "id" attribute in the XML to the
// vertex id for the block in the SIL.
std::map<int, vtkIdType> BlockID_To_VertexID;
// Maps block "id"s to material names.
std::map<int, std::string> BlockID_To_MaterialName;
// Maps material name to vertex id.
// This will be build only if <material-list> is present in the XML.
std::map<std::string, vtkIdType> MaterialName_To_VertexID;
std::map<vtkIdType, std::string> PartVertexID_To_Descriptions;
// These save the values read from <material-specification /> element present
// withint the <part /> elements.
// key: part vertex id
// value: material name = (desp + spec)
std::map<vtkIdType, std::string> MaterialSpecifications;
// Maps the "{part-number} Instance: {part-instance}" key for the vertex id
// for the part vertex in the Assemblies hierarchy.
std::map<std::string, vtkIdType> Part_To_VertexID;
// Maps a block-id to the "{part-number} Instance: {part-instance}" string.
std::map<int, std::string> BlockID_To_Part;
vtkMutableDirectedGraph* SIL;
vtkSmartPointer<vtkStringArray> NamesArray;
vtkSmartPointer<vtkUnsignedCharArray> CrossEdgesArray;
std::string BlockPartNumberString;
vtkIdType RootVertex;
vtkIdType BlocksVertex;
vtkIdType AssembliesVertex;
vtkIdType MaterialsVertex;
std::vector<vtkIdType> CurrentVertex;
bool InBlocks;
bool InMaterialAssignments;
private:
vtkExodusIIReaderParser(const vtkExodusIIReaderParser&) = delete;
void operator=(const vtkExodusIIReaderParser&) = delete;
};
#endif
// VTK-HeaderTest-Exclude: vtkExodusIIReaderParser.h