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;
364  char* FunctionWithSpaces;
365 
366  int FunctionLength;
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;
375  int ByteCodeSize;
376  double *Immediates;
377  int ImmediatesSize;
378  double *Stack;
379  int StackSize;
380  int StackPointer;
381 
382  vtkTimeStamp FunctionMTime;
383  vtkTimeStamp ParseMTime;
384  vtkTimeStamp VariableMTime;
385  vtkTimeStamp EvaluateMTime;
386  vtkTimeStamp CheckMTime;
387 
388  int ReplaceInvalidValues;
389  double ReplacementValue;
390 
391  int ParseErrorPositon;
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
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.
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:300
record modification and/or execution time
Definition: vtkTimeStamp.h:32
void SetVectorVariableValue(const char *variableName, const double values[3])
Set the value of a vector variable.
templated base type for containers of constant size.
Definition: vtkTuple.h:35
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.
virtual vtkMTimeType GetMTime()
Return this object&#39;s modified time.
vtkGetStringMacro(ExtensionsString)
Returns a string listing all available extensions.
vtkSetMacro(IgnoreDriverBugs, bool)
When set known driver bugs are ignored during driver feature detection.
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...
int GetNumberOfScalarVariables()
Get the number of scalar variables.
int GetNumberOfVectorVariables()
Get the number of vector variables.