[Paraview] Possible bug in vtkFunctionParser?

OSHIMA Takuya oshima at eng.niigata-u.ac.jp
Sat Mar 22 01:41:17 EDT 2008


Hi,

I have a dataset which contains an array with the name say "A/B,"
which in turn contains a character that may be interpreted as a
mathematical operator '/'. If I try to run Filter->Calculator and to
evaluate an expression "A/B + A/B" over the dataset, I can't get the
expected result (an array with all components doubled).

I'm not sure this should be called as a bug since the array name is
itself confusing, but anyway what I found out was that finding the
first occurrence of the array name within the given expression is not
enough in vtkFunctionParser::OperatorWithinVariable(). I think at
least the array name should be searched until the location of idx even
if there was an occurrence prior to the location.

Here I attach a patch that worked for me. I know this is far from
perfect as a fix (there are still many possible cases that can't be
properly detected). Please take it just as a clarification of a
solution that worked for me.

Regards,
Takuya

--- vtkFunctionParser.cxx.orig	2007-12-22 03:55:56.000000000 +0900
+++ vtkFunctionParser.cxx	2008-03-22 12:26:51.320000000 +0900
@@ -1342,14 +1342,21 @@
     {
     if (strchr(this->ScalarVariableNames[i], this->Function[idx]) != 0)
       {
-      tmpString = strstr(this->Function, this->ScalarVariableNames[i]);
-      if (tmpString)
+      for(end = 0; end <= idx;)
         {
-        start = static_cast<int>(tmpString - this->Function);
-        end = start + strlen(this->ScalarVariableNames[i]);
-        if (start <= idx && end >= idx)
+        tmpString = strstr(this->Function + end, this->ScalarVariableNames[i]);
+        if (tmpString)
           {
-          return 1;
+          start = static_cast<int>(tmpString - this->Function);
+          end = start + strlen(this->ScalarVariableNames[i]);
+          if (start <= idx && end > idx)
+            {
+            return 1;
+            }
+          }
+        else
+          {
+          break;
           }
         }
       }
@@ -1358,14 +1365,21 @@
     {
     if (strchr(this->VectorVariableNames[i], this->Function[idx]) != 0)
       {
-      tmpString = strstr(this->Function, this->VectorVariableNames[i]);
-      if (tmpString)
+      for(end = 0; end <= idx;)
         {
-        start = static_cast<int>(tmpString - this->Function);
-        end = start + strlen(this->VectorVariableNames[i]);
-        if (start <= idx && end >= idx)
+        tmpString = strstr(this->Function + end, this->VectorVariableNames[i]);
+        if (tmpString)
+          {
+          start = static_cast<int>(tmpString - this->Function);
+          end = start + strlen(this->VectorVariableNames[i]);
+          if (start <= idx && end > idx)
+            {
+            return 1;
+            }
+          }
+        else
           {
-          return 1;
+          break;
           }
         }
       }


More information about the ParaView mailing list