]> Creatis software - bbtk.git/blobdiff - kernel/appli/bbfy/bbfy.cpp
*** empty log message ***
[bbtk.git] / kernel / appli / bbfy / bbfy.cpp
index 8123db20035a61d81195550b62097b2039284ad6..347babc2b89afcf162727fc8b7eeff4cd77c41a5 100644 (file)
@@ -3,7 +3,7 @@
 #endif
 
 #include <stdio.h>
-#include "xmlParser.h"
+#include "bbtkXML.h"
 #include <iostream>
 #include <fstream>
 #include <sstream>
@@ -20,8 +20,8 @@ public:
 //==========================================================================
 
 const std::string itkImageToImageFilterString = "ITK_ImageToImageFilter";
-const std::string vtkImageAlgorithmString = "VTK_ImageAlgorithm";
-const std::string vtkPolyDataAlgorithmString = "VTK_PolyDataAlgorithm";
+const std::string vtkImageAlgorithmString     = "VTK_ImageAlgorithm";
+const std::string vtkPolyDataAlgorithmString  = "VTK_PolyDataAlgorithm";
 
 //==========================================================================
 class bbfy
@@ -77,6 +77,7 @@ private:
   std::string mTemplateImplementation;
 
   std::vector<std::string> mInclude;
+  std::vector<std::string> mTypedef;
 
   std::string mUserConstructor;
   std::string mUserCopyConstructor;
@@ -86,6 +87,7 @@ private:
   {
     std::string name;
     std::string type;
+    std::string nature;
     std::string descr;
     std::string special;
     std::string generic_type;
@@ -139,27 +141,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()
@@ -207,7 +188,7 @@ void bbfy::ParseXML()
            {
              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;
@@ -222,7 +203,7 @@ void bbfy::ParseXML()
                                  +vtkImageAlgorithmString
                                  +"' but no <vtkparent> tag found (mandatory)");
            }
-         GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
+         bbtk::GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
          // 
        }
     else if (bbtype == vtkPolyDataAlgorithmString )
@@ -235,7 +216,7 @@ void bbfy::ParseXML()
                                  +vtkPolyDataAlgorithmString
                                  +"' but no <vtkparent> tag found (mandatory)");
            }
-         GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
+         bbtk::GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
          // 
        }
      else 
@@ -269,7 +250,7 @@ void bbfy::ParseXML()
   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;
     }
 
@@ -277,7 +258,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;
     }
   
@@ -285,30 +266,32 @@ 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
   if (BB.nChildNode("namespace"))
     {
-      GetTextOrClear(BB.getChildNode("namespace"),mNamespace);
+      bbtk::GetTextOrClear(BB.getChildNode("namespace"),mNamespace);
     }
 
   // UserConstructor body
   if (BB.nChildNode("constructor"))
     {
-      GetTextOrClear(BB.getChildNode("constructor"),mUserConstructor);
+      bbtk::GetTextOrClear(BB.getChildNode("constructor"),mUserConstructor);
     }
+    
   // UserCopyConstructor body
   if (BB.nChildNode("copyconstructor"))
     {
-      GetTextOrClear(BB.getChildNode("copyconstructor"),mUserCopyConstructor);
+      bbtk::GetTextOrClear(BB.getChildNode("copyconstructor"),mUserCopyConstructor);
     }
+    
   // UserDestructor body
   if (BB.nChildNode("destructor"))
     {
-      GetTextOrClear(BB.getChildNode("destructor"),mUserDestructor);
+      bbtk::GetTextOrClear(BB.getChildNode("destructor"),mUserDestructor);
     }
  
     // Template parameters
@@ -323,7 +306,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;
@@ -332,7 +315,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;
@@ -344,9 +327,16 @@ 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);
     }
+  // Typedef
+  for (i=0,j=0; i<BB.nChildNode("typedef"); i++) 
+    {
+      std::string val;
+      bbtk::GetTextOrClear(BB.getChildNode("typedef",&j),val);
+      mTypedef.push_back(val);
+    }
   
   // Inputs
   for (i=0,j=0; i<BB.nChildNode("input"); i++) 
@@ -374,6 +364,11 @@ void bbfy::ParseXML()
          io.special =  n.getAttribute("special");  
        }
 
+      if (n.isAttributeSet("nature")) 
+       {
+         io.nature =  n.getAttribute("nature");  
+       }
+
       if (n.isAttributeSet("generic_type")) 
        {
          io.generic_type =  n.getAttribute("generic_type");  
@@ -408,6 +403,11 @@ void bbfy::ParseXML()
          io.special =  n.getAttribute("special");  
        }
 
+      if (n.isAttributeSet("nature")) 
+       {
+         io.nature =  n.getAttribute("nature");  
+       }
+
       if (n.isAttributeSet("generic_type")) 
        {
          io.generic_type =  n.getAttribute("generic_type");  
@@ -421,13 +421,14 @@ 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);
      }
 }
 //==========================================================================
@@ -485,7 +486,7 @@ void bbfy::CreateHeader()
   mFile << "#define " << included <<"\n";
 
   // Includes 
-  //  mFile << "#include \"bbtkAtomicBlackBox.h\"\n";
+  mFile << "#include \"bb" << mPackage << "_EXPORT.h\"\n";
   std::vector<std::string>::iterator i;
   for (i=mInclude.begin(); i!=mInclude.end(); ++i) 
     {
@@ -494,6 +495,15 @@ void bbfy::CreateHeader()
   if (mGeneric) mFile << "#include \"bbitkImage.h\"\n";
   mFile << "\n";
 
+  if (mType == itkImageToImageFilter )
+    {
+      mFile << "#include \"bbtkItkBlackBoxMacros.h\"\n";
+    }
+  else if ( (mType == vtkImageAlgorithm) ||
+           (mType == vtkPolyDataAlgorithm) )
+    {
+      mFile << "#include \"bbtkVtkBlackBoxMacros.h\"\n";
+    }
   // Namespace
   BeginNamespace();
 
@@ -506,9 +516,8 @@ void bbfy::CreateHeader()
     }
   
   // Class declaration and parents
-  mFile << "class /*BBTK_EXPORT*/ "<<mName<<"\n";
+  mFile << "class bb"<<mPackage<<"_EXPORT "<<mName<<"\n";
   mFile << " : \n";
-  mFile << "   public "<<mParentBlackBox;
 
   /*
   if (mBB.nChildNode("inherits"))
@@ -528,37 +537,50 @@ void bbfy::CreateHeader()
 
   if (mType == itkImageToImageFilter )
     {
-      mFile << ",\n   public " << mItkParent <<"\n";
+      mFile << "   public " << mItkParent <<",\n";
     }
   else if ( (mType == vtkImageAlgorithm) ||
            (mType == vtkPolyDataAlgorithm) )
     {
-      mFile << ",\n   public " << mVtkParent <<"\n";
-    }
-  else 
-    {
-      mFile << "\n";
+      mFile << "   public " << mVtkParent <<",\n";
     }
 
+  mFile << "   public "<<mParentBlackBox << "\n";
+
   mFile << "{\n";
 
   // Interface
-  mFile << "  BBTK_USER_BLACK_BOX_INTERFACE("
-       << mName << ","
-       << mParentBlackBox << ");\n";
 
-  // typedef on itkfilter
+  // ITK 
   if (mType == itkImageToImageFilter)
     {
-      mFile << "  typedef " <<mItkParent <<" itkParent;"<<std::endl;
-      mFile << "  void bbDelete() { itkParent::UnRegister(); }"<<std::endl;
+      mFile << "  BBTK_ITK_BLACK_BOX_INTERFACE("
+           << mName << ","
+           << mParentBlackBox << ","
+           << mItkParent 
+           << ");\n";
     }
-  // typedef on itkfilter
-  if ( (mType == vtkImageAlgorithm) ||
+  // VTK
+  else if ( (mType == vtkImageAlgorithm) ||
        (mType == vtkPolyDataAlgorithm) )
     {
-      mFile << "  typedef " <<mVtkParent <<" vtkParent;"<<std::endl;
-      mFile << "  void bbDelete() { vtkParent::Delete(); }"<<std::endl;
+      mFile << "  BBTK_VTK_BLACK_BOX_INTERFACE("
+           << mName << ","
+           << mParentBlackBox << ","
+           << mVtkParent 
+           << ");\n";
+    }
+  // Default
+  else 
+    {
+      mFile << "  BBTK_BLACK_BOX_INTERFACE("
+           << mName << ","
+           << mParentBlackBox << ");\n";
+    }
+
+  for (i=mTypedef.begin(); i!=mTypedef.end(); ++i) 
+    {
+      mFile << *i <<"\n";
     }
 
   // Declare user constructor / copy cons /destr 
@@ -567,7 +589,7 @@ void bbfy::CreateHeader()
 
   mFile << "virtual void bbUserConstructor();"<<std::endl;
   mFile << "/// User callback called in the box copy constructor"<<std::endl;
-  mFile << "virtual void bbUserCopyConstructor();"<<std::endl;
+  mFile << "virtual void bbUserCopyConstructor(bbtk::BlackBox::Pointer);"<<std::endl;
   mFile << "/// User callback called in the box destructor"<<std::endl;
   mFile << "virtual void bbUserDestructor();"<<std::endl;
   mFile << "//=================================================================="<<std::endl; 
@@ -589,7 +611,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="itk input")
        {
          mFile << "  BBTK_DECLARE_ITK_INPUT(" 
-               << "itkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -599,7 +620,6 @@ void bbfy::CreateHeader()
        {
          if (mType == vtkImageAlgorithm) {
          mFile << "  BBTK_DECLARE_VTK_IMAGE_ALGORITHM_INPUT(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -607,7 +627,6 @@ void bbfy::CreateHeader()
          } 
          else if (mType == vtkPolyDataAlgorithm) {
          mFile << "  BBTK_DECLARE_POLY_DATA_ALGORITHM_INPUT(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -617,7 +636,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="itk parameter")
        {
          mFile << "  BBTK_DECLARE_ITK_PARAM(" 
-               << "itkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -626,7 +644,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="vtk parameter")
        {
          mFile << "  BBTK_DECLARE_VTK_PARAM(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -657,7 +674,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="itk output")
        {
          mFile << "  BBTK_DECLARE_ITK_OUTPUT(" 
-               << "itkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -666,7 +682,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="vtk output")
        {
          mFile << "  BBTK_DECLARE_VTK_OUTPUT(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -683,37 +698,34 @@ 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)
     {   
-      mFile << "  BBTK_PROCESS(itkParent::Update);\n" ;
+      mFile << "  BBTK_ITK_PROCESS();\n" ;
     }
   else if ((mType == vtkImageAlgorithm) ||
           (mType == vtkPolyDataAlgorithm) )
 
     {   
-      mFile << "  BBTK_PROCESS(vtkParent::Update);\n" ;
+      mFile << "  BBTK_VTK_PROCESS();\n" ;
     }
 
   // CreateWidget
   if (mIsWidget) 
     {
-       mFile << "  BBTK_CREATE_WIDGET(DoCreateWidget);\n" ;
-       mFile << "  void DoCreateWidget();\n";
+       mFile << "  BBTK_CREATE_WIDGET(CreateWidget);\n" ;
+       mFile << "  void CreateWidget(wxWindow*);\n";
     }
 
 
   // EO black box declaration
   mFile << "};\n\n";
 
-
-
   // BO black box description
   if (mTemplateParam.size()==0)
     {
@@ -746,6 +758,11 @@ void bbfy::CreateHeader()
   
   // Category
   mFile << "BBTK_CATEGORY(\""<<mCategory<< "\");\n"; 
+
+  for (i=mTypedef.begin(); i!=mTypedef.end(); ++i) 
+    {
+      mFile << *i <<"\n";
+    }
   
   // Inputs
   for (ioi=mInput.begin(); ioi!=mInput.end(); ++ioi) 
@@ -759,7 +776,8 @@ void bbfy::CreateHeader()
          mFile << "BBTK_INPUT(";
        } 
       mFile << mName << "," << ioi->name << ",\""
-           << ioi->descr << "\"," <<  ioi->type <<");\n";
+           << ioi->descr << "\"," <<  ioi->type << ",\"" 
+           << ioi->nature<<"\");\n";
     }
   
   // Outputs
@@ -774,7 +792,8 @@ void bbfy::CreateHeader()
          mFile << "BBTK_OUTPUT(";
        } 
       mFile << mName << "," << ioi->name << ",\""
-           << ioi->descr << "\"," <<  ioi->type <<");\n";
+           << ioi->descr << "\"," <<  ioi->type << ",\"" 
+           << ioi->nature<<"\");\n";
     }
   
   // EO black box description
@@ -837,7 +856,7 @@ void bbfy::WriteGenericITKFilterHeader()
   mFile << "{\n";
 
   // Interface
-  mFile << "  BBTK_USER_BLACK_BOX_INTERFACE("
+  mFile << "  BBTK_BLACK_BOX_INTERFACE("
        << mName << "Generic,bbtk::AtomicBlackBox);\n";
 
   // Inputs
@@ -982,14 +1001,14 @@ void bbfy::CreateCode()
   if (mTemplateParam.size()>0) 
     {
       // Implementation
-      mFile << "BBTK_USER_BLACK_BOX_TEMPLATE_IMPLEMENTATION("
+      mFile << "BBTK_BLACK_BOX_TEMPLATE_IMPLEMENTATION("
            << mName << ","  
            << mParentBlackBox << ");\n";
      
       if (mGeneric) 
        {       
          // Implementation
-         mFile << "BBTK_USER_BLACK_BOX_IMPLEMENTATION("
+         mFile << "BBTK_BLACK_BOX_IMPLEMENTATION("
                << mName << "Generic,bbtk::AtomicBlackBox);\n";
          // Package
          mFile << "BBTK_ADD_BLACK_BOX_TO_PACKAGE("
@@ -1006,34 +1025,35 @@ void bbfy::CreateCode()
            << mName << ")\n";
 
       // Implementation
-      mFile << "BBTK_USER_BLACK_BOX_IMPLEMENTATION("
+      mFile << "BBTK_BLACK_BOX_IMPLEMENTATION("
            << mName << ","  
            << mParentBlackBox << ");\n"; 
     }
   // 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(wxWindow* parent)\n{\n";
       mFile << mCreateWidget << "\n";
       mFile << "}\n";
     }
-  
 
   // User constr / copy constr / destr implementation
   mFile <<"void "<<mName<<"::bbUserConstructor()"<<std::endl;
   mFile << "{"<<std::endl;
   //mFile<<"bbtkDebugMessage(\"Kernel\",9,\""<<mName<<::bbUserConstructor()"<<std::endl);"<<std::endl;
+  
   mFile << mUserConstructor << std::endl;
   mFile << "}" << std::endl;
 
-  mFile <<"void "<<mName<<"::bbUserCopyConstructor()"<<std::endl;
+  mFile <<"void "<<mName<<"::bbUserCopyConstructor(bbtk::BlackBox::Pointer)"
+       <<std::endl;
   mFile << "{"<<std::endl;
   //mFile<<"bbtkDebugMessage(\"Kernel\",9,\""<<mName<<::bbUserCopyConstructor()"<<std::endl);"<<std::endl;
   mFile << mUserCopyConstructor << std::endl;