VTK
vtkFunctionParser.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkFunctionParser.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
46 #ifndef vtkFunctionParser_h
47 #define vtkFunctionParser_h
48 
49 #include "vtkCommonMiscModule.h" // For export macro
50 #include "vtkObject.h"
51 #include "vtkTuple.h" // needed for vtkTuple
52 #include <vector> // needed for vector
53 #include <string> // needed for string.
54 
55 #define VTK_PARSER_IMMEDIATE 1
56 #define VTK_PARSER_UNARY_MINUS 2
57 #define VTK_PARSER_UNARY_PLUS 3
58 
59 // supported math functions
60 #define VTK_PARSER_ADD 4
61 #define VTK_PARSER_SUBTRACT 5
62 #define VTK_PARSER_MULTIPLY 6
63 #define VTK_PARSER_DIVIDE 7
64 #define VTK_PARSER_POWER 8
65 #define VTK_PARSER_ABSOLUTE_VALUE 9
66 #define VTK_PARSER_EXPONENT 10
67 #define VTK_PARSER_CEILING 11
68 #define VTK_PARSER_FLOOR 12
69 #define VTK_PARSER_LOGARITHM 13
70 #define VTK_PARSER_LOGARITHME 14
71 #define VTK_PARSER_LOGARITHM10 15
72 #define VTK_PARSER_SQUARE_ROOT 16
73 #define VTK_PARSER_SINE 17
74 #define VTK_PARSER_COSINE 18
75 #define VTK_PARSER_TANGENT 19
76 #define VTK_PARSER_ARCSINE 20
77 #define VTK_PARSER_ARCCOSINE 21
78 #define VTK_PARSER_ARCTANGENT 22
79 #define VTK_PARSER_HYPERBOLIC_SINE 23
80 #define VTK_PARSER_HYPERBOLIC_COSINE 24
81 #define VTK_PARSER_HYPERBOLIC_TANGENT 25
82 #define VTK_PARSER_MIN 26
83 #define VTK_PARSER_MAX 27
84 #define VTK_PARSER_SIGN 29
85 
86 // functions involving vectors
87 #define VTK_PARSER_CROSS 28
88 #define VTK_PARSER_VECTOR_UNARY_MINUS 30
89 #define VTK_PARSER_VECTOR_UNARY_PLUS 31
90 #define VTK_PARSER_DOT_PRODUCT 32
91 #define VTK_PARSER_VECTOR_ADD 33
92 #define VTK_PARSER_VECTOR_SUBTRACT 34
93 #define VTK_PARSER_SCALAR_TIMES_VECTOR 35
94 #define VTK_PARSER_VECTOR_TIMES_SCALAR 36
95 #define VTK_PARSER_VECTOR_OVER_SCALAR 37
96 #define VTK_PARSER_MAGNITUDE 38
97 #define VTK_PARSER_NORMALIZE 39
98 
99 // constants involving vectors
100 #define VTK_PARSER_IHAT 40
101 #define VTK_PARSER_JHAT 41
102 #define VTK_PARSER_KHAT 42
103 
104 // code for if(bool, trueval, falseval) resulting in a scalar
105 #define VTK_PARSER_IF 43
106 
107 // code for if(bool, truevec, falsevec) resulting in a vector
108 #define VTK_PARSER_VECTOR_IF 44
109 
110 // codes for boolean expressions
111 #define VTK_PARSER_LESS_THAN 45
112 
113 // codes for boolean expressions
114 #define VTK_PARSER_GREATER_THAN 46
115 
116 // codes for boolean expressions
117 #define VTK_PARSER_EQUAL_TO 47
118 
119 // codes for boolean expressions
120 #define VTK_PARSER_AND 48
121 
122 // codes for boolean expressions
123 #define VTK_PARSER_OR 49
124 
125 // codes for scalar variables come before those for vectors. Do not define
126 // values for VTK_PARSER_BEGIN_VARIABLES+1, VTK_PARSER_BEGIN_VARIABLES+2, ...,
127 // because they are used to look up variables numbered 1, 2, ...
128 #define VTK_PARSER_BEGIN_VARIABLES 50
129 
130 // the value that is retuned as a result if there is an error
131 #define VTK_PARSER_ERROR_RESULT VTK_FLOAT_MAX
132 
133 class VTKCOMMONMISC_EXPORT vtkFunctionParser : public vtkObject
134 {
135 public:
136  static vtkFunctionParser *New();
137  vtkTypeMacro(vtkFunctionParser, vtkObject);
138  void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE;
139 
143  vtkMTimeType GetMTime() VTK_OVERRIDE;
144 
146 
149  void SetFunction(const char *function);
150  vtkGetStringMacro(Function);
152 
157  int IsScalarResult();
158 
163  int IsVectorResult();
164 
168  double GetScalarResult();
169 
171 
174  double* GetVectorResult();
175  void GetVectorResult(double result[3]) {
176  double *r = this->GetVectorResult();
177  result[0] = r[0]; result[1] = r[1]; result[2] = r[2]; };
179 
181 
187  void SetScalarVariableValue(const char* variableName, double value);
188  void SetScalarVariableValue(int i, double value);
190 
192 
195  double GetScalarVariableValue(const char* variableName);
196  double GetScalarVariableValue(int i);
198 
200 
206  void SetVectorVariableValue(const char* variableName, double xValue,
207  double yValue, double zValue);
208  void SetVectorVariableValue(const char* variableName,
209  const double values[3]) {
210  this->SetVectorVariableValue(variableName,values[0],values[1],values[2]);};
211  void SetVectorVariableValue(int i, double xValue, double yValue,
212  double zValue);
213  void SetVectorVariableValue(int i, const double values[3]) {
214  this->SetVectorVariableValue(i,values[0],values[1],values[2]);};
216 
218 
221  double* GetVectorVariableValue(const char* variableName);
222  void GetVectorVariableValue(const char* variableName, double value[3]) {
223  double *r = this->GetVectorVariableValue(variableName);
224  value[0] = r[0]; value[1] = r[1]; value[2] = r[2]; };
225  double* GetVectorVariableValue(int i);
226  void GetVectorVariableValue(int i, double value[3]) {
227  double *r = this->GetVectorVariableValue(i);
228  value[0] = r[0]; value[1] = r[1]; value[2] = r[2]; };
230 
235  { return static_cast<int>(this->ScalarVariableNames.size()); }
236 
241  { return static_cast<int>(this->VectorVariableNames.size()); }
242 
246  const char* GetScalarVariableName(int i);
247 
251  const char* GetVectorVariableName(int i);
252 
254 
259  bool GetScalarVariableNeeded(int i);
260  bool GetScalarVariableNeeded(const char* variableName);
262 
264 
269  bool GetVectorVariableNeeded(int i);
270  bool GetVectorVariableNeeded(const char* variableName);
272 
276  void RemoveAllVariables();
277 
281  void RemoveScalarVariables();
282 
286  void RemoveVectorVariables();
287 
289 
295  vtkSetMacro(ReplaceInvalidValues,int);
296  vtkGetMacro(ReplaceInvalidValues,int);
297  vtkBooleanMacro(ReplaceInvalidValues,int);
298  vtkSetMacro(ReplacementValue,double);
299  vtkGetMacro(ReplacementValue,double);
301 
305  void CheckExpression(int &pos, char **error);
306 
310  void InvalidateFunction();
311 
312 protected:
314  ~vtkFunctionParser() VTK_OVERRIDE;
315 
316  int Parse();
317 
321  bool Evaluate();
322 
323  int CheckSyntax();
324 
325  void CopyParseError(int &position, char **error);
326 
327  void RemoveSpaces();
328  char* RemoveSpacesFrom(const char* variableName);
329  int OperatorWithinVariable(int idx);
330 
331  int BuildInternalFunctionStructure();
332  void BuildInternalSubstringStructure(int beginIndex, int endIndex);
333  void AddInternalByte(unsigned char newByte);
334 
335  int IsSubstringCompletelyEnclosed(int beginIndex, int endIndex);
336  int FindEndOfMathFunction(int beginIndex);
337  int FindEndOfMathConstant(int beginIndex);
338 
339  int IsVariableName(int currentIndex);
340  int IsElementaryOperator(int op);
341 
342  int GetMathFunctionNumber(int currentIndex);
343  int GetMathFunctionNumberByCheckingParenthesis( int currentIndex );
344  int GetMathFunctionStringLength(int mathFunctionNumber);
345  int GetMathConstantNumber(int currentIndex);
346  int GetMathConstantStringLength(int mathConstantNumber);
347  unsigned char GetElementaryOperatorNumber(char op);
348  unsigned char GetOperandNumber(int currentIndex);
349  int GetVariableNameLength(int variableNumber);
350 
351  int DisambiguateOperators();
352 
357  void UpdateNeededVariables();
358 
359  vtkSetStringMacro(ParseError);
360 
361  int FindPositionInOriginalFunction(const int& pos);
362 
363  char* Function;
365 
367  std::vector<std::string> ScalarVariableNames;
368  std::vector<std::string> VectorVariableNames;
369  std::vector<double> ScalarVariableValues;
370  std::vector<vtkTuple<double, 3> > VectorVariableValues;
371  std::vector<bool> ScalarVariableNeeded;
372  std::vector<bool> VectorVariableNeeded;
373 
374  unsigned char *ByteCode;
376  double *Immediates;
378  double *Stack;
381 
387 
390 
392  char* ParseError;
393 
394 private:
395  vtkFunctionParser(const vtkFunctionParser&) VTK_DELETE_FUNCTION;
396  void operator=(const vtkFunctionParser&) VTK_DELETE_FUNCTION;
397 };
398 
399 #endif
vtkTimeStamp VariableMTime
void SetVectorVariableValue(int i, const double values[3])
Set the value of a vector variable.
abstract base class for most VTK objects
Definition: vtkObject.h:53
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkTimeStamp CheckMTime
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:300
record modification and/or execution time
Definition: vtkTimeStamp.h:32
std::vector< double > ScalarVariableValues
void SetVectorVariableValue(const char *variableName, const double values[3])
Set the value of a vector variable.
vtkTimeStamp FunctionMTime
Parse and evaluate a mathematical expression.
a simple class to control print indentation
Definition: vtkIndent.h:33
void GetVectorVariableValue(const char *variableName, double value[3])
Get the value of a vector variable.
std::vector< vtkTuple< double, 3 > > VectorVariableValues
virtual vtkMTimeType GetMTime()
Return this object&#39;s modified time.
std::vector< bool > VectorVariableNeeded
vtkGetStringMacro(ExtensionsString)
Returns a string listing all available extensions.
std::vector< std::string > VectorVariableNames
std::vector< std::string > ScalarVariableNames
vtkSetMacro(IgnoreDriverBugs, bool)
When set known driver bugs are ignored during driver feature detection.
vtkTimeStamp EvaluateMTime
vtkTimeStamp ParseMTime
void GetVectorVariableValue(int i, double value[3])
Get the value of a vector variable.
vtkBooleanMacro(IgnoreDriverBugs, bool)
When set known driver bugs are ignored during driver feature detection.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
std::vector< bool > ScalarVariableNeeded
unsigned char * ByteCode
int GetNumberOfScalarVariables()
Get the number of scalar variables.
int GetNumberOfVectorVariables()
Get the number of vector variables.