From 2521c022bc01bca4f527f4665e17fb45337c6e27 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Wed, 18 Nov 2020 10:37:25 +0100
Subject: [PATCH] privatize Particle::setFormFactor

---
 GUI/coregui/Models/MesoCrystalItem.cpp        |    1 +
 GUI/coregui/Models/ParticleItem.cpp           |   15 +-
 .../RealSpaceBuilderUtils.cpp                 |    1 +
 Sample/Particle/Particle.cpp                  |    5 -
 Sample/Particle/Particle.h                    |    5 +-
 .../Core/Sample/ParticleCompositionTest.cpp   |    2 +-
 .../Core/Sample/ParticleCoreShellTest.cpp     |    5 +-
 .../Core/Sample/ParticleLayoutTest.cpp        |   28 +-
 Tests/UnitTests/Core/Sample/ParticleTest.cpp  |   22 +-
 Wrap/swig/fromBase.i                          |    5 +-
 Wrap/swig/libBornAgainSample.i                |   19 +-
 auto/Wrap/doxygenSample.i                     |  218 +--
 auto/Wrap/libBornAgainSample.py               |  335 ++--
 auto/Wrap/libBornAgainSample_wrap.cpp         | 1537 ++++++++---------
 14 files changed, 1065 insertions(+), 1133 deletions(-)

diff --git a/GUI/coregui/Models/MesoCrystalItem.cpp b/GUI/coregui/Models/MesoCrystalItem.cpp
index 550607f5427..d1c4684fb17 100644
--- a/GUI/coregui/Models/MesoCrystalItem.cpp
+++ b/GUI/coregui/Models/MesoCrystalItem.cpp
@@ -27,6 +27,7 @@
 #include "Sample/Particle/MesoCrystal.h"
 #include "Sample/Particle/Particle.h"
 #include "Sample/Particle/ParticleCoreShell.h"
+#include "Sample/Scattering/IFormFactor.h"
 
 using SessionItemUtils::GetVectorItem;
 
diff --git a/GUI/coregui/Models/ParticleItem.cpp b/GUI/coregui/Models/ParticleItem.cpp
index 6729d4a5a6a..49011f7a5f0 100644
--- a/GUI/coregui/Models/ParticleItem.cpp
+++ b/GUI/coregui/Models/ParticleItem.cpp
@@ -22,6 +22,7 @@
 #include "GUI/coregui/Models/VectorItem.h"
 #include "GUI/coregui/Views/MaterialEditor/MaterialItemUtils.h"
 #include "Sample/Particle/Particle.h"
+#include "Sample/Scattering/IFormFactor.h"
 
 using SessionItemUtils::SetVectorItem;
 
@@ -66,18 +67,16 @@ ParticleItem::ParticleItem() : SessionGraphicsItem("Particle")
 
 std::unique_ptr<Particle> ParticleItem::createParticle() const
 {
-    auto P_material = TransformToDomain::createDomainMaterial(*this);
-    auto P_particle = std::make_unique<Particle>(*P_material);
-
+    auto& ffItem = groupItem<FormFactorItem>(ParticleItem::P_FORM_FACTOR);
+    auto material = TransformToDomain::createDomainMaterial(*this);
     double abundance = getItemValue(ParticleItem::P_ABUNDANCE).toDouble();
-    P_particle->setAbundance(abundance);
 
-    auto& ffItem = groupItem<FormFactorItem>(ParticleItem::P_FORM_FACTOR);
-    P_particle->setFormFactor(*ffItem.createFormFactor());
+    auto particle = std::make_unique<Particle>(*material, *ffItem.createFormFactor());
+    particle->setAbundance(abundance);
 
-    TransformToDomain::setTransformationInfo(P_particle.get(), *this);
+    TransformToDomain::setTransformationInfo(particle.get(), *this);
 
-    return P_particle;
+    return particle;
 }
 
 QVector<SessionItem*> ParticleItem::materialPropertyItems()
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
index f1416e8a541..55948a572d0 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
@@ -42,6 +42,7 @@
 #include "Sample/Particle/MesoCrystal.h"
 #include "Sample/Particle/Particle.h"
 #include "Sample/Particle/ParticleCoreShell.h"
+#include "Sample/FFCompute/IFormFactorDecorator.h"
 
 namespace
 {
diff --git a/Sample/Particle/Particle.cpp b/Sample/Particle/Particle.cpp
index b8cadeb8220..5d554c82e1d 100644
--- a/Sample/Particle/Particle.cpp
+++ b/Sample/Particle/Particle.cpp
@@ -20,11 +20,6 @@
 #include "Sample/FFCompute/FormFactorDecoratorPositionFactor.h"
 #include "Sample/FFCompute/Rotations.h"
 
-Particle::Particle() : m_material(HomogeneousMaterial())
-{
-    initialize();
-}
-
 Particle::~Particle() = default;
 
 Particle::Particle(Material material) : m_material(std::move(material))
diff --git a/Sample/Particle/Particle.h b/Sample/Particle/Particle.h
index cc67ae6887c..88267835eff 100644
--- a/Sample/Particle/Particle.h
+++ b/Sample/Particle/Particle.h
@@ -24,7 +24,7 @@
 class Particle : public IParticle
 {
 public:
-    Particle();
+    Particle() = delete;
     ~Particle();
     Particle(Material material);
     Particle(Material material, const IFormFactor& form_factor);
@@ -39,8 +39,6 @@ public:
     void setMaterial(Material material);
     const Material* material() const override final { return &m_material; }
 
-    void setFormFactor(const IFormFactor& form_factor);
-
     std::vector<const INode*> getChildren() const override final;
 
 protected:
@@ -49,6 +47,7 @@ protected:
 
 private:
     void initialize();
+    void setFormFactor(const IFormFactor& form_factor);
 };
 
 #endif // BORNAGAIN_SAMPLE_PARTICLE_PARTICLE_H
diff --git a/Tests/UnitTests/Core/Sample/ParticleCompositionTest.cpp b/Tests/UnitTests/Core/Sample/ParticleCompositionTest.cpp
index 0da2f7e218b..e57fec914b0 100644
--- a/Tests/UnitTests/Core/Sample/ParticleCompositionTest.cpp
+++ b/Tests/UnitTests/Core/Sample/ParticleCompositionTest.cpp
@@ -21,9 +21,9 @@ TEST_F(ParticleCompositionTest, ParticleCompositionDefaultConstructor)
 TEST_F(ParticleCompositionTest, ParticleCompositionClone)
 {
     ParticleComposition composition;
-    Particle particle;
     kvector_t position = kvector_t(1.0, 1.0, 1.0);
     Material material = HomogeneousMaterial("Vacuum", 0.0, 0.0);
+    Particle particle(material);
     composition.addParticle(particle, position);
 
     std::unique_ptr<ParticleComposition> clone(composition.clone());
diff --git a/Tests/UnitTests/Core/Sample/ParticleCoreShellTest.cpp b/Tests/UnitTests/Core/Sample/ParticleCoreShellTest.cpp
index 51e12d9145a..db54b0e3c94 100644
--- a/Tests/UnitTests/Core/Sample/ParticleCoreShellTest.cpp
+++ b/Tests/UnitTests/Core/Sample/ParticleCoreShellTest.cpp
@@ -18,8 +18,9 @@ protected:
 
 ParticleCoreShellTest::ParticleCoreShellTest() : m_coreshell(nullptr)
 {
-    Particle core;
-    Particle shell;
+    Material mat = HomogeneousMaterial("Ag", 1.245e-5, 5.419e-7);
+    Particle core(mat);
+    Particle shell(mat);
     kvector_t position;
     m_coreshell = new ParticleCoreShell(shell, core, position);
 }
diff --git a/Tests/UnitTests/Core/Sample/ParticleLayoutTest.cpp b/Tests/UnitTests/Core/Sample/ParticleLayoutTest.cpp
index 3206b310b5a..53e2b7596c2 100644
--- a/Tests/UnitTests/Core/Sample/ParticleLayoutTest.cpp
+++ b/Tests/UnitTests/Core/Sample/ParticleLayoutTest.cpp
@@ -27,7 +27,7 @@ TEST_F(ParticleLayoutTest, ParticleLayoutInitial)
 
 TEST_F(ParticleLayoutTest, ParticleLayoutInitByValue)
 {
-    Particle particle;
+    Particle particle(HomogeneousMaterial());
 
     ParticleLayout particleDecoration(particle, 2.0);
     auto p_iff = INodeUtils::OnlyChildOfType<IInterferenceFunction>(particleDecoration);
@@ -44,10 +44,10 @@ TEST_F(ParticleLayoutTest, ParticleLayoutAddParticle)
 {
     ParticleLayout particleDecoration;
 
-    Particle particle1;
-    Particle particle2;
-    Particle particle3;
-    Particle particle4;
+    Particle particle1(HomogeneousMaterial());
+    Particle particle2(HomogeneousMaterial());
+    Particle particle3(HomogeneousMaterial());
+    Particle particle4(HomogeneousMaterial());
 
     RotationZ transform3(45. * Units::deg);
     RotationZ transform4(45. * Units::deg);
@@ -81,10 +81,10 @@ TEST_F(ParticleLayoutTest, ParticleLayoutAbundanceFraction)
 {
     ParticleLayout particleDecoration;
 
-    Particle particle1;
-    Particle particle2;
-    Particle particle3;
-    Particle particle4;
+    Particle particle1(HomogeneousMaterial());
+    Particle particle2(HomogeneousMaterial());
+    Particle particle3(HomogeneousMaterial());
+    Particle particle4(HomogeneousMaterial());
 
     RotationY transform3(45. * Units::deg);
     RotationZ transform4(45. * Units::deg);
@@ -100,10 +100,10 @@ TEST_F(ParticleLayoutTest, ParticleLayoutClone)
 {
     ParticleLayout particleDecoration;
 
-    Particle particle1;
-    Particle particle2;
-    Particle particle3;
-    Particle particle4;
+    Particle particle1(HomogeneousMaterial());
+    Particle particle2(HomogeneousMaterial());
+    Particle particle3(HomogeneousMaterial());
+    Particle particle4(HomogeneousMaterial());
 
     RotationY transform3(45. * Units::deg);
     RotationZ transform4(45. * Units::deg);
@@ -167,7 +167,7 @@ TEST_F(ParticleLayoutTest, getChildren)
     std::vector<const INode*> children = layout.getChildren();
     EXPECT_EQ(children.size(), 0u);
 
-    layout.addParticle(Particle());
+    layout.addParticle(Particle(HomogeneousMaterial()));
     layout.setInterferenceFunction(InterferenceFunction1DLattice(1.0, 2.0));
     children = layout.getChildren();
     EXPECT_EQ(children.size(), 2u);
diff --git a/Tests/UnitTests/Core/Sample/ParticleTest.cpp b/Tests/UnitTests/Core/Sample/ParticleTest.cpp
index 67126d09ae9..906d69469eb 100644
--- a/Tests/UnitTests/Core/Sample/ParticleTest.cpp
+++ b/Tests/UnitTests/Core/Sample/ParticleTest.cpp
@@ -11,19 +11,12 @@ class ParticleTest : public ::testing::Test
 {
 };
 
-TEST_F(ParticleTest, InitialState)
-{
-    Particle particle;
-    EXPECT_EQ(HomogeneousMaterial(), *particle.material());
-    EXPECT_EQ(nullptr, particle.createFormFactor());
-    EXPECT_EQ(nullptr, particle.rotation());
-}
-
 TEST_F(ParticleTest, Clone)
 {
-    Particle particle;
+    Material mat = HomogeneousMaterial("Any", 1e-4, 1e-6);
+    Particle particle(mat);
     std::unique_ptr<Particle> clone(particle.clone());
-    EXPECT_EQ(HomogeneousMaterial(), *clone->material());
+    EXPECT_EQ(mat, *clone->material());
     EXPECT_EQ(nullptr, clone->createFormFactor());
     EXPECT_EQ(nullptr, clone->rotation());
 }
@@ -54,20 +47,19 @@ TEST_F(ParticleTest, Constructors)
 
 TEST_F(ParticleTest, setters)
 {
-    Material mat = HomogeneousMaterial("Vacuum", 0, 0);
+    Material mat = HomogeneousMaterial("Any", 10e-2, 10e-5);
     FormFactorFullSphere sphere(2.1);
     RotationY transform(45. * Units::deg);
 
-    Particle particle;
-    Material vacuum = HomogeneousMaterial();
-    EXPECT_EQ(vacuum, *particle.material());
+    Particle particle(mat);
+    EXPECT_EQ(mat, *particle.material());
     EXPECT_EQ(nullptr, particle.rotation());
 
     particle.setRotation(transform);
     EXPECT_TRUE(nullptr != particle.rotation());
 
     std::unique_ptr<Particle> particle2(particle.clone());
-    EXPECT_EQ(vacuum, *particle2->material());
+    EXPECT_EQ(mat, *particle2->material());
     EXPECT_TRUE(nullptr != particle2->rotation());
 }
 
diff --git a/Wrap/swig/fromBase.i b/Wrap/swig/fromBase.i
index 5a7aaee1712..ff5176ecd4a 100644
--- a/Wrap/swig/fromBase.i
+++ b/Wrap/swig/fromBase.i
@@ -1,9 +1,8 @@
 %import(module="libBornAgainBase") "Base/Types/Complex.h"
 %import(module="libBornAgainBase") "Base/Types/ICloneable.h"
 %import(module="libBornAgainBase") "Base/Vector/BasicVector3D.h"
-%import(module="libBornAgainBase") "Base/Vector/Vectors3D.h"%
-%import(module="libBornAgainBase") "Base/Vector/Transform3D.h"
-import(module="libBornAgainBase") "Base/Axis/IAxis.h"
+%import(module="libBornAgainBase") "Base/Vector/Vectors3D.h"
+%import(module="libBornAgainBase") "Base/Axis/IAxis.h"
 
 %template(kvector_t) BasicVector3D<double>;
 %template(vector_kvector_t) std::vector<BasicVector3D<double>>;
diff --git a/Wrap/swig/libBornAgainSample.i b/Wrap/swig/libBornAgainSample.i
index 2f350185ab8..c589fbc0dd6 100644
--- a/Wrap/swig/libBornAgainSample.i
+++ b/Wrap/swig/libBornAgainSample.i
@@ -37,6 +37,8 @@
 %feature("director") IBornFF;    // used in CustomFormFactor.py
 
 %{
+#include "Base/Vector/Transform3D.h"
+
 #include "Sample/Aggregate/IInterferenceFunction.h"
 #include "Sample/Aggregate/InterferenceFunction1DLattice.h"
 #include "Sample/Aggregate/InterferenceFunction2DLattice.h"
@@ -55,6 +57,8 @@
 #include "Sample/Correlations/FTDistributions1D.h"
 #include "Sample/Correlations/FTDistributions2D.h"
 #include "Sample/Correlations/IPeakShape.h"
+#include "Sample/FFCompute/IFormFactorDecorator.h"
+#include "Sample/FFCompute/Rotations.h"
 #include "Sample/HardParticle/FormFactorAnisoPyramid.h"
 #include "Sample/HardParticle/FormFactorBar.h"
 #include "Sample/HardParticle/FormFactorBox.h"
@@ -84,15 +88,13 @@
 #include "Sample/HardParticle/FormFactorTruncatedSpheroid.h"
 #include "Sample/HardParticle/IFormFactorPolyhedron.h"
 #include "Sample/HardParticle/IFormFactorPrism.h"
+#include "Sample/Lattice/BakeLattice.h"
 #include "Sample/Lattice/ISelectionRule.h"
-#include "Sample/Lattice/Lattice3D.h"
 #include "Sample/Lattice/Lattice2D.h"
-#include "Sample/Lattice/BakeLattice.h"
+#include "Sample/Lattice/Lattice3D.h"
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Material/WavevectorInfo.h"
 #include "Sample/Multilayer/Layer.h"
-#include "Sample/Slice/LayerInterface.h"
-#include "Sample/Slice/LayerRoughness.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/Particle/Crystal.h"
 #include "Sample/Particle/FormFactorCrystal.h"
@@ -107,9 +109,9 @@
 #include "Sample/Particle/SlicedParticle.h"
 #include "Sample/RT/SimulationOptions.h"
 #include "Sample/SampleBuilderEngine/ISampleBuilder.h"
-#include "Sample/FFCompute/IFormFactorDecorator.h"
 #include "Sample/Scattering/ISample.h"
-#include "Sample/FFCompute/Rotations.h"
+#include "Sample/Slice/LayerInterface.h"
+#include "Sample/Slice/LayerRoughness.h"
 #include "Sample/SoftParticle/FormFactorGauss.h"
 #include "Sample/SoftParticle/FormFactorSphereGaussianRadius.h"
 #include "Sample/SoftParticle/FormFactorSphereLogNormalRadius.h"
@@ -152,8 +154,8 @@
 %include "Sample/Scattering/ISample.h"
 %include "Sample/Scattering/IFormFactor.h"
 %include "Sample/Scattering/IBornFF.h"
-%include "Sample/FFCompute/IFormFactorDecorator.h"
 
+%include "Sample/FFCompute/IFormFactorDecorator.h"
 %include "Sample/FFCompute/Rotations.h"
 
 %include "Sample/Particle/FormFactorCrystal.h"
@@ -189,8 +191,9 @@
 %include "Sample/Aggregate/InterferenceFunctionTwin.h"
 %include "Sample/Aggregate/ParticleLayout.h"
 
-%include "Sample/Multilayer/Layer.h"
 %include "Sample/Slice/LayerRoughness.h"
+
+%include "Sample/Multilayer/Layer.h"
 %include "Sample/Multilayer/MultiLayer.h"
 
 // SWIG workaround for using axes units the same way as they are used in cpp files
diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i
index bb4b0fbf8de..870fb98e373 100644
--- a/auto/Wrap/doxygenSample.i
+++ b/auto/Wrap/doxygenSample.i
@@ -5828,7 +5828,10 @@ A particle with a form factor and refractive index.
 C++ includes: Particle.h
 ";
 
-%feature("docstring")  Particle::Particle "Particle::Particle()
+%feature("docstring")  Particle::Particle "Particle::Particle()=delete
+";
+
+%feature("docstring")  Particle::~Particle "Particle::~Particle()
 ";
 
 %feature("docstring")  Particle::Particle "Particle::Particle(Material material)
@@ -5861,9 +5864,6 @@ Creates a sliced form factor for this particle.
 Returns nullptr, unless overwritten to return a specific material. 
 ";
 
-%feature("docstring")  Particle::setFormFactor "void Particle::setFormFactor(const IFormFactor &form_factor)
-";
-
 %feature("docstring")  Particle::getChildren "std::vector< const INode * > Particle::getChildren() const override final
 ";
 
@@ -7622,115 +7622,112 @@ C++ includes: ZLimits.h
 ";
 
 
-// File: namespace_0d112.xml
-
+// File: namespace_0d131.xml
 
-// File: namespace_0d115.xml
 
+// File: namespace_0d134.xml
 
-// File: namespace_0d139.xml
 
+// File: namespace_0d158.xml
 
-// File: namespace_0d143.xml
 
-
-// File: namespace_0d147.xml
+// File: namespace_0d16.xml
 
 
-// File: namespace_0d157.xml
+// File: namespace_0d162.xml
 
 
-// File: namespace_0d159.xml
+// File: namespace_0d166.xml
 
 
-// File: namespace_0d16.xml
+// File: namespace_0d176.xml
 
 
-// File: namespace_0d161.xml
+// File: namespace_0d178.xml
 
 
-// File: namespace_0d171.xml
+// File: namespace_0d180.xml
 
 
-// File: namespace_0d191.xml
+// File: namespace_0d190.xml
 
 
-// File: namespace_0d193.xml
+// File: namespace_0d2.xml
 
 
-// File: namespace_0d195.xml
+// File: namespace_0d210.xml
 
 
-// File: namespace_0d2.xml
+// File: namespace_0d212.xml
 
 
-// File: namespace_0d200.xml
+// File: namespace_0d214.xml
 
 
-// File: namespace_0d202.xml
+// File: namespace_0d219.xml
 
 
-// File: namespace_0d212.xml
+// File: namespace_0d221.xml
 
 
-// File: namespace_0d224.xml
+// File: namespace_0d231.xml
 
 
-// File: namespace_0d236.xml
+// File: namespace_0d239.xml
 
 
-// File: namespace_0d242.xml
+// File: namespace_0d243.xml
 
 
 // File: namespace_0d25.xml
 
 
-// File: namespace_0d260.xml
+// File: namespace_0d259.xml
 
 
-// File: namespace_0d268.xml
+// File: namespace_0d267.xml
 
 
-// File: namespace_0d278.xml
+// File: namespace_0d277.xml
 
 
-// File: namespace_0d280.xml
+// File: namespace_0d279.xml
 
 
-// File: namespace_0d282.xml
+// File: namespace_0d281.xml
 
 
-// File: namespace_0d284.xml
+// File: namespace_0d283.xml
 
 
-// File: namespace_0d286.xml
+// File: namespace_0d285.xml
 
 
-// File: namespace_0d290.xml
+// File: namespace_0d289.xml
 
 
-// File: namespace_0d292.xml
+// File: namespace_0d291.xml
 
 
-// File: namespace_0d296.xml
+// File: namespace_0d295.xml
 
 
-// File: namespace_0d308.xml
+// File: namespace_0d307.xml
 
 
 // File: namespace_0d31.xml
 
 
-// File: namespace_0d314.xml
+// File: namespace_0d313.xml
 
 
-// File: namespace_0d318.xml
+// File: namespace_0d317.xml
 
 
-// File: namespace_0d336.xml
+// File: namespace_0d335.xml
 
 
-// File: namespace_0d355.xml
+// File: namespace_0d354.xml
 
 
 // File: namespace_0d37.xml
@@ -7742,6 +7739,9 @@ C++ includes: ZLimits.h
 // File: namespace_0d4.xml
 
 
+// File: namespace_0d47.xml
+
+
 // File: namespacebake.xml
 %feature("docstring")  bake::CubicLattice "Lattice3D bake::CubicLattice(double a)
 
@@ -8047,6 +8047,71 @@ Used by the hard sphere and by several soft sphere classes.
 // File: IPeakShape_8h.xml
 
 
+// File: ComputeBA_8cpp.xml
+
+
+// File: ComputeBA_8h.xml
+
+
+// File: ComputeBAPol_8cpp.xml
+
+
+// File: ComputeBAPol_8h.xml
+
+
+// File: ComputeDWBA_8cpp.xml
+
+
+// File: ComputeDWBA_8h.xml
+
+
+// File: ComputeDWBAPol_8cpp.xml
+
+
+// File: ComputeDWBAPol_8h.xml
+
+
+// File: FormFactorDecoratorMaterial_8cpp.xml
+
+
+// File: FormFactorDecoratorMaterial_8h.xml
+
+
+// File: FormFactorDecoratorPositionFactor_8cpp.xml
+
+
+// File: FormFactorDecoratorPositionFactor_8h.xml
+
+
+// File: FormFactorDecoratorRotation_8cpp.xml
+
+
+// File: FormFactorDecoratorRotation_8h.xml
+
+
+// File: IComputeFF_8cpp.xml
+
+
+// File: IComputeFF_8h.xml
+
+
+// File: IFormFactorDecorator_8h.xml
+
+
+// File: Rotations_8cpp.xml
+%feature("docstring")  createProduct "IRotation* createProduct(const IRotation &left, const IRotation &right)
+
+Returns concatenated rotation (first right, then left). 
+";
+
+
+// File: Rotations_8h.xml
+%feature("docstring")  createProduct "IRotation* createProduct(const IRotation &left, const IRotation &right)
+
+Returns concatenated rotation (first right, then left). 
+";
+
+
 // File: FormFactorCoherentPart_8cpp.xml
 
 
@@ -8682,60 +8747,12 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: SampleProvider_8h.xml
 
 
-// File: ComputeBA_8cpp.xml
-
-
-// File: ComputeBA_8h.xml
-
-
-// File: ComputeBAPol_8cpp.xml
-
-
-// File: ComputeBAPol_8h.xml
-
-
-// File: ComputeDWBA_8cpp.xml
-
-
-// File: ComputeDWBA_8h.xml
-
-
-// File: ComputeDWBAPol_8cpp.xml
-
-
-// File: ComputeDWBAPol_8h.xml
-
-
-// File: FormFactorDecoratorMaterial_8cpp.xml
-
-
-// File: FormFactorDecoratorMaterial_8h.xml
-
-
-// File: FormFactorDecoratorPositionFactor_8cpp.xml
-
-
-// File: FormFactorDecoratorPositionFactor_8h.xml
-
-
-// File: FormFactorDecoratorRotation_8cpp.xml
-
-
-// File: FormFactorDecoratorRotation_8h.xml
-
-
 // File: IBornFF_8cpp.xml
 
 
 // File: IBornFF_8h.xml
 
 
-// File: IComputeFF_8cpp.xml
-
-
-// File: IComputeFF_8h.xml
-
-
 // File: IFormFactor_8cpp.xml
 %feature("docstring")  createTransformedFormFactor "IFormFactor* createTransformedFormFactor(const IFormFactor &formfactor, const IRotation &rot, kvector_t translation)
 ";
@@ -8746,12 +8763,6 @@ Generate z values (equidistant) for use in MaterialProfile.
 ";
 
 
-// File: IFormFactorDecorator_8cpp.xml
-
-
-// File: IFormFactorDecorator_8h.xml
-
-
 // File: ISample_8cpp.xml
 
 
@@ -8764,20 +8775,6 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: LayerFillLimits_8h.xml
 
 
-// File: Rotations_8cpp.xml
-%feature("docstring")  createProduct "IRotation* createProduct(const IRotation &left, const IRotation &right)
-
-Returns concatenated rotation (first right, then left). 
-";
-
-
-// File: Rotations_8h.xml
-%feature("docstring")  createProduct "IRotation* createProduct(const IRotation &left, const IRotation &right)
-
-Returns concatenated rotation (first right, then left). 
-";
-
-
 // File: ZLimits_8cpp.xml
 %feature("docstring")  MinLimit "OneSidedLimit MinLimit(const OneSidedLimit &left, const OneSidedLimit &right)
 ";
@@ -9181,6 +9178,9 @@ Generate vertices of centered ellipse with given semi-axes at height z.
 // File: dir_7b210e8d28f50f0c519681ee1b473363.xml
 
 
+// File: dir_c4c8c79bb34eb89326ea47d04b453458.xml
+
+
 // File: dir_e6ff3e2fec27a07ceb0da6f4d6911ef2.xml
 
 
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index d65fd9ecb97..4dd717bbe17 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -3363,6 +3363,38 @@ def createTransformedFormFactor(formfactor, rot, translation):
 
     """
     return _libBornAgainSample.createTransformedFormFactor(formfactor, rot, translation)
+class SlicingEffects(object):
+    r"""
+
+
+    Nested structure that holds slicing effects on position and removed parts.
+
+    C++ includes: IBornFF.h
+
+    """
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+    position = property(_libBornAgainSample.SlicingEffects_position_get, _libBornAgainSample.SlicingEffects_position_set, doc=r"""position : kvector_t""")
+    dz_bottom = property(_libBornAgainSample.SlicingEffects_dz_bottom_get, _libBornAgainSample.SlicingEffects_dz_bottom_set, doc=r"""dz_bottom : double""")
+    dz_top = property(_libBornAgainSample.SlicingEffects_dz_top_get, _libBornAgainSample.SlicingEffects_dz_top_set, doc=r"""dz_top : double""")
+
+    def __init__(self):
+        r"""
+        __init__(SlicingEffects self) -> SlicingEffects
+
+
+        Nested structure that holds slicing effects on position and removed parts.
+
+        C++ includes: IBornFF.h
+
+        """
+        _libBornAgainSample.SlicingEffects_swiginit(self, _libBornAgainSample.new_SlicingEffects())
+    __swig_destroy__ = _libBornAgainSample.delete_SlicingEffects
+
+# Register SlicingEffects in _libBornAgainSample:
+_libBornAgainSample.SlicingEffects_swigregister(SlicingEffects)
+
 class IBornFF(IFormFactor):
     r"""
 
@@ -3467,38 +3499,6 @@ class IBornFF(IFormFactor):
 # Register IBornFF in _libBornAgainSample:
 _libBornAgainSample.IBornFF_swigregister(IBornFF)
 
-class SlicingEffects(object):
-    r"""
-
-
-    Nested structure that holds slicing effects on position and removed parts.
-
-    C++ includes: IBornFF.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-    position = property(_libBornAgainSample.SlicingEffects_position_get, _libBornAgainSample.SlicingEffects_position_set, doc=r"""position : kvector_t""")
-    dz_bottom = property(_libBornAgainSample.SlicingEffects_dz_bottom_get, _libBornAgainSample.SlicingEffects_dz_bottom_set, doc=r"""dz_bottom : double""")
-    dz_top = property(_libBornAgainSample.SlicingEffects_dz_top_get, _libBornAgainSample.SlicingEffects_dz_top_set, doc=r"""dz_top : double""")
-
-    def __init__(self):
-        r"""
-        __init__(SlicingEffects self) -> SlicingEffects
-
-
-        Nested structure that holds slicing effects on position and removed parts.
-
-        C++ includes: IBornFF.h
-
-        """
-        _libBornAgainSample.SlicingEffects_swiginit(self, _libBornAgainSample.new_SlicingEffects())
-    __swig_destroy__ = _libBornAgainSample.delete_SlicingEffects
-
-# Register SlicingEffects in _libBornAgainSample:
-_libBornAgainSample.SlicingEffects_swigregister(SlicingEffects)
-
 class IFormFactorDecorator(IFormFactor):
     r"""
 
@@ -4662,10 +4662,10 @@ class Particle(IParticle):
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainSample.delete_Particle
 
     def __init__(self, *args):
         r"""
-        __init__(Particle self) -> Particle
         __init__(Particle self, Material material) -> Particle
         __init__(Particle self, Material material, IFormFactor form_factor) -> Particle
         __init__(Particle self, Material material, IFormFactor form_factor, IRotation rotation) -> Particle
@@ -4720,14 +4720,6 @@ class Particle(IParticle):
         """
         return _libBornAgainSample.Particle_material(self)
 
-    def setFormFactor(self, form_factor):
-        r"""
-        setFormFactor(Particle self, IFormFactor form_factor)
-        void Particle::setFormFactor(const IFormFactor &form_factor)
-
-        """
-        return _libBornAgainSample.Particle_setFormFactor(self, form_factor)
-
     def getChildren(self):
         r"""
         getChildren(Particle self) -> swig_dummy_type_const_inode_vector
@@ -4735,7 +4727,6 @@ class Particle(IParticle):
 
         """
         return _libBornAgainSample.Particle_getChildren(self)
-    __swig_destroy__ = _libBornAgainSample.delete_Particle
 
 # Register Particle in _libBornAgainSample:
 _libBornAgainSample.Particle_swigregister(Particle)
@@ -8113,6 +8104,136 @@ class ParticleLayout(ISample):
 # Register ParticleLayout in _libBornAgainSample:
 _libBornAgainSample.ParticleLayout_swigregister(ParticleLayout)
 
+class LayerRoughness(ISample):
+    r"""
+
+
+    A roughness of interface between two layers.
+
+    Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 "X-ray reflection and transmission by rough surfaces"
+
+    C++ includes: LayerRoughness.h
+
+    """
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        r"""
+        __init__(LayerRoughness self, double sigma, double hurstParameter, double lateralCorrLength) -> LayerRoughness
+        __init__(LayerRoughness self) -> LayerRoughness
+        LayerRoughness::LayerRoughness()
+
+        """
+        _libBornAgainSample.LayerRoughness_swiginit(self, _libBornAgainSample.new_LayerRoughness(*args))
+
+    def clone(self):
+        r"""
+        clone(LayerRoughness self) -> LayerRoughness
+        LayerRoughness* LayerRoughness::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainSample.LayerRoughness_clone(self)
+
+    def accept(self, visitor):
+        r"""
+        accept(LayerRoughness self, INodeVisitor * visitor)
+        virtual void LayerRoughness::accept(INodeVisitor *visitor) const
+
+        """
+        return _libBornAgainSample.LayerRoughness_accept(self, visitor)
+
+    def getSpectralFun(self, kvec):
+        r"""
+        getSpectralFun(LayerRoughness self, kvector_t kvec) -> double
+        double LayerRoughness::getSpectralFun(const kvector_t kvec) const
+
+        Returns power spectral density of the surface roughness.
+
+        Power spectral density of the surface roughness is a result of two-dimensional Fourier transform of the correlation function of the roughness profile.
+
+        Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 "X-ray reflection and transmission by rough surfaces" 
+
+        """
+        return _libBornAgainSample.LayerRoughness_getSpectralFun(self, kvec)
+
+    def getCorrFun(self, k):
+        r"""
+        getCorrFun(LayerRoughness self, kvector_t k) -> double
+        double LayerRoughness::getCorrFun(const kvector_t k) const
+
+        Correlation function of the roughness profile. 
+
+        """
+        return _libBornAgainSample.LayerRoughness_getCorrFun(self, k)
+
+    def setSigma(self, sigma):
+        r"""
+        setSigma(LayerRoughness self, double sigma)
+        void LayerRoughness::setSigma(double sigma)
+
+        Sets rms of roughness. 
+
+        """
+        return _libBornAgainSample.LayerRoughness_setSigma(self, sigma)
+
+    def getSigma(self):
+        r"""
+        getSigma(LayerRoughness self) -> double
+        double LayerRoughness::getSigma() const
+
+        Returns rms of roughness. 
+
+        """
+        return _libBornAgainSample.LayerRoughness_getSigma(self)
+
+    def setHurstParameter(self, hurstParameter):
+        r"""
+        setHurstParameter(LayerRoughness self, double hurstParameter)
+        void LayerRoughness::setHurstParameter(double hurstParameter)
+
+        Sets hurst parameter. It describes how jagged the surface is. 
+
+        """
+        return _libBornAgainSample.LayerRoughness_setHurstParameter(self, hurstParameter)
+
+    def getHurstParameter(self):
+        r"""
+        getHurstParameter(LayerRoughness self) -> double
+        double LayerRoughness::getHurstParameter() const
+
+        Returns hurst parameter. 
+
+        """
+        return _libBornAgainSample.LayerRoughness_getHurstParameter(self)
+
+    def setLatteralCorrLength(self, lateralCorrLength):
+        r"""
+        setLatteralCorrLength(LayerRoughness self, double lateralCorrLength)
+        void LayerRoughness::setLatteralCorrLength(double lateralCorrLength)
+
+        Sets lateral correlation length. 
+
+        """
+        return _libBornAgainSample.LayerRoughness_setLatteralCorrLength(self, lateralCorrLength)
+
+    def getLatteralCorrLength(self):
+        r"""
+        getLatteralCorrLength(LayerRoughness self) -> double
+        double LayerRoughness::getLatteralCorrLength() const
+
+        Returns lateral correlation length. 
+
+        """
+        return _libBornAgainSample.LayerRoughness_getLatteralCorrLength(self)
+    __swig_destroy__ = _libBornAgainSample.delete_LayerRoughness
+
+# Register LayerRoughness in _libBornAgainSample:
+_libBornAgainSample.LayerRoughness_swigregister(LayerRoughness)
+
 class Layer(ISample):
     r"""
 
@@ -8259,136 +8380,6 @@ class Layer(ISample):
 # Register Layer in _libBornAgainSample:
 _libBornAgainSample.Layer_swigregister(Layer)
 
-class LayerRoughness(ISample):
-    r"""
-
-
-    A roughness of interface between two layers.
-
-    Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 "X-ray reflection and transmission by rough surfaces"
-
-    C++ includes: LayerRoughness.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
-    def __init__(self, *args):
-        r"""
-        __init__(LayerRoughness self, double sigma, double hurstParameter, double lateralCorrLength) -> LayerRoughness
-        __init__(LayerRoughness self) -> LayerRoughness
-        LayerRoughness::LayerRoughness()
-
-        """
-        _libBornAgainSample.LayerRoughness_swiginit(self, _libBornAgainSample.new_LayerRoughness(*args))
-
-    def clone(self):
-        r"""
-        clone(LayerRoughness self) -> LayerRoughness
-        LayerRoughness* LayerRoughness::clone() const
-
-        Returns a clone of this  ISample object. 
-
-        """
-        return _libBornAgainSample.LayerRoughness_clone(self)
-
-    def accept(self, visitor):
-        r"""
-        accept(LayerRoughness self, INodeVisitor * visitor)
-        virtual void LayerRoughness::accept(INodeVisitor *visitor) const
-
-        """
-        return _libBornAgainSample.LayerRoughness_accept(self, visitor)
-
-    def getSpectralFun(self, kvec):
-        r"""
-        getSpectralFun(LayerRoughness self, kvector_t kvec) -> double
-        double LayerRoughness::getSpectralFun(const kvector_t kvec) const
-
-        Returns power spectral density of the surface roughness.
-
-        Power spectral density of the surface roughness is a result of two-dimensional Fourier transform of the correlation function of the roughness profile.
-
-        Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 "X-ray reflection and transmission by rough surfaces" 
-
-        """
-        return _libBornAgainSample.LayerRoughness_getSpectralFun(self, kvec)
-
-    def getCorrFun(self, k):
-        r"""
-        getCorrFun(LayerRoughness self, kvector_t k) -> double
-        double LayerRoughness::getCorrFun(const kvector_t k) const
-
-        Correlation function of the roughness profile. 
-
-        """
-        return _libBornAgainSample.LayerRoughness_getCorrFun(self, k)
-
-    def setSigma(self, sigma):
-        r"""
-        setSigma(LayerRoughness self, double sigma)
-        void LayerRoughness::setSigma(double sigma)
-
-        Sets rms of roughness. 
-
-        """
-        return _libBornAgainSample.LayerRoughness_setSigma(self, sigma)
-
-    def getSigma(self):
-        r"""
-        getSigma(LayerRoughness self) -> double
-        double LayerRoughness::getSigma() const
-
-        Returns rms of roughness. 
-
-        """
-        return _libBornAgainSample.LayerRoughness_getSigma(self)
-
-    def setHurstParameter(self, hurstParameter):
-        r"""
-        setHurstParameter(LayerRoughness self, double hurstParameter)
-        void LayerRoughness::setHurstParameter(double hurstParameter)
-
-        Sets hurst parameter. It describes how jagged the surface is. 
-
-        """
-        return _libBornAgainSample.LayerRoughness_setHurstParameter(self, hurstParameter)
-
-    def getHurstParameter(self):
-        r"""
-        getHurstParameter(LayerRoughness self) -> double
-        double LayerRoughness::getHurstParameter() const
-
-        Returns hurst parameter. 
-
-        """
-        return _libBornAgainSample.LayerRoughness_getHurstParameter(self)
-
-    def setLatteralCorrLength(self, lateralCorrLength):
-        r"""
-        setLatteralCorrLength(LayerRoughness self, double lateralCorrLength)
-        void LayerRoughness::setLatteralCorrLength(double lateralCorrLength)
-
-        Sets lateral correlation length. 
-
-        """
-        return _libBornAgainSample.LayerRoughness_setLatteralCorrLength(self, lateralCorrLength)
-
-    def getLatteralCorrLength(self):
-        r"""
-        getLatteralCorrLength(LayerRoughness self) -> double
-        double LayerRoughness::getLatteralCorrLength() const
-
-        Returns lateral correlation length. 
-
-        """
-        return _libBornAgainSample.LayerRoughness_getLatteralCorrLength(self)
-    __swig_destroy__ = _libBornAgainSample.delete_LayerRoughness
-
-# Register LayerRoughness in _libBornAgainSample:
-_libBornAgainSample.LayerRoughness_swigregister(LayerRoughness)
-
 class MultiLayer(ISample):
     r"""
 
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index cf1cef77418..ebd4b80beb2 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -6788,6 +6788,8 @@ SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std
 SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_0(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::value_type const &x){ return self->insert(pos, x); }
 SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_1(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::size_type n,std::vector< std::pair< double,double > >::value_type const &x){ self->insert(pos, n, x); }
 
+#include "Base/Vector/Transform3D.h"
+
 #include "Sample/Aggregate/IInterferenceFunction.h"
 #include "Sample/Aggregate/InterferenceFunction1DLattice.h"
 #include "Sample/Aggregate/InterferenceFunction2DLattice.h"
@@ -6806,6 +6808,8 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Sample/Correlations/FTDistributions1D.h"
 #include "Sample/Correlations/FTDistributions2D.h"
 #include "Sample/Correlations/IPeakShape.h"
+#include "Sample/FFCompute/IFormFactorDecorator.h"
+#include "Sample/FFCompute/Rotations.h"
 #include "Sample/HardParticle/FormFactorAnisoPyramid.h"
 #include "Sample/HardParticle/FormFactorBar.h"
 #include "Sample/HardParticle/FormFactorBox.h"
@@ -6835,15 +6839,13 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Sample/HardParticle/FormFactorTruncatedSpheroid.h"
 #include "Sample/HardParticle/IFormFactorPolyhedron.h"
 #include "Sample/HardParticle/IFormFactorPrism.h"
+#include "Sample/Lattice/BakeLattice.h"
 #include "Sample/Lattice/ISelectionRule.h"
-#include "Sample/Lattice/Lattice3D.h"
 #include "Sample/Lattice/Lattice2D.h"
-#include "Sample/Lattice/BakeLattice.h"
+#include "Sample/Lattice/Lattice3D.h"
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Material/WavevectorInfo.h"
 #include "Sample/Multilayer/Layer.h"
-#include "Sample/Slice/LayerInterface.h"
-#include "Sample/Slice/LayerRoughness.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/Particle/Crystal.h"
 #include "Sample/Particle/FormFactorCrystal.h"
@@ -6858,9 +6860,9 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Sample/Particle/SlicedParticle.h"
 #include "Sample/RT/SimulationOptions.h"
 #include "Sample/SampleBuilderEngine/ISampleBuilder.h"
-#include "Sample/Scattering/IFormFactorDecorator.h"
 #include "Sample/Scattering/ISample.h"
-#include "Sample/Scattering/Rotations.h"
+#include "Sample/Slice/LayerInterface.h"
+#include "Sample/Slice/LayerRoughness.h"
 #include "Sample/SoftParticle/FormFactorGauss.h"
 #include "Sample/SoftParticle/FormFactorSphereGaussianRadius.h"
 #include "Sample/SoftParticle/FormFactorSphereLogNormalRadius.h"
@@ -39388,6 +39390,208 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_SlicingEffects_position_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
+  kvector_t *arg2 = (kvector_t *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SlicingEffects_position_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_position_set" "', argument " "1"" of type '" "SlicingEffects *""'"); 
+  }
+  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SlicingEffects_position_set" "', argument " "2"" of type '" "kvector_t *""'"); 
+  }
+  arg2 = reinterpret_cast< kvector_t * >(argp2);
+  if (arg1) (arg1)->position = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SlicingEffects_position_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  kvector_t *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_position_get" "', argument " "1"" of type '" "SlicingEffects *""'"); 
+  }
+  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
+  result = (kvector_t *)& ((arg1)->position);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SlicingEffects_dz_bottom_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SlicingEffects_dz_bottom_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_dz_bottom_set" "', argument " "1"" of type '" "SlicingEffects *""'"); 
+  }
+  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SlicingEffects_dz_bottom_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->dz_bottom = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SlicingEffects_dz_bottom_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_dz_bottom_get" "', argument " "1"" of type '" "SlicingEffects *""'"); 
+  }
+  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
+  result = (double) ((arg1)->dz_bottom);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SlicingEffects_dz_top_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SlicingEffects_dz_top_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_dz_top_set" "', argument " "1"" of type '" "SlicingEffects *""'"); 
+  }
+  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SlicingEffects_dz_top_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->dz_top = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SlicingEffects_dz_top_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_dz_top_get" "', argument " "1"" of type '" "SlicingEffects *""'"); 
+  }
+  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
+  result = (double) ((arg1)->dz_top);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SlicingEffects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SlicingEffects *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_SlicingEffects", 0, 0, 0)) SWIG_fail;
+  result = (SlicingEffects *)new SlicingEffects();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SlicingEffects, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SlicingEffects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SlicingEffects" "', argument " "1"" of type '" "SlicingEffects *""'"); 
+  }
+  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SlicingEffects_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SlicingEffects, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *SlicingEffects_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
 SWIGINTERN PyObject *_wrap_new_IBornFF__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   PyObject *arg1 = (PyObject *) 0 ;
@@ -39973,208 +40177,6 @@ SWIGINTERN PyObject *IBornFF_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_SlicingEffects_position_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
-  kvector_t *arg2 = (kvector_t *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "SlicingEffects_position_set", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_position_set" "', argument " "1"" of type '" "SlicingEffects *""'"); 
-  }
-  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SlicingEffects_position_set" "', argument " "2"" of type '" "kvector_t *""'"); 
-  }
-  arg2 = reinterpret_cast< kvector_t * >(argp2);
-  if (arg1) (arg1)->position = *arg2;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SlicingEffects_position_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  kvector_t *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_position_get" "', argument " "1"" of type '" "SlicingEffects *""'"); 
-  }
-  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
-  result = (kvector_t *)& ((arg1)->position);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SlicingEffects_dz_bottom_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "SlicingEffects_dz_bottom_set", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_dz_bottom_set" "', argument " "1"" of type '" "SlicingEffects *""'"); 
-  }
-  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SlicingEffects_dz_bottom_set" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  if (arg1) (arg1)->dz_bottom = arg2;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SlicingEffects_dz_bottom_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_dz_bottom_get" "', argument " "1"" of type '" "SlicingEffects *""'"); 
-  }
-  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
-  result = (double) ((arg1)->dz_bottom);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SlicingEffects_dz_top_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "SlicingEffects_dz_top_set", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_dz_top_set" "', argument " "1"" of type '" "SlicingEffects *""'"); 
-  }
-  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SlicingEffects_dz_top_set" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  if (arg1) (arg1)->dz_top = arg2;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_SlicingEffects_dz_top_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SlicingEffects_dz_top_get" "', argument " "1"" of type '" "SlicingEffects *""'"); 
-  }
-  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
-  result = (double) ((arg1)->dz_top);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_SlicingEffects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SlicingEffects *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "new_SlicingEffects", 0, 0, 0)) SWIG_fail;
-  result = (SlicingEffects *)new SlicingEffects();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SlicingEffects, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_SlicingEffects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  SlicingEffects *arg1 = (SlicingEffects *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SlicingEffects, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SlicingEffects" "', argument " "1"" of type '" "SlicingEffects *""'"); 
-  }
-  arg1 = reinterpret_cast< SlicingEffects * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *SlicingEffects_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_SlicingEffects, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *SlicingEffects_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_delete_IFormFactorDecorator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IFormFactorDecorator *arg1 = (IFormFactorDecorator *) 0 ;
@@ -44056,20 +44058,29 @@ SWIGINTERN PyObject *MesoCrystal_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObje
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_Particle__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+SWIGINTERN PyObject *_wrap_delete_Particle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Particle *result = 0 ;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
   
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (Particle *)new Particle();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, SWIG_POINTER_NEW |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Particle, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Particle" "', argument " "1"" of type '" "Particle *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_Particle__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_Particle__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SwigValueWrapper< Material > arg1 ;
   void *argp1 ;
@@ -44098,7 +44109,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_Particle__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_Particle__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SwigValueWrapper< Material > arg1 ;
   IFormFactor *arg2 = 0 ;
@@ -44138,7 +44149,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_Particle__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_Particle__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SwigValueWrapper< Material > arg1 ;
   IFormFactor *arg2 = 0 ;
@@ -44197,15 +44208,12 @@ SWIGINTERN PyObject *_wrap_new_Particle(PyObject *self, PyObject *args) {
   
   if (!(argc = SWIG_Python_UnpackTuple(args, "new_Particle", 0, 3, argv))) SWIG_fail;
   --argc;
-  if (argc == 0) {
-    return _wrap_new_Particle__SWIG_0(self, argc, argv);
-  }
   if (argc == 1) {
     int _v;
     int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Material, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      return _wrap_new_Particle__SWIG_1(self, argc, argv);
+      return _wrap_new_Particle__SWIG_0(self, argc, argv);
     }
   }
   if (argc == 2) {
@@ -44216,7 +44224,7 @@ SWIGINTERN PyObject *_wrap_new_Particle(PyObject *self, PyObject *args) {
       int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IFormFactor, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_new_Particle__SWIG_2(self, argc, argv);
+        return _wrap_new_Particle__SWIG_1(self, argc, argv);
       }
     }
   }
@@ -44231,7 +44239,7 @@ SWIGINTERN PyObject *_wrap_new_Particle(PyObject *self, PyObject *args) {
         int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IRotation, SWIG_POINTER_NO_NULL | 0);
         _v = SWIG_CheckState(res);
         if (_v) {
-          return _wrap_new_Particle__SWIG_3(self, argc, argv);
+          return _wrap_new_Particle__SWIG_2(self, argc, argv);
         }
       }
     }
@@ -44240,7 +44248,6 @@ SWIGINTERN PyObject *_wrap_new_Particle(PyObject *self, PyObject *args) {
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_Particle'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    Particle::Particle()\n"
     "    Particle::Particle(Material)\n"
     "    Particle::Particle(Material,IFormFactor const &)\n"
     "    Particle::Particle(Material,IFormFactor const &,IRotation const &)\n");
@@ -44400,38 +44407,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Particle_setFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Particle *arg1 = (Particle *) 0 ;
-  IFormFactor *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "Particle_setFormFactor", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Particle, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_setFormFactor" "', argument " "1"" of type '" "Particle *""'"); 
-  }
-  arg1 = reinterpret_cast< Particle * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IFormFactor,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Particle_setFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Particle_setFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
-  }
-  arg2 = reinterpret_cast< IFormFactor * >(argp2);
-  (arg1)->setFormFactor((IFormFactor const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_Particle_getChildren(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Particle *arg1 = (Particle *) 0 ;
@@ -44455,28 +44430,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_Particle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Particle *arg1 = (Particle *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Particle, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Particle" "', argument " "1"" of type '" "Particle *""'"); 
-  }
-  arg1 = reinterpret_cast< Particle * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *Particle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -55934,6 +55887,416 @@ SWIGINTERN PyObject *ParticleLayout_swiginit(PyObject *SWIGUNUSEDPARM(self), PyO
   return SWIG_Python_InitShadowInstance(args);
 }
 
+SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  LayerRoughness *result = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_LayerRoughness" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_LayerRoughness" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_LayerRoughness" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (LayerRoughness *)new LayerRoughness(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  LayerRoughness *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (LayerRoughness *)new LayerRoughness();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_LayerRoughness", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_LayerRoughness__SWIG_1(self, argc, argv);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_LayerRoughness__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_LayerRoughness'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    LayerRoughness::LayerRoughness(double,double,double)\n"
+    "    LayerRoughness::LayerRoughness()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  LayerRoughness *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_clone" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  result = (LayerRoughness *)((LayerRoughness const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  INodeVisitor *arg2 = (INodeVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_accept", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_accept" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
+  ((LayerRoughness const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getSpectralFun(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  double result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_getSpectralFun", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getSpectralFun" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_getSpectralFun" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LayerRoughness_getSpectralFun" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((LayerRoughness const *)arg1)->getSpectralFun(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getCorrFun(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  double result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_getCorrFun", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getCorrFun" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_getCorrFun" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LayerRoughness_getCorrFun" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((LayerRoughness const *)arg1)->getCorrFun(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_setSigma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_setSigma", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setSigma" "', argument " "1"" of type '" "LayerRoughness *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "LayerRoughness_setSigma" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setSigma(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getSigma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getSigma" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  result = (double)((LayerRoughness const *)arg1)->getSigma();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_setHurstParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_setHurstParameter", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setHurstParameter" "', argument " "1"" of type '" "LayerRoughness *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "LayerRoughness_setHurstParameter" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setHurstParameter(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getHurstParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getHurstParameter" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  result = (double)((LayerRoughness const *)arg1)->getHurstParameter();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_setLatteralCorrLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_setLatteralCorrLength", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setLatteralCorrLength" "', argument " "1"" of type '" "LayerRoughness *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "LayerRoughness_setLatteralCorrLength" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setLatteralCorrLength(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getLatteralCorrLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getLatteralCorrLength" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  result = (double)((LayerRoughness const *)arg1)->getLatteralCorrLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_LayerRoughness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_LayerRoughness" "', argument " "1"" of type '" "LayerRoughness *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *LayerRoughness_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_LayerRoughness, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *LayerRoughness_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
 SWIGINTERN PyObject *_wrap_new_Layer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SwigValueWrapper< Material > arg1 ;
@@ -56480,416 +56843,6 @@ SWIGINTERN PyObject *Layer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *ar
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double arg3 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  LayerRoughness *result = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_LayerRoughness" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_LayerRoughness" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_LayerRoughness" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (LayerRoughness *)new LayerRoughness(arg1,arg2,arg3);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
-  PyObject *resultobj = 0;
-  LayerRoughness *result = 0 ;
-  
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (LayerRoughness *)new LayerRoughness();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_LayerRoughness", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 0) {
-    return _wrap_new_LayerRoughness__SWIG_1(self, argc, argv);
-  }
-  if (argc == 3) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_new_LayerRoughness__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_LayerRoughness'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    LayerRoughness::LayerRoughness(double,double,double)\n"
-    "    LayerRoughness::LayerRoughness()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  LayerRoughness *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_clone" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  result = (LayerRoughness *)((LayerRoughness const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  INodeVisitor *arg2 = (INodeVisitor *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_accept" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
-  }
-  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((LayerRoughness const *)arg1)->accept(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_getSpectralFun(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  kvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_getSpectralFun", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getSpectralFun" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_getSpectralFun" "', argument " "2"" of type '" "kvector_t const""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LayerRoughness_getSpectralFun" "', argument " "2"" of type '" "kvector_t const""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  result = (double)((LayerRoughness const *)arg1)->getSpectralFun(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_getCorrFun(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  kvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_getCorrFun", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getCorrFun" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_getCorrFun" "', argument " "2"" of type '" "kvector_t const""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LayerRoughness_getCorrFun" "', argument " "2"" of type '" "kvector_t const""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  result = (double)((LayerRoughness const *)arg1)->getCorrFun(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_setSigma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_setSigma", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setSigma" "', argument " "1"" of type '" "LayerRoughness *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "LayerRoughness_setSigma" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setSigma(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_getSigma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getSigma" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  result = (double)((LayerRoughness const *)arg1)->getSigma();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_setHurstParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_setHurstParameter", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setHurstParameter" "', argument " "1"" of type '" "LayerRoughness *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "LayerRoughness_setHurstParameter" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setHurstParameter(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_getHurstParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getHurstParameter" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  result = (double)((LayerRoughness const *)arg1)->getHurstParameter();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_setLatteralCorrLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_setLatteralCorrLength", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setLatteralCorrLength" "', argument " "1"" of type '" "LayerRoughness *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "LayerRoughness_setLatteralCorrLength" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  (arg1)->setLatteralCorrLength(arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_LayerRoughness_getLatteralCorrLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getLatteralCorrLength" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  result = (double)((LayerRoughness const *)arg1)->getLatteralCorrLength();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_LayerRoughness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_LayerRoughness" "', argument " "1"" of type '" "LayerRoughness *""'"); 
-  }
-  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *LayerRoughness_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_LayerRoughness, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *LayerRoughness_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_new_MultiLayer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   MultiLayer *result = 0 ;
@@ -70601,6 +70554,24 @@ static PyMethodDef SwigMethods[] = {
 		"IFormFactor* createTransformedFormFactor(const IFormFactor &formfactor, const IRotation &rot, kvector_t translation)\n"
 		"\n"
 		""},
+	 { "SlicingEffects_position_set", _wrap_SlicingEffects_position_set, METH_VARARGS, "SlicingEffects_position_set(SlicingEffects self, kvector_t position)"},
+	 { "SlicingEffects_position_get", _wrap_SlicingEffects_position_get, METH_O, "SlicingEffects_position_get(SlicingEffects self) -> kvector_t"},
+	 { "SlicingEffects_dz_bottom_set", _wrap_SlicingEffects_dz_bottom_set, METH_VARARGS, "SlicingEffects_dz_bottom_set(SlicingEffects self, double dz_bottom)"},
+	 { "SlicingEffects_dz_bottom_get", _wrap_SlicingEffects_dz_bottom_get, METH_O, "SlicingEffects_dz_bottom_get(SlicingEffects self) -> double"},
+	 { "SlicingEffects_dz_top_set", _wrap_SlicingEffects_dz_top_set, METH_VARARGS, "SlicingEffects_dz_top_set(SlicingEffects self, double dz_top)"},
+	 { "SlicingEffects_dz_top_get", _wrap_SlicingEffects_dz_top_get, METH_O, "SlicingEffects_dz_top_get(SlicingEffects self) -> double"},
+	 { "new_SlicingEffects", _wrap_new_SlicingEffects, METH_NOARGS, "\n"
+		"new_SlicingEffects() -> SlicingEffects\n"
+		"\n"
+		"\n"
+		"Nested structure that holds slicing effects on position and removed parts.\n"
+		"\n"
+		"C++ includes: IBornFF.h\n"
+		"\n"
+		""},
+	 { "delete_SlicingEffects", _wrap_delete_SlicingEffects, METH_O, "delete_SlicingEffects(SlicingEffects self)"},
+	 { "SlicingEffects_swigregister", SlicingEffects_swigregister, METH_O, NULL},
+	 { "SlicingEffects_swiginit", SlicingEffects_swiginit, METH_VARARGS, NULL},
 	 { "new_IBornFF", _wrap_new_IBornFF, METH_VARARGS, "\n"
 		"IBornFF()\n"
 		"new_IBornFF(PyObject * _self, NodeMeta meta, vdouble1d_t PValues) -> IBornFF\n"
@@ -70659,24 +70630,6 @@ static PyMethodDef SwigMethods[] = {
 	 { "IBornFF_sliceFormFactor", _wrap_IBornFF_sliceFormFactor, METH_VARARGS, "IBornFF_sliceFormFactor(IBornFF self, ZLimits limits, IRotation rot, kvector_t translation) -> IFormFactor"},
 	 { "IBornFF_swigregister", IBornFF_swigregister, METH_O, NULL},
 	 { "IBornFF_swiginit", IBornFF_swiginit, METH_VARARGS, NULL},
-	 { "SlicingEffects_position_set", _wrap_SlicingEffects_position_set, METH_VARARGS, "SlicingEffects_position_set(SlicingEffects self, kvector_t position)"},
-	 { "SlicingEffects_position_get", _wrap_SlicingEffects_position_get, METH_O, "SlicingEffects_position_get(SlicingEffects self) -> kvector_t"},
-	 { "SlicingEffects_dz_bottom_set", _wrap_SlicingEffects_dz_bottom_set, METH_VARARGS, "SlicingEffects_dz_bottom_set(SlicingEffects self, double dz_bottom)"},
-	 { "SlicingEffects_dz_bottom_get", _wrap_SlicingEffects_dz_bottom_get, METH_O, "SlicingEffects_dz_bottom_get(SlicingEffects self) -> double"},
-	 { "SlicingEffects_dz_top_set", _wrap_SlicingEffects_dz_top_set, METH_VARARGS, "SlicingEffects_dz_top_set(SlicingEffects self, double dz_top)"},
-	 { "SlicingEffects_dz_top_get", _wrap_SlicingEffects_dz_top_get, METH_O, "SlicingEffects_dz_top_get(SlicingEffects self) -> double"},
-	 { "new_SlicingEffects", _wrap_new_SlicingEffects, METH_NOARGS, "\n"
-		"new_SlicingEffects() -> SlicingEffects\n"
-		"\n"
-		"\n"
-		"Nested structure that holds slicing effects on position and removed parts.\n"
-		"\n"
-		"C++ includes: IBornFF.h\n"
-		"\n"
-		""},
-	 { "delete_SlicingEffects", _wrap_delete_SlicingEffects, METH_O, "delete_SlicingEffects(SlicingEffects self)"},
-	 { "SlicingEffects_swigregister", SlicingEffects_swigregister, METH_O, NULL},
-	 { "SlicingEffects_swiginit", SlicingEffects_swiginit, METH_VARARGS, NULL},
 	 { "delete_IFormFactorDecorator", _wrap_delete_IFormFactorDecorator, METH_O, "\n"
 		"delete_IFormFactorDecorator(IFormFactorDecorator self)\n"
 		"IFormFactorDecorator::~IFormFactorDecorator() override\n"
@@ -71350,8 +71303,12 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "MesoCrystal_swigregister", MesoCrystal_swigregister, METH_O, NULL},
 	 { "MesoCrystal_swiginit", MesoCrystal_swiginit, METH_VARARGS, NULL},
+	 { "delete_Particle", _wrap_delete_Particle, METH_O, "\n"
+		"delete_Particle(Particle self)\n"
+		"Particle::~Particle()\n"
+		"\n"
+		""},
 	 { "new_Particle", _wrap_new_Particle, METH_VARARGS, "\n"
-		"Particle()\n"
 		"Particle(Material material)\n"
 		"Particle(Material material, IFormFactor form_factor)\n"
 		"new_Particle(Material material, IFormFactor form_factor, IRotation rotation) -> Particle\n"
@@ -71389,17 +71346,11 @@ static PyMethodDef SwigMethods[] = {
 		"Returns nullptr, unless overwritten to return a specific material. \n"
 		"\n"
 		""},
-	 { "Particle_setFormFactor", _wrap_Particle_setFormFactor, METH_VARARGS, "\n"
-		"Particle_setFormFactor(Particle self, IFormFactor form_factor)\n"
-		"void Particle::setFormFactor(const IFormFactor &form_factor)\n"
-		"\n"
-		""},
 	 { "Particle_getChildren", _wrap_Particle_getChildren, METH_O, "\n"
 		"Particle_getChildren(Particle self) -> swig_dummy_type_const_inode_vector\n"
 		"std::vector< const INode * > Particle::getChildren() const override final\n"
 		"\n"
 		""},
-	 { "delete_Particle", _wrap_delete_Particle, METH_O, "delete_Particle(Particle self)"},
 	 { "Particle_swigregister", Particle_swigregister, METH_O, NULL},
 	 { "Particle_swiginit", Particle_swiginit, METH_VARARGS, NULL},
 	 { "new_ParticleComposition", _wrap_new_ParticleComposition, METH_VARARGS, "\n"
@@ -73357,6 +73308,87 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "ParticleLayout_swigregister", ParticleLayout_swigregister, METH_O, NULL},
 	 { "ParticleLayout_swiginit", ParticleLayout_swiginit, METH_VARARGS, NULL},
+	 { "new_LayerRoughness", _wrap_new_LayerRoughness, METH_VARARGS, "\n"
+		"LayerRoughness(double sigma, double hurstParameter, double lateralCorrLength)\n"
+		"new_LayerRoughness() -> LayerRoughness\n"
+		"LayerRoughness::LayerRoughness()\n"
+		"\n"
+		""},
+	 { "LayerRoughness_clone", _wrap_LayerRoughness_clone, METH_O, "\n"
+		"LayerRoughness_clone(LayerRoughness self) -> LayerRoughness\n"
+		"LayerRoughness* LayerRoughness::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { "LayerRoughness_accept", _wrap_LayerRoughness_accept, METH_VARARGS, "\n"
+		"LayerRoughness_accept(LayerRoughness self, INodeVisitor * visitor)\n"
+		"virtual void LayerRoughness::accept(INodeVisitor *visitor) const\n"
+		"\n"
+		""},
+	 { "LayerRoughness_getSpectralFun", _wrap_LayerRoughness_getSpectralFun, METH_VARARGS, "\n"
+		"LayerRoughness_getSpectralFun(LayerRoughness self, kvector_t kvec) -> double\n"
+		"double LayerRoughness::getSpectralFun(const kvector_t kvec) const\n"
+		"\n"
+		"Returns power spectral density of the surface roughness.\n"
+		"\n"
+		"Power spectral density of the surface roughness is a result of two-dimensional Fourier transform of the correlation function of the roughness profile.\n"
+		"\n"
+		"Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 \"X-ray reflection and transmission by rough surfaces\" \n"
+		"\n"
+		""},
+	 { "LayerRoughness_getCorrFun", _wrap_LayerRoughness_getCorrFun, METH_VARARGS, "\n"
+		"LayerRoughness_getCorrFun(LayerRoughness self, kvector_t k) -> double\n"
+		"double LayerRoughness::getCorrFun(const kvector_t k) const\n"
+		"\n"
+		"Correlation function of the roughness profile. \n"
+		"\n"
+		""},
+	 { "LayerRoughness_setSigma", _wrap_LayerRoughness_setSigma, METH_VARARGS, "\n"
+		"LayerRoughness_setSigma(LayerRoughness self, double sigma)\n"
+		"void LayerRoughness::setSigma(double sigma)\n"
+		"\n"
+		"Sets rms of roughness. \n"
+		"\n"
+		""},
+	 { "LayerRoughness_getSigma", _wrap_LayerRoughness_getSigma, METH_O, "\n"
+		"LayerRoughness_getSigma(LayerRoughness self) -> double\n"
+		"double LayerRoughness::getSigma() const\n"
+		"\n"
+		"Returns rms of roughness. \n"
+		"\n"
+		""},
+	 { "LayerRoughness_setHurstParameter", _wrap_LayerRoughness_setHurstParameter, METH_VARARGS, "\n"
+		"LayerRoughness_setHurstParameter(LayerRoughness self, double hurstParameter)\n"
+		"void LayerRoughness::setHurstParameter(double hurstParameter)\n"
+		"\n"
+		"Sets hurst parameter. It describes how jagged the surface is. \n"
+		"\n"
+		""},
+	 { "LayerRoughness_getHurstParameter", _wrap_LayerRoughness_getHurstParameter, METH_O, "\n"
+		"LayerRoughness_getHurstParameter(LayerRoughness self) -> double\n"
+		"double LayerRoughness::getHurstParameter() const\n"
+		"\n"
+		"Returns hurst parameter. \n"
+		"\n"
+		""},
+	 { "LayerRoughness_setLatteralCorrLength", _wrap_LayerRoughness_setLatteralCorrLength, METH_VARARGS, "\n"
+		"LayerRoughness_setLatteralCorrLength(LayerRoughness self, double lateralCorrLength)\n"
+		"void LayerRoughness::setLatteralCorrLength(double lateralCorrLength)\n"
+		"\n"
+		"Sets lateral correlation length. \n"
+		"\n"
+		""},
+	 { "LayerRoughness_getLatteralCorrLength", _wrap_LayerRoughness_getLatteralCorrLength, METH_O, "\n"
+		"LayerRoughness_getLatteralCorrLength(LayerRoughness self) -> double\n"
+		"double LayerRoughness::getLatteralCorrLength() const\n"
+		"\n"
+		"Returns lateral correlation length. \n"
+		"\n"
+		""},
+	 { "delete_LayerRoughness", _wrap_delete_LayerRoughness, METH_O, "delete_LayerRoughness(LayerRoughness self)"},
+	 { "LayerRoughness_swigregister", LayerRoughness_swigregister, METH_O, NULL},
+	 { "LayerRoughness_swiginit", LayerRoughness_swiginit, METH_VARARGS, NULL},
 	 { "new_Layer", _wrap_new_Layer, METH_VARARGS, "\n"
 		"Layer(Material material, double thickness=0)\n"
 		"Layer::Layer(Material material, double thickness=0)\n"
@@ -73451,87 +73483,6 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "Layer_swigregister", Layer_swigregister, METH_O, NULL},
 	 { "Layer_swiginit", Layer_swiginit, METH_VARARGS, NULL},
-	 { "new_LayerRoughness", _wrap_new_LayerRoughness, METH_VARARGS, "\n"
-		"LayerRoughness(double sigma, double hurstParameter, double lateralCorrLength)\n"
-		"new_LayerRoughness() -> LayerRoughness\n"
-		"LayerRoughness::LayerRoughness()\n"
-		"\n"
-		""},
-	 { "LayerRoughness_clone", _wrap_LayerRoughness_clone, METH_O, "\n"
-		"LayerRoughness_clone(LayerRoughness self) -> LayerRoughness\n"
-		"LayerRoughness* LayerRoughness::clone() const\n"
-		"\n"
-		"Returns a clone of this  ISample object. \n"
-		"\n"
-		""},
-	 { "LayerRoughness_accept", _wrap_LayerRoughness_accept, METH_VARARGS, "\n"
-		"LayerRoughness_accept(LayerRoughness self, INodeVisitor * visitor)\n"
-		"virtual void LayerRoughness::accept(INodeVisitor *visitor) const\n"
-		"\n"
-		""},
-	 { "LayerRoughness_getSpectralFun", _wrap_LayerRoughness_getSpectralFun, METH_VARARGS, "\n"
-		"LayerRoughness_getSpectralFun(LayerRoughness self, kvector_t kvec) -> double\n"
-		"double LayerRoughness::getSpectralFun(const kvector_t kvec) const\n"
-		"\n"
-		"Returns power spectral density of the surface roughness.\n"
-		"\n"
-		"Power spectral density of the surface roughness is a result of two-dimensional Fourier transform of the correlation function of the roughness profile.\n"
-		"\n"
-		"Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 \"X-ray reflection and transmission by rough surfaces\" \n"
-		"\n"
-		""},
-	 { "LayerRoughness_getCorrFun", _wrap_LayerRoughness_getCorrFun, METH_VARARGS, "\n"
-		"LayerRoughness_getCorrFun(LayerRoughness self, kvector_t k) -> double\n"
-		"double LayerRoughness::getCorrFun(const kvector_t k) const\n"
-		"\n"
-		"Correlation function of the roughness profile. \n"
-		"\n"
-		""},
-	 { "LayerRoughness_setSigma", _wrap_LayerRoughness_setSigma, METH_VARARGS, "\n"
-		"LayerRoughness_setSigma(LayerRoughness self, double sigma)\n"
-		"void LayerRoughness::setSigma(double sigma)\n"
-		"\n"
-		"Sets rms of roughness. \n"
-		"\n"
-		""},
-	 { "LayerRoughness_getSigma", _wrap_LayerRoughness_getSigma, METH_O, "\n"
-		"LayerRoughness_getSigma(LayerRoughness self) -> double\n"
-		"double LayerRoughness::getSigma() const\n"
-		"\n"
-		"Returns rms of roughness. \n"
-		"\n"
-		""},
-	 { "LayerRoughness_setHurstParameter", _wrap_LayerRoughness_setHurstParameter, METH_VARARGS, "\n"
-		"LayerRoughness_setHurstParameter(LayerRoughness self, double hurstParameter)\n"
-		"void LayerRoughness::setHurstParameter(double hurstParameter)\n"
-		"\n"
-		"Sets hurst parameter. It describes how jagged the surface is. \n"
-		"\n"
-		""},
-	 { "LayerRoughness_getHurstParameter", _wrap_LayerRoughness_getHurstParameter, METH_O, "\n"
-		"LayerRoughness_getHurstParameter(LayerRoughness self) -> double\n"
-		"double LayerRoughness::getHurstParameter() const\n"
-		"\n"
-		"Returns hurst parameter. \n"
-		"\n"
-		""},
-	 { "LayerRoughness_setLatteralCorrLength", _wrap_LayerRoughness_setLatteralCorrLength, METH_VARARGS, "\n"
-		"LayerRoughness_setLatteralCorrLength(LayerRoughness self, double lateralCorrLength)\n"
-		"void LayerRoughness::setLatteralCorrLength(double lateralCorrLength)\n"
-		"\n"
-		"Sets lateral correlation length. \n"
-		"\n"
-		""},
-	 { "LayerRoughness_getLatteralCorrLength", _wrap_LayerRoughness_getLatteralCorrLength, METH_O, "\n"
-		"LayerRoughness_getLatteralCorrLength(LayerRoughness self) -> double\n"
-		"double LayerRoughness::getLatteralCorrLength() const\n"
-		"\n"
-		"Returns lateral correlation length. \n"
-		"\n"
-		""},
-	 { "delete_LayerRoughness", _wrap_delete_LayerRoughness, METH_O, "delete_LayerRoughness(LayerRoughness self)"},
-	 { "LayerRoughness_swigregister", LayerRoughness_swigregister, METH_O, NULL},
-	 { "LayerRoughness_swiginit", LayerRoughness_swiginit, METH_VARARGS, NULL},
 	 { "new_MultiLayer", _wrap_new_MultiLayer, METH_NOARGS, "\n"
 		"new_MultiLayer() -> MultiLayer\n"
 		"MultiLayer::MultiLayer()\n"
-- 
GitLab