00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00022 #ifndef __vtkExodusIIReaderParser_h
00023 #define __vtkExodusIIReaderParser_h
00024 
00025 #include "vtkXMLParser.h"
00026 #include "vtkSmartPointer.h"
00027 
00028 #include <vtksys/ios/sstream>
00029 #include <vtkstd/map>
00030 #include <vtkstd/vector>
00031 #include <vtkstd/set>
00032 #include <vtkstd/string>
00033 
00034 class vtkMutableDirectedGraph;
00035 class vtkStringArray;
00036 class vtkUnsignedCharArray;
00037 
00038 class VTK_HYBRID_EXPORT vtkExodusIIReaderParser : public vtkXMLParser
00039 {
00040 public:
00041   static vtkExodusIIReaderParser* New();
00042   vtkTypeMacro(vtkExodusIIReaderParser, vtkXMLParser);
00043   void PrintSelf(ostream& os, vtkIndent indent);
00044 
00046 
00047   vtkGetObjectMacro(SIL, vtkMutableDirectedGraph);
00049 
00051   void Go(const char* filename);
00052 
00053   
00054   
00055   bool HasInformationAboutBlock(int id)
00056     {
00057     return (this->BlockID_To_VertexID.find(id) != this->BlockID_To_VertexID.end());
00058     }
00059 
00062   vtkstd::string GetBlockName(int id);
00063 
00065 
00067   void GetBlockIds(vtkstd::set<int>& blockIdsSet)
00068     {
00069     vtkstd::map<int, vtkIdType>::iterator iter;
00070     for (iter = this->BlockID_To_VertexID.begin();
00071       iter != this->BlockID_To_VertexID.end();
00072       ++iter)
00073       {
00074       blockIdsSet.insert(iter->first);
00075       }
00076     }
00077 
00078 protected:
00079   vtkExodusIIReaderParser();
00080   ~vtkExodusIIReaderParser();
00082 
00083   virtual void StartElement( const char* tagName, const char** attrs);
00084   virtual void EndElement(const char* tagName);
00085   void FinishedParsing();
00086 
00087   const char* GetValue(const char* attr,const char** attrs)
00088     {
00089     int i;
00090     for (i=0;attrs[i];i+=2)
00091       {
00092       const char* name=strrchr(attrs[i],':');
00093       if (!name)
00094         {
00095         name=attrs[i];
00096         }
00097       else
00098         {
00099         name++;
00100         }
00101       if (strcmp(attr,name)==0)
00102         {
00103         return attrs[i+1];
00104         }
00105       }
00106     return NULL;
00107     }
00108 
00109   
00110   vtkIdType AddVertexToSIL(const char* name);
00111   vtkIdType AddChildEdgeToSIL(vtkIdType src, vtkIdType dst);
00112   vtkIdType AddCrossEdgeToSIL(vtkIdType src, vtkIdType dst);
00113 
00117   vtkIdType GetPartVertex(const char* part_number_instance_string);
00118 
00119   
00120   
00121   vtkstd::map<int, vtkIdType> BlockID_To_VertexID;
00122 
00123 
00124   
00125   vtkstd::map<int, vtkstd::string> BlockID_To_MaterialName;
00126 
00127   
00128   
00129   vtkstd::map<vtkstd::string, vtkIdType> MaterialName_To_VertexID;
00130 
00131   vtkstd::map<vtkIdType, vtkstd::string> PartVertexID_To_Descriptions;
00132 
00133   
00134   
00135   
00136   
00137   vtkstd::map<vtkIdType, vtkstd::string> MaterialSpecifications;
00138 
00139   
00140   
00141   vtkstd::map<vtkstd::string, vtkIdType> Part_To_VertexID;
00142 
00143   
00144   vtkstd::map<int, vtkstd::string> BlockID_To_Part;
00145   
00146   vtkMutableDirectedGraph* SIL;
00147   vtkSmartPointer<vtkStringArray> NamesArray;
00148   vtkSmartPointer<vtkUnsignedCharArray> CrossEdgesArray;
00149 
00150   vtkstd::string BlockPartNumberString;
00151 
00152   vtkIdType RootVertex;
00153   vtkIdType BlocksVertex;
00154   vtkIdType AssembliesVertex;
00155   vtkIdType MaterialsVertex;
00156   vtkstd::vector<vtkIdType> CurrentVertex;
00157 
00158   bool InBlocks;
00159   bool InMaterialAssignments;
00160 
00161 private:
00162   vtkExodusIIReaderParser(const vtkExodusIIReaderParser&); 
00163   void operator=(const vtkExodusIIReaderParser&); 
00164 
00165 };
00166 
00167 #endif
00168