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

dox/Common/vtkFunctionParser.h

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