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.

180 lines
4.9 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkBlueObeliskDataParser.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.
=========================================================================*/
/**
* @class vtkBlueObeliskDataParser
* @brief Fill a vtkBlueObeliskData
* container with data from the BODR XML dataset.
*
*
* The Blue Obelisk Data Repository is a free, open repository of
* chemical information. This class extracts the BODR information into
* vtk arrays, which are stored in a vtkBlueObeliskData object.
*
* \warning The vtkBlueObeliskDataParser class should never need to be
* used directly. For convenient access to the BODR data, use
* vtkPeriodicTable. For access to the raw arrays produced by this
* parser, see the vtkBlueObeliskData class. A static
* vtkBlueObeliskData object is accessible via
* vtkPeriodicTable::GetBlueObeliskData().
*
* @sa
* vtkPeriodicTable vtkBlueObeliskData
*/
#ifndef vtkBlueObeliskDataParser_h
#define vtkBlueObeliskDataParser_h
#include "vtkDomainsChemistryModule.h" // For export macro
#include "vtkXMLParser.h"
#include "vtkSmartPointer.h" // For vtkSmartPointer
class vtkAbstractArray;
class vtkBlueObeliskData;
class vtkFloatArray;
class vtkStdString;
class vtkStringArray;
class vtkUnsignedShortArray;
class VTKDOMAINSCHEMISTRY_EXPORT vtkBlueObeliskDataParser : public vtkXMLParser
{
public:
vtkTypeMacro(vtkBlueObeliskDataParser, vtkXMLParser);
void PrintSelf(ostream& os, vtkIndent indent) override;
static vtkBlueObeliskDataParser* New();
/**
* Set the target vtkBlueObeliskData object that this parser will
* populate
*/
virtual void SetTarget(vtkBlueObeliskData* bodr);
/**
* Start parsing
*/
int Parse() override;
//@{
/**
* These are only implemented to prevent compiler warnings about hidden
* virtual overloads. This function simply call Parse(); the arguments are
* ignored.
*/
int Parse(const char*) override;
int Parse(const char*, unsigned int) override;
//@}
protected:
vtkBlueObeliskDataParser();
~vtkBlueObeliskDataParser() override;
void StartElement(const char* name, const char** attr) override;
void EndElement(const char* name) override;
void CharacterDataHandler(const char* data, int length) override;
void SetCurrentValue(const char* data, int length);
void SetCurrentValue(const char* data);
vtkBlueObeliskData* Target;
bool IsProcessingAtom;
void NewAtomStarted(const char** attr);
void NewAtomFinished();
bool IsProcessingValue;
void NewValueStarted(const char** attr);
void NewValueFinished();
std::string CharacterDataValueBuffer;
enum AtomValueType
{
None = 0,
AtomicNumber,
Symbol,
Name,
PeriodicTableBlock,
ElectronicConfiguration,
Family,
Mass,
ExactMass,
IonizationEnergy,
ElectronAffinity,
PaulingElectronegativity,
CovalentRadius,
VDWRadius,
DefaultColor,
BoilingPoint,
MeltingPoint,
Period,
Group
} CurrentValueType;
int CurrentAtomicNumber;
vtkStdString* CurrentSymbol;
vtkStdString* CurrentName;
vtkStdString* CurrentPeriodicTableBlock;
vtkStdString* CurrentElectronicConfiguration;
vtkStdString* CurrentFamily;
float CurrentMass;
float CurrentExactMass;
float CurrentIonizationEnergy;
float CurrentElectronAffinity;
float CurrentPaulingElectronegativity;
float CurrentCovalentRadius;
float CurrentVDWRadius;
float CurrentDefaultColor[3];
float CurrentBoilingPoint;
float CurrentMeltingPoint;
unsigned int CurrentPeriod;
unsigned int CurrentGroup;
private:
vtkBlueObeliskDataParser(const vtkBlueObeliskDataParser&) = delete;
void operator=(const vtkBlueObeliskDataParser&) = delete;
//@{
/**
* Resize array if needed and set the entry at ind to val.
*/
static void ResizeArrayIfNeeded(vtkAbstractArray* arr, vtkIdType ind);
static void ResizeAndSetValue(vtkStdString* val, vtkStringArray* arr, vtkIdType ind);
static void ResizeAndSetValue(float val, vtkFloatArray* arr, vtkIdType ind);
static void ResizeAndSetValue(unsigned short val, vtkUnsignedShortArray* arr, vtkIdType ind);
//@}
//@{
/**
* Parse types from const char *
*/
static int parseInt(const char*);
static float parseFloat(const char*);
static void parseFloat3(const char* str, float[3]);
static unsigned short parseUnsignedShort(const char*);
//@}
//@{
/**
* Convert a string to lower case. This will modify the input string
* and return the input pointer.
*/
static vtkStdString* ToLower(vtkStdString*);
//@}
};
#endif