From 6d71ac3aba500787dc247d6060b893758e2e1da9 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Mon, 2 Dec 2013 18:12:10 +0100
Subject: [PATCH] Cleanup in ISampleVisitor, new global function
 VisitSampleTree

---
 App/src/TestMiscellaneous.cpp                 |  17 +-
 Core/PythonAPI/src/FormFactorSphere.pypp.cpp  |  24 ++
 .../FormFactorSphereGaussianRadius.pypp.cpp   |  24 ++
 Core/PythonAPI/src/IFormFactor.pypp.cpp       |  24 ++
 Core/PythonAPI/src/IFormFactorBorn.pypp.cpp   |  24 ++
 .../src/IFormFactorDecorator.pypp.cpp         |  24 ++
 .../src/IInterferenceFunction.pypp.cpp        |  24 ++
 Core/PythonAPI/src/ISample.pypp.cpp           |  24 ++
 ...InterferenceFunction1DParaCrystal.pypp.cpp |  24 ++
 .../InterferenceFunction2DLattice.pypp.cpp    |  24 ++
 ...InterferenceFunction2DParaCrystal.pypp.cpp |  24 ++
 .../src/InterferenceFunctionNone.pypp.cpp     |  24 ++
 Core/PythonAPI/src/LayerRoughness.pypp.cpp    |  24 ++
 Core/Samples/inc/ISample.h                    |   2 +-
 Core/Samples/inc/ISampleHierarchicalVisitor.h | 191 ---------
 Core/Samples/inc/ISampleVisitor.h             | 244 +++++++----
 Core/Samples/src/ISample.cpp                  |   3 +-
 .../src/ISampleHierarchicalVisitor.cpp        | 292 -------------
 Core/Samples/src/ISampleVisitor.cpp           | 373 +++++++++++++++++
 Core/Tools/inc/SampleMaterialVisitor.h        | 102 +++--
 Core/Tools/inc/SamplePrintVisitor.h           | 132 +++---
 Core/Tools/src/SampleMaterialVisitor.cpp      | 392 ++++++++++++------
 Core/Tools/src/SamplePrintVisitor.cpp         | 365 +++++++++++++++-
 23 files changed, 1608 insertions(+), 793 deletions(-)
 delete mode 100644 Core/Samples/inc/ISampleHierarchicalVisitor.h
 delete mode 100644 Core/Samples/src/ISampleHierarchicalVisitor.cpp
 create mode 100644 Core/Samples/src/ISampleVisitor.cpp

diff --git a/App/src/TestMiscellaneous.cpp b/App/src/TestMiscellaneous.cpp
index 051fd6b5340..1ee9a8fd993 100644
--- a/App/src/TestMiscellaneous.cpp
+++ b/App/src/TestMiscellaneous.cpp
@@ -13,8 +13,6 @@
 //
 // ************************************************************************** //
 
-#include "ISampleHierarchicalVisitor.h"
-
 #include "TestMiscellaneous.h"
 #include "SampleFactory.h"
 #include "OutputData.h"
@@ -53,8 +51,8 @@ TestMiscellaneous::TestMiscellaneous()
 
 void TestMiscellaneous::execute()
 {
-    test_HierarchicalVisitor();
-    //test_PrintVisitor();
+    //test_HierarchicalVisitor();
+    test_PrintVisitor();
     //test_LogSystem();
     //test_OutputDataTo2DArray();
     //test_KVectorContainer();
@@ -72,13 +70,7 @@ void TestMiscellaneous::execute()
 /* ************************************************************************* */
 void TestMiscellaneous::test_HierarchicalVisitor()
 {
-    std::cout << "TestMiscellaneous::test_PrintVisitor() ->" << std::endl;
-    SampleBuilderFactory factory;
-    ISample *sample = factory.createSample("isgisaxs04_2DDL");
-    //std::cout << (*sample) << std::endl;
 
-    SamplePrintVisitor visitor;
-    sample->accept(&visitor);
 }
 
 
@@ -91,9 +83,10 @@ void TestMiscellaneous::test_PrintVisitor()
     SampleBuilderFactory factory;
     ISample *sample = factory.createSample("isgisaxs04_2DDL");
     //std::cout << (*sample) << std::endl;
+    sample->printSampleTree();
 
-    SamplePrintVisitor visitor;
-    sample->accept(&visitor);
+    //SamplePrintVisitor visitor;
+    //sample->accept(&visitor);
 }
 
 
diff --git a/Core/PythonAPI/src/FormFactorSphere.pypp.cpp b/Core/PythonAPI/src/FormFactorSphere.pypp.cpp
index b2b8893a00b..d41eaa292be 100644
--- a/Core/PythonAPI/src/FormFactorSphere.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorSphere.pypp.cpp
@@ -133,6 +133,18 @@ struct FormFactorSphere_wrapper : FormFactorSphere, bp::wrapper< FormFactorSpher
         return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f_bin), alpha_f_bin );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -372,6 +384,18 @@ void register_FormFactorSphere_class(){
                 , default_evaluate_function_type(&FormFactorSphere_wrapper::default_evaluate)
                 , ( bp::arg("k_i"), bp::arg("k_f_bin"), bp::arg("alpha_f_bin") ) );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( FormFactorSphere_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            FormFactorSphere_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&FormFactorSphere_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/FormFactorSphereGaussianRadius.pypp.cpp b/Core/PythonAPI/src/FormFactorSphereGaussianRadius.pypp.cpp
index e3edc65106a..6ab25a9af69 100644
--- a/Core/PythonAPI/src/FormFactorSphereGaussianRadius.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorSphereGaussianRadius.pypp.cpp
@@ -157,6 +157,18 @@ struct FormFactorSphereGaussianRadius_wrapper : FormFactorSphereGaussianRadius,
         return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f_bin), alpha_f_bin );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -407,6 +419,18 @@ void register_FormFactorSphereGaussianRadius_class(){
                 , default_evaluate_function_type(&FormFactorSphereGaussianRadius_wrapper::default_evaluate)
                 , ( bp::arg("k_i"), bp::arg("k_f_bin"), bp::arg("alpha_f_bin") ) );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( FormFactorSphereGaussianRadius_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            FormFactorSphereGaussianRadius_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&FormFactorSphereGaussianRadius_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/IFormFactor.pypp.cpp b/Core/PythonAPI/src/IFormFactor.pypp.cpp
index 47eb2f5e967..df761af3a1b 100644
--- a/Core/PythonAPI/src/IFormFactor.pypp.cpp
+++ b/Core/PythonAPI/src/IFormFactor.pypp.cpp
@@ -155,6 +155,18 @@ struct IFormFactor_wrapper : IFormFactor, bp::wrapper< IFormFactor > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -387,6 +399,18 @@ void register_IFormFactor_class(){
                 , default_createParameterTree_function_type(&IFormFactor_wrapper::default_createParameterTree)
                 , bp::return_value_policy< bp::manage_new_object >() );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( IFormFactor_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            IFormFactor_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&IFormFactor_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/IFormFactorBorn.pypp.cpp b/Core/PythonAPI/src/IFormFactorBorn.pypp.cpp
index fc3c5fce9ad..5fed4b7e730 100644
--- a/Core/PythonAPI/src/IFormFactorBorn.pypp.cpp
+++ b/Core/PythonAPI/src/IFormFactorBorn.pypp.cpp
@@ -119,6 +119,18 @@ struct IFormFactorBorn_wrapper : IFormFactorBorn, bp::wrapper< IFormFactorBorn >
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -367,6 +379,18 @@ void register_IFormFactorBorn_class(){
                 , default_createParameterTree_function_type(&IFormFactorBorn_wrapper::default_createParameterTree)
                 , bp::return_value_policy< bp::manage_new_object >() );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( IFormFactorBorn_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            IFormFactorBorn_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&IFormFactorBorn_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/IFormFactorDecorator.pypp.cpp b/Core/PythonAPI/src/IFormFactorDecorator.pypp.cpp
index 29b0fd2305d..d246cd2dfe7 100644
--- a/Core/PythonAPI/src/IFormFactorDecorator.pypp.cpp
+++ b/Core/PythonAPI/src/IFormFactorDecorator.pypp.cpp
@@ -124,6 +124,18 @@ struct IFormFactorDecorator_wrapper : IFormFactorDecorator, bp::wrapper< IFormFa
         return func_evaluate( boost::ref(k_i), boost::ref(k_f_bin), alpha_f_bin );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -358,6 +370,18 @@ void register_IFormFactorDecorator_class(){
                 , bp::pure_virtual( evaluate_function_type(&::IFormFactor::evaluate) )
                 , ( bp::arg("k_i"), bp::arg("k_f_bin"), bp::arg("alpha_f_bin") ) );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( IFormFactorDecorator_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            IFormFactorDecorator_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&IFormFactorDecorator_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/IInterferenceFunction.pypp.cpp b/Core/PythonAPI/src/IInterferenceFunction.pypp.cpp
index 629e437f138..ba56255a3be 100644
--- a/Core/PythonAPI/src/IInterferenceFunction.pypp.cpp
+++ b/Core/PythonAPI/src/IInterferenceFunction.pypp.cpp
@@ -95,6 +95,18 @@ struct IInterferenceFunction_wrapper : IInterferenceFunction, bp::wrapper< IInte
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -270,6 +282,18 @@ void register_IInterferenceFunction_class(){
                 , default_createParameterTree_function_type(&IInterferenceFunction_wrapper::default_createParameterTree)
                 , bp::return_value_policy< bp::manage_new_object >() );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( IInterferenceFunction_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            IInterferenceFunction_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&IInterferenceFunction_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/ISample.pypp.cpp b/Core/PythonAPI/src/ISample.pypp.cpp
index d6893b23933..97e4c9ca72e 100644
--- a/Core/PythonAPI/src/ISample.pypp.cpp
+++ b/Core/PythonAPI/src/ISample.pypp.cpp
@@ -54,6 +54,18 @@ struct ISample_wrapper : ISample, bp::wrapper< ISample > {
         return ISample::cloneInvertB( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -231,6 +243,18 @@ void register_ISample_class(){
                 "containsMagneticMaterial"
                 , containsMagneticMaterial_function_type( &::ISample::containsMagneticMaterial ) );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( ISample_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            ISample_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&ISample_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/InterferenceFunction1DParaCrystal.pypp.cpp b/Core/PythonAPI/src/InterferenceFunction1DParaCrystal.pypp.cpp
index 6db34fb10b2..ebd2821b1e3 100644
--- a/Core/PythonAPI/src/InterferenceFunction1DParaCrystal.pypp.cpp
+++ b/Core/PythonAPI/src/InterferenceFunction1DParaCrystal.pypp.cpp
@@ -109,6 +109,18 @@ struct InterferenceFunction1DParaCrystal_wrapper : InterferenceFunction1DParaCry
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -308,6 +320,18 @@ void register_InterferenceFunction1DParaCrystal_class(){
                 , default_createParameterTree_function_type(&InterferenceFunction1DParaCrystal_wrapper::default_createParameterTree)
                 , bp::return_value_policy< bp::manage_new_object >() );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( InterferenceFunction1DParaCrystal_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            InterferenceFunction1DParaCrystal_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&InterferenceFunction1DParaCrystal_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/InterferenceFunction2DLattice.pypp.cpp b/Core/PythonAPI/src/InterferenceFunction2DLattice.pypp.cpp
index bb22c253926..04f87d097da 100644
--- a/Core/PythonAPI/src/InterferenceFunction2DLattice.pypp.cpp
+++ b/Core/PythonAPI/src/InterferenceFunction2DLattice.pypp.cpp
@@ -97,6 +97,18 @@ struct InterferenceFunction2DLattice_wrapper : InterferenceFunction2DLattice, bp
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -287,6 +299,18 @@ void register_InterferenceFunction2DLattice_class(){
                 , default_createParameterTree_function_type(&InterferenceFunction2DLattice_wrapper::default_createParameterTree)
                 , bp::return_value_policy< bp::manage_new_object >() );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( InterferenceFunction2DLattice_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            InterferenceFunction2DLattice_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&InterferenceFunction2DLattice_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/InterferenceFunction2DParaCrystal.pypp.cpp b/Core/PythonAPI/src/InterferenceFunction2DParaCrystal.pypp.cpp
index 00e15bd8f14..1d4cd0a4efd 100644
--- a/Core/PythonAPI/src/InterferenceFunction2DParaCrystal.pypp.cpp
+++ b/Core/PythonAPI/src/InterferenceFunction2DParaCrystal.pypp.cpp
@@ -97,6 +97,18 @@ struct InterferenceFunction2DParaCrystal_wrapper : InterferenceFunction2DParaCry
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -329,6 +341,18 @@ void register_InterferenceFunction2DParaCrystal_class(){
                 , default_createParameterTree_function_type(&InterferenceFunction2DParaCrystal_wrapper::default_createParameterTree)
                 , bp::return_value_policy< bp::manage_new_object >() );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( InterferenceFunction2DParaCrystal_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            InterferenceFunction2DParaCrystal_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&InterferenceFunction2DParaCrystal_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/InterferenceFunctionNone.pypp.cpp b/Core/PythonAPI/src/InterferenceFunctionNone.pypp.cpp
index eca6fc43a2f..eb15298f104 100644
--- a/Core/PythonAPI/src/InterferenceFunctionNone.pypp.cpp
+++ b/Core/PythonAPI/src/InterferenceFunctionNone.pypp.cpp
@@ -97,6 +97,18 @@ struct InterferenceFunctionNone_wrapper : InterferenceFunctionNone, bp::wrapper<
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -277,6 +289,18 @@ void register_InterferenceFunctionNone_class(){
                 , default_createParameterTree_function_type(&InterferenceFunctionNone_wrapper::default_createParameterTree)
                 , bp::return_value_policy< bp::manage_new_object >() );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( InterferenceFunctionNone_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            InterferenceFunctionNone_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&InterferenceFunctionNone_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/PythonAPI/src/LayerRoughness.pypp.cpp b/Core/PythonAPI/src/LayerRoughness.pypp.cpp
index b0d3ae5398c..7449d6966b7 100644
--- a/Core/PythonAPI/src/LayerRoughness.pypp.cpp
+++ b/Core/PythonAPI/src/LayerRoughness.pypp.cpp
@@ -92,6 +92,18 @@ struct LayerRoughness_wrapper : LayerRoughness, bp::wrapper< LayerRoughness > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else
+            return this->ISample::getCompositeSample(  );
+    }
+    
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ISample::getCompositeSample( );
+    }
+
     virtual ::ICompositeSample const * getCompositeSample(  ) const  {
         if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
             return func_getCompositeSample(  );
@@ -326,6 +338,18 @@ void register_LayerRoughness_class(){
                 , default_createParameterTree_function_type(&LayerRoughness_wrapper::default_createParameterTree)
                 , bp::return_value_policy< bp::manage_new_object >() );
         
+        }
+        { //::ISample::getCompositeSample
+        
+            typedef ::ICompositeSample * ( ::ISample::*getCompositeSample_function_type )(  ) ;
+            typedef ::ICompositeSample * ( LayerRoughness_wrapper::*default_getCompositeSample_function_type )(  ) ;
+            
+            LayerRoughness_exposer.def( 
+                "getCompositeSample"
+                , getCompositeSample_function_type(&::ISample::getCompositeSample)
+                , default_getCompositeSample_function_type(&LayerRoughness_wrapper::default_getCompositeSample)
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
         }
         { //::ISample::getCompositeSample
         
diff --git a/Core/Samples/inc/ISample.h b/Core/Samples/inc/ISample.h
index 2c6be217469..3d05172729d 100644
--- a/Core/Samples/inc/ISample.h
+++ b/Core/Samples/inc/ISample.h
@@ -19,7 +19,6 @@
 #include "IParameterized.h"
 #include "ICloneable.h"
 #include "ISampleVisitor.h"
-#include "ISampleHierarchicalVisitor.h"
 
 class ICompositeSample;
 class DWBASimulation;
@@ -33,6 +32,7 @@ public:
     virtual ~ISample() {}
 
     //! Returns pointer to "this", if it is composite sample (to overload).
+    virtual ICompositeSample *getCompositeSample() { return 0; }
     virtual const ICompositeSample *getCompositeSample() const { return 0; }
 
     virtual ISample *clone() const;
diff --git a/Core/Samples/inc/ISampleHierarchicalVisitor.h b/Core/Samples/inc/ISampleHierarchicalVisitor.h
deleted file mode 100644
index 852a34c4113..00000000000
--- a/Core/Samples/inc/ISampleHierarchicalVisitor.h
+++ /dev/null
@@ -1,191 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Samples/inc/ISampleHierarchicalVisitor.h
-//! @brief     Defines interface class ISampleHierarchicalVisitor.
-//!
-//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2013
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-#ifndef ISAMPLEHIERARCHICALVISITOR_H
-#define ISAMPLEHIERARCHICALVISITOR_H
-
-#include "Exceptions.h"
-
-class ISample;
-// - the order according to the hierarchy as reported by IDE
-class ICompositeSample;
-// -
-class IClusteredParticles;
-class Crystal;
-// -
-class IDecoration;
-class ParticleDecoration;
-// -
-class Layer;
-// -
-class LayerInterface;
-// -
-class MultiLayer;
-// -
-class Particle;
-class LatticeBasis;
-class MesoCrystal;
-class ParticleCoreShell;
-// -
-class ParticleInfo;
-class DiffuseParticleInfo;
-class PositionParticleInfo;
-// -
-class IFormFactor;
-// -
-class FormFactorDWBAPol;
-class FormFactorDWBAPolConstZ;
-// -
-class FormFactorWeighted;
-// -
-class IFormFactorBorn;
-// -
-class FormFactorBox;
-class FormFactorCone;
-class FormFactorCrystal;
-class FormFactorCylinder;
-class FormFactorEllipsoid;
-class FormFactorFullSphere;
-class FormFactorFullSpheroid;
-class FormFactorGauss;
-class FormFactorHemiSpheroid;
-class FormFactorLorentz;
-class FormFactorParallelepiped;
-class FormFactorPrism3;
-class FormFactorPrism6;
-class FormFactorPyramid;
-class FormFactorSphere;
-class FormFactorSphereGaussianRadius;
-class FormFactorTetrahedron;
-class IFormFactorBornSeparable;
-// -
-class IFormFactorDecorator;
-// -
-class FormFactorDWBA;
-class FormFactorDWBAConstZ;
-class FormFactorDecoratorDebyeWaller;
-class FormFactorDecoratorFactor;
-class FormFactorDecoratorMaterial;
-class FormFactorDecoratorMultiPositionFactor;
-class FormFactorDecoratorPositionFactor;
-class FormFactorDecoratorTransformation;
-// -
-class IInterferenceFunction;
-class InterferenceFunction1DParaCrystal;
-class InterferenceFunction2DLattice;
-class InterferenceFunction2DParaCrystal;
-class InterferenceFunctionNone;
-// -
-class IRoughness;
-class LayerRoughness;
-
-
-class BA_CORE_API_ ISampleHierarchicalVisitor
-{
-public:
-    ISampleHierarchicalVisitor() : m_nlevel(0) {}
-    virtual ~ISampleHierarchicalVisitor(){}
-
-    // visiting methods (the order according to the hierarchy as reported by IDE)
-
-    virtual bool visit(const ISample *);
-
-    virtual bool visit(const ICompositeSample *);
-
-    virtual bool visit(const IClusteredParticles *);
-    virtual bool visit(const Crystal *);
-
-    virtual bool visit(const IDecoration *);
-    virtual bool visit(const ParticleDecoration *);
-
-    virtual bool visit(const Layer *);
-
-    virtual bool visit(const LayerInterface *);
-
-    virtual bool visit(const MultiLayer *);
-
-    virtual bool visit(const Particle *);
-    virtual bool visit(const LatticeBasis *);
-    virtual bool visit(const MesoCrystal *);
-    virtual bool visit(const ParticleCoreShell *);
-
-    virtual bool visit(const ParticleInfo *);
-    virtual bool visit(const DiffuseParticleInfo *);
-    virtual bool visit(const PositionParticleInfo *);
-
-    virtual bool visit(const IFormFactor *);
-
-    virtual bool visit(const FormFactorDWBAPol *);
-    virtual bool visit(const FormFactorDWBAPolConstZ *);
-
-    virtual bool visit(const FormFactorWeighted *);
-
-    virtual bool visit(const IFormFactorBorn *);
-
-    virtual bool visit(const FormFactorBox *);
-    virtual bool visit(const FormFactorCone *);
-    virtual bool visit(const FormFactorCrystal *);
-    virtual bool visit(const FormFactorCylinder *);
-    virtual bool visit(const FormFactorEllipsoid *);
-    virtual bool visit(const FormFactorFullSphere *);
-    virtual bool visit(const FormFactorFullSpheroid *);
-    virtual bool visit(const FormFactorGauss *);
-    virtual bool visit(const FormFactorHemiSpheroid *);
-    virtual bool visit(const FormFactorLorentz *);
-    virtual bool visit(const FormFactorParallelepiped *);
-    virtual bool visit(const FormFactorPrism3 *);
-    virtual bool visit(const FormFactorPrism6 *);
-    virtual bool visit(const FormFactorPyramid *);
-    virtual bool visit(const FormFactorSphere *);
-    virtual bool visit(const FormFactorSphereGaussianRadius *);
-    virtual bool visit(const FormFactorTetrahedron *);
-    virtual bool visit(const IFormFactorBornSeparable *);
-
-    virtual bool visit(const IFormFactorDecorator *);
-
-    virtual bool visit(const FormFactorDWBA *);
-    virtual bool visit(const FormFactorDWBAConstZ *);
-    virtual bool visit(const FormFactorDecoratorDebyeWaller *);
-    virtual bool visit(const FormFactorDecoratorFactor *);
-    virtual bool visit(const FormFactorDecoratorMaterial *);
-    virtual bool visit(const FormFactorDecoratorMultiPositionFactor *);
-    virtual bool visit(const FormFactorDecoratorPositionFactor *);
-    virtual bool visit(const FormFactorDecoratorTransformation *);
-
-    virtual bool visit(const IInterferenceFunction *);
-    virtual bool visit(const InterferenceFunction1DParaCrystal *);
-    virtual bool visit(const InterferenceFunction2DLattice *);
-    virtual bool visit(const InterferenceFunction2DParaCrystal *);
-    virtual bool visit(const InterferenceFunctionNone *);
-
-    virtual bool visit(const IRoughness *);
-    virtual bool visit(const LayerRoughness *);
-
-
-    // enter and leave methods
-    bool visitEnter(const ICompositeSample *);
-    bool visitLeave(const ICompositeSample *);
-
-    //! return current level of the visitor
-    int getLevel() const { return m_nlevel; }
-
-protected:
-    int m_nlevel;
-};
-
-
-
-#endif // ISAMPLEHIERARCHICALVISITOR_H
-
diff --git a/Core/Samples/inc/ISampleVisitor.h b/Core/Samples/inc/ISampleVisitor.h
index 16aa7dac7a9..18c96c6ed33 100644
--- a/Core/Samples/inc/ISampleVisitor.h
+++ b/Core/Samples/inc/ISampleVisitor.h
@@ -19,111 +19,177 @@
 #include "Exceptions.h"
 
 class ISample;
-class MultiLayer;
+// - the order according to the hierarchy as reported by IDE
+class ICompositeSample;
+// -
+class IClusteredParticles;
+class Crystal;
+// -
+class IDecoration;
+class ParticleDecoration;
+// -
 class Layer;
+// -
 class LayerInterface;
-class ParticleDecoration;
-class ParticleInfo;
+// -
+class MultiLayer;
+// -
 class Particle;
-class ParticleCoreShell;
-class MesoCrystal;
-class Crystal;
 class LatticeBasis;
-class IClusteredParticles;
+class MesoCrystal;
+class ParticleCoreShell;
+// -
+class ParticleInfo;
+class DiffuseParticleInfo;
+class PositionParticleInfo;
+// -
 class IFormFactor;
-class IInterferenceFunction;
-class FormFactorFullSphere;
-class FormFactorPyramid;
+// -
+class FormFactorDWBAPol;
+class FormFactorDWBAPolConstZ;
+// -
+class FormFactorWeighted;
+// -
+class IFormFactorBorn;
+// -
+class FormFactorBox;
+class FormFactorCone;
+class FormFactorCone6;
+class FormFactorCrystal;
 class FormFactorCylinder;
+class FormFactorEllipsoid;
+class FormFactorFullSphere;
+class FormFactorFullSpheroid;
+class FormFactorGauss;
+class FormFactorHemiSpheroid;
+class FormFactorLorentz;
+class FormFactorParallelepiped;
 class FormFactorPrism3;
+class FormFactorPrism6;
+class FormFactorPyramid;
+class FormFactorSphere;
+class FormFactorSphereGaussianRadius;
+class FormFactorTetrahedron;
+class IFormFactorBornSeparable;
+// -
+class IFormFactorDecorator;
+// -
+class FormFactorDWBA;
+class FormFactorDWBAConstZ;
+class FormFactorDecoratorDebyeWaller;
+class FormFactorDecoratorFactor;
+class FormFactorDecoratorMaterial;
+class FormFactorDecoratorMultiPositionFactor;
+class FormFactorDecoratorPositionFactor;
+class FormFactorDecoratorTransformation;
+// -
+class IInterferenceFunction;
 class InterferenceFunction1DParaCrystal;
-class InterferenceFunction2DParaCrystal;
 class InterferenceFunction2DLattice;
+class InterferenceFunction2DParaCrystal;
+class InterferenceFunctionNone;
+// -
+class IRoughness;
 class LayerRoughness;
 
 
-//! Interface to visit a sample tree and perform operations on its nodes
-
 class BA_CORE_API_ ISampleVisitor
 {
 public:
-    //! Destructor
-    virtual ~ISampleVisitor() {}
-
-    //! Performs specific action on the given sample
-    //! Needs to be overloaded for different ISample types
-
-    virtual void visit(const ISample *) { throw NotImplementedException(
-            "ISampleVisitor::visit(ISample *)"); }
-    virtual void visit(const MultiLayer *) { throw NotImplementedException(
-            "ISampleVisitor::visit(MultiLayer *)"); }
-    virtual void visit(const Layer *) { throw NotImplementedException(
-            "ISampleVisitor::visit(Layer *)"); }
-    virtual void visit(const LayerInterface *) { throw NotImplementedException(
-            "ISampleVisitor::visit(LayerInterface *)"); }
-    virtual void visit(const ParticleDecoration *) {
-        throw NotImplementedException(
-            "ISampleVisitor::visit(ParticleDecoration *)");
-    }
-    virtual void visit(const ParticleInfo *) { throw NotImplementedException(
-            "ISampleVisitor::visit(ParticleInfo *)"); }
-    virtual void visit(const Particle *) { throw NotImplementedException(
-            "ISampleVisitor::visit(Particle *)"); }
-    virtual void visit(const ParticleCoreShell *) {
-        throw NotImplementedException(
-            "ISampleVisitor::visit(ParticleCoreShell *)");
-    }
-    virtual void visit(const MesoCrystal *) { throw NotImplementedException(
-            "ISampleVisitor::visit(MesoCrystal *)"); }
-    virtual void visit(const Crystal *) {
-        throw NotImplementedException(
-            "ISampleVisitor::visit(Crystal *)"); }
-    virtual void visit(const LatticeBasis *) { throw NotImplementedException(
-            "ISampleVisitor::visit(LatticeBasis *)"); }
-    virtual void visit(const IFormFactor *) { throw NotImplementedException(
-            "ISampleVisitor::visit(IFormFactor *)"); }
-    virtual void visit(const FormFactorFullSphere *) {
-        throw NotImplementedException(
-            "ISampleVisitor::visit(FormFactorFullSphere *)");
-    }
-    virtual void visit(const FormFactorPyramid *) {
-        throw NotImplementedException(
-            "ISampleVisitor::visit(FormFactorPyramid *)");
-    }
-    virtual void visit(const FormFactorCylinder *) {
-        throw NotImplementedException(
-            "ISampleVisitor::visit(FormFactorCylinder *)");
-    }
-    virtual void visit(const FormFactorPrism3 *) {
-        throw NotImplementedException(
-            "ISampleVisitor::visit(FormFactorPrism3 *)");
-    }
-    virtual void visit(const IInterferenceFunction *) {
-        throw NotImplementedException(
-            "ISampleVisitor::visit(IInterferenceFunction *)");
-    }
-    virtual void visit(const InterferenceFunction1DParaCrystal  *) {
-        throw NotImplementedException(
-                "ISampleVisitor::visit(InterferenceFunction1DParaCrystal  *)");
-    }
-    virtual void visit(const InterferenceFunction2DParaCrystal  *) {
-        throw NotImplementedException(
-                "ISampleVisitor::visit(InterferenceFunction2DParaCrystal  *)");
-    }
-
-    virtual void visit(const LayerRoughness  *) {
-        throw NotImplementedException(
-                "ISampleVisitor::visit(LayerRoughness *)");
-    }
-
-    virtual void visit(const InterferenceFunction2DLattice  *) {
-        throw NotImplementedException(
-                "ISampleVisitor::visit(InterferenceFunction2DParaCrystal  *)");
-    }
-
-    virtual bool goForward(){ return true; }
-    virtual bool goBack(){ return true; }
+    ISampleVisitor() : m_level(0) {}
+    virtual ~ISampleVisitor(){}
+
+    // visiting methods (the order according to the hierarchy as reported by IDE)
+
+    virtual void visit(const ISample *);
+
+    virtual void visit(const ICompositeSample *);
+
+    virtual void visit(const IClusteredParticles *);
+    virtual void visit(const Crystal *);
+
+    virtual void visit(const IDecoration *);
+    virtual void visit(const ParticleDecoration *);
+
+    virtual void visit(const Layer *);
+
+    virtual void visit(const LayerInterface *);
+
+    virtual void visit(const MultiLayer *);
+
+    virtual void visit(const Particle *);
+    virtual void visit(const LatticeBasis *);
+    virtual void visit(const MesoCrystal *);
+    virtual void visit(const ParticleCoreShell *);
+
+    virtual void visit(const ParticleInfo *);
+    virtual void visit(const DiffuseParticleInfo *);
+    virtual void visit(const PositionParticleInfo *);
+
+    virtual void visit(const IFormFactor *);
+
+    virtual void visit(const FormFactorDWBAPol *);
+    virtual void visit(const FormFactorDWBAPolConstZ *);
+
+    virtual void visit(const FormFactorWeighted *);
+
+    virtual void visit(const IFormFactorBorn *);
+
+    virtual void visit(const FormFactorBox *);
+    virtual void visit(const FormFactorCone *);
+    virtual void visit(const FormFactorCone6 *);
+    virtual void visit(const FormFactorCrystal *);
+    virtual void visit(const FormFactorCylinder *);
+    virtual void visit(const FormFactorEllipsoid *);
+    virtual void visit(const FormFactorFullSphere *);
+    virtual void visit(const FormFactorFullSpheroid *);
+    virtual void visit(const FormFactorGauss *);
+    virtual void visit(const FormFactorHemiSpheroid *);
+    virtual void visit(const FormFactorLorentz *);
+    virtual void visit(const FormFactorParallelepiped *);
+    virtual void visit(const FormFactorPrism3 *);
+    virtual void visit(const FormFactorPrism6 *);
+    virtual void visit(const FormFactorPyramid *);
+    virtual void visit(const FormFactorSphere *);
+    virtual void visit(const FormFactorSphereGaussianRadius *);
+    virtual void visit(const FormFactorTetrahedron *);
+    virtual void visit(const IFormFactorBornSeparable *);
+
+    virtual void visit(const IFormFactorDecorator *);
+
+    virtual void visit(const FormFactorDWBA *);
+    virtual void visit(const FormFactorDWBAConstZ *);
+    virtual void visit(const FormFactorDecoratorDebyeWaller *);
+    virtual void visit(const FormFactorDecoratorFactor *);
+    virtual void visit(const FormFactorDecoratorMaterial *);
+    virtual void visit(const FormFactorDecoratorMultiPositionFactor *);
+    virtual void visit(const FormFactorDecoratorPositionFactor *);
+    virtual void visit(const FormFactorDecoratorTransformation *);
+
+    virtual void visit(const IInterferenceFunction *);
+    virtual void visit(const InterferenceFunction1DParaCrystal *);
+    virtual void visit(const InterferenceFunction2DLattice *);
+    virtual void visit(const InterferenceFunction2DParaCrystal *);
+    virtual void visit(const InterferenceFunctionNone *);
+
+    virtual void visit(const IRoughness *);
+    virtual void visit(const LayerRoughness *);
+
+    // enter and leave methods
+    bool visitEnter(const ICompositeSample *);
+    bool visitLeave(const ICompositeSample *);
+
+    //! return current level of the visitor in the composite hierarchy
+    int getLevel() const { return m_level; }
+
+    //! set current level of the visitor in the composite hierarchy
+    void setLevel(int level) { m_level = level; }
+
+private:
+    int m_level;
 };
 
+void VisitSampleTree(ISample &sample, ISampleVisitor &visitor);
+
 
 #endif // ISAMPLEVISITOR_H
diff --git a/Core/Samples/src/ISample.cpp b/Core/Samples/src/ISample.cpp
index 71910444ff1..52294866f15 100644
--- a/Core/Samples/src/ISample.cpp
+++ b/Core/Samples/src/ISample.cpp
@@ -75,7 +75,8 @@ std::string ISample::addParametersToExternalPool(
 void ISample::printSampleTree()
 {
     SamplePrintVisitor visitor;
-    this->accept(&visitor);
+    VisitSampleTree(*this, visitor);
+    //this->accept(&visitor);
 }
 
 bool ISample::containsMagneticMaterial() const
diff --git a/Core/Samples/src/ISampleHierarchicalVisitor.cpp b/Core/Samples/src/ISampleHierarchicalVisitor.cpp
deleted file mode 100644
index 4eb51dcae03..00000000000
--- a/Core/Samples/src/ISampleHierarchicalVisitor.cpp
+++ /dev/null
@@ -1,292 +0,0 @@
-#include "ISampleHierarchicalVisitor.h"
-
-
-bool ISampleHierarchicalVisitor::visit(const ISample *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const ISample *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const ICompositeSample *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const ICompositeSample *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const IClusteredParticles *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const IClusteredParticles *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const Crystal *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const Crystal *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const IDecoration *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const IDecoration *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const ParticleDecoration *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const ParticleDecoration *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const Layer *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const Layer *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const LayerInterface *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const LayerInterface *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const MultiLayer *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const MultiLayer *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const Particle *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const Particle *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const LatticeBasis *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const LatticeBasis *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const MesoCrystal *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const MesoCrystal *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const ParticleCoreShell *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const ParticleCoreShell *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const ParticleInfo *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const ParticleInfo *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const DiffuseParticleInfo *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const DiffuseParticleInfo *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const PositionParticleInfo *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const PositionParticleInfo *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const IFormFactor *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const IFormFactor *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDWBAPol *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDWBAPol *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDWBAPolConstZ *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDWBAPolConstZ *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorWeighted *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorWeighted *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const IFormFactorBorn *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const IFormFactorBorn *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorBox *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorBox *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorCone *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorCone *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorCrystal *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorCrystal *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorCylinder *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorCylinder *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorEllipsoid *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorEllipsoid *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorFullSphere *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorFullSphere *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorFullSpheroid *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorFullSpheroid *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorGauss *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorGauss *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorHemiSpheroid *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit const FormFactorHemiSpheroid *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorLorentz *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorLorentz *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorParallelepiped *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorParallelepiped *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorPrism3 *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorPrism3 *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorPrism6 *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorPrism6 *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorPyramid *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorPyramid *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorSphere *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorSphere *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorSphereGaussianRadius *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorSphereGaussianRadius *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorTetrahedron *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorTetrahedron *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const IFormFactorBornSeparable *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const IFormFactorBornSeparable *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const IFormFactorDecorator *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const IFormFactorDecorator *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDWBA *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDWBA *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDWBAConstZ *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDWBAConstZ *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDecoratorDebyeWaller *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDecoratorDebyeWaller *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDecoratorFactor *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDecoratorFactor *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDecoratorMaterial *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDecoratorMaterial *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDecoratorMultiPositionFactor *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDecoratorMultiPositionFactor *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDecoratorPositionFactor *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDecoratorPositionFactor *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const FormFactorDecoratorTransformation *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const FormFactorDecoratorTransformation *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const IInterferenceFunction *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const IInterferenceFunction *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const InterferenceFunction1DParaCrystal *){
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const InterferenceFunction1DParaCrystal *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const InterferenceFunction2DLattice *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const InterferenceFunction2DLattice *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const InterferenceFunction2DParaCrystal *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const InterferenceFunction2DParaCrystal *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const InterferenceFunctionNone *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const InterferenceFunctionNone *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const IRoughness *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const IRoughness *) -> Error. Not implemented.");
-}
-
-bool ISampleHierarchicalVisitor::visit(const LayerRoughness *)
-{
-    throw NotImplementedException("ISampleHierarchicalVisitor::visit(const LayerRoughness *) -> Error. Not implemented.");
-}
-
-
-// -----------------------------------------------------------------------------
-//
-// -----------------------------------------------------------------------------
-bool  ISampleHierarchicalVisitor::visitEnter(const ICompositeSample *)
-{
-    m_nlevel++;
-    return true;
-}
-
-bool  ISampleHierarchicalVisitor::visitLeave(const ICompositeSample *)
-{
-    m_nlevel--;
-    return true;
-}
diff --git a/Core/Samples/src/ISampleVisitor.cpp b/Core/Samples/src/ISampleVisitor.cpp
new file mode 100644
index 00000000000..e753e720be0
--- /dev/null
+++ b/Core/Samples/src/ISampleVisitor.cpp
@@ -0,0 +1,373 @@
+#include "ISampleVisitor.h"
+#include "ISample.h"
+#include "ICompositeSample.h"
+#include "ICompositeIterator.h"
+
+
+void VisitSampleTree(ISample &sample, ISampleVisitor &visitor)
+{
+    sample.accept(&visitor);
+    ICompositeSample *composite = sample.getCompositeSample();
+    if(composite) {
+        ICompositeIterator it = composite->createIterator();
+        it.first();
+        while( !it.is_done() ) {
+            visitor.setLevel(it.get_level());
+            ISample *child = it.get_current();
+            child->accept(&visitor);
+            it.next();
+        }
+    }
+}
+
+
+
+void ISampleVisitor::visit(const ISample *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const ISample *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const ICompositeSample *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const ICompositeSample *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const IClusteredParticles *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const IClusteredParticles *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const Crystal *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const Crystal *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const IDecoration *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const IDecoration *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const ParticleDecoration *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const ParticleDecoration *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const Layer *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const Layer *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const LayerInterface *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const LayerInterface *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const MultiLayer *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const MultiLayer *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const Particle *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const Particle *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const LatticeBasis *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const LatticeBasis *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const MesoCrystal *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const MesoCrystal *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const ParticleCoreShell *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const ParticleCoreShell *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const ParticleInfo *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const ParticleInfo *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const DiffuseParticleInfo *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const DiffuseParticleInfo *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const PositionParticleInfo *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const PositionParticleInfo *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const IFormFactor *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const IFormFactor *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDWBAPol *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDWBAPol *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDWBAPolConstZ *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDWBAPolConstZ *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorWeighted *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorWeighted *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const IFormFactorBorn *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const IFormFactorBorn *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorBox *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorBox *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorCone *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorCone *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorCone6 *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorCone6 *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorCrystal *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorCrystal *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorCylinder *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorCylinder *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorEllipsoid *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorEllipsoid *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorFullSphere *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorFullSphere *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorFullSpheroid *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorFullSpheroid *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorGauss *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorGauss *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorHemiSpheroid *)
+{
+    throw NotImplementedException("ISampleVisitor::visit const FormFactorHemiSpheroid *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorLorentz *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorLorentz *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorParallelepiped *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorParallelepiped *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorPrism3 *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorPrism3 *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorPrism6 *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorPrism6 *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorPyramid *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorPyramid *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorSphere *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorSphere *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorSphereGaussianRadius *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorSphereGaussianRadius *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorTetrahedron *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorTetrahedron *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const IFormFactorBornSeparable *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const IFormFactorBornSeparable *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const IFormFactorDecorator *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const IFormFactorDecorator *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDWBA *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDWBA *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDWBAConstZ *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDWBAConstZ *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDecoratorDebyeWaller *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDecoratorDebyeWaller *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDecoratorFactor *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDecoratorFactor *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDecoratorMaterial *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDecoratorMaterial *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDecoratorMultiPositionFactor *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDecoratorMultiPositionFactor *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDecoratorPositionFactor *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDecoratorPositionFactor *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const FormFactorDecoratorTransformation *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDecoratorTransformation *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const IInterferenceFunction *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const IInterferenceFunction *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const InterferenceFunction1DParaCrystal *){
+    throw NotImplementedException("ISampleVisitor::visit(const InterferenceFunction1DParaCrystal *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const InterferenceFunction2DLattice *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const InterferenceFunction2DLattice *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const InterferenceFunction2DParaCrystal *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const InterferenceFunction2DParaCrystal *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const InterferenceFunctionNone *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const InterferenceFunctionNone *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const IRoughness *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const IRoughness *) -> Error. Not implemented.");
+}
+
+
+void ISampleVisitor::visit(const LayerRoughness *)
+{
+    throw NotImplementedException("ISampleVisitor::visit(const LayerRoughness *) -> Error. Not implemented.");
+}
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+bool  ISampleVisitor::visitEnter(const ICompositeSample *)
+{
+    m_level++;
+    return false;
+}
+
+bool  ISampleVisitor::visitLeave(const ICompositeSample *)
+{
+    m_level--;
+    return false;
+}
diff --git a/Core/Tools/inc/SampleMaterialVisitor.h b/Core/Tools/inc/SampleMaterialVisitor.h
index 157e4c84b27..c96a15df966 100644
--- a/Core/Tools/inc/SampleMaterialVisitor.h
+++ b/Core/Tools/inc/SampleMaterialVisitor.h
@@ -23,34 +23,86 @@
 class SampleMaterialVisitor : public ISampleVisitor
 {
 public:
-    SampleMaterialVisitor();
+    SampleMaterialVisitor(){}
     virtual ~SampleMaterialVisitor();
 
-    void visit(const ISample *sample);
-    void visit(const MultiLayer *sample);
-    void visit(const Layer *sample);
-    void visit(const LayerInterface *sample);
-    void visit(const ParticleDecoration *sample);
-    void visit(const ParticleInfo *sample);
-    void visit(const Particle *sample);
-    void visit(const ParticleCoreShell *sample);
-    void visit(const MesoCrystal *sample);
-    void visit(const Crystal *sample);
-    void visit(const LatticeBasis *sample);
-    void visit(const IFormFactor *sample);
-
-    void visit(const FormFactorFullSphere *sample);
-    void visit(const FormFactorPyramid *sample);
-    void visit(const FormFactorCylinder *sample);
-    void visit(const FormFactorPrism3 *sample);
-
-    void visit(const IInterferenceFunction *sample);
-    void visit(const InterferenceFunction1DParaCrystal  *);
-    void visit(const InterferenceFunction2DParaCrystal  *);
-    void visit(const InterferenceFunction2DLattice  *);
-
-    void visit(const LayerRoughness  *);
+    // visiting methods (the order according to the hierarchy as reported by IDE)
 
+    virtual void visit(const ISample *sample);
+
+    virtual void visit(const ICompositeSample *sample);
+
+    virtual void visit(const IClusteredParticles *sample);
+    virtual void visit(const Crystal *sample);
+
+    virtual void visit(const IDecoration *sample);
+    virtual void visit(const ParticleDecoration *sample);
+
+    virtual void visit(const Layer *sample);
+
+    virtual void visit(const LayerInterface *sample);
+
+    virtual void visit(const MultiLayer *sample);
+
+    virtual void visit(const Particle *sample);
+    virtual void visit(const LatticeBasis *sample);
+    virtual void visit(const MesoCrystal *sample);
+    virtual void visit(const ParticleCoreShell *sample);
+
+    virtual void visit(const ParticleInfo *sample);
+    virtual void visit(const DiffuseParticleInfo *sample);
+    virtual void visit(const PositionParticleInfo *sample);
+
+    virtual void visit(const IFormFactor *sample);
+
+    virtual void visit(const FormFactorDWBAPol *sample);
+    virtual void visit(const FormFactorDWBAPolConstZ *sample);
+
+    virtual void visit(const FormFactorWeighted *sample);
+
+    virtual void visit(const IFormFactorBorn *sample);
+
+    virtual void visit(const FormFactorBox *sample);
+    virtual void visit(const FormFactorCone *sample);
+    virtual void visit(const FormFactorCone6 *sample);
+    virtual void visit(const FormFactorCrystal *sample);
+    virtual void visit(const FormFactorCylinder *sample);
+    virtual void visit(const FormFactorEllipsoid *sample);
+    virtual void visit(const FormFactorFullSphere *sample);
+    virtual void visit(const FormFactorFullSpheroid *sample);
+    virtual void visit(const FormFactorGauss *sample);
+    virtual void visit(const FormFactorHemiSpheroid *sample);
+    virtual void visit(const FormFactorLorentz *sample);
+    virtual void visit(const FormFactorParallelepiped *sample);
+    virtual void visit(const FormFactorPrism3 *sample);
+    virtual void visit(const FormFactorPrism6 *sample);
+    virtual void visit(const FormFactorPyramid *sample);
+    virtual void visit(const FormFactorSphere *sample);
+    virtual void visit(const FormFactorSphereGaussianRadius *sample);
+    virtual void visit(const FormFactorTetrahedron *sample);
+    virtual void visit(const IFormFactorBornSeparable *sample);
+
+    virtual void visit(const IFormFactorDecorator *sample);
+
+    virtual void visit(const FormFactorDWBA *sample);
+    virtual void visit(const FormFactorDWBAConstZ *sample);
+    virtual void visit(const FormFactorDecoratorDebyeWaller *sample);
+    virtual void visit(const FormFactorDecoratorFactor *sample);
+    virtual void visit(const FormFactorDecoratorMaterial *sample);
+    virtual void visit(const FormFactorDecoratorMultiPositionFactor *sample);
+    virtual void visit(const FormFactorDecoratorPositionFactor *sample);
+    virtual void visit(const FormFactorDecoratorTransformation *sample);
+
+    virtual void visit(const IInterferenceFunction *sample);
+    virtual void visit(const InterferenceFunction1DParaCrystal *sample);
+    virtual void visit(const InterferenceFunction2DLattice *sample);
+    virtual void visit(const InterferenceFunction2DParaCrystal *sample);
+    virtual void visit(const InterferenceFunctionNone *sample);
+
+    virtual void visit(const IRoughness *sample);
+    virtual void visit(const LayerRoughness *sample);
+
+    //! return vector of material presented in the sample
     std::vector<const IMaterial *> getMaterials() const {
         return m_materials;
     }
diff --git a/Core/Tools/inc/SamplePrintVisitor.h b/Core/Tools/inc/SamplePrintVisitor.h
index f08a47f9f68..cf08a1bc55b 100644
--- a/Core/Tools/inc/SamplePrintVisitor.h
+++ b/Core/Tools/inc/SamplePrintVisitor.h
@@ -8,60 +8,92 @@
 class BA_CORE_API_ SamplePrintVisitor : public ISampleVisitor
 {
 public:
-    SamplePrintVisitor() : m_level(0){}
-
-    void visit(const ISample *sample);
-    void visit(const MultiLayer *sample);
-    void visit(const Layer *sample);
-    void visit(const LayerInterface *sample);
-    void visit(const ParticleDecoration *sample);
-    void visit(const ParticleInfo *sample);
-    void visit(const Particle *sample);
-    void visit(const ParticleCoreShell *sample);
-    void visit(const MesoCrystal *sample);
-    void visit(const Crystal *sample);
-    void visit(const LatticeBasis *sample);
-    void visit(const IFormFactor *sample);
-
-
-    void visit(const FormFactorFullSphere *sample);
-    void visit(const FormFactorPyramid *sample);
-    void visit(const FormFactorCylinder *sample);
-    void visit(const FormFactorPrism3 *sample);
-
-    void visit(const IInterferenceFunction *sample);
-    void visit(const InterferenceFunction1DParaCrystal  *);
-    void visit(const InterferenceFunction2DParaCrystal  *);
-    void visit(const InterferenceFunction2DLattice  *);
-
-    void visit(const LayerRoughness *sample);
-
-    bool goForward();
-    bool goBack();
-private:
-    std::string get_indent();
-    int m_level;
-};
+    SamplePrintVisitor() {}
 
+    virtual void visit(const ISample *sample);
 
-inline bool SamplePrintVisitor::goForward()
-{
-    ++m_level;
-    return true;
-}
+    virtual void visit(const ICompositeSample *sample);
 
-inline bool SamplePrintVisitor::goBack()
-{
-    --m_level;
-    return true;
-}
+    virtual void visit(const IClusteredParticles *sample);
+    virtual void visit(const Crystal *sample);
+
+    virtual void visit(const IDecoration *sample);
+    virtual void visit(const ParticleDecoration *sample);
+
+    virtual void visit(const Layer *sample);
+
+    virtual void visit(const LayerInterface *sample);
+
+    virtual void visit(const MultiLayer *sample);
+
+    virtual void visit(const Particle *sample);
+    virtual void visit(const LatticeBasis *sample);
+    virtual void visit(const MesoCrystal *sample);
+    virtual void visit(const ParticleCoreShell *sample);
+
+    virtual void visit(const ParticleInfo *sample);
+    virtual void visit(const DiffuseParticleInfo *sample);
+    virtual void visit(const PositionParticleInfo *sample);
+
+    virtual void visit(const IFormFactor *sample);
+
+    virtual void visit(const FormFactorDWBAPol *sample);
+    virtual void visit(const FormFactorDWBAPolConstZ *sample);
+
+    virtual void visit(const FormFactorWeighted *sample);
+
+    virtual void visit(const IFormFactorBorn *sample);
+
+    virtual void visit(const FormFactorBox *sample);
+    virtual void visit(const FormFactorCone *sample);
+    virtual void visit(const FormFactorCone6 *sample);
+    virtual void visit(const FormFactorCrystal *sample);
+    virtual void visit(const FormFactorCylinder *sample);
+    virtual void visit(const FormFactorEllipsoid *sample);
+    virtual void visit(const FormFactorFullSphere *sample);
+    virtual void visit(const FormFactorFullSpheroid *sample);
+    virtual void visit(const FormFactorGauss *sample);
+    virtual void visit(const FormFactorHemiSpheroid *sample);
+    virtual void visit(const FormFactorLorentz *sample);
+    virtual void visit(const FormFactorParallelepiped *sample);
+    virtual void visit(const FormFactorPrism3 *sample);
+    virtual void visit(const FormFactorPrism6 *sample);
+    virtual void visit(const FormFactorPyramid *sample);
+    virtual void visit(const FormFactorSphere *sample);
+    virtual void visit(const FormFactorSphereGaussianRadius *sample);
+    virtual void visit(const FormFactorTetrahedron *sample);
+    virtual void visit(const IFormFactorBornSeparable *sample);
+
+    virtual void visit(const IFormFactorDecorator *sample);
+
+    virtual void visit(const FormFactorDWBA *sample);
+    virtual void visit(const FormFactorDWBAConstZ *sample);
+    virtual void visit(const FormFactorDecoratorDebyeWaller *sample);
+    virtual void visit(const FormFactorDecoratorFactor *sample);
+    virtual void visit(const FormFactorDecoratorMaterial *sample);
+    virtual void visit(const FormFactorDecoratorMultiPositionFactor *sample);
+    virtual void visit(const FormFactorDecoratorPositionFactor *sample);
+    virtual void visit(const FormFactorDecoratorTransformation *sample);
+
+    virtual void visit(const IInterferenceFunction *sample);
+    virtual void visit(const InterferenceFunction1DParaCrystal *sample);
+    virtual void visit(const InterferenceFunction2DLattice *sample);
+    virtual void visit(const InterferenceFunction2DParaCrystal *sample);
+    virtual void visit(const InterferenceFunctionNone *sample);
+
+    virtual void visit(const IRoughness *sample);
+    virtual void visit(const LayerRoughness *sample);
+
+private:
+    std::string get_indent()
+    {
+        std::string result;
+        result.resize(getLevel()*4, '.');
+        result += " ";
+        return result;
+    }
+};
 
-inline std::string SamplePrintVisitor::get_indent()
-{
-    std::string result;
-    result.resize(m_level*4, '.');
-    return result;
-}
 
 
 #endif // SAMPLEPRINTVISITOR_H
diff --git a/Core/Tools/src/SampleMaterialVisitor.cpp b/Core/Tools/src/SampleMaterialVisitor.cpp
index 69b6aefe940..dd43edd1456 100644
--- a/Core/Tools/src/SampleMaterialVisitor.cpp
+++ b/Core/Tools/src/SampleMaterialVisitor.cpp
@@ -12,208 +12,366 @@
 //! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
 //
 // ************************************************************************** //
-
 #include "SampleMaterialVisitor.h"
-
-#include "ISample.h"
-#include "FormFactors.h"
-#include "MultiLayer.h"
-#include "ParticleDecoration.h"
+#include "IMaterial.h"
+#include "Layer.h"
 #include "Particle.h"
-#include "ParticleInfo.h"
-#include "ParticleCoreShell.h"
-#include "MesoCrystal.h"
-#include "InterferenceFunction1DParaCrystal.h"
-#include "InterferenceFunction2DParaCrystal.h"
-#include "InterferenceFunction2DLattice.h"
 
-#include <algorithm>
 
-SampleMaterialVisitor::SampleMaterialVisitor()
+SampleMaterialVisitor::~SampleMaterialVisitor()
 {
     m_materials.clear();
 }
 
-SampleMaterialVisitor::~SampleMaterialVisitor()
+void SampleMaterialVisitor::addMaterial(const IMaterial* p_material)
 {
-    m_materials.clear();
+    if (p_material && std::find(m_materials.begin(), m_materials.end(),
+            p_material) == m_materials.end() ) {
+        m_materials.push_back(p_material);
+    }
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+
+void SampleMaterialVisitor::visit(const ISample *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const ISample *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const ISample* sample)
+
+void SampleMaterialVisitor::visit(const ICompositeSample *)
 {
-    (void)sample;
-    throw NotImplementedException("SampleMaterialVisitor::visit(ISample *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const ICompositeSample *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const MultiLayer* sample)
+
+void SampleMaterialVisitor::visit(const IClusteredParticles *)
 {
-    assert(sample);
+    throw NotImplementedException("SampleMaterialVisitor::visit(const IClusteredParticles *) -> Error. Not implemented.");
+}
 
-    for(size_t i_layer=0; i_layer < sample->getNumberOfLayers(); ++i_layer) {
-        const Layer *layer = sample->getLayer(i_layer);
-        layer->accept(this);
-    }
+
+void SampleMaterialVisitor::visit(const Crystal *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const Crystal *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const Layer* sample)
+
+void SampleMaterialVisitor::visit(const IDecoration *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const IDecoration *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const ParticleDecoration *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const ParticleDecoration *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const Layer *sample)
 {
     assert(sample);
+    const IMaterial *material = sample->getMaterial();
+    addMaterial(material);
+}
 
-    const IMaterial *p_material = sample->getMaterial();
-    addMaterial(p_material);
-    const IDecoration *p_decoration = sample->getDecoration();
-    if (p_decoration) {
-        p_decoration->accept(this);
-    }
+
+void SampleMaterialVisitor::visit(const LayerInterface *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const LayerInterface *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const LayerInterface* sample)
+
+void SampleMaterialVisitor::visit(const MultiLayer *sample)
 {
     (void)sample;
-    throw NotImplementedException("SampleMaterialVisitor::visit(LayerInterface *)");
 }
 
-void SampleMaterialVisitor::visit(const ParticleDecoration* sample)
+
+void SampleMaterialVisitor::visit(const Particle *sample)
 {
     assert(sample);
+    const IMaterial *material = sample->getMaterial();
+    addMaterial(material);
+}
 
-    for (size_t i=0; i<sample->getNumberOfParticles(); ++i) {
-        const ParticleInfo *p_particle_info = sample->getParticleInfo(i);
-        p_particle_info->accept(this);
-    }
+
+void SampleMaterialVisitor::visit(const LatticeBasis *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const LatticeBasis *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const ParticleInfo* sample)
+
+void SampleMaterialVisitor::visit(const MesoCrystal *)
 {
-    assert(sample);
+    throw NotImplementedException("SampleMaterialVisitor::visit(const MesoCrystal *) -> Error. Not implemented.");
+}
 
-    const Particle *p_particle = sample->getParticle();
-    if (p_particle) {
-        p_particle->accept(this);
-    }
+
+void SampleMaterialVisitor::visit(const ParticleCoreShell *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const ParticleCoreShell *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const Particle* sample)
+
+void SampleMaterialVisitor::visit(const ParticleInfo *)
 {
-    assert(sample);
+    throw NotImplementedException("SampleMaterialVisitor::visit(const ParticleInfo *) -> Error. Not implemented.");
+}
+
 
-    const IMaterial *p_material = sample->getMaterial();
-    addMaterial(p_material);
+void SampleMaterialVisitor::visit(const DiffuseParticleInfo *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const DiffuseParticleInfo *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const ParticleCoreShell* sample)
+
+void SampleMaterialVisitor::visit(const PositionParticleInfo *)
 {
-    assert(sample);
+    throw NotImplementedException("SampleMaterialVisitor::visit(const PositionParticleInfo *) -> Error. Not implemented.");
+}
 
-    const Particle *p_core = sample->getCoreParticle();
-    if (p_core) {
-        p_core->accept(this);
-    }
-    const Particle *p_shell = sample->getShellParticle();
-    if (p_shell) {
-        p_shell->accept(this);
-    }
+
+void SampleMaterialVisitor::visit(const IFormFactor *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const IFormFactor *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const MesoCrystal* sample)
+
+void SampleMaterialVisitor::visit(const FormFactorDWBAPol *)
 {
-    assert(sample);
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDWBAPol *) -> Error. Not implemented.");
+}
+
 
-    const IClusteredParticles *p_clustered_particles =
-            sample->getClusteredParticles();
-    p_clustered_particles->accept(this);
+void SampleMaterialVisitor::visit(const FormFactorDWBAPolConstZ *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDWBAPolConstZ *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const Crystal* sample)
+
+void SampleMaterialVisitor::visit(const FormFactorWeighted *)
 {
-    assert(sample);
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorWeighted *) -> Error. Not implemented.");
+}
 
-    const LatticeBasis *p_lattice_basis = sample->getLatticeBasis();
-    p_lattice_basis->accept(this);
+
+void SampleMaterialVisitor::visit(const IFormFactorBorn *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const IFormFactorBorn *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const LatticeBasis* sample)
+
+void SampleMaterialVisitor::visit(const FormFactorBox *)
 {
-    assert(sample);
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorBox *) -> Error. Not implemented.");
+}
 
-    size_t nbr_particles = sample->getNbrParticles();
-    for (size_t i=0; i<nbr_particles; ++i)
-    {
-        const Particle *p_particle = sample->getParticle(i);
-        p_particle->accept(this);
-    }
+
+void SampleMaterialVisitor::visit(const FormFactorCone *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorCone *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const IFormFactor* sample)
+
+void SampleMaterialVisitor::visit(const FormFactorCone6 *)
 {
-    (void)sample;
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(IFormFactor *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorCone6 *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const FormFactorFullSphere* sample)
+
+void SampleMaterialVisitor::visit(const FormFactorCrystal *)
 {
-    (void)sample;
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(FormFactorFullSphere *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorCrystal *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const FormFactorPyramid* sample)
+
+void SampleMaterialVisitor::visit(const FormFactorCylinder *)
 {
-    (void)sample;
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(FormFactorPyramid *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorCylinder *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const FormFactorCylinder* sample)
+
+void SampleMaterialVisitor::visit(const FormFactorEllipsoid *)
 {
-    (void)sample;
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(FormFactorCylinder *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorEllipsoid *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const FormFactorPrism3* sample)
+
+void SampleMaterialVisitor::visit(const FormFactorFullSphere *)
 {
-    (void)sample;
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(FormFactorPrism3 *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorFullSphere *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const IInterferenceFunction* sample)
+
+void SampleMaterialVisitor::visit(const FormFactorFullSpheroid *)
 {
-    (void)sample;
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(IInterferenceFunction *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorFullSpheroid *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const InterferenceFunction1DParaCrystal*)
+
+void SampleMaterialVisitor::visit(const FormFactorGauss *)
 {
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(IInterferenceFunction *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorGauss *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const InterferenceFunction2DParaCrystal*)
+
+void SampleMaterialVisitor::visit(const FormFactorHemiSpheroid *)
 {
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(InterferenceFunction2DParaCrystal *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit const FormFactorHemiSpheroid *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const InterferenceFunction2DLattice*)
+
+void SampleMaterialVisitor::visit(const FormFactorLorentz *)
 {
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(InterferenceFunction2DLattice *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorLorentz *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::visit(const LayerRoughness*)
+
+void SampleMaterialVisitor::visit(const FormFactorParallelepiped *)
 {
-    throw NotImplementedException("SampleMaterialVisitor::"
-            "visit(LayerRoughness *)");
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorParallelepiped *) -> Error. Not implemented.");
 }
 
-void SampleMaterialVisitor::addMaterial(const IMaterial* p_material)
+
+void SampleMaterialVisitor::visit(const FormFactorPrism3 *)
 {
-    if (p_material && std::find(m_materials.begin(), m_materials.end(),
-            p_material) == m_materials.end() ) {
-        m_materials.push_back(p_material);
-    }
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorPrism3 *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorPrism6 *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorPrism6 *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorPyramid *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorPyramid *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorSphere *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorSphere *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorSphereGaussianRadius *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorSphereGaussianRadius *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorTetrahedron *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorTetrahedron *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const IFormFactorBornSeparable *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const IFormFactorBornSeparable *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const IFormFactorDecorator *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const IFormFactorDecorator *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorDWBA *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDWBA *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorDWBAConstZ *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDWBAConstZ *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorDecoratorDebyeWaller *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDecoratorDebyeWaller *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorDecoratorFactor *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDecoratorFactor *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorDecoratorMaterial *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDecoratorMaterial *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorDecoratorMultiPositionFactor *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDecoratorMultiPositionFactor *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorDecoratorPositionFactor *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDecoratorPositionFactor *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const FormFactorDecoratorTransformation *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const FormFactorDecoratorTransformation *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const IInterferenceFunction *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const IInterferenceFunction *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const InterferenceFunction1DParaCrystal *){
+    throw NotImplementedException("SampleMaterialVisitor::visit(const InterferenceFunction1DParaCrystal *) -> Error. Not implemented.");
 }
+
+
+void SampleMaterialVisitor::visit(const InterferenceFunction2DLattice *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const InterferenceFunction2DLattice *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const InterferenceFunction2DParaCrystal *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const InterferenceFunction2DParaCrystal *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const InterferenceFunctionNone *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const InterferenceFunctionNone *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const IRoughness *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const IRoughness *) -> Error. Not implemented.");
+}
+
+
+void SampleMaterialVisitor::visit(const LayerRoughness *)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(const LayerRoughness *) -> Error. Not implemented.");
+}
+
+
+
diff --git a/Core/Tools/src/SamplePrintVisitor.cpp b/Core/Tools/src/SamplePrintVisitor.cpp
index 9f3c7076474..0342640f328 100644
--- a/Core/Tools/src/SamplePrintVisitor.cpp
+++ b/Core/Tools/src/SamplePrintVisitor.cpp
@@ -13,15 +13,359 @@
 #include "MesoCrystal.h"
 
 
-void SamplePrintVisitor::visit(const ISample *sample)
+void SamplePrintVisitor::visit(const ISample *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const ISample *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const ICompositeSample *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const ICompositeSample *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const IClusteredParticles *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const IClusteredParticles *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const Crystal *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const Crystal *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const IDecoration *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const IDecoration *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const ParticleDecoration *sample)
+{
+    assert(sample);
+    std::cout << get_indent() << "ParticleDecoration " << sample->getName()
+              << " " << (*sample->getParameterPool())
+              << std::endl;
+}
+
+
+void SamplePrintVisitor::visit(const Layer *sample)
 {
     assert(sample);
-    std::cout << get_indent() << "PrintVisitor_ISample " << sample->getName()
+    std::cout << get_indent() << sample->getName()
+              << " " << (sample->getMaterial() ? sample->getMaterial()->getName() : "0_MATERIAL")
+              << " " << sample->getRefractiveIndex()
               << " " << (*sample->getParameterPool())
               << std::endl;
 }
 
 
+void SamplePrintVisitor::visit(const LayerInterface *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const LayerInterface *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const MultiLayer *sample)
+{
+    assert(sample);
+    std::cout << "--------------------------------------------------------------------------------" << std::endl;
+    std::cout << get_indent() << sample->getName()
+              << " " << (*sample->getParameterPool())
+              << std::endl;
+}
+
+
+void SamplePrintVisitor::visit(const Particle *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const Particle *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const LatticeBasis *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const LatticeBasis *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const MesoCrystal *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const MesoCrystal *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const ParticleCoreShell *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const ParticleCoreShell *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const ParticleInfo *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const ParticleInfo *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const DiffuseParticleInfo *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const DiffuseParticleInfo *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const PositionParticleInfo *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const PositionParticleInfo *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const IFormFactor *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const IFormFactor *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDWBAPol *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDWBAPol *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDWBAPolConstZ *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDWBAPolConstZ *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorWeighted *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorWeighted *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const IFormFactorBorn *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const IFormFactorBorn *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorBox *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorBox *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorCone *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorCone *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorCone6 *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorCone6 *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorCrystal *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorCrystal *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorCylinder *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorCylinder *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorEllipsoid *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorEllipsoid *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorFullSphere *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorFullSphere *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorFullSpheroid *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorFullSpheroid *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorGauss *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorGauss *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorHemiSpheroid *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit const FormFactorHemiSpheroid *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorLorentz *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorLorentz *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorParallelepiped *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorParallelepiped *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorPrism3 *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorPrism3 *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorPrism6 *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorPrism6 *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorPyramid *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorPyramid *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorSphere *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorSphere *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorSphereGaussianRadius *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorSphereGaussianRadius *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorTetrahedron *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorTetrahedron *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const IFormFactorBornSeparable *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const IFormFactorBornSeparable *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const IFormFactorDecorator *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const IFormFactorDecorator *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDWBA *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDWBA *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDWBAConstZ *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDWBAConstZ *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDecoratorDebyeWaller *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDecoratorDebyeWaller *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDecoratorFactor *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDecoratorFactor *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDecoratorMaterial *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDecoratorMaterial *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDecoratorMultiPositionFactor *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDecoratorMultiPositionFactor *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDecoratorPositionFactor *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDecoratorPositionFactor *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const FormFactorDecoratorTransformation *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const FormFactorDecoratorTransformation *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const IInterferenceFunction *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const IInterferenceFunction *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const InterferenceFunction1DParaCrystal *){
+    throw NotImplementedException("SamplePrintVisitor::visit(const InterferenceFunction1DParaCrystal *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const InterferenceFunction2DLattice *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const InterferenceFunction2DLattice *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const InterferenceFunction2DParaCrystal *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const InterferenceFunction2DParaCrystal *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const InterferenceFunctionNone *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const InterferenceFunctionNone *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const IRoughness *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const IRoughness *) -> Error. Not implemented.");
+}
+
+
+void SamplePrintVisitor::visit(const LayerRoughness *)
+{
+    throw NotImplementedException("SamplePrintVisitor::visit(const LayerRoughness *) -> Error. Not implemented.");
+}
+
+
+
+
+/*
+
+
+
 void SamplePrintVisitor::visit(const MultiLayer *sample)
 {
     assert(sample);
@@ -44,19 +388,6 @@ void SamplePrintVisitor::visit(const MultiLayer *sample)
 }
 
 
-void SamplePrintVisitor::visit(const Layer *sample)
-{
-    assert(sample);
-    std::cout << get_indent() << "Layer " << sample->getName()
-              << " " << (sample->getMaterial() ? sample->getMaterial()->getName() : "0_MATERIAL")
-              << " " << sample->getRefractiveIndex()
-              << " " << (*sample->getParameterPool())
-              << std::endl;
-
-    const IDecoration *decoration = sample->getDecoration();
-    if(decoration) decoration->accept(this);
-}
-
 
 void SamplePrintVisitor::visit(const LayerInterface *sample)
 {
@@ -282,3 +613,7 @@ void SamplePrintVisitor::visit(const LayerRoughness *sample)
 }
 
 
+*/
+
+
+
-- 
GitLab