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 =========================================================================*/
49 #ifndef vtkFunctionParser_h
50 #define vtkFunctionParser_h
51 
52 #include "vtkCommonMiscModule.h" // For export macro
53 #include "vtkObject.h"
54 #include "vtkTuple.h" // needed for vtkTuple
55 #include <vector> // needed for vector
56 #include <string> // needed for string.
57 
58 #define VTK_PARSER_IMMEDIATE 1
59 #define VTK_PARSER_UNARY_MINUS 2
60 #define VTK_PARSER_UNARY_PLUS 3
61 
62 // supported math functions
63 #define VTK_PARSER_ADD 4
64 #define VTK_PARSER_SUBTRACT 5
65 #define VTK_PARSER_MULTIPLY 6
66 #define VTK_PARSER_DIVIDE 7
67 #define VTK_PARSER_POWER 8
68 #define VTK_PARSER_ABSOLUTE_VALUE 9
69 #define VTK_PARSER_EXPONENT 10
70 #define VTK_PARSER_CEILING 11
71 #define VTK_PARSER_FLOOR 12
72 #define VTK_PARSER_LOGARITHM 13
73 #define VTK_PARSER_LOGARITHME 14
74 #define VTK_PARSER_LOGARITHM10 15
75 #define VTK_PARSER_SQUARE_ROOT 16
76 #define VTK_PARSER_SINE 17
77 #define VTK_PARSER_COSINE 18
78 #define VTK_PARSER_TANGENT 19
79 #define VTK_PARSER_ARCSINE 20
80 #define VTK_PARSER_ARCCOSINE 21
81 #define VTK_PARSER_ARCTANGENT 22
82 #define VTK_PARSER_HYPERBOLIC_SINE 23
83 #define VTK_PARSER_HYPERBOLIC_COSINE 24
84 #define VTK_PARSER_HYPERBOLIC_TANGENT 25
85 #define VTK_PARSER_MIN 26
86 #define VTK_PARSER_MAX 27
87 #define VTK_PARSER_SIGN 29
88 
89 // functions involving vectors
90 #define VTK_PARSER_CROSS 28
91 #define VTK_PARSER_VECTOR_UNARY_MINUS 30
92 #define VTK_PARSER_VECTOR_UNARY_PLUS 31
93 #define VTK_PARSER_DOT_PRODUCT 32
94 #define VTK_PARSER_VECTOR_ADD 33
95 #define VTK_PARSER_VECTOR_SUBTRACT 34
96 #define VTK_PARSER_SCALAR_TIMES_VECTOR 35
97 #define VTK_PARSER_VECTOR_TIMES_SCALAR 36
98 #define VTK_PARSER_VECTOR_OVER_SCALAR 37
99 #define VTK_PARSER_MAGNITUDE 38
100 #define VTK_PARSER_NORMALIZE 39
101 
102 // constants involving vectors
103 #define VTK_PARSER_IHAT 40
104 #define VTK_PARSER_JHAT 41
105 #define VTK_PARSER_KHAT 42
106 
107 // code for if(bool, trueval, falseval) resulting in a scalar
108 #define VTK_PARSER_IF 43
109 
110 // code for if(bool, truevec, falsevec) resulting in a vector
111 #define VTK_PARSER_VECTOR_IF 44
112 
113 // codes for boolean expressions
114 #define VTK_PARSER_LESS_THAN 45
115 
116 // codes for boolean expressions
117 #define VTK_PARSER_GREATER_THAN 46
118 
119 // codes for boolean expressions
120 #define VTK_PARSER_EQUAL_TO 47
121 
122 // codes for boolean expressions
123 #define VTK_PARSER_AND 48
124 
125 // codes for boolean expressions
126 #define VTK_PARSER_OR 49
127 
128 // codes for scalar variables come before those for vectors. Do not define
129 // values for VTK_PARSER_BEGIN_VARIABLES+1, VTK_PARSER_BEGIN_VARIABLES+2, ...,
130 // because they are used to look up variables numbered 1, 2, ...
131 #define VTK_PARSER_BEGIN_VARIABLES 50
132 
133 // the value that is retuned as a result if there is an error
134 #define VTK_PARSER_ERROR_RESULT VTK_FLOAT_MAX
135 
136 class VTKCOMMONMISC_EXPORT vtkFunctionParser : public vtkObject
137 {
138 public:
139  static vtkFunctionParser *New();
140  vtkTypeMacro(vtkFunctionParser, vtkObject);
141  void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE;
142 
146  vtkMTimeType GetMTime() VTK_OVERRIDE;
147 
149 
152  void SetFunction(const char *function);
153  vtkGetStringMacro(Function);
155 
160  int IsScalarResult();
161 
166  int IsVectorResult();
167 
171  double GetScalarResult();
172 
174 
177  double* GetVectorResult();
178  void GetVectorResult(double result[3]) {
179  double *r = this->GetVectorResult();
180  result[0] = r[0]; result[1] = r[1]; result[2] = r[2]; };
182 
184 
190  void SetScalarVariableValue(const char* variableName, double value);
191  void SetScalarVariableValue(int i, double value);
193 
195 
198  double GetScalarVariableValue(const char* variableName);
199  double GetScalarVariableValue(int i);
201 
203 
209  void SetVectorVariableValue(const char* variableName, double xValue,
210  double yValue, double zValue);
211  void SetVectorVariableValue(const char* variableName,
212  const double values[3]) {
213  this->SetVectorVariableValue(variableName,values[0],values[1],values[2]);};
214  void SetVectorVariableValue(int i, double xValue, double yValue,
215  double zValue);
216  void SetVectorVariableValue(int i, const double values[3]) {
217  this->SetVectorVariableValue(i,values[0],values[1],values[2]);};
219 
221 
224  double* GetVectorVariableValue(const char* variableName);
225  void GetVectorVariableValue(const char* variableName, double value[3]) {
226  double *r = this->GetVectorVariableValue(variableName);
227  value[0] = r[0]; value[1] = r[1]; value[2] = r[2]; };
228  double* GetVectorVariableValue(int i);
229  void GetVectorVariableValue(int i, double value[3]) {
230  double *r = this->GetVectorVariableValue(i);
231  value[0] = r[0]; value[1] = r[1]; value[2] = r[2]; };
233 
238  { return static_cast<int>(this->ScalarVariableNames.size()); }
239 
244  { return static_cast<int>(this->VectorVariableNames.size()); }
245 
249  const char* GetScalarVariableName(int i);
250 
254  const char* GetVectorVariableName(int i);
255 
257 
262  bool GetScalarVariableNeeded(int i);
263  bool GetScalarVariableNeeded(const char* variableName);
265 
267 
272  bool GetVectorVariableNeeded(int i);
273  bool GetVectorVariableNeeded(const char* variableName);
275 
279  void RemoveAllVariables();
280 
284  void RemoveScalarVariables();
285 
289  void RemoveVectorVariables();
290 
292 
298  vtkSetMacro(ReplaceInvalidValues,int);
299  vtkGetMacro(ReplaceInvalidValues,int);
300  vtkBooleanMacro(ReplaceInvalidValues,int);
301  vtkSetMacro(ReplacementValue,double);
302  vtkGetMacro(ReplacementValue,double);
304 
308  void CheckExpression(int &pos, char **error);
309 
313  void InvalidateFunction();
314 
315 protected:
317  ~vtkFunctionParser() VTK_OVERRIDE;
318 
319  int Parse();
320 
324  bool Evaluate();
325 
326  int CheckSyntax();
327 
328  void CopyParseError(int &position, char **error);
329 
330  void RemoveSpaces();
331  char* RemoveSpacesFrom(const char* variableName);
332  int OperatorWithinVariable(int idx);
333 
334  int BuildInternalFunctionStructure();
335  void BuildInternalSubstringStructure(int beginIndex, int endIndex);
336  void AddInternalByte(unsigned char newByte);
337 
338  int IsSubstringCompletelyEnclosed(int beginIndex, int endIndex);
339  int FindEndOfMathFunction(int beginIndex);
340  int FindEndOfMathConstant(int beginIndex);
341 
342  int IsVariableName(int currentIndex);
343  int IsElementaryOperator(int op);
344 
345  int GetMathFunctionNumber(int currentIndex);
346  int GetMathFunctionNumberByCheckingParenthesis( int currentIndex );
347  int GetMathFunctionStringLength(int mathFunctionNumber);
348  int GetMathConstantNumber(int currentIndex);
349  int GetMathConstantStringLength(int mathConstantNumber);
350  unsigned char GetElementaryOperatorNumber(char op);
351  unsigned char GetOperandNumber(int currentIndex);
352  int GetVariableNameLength(int variableNumber);
353 
354  int DisambiguateOperators();
355 
360  void UpdateNeededVariables();
361 
362  vtkSetStringMacro(ParseError);
363 
364  int FindPositionInOriginalFunction(const int& pos);
365 
366  char* Function;
367  char* FunctionWithSpaces;
368 
369  int FunctionLength;
370  std::vector<std::string> ScalarVariableNames;
371  std::vector<std::string> VectorVariableNames;
372  std::vector<double> ScalarVariableValues;
373  std::vector<vtkTuple<double, 3> > VectorVariableValues;
374  std::vector<bool> ScalarVariableNeeded;
375  std::vector<bool> VectorVariableNeeded;
376 
377  unsigned char *ByteCode;
378  int ByteCodeSize;
379  double *Immediates;
380  int ImmediatesSize;
381  double *Stack;
382  int StackSize;
383  int StackPointer;
384 
385  vtkTimeStamp FunctionMTime;
386  vtkTimeStamp ParseMTime;
387  vtkTimeStamp VariableMTime;
388  vtkTimeStamp EvaluateMTime;
389  vtkTimeStamp CheckMTime;
390 
391  int ReplaceInvalidValues;
392  double ReplacementValue;
393 
394  int ParseErrorPositon;
395  char* ParseError;
396 
397 private:
398  vtkFunctionParser(const vtkFunctionParser&) VTK_DELETE_FUNCTION;
399  void operator=(const vtkFunctionParser&) VTK_DELETE_FUNCTION;
400 };
401 
402 #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:59
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
record modification and/or execution time
Definition: vtkTimeStamp.h:35
void SetVectorVariableValue(const char *variableName, const double values[3])
Set the value of a vector variable.
vtkTypeUInt64 vtkMTimeType
Definition: vtkType.h:248
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:39
void GetVectorVariableValue(const char *variableName, double value[3])
Get the value of a vector variable.
virtual vtkMTimeType GetMTime()
Return this object'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.