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
180 lines
4.9 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
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
|