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
136class VTKCOMMONMISC_EXPORT vtkFunctionParser : public vtkObject
137{
138public:
141 void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE;
142
146 vtkMTimeType GetMTime() VTK_OVERRIDE;
147
149
152 void SetFunction(const char *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);
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]; };
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
263 bool GetScalarVariableNeeded(const char* variableName);
265
267
273 bool GetVectorVariableNeeded(const char* variableName);
275
280
285
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
314
315protected:
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
397private:
398 vtkFunctionParser(const vtkFunctionParser&) VTK_DELETE_FUNCTION;
399 void operator=(const vtkFunctionParser&) VTK_DELETE_FUNCTION;
400};
401
402#endif
Parse and evaluate a mathematical expression.
void SetScalarVariableValue(int i, double value)
~vtkFunctionParser() override
void SetVectorVariableValue(int i, const double values[3])
double * GetVectorVariableValue(int i)
static vtkFunctionParser * New()
int GetNumberOfVectorVariables()
Get the number of vector variables.
void RemoveVectorVariables()
Remove all the vector variables.
void GetVectorVariableValue(const char *variableName, double value[3])
int GetNumberOfScalarVariables()
Get the number of scalar variables.
void SetVectorVariableValue(const char *variableName, const double values[3])
const char * GetVectorVariableName(int i)
Get the ith vector variable name.
vtkMTimeType GetMTime() override
Return parser's MTime.
void GetVectorVariableValue(int i, double value[3])
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void SetVectorVariableValue(int i, double xValue, double yValue, double zValue)
const char * GetScalarVariableName(int i)
Get the ith scalar variable name.
double GetScalarVariableValue(const char *variableName)
Get the value of a scalar variable.
void CheckExpression(int &pos, char **error)
Check the validity of the function expression.
double GetScalarVariableValue(int i)
bool GetScalarVariableNeeded(const char *variableName)
bool GetScalarVariableNeeded(int i)
Returns whether a scalar variable is needed for the function evaluation.
double * GetVectorVariableValue(const char *variableName)
Get the value of a vector variable.
void RemoveScalarVariables()
Remove all the scalar variables.
bool GetVectorVariableNeeded(int i)
Returns whether a vector variable is needed for the function evaluation.
void RemoveAllVariables()
Remove all the current variables.
void InvalidateFunction()
Allow the user to force the function to be re-parsed.
bool GetVectorVariableNeeded(const char *variableName)
void SetVectorVariableValue(const char *variableName, double xValue, double yValue, double zValue)
Set the value of a vector variable.
void SetScalarVariableValue(const char *variableName, double value)
Set the value of a scalar variable.
a simple class to control print indentation
Definition: vtkIndent.h:40
abstract base class for most VTK objects
Definition: vtkObject.h:60
record modification and/or execution time
Definition: vtkTimeStamp.h:36
templated base type for containers of constant size.
Definition: vtkTuple.h:36
@ vector
Definition: vtkX3D.h:237
@ function
Definition: vtkX3D.h:249
@ value
Definition: vtkX3D.h:220
@ position
Definition: vtkX3D.h:261
vtkSetMacro(IgnoreDriverBugs, bool)
Updates the extensions string.
vtkBooleanMacro(IgnoreDriverBugs, bool)
Updates the extensions string.
vtkGetStringMacro(ExtensionsString)
Returns a string listing all available extensions.
vtkTypeUInt64 vtkMTimeType
Definition: vtkType.h:248