]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
implementation of substitutions
authorasl <asl@opencascade.com>
Tue, 24 Nov 2009 10:12:57 +0000 (10:12 +0000)
committerasl <asl@opencascade.com>
Tue, 24 Nov 2009 10:12:57 +0000 (10:12 +0000)
src/Notebook/SALOME_EvalExpr.cxx
src/Notebook/SALOME_EvalExpr.hxx
src/Notebook/SALOME_EvalParser.cxx
src/Notebook/SALOME_EvalParser.hxx

index 148144552f6bb288117531fa7618f9f91ba5cec5..e52fd085781415942fef8dae35ef8a14e5ce3b16 100755 (executable)
@@ -165,6 +165,7 @@ bool SALOME_EvalExpr::autoDeleteOperationSets() const
 {
   return myParser->autoDeleteOperationSets();
 }
+
 //=======================================================================
 //function : setAutoDeleteOperationSets
 //purpose  : 
@@ -173,3 +174,13 @@ void SALOME_EvalExpr::setAutoDeleteOperationSets(const bool on)
 {
   myParser->setAutoDeleteOperationSets( on );
 }
+
+//=======================================================================
+//function : substitute
+//purpose  : 
+//=======================================================================
+void SALOME_EvalExpr::substitute( const SALOME_String& theParamName, const SALOME_EvalExpr& theExpr )
+{
+  myParser->substitute( theParamName, theExpr.parser() );
+  myExpr = myParser->rebuildExpression();
+}
index 09254c66f2436c4d58c8db7e9ebb01019d85d0d5..28c4c0d02c5a2797976688f547812b4449434966 100755 (executable)
@@ -34,7 +34,7 @@
 class SALOME_EvalExpr
 {
 public:
-  SALOME_EvalExpr(const SALOME_String& = SALOME_String());
+  SALOME_EvalExpr( const SALOME_String& = SALOME_String() );
   SALOME_EvalExpr( const bool, const SALOME_String& = SALOME_String() );
   ~SALOME_EvalExpr();
 
@@ -54,6 +54,8 @@ public:
   void                 removeOperationSet( SALOME_EvalSet* );
   void                 insertOperationSet( SALOME_EvalSet*, const int = -1 );
 
+  void                 substitute( const SALOME_String& theParamName, const SALOME_EvalExpr& theExpr );
+
 private:
   void initialize( const bool, const SALOME_String& );
 
index 2b20e7e71516ba4ee4900ba9b52758021082d1c5..f5fb86b06ed500d293410367a8615426da260c21 100755 (executable)
@@ -868,6 +868,128 @@ bool SALOME_EvalParser::isMonoParam() const
   return myError == EvalExpr_OK && myPostfix.size()==1 && myPostfix.begin()->myType == Param;
 }
 
+//=======================================================================
+//function : substitute
+//purpose  :
+//=======================================================================
+void SALOME_EvalParser::substitute( const SALOME_String& theParamName, 
+                                    SALOME_EvalParser* theNewExpr )
+{
+  Postfix::iterator it = myPostfix.begin(), last = myPostfix.end();
+  for( ; it!=last; it++ )
+  {
+    //printf( "ELEM: %s\n", it->myValue.toString().c_str() );
+    if( it->myType == Param && it->myValue.toString() == theParamName )
+    {
+      Postfix::iterator removed = it; it++;
+      myPostfix.erase( removed );
+      //printf( "REMOVE:\n" );
+      Postfix::iterator nit = theNewExpr->myPostfix.begin(), nlast = theNewExpr->myPostfix.end();
+      for( ; nit!=nlast; nit++ )
+      {
+        myPostfix.insert( it, *nit );
+        //printf( "INSERT: %s\n", nit->myValue.toString().c_str() );
+      }
+      it--;
+    }
+  }
+}
+
+
+//=======================================================================
+//class    : RebultExprItem
+//purpose  : Reconstruction of expression by postfix form
+//=======================================================================
+class RebultExprItem
+{
+public:
+  RebultExprItem( const SALOME_EvalParser* theParser, const SALOME_String& theExpr = "" )
+    : myExpr( theExpr ), myParser( theParser )
+  {
+  }
+
+  int priority() const
+  {
+    return myOp.length() > 0 ? myParser->priority( myOp, myOpBin ) : 100000;
+  }
+
+  RebultExprItem concat( const SALOME_String& theOp, const RebultExprItem& theItem, bool theIsBin ) const
+  {
+    int pleft = priority(), pright = theItem.priority(),
+      pOp = myParser->priority( theOp, theIsBin );
+
+    //printf( "concat: '%s' (%i) and '%s' (%i) with op = %s (%i)\n",
+    //        myExpr.c_str(), pleft, theItem.myExpr.c_str(), pright,
+    //        theOp.c_str(), pOp );
+
+    SALOME_String aNewExpr = expression( pleft<pOp );
+    aNewExpr += theOp;
+    aNewExpr += theItem.expression( pright<pOp );
+    RebultExprItem aRes( myParser );
+    aRes.myExpr = aNewExpr;
+    aRes.myOp = theOp;
+    aRes.myOpBin = theIsBin;
+    return aRes;
+  }
+
+  SALOME_String expression( bool theIsAddBrackets ) const
+  {
+    if( theIsAddBrackets )
+      return "(" + myExpr + ")";
+    else
+      return myExpr;
+  }
+
+private:
+  const SALOME_EvalParser* myParser;
+  SALOME_String myExpr, myOp;
+  bool myOpBin;
+};
+
+//=======================================================================
+//function : rebuildExpression
+//purpose  :
+//=======================================================================
+SALOME_String SALOME_EvalParser::rebuildExpression() const
+{
+  std::stack<RebultExprItem> aStack;
+
+  Postfix::const_iterator it = myPostfix.begin(), last = myPostfix.end();
+  RebultExprItem anItem1( this ), anItem2( this );
+  for( ; it!=last; it++ )
+  {
+    SALOME_String aValue = it->myValue.toString();
+    switch( it->myType )
+    {
+    case Value:
+    case Param:
+      aStack.push( RebultExprItem( this, aValue ) );
+      break;
+
+    case Pre:
+      anItem1 = aStack.top(); aStack.pop();
+      anItem2 = RebultExprItem( this ).concat( aValue, anItem1, false );
+      aStack.push( anItem2 );
+      break;
+
+    case Post:
+      anItem1 = aStack.top(); aStack.pop();
+      anItem2 = anItem1.concat( aValue, RebultExprItem( this ), false );
+      aStack.push( anItem2 );
+      break;
+
+    case Binary:
+      anItem2 = aStack.top(); aStack.pop();
+      anItem1 = aStack.top(); aStack.pop();
+      anItem2 = anItem1.concat( aValue, anItem2, true );
+      aStack.push( anItem2 );
+      break;
+    }
+  }
+
+  return aStack.top().expression( false );
+}
+
 //=======================================================================
 //function : dump
 //purpose  :
index 9764ad02d19988df97022c397c783de66c9a4680..cbc8768bb916a65bf4071da2d4160aad60640323 100755 (executable)
@@ -72,6 +72,11 @@ public:
 
   bool isMonoParam() const;
 
+  void substitute( const SALOME_String& theParamName, 
+                   SALOME_EvalParser* theNewExpr );
+
+  SALOME_String rebuildExpression() const;
+
 protected:
   //! Types of postfix representation elements
   typedef enum 
@@ -127,6 +132,8 @@ private:
   static void append( Postfix& aL, const Postfix& aL1 );
 
 private:
+  friend class RebultExprItem;
+
   SALOME_ListOfEvalSet  mySets;
   SALOME_EvalExprError  myError;
   ParamMap              myParams;