]> Creatis software - bbtk.git/blobdiff - kernel/appli/bbfy/bbfy.cpp
*** empty log message ***
[bbtk.git] / kernel / appli / bbfy / bbfy.cpp
index 64120471d5fa2883012204fa218108a190ee9356..dce426a908dcd6538865332f9e9f692a85630a94 100644 (file)
@@ -3,7 +3,7 @@
 #endif
 
 #include <stdio.h>
-#include "xmlParser.h"
+#include "bbtkXML.h"
 #include <iostream>
 #include <fstream>
 #include <sstream>
@@ -19,6 +19,10 @@ public:
 };
 //==========================================================================
 
+const std::string itkImageToImageFilterString = "ITK_ImageToImageFilter";
+const std::string vtkImageAlgorithmString = "VTK_ImageAlgorithm";
+const std::string vtkPolyDataAlgorithmString = "VTK_PolyDataAlgorithm";
+
 //==========================================================================
 class bbfy
 {
@@ -54,6 +58,7 @@ private:
       vtkPolyDataAlgorithm,
     }
     BoxType;
+
   BoxType mType;
   bool mIsWidget;
   std::string mParentBlackBox;
@@ -81,7 +86,7 @@ private:
   {
     std::string name;
     std::string type;
-    std::string help;
+    std::string descr;
     std::string special;
     std::string generic_type;
   }
@@ -109,6 +114,8 @@ bbfy::bbfy(const std::string& filename,
           const std::string& output_path,
           bool verbose)
 {
+  mIsWidget = false;
+  
   mFilename = filename;
   mPackage = package;
   mNamespace = "bb" + mPackage;
@@ -132,27 +139,6 @@ void bbfy::CreateBlackBox()
 //==========================================================================
 
 
-//==========================================================================
-void GetTextOrClear(const XMLNode& node, std::string& var) 
-{
-  if (node.nText()>0) 
-    {
-      var = node.getText();
-    }
-  else if (node.nClear()>0) 
-    {
-      var = node.getClear().lpszValue;
-    }
-  else 
-    {
-      std::string mess("Error : element <");
-      mess += node.getName();
-      mess += "> : no text nor <PRE></PRE> clear tag found";
-      throw bbfyException(mess);
-    }
-}
-//==========================================================================
-
 
 //==========================================================================
 void bbfy::ParseXML()
@@ -173,7 +159,7 @@ void bbfy::ParseXML()
   // Name
   if (!BB.isAttributeSet("name")) 
     {
-      throw bbfyException("Error : no 'name' attribute found (mandatory)");
+      throw bbfyException("Error : <blackbox> tag : no 'name' attribute found (mandatory)");
     }
   mName = BB.getAttribute("name");
 
@@ -192,35 +178,53 @@ void bbfy::ParseXML()
          mGeneric = false;
          mType = STD;
        }
-      else if (bbtype=="itkImageToImageFilter")
+      else if (bbtype==itkImageToImageFilterString)
        {
          mType = itkImageToImageFilter;
          // Looks for <itkparent> tag
          if (!BB.nChildNode("itkparent")) 
            {
-             throw bbfyException("Error : blackbox type 'itkImageToImageFilter' but no <itkparent> tag found (mandatory)");
+             throw bbfyException("Error : blackbox type '"+itkImageToImageFilterString+"' but no <itkparent> tag found (mandatory)");
            }
-         GetTextOrClear(BB.getChildNode("itkparent"),mItkParent);
+         bbtk::GetTextOrClear(BB.getChildNode("itkparent"),mItkParent);
          // 
          mGeneric = false;
          if (BB.isAttributeSet("generic")) mGeneric=true;
        }
-      else if ((bbtype=="vtkImageAlgorithm") || (bbtype=="vtkPolyDataAlgorithm"))
+      else if (bbtype == vtkImageAlgorithmString)
        {
          mType = vtkImageAlgorithm;
          // Looks for <vtkparent> tag
          if (!BB.nChildNode("vtkparent")) 
            {
-             throw bbfyException("Error : blackbox type 'vtkImageAlgorithm' but no <vtkparent> tag found (mandatory)");
+             throw bbfyException("Error : blackbox type '"
+                                 +vtkImageAlgorithmString
+                                 +"' but no <vtkparent> tag found (mandatory)");
            }
-         GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
+         bbtk::GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
          // 
        }
-      else 
+    else if (bbtype == vtkPolyDataAlgorithmString )
+       {
+         mType = vtkPolyDataAlgorithm;
+         // Looks for <vtkparent> tag
+         if (!BB.nChildNode("vtkparent")) 
+           {
+             throw bbfyException("Error : blackbox type '"
+                                 +vtkPolyDataAlgorithmString
+                                 +"' but no <vtkparent> tag found (mandatory)");
+           }
+         bbtk::GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
+         // 
+       }
+     else 
        {
          std::string mess("Error : blackbox type '");
          mess += bbtype;
-         mess += "' unknown (types are 'standard','itkfilter')";
+         mess += "' unknown. Known types :";
+         mess += "'" + itkImageToImageFilterString + "' ";
+         mess += "'" + vtkImageAlgorithmString + "' ";
+         mess += "'" + vtkPolyDataAlgorithmString + "' ";
          throw bbfyException(mess);
        }
     }
@@ -239,28 +243,12 @@ void bbfy::ParseXML()
       mInclude.push_back("bbtkAtomicBlackBox.h");
     }
 
-  /*
-  // Parent black box
-  if (!BB.nChildNode("parentblackbox")) 
-    {
-      throw bbfyException("Error : no <parentblackbox> tag found (mandatory)");
-   }
-  GetTextOrClear(BB.getChildNode("parentblackbox"),mParentBlackBox);
-
-  // Package
-  if (!BB.nChildNode("package")) 
-    {
-      throw bbfyException("Error : no <package> tag found (mandatory)");
-   }
-  GetTextOrClear(BB.getChildNode("package"),mPackage);
-  */
-
   // Author
   int i,j;
   for (i=0,j=0; i<BB.nChildNode("author"); i++) 
     {
       std::string val;
-      GetTextOrClear(BB.getChildNode("author",&j),val);
+      bbtk::GetTextOrClear(BB.getChildNode("author",&j),val);
       mAuthor += val;
     }
 
@@ -268,7 +256,7 @@ void bbfy::ParseXML()
   for (i=0,j=0; i<BB.nChildNode("description"); i++) 
     {
       std::string val;
-      GetTextOrClear(BB.getChildNode("description",&j),val);
+      bbtk::GetTextOrClear(BB.getChildNode("description",&j),val);
       mDescription += val;
     }
   
@@ -276,34 +264,30 @@ void bbfy::ParseXML()
   for (i=0,j=0; i<BB.nChildNode("category"); i++) 
     {
       std::string val;
-      GetTextOrClear(BB.getChildNode("category",&j),val);
+      bbtk::GetTextOrClear(BB.getChildNode("category",&j),val);
       mCategory += val;
     }
 
   // Namespace
-  /*
-  mIsInNamespace = false;
   if (BB.nChildNode("namespace"))
     {
-      mIsInNamespace = true;
-      GetTextOrClear(BB.getChildNode("namespace"),mNamespace);
+      bbtk::GetTextOrClear(BB.getChildNode("namespace"),mNamespace);
     }
-  */
 
   // UserConstructor body
-  if (BB.nChildNode("constructor"))
+  if (BB.nChildNode("userconstructor"))
     {
-      GetTextOrClear(BB.getChildNode("constructor"),mUserConstructor);
+      bbtk::GetTextOrClear(BB.getChildNode("userconstructor"),mUserConstructor);
     }
   // UserCopyConstructor body
-  if (BB.nChildNode("copyconstructor"))
+  if (BB.nChildNode("usercopyconstructor"))
     {
-      GetTextOrClear(BB.getChildNode("copyconstructor"),mUserCopyConstructor);
+      bbtk::GetTextOrClear(BB.getChildNode("usercopyconstructor"),mUserCopyConstructor);
     }
   // UserDestructor body
-  if (BB.nChildNode("destructor"))
+  if (BB.nChildNode("userdestructor"))
     {
-      GetTextOrClear(BB.getChildNode("destructor"),mUserDestructor);
+      bbtk::GetTextOrClear(BB.getChildNode("userdestructor"),mUserDestructor);
     }
  
     // Template parameters
@@ -318,7 +302,7 @@ void bbfy::ParseXML()
        {
          mTemplateDeclaration += "class ";
          std::string val;
-         GetTextOrClear(BB.getChildNode("template",&j),val);
+         bbtk::GetTextOrClear(BB.getChildNode("template",&j),val);
          mTemplateDeclaration += val;
          mTemplateDeclaration +=  ",";
          mTemplateImplementation += val;
@@ -327,7 +311,7 @@ void bbfy::ParseXML()
        }
       mTemplateDeclaration += "class ";
       std::string val;
-      GetTextOrClear(BB.getChildNode("template",&j),val);
+      bbtk::GetTextOrClear(BB.getChildNode("template",&j),val);
       mTemplateDeclaration += val;
       mTemplateDeclaration +=  ">";
       mTemplateImplementation += val;
@@ -339,27 +323,30 @@ void bbfy::ParseXML()
   for (i=0,j=0; i<BB.nChildNode("include"); i++) 
     {
       std::string val;
-      GetTextOrClear(BB.getChildNode("include",&j),val);
+      bbtk::GetTextOrClear(BB.getChildNode("include",&j),val);
       mInclude.push_back(val);
     }
   
   // Inputs
   for (i=0,j=0; i<BB.nChildNode("input"); i++) 
     {
+      IO io;
       XMLNode n = BB.getChildNode("input",&j); 
       if (!n.isAttributeSet("name"))
        {
          throw bbfyException("Error : <input> attribute 'name' not found (mandatory)");
        }
+      io.name = n.getAttribute("name");
       if (!n.isAttributeSet("type"))
        {
-         throw bbfyException("Error : <input> attribute 'type' not found (mandatory)");
+         throw bbfyException("Error : <input name=\""+io.name+"\"> attribute 'type' not found (mandatory)");
        }
-
-      IO io;
-      io.name = n.getAttribute("name");
       io.type = n.getAttribute("type"); 
-      GetTextOrClear(n,io.help);
+      if (!n.isAttributeSet("description"))
+       {
+         throw bbfyException("Error : <input name=\""+io.name+"\"> attribute 'description' not found (mandatory)");
+       }
+      io.descr = n.getAttribute("description"); 
 
       if (n.isAttributeSet("special")) 
        {
@@ -377,20 +364,23 @@ void bbfy::ParseXML()
   // Outputs
   for (i=0,j=0; i<BB.nChildNode("output"); i++) 
     {
+      IO io;
       XMLNode n = BB.getChildNode("output",&j); 
       if (!n.isAttributeSet("name"))
        {
          throw bbfyException("Error : <output> attribute 'name' not found (mandatory)");
        }
+      io.name = n.getAttribute("name"); 
       if (!n.isAttributeSet("type"))
        {
-         throw bbfyException("Error : <output> attribute 'type' not found (mandatory)");
+         throw bbfyException("Error : <output name=\""+io.name+"\"> attribute 'type' not found (mandatory)");
        }
-
-      IO io;
-      io.name = n.getAttribute("name"); 
       io.type = n.getAttribute("type"); 
-      GetTextOrClear(n,io.help);
+      if (!n.isAttributeSet("description"))
+       {
+         throw bbfyException("Error : <output name=\""+io.name+"\"> attribute 'description' not found (mandatory)");
+       }
+      io.descr = n.getAttribute("description"); 
 
       if (n.isAttributeSet("special")) 
        {
@@ -410,13 +400,13 @@ void bbfy::ParseXML()
   // process tag given ?
    if (BB.nChildNode("process"))
      {
-       GetTextOrClear(BB.getChildNode("process"),mProcess);
+       bbtk::GetTextOrClear(BB.getChildNode("process"),mProcess);
      }
   // CreateWidget
   // createwidget tag given ?
    if (BB.nChildNode("createwidget"))
      {
-       GetTextOrClear(BB.getChildNode("createwidget"),mCreateWidget);
+       bbtk::GetTextOrClear(BB.getChildNode("createwidget"),mCreateWidget);
      }
 }
 //==========================================================================
@@ -462,7 +452,10 @@ void bbfy::CreateHeader()
     }
   
   // If is widget 
-  mFile << "#ifdef _USE_WXWIDGETS_\n";
+  if (mIsWidget)
+    {
+      mFile << "#ifdef _USE_WXWIDGETS_\n";
+    }
 
   // Prevent multiple inclusions
   std::string included("__bb");
@@ -673,8 +666,8 @@ void bbfy::CreateHeader()
   // Process
   if ((mType == STD)||(mProcess.size()))
     {
-      mFile << "  BBTK_PROCESS(DoProcess);\n" ;
-      mFile << "  void DoProcess();\n";
+      mFile << "  BBTK_PROCESS(Process);\n" ;
+      mFile << "  void Process();\n";
     }
   else if (mType == itkImageToImageFilter)
     {   
@@ -690,8 +683,8 @@ void bbfy::CreateHeader()
   // CreateWidget
   if (mIsWidget) 
     {
-       mFile << "  BBTK_CREATE_WIDGET(DoCreateWidget);\n" ;
-       mFile << "  void DoCreateWidget();\n";
+       mFile << "  BBTK_CREATE_WIDGET(CreateWidget);\n" ;
+       mFile << "  void CreateWidget();\n";
     }
 
 
@@ -745,7 +738,7 @@ void bbfy::CreateHeader()
          mFile << "BBTK_INPUT(";
        } 
       mFile << mName << "," << ioi->name << ",\""
-           << ioi->help << "\"," <<  ioi->type <<");\n";
+           << ioi->descr << "\"," <<  ioi->type <<");\n";
     }
   
   // Outputs
@@ -760,7 +753,7 @@ void bbfy::CreateHeader()
          mFile << "BBTK_OUTPUT(";
        } 
       mFile << mName << "," << ioi->name << ",\""
-           << ioi->help << "\"," <<  ioi->type <<");\n";
+           << ioi->descr << "\"," <<  ioi->type <<");\n";
     }
   
   // EO black box description
@@ -795,7 +788,10 @@ void bbfy::CreateHeader()
   // Prevent multiple inclusions
   mFile << "#endif // " << included <<"\n";
   // If is widget 
-  mFile << "#endif // _USE_WXWIDGETS_\n";
+  if (mIsWidget)
+    {
+      mFile << "#endif // _USE_WXWIDGETS_\n";
+    }
 
   // EOF
   mFile << "\n";
@@ -870,7 +866,7 @@ void bbfy::WriteGenericITKFilterHeader()
     {
       mFile << "BBTK_INPUT(";
       mFile << mName << "Generic," << ioi->name << ",\""
-           << ioi->help << "\"," <<  ioi->generic_type <<");\n";
+           << ioi->descr << "\"," <<  ioi->generic_type <<");\n";
     }
   
   // Outputs
@@ -878,7 +874,7 @@ void bbfy::WriteGenericITKFilterHeader()
     {
       mFile << "BBTK_OUTPUT(";
       mFile << mName << "Generic," << ioi->name << ",\""
-           << ioi->help << "\"," <<  ioi->generic_type <<");\n";
+           << ioi->descr << "\"," <<  ioi->generic_type <<");\n";
     }
   
   // EO black box description
@@ -996,14 +992,14 @@ void bbfy::CreateCode()
   // Process
   if ((mType == STD)||(mProcess.size()))
     {
-      mFile << "void "<<mName<<"::DoProcess()\n{\n";
+      mFile << "void "<<mName<<"::Process()\n{\n";
       mFile << mProcess << "\n";
       mFile << "}\n";
     }
   // CreateWidget
   if (mIsWidget)
     {
-      mFile << "void "<<mName<<"::DoCreateWidget()\n{\n";
+      mFile << "void "<<mName<<"::CreateWidget()\n{\n";
       mFile << mCreateWidget << "\n";
       mFile << "}\n";
     }
@@ -1067,7 +1063,8 @@ int main(int argc, char **argv)
     }
   catch (bbfyException e)
     {
-      std::cerr << e.mMessage << std::endl;
+      std::cerr << argv[0] << "  " << argv[1] << std::endl
+               << e.mMessage << std::endl;
       return 1;
     }
   return 0;