Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

Common/vtkFunctionParser.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkFunctionParser.h,v $
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00026 #ifndef __vtkFunctionParser_h
00027 #define __vtkFunctionParser_h
00028 
00029 #include "vtkObject.h"
00030 
00031 #define VTK_PARSER_IMMEDIATE 1
00032 #define VTK_PARSER_UNARY_MINUS 2
00033 
00034 // supported math functions
00035 #define VTK_PARSER_ADD 3
00036 #define VTK_PARSER_SUBTRACT 4
00037 #define VTK_PARSER_MULTIPLY 5
00038 #define VTK_PARSER_DIVIDE 6
00039 #define VTK_PARSER_POWER 7
00040 #define VTK_PARSER_ABSOLUTE_VALUE 8
00041 #define VTK_PARSER_EXPONENT 9
00042 #define VTK_PARSER_CEILING 10
00043 #define VTK_PARSER_FLOOR 11
00044 #define VTK_PARSER_LOGARITHM 12
00045 #define VTK_PARSER_SQUARE_ROOT 13
00046 #define VTK_PARSER_SINE 14
00047 #define VTK_PARSER_COSINE 15
00048 #define VTK_PARSER_TANGENT 16
00049 #define VTK_PARSER_ARCSINE 17
00050 #define VTK_PARSER_ARCCOSINE 18
00051 #define VTK_PARSER_ARCTANGENT 19
00052 #define VTK_PARSER_HYPERBOLIC_SINE 20
00053 #define VTK_PARSER_HYPERBOLIC_COSINE 21
00054 #define VTK_PARSER_HYPERBOLIC_TANGENT 22
00055 #define VTK_PARSER_MIN 23
00056 #define VTK_PARSER_MAX 24
00057 #define VTK_PARSER_SIGN 25
00058 
00059 // functions involving vectors
00060 #define VTK_PARSER_VECTOR_UNARY_MINUS 26
00061 #define VTK_PARSER_DOT_PRODUCT 27
00062 #define VTK_PARSER_VECTOR_ADD 28
00063 #define VTK_PARSER_VECTOR_SUBTRACT 29
00064 #define VTK_PARSER_SCALAR_TIMES_VECTOR 30
00065 #define VTK_PARSER_VECTOR_TIMES_SCALAR 31
00066 #define VTK_PARSER_MAGNITUDE 32
00067 #define VTK_PARSER_NORMALIZE 33
00068 
00069 // constants involving vectors
00070 #define VTK_PARSER_IHAT 34
00071 #define VTK_PARSER_JHAT 35
00072 #define VTK_PARSER_KHAT 36
00073 
00074 // codes for scalar variables come before those for vectors
00075 #define VTK_PARSER_BEGIN_VARIABLES 37
00076 
00077 // the value that is retuned as a result if there is an error
00078 #define VTK_PARSER_ERROR_RESULT VTK_LARGE_FLOAT
00079 
00080 class VTK_COMMON_EXPORT vtkFunctionParser : public vtkObject
00081 {
00082 public:
00083   static vtkFunctionParser *New();
00084   vtkTypeRevisionMacro(vtkFunctionParser, vtkObject);
00085   void PrintSelf(ostream& os, vtkIndent indent);
00086   
00088 
00089   void SetFunction(const char *function);
00090   vtkGetStringMacro(Function);
00092 
00095   int IsScalarResult();
00096 
00099   int IsVectorResult();
00100 
00102   double GetScalarResult();
00103 
00105 
00106   double* GetVectorResult();
00107   void GetVectorResult(double result[3]) {
00108     double *r = this->GetVectorResult();
00109     result[0] = r[0]; result[1] = r[1]; result[2] = r[2]; };
00111 
00113 
00117   void SetScalarVariableValue(const char* variableName, double value);
00118   void SetScalarVariableValue(int i, double value);
00120 
00122 
00123   double GetScalarVariableValue(const char* variableName);
00124   double GetScalarVariableValue(int i);
00126 
00128 
00132   void SetVectorVariableValue(const char* variableName, double xValue,
00133                               double yValue, double zValue);
00134   void SetVectorVariableValue(const char* variableName, 
00135                               const double values[3]) {
00136     this->SetVectorVariableValue(variableName,values[0],values[1],values[2]);};
00137   void SetVectorVariableValue(int i, double xValue, double yValue,
00138                               double zValue);
00139   void SetVectorVariableValue(int i, const double values[3]) {
00140     this->SetVectorVariableValue(i,values[0],values[1],values[2]);};
00142   
00144 
00145   double* GetVectorVariableValue(const char* variableName);
00146   void GetVectorVariableValue(const char* variableName, double value[3]) {
00147     double *r = this->GetVectorVariableValue(variableName);
00148     value[0] = r[0]; value[1] = r[1]; value[2] = r[2]; };
00149   double* GetVectorVariableValue(int i);
00150   void GetVectorVariableValue(int i, double value[3]) {
00151     double *r = this->GetVectorVariableValue(i);
00152     value[0] = r[0]; value[1] = r[1]; value[2] = r[2]; };
00154   
00156 
00157   vtkGetMacro(NumberOfScalarVariables,int);
00159 
00161 
00162   vtkGetMacro(NumberOfVectorVariables,int);
00164 
00166   char* GetScalarVariableName(int i);
00167   
00169   char* GetVectorVariableName(int i);
00170 
00172   void RemoveAllVariables();
00173   
00174 protected:
00175   vtkFunctionParser();
00176   ~vtkFunctionParser();
00177   
00178   int Parse();
00179   void Evaluate();
00180 
00181   int CheckSyntax();
00182   void RemoveSpaces();
00183   char* RemoveSpacesFrom(const char* variableName);
00184   
00185   int BuildInternalFunctionStructure();
00186   void BuildInternalSubstringStructure(int beginIndex, int endIndex);
00187   void AddInternalByte(unsigned char newByte);
00188   
00189   int IsSubstringCompletelyEnclosed(int beginIndex, int endIndex);
00190   int FindEndOfMathFunction(int beginIndex);
00191   int FindEndOfMathConstant(int beginIndex);
00192   
00193   int IsVariableName(int currentIndex);
00194   int IsElementaryOperator(int op);
00195   
00196   int GetMathFunctionNumber(int currentIndex);
00197   int GetMathFunctionStringLength(int mathFunctionNumber);
00198   int GetMathConstantNumber(int currentIndex);
00199   int GetMathConstantStringLength(int mathConstantNumber);
00200   int GetElementaryOperatorNumber(char op);
00201   int GetOperandNumber(int currentIndex);
00202   int GetVariableNameLength(int variableNumber);
00203   
00204   int DisambiguateOperators();
00205   
00206   char* Function;
00207   int FunctionLength;
00208   int NumberOfScalarVariables;
00209   int NumberOfVectorVariables;
00210   char** ScalarVariableNames;
00211   char** VectorVariableNames;
00212   double* ScalarVariableValues;
00213   double** VectorVariableValues;
00214   unsigned char *ByteCode;
00215   int ByteCodeSize;
00216   double *Immediates;
00217   int ImmediatesSize;
00218   double *Stack;
00219   int StackSize;
00220   int StackPointer;
00221 
00222   vtkTimeStamp FunctionMTime;
00223   vtkTimeStamp ParseMTime;
00224   vtkTimeStamp VariableMTime;
00225   vtkTimeStamp EvaluateMTime;
00226 private:
00227   vtkFunctionParser(const vtkFunctionParser&);  // Not implemented.
00228   void operator=(const vtkFunctionParser&);  // Not implemented.
00229 };
00230 
00231 #endif