/*========================================================================= 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 #include #include #include #include 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& blockIdsSet) { std::map::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 BlockID_To_VertexID; // Maps block "id"s to material names. std::map BlockID_To_MaterialName; // Maps material name to vertex id. // This will be build only if is present in the XML. std::map MaterialName_To_VertexID; std::map PartVertexID_To_Descriptions; // These save the values read from element present // withint the elements. // key: part vertex id // value: material name = (desp + spec) std::map MaterialSpecifications; // Maps the "{part-number} Instance: {part-instance}" key for the vertex id // for the part vertex in the Assemblies hierarchy. std::map Part_To_VertexID; // Maps a block-id to the "{part-number} Instance: {part-instance}" string. std::map BlockID_To_Part; vtkMutableDirectedGraph* SIL; vtkSmartPointer NamesArray; vtkSmartPointer CrossEdgesArray; std::string BlockPartNumberString; vtkIdType RootVertex; vtkIdType BlocksVertex; vtkIdType AssembliesVertex; vtkIdType MaterialsVertex; std::vector CurrentVertex; bool InBlocks; bool InMaterialAssignments; private: vtkExodusIIReaderParser(const vtkExodusIIReaderParser&) = delete; void operator=(const vtkExodusIIReaderParser&) = delete; }; #endif // VTK-HeaderTest-Exclude: vtkExodusIIReaderParser.h