diff --git a/Core/Computation/ProcessedLayout.cpp b/Core/Computation/ProcessedLayout.cpp
index ee75fb7eeed8862654a0ae2dbdb371c3bbf3bffe..62f448ce5a94833a4f842be8ad66f6077555c758 100644
--- a/Core/Computation/ProcessedLayout.cpp
+++ b/Core/Computation/ProcessedLayout.cpp
@@ -96,7 +96,7 @@ FormFactorCoherentSum ProcessedLayout::ProcessParticle(const IParticle& particle
                                                        double z_ref)
 {
     double abundance = particle.abundance();
-    auto sliced_ffs = SlicedFormFactorList::CreateSlicedFormFactors(particle, slices, z_ref);
+    auto sliced_ffs = SlicedFormFactorList::createSlicedFormFactors(particle, slices, z_ref);
     auto region_map = sliced_ffs.regionMap();
     ScaleRegionMap(region_map, abundance);
     mergeRegionMap(region_map);
diff --git a/Core/Computation/ProcessedSample.cpp b/Core/Computation/ProcessedSample.cpp
index b4b148545e246003b0abd6b626041ab004dde826..b86dc778b0fcb51944604acb73e4b411be8e5aa3 100644
--- a/Core/Computation/ProcessedSample.cpp
+++ b/Core/Computation/ProcessedSample.cpp
@@ -331,7 +331,7 @@ CreateAverageMaterialSlices(const std::vector<Slice>& slices,
         if (!CheckRegions(entry.second))
             throw std::runtime_error("CreateAverageMaterialSlices: "
                                      "total volumetric fraction of particles exceeds 1!");
-        auto new_material = CreateAveragedMaterial(slice_mat, entry.second);
+        auto new_material = createAveragedMaterial(slice_mat, entry.second);
         result[i_slice].setMaterial(new_material);
     }
     return result;
diff --git a/Core/Detector/IDetector2D.h b/Core/Detector/IDetector2D.h
index 02a5bc529d802e435fdb6f5599bb196d3d79b29c..59a30a61f25db9891b7270a455b638d2dd865336 100644
--- a/Core/Detector/IDetector2D.h
+++ b/Core/Detector/IDetector2D.h
@@ -70,7 +70,7 @@ public:
     //! Returns vector of unmasked detector indices.
     std::vector<size_t> active_indices() const;
 
-    //! Create an IPixel for the given OutputData object and index
+    //! Creates an IPixel for the given OutputData object and index
     virtual IPixel* createPixel(size_t index) const = 0;
 
     //! Returns index of pixel that contains the specular wavevector.
diff --git a/Core/Detector/RectangularDetector.h b/Core/Detector/RectangularDetector.h
index bf6332cce1ecee4032ce61c57ebb8b6ae9f5096e..3e6150cbff10d23847a14104c86d67fd38fce7fb 100644
--- a/Core/Detector/RectangularDetector.h
+++ b/Core/Detector/RectangularDetector.h
@@ -79,7 +79,7 @@ public:
     RectangularPixel* regionOfInterestPixel() const;
 
 protected:
-    //! Create an IPixel for the given OutputData object and index
+    //! Creates an IPixel for the given OutputData object and index
     IPixel* createPixel(size_t index) const override;
 
     //! Returns the name for the axis with given index
diff --git a/Core/Detector/SphericalDetector.h b/Core/Detector/SphericalDetector.h
index 5266a69a66f3663c624f83c672ed6b098b807156..86ae5e72fc2e3cab16ccfe8b6b5338207926bcaf 100644
--- a/Core/Detector/SphericalDetector.h
+++ b/Core/Detector/SphericalDetector.h
@@ -50,7 +50,7 @@ public:
     AxesUnits defaultAxesUnits() const override;
 
 protected:
-    //! Create an IPixel for the given OutputData object and index
+    //! Creates an IPixel for the given OutputData object and index
     IPixel* createPixel(size_t index) const override;
 
     //! Returns the name for the axis with given index
diff --git a/Core/HardParticle/FormFactorAnisoPyramid.cpp b/Core/HardParticle/FormFactorAnisoPyramid.cpp
index 4b034cf3385fd59e815edd7d8b2581b65f79f754..cd84facee9410cbefc9700a4a7585eddf9bc87f9 100644
--- a/Core/HardParticle/FormFactorAnisoPyramid.cpp
+++ b/Core/HardParticle/FormFactorAnisoPyramid.cpp
@@ -31,13 +31,13 @@ const PolyhedralTopology FormFactorAnisoPyramid::topology = {{{{3, 2, 1, 0}, tru
 //! @param height: height of pyramid in nm
 //! @param alpha: dihedral angle in radians between base and facet
 FormFactorAnisoPyramid::FormFactorAnisoPyramid(const std::vector<double> P)
-    : FormFactorPolyhedron({"AnisoPyramid",
-                            "class_tooltip",
-                            {{"Length", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Width", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
-                           P),
+    : IFormFactorPolyhedron({"AnisoPyramid",
+                             "class_tooltip",
+                             {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Width", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
+                            P),
       m_length(m_P[0]), m_width(m_P[1]), m_height(m_P[2]), m_alpha(m_P[3])
 {
     onChange();
@@ -56,7 +56,7 @@ IFormFactor* FormFactorAnisoPyramid::sliceFormFactor(ZLimits limits, const IRota
     double dbase_edge = 2 * effects.dz_bottom * MathFunctions::cot(m_alpha);
     FormFactorAnisoPyramid slicedff(m_length - dbase_edge, m_width - dbase_edge,
                                     m_height - effects.dz_bottom - effects.dz_top, m_alpha);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorAnisoPyramid::onChange()
diff --git a/Core/HardParticle/FormFactorAnisoPyramid.h b/Core/HardParticle/FormFactorAnisoPyramid.h
index ae85f38501db93818618374f563968e82a44918e..9b611f65c966188b1a6d51ee002da048034fe22d 100644
--- a/Core/HardParticle/FormFactorAnisoPyramid.h
+++ b/Core/HardParticle/FormFactorAnisoPyramid.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORANISOPYRAMID_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORANISOPYRAMID_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
 
 //! A frustum (truncated pyramid) with rectangular base.
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorAnisoPyramid : public FormFactorPolyhedron
+class BA_CORE_API_ FormFactorAnisoPyramid : public IFormFactorPolyhedron
 {
 public:
     FormFactorAnisoPyramid(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorBox.cpp b/Core/HardParticle/FormFactorBox.cpp
index 64bc064a844cf20b8df8cb186d666f8026f0ae6e..53256e6b4a2dfe47c7056703c3c2640a34d3c628 100644
--- a/Core/HardParticle/FormFactorBox.cpp
+++ b/Core/HardParticle/FormFactorBox.cpp
@@ -20,12 +20,12 @@
 //! @param width: width of the base in nanometers
 //! @param height: height of the box in nanometers
 FormFactorBox::FormFactorBox(const std::vector<double> P)
-    : FormFactorPolygonalPrism({"Box",
-                                "class_tooltip",
-                                {{"Length", "nm", "para_tooltip", 0, +INF, 0},
-                                 {"Width", "nm", "para_tooltip", 0, +INF, 0},
-                                 {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
-                               P),
+    : IFormFactorPrism({"Box",
+                        "class_tooltip",
+                        {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                         {"Width", "nm", "para_tooltip", 0, +INF, 0},
+                         {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                       P),
       m_length(m_P[0]), m_width(m_P[1]), m_height(m_P[2])
 {
     onChange();
@@ -49,7 +49,7 @@ IFormFactor* FormFactorBox::sliceFormFactor(ZLimits limits, const IRotation& rot
 {
     auto effects = computeSlicingEffects(limits, translation, m_height);
     FormFactorBox slicedff(m_length, m_width, m_height - effects.dz_bottom - effects.dz_top);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorBox::onChange()
diff --git a/Core/HardParticle/FormFactorBox.h b/Core/HardParticle/FormFactorBox.h
index 99af81279b9eff83663e768f0f8d9bf7ab63f973..96ad5644723d391356ec2fb9848b970ae66cc5df 100644
--- a/Core/HardParticle/FormFactorBox.h
+++ b/Core/HardParticle/FormFactorBox.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORBOX_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORBOX_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPrism.h"
 
 //! A rectangular prism (parallelepiped).
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorBox : public FormFactorPolygonalPrism
+class BA_CORE_API_ FormFactorBox : public IFormFactorPrism
 {
 public:
     FormFactorBox(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorCantellatedCube.cpp b/Core/HardParticle/FormFactorCantellatedCube.cpp
index bf88c253ed5f362b7460f9351820c669dc2dff57..6d6e8fcce71e1d967c937fd336142615c3eb0f34 100644
--- a/Core/HardParticle/FormFactorCantellatedCube.cpp
+++ b/Core/HardParticle/FormFactorCantellatedCube.cpp
@@ -50,11 +50,11 @@ const PolyhedralTopology FormFactorCantellatedCube::topology = {
 //! @param length: length of the full cube's edge in nanometers
 //! @param removed_length: removed length from each edge of the cube in nanometers
 FormFactorCantellatedCube::FormFactorCantellatedCube(const std::vector<double> P)
-    : FormFactorPolyhedron({"CantellatedCube",
-                            "class_tooltip",
-                            {{"Length", "nm", "para_tooltip", 0, +INF, 0},
-                             {"RemovedLength", "nm", "para_tooltip", 0, +INF, 0}}},
-                           P),
+    : IFormFactorPolyhedron({"CantellatedCube",
+                             "class_tooltip",
+                             {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                              {"RemovedLength", "nm", "para_tooltip", 0, +INF, 0}}},
+                            P),
       m_length(m_P[0]), m_removed_length(m_P[1])
 {
     onChange();
diff --git a/Core/HardParticle/FormFactorCantellatedCube.h b/Core/HardParticle/FormFactorCantellatedCube.h
index 0737e7992d0bf9db79ae16f9c4ee7260542665ee..59282a3bcaadfb259ffb0f88a55560e9fd0463f9 100644
--- a/Core/HardParticle/FormFactorCantellatedCube.h
+++ b/Core/HardParticle/FormFactorCantellatedCube.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCANTELLATEDCUBE_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCANTELLATEDCUBE_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
 
 //! A cube, with truncation of all edges and corners, as in Croset (2017) Fig 7
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorCantellatedCube : public FormFactorPolyhedron
+class BA_CORE_API_ FormFactorCantellatedCube : public IFormFactorPolyhedron
 {
 public:
     FormFactorCantellatedCube(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorCone.cpp b/Core/HardParticle/FormFactorCone.cpp
index 77474e7a463a1197233822159870b0d7cb7aa71f..832d542356201a6128638a8b5e616e2e8c7e8311 100644
--- a/Core/HardParticle/FormFactorCone.cpp
+++ b/Core/HardParticle/FormFactorCone.cpp
@@ -86,7 +86,7 @@ IFormFactor* FormFactorCone::sliceFormFactor(ZLimits limits, const IRotation& ro
     double dradius = effects.dz_bottom * m_cot_alpha;
     FormFactorCone slicedff(m_radius - dradius, m_height - effects.dz_bottom - effects.dz_top,
                             m_alpha);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorCone::onChange()
diff --git a/Core/HardParticle/FormFactorCone6.cpp b/Core/HardParticle/FormFactorCone6.cpp
index aeb1c022622cf4a4c450314b485e9db39e03caf4..00fe80883cf98bfba9dec708b36532905723250d 100644
--- a/Core/HardParticle/FormFactorCone6.cpp
+++ b/Core/HardParticle/FormFactorCone6.cpp
@@ -32,12 +32,12 @@ const PolyhedralTopology FormFactorCone6::topology = {{{{5, 4, 3, 2, 1, 0}, true
 //! @param height: height of a truncated pyramid in nanometers
 //! @param alpha: dihedral angle in radians between base and facet
 FormFactorCone6::FormFactorCone6(const std::vector<double> P)
-    : FormFactorPolyhedron({"Cone6",
-                            "class_tooltip",
-                            {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
-                           P),
+    : IFormFactorPolyhedron({"Cone6",
+                             "class_tooltip",
+                             {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
+                            P),
       m_base_edge(m_P[0]), m_height(m_P[1]), m_alpha(m_P[2])
 {
     onChange();
@@ -55,7 +55,7 @@ IFormFactor* FormFactorCone6::sliceFormFactor(ZLimits limits, const IRotation& r
     double dbase_edge = effects.dz_bottom * MathFunctions::cot(m_alpha);
     FormFactorCone6 slicedff(m_base_edge - dbase_edge,
                              m_height - effects.dz_bottom - effects.dz_top, m_alpha);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorCone6::onChange()
diff --git a/Core/HardParticle/FormFactorCone6.h b/Core/HardParticle/FormFactorCone6.h
index ae9918c5e612ff9ee4bc13d12378003fdeaf47b1..105ec353519db50bad47d454820a10fc90289b6b 100644
--- a/Core/HardParticle/FormFactorCone6.h
+++ b/Core/HardParticle/FormFactorCone6.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCONE6_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCONE6_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
 
 //! A frustum (truncated pyramid) with regular hexagonal base.
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorCone6 : public FormFactorPolyhedron
+class BA_CORE_API_ FormFactorCone6 : public IFormFactorPolyhedron
 {
 public:
     FormFactorCone6(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorCuboctahedron.cpp b/Core/HardParticle/FormFactorCuboctahedron.cpp
index 59e941aacd8123d43296ffec2741bfc19afa683e..f45ba0ee9f4f4b04cc13bc355f8f1b2b4035c57d 100644
--- a/Core/HardParticle/FormFactorCuboctahedron.cpp
+++ b/Core/HardParticle/FormFactorCuboctahedron.cpp
@@ -37,13 +37,13 @@ const PolyhedralTopology FormFactorCuboctahedron::topology = {{{{3, 2, 1, 0}, tr
 //! @param height_ratio: ratio of heights of top to bottom pyramids
 //! @param alpha: dihedral angle in radians between base and facet
 FormFactorCuboctahedron::FormFactorCuboctahedron(const std::vector<double> P)
-    : FormFactorPolyhedron({"Cuboctahedron",
-                            "class_tooltip",
-                            {{"Length", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
-                             {"HeightRatio", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
-                           P),
+    : IFormFactorPolyhedron({"Cuboctahedron",
+                             "class_tooltip",
+                             {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                              {"HeightRatio", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
+                            P),
       m_length(m_P[0]), m_height(m_P[1]), m_height_ratio(m_P[2]), m_alpha(m_P[3])
 {
     onChange();
@@ -64,17 +64,17 @@ IFormFactor* FormFactorCuboctahedron::sliceFormFactor(ZLimits limits, const IRot
         FormFactorPyramid slicedff(
             m_length - dbase_edge,
             m_height * (1 + m_height_ratio) - effects.dz_bottom - effects.dz_top, m_alpha);
-        return CreateTransformedFormFactor(slicedff, rot, effects.position);
+        return createTransformedFormFactor(slicedff, rot, effects.position);
     } else if (effects.dz_top > m_height_ratio * m_height) {
         double dbase_edge = 2 * (m_height - effects.dz_bottom) * MathFunctions::cot(m_alpha);
         FormFactorPyramid slicedff(
             m_length - dbase_edge,
             m_height * (1 + m_height_ratio) - effects.dz_bottom - effects.dz_top, M_PI - m_alpha);
-        return CreateTransformedFormFactor(slicedff, rot, effects.position);
+        return createTransformedFormFactor(slicedff, rot, effects.position);
     } else {
         FormFactorCuboctahedron slicedff(m_length, m_height - effects.dz_bottom,
                                          m_height_ratio * m_height - effects.dz_top, m_alpha);
-        return CreateTransformedFormFactor(slicedff, rot, effects.position);
+        return createTransformedFormFactor(slicedff, rot, effects.position);
     }
 }
 
diff --git a/Core/HardParticle/FormFactorCuboctahedron.h b/Core/HardParticle/FormFactorCuboctahedron.h
index 02da5d79440fa242cfb5b9aec08811fab6893678..2cd3d5df7948f04ff01549900442dcb348b7a1ff 100644
--- a/Core/HardParticle/FormFactorCuboctahedron.h
+++ b/Core/HardParticle/FormFactorCuboctahedron.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCUBOCTAHEDRON_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCUBOCTAHEDRON_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
 
 //! A truncated bifrustum with quadratic base.
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorCuboctahedron : public FormFactorPolyhedron
+class BA_CORE_API_ FormFactorCuboctahedron : public IFormFactorPolyhedron
 {
 public:
     FormFactorCuboctahedron(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorCylinder.cpp b/Core/HardParticle/FormFactorCylinder.cpp
index b9a55789176a9d9d3ec7fe6cafcb4e7b228224ca..9f07ba3992052c7cf534189048ebc29d476c67b6 100644
--- a/Core/HardParticle/FormFactorCylinder.cpp
+++ b/Core/HardParticle/FormFactorCylinder.cpp
@@ -55,7 +55,7 @@ IFormFactor* FormFactorCylinder::sliceFormFactor(ZLimits limits, const IRotation
 {
     auto effects = computeSlicingEffects(limits, translation, m_height);
     FormFactorCylinder slicedff(m_radius, m_height - effects.dz_bottom - effects.dz_top);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorCylinder::onChange()
diff --git a/Core/HardParticle/FormFactorDodecahedron.cpp b/Core/HardParticle/FormFactorDodecahedron.cpp
index cdd2e323e00f68fa8df134c2e04a46a43235972f..df8a23115068a888483f488baec5ab1f573c706e 100644
--- a/Core/HardParticle/FormFactorDodecahedron.cpp
+++ b/Core/HardParticle/FormFactorDodecahedron.cpp
@@ -35,7 +35,7 @@ const PolyhedralTopology FormFactorDodecahedron::topology = {{// bottom:
 //! Constructor of a dodecahedron.
 //! @param edge: length of the edge in nanometers
 FormFactorDodecahedron::FormFactorDodecahedron(const std::vector<double> P)
-    : FormFactorPolyhedron(
+    : IFormFactorPolyhedron(
         {"Dodecahedron", "class_tooltip", {{"Edge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
       m_edge(m_P[0])
 {
diff --git a/Core/HardParticle/FormFactorDodecahedron.h b/Core/HardParticle/FormFactorDodecahedron.h
index aca1951bbb4de2b10dd00d17cbd856d3a0ae549c..909537b554ceebad782236c2983d2f55d16aeab2 100644
--- a/Core/HardParticle/FormFactorDodecahedron.h
+++ b/Core/HardParticle/FormFactorDodecahedron.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORDODECAHEDRON_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORDODECAHEDRON_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
 
 //! A regular dodecahedron.
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorDodecahedron : public FormFactorPolyhedron
+class BA_CORE_API_ FormFactorDodecahedron : public IFormFactorPolyhedron
 {
 public:
     //! @brief Constructs a regular dodecahedron
diff --git a/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp b/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
index 93bcbd70e54b9422d8c3fb8e7bf414f10400e508..753563bac09894f69f49ade31c7fafae1d847a1c 100644
--- a/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
+++ b/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
@@ -63,7 +63,7 @@ IFormFactor* FormFactorEllipsoidalCylinder::sliceFormFactor(ZLimits limits, cons
     auto effects = computeSlicingEffects(limits, translation, m_height);
     FormFactorEllipsoidalCylinder slicedff(m_radius_x, m_radius_y,
                                            m_height - effects.dz_bottom - effects.dz_top);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorEllipsoidalCylinder::onChange()
diff --git a/Core/HardParticle/FormFactorFullSphere.cpp b/Core/HardParticle/FormFactorFullSphere.cpp
index 4f584f548f3b5c8d8993f6c740423b23b5425812..789d758d22c2559f4e9ae77b79b37fa609f3e283 100644
--- a/Core/HardParticle/FormFactorFullSphere.cpp
+++ b/Core/HardParticle/FormFactorFullSphere.cpp
@@ -71,7 +71,7 @@ IFormFactor* FormFactorFullSphere::sliceFormFactor(ZLimits limits, const IRotati
     double height = 2.0 * m_radius;
     auto effects = computeSlicingEffects(limits, new_translation, height);
     FormFactorTruncatedSphere slicedff(m_radius, height - effects.dz_bottom, effects.dz_top);
-    return CreateTransformedFormFactor(slicedff, *P_identity, effects.position);
+    return createTransformedFormFactor(slicedff, *P_identity, effects.position);
 }
 
 void FormFactorFullSphere::onChange() {}
diff --git a/Core/HardParticle/FormFactorFullSpheroid.cpp b/Core/HardParticle/FormFactorFullSpheroid.cpp
index 6a189c842bd0004d87d4047aa798e99a9aac4c0c..80eba59ee6a5a68787cc14baffddbf7c0263d667 100644
--- a/Core/HardParticle/FormFactorFullSpheroid.cpp
+++ b/Core/HardParticle/FormFactorFullSpheroid.cpp
@@ -63,7 +63,7 @@ IFormFactor* FormFactorFullSpheroid::sliceFormFactor(ZLimits limits, const IRota
     auto effects = computeSlicingEffects(limits, translation, m_height);
     FormFactorTruncatedSpheroid slicedff(m_radius, m_height - effects.dz_bottom, flattening,
                                          effects.dz_top);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorFullSpheroid::onChange()
diff --git a/Core/HardParticle/FormFactorIcosahedron.cpp b/Core/HardParticle/FormFactorIcosahedron.cpp
index 1055d6facb41858a6f5a3529d2a854d8a184ebb1..cc7df3aad810d759cca3d45be1f3131669fa9171 100644
--- a/Core/HardParticle/FormFactorIcosahedron.cpp
+++ b/Core/HardParticle/FormFactorIcosahedron.cpp
@@ -45,7 +45,7 @@ const PolyhedralTopology FormFactorIcosahedron::topology = {{// bottom:
 //! Constructor of a icosahedron.
 //! @param edge: length of the edge in nanometers
 FormFactorIcosahedron::FormFactorIcosahedron(const std::vector<double> P)
-    : FormFactorPolyhedron(
+    : IFormFactorPolyhedron(
         {"Icosahedron", "class_tooltip", {{"Edge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
       m_edge(m_P[0])
 {
diff --git a/Core/HardParticle/FormFactorIcosahedron.h b/Core/HardParticle/FormFactorIcosahedron.h
index 700ef15004c5bcfaefe29b7ac2a1793cba52c911..95a65db811d0de445857df310d19fbfaa8204c41 100644
--- a/Core/HardParticle/FormFactorIcosahedron.h
+++ b/Core/HardParticle/FormFactorIcosahedron.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORICOSAHEDRON_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORICOSAHEDRON_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
 
 //! A regular icosahedron.
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorIcosahedron : public FormFactorPolyhedron
+class BA_CORE_API_ FormFactorIcosahedron : public IFormFactorPolyhedron
 {
 public:
     FormFactorIcosahedron(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorLongBoxGauss.cpp b/Core/HardParticle/FormFactorLongBoxGauss.cpp
index ff9156a6ce58d83ec9b2ded4fad3bcd66f34e590..427d8304318c54fa35b9f5dd6c9b025213e83d6c 100644
--- a/Core/HardParticle/FormFactorLongBoxGauss.cpp
+++ b/Core/HardParticle/FormFactorLongBoxGauss.cpp
@@ -49,7 +49,7 @@ IFormFactor* FormFactorLongBoxGauss::sliceFormFactor(ZLimits limits, const IRota
     auto effects = computeSlicingEffects(limits, translation, m_height);
     FormFactorLongBoxGauss slicedff(m_length, m_width,
                                     m_height - effects.dz_bottom - effects.dz_top);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorLongBoxGauss::onChange()
diff --git a/Core/HardParticle/FormFactorLongBoxLorentz.cpp b/Core/HardParticle/FormFactorLongBoxLorentz.cpp
index 637fce0db5198fb2e90ae23c1098e7513a0ee1d8..4691a262064f92c1141028a8c08763249a019bf4 100644
--- a/Core/HardParticle/FormFactorLongBoxLorentz.cpp
+++ b/Core/HardParticle/FormFactorLongBoxLorentz.cpp
@@ -49,7 +49,7 @@ IFormFactor* FormFactorLongBoxLorentz::sliceFormFactor(ZLimits limits, const IRo
     auto effects = computeSlicingEffects(limits, translation, m_height);
     FormFactorLongBoxLorentz slicedff(m_length, m_width,
                                       m_height - effects.dz_bottom - effects.dz_top);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorLongBoxLorentz::onChange()
diff --git a/Core/HardParticle/FormFactorPolyhedron.h b/Core/HardParticle/FormFactorPolyhedron.h
deleted file mode 100644
index dd5c3000e0b7140c5ee4c0e0a12adbe2c8d02e2b..0000000000000000000000000000000000000000
--- a/Core/HardParticle/FormFactorPolyhedron.h
+++ /dev/null
@@ -1,176 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Core/HardParticle/FormFactorPolyhedron.h
-//! @brief     Defines class FormFactorPolyhedron, FormFactorPrism, and auxiliary classes.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-// ************************************************************************** //
-
-#ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPOLYHEDRON_H
-#define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPOLYHEDRON_H
-
-#include "Core/Scattering/IFormFactorBorn.h"
-#include <memory>
-
-//! For internal use in PolyhedralFace.
-class PolygonalTopology
-{
-public:
-    std::vector<int> vertexIndices;
-    bool symmetry_S2;
-};
-
-//! For internal use in FormFactorPolyhedron.
-class PolyhedralTopology
-{
-public:
-    std::vector<PolygonalTopology> faces;
-    bool symmetry_Ci;
-};
-
-//! One edge of a polygon, for form factor computation.
-
-class PolyhedralEdge
-{
-public:
-    PolyhedralEdge(const kvector_t _Vlow, const kvector_t _Vhig);
-
-    kvector_t E() const { return m_E; }
-    kvector_t R() const { return m_R; }
-    complex_t qE(cvector_t q) const { return m_E.dot(q); }
-    complex_t qR(cvector_t q) const { return m_R.dot(q); }
-
-    complex_t contrib(int m, cvector_t qpa, complex_t qrperp) const;
-
-private:
-    kvector_t m_E; //!< vector pointing from mid of edge to upper vertex
-    kvector_t m_R; //!< position vector of edge midpoint
-};
-
-//! A polygon, for form factor computation.
-
-class PolyhedralFace
-{
-public:
-    static double diameter(const std::vector<kvector_t>& V);
-#ifdef POLYHEDRAL_DIAGNOSTIC
-    static void setLimits(double _qpa, int _n);
-#endif
-
-    PolyhedralFace(const std::vector<kvector_t>& _V = std::vector<kvector_t>(),
-                   bool _sym_S2 = false);
-
-    double area() const { return m_area; }
-    double pyramidalVolume() const { return m_rperp * m_area / 3; }
-    double radius3d() const { return m_radius_3d; }
-    //! Returns conj(q)*normal [BasicVector3D::dot is antilinear in 'this' argument]
-    complex_t normalProjectionConj(cvector_t q) const { return q.dot(m_normal); }
-    complex_t ff_n(int m, cvector_t q) const;
-    complex_t ff(cvector_t q, bool sym_Ci) const;
-    complex_t ff_2D(cvector_t qpa) const;
-    void assert_Ci(const PolyhedralFace& other) const;
-
-private:
-    static double qpa_limit_series; //!< determines when use power series
-    static int n_limit_series;
-
-    bool sym_S2; //!< if true, then edges obtainable by inversion are not provided
-    std::vector<PolyhedralEdge> edges;
-    double m_area;
-    kvector_t m_normal; //!< normal vector of this polygon's plane
-    double m_rperp;     //!< distance of this polygon's plane from the origin, along 'm_normal'
-    double m_radius_2d; //!< radius of enclosing cylinder
-    double m_radius_3d; //!< radius of enclosing sphere
-
-    void decompose_q(cvector_t q, complex_t& qperp, cvector_t& qpa) const;
-    complex_t ff_n_core(int m, cvector_t qpa, complex_t qperp) const;
-    complex_t edge_sum_ff(cvector_t q, cvector_t qpa, bool sym_Ci) const;
-    complex_t expansion(complex_t fac_even, complex_t fac_odd, cvector_t qpa,
-                        double abslevel) const;
-};
-
-//! A polyhedron, for form factor computation.
-
-class BA_CORE_API_ FormFactorPolyhedron : public IFormFactorBorn
-{
-public:
-#ifdef POLYHEDRAL_DIAGNOSTIC
-    static void setLimits(double _q, int _n);
-#endif
-
-    FormFactorPolyhedron() {}
-    FormFactorPolyhedron(const NodeMeta& meta, const std::vector<double>& PValues);
-
-    double bottomZ(const IRotation& rotation) const override final;
-    double topZ(const IRotation& rotation) const override final;
-
-    complex_t evaluate_for_q(cvector_t q) const override final;
-    complex_t evaluate_centered(cvector_t q) const;
-
-    double volume() const override final { return m_volume; }
-    double radialExtension() const override final { return m_radius; }
-    void assert_platonic() const;
-
-protected:
-    double m_z_bottom;
-    bool m_sym_Ci; //!< if true, then faces obtainable by inversion are not provided
-
-    void setPolyhedron(const PolyhedralTopology& topology, double z_bottom,
-                       const std::vector<kvector_t>& vertices);
-
-private:
-    static double q_limit_series; //!< determines when to use power series
-    static int n_limit_series;
-
-    std::vector<PolyhedralFace> m_faces;
-    double m_radius;
-    double m_volume;
-    std::vector<kvector_t> m_vertices; //! for topZ, bottomZ computation only
-};
-
-//! A prism with a polygonal base, for form factor computation.
-
-class BA_CORE_API_ FormFactorPolygonalPrism : public IFormFactorBorn
-{
-public:
-    FormFactorPolygonalPrism() = default;
-    FormFactorPolygonalPrism(const NodeMeta& meta, const std::vector<double>& PValues);
-
-    double bottomZ(const IRotation& rotation) const override final;
-    double topZ(const IRotation& rotation) const override final;
-
-    virtual complex_t evaluate_for_q(cvector_t q) const override;
-    virtual double volume() const override;
-    double getHeight() const { return height(); }
-    virtual double radialExtension() const override { return std::sqrt(m_base->area()); }
-
-protected:
-    virtual double height() const = 0;
-    std::unique_ptr<PolyhedralFace> m_base;
-    void setPrism(bool symmetry_Ci, const std::vector<kvector_t>& vertices);
-    std::vector<kvector_t> m_vertices; //! for topZ, bottomZ computation only
-};
-
-//! A polygonal surface, for testing form factor computations.
-
-class BA_CORE_API_ FormFactorPolygonalSurface : public IFormFactorBorn
-{
-public:
-    FormFactorPolygonalSurface() = default;
-    FormFactorPolygonalSurface(const NodeMeta& meta, const std::vector<double>& PValues);
-
-    complex_t evaluate_for_q(cvector_t q) const override final;
-    double volume() const override { return 0; }
-    double radialExtension() const override final { return std::sqrt(m_base->area()); }
-
-protected:
-    std::unique_ptr<PolyhedralFace> m_base;
-};
-
-#endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPOLYHEDRON_H
diff --git a/Core/HardParticle/FormFactorPrism3.cpp b/Core/HardParticle/FormFactorPrism3.cpp
index 874606046146cdbf800053ad6e750cf5e7b1c7b8..13c2aec0ecca0bc265717dd723a57c39ceca8424 100644
--- a/Core/HardParticle/FormFactorPrism3.cpp
+++ b/Core/HardParticle/FormFactorPrism3.cpp
@@ -19,11 +19,11 @@
 //! @param base_edge: length of the base edge in nanometers
 //! @param height: height in nanometers
 FormFactorPrism3::FormFactorPrism3(const std::vector<double> P)
-    : FormFactorPolygonalPrism({"Prism3",
-                                "class_tooltip",
-                                {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
-                                 {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
-                               P),
+    : IFormFactorPrism({"Prism3",
+                        "class_tooltip",
+                        {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                         {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                       P),
       m_base_edge(m_P[0]), m_height(m_P[1])
 {
     onChange();
@@ -39,7 +39,7 @@ IFormFactor* FormFactorPrism3::sliceFormFactor(ZLimits limits, const IRotation&
 {
     auto effects = computeSlicingEffects(limits, translation, m_height);
     FormFactorPrism3 slicedff(m_base_edge, m_height - effects.dz_bottom - effects.dz_top);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorPrism3::onChange()
diff --git a/Core/HardParticle/FormFactorPrism3.h b/Core/HardParticle/FormFactorPrism3.h
index 15a8841f1870e3e470d5f94939a2f904404c20e5..5d53a51d1ba52112d260d2a3593e2d9408d9ec9a 100644
--- a/Core/HardParticle/FormFactorPrism3.h
+++ b/Core/HardParticle/FormFactorPrism3.h
@@ -14,12 +14,13 @@
 
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPRISM3_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPRISM3_H
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+
+#include "Core/HardParticle/IFormFactorPrism.h"
 
 //! A prism based on an equilateral triangle.
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorPrism3 : public FormFactorPolygonalPrism
+class BA_CORE_API_ FormFactorPrism3 : public IFormFactorPrism
 {
 public:
     FormFactorPrism3(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorPrism6.cpp b/Core/HardParticle/FormFactorPrism6.cpp
index ff5be1148ee797597fc00ae8b4f55eecfb117a6a..eb5625dfd1c2fadf0a09f349f2c1410bc8303e3a 100644
--- a/Core/HardParticle/FormFactorPrism6.cpp
+++ b/Core/HardParticle/FormFactorPrism6.cpp
@@ -18,11 +18,11 @@
 //! @param base_edge: length of the hexagonal base in nanometers
 //! @param height: height in nanometers
 FormFactorPrism6::FormFactorPrism6(const std::vector<double> P)
-    : FormFactorPolygonalPrism({"Prism6",
-                                "class_tooltip",
-                                {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
-                                 {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
-                               P),
+    : IFormFactorPrism({"Prism6",
+                        "class_tooltip",
+                        {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                         {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                       P),
       m_base_edge(m_P[0]), m_height(m_P[1])
 {
     onChange();
@@ -38,7 +38,7 @@ IFormFactor* FormFactorPrism6::sliceFormFactor(ZLimits limits, const IRotation&
 {
     auto effects = computeSlicingEffects(limits, translation, m_height);
     FormFactorPrism6 slicedff(m_base_edge, m_height - effects.dz_bottom - effects.dz_top);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorPrism6::onChange()
diff --git a/Core/HardParticle/FormFactorPrism6.h b/Core/HardParticle/FormFactorPrism6.h
index 414669bf6d954f5d395cd1ef01efd4e2a13cbe8a..3262fef68c7f2e7b2bdde99684afd7e8e68517dd 100644
--- a/Core/HardParticle/FormFactorPrism6.h
+++ b/Core/HardParticle/FormFactorPrism6.h
@@ -14,12 +14,13 @@
 
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPRISM6_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPRISM6_H
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+
+#include "Core/HardParticle/IFormFactorPrism.h"
 
 //! A prism based on a regular hexagonal.
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorPrism6 : public FormFactorPolygonalPrism
+class BA_CORE_API_ FormFactorPrism6 : public IFormFactorPrism
 {
 public:
     FormFactorPrism6(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorPyramid.cpp b/Core/HardParticle/FormFactorPyramid.cpp
index b678a90dc2dd43d9c9b8ff7d725813c1b3257e72..5c3f107a2e1736e60f486c1fdea14180faa2fdab 100644
--- a/Core/HardParticle/FormFactorPyramid.cpp
+++ b/Core/HardParticle/FormFactorPyramid.cpp
@@ -32,12 +32,12 @@ const PolyhedralTopology FormFactorPyramid::topology = {{
 //! @param height: height of the pyramid in nanometers
 //! @param alpha: dihedral angle between the base and a side face in radians
 FormFactorPyramid::FormFactorPyramid(const std::vector<double> P)
-    : FormFactorPolyhedron({"Pyramid",
-                            "class_tooltip",
-                            {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Alpha", "rad", "para_tooltip", 0., M_PI, 0}}},
-                           P),
+    : IFormFactorPolyhedron({"Pyramid",
+                             "class_tooltip",
+                             {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Alpha", "rad", "para_tooltip", 0., M_PI, 0}}},
+                            P),
       m_base_edge(m_P[0]), m_height(m_P[1]), m_alpha(m_P[2])
 {
     onChange();
@@ -55,7 +55,7 @@ IFormFactor* FormFactorPyramid::sliceFormFactor(ZLimits limits, const IRotation&
     double dbase_edge = 2 * effects.dz_bottom * MathFunctions::cot(m_alpha);
     FormFactorPyramid slicedff(m_base_edge - dbase_edge,
                                m_height - effects.dz_bottom - effects.dz_top, m_alpha);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorPyramid::onChange()
diff --git a/Core/HardParticle/FormFactorPyramid.h b/Core/HardParticle/FormFactorPyramid.h
index d0d86aed0ce9957dc3c33da52d9c3a7433a79d0c..3c8e5ae1fd844f01386653432fb1026f563b0ed1 100644
--- a/Core/HardParticle/FormFactorPyramid.h
+++ b/Core/HardParticle/FormFactorPyramid.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPYRAMID_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPYRAMID_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
 
 //! A frustum with a quadratic base.
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorPyramid : public FormFactorPolyhedron
+class BA_CORE_API_ FormFactorPyramid : public IFormFactorPolyhedron
 {
 public:
     FormFactorPyramid(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorTetrahedron.cpp b/Core/HardParticle/FormFactorTetrahedron.cpp
index 7ab8ac407f7b4f352d650e1a2e87c4f613a56371..86573f2e6ea3cb10be0c634c6ee14d03167a21b4 100644
--- a/Core/HardParticle/FormFactorTetrahedron.cpp
+++ b/Core/HardParticle/FormFactorTetrahedron.cpp
@@ -29,12 +29,12 @@ const PolyhedralTopology FormFactorTetrahedron::topology = {{{{2, 1, 0}, false},
 //! @param height: height of the tetrahedron in nanometers
 //! @param alpha: dihedral angle in radians between base and facet
 FormFactorTetrahedron::FormFactorTetrahedron(const std::vector<double> P)
-    : FormFactorPolyhedron({"Tetrahedron",
-                            "class_tooltip",
-                            {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
-                             {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
-                           P),
+    : IFormFactorPolyhedron({"Tetrahedron",
+                             "class_tooltip",
+                             {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                              {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
+                            P),
       m_base_edge(m_P[0]), m_height(m_P[1]), m_alpha(m_P[2])
 {
     onChange();
@@ -52,7 +52,7 @@ IFormFactor* FormFactorTetrahedron::sliceFormFactor(ZLimits limits, const IRotat
     double dbase_edge = 2 * sqrt(3) * effects.dz_bottom * MathFunctions::cot(m_alpha);
     FormFactorTetrahedron slicedff(m_base_edge - dbase_edge,
                                    m_height - effects.dz_bottom - effects.dz_top, m_alpha);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorTetrahedron::onChange()
diff --git a/Core/HardParticle/FormFactorTetrahedron.h b/Core/HardParticle/FormFactorTetrahedron.h
index 22efd2876294c3ac3221f5e8fb51518ff82dc488..8ebf0999c591fd7f9a3853555e7e93fcb8c030ed 100644
--- a/Core/HardParticle/FormFactorTetrahedron.h
+++ b/Core/HardParticle/FormFactorTetrahedron.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTETRAHEDRON_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTETRAHEDRON_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
 
 //! A frustum with equilateral trigonal base.
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorTetrahedron : public FormFactorPolyhedron
+class BA_CORE_API_ FormFactorTetrahedron : public IFormFactorPolyhedron
 {
 public:
     FormFactorTetrahedron(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorTriangle.cpp b/Core/HardParticle/FormFactorTriangle.cpp
deleted file mode 100644
index 4d7f40b2f8c6683b1c6e78e65ceff3c25ae432b6..0000000000000000000000000000000000000000
--- a/Core/HardParticle/FormFactorTriangle.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Core/HardParticle/FormFactorTriangle.cpp
-//! @brief     Implements class FormFactorTriangle.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-// ************************************************************************** //
-
-#include "Core/HardParticle/FormFactorTriangle.h"
-#include "Fit/Tools/RealLimits.h"
-
-FormFactorTriangle::FormFactorTriangle(const std::vector<double> P)
-    : FormFactorPolygonalSurface(
-        {"Triangle", "class_tooltip", {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
-      m_base_edge(m_P[0])
-{
-    onChange();
-}
-
-FormFactorTriangle::FormFactorTriangle(double base_edge)
-    : FormFactorTriangle(std::vector<double>{base_edge})
-{
-}
-
-void FormFactorTriangle::onChange()
-{
-    double a = m_base_edge;
-    double as = a / 2;
-    double ac = a / sqrt(3) / 2;
-    double ah = a / sqrt(3);
-    kvector_t V[3] = {{-ac, as, 0.}, {-ac, -as, 0.}, {ah, 0., 0.}};
-    m_base = std::unique_ptr<PolyhedralFace>(new PolyhedralFace({V[0], V[1], V[2]}, false));
-}
diff --git a/Core/HardParticle/FormFactorTriangle.h b/Core/HardParticle/FormFactorTriangle.h
deleted file mode 100644
index 57aad06b3f7a7ca5c3307522bac85837443eaec1..0000000000000000000000000000000000000000
--- a/Core/HardParticle/FormFactorTriangle.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Core/HardParticle/FormFactorTriangle.h
-//! @brief     Defines class FormFactorTriangle.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-// ************************************************************************** //
-
-#ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTRIANGLE_H
-#define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTRIANGLE_H
-#include "Core/HardParticle/FormFactorPolyhedron.h"
-
-//! A planar equilateral triangle, for testing form factor computations.
-
-class BA_CORE_API_ FormFactorTriangle : public FormFactorPolygonalSurface
-{
-public:
-    FormFactorTriangle(const std::vector<double> P);
-    FormFactorTriangle(double base_edge);
-
-    FormFactorTriangle* clone() const override final { return new FormFactorTriangle(m_base_edge); }
-    void accept(INodeVisitor* visitor) const override final { visitor->visit(this); }
-
-    double getBaseEdge() const { return m_base_edge; }
-
-protected:
-    void onChange() override final;
-
-private:
-    const double& m_base_edge;
-};
-
-#endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTRIANGLE_H
diff --git a/Core/HardParticle/FormFactorTruncatedCube.cpp b/Core/HardParticle/FormFactorTruncatedCube.cpp
index a5a9be8fdbfdb4b32cc89dfc8c3ec5ec122daec2..1888018c6317fad6577a4ea661f1409c7f3be2a5 100644
--- a/Core/HardParticle/FormFactorTruncatedCube.cpp
+++ b/Core/HardParticle/FormFactorTruncatedCube.cpp
@@ -36,11 +36,11 @@ const PolyhedralTopology FormFactorTruncatedCube::topology = {
 //! @param length: length of the full cube's edge in nanometers
 //! @param removed_length: removed length from each edge of the cube in nanometers
 FormFactorTruncatedCube::FormFactorTruncatedCube(const std::vector<double> P)
-    : FormFactorPolyhedron({"TruncatedCube",
-                            "class_tooltip",
-                            {{"Length", "nm", "para_tooltip", 0, +INF, 0},
-                             {"RemovedLength", "nm", "para_tooltip", 0, +INF, 0}}},
-                           P),
+    : IFormFactorPolyhedron({"TruncatedCube",
+                             "class_tooltip",
+                             {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                              {"RemovedLength", "nm", "para_tooltip", 0, +INF, 0}}},
+                            P),
       m_length(m_P[0]), m_removed_length(m_P[1])
 {
     onChange();
diff --git a/Core/HardParticle/FormFactorTruncatedCube.h b/Core/HardParticle/FormFactorTruncatedCube.h
index 8dc943c11b135d70ae0f6c1ee7c6a4b0b8515147..0e5433efcb225ee01c22a941a056ed053c7a27e8 100644
--- a/Core/HardParticle/FormFactorTruncatedCube.h
+++ b/Core/HardParticle/FormFactorTruncatedCube.h
@@ -15,12 +15,12 @@
 #ifndef BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTRUNCATEDCUBE_H
 #define BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTRUNCATEDCUBE_H
 
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
 
 //! A cube, with tetrahedral truncation of all corners
 //! @ingroup hardParticle
 
-class BA_CORE_API_ FormFactorTruncatedCube : public FormFactorPolyhedron
+class BA_CORE_API_ FormFactorTruncatedCube : public IFormFactorPolyhedron
 {
 public:
     FormFactorTruncatedCube(const std::vector<double> P);
diff --git a/Core/HardParticle/FormFactorTruncatedSphere.cpp b/Core/HardParticle/FormFactorTruncatedSphere.cpp
index 0bbec494e3501aa2a4e6a248d0aaa7612f7cdac1..9d6c62c8e448a3a6bdcde883a90ba662787ff50e 100644
--- a/Core/HardParticle/FormFactorTruncatedSphere.cpp
+++ b/Core/HardParticle/FormFactorTruncatedSphere.cpp
@@ -89,7 +89,7 @@ IFormFactor* FormFactorTruncatedSphere::sliceFormFactor(ZLimits limits, const IR
     auto effects = computeSlicingEffects(limits, translation, height);
     FormFactorTruncatedSphere slicedff(m_radius, m_height - effects.dz_bottom,
                                        effects.dz_top + m_dh);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorTruncatedSphere::onChange()
diff --git a/Core/HardParticle/FormFactorTruncatedSpheroid.cpp b/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
index 0b828f39555d812437f2b4930fb99ef28a529fd4..dcaaabfdb59596de08a197fdcb52d54e2a7af264 100644
--- a/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
+++ b/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
@@ -95,7 +95,7 @@ IFormFactor* FormFactorTruncatedSpheroid::sliceFormFactor(ZLimits limits, const
     auto effects = computeSlicingEffects(limits, translation, height);
     FormFactorTruncatedSpheroid slicedff(m_radius, height - effects.dz_bottom, m_height_flattening,
                                          effects.dz_top + m_dh);
-    return CreateTransformedFormFactor(slicedff, rot, effects.position);
+    return createTransformedFormFactor(slicedff, rot, effects.position);
 }
 
 void FormFactorTruncatedSpheroid::onChange()
diff --git a/Core/HardParticle/IFormFactorPolyhedron.cpp b/Core/HardParticle/IFormFactorPolyhedron.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ab9f954fff6e623c22a0863f61f7bda094f49d02
--- /dev/null
+++ b/Core/HardParticle/IFormFactorPolyhedron.cpp
@@ -0,0 +1,80 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/IFormFactorPolyhedron.cpp
+//! @brief     Implements class IFormFactorPolyhedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+//! The mathematics implemented here is described in full detail in a paper
+//! by Joachim Wuttke, entitled
+//! "Form factor (Fourier shape transform) of polygon and polyhedron."
+
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
+#include "Core/HardParticle/Polyhedron.h"
+
+#ifdef POLYHEDRAL_DIAGNOSTIC // TODO restore
+void IFormFactorPolyhedron::setLimits(double _q, int _n)
+{
+    q_limit_series = _q;
+    n_limit_series = _n;
+}
+#endif
+
+IFormFactorPolyhedron::IFormFactorPolyhedron(const NodeMeta& meta,
+                                             const std::vector<double>& PValues)
+    : IFormFactorBorn(meta, PValues)
+{
+}
+
+IFormFactorPolyhedron::~IFormFactorPolyhedron() = default;
+
+//! Called by child classes to set faces and other internal variables.
+
+void IFormFactorPolyhedron::setPolyhedron(const PolyhedralTopology& topology, double z_bottom,
+                                          const std::vector<kvector_t>& vertices)
+{
+    pimpl = std::make_unique<Polyhedron>(topology, z_bottom, vertices);
+}
+
+double IFormFactorPolyhedron::bottomZ(const IRotation& rotation) const
+{
+    return BottomZ(pimpl->vertices(), rotation);
+}
+
+double IFormFactorPolyhedron::topZ(const IRotation& rotation) const
+{
+    return TopZ(pimpl->vertices(), rotation);
+}
+
+complex_t IFormFactorPolyhedron::evaluate_for_q(cvector_t q) const
+{
+    return pimpl->evaluate_for_q(q);
+}
+
+complex_t IFormFactorPolyhedron::evaluate_centered(cvector_t q) const
+{
+    return pimpl->evaluate_centered(q);
+}
+
+double IFormFactorPolyhedron::volume() const
+{
+    return pimpl->volume();
+}
+double IFormFactorPolyhedron::radialExtension() const
+{
+    return pimpl->radius();
+}
+
+//! Assertions for Platonic solid.
+
+void IFormFactorPolyhedron::assert_platonic() const
+{
+    pimpl->assert_platonic();
+}
diff --git a/Core/HardParticle/IFormFactorPolyhedron.h b/Core/HardParticle/IFormFactorPolyhedron.h
new file mode 100644
index 0000000000000000000000000000000000000000..6adb96cf4a10bd1196889a3b25337be2b906145d
--- /dev/null
+++ b/Core/HardParticle/IFormFactorPolyhedron.h
@@ -0,0 +1,55 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/IFormFactorPolyhedron.h
+//! @brief     Defines class IFormFactorPolyhedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#ifndef BORNAGAIN_CORE_HARDPARTICLE_IFORMFACTORPOLYHEDRON_H
+#define BORNAGAIN_CORE_HARDPARTICLE_IFORMFACTORPOLYHEDRON_H
+
+#include "Core/Scattering/IFormFactorBorn.h"
+#include "Core/HardParticle/PolyhedralTopology.h"
+#include <memory>
+
+class Polyhedron;
+
+//! A polyhedron, for form factor computation.
+
+class BA_CORE_API_ IFormFactorPolyhedron : public IFormFactorBorn
+{
+public:
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    static void setLimits(double _q, int _n);
+#endif
+
+    IFormFactorPolyhedron() = delete;
+    IFormFactorPolyhedron(const NodeMeta& meta, const std::vector<double>& PValues);
+    ~IFormFactorPolyhedron();
+
+    double bottomZ(const IRotation& rotation) const override final;
+    double topZ(const IRotation& rotation) const override final;
+
+    complex_t evaluate_for_q(cvector_t q) const override final;
+    complex_t evaluate_centered(cvector_t q) const;
+
+    double volume() const override final;
+    double radialExtension() const override final;
+    void assert_platonic() const;
+
+protected:
+    void setPolyhedron(const PolyhedralTopology& topology, double z_bottom,
+                       const std::vector<kvector_t>& vertices);
+
+private:
+    std::unique_ptr<Polyhedron> pimpl;
+};
+
+#endif // BORNAGAIN_CORE_HARDPARTICLE_IFORMFACTORPOLYHEDRON_H
diff --git a/Core/HardParticle/IFormFactorPrism.cpp b/Core/HardParticle/IFormFactorPrism.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..050a1b10438f0fa7719217981771bc0ac7bb1a4b
--- /dev/null
+++ b/Core/HardParticle/IFormFactorPrism.cpp
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/IFormFactorPrism.cpp
+//! @brief     Implements class IFormFactorPrism.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#include "Core/HardParticle/IFormFactorPrism.h"
+#include "Core/HardParticle/Prism.h"
+
+IFormFactorPrism::IFormFactorPrism(const NodeMeta& meta, const std::vector<double>& PValues)
+    : IFormFactorBorn(meta, PValues)
+{
+}
+
+IFormFactorPrism::~IFormFactorPrism() = default;
+
+void IFormFactorPrism::setPrism(bool symmetry_Ci, const std::vector<kvector_t>& vertices)
+{
+    pimpl = std::make_unique<Prism>(symmetry_Ci, height(), vertices);
+}
+
+double IFormFactorPrism::bottomZ(const IRotation& rotation) const
+{
+    return BottomZ(pimpl->vertices(), rotation);
+}
+
+double IFormFactorPrism::topZ(const IRotation& rotation) const
+{
+    return TopZ(pimpl->vertices(), rotation);
+}
+
+//! Returns the volume of this prism.
+double IFormFactorPrism::volume() const
+{
+    return height() * pimpl->area();
+}
+
+double IFormFactorPrism::getHeight() const { return height(); }
+double IFormFactorPrism::radialExtension() const { return std::sqrt(pimpl->area()); }
+
+//! Returns the form factor F(q) of this polyhedron, respecting the offset height/2.
+
+complex_t IFormFactorPrism::evaluate_for_q(cvector_t q) const
+{
+    return pimpl->evaluate_for_q(q);
+}
diff --git a/Core/HardParticle/IFormFactorPrism.h b/Core/HardParticle/IFormFactorPrism.h
new file mode 100644
index 0000000000000000000000000000000000000000..3ebc35a9c540376617c45021ad0c3e27cc0d4150
--- /dev/null
+++ b/Core/HardParticle/IFormFactorPrism.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/IFormFactorPrism.h
+//! @brief     Defines class IFormFactorPrism.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#ifndef BORNAGAIN_CORE_HARDPARTICLE_IFORMFACTORPRISM_H
+#define BORNAGAIN_CORE_HARDPARTICLE_IFORMFACTORPRISM_H
+
+#include "Core/Scattering/IFormFactorBorn.h"
+#include <memory>
+
+class Prism;
+
+//! A prism with a polygonal base, for form factor computation.
+
+class BA_CORE_API_ IFormFactorPrism : public IFormFactorBorn
+{
+public:
+    IFormFactorPrism(const NodeMeta& meta, const std::vector<double>& PValues);
+    ~IFormFactorPrism();
+
+    double bottomZ(const IRotation& rotation) const override final;
+    double topZ(const IRotation& rotation) const override final;
+
+    complex_t evaluate_for_q(cvector_t q) const override;
+    double volume() const override;
+    double radialExtension() const override;
+    double getHeight() const;
+
+protected:
+    void setPrism(bool symmetry_Ci, const std::vector<kvector_t>& vertices);
+    virtual double height() const = 0; // TODO mv parameter m_height back from children to this
+
+private:
+    std::unique_ptr<Prism> pimpl;
+};
+
+#endif // BORNAGAIN_CORE_HARDPARTICLE_IFORMFACTORPRISM_H
diff --git a/Core/HardParticle/FormFactorPolyhedron.cpp b/Core/HardParticle/PolyhedralComponents.cpp
similarity index 54%
rename from Core/HardParticle/FormFactorPolyhedron.cpp
rename to Core/HardParticle/PolyhedralComponents.cpp
index e222907fbe58c813f36b538c4a7a65521d4e2fbf..d4f14e3b6073ba94f8152fc1a39136fe228d8ff7 100644
--- a/Core/HardParticle/FormFactorPolyhedron.cpp
+++ b/Core/HardParticle/PolyhedralComponents.cpp
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/HardParticle/FormFactorPolyhedron.cpp
-//! @brief     Implements class FormFactorPolyhedron, FormFactorPrism, and auxiliary classes.
+//! @file      Core/HardParticle/PolyhedralComponents.cpp
+//! @brief     Implements classes PolyhedralEdge, PolyhedralFace
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -12,13 +12,7 @@
 //
 // ************************************************************************** //
 
-//! The mathematics implemented here is described in full detail in a paper
-//! by Joachim Wuttke, entitled
-//! "Form factor (Fourier shape transform) of polygon and polyhedron."
-
-#include "Core/HardParticle/FormFactorPolyhedron.h"
-#include "Core/Parametrization/RealParameter.h"
-#include "Core/Scattering/Rotations.h"
+#include "Core/HardParticle/PolyhedralComponents.h"
 #include "Core/Tools/MathFunctions.h"
 #include "Core/Tools/Precomputed.h"
 #include <iomanip>
@@ -30,12 +24,6 @@ const double eps = 2e-16;
 constexpr auto ReciprocalFactorialArray = Precomputed::GenerateReciprocalFactorialArray<171>();
 } // namespace
 
-double PolyhedralFace::qpa_limit_series = 3e-2;
-int PolyhedralFace::n_limit_series = 20;
-
-double FormFactorPolyhedron::q_limit_series = 1e-2;
-int FormFactorPolyhedron::n_limit_series = 20;
-
 //**************************************************************************************************
 //  PolyhedralEdge implementation
 //**************************************************************************************************
@@ -102,6 +90,9 @@ complex_t PolyhedralEdge::contrib(int M, cvector_t qpa, complex_t qrperp) const
 //  PolyhedralFace implementation
 //**************************************************************************************************
 
+double PolyhedralFace::qpa_limit_series = 3e-2;
+int PolyhedralFace::n_limit_series = 20;
+
 //! Static method, returns diameter of circle that contains all vertices.
 
 double PolyhedralFace::diameter(const std::vector<kvector_t>& V)
@@ -406,297 +397,3 @@ void PolyhedralFace::assert_Ci(const PolyhedralFace& other) const
     if ((m_normal + other.m_normal).mag() > 1e-14)
         throw std::logic_error("Faces do not have opposite orientation, violating symmetry Ci");
 }
-
-//**************************************************************************************************
-//  FormFactorPolyhedron implementation
-//**************************************************************************************************
-
-#ifdef POLYHEDRAL_DIAGNOSTIC
-void FormFactorPolyhedron::setLimits(double _q, int _n)
-{
-    q_limit_series = _q;
-    n_limit_series = _n;
-}
-#endif
-
-FormFactorPolyhedron::FormFactorPolyhedron(const NodeMeta& meta, const std::vector<double>& PValues)
-    : IFormFactorBorn(meta, PValues)
-{
-}
-
-//! Called by child classes to set faces and other internal variables.
-
-void FormFactorPolyhedron::setPolyhedron(const PolyhedralTopology& topology, double z_bottom,
-                                         const std::vector<kvector_t>& vertices)
-{
-    m_vertices.clear();
-    for (const kvector_t& vertex : vertices)
-        m_vertices.push_back(vertex - kvector_t{0, 0, z_bottom});
-
-    try {
-        m_z_bottom = z_bottom;
-        m_sym_Ci = topology.symmetry_Ci;
-
-        double diameter = 0;
-        for (size_t j = 0; j < vertices.size(); ++j)
-            for (size_t jj = j + 1; jj < vertices.size(); ++jj)
-                diameter = std::max(diameter, (vertices[j] - vertices[jj]).mag());
-
-        m_faces.clear();
-        for (const PolygonalTopology& tf : topology.faces) {
-            std::vector<kvector_t> corners; // of one face
-            for (int i : tf.vertexIndices)
-                corners.push_back(vertices[i]);
-            if (PolyhedralFace::diameter(corners) <= 1e-14 * diameter)
-                continue; // skip ridiculously small face
-            m_faces.push_back(PolyhedralFace(corners, tf.symmetry_S2));
-        }
-        if (m_faces.size() < 4)
-            throw std::logic_error("Less than four non-vanishing faces");
-
-        m_radius = 0;
-        m_volume = 0;
-        for (const PolyhedralFace& Gk : m_faces) {
-            m_radius = std::max(m_radius, Gk.radius3d());
-            m_volume += Gk.pyramidalVolume();
-        }
-        if (m_sym_Ci) {
-            if (m_faces.size() & 1)
-                throw std::logic_error("Odd #faces violates symmetry Ci");
-            size_t N = m_faces.size() / 2;
-            // for this tests, m_faces must be in a specific order
-            for (size_t k = 0; k < N; ++k)
-                m_faces[k].assert_Ci(m_faces[2 * N - 1 - k]);
-            // keep only half of the faces
-            m_faces.erase(m_faces.begin() + N, m_faces.end());
-        }
-    } catch (std::invalid_argument& e) {
-        throw std::invalid_argument("Invalid parameterization of " + getName() + ": " + e.what());
-    } catch (std::logic_error& e) {
-        throw std::logic_error("Bug in " + getName() + ": " + e.what()
-                               + " [please report to the maintainers]");
-    } catch (std::exception& e) {
-        throw std::runtime_error("Unexpected exception in " + getName() + ": " + e.what()
-                                 + " [please report to the maintainers]");
-    }
-}
-
-double FormFactorPolyhedron::bottomZ(const IRotation& rotation) const
-{
-    return BottomZ(m_vertices, rotation);
-}
-
-double FormFactorPolyhedron::topZ(const IRotation& rotation) const
-{
-    return TopZ(m_vertices, rotation);
-}
-
-//! Returns the form factor F(q) of this polyhedron, respecting the offset z_bottom.
-
-complex_t FormFactorPolyhedron::evaluate_for_q(cvector_t q) const
-{
-    try {
-        return exp_I(-m_z_bottom * q.z()) * evaluate_centered(q);
-    } catch (std::logic_error& e) {
-        throw std::logic_error("Bug in " + getName() + ": " + e.what()
-                               + " [please report to the maintainers]");
-    } catch (std::runtime_error& e) {
-        throw std::runtime_error("Numeric computation failed in " + getName() + ": " + e.what()
-                                 + " [please report to the maintainers]");
-    } catch (std::exception& e) {
-        throw std::runtime_error("Unexpected exception in " + getName() + ": " + e.what()
-                                 + " [please report to the maintainers]");
-    }
-}
-
-//! Returns the form factor F(q) of this polyhedron, with origin at z=0.
-
-complex_t FormFactorPolyhedron::evaluate_centered(cvector_t q) const
-{
-    double q_red = m_radius * q.mag();
-#ifdef POLYHEDRAL_DIAGNOSTIC
-    diagnosis.maxOrder = 0;
-    diagnosis.nExpandedFaces = 0;
-#endif
-    if (q_red == 0) {
-        return m_volume;
-    } else if (q_red < q_limit_series) {
-        // summation of power series
-        complex_t sum = 0;
-        complex_t n_fac = (m_sym_Ci ? -2 : -1) / q.mag2();
-        int count_return_condition = 0;
-        for (int n = 2; n < n_limit_series; ++n) {
-            if (m_sym_Ci && n & 1)
-                continue;
-#ifdef POLYHEDRAL_DIAGNOSTIC
-            diagnosis.maxOrder = std::max(diagnosis.maxOrder, n);
-#endif
-            complex_t term = 0;
-            for (const PolyhedralFace& Gk : m_faces) {
-                complex_t tmp = Gk.ff_n(n + 1, q);
-                term += tmp;
-#ifdef POLYHEDRAL_DIAGNOSTIC
-                if (diagnosis.debmsg >= 2)
-                    std::cout << "Gkffn sum=" << term << " incr=" << tmp << "\n";
-#endif
-            }
-            term *= n_fac;
-#ifdef POLYHEDRAL_DIAGNOSTIC
-            if (diagnosis.debmsg >= 1)
-                std::cout << std::scientific << std::showpos << std::setprecision(16)
-                          << "  SUM=" << m_volume + sum << " +TERM=" << term << "\n";
-#endif
-            sum += term;
-            if (std::abs(term) <= eps * std::abs(sum) || std::abs(sum) < eps * m_volume)
-                ++count_return_condition;
-            else
-                count_return_condition = 0;
-            if (count_return_condition > 2)
-                return m_volume + sum; // regular exit
-            n_fac = m_sym_Ci ? -n_fac : mul_I(n_fac);
-        }
-#ifdef POLYHEDRAL_DIAGNOSTIC
-        if (!diagnosis.request_convergence) {
-            std::cout << "series F(q) not converged\n";
-            return m_volume + sum;
-        }
-#endif
-        throw std::runtime_error("Series F(q) not converged");
-    } else {
-        // direct evaluation of analytic formula (coefficients may involve series)
-        complex_t sum = 0;
-        for (const PolyhedralFace& Gk : m_faces) {
-            complex_t qn = Gk.normalProjectionConj(q); // conj(q)*normal
-            if (std::abs(qn) < eps * q.mag())
-                continue;
-            complex_t ff = Gk.ff(q, m_sym_Ci);
-            sum += qn * ff;
-#ifdef POLYHEDRAL_DIAGNOSTIC
-            if (diagnosis.debmsg >= 1)
-                std::cout << std::scientific << std::showpos << std::setprecision(16)
-                          << "  SUM=" << sum << " TERM=" << qn * ff << " qn=" << qn.real()
-                          << " ff=" << ff << "\n";
-#endif
-        }
-        return sum / (I * q.mag2());
-    }
-}
-
-//! Assertions for Platonic solid.
-
-void FormFactorPolyhedron::assert_platonic() const
-{
-    // just one test; one could do much more ...
-    double pyramidal_volume = 0;
-    for (const auto& Gk : m_faces)
-        pyramidal_volume += Gk.pyramidalVolume();
-    pyramidal_volume /= m_faces.size();
-    for (const auto& Gk : m_faces)
-        if (std::abs(Gk.pyramidalVolume() - pyramidal_volume) > 160 * eps * pyramidal_volume) {
-            std::cerr << std::setprecision(16)
-                      << "Bug: pyr_volume(this face)=" << Gk.pyramidalVolume()
-                      << " vs pyr_volume(avge)=" << pyramidal_volume << "\n";
-            throw std::runtime_error("Deviant pyramidal volume in " + getName());
-        }
-}
-
-//**************************************************************************************************
-//  FormFactorPolygonalPrism implementation
-//**************************************************************************************************
-
-FormFactorPolygonalPrism::FormFactorPolygonalPrism(const NodeMeta& meta,
-                                                   const std::vector<double>& PValues)
-    : IFormFactorBorn(meta, PValues)
-{
-}
-
-void FormFactorPolygonalPrism::setPrism(bool symmetry_Ci, const std::vector<kvector_t>& vertices)
-{
-    m_vertices.clear();
-    for (const kvector_t& vertex : vertices) {
-        m_vertices.push_back(vertex);
-        m_vertices.push_back(vertex + kvector_t{0, 0, height()});
-    }
-
-    try {
-        m_base = std::unique_ptr<PolyhedralFace>(new PolyhedralFace(vertices, symmetry_Ci));
-    } catch (std::invalid_argument& e) {
-        throw std::invalid_argument("Invalid parameterization of " + getName() + ": " + e.what());
-    } catch (std::logic_error& e) {
-        throw std::logic_error("Bug in " + getName() + ": " + e.what()
-                               + " [please report to the maintainers]");
-    } catch (std::exception& e) {
-        throw std::runtime_error("Unexpected exception in " + getName() + ": " + e.what()
-                                 + " [please report to the maintainers]");
-    }
-}
-
-double FormFactorPolygonalPrism::bottomZ(const IRotation& rotation) const
-{
-    return BottomZ(m_vertices, rotation);
-}
-
-double FormFactorPolygonalPrism::topZ(const IRotation& rotation) const
-{
-    return TopZ(m_vertices, rotation);
-}
-
-//! Returns the volume of this prism.
-double FormFactorPolygonalPrism::volume() const
-{
-    return height() * m_base->area();
-}
-
-//! Returns the form factor F(q) of this polyhedron, respecting the offset height/2.
-
-complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const
-{
-    try {
-#ifdef POLYHEDRAL_DIAGNOSTIC
-        diagnosis.maxOrder = 0;
-        diagnosis.nExpandedFaces = 0;
-#endif
-        cvector_t qxy(q.x(), q.y(), 0.);
-        return height() * exp_I(height() / 2 * q.z()) * MathFunctions::sinc(height() / 2 * q.z())
-               * m_base->ff_2D(qxy);
-    } catch (std::logic_error& e) {
-        throw std::logic_error("Bug in " + getName() + ": " + e.what()
-                               + " [please report to the maintainers]");
-    } catch (std::runtime_error& e) {
-        throw std::runtime_error("Numeric computation failed in " + getName() + ": " + e.what()
-                                 + " [please report to the maintainers]");
-    } catch (std::exception& e) {
-        throw std::runtime_error("Unexpected exception in " + getName() + ": " + e.what()
-                                 + " [please report to the maintainers]");
-    }
-}
-
-//**************************************************************************************************
-//  FormFactorPolygonalSurface implementation
-//**************************************************************************************************
-
-FormFactorPolygonalSurface::FormFactorPolygonalSurface(const NodeMeta& meta,
-                                                       const std::vector<double>& PValues)
-    : IFormFactorBorn(meta, PValues)
-{
-}
-
-complex_t FormFactorPolygonalSurface::evaluate_for_q(cvector_t q) const
-{
-    try {
-#ifdef POLYHEDRAL_DIAGNOSTIC
-        diagnosis.maxOrder = 0;
-        diagnosis.nExpandedFaces = 0;
-#endif
-        return m_base->ff(q, false);
-    } catch (std::logic_error& e) {
-        throw std::logic_error("Bug in " + getName() + ": " + e.what()
-                               + " [please report to the maintainers]");
-    } catch (std::runtime_error& e) {
-        throw std::runtime_error("Numeric computation failed in " + getName() + ": " + e.what()
-                                 + " [please report to the maintainers]");
-    } catch (std::exception& e) {
-        throw std::runtime_error("Unexpected exception in " + getName() + ": " + e.what()
-                                 + " [please report to the maintainers]");
-    }
-}
diff --git a/Core/HardParticle/PolyhedralComponents.h b/Core/HardParticle/PolyhedralComponents.h
new file mode 100644
index 0000000000000000000000000000000000000000..b7bb8b9f5906e807de2c5dcf2116477858cd441b
--- /dev/null
+++ b/Core/HardParticle/PolyhedralComponents.h
@@ -0,0 +1,83 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/PolyhedralComponents.h
+//! @brief     Defines classes PolyhedralEdge, PolyhedralFace
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#ifndef BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRALCOMPONENTS_H
+#define BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRALCOMPONENTS_H
+
+#include "Core/Basics/Complex.h"
+#include "Core/Vector/Vectors3D.h"
+#include <vector>
+
+//! One edge of a polygon, for form factor computation.
+
+class PolyhedralEdge
+{
+public:
+    PolyhedralEdge(const kvector_t _Vlow, const kvector_t _Vhig);
+
+    kvector_t E() const { return m_E; }
+    kvector_t R() const { return m_R; }
+    complex_t qE(cvector_t q) const { return m_E.dot(q); }
+    complex_t qR(cvector_t q) const { return m_R.dot(q); }
+
+    complex_t contrib(int m, cvector_t qpa, complex_t qrperp) const;
+
+private:
+    kvector_t m_E; //!< vector pointing from mid of edge to upper vertex
+    kvector_t m_R; //!< position vector of edge midpoint
+};
+
+//! A polygon, for form factor computation.
+
+class PolyhedralFace
+{
+public:
+    static double diameter(const std::vector<kvector_t>& V);
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    static void setLimits(double _qpa, int _n);
+#endif // BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRALCOMPONENTS_H
+
+    PolyhedralFace(const std::vector<kvector_t>& _V = std::vector<kvector_t>(),
+                   bool _sym_S2 = false);
+
+    double area() const { return m_area; }
+    double pyramidalVolume() const { return m_rperp * m_area / 3; }
+    double radius3d() const { return m_radius_3d; }
+    //! Returns conj(q)*normal [BasicVector3D::dot is antilinear in 'this' argument]
+    complex_t normalProjectionConj(cvector_t q) const { return q.dot(m_normal); }
+    complex_t ff_n(int m, cvector_t q) const;
+    complex_t ff(cvector_t q, bool sym_Ci) const;
+    complex_t ff_2D(cvector_t qpa) const;
+    void assert_Ci(const PolyhedralFace& other) const;
+
+private:
+    static double qpa_limit_series; //!< determines when use power series
+    static int n_limit_series;
+
+    bool sym_S2; //!< if true, then edges obtainable by inversion are not provided
+    std::vector<PolyhedralEdge> edges;
+    double m_area;
+    kvector_t m_normal; //!< normal vector of this polygon's plane
+    double m_rperp;     //!< distance of this polygon's plane from the origin, along 'm_normal'
+    double m_radius_2d; //!< radius of enclosing cylinder
+    double m_radius_3d; //!< radius of enclosing sphere
+
+    void decompose_q(cvector_t q, complex_t& qperp, cvector_t& qpa) const;
+    complex_t ff_n_core(int m, cvector_t qpa, complex_t qperp) const;
+    complex_t edge_sum_ff(cvector_t q, cvector_t qpa, bool sym_Ci) const;
+    complex_t expansion(complex_t fac_even, complex_t fac_odd, cvector_t qpa,
+                        double abslevel) const;
+};
+
+#endif // BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRALCOMPONENTS_H
diff --git a/Core/HardParticle/PolyhedralTopology.h b/Core/HardParticle/PolyhedralTopology.h
new file mode 100644
index 0000000000000000000000000000000000000000..6ba110882cfacf070b998a7c6df31207e9f7bbb0
--- /dev/null
+++ b/Core/HardParticle/PolyhedralTopology.h
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/PolyhedralTopology.h
+//! @brief     Defines classes PolygonalTopology, PolyhedralTopology
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#ifndef BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRALTOPOLOGY_H
+#define BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRALTOPOLOGY_H
+
+#include <vector>
+
+//! For internal use in PolyhedralFace.
+class PolygonalTopology
+{
+public:
+    std::vector<int> vertexIndices;
+    bool symmetry_S2;
+};
+
+//! For internal use in IFormFactorPolyhedron.
+class PolyhedralTopology
+{
+public:
+    std::vector<PolygonalTopology> faces;
+    bool symmetry_Ci;
+};
+
+#endif // BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRALTOPOLOGY_H
diff --git a/Core/HardParticle/Polyhedron.cpp b/Core/HardParticle/Polyhedron.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d873fd729fcd991a8e76bd007015ebc845056645
--- /dev/null
+++ b/Core/HardParticle/Polyhedron.cpp
@@ -0,0 +1,210 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/Polyhedron.cpp
+//! @brief     Implements class Polyhedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+//! The mathematics implemented here is described in full detail in a paper
+//! by Joachim Wuttke, entitled
+//! "Form factor (Fourier shape transform) of polygon and polyhedron."
+
+#include "Core/HardParticle/Polyhedron.h"
+#include "Core/Tools/MathFunctions.h"
+#include <iomanip>
+#include <iostream>
+#include <stdexcept> // need overlooked by g++ 5.4
+
+namespace
+{
+const double eps = 2e-16;
+const double q_limit_series = 1e-2;
+const int n_limit_series = 20;
+} // namespace
+
+Polyhedron::Polyhedron(const PolyhedralTopology& topology, double z_bottom,
+                       const std::vector<kvector_t>& vertices)
+{
+
+    m_vertices.clear();
+    for (const kvector_t& vertex : vertices)
+        m_vertices.push_back(vertex - kvector_t{0, 0, z_bottom});
+
+    try {
+        m_z_bottom = z_bottom;
+        m_sym_Ci = topology.symmetry_Ci;
+
+        double diameter = 0;
+        for (size_t j = 0; j < vertices.size(); ++j)
+            for (size_t jj = j + 1; jj < vertices.size(); ++jj)
+                diameter = std::max(diameter, (vertices[j] - vertices[jj]).mag());
+
+        m_faces.clear();
+        for (const PolygonalTopology& tf : topology.faces) {
+            std::vector<kvector_t> corners; // of one face
+            for (int i : tf.vertexIndices)
+                corners.push_back(vertices[i]);
+            if (PolyhedralFace::diameter(corners) <= 1e-14 * diameter)
+                continue; // skip ridiculously small face
+            m_faces.push_back(PolyhedralFace(corners, tf.symmetry_S2));
+        }
+        if (m_faces.size() < 4)
+            throw std::logic_error("Less than four non-vanishing faces");
+
+        m_radius = 0;
+        m_volume = 0;
+        for (const PolyhedralFace& Gk : m_faces) {
+            m_radius = std::max(m_radius, Gk.radius3d());
+            m_volume += Gk.pyramidalVolume();
+        }
+        if (m_sym_Ci) {
+            if (m_faces.size() & 1)
+                throw std::logic_error("Odd #faces violates symmetry Ci");
+            size_t N = m_faces.size() / 2;
+            // for this tests, m_faces must be in a specific order
+            for (size_t k = 0; k < N; ++k)
+                m_faces[k].assert_Ci(m_faces[2 * N - 1 - k]);
+            // keep only half of the faces
+            m_faces.erase(m_faces.begin() + N, m_faces.end());
+        }
+    } catch (std::invalid_argument& e) {
+        throw std::invalid_argument(std::string("Invalid parameterization of Polyhedron: ")
+                                    + e.what());
+    } catch (std::logic_error& e) {
+        throw std::logic_error(std::string("Bug in Polyhedron: ") + e.what()
+                               + " [please report to the maintainers]");
+    } catch (std::exception& e) {
+        throw std::runtime_error(std::string("Unexpected exception in Polyhedron: ") + e.what()
+                                 + " [please report to the maintainers]");
+    }
+}
+
+Polyhedron::~Polyhedron() = default;
+
+void Polyhedron::assert_platonic() const
+{
+    // just one test; one could do much more ...
+    double pyramidal_volume = 0;
+    for (const auto& Gk : m_faces)
+        pyramidal_volume += Gk.pyramidalVolume();
+    pyramidal_volume /= m_faces.size();
+    for (const auto& Gk : m_faces)
+        if (std::abs(Gk.pyramidalVolume() - pyramidal_volume) > 160 * eps * pyramidal_volume) {
+            std::cerr << std::setprecision(16)
+                      << "Bug: pyr_volume(this face)=" << Gk.pyramidalVolume()
+                      << " vs pyr_volume(avge)=" << pyramidal_volume << "\n";
+            throw std::runtime_error("Deviant pyramidal volume in Platonic Polyhedron");
+        }
+}
+
+double Polyhedron::volume() const
+{
+    return m_volume;
+}
+double Polyhedron::radius() const
+{
+    return m_radius;
+}
+
+const std::vector<kvector_t>& Polyhedron::vertices()
+{
+    return m_vertices;
+}
+
+//! Returns the form factor F(q) of this polyhedron, respecting the offset z_bottom.
+
+complex_t Polyhedron::evaluate_for_q(const cvector_t& q) const
+{
+    try {
+        return exp_I(-m_z_bottom * q.z()) * evaluate_centered(q);
+    } catch (std::logic_error& e) {
+        throw std::logic_error(std::string("Bug in Polyhedron: ") + e.what()
+                               + " [please report to the maintainers]");
+    } catch (std::runtime_error& e) {
+        throw std::runtime_error(std::string("Numeric computation failed in Polyhedron: ")
+                                 + e.what() + " [please report to the maintainers]");
+    } catch (std::exception& e) {
+        throw std::runtime_error(std::string("Unexpected exception in Polyhedron: ") + e.what()
+                                 + " [please report to the maintainers]");
+    }
+}
+
+//! Returns the form factor F(q) of this polyhedron, with origin at z=0.
+
+complex_t Polyhedron::evaluate_centered(const cvector_t& q) const
+{
+    double q_red = m_radius * q.mag();
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    diagnosis.maxOrder = 0;
+    diagnosis.nExpandedFaces = 0;
+#endif
+    if (q_red == 0) {
+        return m_volume;
+    } else if (q_red < q_limit_series) {
+        // summation of power series
+        complex_t sum = 0;
+        complex_t n_fac = (m_sym_Ci ? -2 : -1) / q.mag2();
+        int count_return_condition = 0;
+        for (int n = 2; n < n_limit_series; ++n) {
+            if (m_sym_Ci && n & 1)
+                continue;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+            diagnosis.maxOrder = std::max(diagnosis.maxOrder, n);
+#endif
+            complex_t term = 0;
+            for (const PolyhedralFace& Gk : m_faces) {
+                complex_t tmp = Gk.ff_n(n + 1, q);
+                term += tmp;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+                if (diagnosis.debmsg >= 2)
+                    std::cout << "Gkffn sum=" << term << " incr=" << tmp << "\n";
+#endif
+            }
+            term *= n_fac;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+            if (diagnosis.debmsg >= 1)
+                std::cout << std::scientific << std::showpos << std::setprecision(16)
+                          << "  SUM=" << m_volume + sum << " +TERM=" << term << "\n";
+#endif
+            sum += term;
+            if (std::abs(term) <= eps * std::abs(sum) || std::abs(sum) < eps * m_volume)
+                ++count_return_condition;
+            else
+                count_return_condition = 0;
+            if (count_return_condition > 2)
+                return m_volume + sum; // regular exit
+            n_fac = m_sym_Ci ? -n_fac : mul_I(n_fac);
+        }
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if (!diagnosis.request_convergence) {
+            std::cout << "series F(q) not converged\n";
+            return m_volume + sum;
+        }
+#endif
+        throw std::runtime_error("Series F(q) not converged");
+    } else {
+        // direct evaluation of analytic formula (coefficients may involve series)
+        complex_t sum = 0;
+        for (const PolyhedralFace& Gk : m_faces) {
+            complex_t qn = Gk.normalProjectionConj(q); // conj(q)*normal
+            if (std::abs(qn) < eps * q.mag())
+                continue;
+            complex_t ff = Gk.ff(q, m_sym_Ci);
+            sum += qn * ff;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+            if (diagnosis.debmsg >= 1)
+                std::cout << std::scientific << std::showpos << std::setprecision(16)
+                          << "  SUM=" << sum << " TERM=" << qn * ff << " qn=" << qn.real()
+                          << " ff=" << ff << "\n";
+#endif
+        }
+        return sum / (I * q.mag2());
+    }
+}
diff --git a/Core/HardParticle/Polyhedron.h b/Core/HardParticle/Polyhedron.h
new file mode 100644
index 0000000000000000000000000000000000000000..39c333b4ab0378073bb747d28ac94df9a41688d2
--- /dev/null
+++ b/Core/HardParticle/Polyhedron.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/Polyhedron.h
+//! @brief     Defines class Polyhedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#ifndef BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRON_H
+#define BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRON_H
+
+#include "Core/HardParticle/PolyhedralComponents.h"
+#include "Core/HardParticle/PolyhedralTopology.h"
+#include <memory>
+
+//! A polyhedron, implementation class for use in IFormFactorPolyhedron
+
+class BA_CORE_API_ Polyhedron
+{
+public:
+    Polyhedron() = delete;
+    Polyhedron(const Polyhedron&) = delete;
+    Polyhedron(const PolyhedralTopology& topology, double z_bottom,
+               const std::vector<kvector_t>& vertices);
+    ~Polyhedron();
+    void assert_platonic() const;
+    double volume() const;
+    double radius() const;
+    const std::vector<kvector_t>& vertices(); //! needed for topZ, bottomZ computation
+    complex_t evaluate_for_q(const cvector_t& q) const;
+    complex_t evaluate_centered(const cvector_t& q) const;
+
+private:
+    double m_z_bottom;
+    bool m_sym_Ci; //!< if true, then faces obtainable by inversion are not provided
+
+    std::vector<PolyhedralFace> m_faces;
+    double m_radius;
+    double m_volume;
+    std::vector<kvector_t> m_vertices; //! for topZ, bottomZ computation only
+};
+
+#endif // BORNAGAIN_CORE_HARDPARTICLE_POLYHEDRON_H
diff --git a/Core/HardParticle/Prism.cpp b/Core/HardParticle/Prism.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..eb72f5aa3f98209c37029236b41991412e13ef4d
--- /dev/null
+++ b/Core/HardParticle/Prism.cpp
@@ -0,0 +1,79 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/Prism.cpp
+//! @brief     Implements class Prism.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+//! The mathematics implemented here is described in full detail in a paper
+//! by Joachim Wuttke, entitled
+//! "Form factor (Fourier shape transform) of polygon and polyhedron."
+
+#include "Core/HardParticle/Prism.h"
+#include "Core/Tools/MathFunctions.h"
+#include <stdexcept> // need overlooked by g++ 5.4
+
+namespace
+{
+const double eps = 2e-16;
+} // namespace
+
+Prism::Prism(bool symmetry_Ci, double height, const std::vector<kvector_t>& vertices)
+{
+    m_height = height;
+    m_vertices.clear();
+    for (const kvector_t& vertex : vertices) {
+        m_vertices.push_back(vertex);
+        m_vertices.push_back(vertex + kvector_t{0, 0, m_height});
+    }
+
+    try {
+        m_base = std::unique_ptr<PolyhedralFace>(new PolyhedralFace(vertices, symmetry_Ci));
+    } catch (std::invalid_argument& e) {
+        throw std::invalid_argument(std::string("Invalid parameterization of Prism: ")
+                                    + e.what());
+    } catch (std::logic_error& e) {
+        throw std::logic_error(std::string("Bug in Prism: ") + e.what()
+                               + " [please report to the maintainers]");
+    } catch (std::exception& e) {
+        throw std::runtime_error(std::string("Unexpected exception in Prism: ") + e.what()
+                                 + " [please report to the maintainers]");
+    }
+}
+
+double Prism::area() const { return m_base->area(); }
+
+const std::vector<kvector_t>& Prism::vertices()
+{
+    return m_vertices;
+}
+
+
+complex_t Prism::evaluate_for_q(const cvector_t& q) const
+{
+    try {
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        diagnosis.maxOrder = 0;
+        diagnosis.nExpandedFaces = 0;
+#endif
+        cvector_t qxy(q.x(), q.y(), 0.);
+        return m_height * exp_I(m_height / 2 * q.z()) * MathFunctions::sinc(m_height / 2 * q.z())
+               * m_base->ff_2D(qxy);
+    } catch (std::logic_error& e) {
+        throw std::logic_error(std::string("Bug in Prism: ") + e.what()
+                               + " [please report to the maintainers]");
+    } catch (std::runtime_error& e) {
+        throw std::runtime_error(std::string("Numeric computation failed in Prism: ") + e.what()
+                                 + " [please report to the maintainers]");
+    } catch (std::exception& e) {
+        throw std::runtime_error(std::string("Unexpected exception in Prism: ") + e.what()
+                                 + " [please report to the maintainers]");
+    }
+}
diff --git a/Core/HardParticle/Prism.h b/Core/HardParticle/Prism.h
new file mode 100644
index 0000000000000000000000000000000000000000..607888a67d660e2dd9bf4b3db9ff50fb18b522c6
--- /dev/null
+++ b/Core/HardParticle/Prism.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/Prism.h
+//! @brief     Defines class Prism.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#ifndef BORNAGAIN_CORE_HARDPARTICLE_PRISM_H
+#define BORNAGAIN_CORE_HARDPARTICLE_PRISM_H
+
+#include "Core/HardParticle/PolyhedralComponents.h"
+#include "Core/HardParticle/PolyhedralTopology.h"
+#include <memory>
+
+class BA_CORE_API_ Prism
+{
+public:
+    Prism() = delete;
+    Prism(const Prism&) = delete;
+    Prism(bool symmetry_Ci, double height, const std::vector<kvector_t>& vertices);
+    double area() const;
+    const std::vector<kvector_t>& vertices(); //! needed for topZ, bottomZ computation
+    complex_t evaluate_for_q(const cvector_t& q) const;
+    // complex_t evaluate_centered(const cvector_t& q) const;
+private:
+    std::unique_ptr<PolyhedralFace> m_base;
+    double m_height;
+    std::vector<kvector_t> m_vertices; //! for topZ, bottomZ computation only
+};
+
+#endif // BORNAGAIN_CORE_HARDPARTICLE_PRISM_H
diff --git a/Core/InputOutput/DataFormatUtils.cpp b/Core/InputOutput/DataFormatUtils.cpp
index 3efdf10ff570de486ba26df06f7aa5400b56f6be..dea1f1f7dffd98c963f992b592cf053d8a288303 100644
--- a/Core/InputOutput/DataFormatUtils.cpp
+++ b/Core/InputOutput/DataFormatUtils.cpp
@@ -164,7 +164,7 @@ std::istringstream getAxisStringRepresentation(std::istream& input_stream)
     return std::istringstream(line);
 }
 
-//! Create one of FixedBinAxis from string representation
+//! Creates one of FixedBinAxis from string representation
 //! FixedBinAxis("axis0", 10, -1, 1)
 //! ConstKBinAxis("axis0", 10, -1, 1)
 //! CustomBinAxis("axis0", 10, -1, 1)
@@ -186,7 +186,7 @@ template <class Axis> std::unique_ptr<IAxis> createFixedBinLikeAxis(std::istring
     return std::make_unique<Axis>(name, nbins, boundaries[0], boundaries[1]);
 }
 
-//! Create VariableBinAxis from string representation
+//! Creates VariableBinAxis from string representation
 //! VariableBinAxis("axis0", 4, [-1, -0.5, 0.5, 1, 2])
 std::unique_ptr<IAxis> createVariableBinAxis(std::istringstream iss)
 {
@@ -205,7 +205,7 @@ std::unique_ptr<IAxis> createVariableBinAxis(std::istringstream iss)
     return std::make_unique<VariableBinAxis>(name, nbins, boundaries);
 }
 
-//! Create createPointwiseAxis from string representation
+//! Creates createPointwiseAxis from string representation
 //! PointwiseAxis("axis0", [-0.5, 0.5, 1, 2])
 std::unique_ptr<IAxis> createPointwiseAxis(std::istringstream iss)
 {
diff --git a/Core/Intensity/Histogram1D.h b/Core/Intensity/Histogram1D.h
index fd8780e94532ddc6673766fa119f721dcf2ffb3a..2b1a65da7825f2123430eacffa956c6c4e800668 100644
--- a/Core/Intensity/Histogram1D.h
+++ b/Core/Intensity/Histogram1D.h
@@ -65,7 +65,7 @@ public:
     PyObject* getBinErrorsNumpy() const;
 #endif
 
-    //! Create new histogram by applying crop on axis.
+    //! Creates new histogram by applying crop on axis.
     Histogram1D* crop(double xmin, double xmax);
 };
 
diff --git a/Core/Intensity/Histogram2D.h b/Core/Intensity/Histogram2D.h
index 17eb5290680152f44eb4fe5496c3dc62af991c8d..c29369c6bb0c16a3860f6bab5a0354cd8b6a6ddd 100644
--- a/Core/Intensity/Histogram2D.h
+++ b/Core/Intensity/Histogram2D.h
@@ -91,7 +91,7 @@ public:
     //! @param xup upper edje on x-axis
     Histogram1D* projectionY(double xlow, double xup);
 
-    //! Create new histogram by applying rectangular clip.
+    //! Creates new histogram by applying rectangular clip.
     Histogram2D* crop(double xmin, double ymin, double xmax, double ymax);
 
     //! Sets the values in histograms channels from numpy array,
diff --git a/Core/Lattice/Lattice.h b/Core/Lattice/Lattice.h
index 9c4ee65275dc5aef8c8bd3750da0973093d8fb66..a84d178efb5590e9dd075110752b6363030d23c4 100644
--- a/Core/Lattice/Lattice.h
+++ b/Core/Lattice/Lattice.h
@@ -35,7 +35,7 @@ public:
 
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
-    //! Create transformed lattice
+    //! Creates transformed lattice
     Lattice createTransformedLattice(const Transform3D& transform) const;
 
     //! Initializes cached data
diff --git a/Core/Lattice/LatticeUtils.cpp b/Core/Lattice/LatticeUtils.cpp
index 6b8670513db75c03a2e7f1e19d9799fed3112ef4..6915bf20a9c64c00e9140f612467877d147e1399 100644
--- a/Core/Lattice/LatticeUtils.cpp
+++ b/Core/Lattice/LatticeUtils.cpp
@@ -15,7 +15,7 @@
 #include "Core/Lattice/LatticeUtils.h"
 #include "Core/Lattice/ILatticeOrientation.h"
 
-Lattice LatticeUtils::CreateFCCLattice(double lattice_constant,
+Lattice LatticeUtils::createFCCLattice(double lattice_constant,
                                        const ILatticeOrientation& orientation)
 {
     Lattice prim_cubic = Lattice::createCubicLattice(1.0);
@@ -26,7 +26,7 @@ Lattice LatticeUtils::CreateFCCLattice(double lattice_constant,
     return fcc.createTransformedLattice(rotation);
 }
 
-Lattice LatticeUtils::CreateHCPLattice(double a, double c, const ILatticeOrientation& orientation)
+Lattice LatticeUtils::createHCPLattice(double a, double c, const ILatticeOrientation& orientation)
 {
     Lattice prim_hexagonal = Lattice::createHexagonalLattice(1.0, c / a);
     std::unique_ptr<ILatticeOrientation> P_orientation(orientation.clone());
@@ -36,7 +36,7 @@ Lattice LatticeUtils::CreateHCPLattice(double a, double c, const ILatticeOrienta
     return hcp.createTransformedLattice(rotation);
 }
 
-Lattice LatticeUtils::CreateBCTLattice(double a, double c, const ILatticeOrientation& orientation)
+Lattice LatticeUtils::createBCTLattice(double a, double c, const ILatticeOrientation& orientation)
 {
     Lattice prim_tetragonal = Lattice::createTetragonalLattice(1.0, c / a);
     std::unique_ptr<ILatticeOrientation> P_orientation(orientation.clone());
diff --git a/Core/Lattice/LatticeUtils.h b/Core/Lattice/LatticeUtils.h
index c4a3736c46f8c65454b1c900b4cb2ec674c90171..2394aca06c4fdeb5b3b414c386f290de055c287e 100644
--- a/Core/Lattice/LatticeUtils.h
+++ b/Core/Lattice/LatticeUtils.h
@@ -22,10 +22,10 @@ class ILatticeOrientation;
 
 namespace LatticeUtils
 {
-BA_CORE_API_ Lattice CreateFCCLattice(double lattice_constant,
+BA_CORE_API_ Lattice createFCCLattice(double lattice_constant,
                                       const ILatticeOrientation& orientation);
-BA_CORE_API_ Lattice CreateHCPLattice(double a, double c, const ILatticeOrientation& orientation);
-BA_CORE_API_ Lattice CreateBCTLattice(double a, double c, const ILatticeOrientation& orientation);
+BA_CORE_API_ Lattice createHCPLattice(double a, double c, const ILatticeOrientation& orientation);
+BA_CORE_API_ Lattice createBCTLattice(double a, double c, const ILatticeOrientation& orientation);
 } // namespace LatticeUtils
 
 #endif // BORNAGAIN_CORE_LATTICE_LATTICEUTILS_H
diff --git a/Core/Multilayer/SlicedFormFactorList.cpp b/Core/Multilayer/SlicedFormFactorList.cpp
index 04769377dada75a214e3b0e072592e71809f81ae..892c07f9ab6683e00ac0209e4c757027109b86c6 100644
--- a/Core/Multilayer/SlicedFormFactorList.cpp
+++ b/Core/Multilayer/SlicedFormFactorList.cpp
@@ -29,7 +29,7 @@ ZLimits SlicesZLimits(const std::vector<Slice>& slices, size_t slice_index);
 void ScaleRegions(std::vector<HomogeneousRegion>& regions, double factor);
 } // namespace
 
-SlicedFormFactorList SlicedFormFactorList::CreateSlicedFormFactors(const IParticle& particle,
+SlicedFormFactorList SlicedFormFactorList::createSlicedFormFactors(const IParticle& particle,
                                                                    const std::vector<Slice>& slices,
                                                                    double z_ref)
 {
diff --git a/Core/Multilayer/SlicedFormFactorList.h b/Core/Multilayer/SlicedFormFactorList.h
index e303b2a2ea5a1297fe44afc731e789dbd604e334..89cbe5fc7669d1060bf22d86934154aed55cb77a 100644
--- a/Core/Multilayer/SlicedFormFactorList.h
+++ b/Core/Multilayer/SlicedFormFactorList.h
@@ -36,7 +36,7 @@ public:
     SlicedFormFactorList& operator=(SlicedFormFactorList&& other) = default;
     ~SlicedFormFactorList() = default;
 
-    static SlicedFormFactorList CreateSlicedFormFactors(const IParticle& particle,
+    static SlicedFormFactorList createSlicedFormFactors(const IParticle& particle,
                                                         const std::vector<Slice>& slices,
                                                         double z_ref);
 
diff --git a/Core/Particle/HomogeneousRegion.cpp b/Core/Particle/HomogeneousRegion.cpp
index 9ccd816e261e9f898bc3089565b82f93d8c913d3..254e58a2136c2bc176dcf8b98832a1a4a6bceb82 100644
--- a/Core/Particle/HomogeneousRegion.cpp
+++ b/Core/Particle/HomogeneousRegion.cpp
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      Core/Particle/HomogeneousRegion.cpp
-//! @brief     Implements fct CreateAveragedMaterial
+//! @brief     Implements fct createAveragedMaterial
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -35,7 +35,7 @@ T averageData(const Material& layer_mat, const std::vector<HomogeneousRegion>& r
 
 } // namespace
 
-Material CreateAveragedMaterial(const Material& layer_mat,
+Material createAveragedMaterial(const Material& layer_mat,
                                 const std::vector<HomogeneousRegion>& regions)
 {
     // determine the type of returned material
diff --git a/Core/Particle/HomogeneousRegion.h b/Core/Particle/HomogeneousRegion.h
index 4f3b7221504b7cdb32671f75731aca77cbad5872..49f6974e950ae13449e2900bd30fe2b170b345ed 100644
--- a/Core/Particle/HomogeneousRegion.h
+++ b/Core/Particle/HomogeneousRegion.h
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      Core/Particle/HomogeneousRegion.h
-//! @brief     Defines struct HomogeneousRegion, and declares fct CreateAveragedMaterial
+//! @brief     Defines struct HomogeneousRegion, and declares fct createAveragedMaterial
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -35,7 +35,7 @@ struct HomogeneousRegion {
 
 //! Creates averaged material. Square refractive index of returned material is arithmetic mean over
 //! _regions_ and _layer_mat_. Magnetization (if present) is averaged linearly.
-BA_CORE_API_ Material CreateAveragedMaterial(const Material& layer_mat,
+BA_CORE_API_ Material createAveragedMaterial(const Material& layer_mat,
                                              const std::vector<HomogeneousRegion>& regions);
 
 #endif // SWIG
diff --git a/Core/Particle/IParticle.h b/Core/Particle/IParticle.h
index ade5a4788f947e95ac8e6173950625adaa7924b4..748843cbd8c832f20106501528d9dd1e0e0f3fd8 100644
--- a/Core/Particle/IParticle.h
+++ b/Core/Particle/IParticle.h
@@ -34,10 +34,10 @@ public:
     ~IParticle() {}
     IParticle* clone() const override = 0;
 
-    //! Create a form factor for this particle
+    //! Creates a form factor for this particle
     virtual IFormFactor* createFormFactor() const;
 
-    //! Create a sliced form factor for this particle
+    //! Creates a sliced form factor for this particle
     virtual SlicedParticle createSlicedParticle(ZLimits limits) const;
 
     //! Returns particle position.
diff --git a/Core/Scattering/IFormFactor.cpp b/Core/Scattering/IFormFactor.cpp
index 2c7f1fb584d75ecb5102147f10aa837ee25f56be..4a3d42d2d99119245103bfae0119493332dba9a1 100644
--- a/Core/Scattering/IFormFactor.cpp
+++ b/Core/Scattering/IFormFactor.cpp
@@ -39,7 +39,7 @@ IFormFactor* IFormFactor::createSlicedFormFactor(ZLimits limits, const IRotation
                                                  kvector_t translation) const
 {
     if (ShapeIsContainedInLimits(*this, limits, rot, translation))
-        return CreateTransformedFormFactor(*this, rot, translation);
+        return createTransformedFormFactor(*this, rot, translation);
     if (ShapeOutsideLimits(*this, limits, rot, translation))
         return nullptr;
     if (canSliceAnalytically(rot))
@@ -77,7 +77,7 @@ IFormFactor* IFormFactor::sliceFormFactor(ZLimits, const IRotation&, kvector_t)
     throw std::runtime_error(getName() + "::sliceFormFactor error: not implemented!");
 }
 
-IFormFactor* CreateTransformedFormFactor(const IFormFactor& formfactor, const IRotation& rot,
+IFormFactor* createTransformedFormFactor(const IFormFactor& formfactor, const IRotation& rot,
                                          kvector_t translation)
 {
     std::unique_ptr<IFormFactor> P_fftemp, P_result;
diff --git a/Core/Scattering/IFormFactor.h b/Core/Scattering/IFormFactor.h
index 1107a95ca37813c394268e1cb9f73bb52a365325..75c31e8b850af42a9eeb9f82aa178db64cc61865 100644
--- a/Core/Scattering/IFormFactor.h
+++ b/Core/Scattering/IFormFactor.h
@@ -89,7 +89,7 @@ protected:
                                          kvector_t translation) const;
 };
 
-IFormFactor* CreateTransformedFormFactor(const IFormFactor& formfactor, const IRotation& rot,
+IFormFactor* createTransformedFormFactor(const IFormFactor& formfactor, const IRotation& rot,
                                          kvector_t translation);
 
 #endif // BORNAGAIN_CORE_SCATTERING_IFORMFACTOR_H
diff --git a/Core/Scattering/IFormFactorBorn.h b/Core/Scattering/IFormFactorBorn.h
index fa2555168156b4afac7ec18c38ed4fe82d9aba82..2f62695ccaadeab845332cbce04075c6f2e95d3a 100644
--- a/Core/Scattering/IFormFactorBorn.h
+++ b/Core/Scattering/IFormFactorBorn.h
@@ -19,7 +19,7 @@
 #include "Core/Shapes/IShape.h"
 #include "Core/Vector/Vectors3D.h"
 
-struct SlicingEffects;
+struct SlicingEffects; // defined below
 
 //! Pure virtual base class for Born form factors.
 //!
diff --git a/Core/StandardSamples/FeNiBiLayerBuilder.h b/Core/StandardSamples/FeNiBiLayerBuilder.h
index 9e40d5fc50740f9ef93fe52d6f67600bc96ed6f6..38e67c1e08617aa084921a1261dfca8765818101 100644
--- a/Core/StandardSamples/FeNiBiLayerBuilder.h
+++ b/Core/StandardSamples/FeNiBiLayerBuilder.h
@@ -13,8 +13,8 @@
 //
 // ************************************************************************** //
 
-#ifndef BORNAGAIN_CORE_STANDARDSAMPLES_FENIBILAYERBUILER_H
-#define BORNAGAIN_CORE_STANDARDSAMPLES_FENIBILAYERBUILER_H
+#ifndef BORNAGAIN_CORE_STANDARDSAMPLES_FENIBILAYERBUILDER_H
+#define BORNAGAIN_CORE_STANDARDSAMPLES_FENIBILAYERBUILDER_H
 
 #include "Core/Multilayer/IMultiLayerBuilder.h"
 #include "Core/Multilayer/MultiLayer.h"
@@ -134,4 +134,4 @@ public:
     MultiLayer* buildSample() const;
 };
 
-#endif // BORNAGAIN_CORE_STANDARDSAMPLES_FENIBILAYERBUILER_H
+#endif // BORNAGAIN_CORE_STANDARDSAMPLES_FENIBILAYERBUILDER_H
diff --git a/GUI/coregui/Views/InfoWidgets/ComboSelectorDialog.cpp b/GUI/coregui/Views/InfoWidgets/ComboSelectorDialog.cpp
index 61f5e944ff08752d69efa483a6af115ea5506af7..aabf0803a815dfd67f6e3d15a9f051427b358869 100644
--- a/GUI/coregui/Views/InfoWidgets/ComboSelectorDialog.cpp
+++ b/GUI/coregui/Views/InfoWidgets/ComboSelectorDialog.cpp
@@ -87,7 +87,7 @@ QBoxLayout* ComboSelectorDialog::createLogoLayout()
     return result;
 }
 
-//! Create right layout with text and QComboBox selection.
+//! Creates right layout with text and QComboBox selection.
 
 QBoxLayout* ComboSelectorDialog::createInfoLayout()
 {
diff --git a/GUI/coregui/Views/InfoWidgets/DetailedMessageBox.cpp b/GUI/coregui/Views/InfoWidgets/DetailedMessageBox.cpp
index 25f283e3eaefc5e3e543f4fcd1aad800ef487823..d7f5fde837e6ee65f8970ce873cc3bfc5aed5fe7 100644
--- a/GUI/coregui/Views/InfoWidgets/DetailedMessageBox.cpp
+++ b/GUI/coregui/Views/InfoWidgets/DetailedMessageBox.cpp
@@ -89,7 +89,7 @@ QBoxLayout* DetailedMessageBox::createLogoLayout()
     return result;
 }
 
-//! Create right layout with text and QComboBox selection.
+//! Creates right layout with text and QComboBox selection.
 
 QBoxLayout* DetailedMessageBox::createInfoLayout()
 {
diff --git a/Tests/UnitTests/Core/Other/MaterialTest.cpp b/Tests/UnitTests/Core/Other/MaterialTest.cpp
index a8e261d6484bcf88a00bab564fc43e7d7e4dcc2e..942824968e6ea2276a2b3b773428b7b08fe1344d 100644
--- a/Tests/UnitTests/Core/Other/MaterialTest.cpp
+++ b/Tests/UnitTests/Core/Other/MaterialTest.cpp
@@ -146,14 +146,14 @@ TEST_F(MaterialTest, AveragedMaterialTest)
     const std::vector<HomogeneousRegion> regions = {HomogeneousRegion{0.25, material},
                                                     HomogeneousRegion{0.25, material}};
 
-    const Material material_avr = CreateAveragedMaterial(material, regions);
+    const Material material_avr = createAveragedMaterial(material, regions);
     EXPECT_EQ(material_avr.magnetization(), magnetization);
     EXPECT_DOUBLE_EQ(material_avr.materialData().real(), 0.5);
     EXPECT_DOUBLE_EQ(material_avr.materialData().imag(), 0.5);
     EXPECT_TRUE(material_avr.typeID() == MATERIAL_TYPES::RefractiveMaterial);
 
     const Material material2 = MaterialBySLD();
-    const Material material_avr2 = CreateAveragedMaterial(material2, regions);
+    const Material material_avr2 = createAveragedMaterial(material2, regions);
     const complex_t expected_res = std::conj(1.0 - std::sqrt(complex_t(0.5, 0.25)));
     EXPECT_DOUBLE_EQ(material_avr2.materialData().real(), expected_res.real());
     EXPECT_DOUBLE_EQ(material_avr2.materialData().imag(), expected_res.imag());
@@ -161,12 +161,12 @@ TEST_F(MaterialTest, AveragedMaterialTest)
     EXPECT_TRUE(material_avr2.typeID() == MATERIAL_TYPES::RefractiveMaterial);
 
     const Material material3 = MaterialBySLD("Material3", 0.5, 0.5, magnetization);
-    EXPECT_THROW(CreateAveragedMaterial(material3, regions), std::runtime_error);
+    EXPECT_THROW(createAveragedMaterial(material3, regions), std::runtime_error);
 
     const Material material4 = HomogeneousMaterial();
     const std::vector<HomogeneousRegion> regions2 = {HomogeneousRegion{0.25, material3},
                                                      HomogeneousRegion{0.25, material3}};
-    const Material material_avr3 = CreateAveragedMaterial(material4, regions2);
+    const Material material_avr3 = createAveragedMaterial(material4, regions2);
     EXPECT_DOUBLE_EQ(material_avr3.materialData().real(), 0.25);
     EXPECT_DOUBLE_EQ(material_avr3.materialData().imag(), 0.25);
     EXPECT_EQ(material_avr3.magnetization(), kvector_t(0.5, 0.0, 0.0));
diff --git a/Tests/UnitTests/Core/Sample/LatticeUtilsTest.cpp b/Tests/UnitTests/Core/Sample/LatticeUtilsTest.cpp
index 894d2bcb02152d5641297382e94ab0b3889435fa..933f57f76af098ff254b484768dda67b8b3364b3 100644
--- a/Tests/UnitTests/Core/Sample/LatticeUtilsTest.cpp
+++ b/Tests/UnitTests/Core/Sample/LatticeUtilsTest.cpp
@@ -11,7 +11,7 @@ TEST_F(LatticeUtilsTest, cubeAlignedFCCTest)
 {
     MillerIndexOrientation q_aligned(MillerIndexOrientation::QZ, {0, 0, 1},
                                      MillerIndexOrientation::QY, {0, 1, 0});
-    auto lattice = LatticeUtils::CreateFCCLattice(2.0, q_aligned);
+    auto lattice = LatticeUtils::createFCCLattice(2.0, q_aligned);
     auto a1 = lattice.getBasisVectorA();
     auto a2 = lattice.getBasisVectorB();
     auto a3 = lattice.getBasisVectorC();
@@ -30,7 +30,7 @@ TEST_F(LatticeUtilsTest, diagonalAlignedFCCTest)
 {
     MillerIndexOrientation diagonal_aligned(MillerIndexOrientation::QZ, {1, 1, 1},
                                             MillerIndexOrientation::QX, {1, 1, 0});
-    auto lattice = LatticeUtils::CreateFCCLattice(2.0, diagonal_aligned);
+    auto lattice = LatticeUtils::createFCCLattice(2.0, diagonal_aligned);
     auto a1 = lattice.getBasisVectorA();
     auto a2 = lattice.getBasisVectorB();
     auto a3 = lattice.getBasisVectorC();
@@ -46,7 +46,7 @@ TEST_F(LatticeUtilsTest, trivialAlignedHCPTest)
 {
     MillerIndexOrientation trivial_aligned(MillerIndexOrientation::QZ, {0, 0, 1},
                                            MillerIndexOrientation::QX, {2, -1, 0});
-    auto lattice = LatticeUtils::CreateHCPLattice(2.0, 4.0, trivial_aligned);
+    auto lattice = LatticeUtils::createHCPLattice(2.0, 4.0, trivial_aligned);
     auto a1 = lattice.getBasisVectorA();
     auto a2 = lattice.getBasisVectorB();
     auto a3 = lattice.getBasisVectorC();
@@ -65,7 +65,7 @@ TEST_F(LatticeUtilsTest, tetraAlignedFCCTest)
 {
     MillerIndexOrientation q_aligned(MillerIndexOrientation::QZ, {0, 0, 1},
                                      MillerIndexOrientation::QY, {0, 1, 0});
-    auto lattice = LatticeUtils::CreateBCTLattice(2.0, 2.0, q_aligned);
+    auto lattice = LatticeUtils::createBCTLattice(2.0, 2.0, q_aligned);
     auto a1 = lattice.getBasisVectorA();
     auto a2 = lattice.getBasisVectorB();
     auto a3 = lattice.getBasisVectorC();
@@ -84,7 +84,7 @@ TEST_F(LatticeUtilsTest, diagonalAlignedBCTTest)
 {
     MillerIndexOrientation diagonal_aligned(MillerIndexOrientation::QZ, {1, 1, 1},
                                             MillerIndexOrientation::QX, {1, 1, 0});
-    auto lattice = LatticeUtils::CreateBCTLattice(2.0, 2.0, diagonal_aligned);
+    auto lattice = LatticeUtils::createBCTLattice(2.0, 2.0, diagonal_aligned);
     auto a1 = lattice.getBasisVectorA();
     auto a2 = lattice.getBasisVectorB();
     auto a3 = lattice.getBasisVectorC();
diff --git a/Wrap/swig/libBornAgainCore.i b/Wrap/swig/libBornAgainCore.i
index e8c24f657e3137bdb5c19a31ed45f5153b7285fe..df87faa32cedb26122e8bafddac74f881e165c2a 100644
--- a/Wrap/swig/libBornAgainCore.i
+++ b/Wrap/swig/libBornAgainCore.i
@@ -140,8 +140,8 @@
 #include "Core/HardParticle/FormFactorIcosahedron.h"
 #include "Core/HardParticle/FormFactorLongBoxGauss.h"
 #include "Core/HardParticle/FormFactorLongBoxLorentz.h"
-#include "Core/HardParticle/FormFactorPolyhedron.h"
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPrism.h"
 #include "Core/HardParticle/FormFactorPrism3.h"
 #include "Core/HardParticle/FormFactorPrism6.h"
 #include "Core/HardParticle/FormFactorPyramid.h"
@@ -402,8 +402,8 @@
 %rename(RoughnessModel) RoughnessModelWrap;
 %include "Core/Multilayer/RoughnessModels.h"
 
-%include "Core/HardParticle/FormFactorPolyhedron.h"
-%include "Core/HardParticle/FormFactorPolyhedron.h"
+%include "Core/HardParticle/IFormFactorPolyhedron.h"
+%include "Core/HardParticle/IFormFactorPrism.h"
 %include "Core/HardParticle/IProfileRipple.h"
 
 %include "Core/HardParticle/FormFactorAnisoPyramid.h"
diff --git a/auto/Wrap/doxygen_core.i b/auto/Wrap/doxygen_core.i
index e8933bafd252bf8092b441097f53d40de39f1f1e..a26c470a434959481a16daa6f8b7791ce71e93f4 100644
--- a/auto/Wrap/doxygen_core.i
+++ b/auto/Wrap/doxygen_core.i
@@ -2266,6 +2266,84 @@ Returns true if area defined by two bins is inside or on border of ellipse; more
 ";
 
 
+// File: classFeNiBiLayer.xml
+%feature("docstring") FeNiBiLayer "
+
+Creates the sample demonstrating an Fe-Ni Bilayer with and without roughness
+
+C++ includes: FeNiBiLayerBuilder.h
+";
+
+%feature("docstring")  FeNiBiLayer::FeNiBiLayer "FeNiBiLayer::FeNiBiLayer()
+";
+
+%feature("docstring")  FeNiBiLayer::FeNiBiLayer "FeNiBiLayer::FeNiBiLayer(Options opt)
+";
+
+%feature("docstring")  FeNiBiLayer::release "MultiLayer* FeNiBiLayer::release()
+";
+
+
+// File: classFeNiBiLayerBuilder.xml
+%feature("docstring") FeNiBiLayerBuilder "";
+
+%feature("docstring")  FeNiBiLayerBuilder::FeNiBiLayerBuilder "FeNiBiLayerBuilder::FeNiBiLayerBuilder()
+";
+
+%feature("docstring")  FeNiBiLayerBuilder::buildSample "MultiLayer * FeNiBiLayerBuilder::buildSample() const
+";
+
+
+// File: classFeNiBiLayerNCBuilder.xml
+%feature("docstring") FeNiBiLayerNCBuilder "";
+
+%feature("docstring")  FeNiBiLayerNCBuilder::FeNiBiLayerNCBuilder "FeNiBiLayerNCBuilder::FeNiBiLayerNCBuilder()
+";
+
+%feature("docstring")  FeNiBiLayerNCBuilder::buildSample "MultiLayer * FeNiBiLayerNCBuilder::buildSample() const
+";
+
+
+// File: classFeNiBiLayerSpinFlipBuilder.xml
+%feature("docstring") FeNiBiLayerSpinFlipBuilder "";
+
+%feature("docstring")  FeNiBiLayerSpinFlipBuilder::FeNiBiLayerSpinFlipBuilder "FeNiBiLayerSpinFlipBuilder::FeNiBiLayerSpinFlipBuilder()
+";
+
+%feature("docstring")  FeNiBiLayerSpinFlipBuilder::buildSample "MultiLayer * FeNiBiLayerSpinFlipBuilder::buildSample() const
+";
+
+
+// File: classFeNiBiLayerSpinFlipNCBuilder.xml
+%feature("docstring") FeNiBiLayerSpinFlipNCBuilder "";
+
+%feature("docstring")  FeNiBiLayerSpinFlipNCBuilder::FeNiBiLayerSpinFlipNCBuilder "FeNiBiLayerSpinFlipNCBuilder::FeNiBiLayerSpinFlipNCBuilder()
+";
+
+%feature("docstring")  FeNiBiLayerSpinFlipNCBuilder::buildSample "MultiLayer * FeNiBiLayerSpinFlipNCBuilder::buildSample() const
+";
+
+
+// File: classFeNiBiLayerSpinFlipTanhBuilder.xml
+%feature("docstring") FeNiBiLayerSpinFlipTanhBuilder "";
+
+%feature("docstring")  FeNiBiLayerSpinFlipTanhBuilder::FeNiBiLayerSpinFlipTanhBuilder "FeNiBiLayerSpinFlipTanhBuilder::FeNiBiLayerSpinFlipTanhBuilder()
+";
+
+%feature("docstring")  FeNiBiLayerSpinFlipTanhBuilder::buildSample "MultiLayer * FeNiBiLayerSpinFlipTanhBuilder::buildSample() const
+";
+
+
+// File: classFeNiBiLayerTanhBuilder.xml
+%feature("docstring") FeNiBiLayerTanhBuilder "";
+
+%feature("docstring")  FeNiBiLayerTanhBuilder::FeNiBiLayerTanhBuilder "FeNiBiLayerTanhBuilder::FeNiBiLayerTanhBuilder()
+";
+
+%feature("docstring")  FeNiBiLayerTanhBuilder::buildSample "MultiLayer * FeNiBiLayerTanhBuilder::buildSample() const
+";
+
+
 // File: classExceptions_1_1FileIsBadException.xml
 %feature("docstring") Exceptions::FileIsBadException "";
 
@@ -2971,7 +3049,7 @@ Calls the  INodeVisitor's visit method.
 
 %feature("docstring")  FormFactorBox::volume "double FormFactorBox::volume() const override final
 
-Returns the volume of this prism. 
+Returns the total volume of the particle of this form factor's shape. 
 ";
 
 %feature("docstring")  FormFactorBox::radialExtension "double FormFactorBox::radialExtension() const override final
@@ -2981,7 +3059,7 @@ Returns the (approximate in some cases) radial size of the particle of this form
 
 %feature("docstring")  FormFactorBox::evaluate_for_q "complex_t FormFactorBox::evaluate_for_q(cvector_t q) const override final
 
-Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
 ";
 
 
@@ -4314,79 +4392,6 @@ Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This m
 ";
 
 
-// File: classFormFactorPolygonalPrism.xml
-%feature("docstring") FormFactorPolygonalPrism "
-
-A prism with a polygonal base, for form factor computation.
-
-C++ includes: FormFactorPolyhedron.h
-";
-
-%feature("docstring")  FormFactorPolygonalPrism::FormFactorPolygonalPrism "FormFactorPolygonalPrism::FormFactorPolygonalPrism()=default
-";
-
-%feature("docstring")  FormFactorPolygonalPrism::FormFactorPolygonalPrism "FormFactorPolygonalPrism::FormFactorPolygonalPrism(const NodeMeta &meta, const std::vector< double > &PValues)
-";
-
-%feature("docstring")  FormFactorPolygonalPrism::bottomZ "double FormFactorPolygonalPrism::bottomZ(const IRotation &rotation) const override final
-
-Returns the z-coordinate of the lowest point in this shape after a given rotation. 
-";
-
-%feature("docstring")  FormFactorPolygonalPrism::topZ "double FormFactorPolygonalPrism::topZ(const IRotation &rotation) const override final
-
-Returns the z-coordinate of the lowest point in this shape after a given rotation. 
-";
-
-%feature("docstring")  FormFactorPolygonalPrism::evaluate_for_q "complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const override
-
-Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
-";
-
-%feature("docstring")  FormFactorPolygonalPrism::volume "double FormFactorPolygonalPrism::volume() const override
-
-Returns the volume of this prism. 
-";
-
-%feature("docstring")  FormFactorPolygonalPrism::getHeight "double FormFactorPolygonalPrism::getHeight() const
-";
-
-%feature("docstring")  FormFactorPolygonalPrism::radialExtension "virtual double FormFactorPolygonalPrism::radialExtension() const override
-
-Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
-";
-
-
-// File: classFormFactorPolygonalSurface.xml
-%feature("docstring") FormFactorPolygonalSurface "
-
-A polygonal surface, for testing form factor computations.
-
-C++ includes: FormFactorPolyhedron.h
-";
-
-%feature("docstring")  FormFactorPolygonalSurface::FormFactorPolygonalSurface "FormFactorPolygonalSurface::FormFactorPolygonalSurface()=default
-";
-
-%feature("docstring")  FormFactorPolygonalSurface::FormFactorPolygonalSurface "FormFactorPolygonalSurface::FormFactorPolygonalSurface(const NodeMeta &meta, const std::vector< double > &PValues)
-";
-
-%feature("docstring")  FormFactorPolygonalSurface::evaluate_for_q "complex_t FormFactorPolygonalSurface::evaluate_for_q(cvector_t q) const override final
-
-Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
-";
-
-%feature("docstring")  FormFactorPolygonalSurface::volume "double FormFactorPolygonalSurface::volume() const override
-
-Returns the total volume of the particle of this form factor's shape. 
-";
-
-%feature("docstring")  FormFactorPolygonalSurface::radialExtension "double FormFactorPolygonalSurface::radialExtension() const override final
-
-Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
-";
-
-
 // File: classFormFactorPolyhedron.xml
 %feature("docstring") FormFactorPolyhedron "
 
@@ -4413,12 +4418,10 @@ Returns the z-coordinate of the lowest point in this shape after a given rotatio
 
 %feature("docstring")  FormFactorPolyhedron::evaluate_for_q "complex_t FormFactorPolyhedron::evaluate_for_q(cvector_t q) const override final
 
-Returns the form factor F(q) of this polyhedron, respecting the offset z_bottom. 
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
 ";
 
 %feature("docstring")  FormFactorPolyhedron::evaluate_centered "complex_t FormFactorPolyhedron::evaluate_centered(cvector_t q) const
-
-Returns the form factor F(q) of this polyhedron, with origin at z=0. 
 ";
 
 %feature("docstring")  FormFactorPolyhedron::volume "double FormFactorPolyhedron::volume() const override final
@@ -4432,8 +4435,6 @@ Returns the (approximate in some cases) radial size of the particle of this form
 ";
 
 %feature("docstring")  FormFactorPolyhedron::assert_platonic "void FormFactorPolyhedron::assert_platonic() const
-
-Assertions for Platonic solid. 
 ";
 
 
@@ -4756,34 +4757,6 @@ Calls the  INodeVisitor's visit method.
 ";
 
 
-// File: classFormFactorTriangle.xml
-%feature("docstring") FormFactorTriangle "
-
-A planar equilateral triangle, for testing form factor computations.
-
-C++ includes: FormFactorTriangle.h
-";
-
-%feature("docstring")  FormFactorTriangle::FormFactorTriangle "FormFactorTriangle::FormFactorTriangle(const std::vector< double > P)
-";
-
-%feature("docstring")  FormFactorTriangle::FormFactorTriangle "FormFactorTriangle::FormFactorTriangle(double base_edge)
-";
-
-%feature("docstring")  FormFactorTriangle::clone "FormFactorTriangle* FormFactorTriangle::clone() const override final
-
-Returns a clone of this  ISample object. 
-";
-
-%feature("docstring")  FormFactorTriangle::accept "void FormFactorTriangle::accept(INodeVisitor *visitor) const override final
-
-Calls the  INodeVisitor's visit method. 
-";
-
-%feature("docstring")  FormFactorTriangle::getBaseEdge "double FormFactorTriangle::getBaseEdge() const
-";
-
-
 // File: classFormFactorTruncatedCube.xml
 %feature("docstring") FormFactorTruncatedCube "
 
@@ -7016,6 +6989,105 @@ Returns the z-coordinate of the lowest point in this shape after a given rotatio
 ";
 
 
+// File: classIFormFactorPolyhedron.xml
+%feature("docstring") IFormFactorPolyhedron "
+
+A polyhedron, for form factor computation.
+
+C++ includes: IFormFactorPolyhedron.h
+";
+
+%feature("docstring")  IFormFactorPolyhedron::IFormFactorPolyhedron "IFormFactorPolyhedron::IFormFactorPolyhedron()=delete
+";
+
+%feature("docstring")  IFormFactorPolyhedron::IFormFactorPolyhedron "IFormFactorPolyhedron::IFormFactorPolyhedron(const NodeMeta &meta, const std::vector< double > &PValues)
+
+The mathematics implemented here is described in full detail in a paper by Joachim Wuttke, entitled \"Form factor (Fourier shape transform) of polygon and polyhedron.\" 
+";
+
+%feature("docstring")  IFormFactorPolyhedron::~IFormFactorPolyhedron "IFormFactorPolyhedron::~IFormFactorPolyhedron()
+";
+
+%feature("docstring")  IFormFactorPolyhedron::bottomZ "double IFormFactorPolyhedron::bottomZ(const IRotation &rotation) const override final
+
+Returns the z-coordinate of the lowest point in this shape after a given rotation. 
+";
+
+%feature("docstring")  IFormFactorPolyhedron::topZ "double IFormFactorPolyhedron::topZ(const IRotation &rotation) const override final
+
+Returns the z-coordinate of the lowest point in this shape after a given rotation. 
+";
+
+%feature("docstring")  IFormFactorPolyhedron::evaluate_for_q "complex_t IFormFactorPolyhedron::evaluate_for_q(cvector_t q) const override final
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+%feature("docstring")  IFormFactorPolyhedron::evaluate_centered "complex_t IFormFactorPolyhedron::evaluate_centered(cvector_t q) const
+";
+
+%feature("docstring")  IFormFactorPolyhedron::volume "double IFormFactorPolyhedron::volume() const override final
+
+Returns the total volume of the particle of this form factor's shape. 
+";
+
+%feature("docstring")  IFormFactorPolyhedron::radialExtension "double IFormFactorPolyhedron::radialExtension() const override final
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  IFormFactorPolyhedron::assert_platonic "void IFormFactorPolyhedron::assert_platonic() const
+
+Assertions for Platonic solid. 
+";
+
+
+// File: classIFormFactorPrism.xml
+%feature("docstring") IFormFactorPrism "
+
+A prism with a polygonal base, for form factor computation.
+
+C++ includes: IFormFactorPrism.h
+";
+
+%feature("docstring")  IFormFactorPrism::IFormFactorPrism "IFormFactorPrism::IFormFactorPrism()=default
+";
+
+%feature("docstring")  IFormFactorPrism::IFormFactorPrism "IFormFactorPrism::IFormFactorPrism(const NodeMeta &meta, const std::vector< double > &PValues)
+";
+
+%feature("docstring")  IFormFactorPrism::~IFormFactorPrism "IFormFactorPrism::~IFormFactorPrism()
+";
+
+%feature("docstring")  IFormFactorPrism::bottomZ "double IFormFactorPrism::bottomZ(const IRotation &rotation) const override final
+
+Returns the z-coordinate of the lowest point in this shape after a given rotation. 
+";
+
+%feature("docstring")  IFormFactorPrism::topZ "double IFormFactorPrism::topZ(const IRotation &rotation) const override final
+
+Returns the z-coordinate of the lowest point in this shape after a given rotation. 
+";
+
+%feature("docstring")  IFormFactorPrism::evaluate_for_q "complex_t IFormFactorPrism::evaluate_for_q(cvector_t q) const override
+
+Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
+";
+
+%feature("docstring")  IFormFactorPrism::volume "double IFormFactorPrism::volume() const override
+
+Returns the volume of this prism. 
+";
+
+%feature("docstring")  IFormFactorPrism::radialExtension "double IFormFactorPrism::radialExtension() const override
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  IFormFactorPrism::getHeight "double IFormFactorPrism::getHeight() const
+";
+
+
 // File: classIFresnelMap.xml
 %feature("docstring") IFresnelMap "
 
@@ -9856,7 +9928,7 @@ Print scan definition in python format.
 
 Interface for the Fresnel computations, both in the scalar and magnetic case
 
-Inherited by  SpecularScalarStrategy,  SpecularMagneticOldStrategy,  SpecularMagneticStrategy, SpecularMagneticNewStrategy
+Inherited by  SpecularScalarStrategy,  SpecularMagneticOldStrategy,  SpecularMagneticStrategy,  SpecularMagneticNewStrategy
 
 C++ includes: ISpecularStrategy.h
 ";
@@ -11115,6 +11187,73 @@ Returns z-part of the two wavevector eigenmodes.
 ";
 
 
+// File: classMatrixRTCoefficients__v3.xml
+%feature("docstring") MatrixRTCoefficients_v3 "
+
+Specular reflection and transmission coefficients in a layer in case of magnetic interactions between the scattered particle and the layer.
+
+C++ includes: MatrixRTCoefficients_v3.h
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::MatrixRTCoefficients_v3 "MatrixRTCoefficients_v3::MatrixRTCoefficients_v3(double kz_sign, Eigen::Vector2cd eigenvalues, kvector_t b, double magnetic_SLD)
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::MatrixRTCoefficients_v3 "MatrixRTCoefficients_v3::MatrixRTCoefficients_v3(const MatrixRTCoefficients_v3 &other)
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::~MatrixRTCoefficients_v3 "MatrixRTCoefficients_v3::~MatrixRTCoefficients_v3() override
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::clone "MatrixRTCoefficients_v3 * MatrixRTCoefficients_v3::clone() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::T1plus "Eigen::Vector2cd MatrixRTCoefficients_v3::T1plus() const override
+
+The following functions return the transmitted and reflected amplitudes for different incoming beam polarizations and eigenmodes 
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::R1plus "Eigen::Vector2cd MatrixRTCoefficients_v3::R1plus() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::T2plus "Eigen::Vector2cd MatrixRTCoefficients_v3::T2plus() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::R2plus "Eigen::Vector2cd MatrixRTCoefficients_v3::R2plus() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::T1min "Eigen::Vector2cd MatrixRTCoefficients_v3::T1min() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::R1min "Eigen::Vector2cd MatrixRTCoefficients_v3::R1min() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::T2min "Eigen::Vector2cd MatrixRTCoefficients_v3::T2min() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::R2min "Eigen::Vector2cd MatrixRTCoefficients_v3::R2min() const override
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::getKz "Eigen::Vector2cd MatrixRTCoefficients_v3::getKz() const override
+
+Returns z-part of the two wavevector eigenmodes. 
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::magneticSLD "double MatrixRTCoefficients_v3::magneticSLD() const
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::computeP "Eigen::Matrix2cd MatrixRTCoefficients_v3::computeP() const
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::computeInverseP "Eigen::Matrix2cd MatrixRTCoefficients_v3::computeInverseP() const
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::computeDeltaMatrix "Eigen::Matrix2cd MatrixRTCoefficients_v3::computeDeltaMatrix(double thickness)
+";
+
+%feature("docstring")  MatrixRTCoefficients_v3::getReflectionMatrix "Eigen::Matrix2cd MatrixRTCoefficients_v3::getReflectionMatrix() const override
+";
+
+
 // File: classMesoCrystal.xml
 %feature("docstring") MesoCrystal "
 
@@ -11643,15 +11782,46 @@ C++ includes: ZLimits.h
 ";
 
 
-// File: classOrderedMap.xml
-%feature("docstring") OrderedMap "
+// File: classFeNiBiLayer_1_1Options.xml
+%feature("docstring") FeNiBiLayer::Options "";
 
-Ordered map which saves the order of insertion.
+%feature("docstring")  FeNiBiLayer::Options::Options "FeNiBiLayer::Options::Options()
+";
 
-C++ includes: OrderedMap.h
+%feature("docstring")  FeNiBiLayer::Options::NBiLayers "Options FeNiBiLayer::Options::NBiLayers(int n)
 ";
 
-%feature("docstring")  OrderedMap::OrderedMap "OrderedMap< Key, Object >::OrderedMap()
+%feature("docstring")  FeNiBiLayer::Options::angle "Options FeNiBiLayer::Options::angle(double angle)
+";
+
+%feature("docstring")  FeNiBiLayer::Options::magnetizationMagnitude "Options FeNiBiLayer::Options::magnetizationMagnitude(double M)
+";
+
+%feature("docstring")  FeNiBiLayer::Options::thicknessFe "Options FeNiBiLayer::Options::thicknessFe(double t)
+";
+
+%feature("docstring")  FeNiBiLayer::Options::thicknessNi "Options FeNiBiLayer::Options::thicknessNi(double t)
+";
+
+%feature("docstring")  FeNiBiLayer::Options::sigmaRoughness "Options FeNiBiLayer::Options::sigmaRoughness(double r)
+";
+
+%feature("docstring")  FeNiBiLayer::Options::effectiveSLD "Options FeNiBiLayer::Options::effectiveSLD(int i)
+";
+
+%feature("docstring")  FeNiBiLayer::Options::roughnessModel "Options FeNiBiLayer::Options::roughnessModel(RoughnessModel rm)
+";
+
+
+// File: classOrderedMap.xml
+%feature("docstring") OrderedMap "
+
+Ordered map which saves the order of insertion.
+
+C++ includes: OrderedMap.h
+";
+
+%feature("docstring")  OrderedMap::OrderedMap "OrderedMap< Key, Object >::OrderedMap()
 ";
 
 %feature("docstring")  OrderedMap::~OrderedMap "virtual OrderedMap< Key, Object >::~OrderedMap()
@@ -13011,7 +13181,7 @@ Returns true if area defined by two bins is inside or on border of polygon (more
 
 For internal use in  PolyhedralFace.
 
-C++ includes: FormFactorPolyhedron.h
+C++ includes: PolyhedralTopology.h
 ";
 
 
@@ -13033,7 +13203,7 @@ The private data for polygons to hide boost dependency from the header.
 
 One edge of a polygon, for form factor computation.
 
-C++ includes: FormFactorPolyhedron.h
+C++ includes: PolyhedralComponents.h
 ";
 
 %feature("docstring")  PolyhedralEdge::PolyhedralEdge "PolyhedralEdge::PolyhedralEdge(const kvector_t _Vlow, const kvector_t _Vhig)
@@ -13062,7 +13232,7 @@ Returns sum_l=0^M/2 u^2l v^(M-2l) / (2l+1)!(M-2l)! - vperp^M/M!
 
 A polygon, for form factor computation.
 
-C++ includes: FormFactorPolyhedron.h
+C++ includes: PolyhedralComponents.h
 ";
 
 %feature("docstring")  PolyhedralFace::PolyhedralFace "PolyhedralFace::PolyhedralFace(const std::vector< kvector_t > &_V=std::vector< kvector_t >(), bool _sym_S2=false)
@@ -13117,9 +13287,54 @@ Throws if deviation from inversion symmetry is detected. Does not check vertices
 // File: classPolyhedralTopology.xml
 %feature("docstring") PolyhedralTopology "
 
-For internal use in  FormFactorPolyhedron.
+For internal use in  IFormFactorPolyhedron.
 
-C++ includes: FormFactorPolyhedron.h
+C++ includes: PolyhedralTopology.h
+";
+
+
+// File: classPolyhedron.xml
+%feature("docstring") Polyhedron "
+
+A polyhedron, implementation class for use in  IFormFactorPolyhedron.
+
+C++ includes: Polyhedron.h
+";
+
+%feature("docstring")  Polyhedron::Polyhedron "Polyhedron::Polyhedron()=delete
+";
+
+%feature("docstring")  Polyhedron::Polyhedron "Polyhedron::Polyhedron(const Polyhedron &)=delete
+";
+
+%feature("docstring")  Polyhedron::Polyhedron "Polyhedron::Polyhedron(const PolyhedralTopology &topology, double z_bottom, const std::vector< kvector_t > &vertices)
+";
+
+%feature("docstring")  Polyhedron::~Polyhedron "Polyhedron::~Polyhedron()
+";
+
+%feature("docstring")  Polyhedron::assert_platonic "void Polyhedron::assert_platonic() const
+";
+
+%feature("docstring")  Polyhedron::volume "double Polyhedron::volume() const
+";
+
+%feature("docstring")  Polyhedron::radius "double Polyhedron::radius() const
+";
+
+%feature("docstring")  Polyhedron::vertices "const std::vector< kvector_t > & Polyhedron::vertices()
+";
+
+%feature("docstring")  Polyhedron::evaluate_for_q "complex_t Polyhedron::evaluate_for_q(const cvector_t &q) const
+
+needed for topZ, bottomZ computation
+
+Returns the form factor F(q) of this polyhedron, respecting the offset z_bottom. 
+";
+
+%feature("docstring")  Polyhedron::evaluate_centered "complex_t Polyhedron::evaluate_centered(const cvector_t &q) const
+
+Returns the form factor F(q) of this polyhedron, with origin at z=0. 
 ";
 
 
@@ -13171,6 +13386,30 @@ C++ includes: IterationStrategy.h
 ";
 
 
+// File: classPrism.xml
+%feature("docstring") Prism "";
+
+%feature("docstring")  Prism::Prism "Prism::Prism()=delete
+";
+
+%feature("docstring")  Prism::Prism "Prism::Prism(const Prism &)=delete
+";
+
+%feature("docstring")  Prism::Prism "Prism::Prism(bool symmetry_Ci, double height, const std::vector< kvector_t > &vertices)
+";
+
+%feature("docstring")  Prism::area "double Prism::area() const
+";
+
+%feature("docstring")  Prism::vertices "const std::vector< kvector_t > & Prism::vertices()
+";
+
+%feature("docstring")  Prism::evaluate_for_q "complex_t Prism::evaluate_for_q(const cvector_t &q) const
+
+needed for topZ, bottomZ computation 
+";
+
+
 // File: classProcessedLayout.xml
 %feature("docstring") ProcessedLayout "
 
@@ -15057,6 +15296,27 @@ C++ includes: MagneticLayersBuilder.h
 ";
 
 
+// File: classSimpleMagneticRotationBuilder.xml
+%feature("docstring") SimpleMagneticRotationBuilder "
+
+Builds sample: magnetic layer on a magnetic substrate with the fields rotated by 90°
+
+C++ includes: MagneticLayersBuilder.h
+";
+
+%feature("docstring")  SimpleMagneticRotationBuilder::SimpleMagneticRotationBuilder "SimpleMagneticRotationBuilder::SimpleMagneticRotationBuilder()
+";
+
+%feature("docstring")  SimpleMagneticRotationBuilder::buildSample "MultiLayer * SimpleMagneticRotationBuilder::buildSample() const override
+";
+
+%feature("docstring")  SimpleMagneticRotationBuilder::createSample "MultiLayer * SimpleMagneticRotationBuilder::createSample(size_t index=0) override
+";
+
+%feature("docstring")  SimpleMagneticRotationBuilder::size "size_t SimpleMagneticRotationBuilder::size() override
+";
+
+
 // File: classSimpleSelectionRule.xml
 %feature("docstring") SimpleSelectionRule "
 
@@ -15921,6 +16181,49 @@ Return default axes units.
 ";
 
 
+// File: classSpecularMagneticNewNCStrategy.xml
+%feature("docstring") SpecularMagneticNewNCStrategy "
+
+Implements the magnetic Fresnel computation with Nevot-Croce roughness
+
+Implements the transfer matrix formalism for the calculation of wave amplitudes of the coherent wave solution in a multilayer with magnetization. For a description, see internal document \"Polarized Implementation of the Transfer Matrix Method\"
+
+C++ includes: SpecularMagneticNewNCStrategy.h
+";
+
+
+// File: classSpecularMagneticNewStrategy.xml
+%feature("docstring") SpecularMagneticNewStrategy "
+
+Implements the magnetic Fresnel computation with Nevot-Croce roughness
+
+Implements the transfer matrix formalism for the calculation of wave amplitudes of the coherent wave solution in a multilayer with magnetization. For a description, see internal document \"Polarized Implementation of the Transfer Matrix Method\"
+
+C++ includes: SpecularMagneticNewStrategy.h
+";
+
+%feature("docstring")  SpecularMagneticNewStrategy::Execute "ISpecularStrategy::coeffs_t SpecularMagneticNewStrategy::Execute(const std::vector< Slice > &slices, const kvector_t &k) const
+
+Computes refraction angle reflection/transmission coefficients for given sliced multilayer and wavevector k 
+";
+
+%feature("docstring")  SpecularMagneticNewStrategy::Execute "ISpecularStrategy::coeffs_t SpecularMagneticNewStrategy::Execute(const std::vector< Slice > &slices, const std::vector< complex_t > &kz) const
+
+Computes refraction angle reflection/transmission coefficients for given sliced multilayer and a set of kz projections corresponding to each slice 
+";
+
+
+// File: classSpecularMagneticNewTanhStrategy.xml
+%feature("docstring") SpecularMagneticNewTanhStrategy "
+
+Implements the magnetic Fresnel computation with the analytical Tanh roughness
+
+Implements the transfer matrix formalism for the calculation of wave amplitudes of the coherent wave solution in a multilayer with magnetization. For a description, see internal document \"Polarized Implementation of the Transfer Matrix Method\"
+
+C++ includes: SpecularMagneticNewTanhStrategy.h
+";
+
+
 // File: classSpecularMagneticOldStrategy.xml
 %feature("docstring") SpecularMagneticOldStrategy "
 
@@ -16932,10 +17235,10 @@ C++ includes: WavevectorInfo.h
 ";
 
 
-// File: classFourierTransform_1_1Workspace.xml
+// File: classConvolve_1_1Workspace.xml
 
 
-// File: classConvolve_1_1Workspace.xml
+// File: classFourierTransform_1_1Workspace.xml
 
 
 // File: classZLimits.xml
@@ -16965,172 +17268,7 @@ C++ includes: ZLimits.h
 ";
 
 
-// File: namespace_0d106.xml
-
-
-// File: namespace_0d112.xml
-
-
-// File: namespace_0d116.xml
-
-
-// File: namespace_0d147.xml
-
-
-// File: namespace_0d159.xml
-
-
-// File: namespace_0d16.xml
-
-
-// File: namespace_0d167.xml
-
-
-// File: namespace_0d172.xml
-
-
-// File: namespace_0d181.xml
-
-
-// File: namespace_0d183.xml
-
-
-// File: namespace_0d187.xml
-
-
-// File: namespace_0d2.xml
-
-
-// File: namespace_0d227.xml
-
-
-// File: namespace_0d24.xml
-
-
-// File: namespace_0d256.xml
-
-
-// File: namespace_0d260.xml
-
-
-// File: namespace_0d264.xml
-
-
-// File: namespace_0d270.xml
-
-
-// File: namespace_0d274.xml
-
-
-// File: namespace_0d288.xml
-
-
-// File: namespace_0d312.xml
-
-
-// File: namespace_0d319.xml
-
-
-// File: namespace_0d321.xml
-
-
-// File: namespace_0d323.xml
-
-
-// File: namespace_0d343.xml
-
-
-// File: namespace_0d347.xml
-
-
-// File: namespace_0d351.xml
-
-
-// File: namespace_0d365.xml
-
-
-// File: namespace_0d376.xml
-
-
-// File: namespace_0d380.xml
-
-
-// File: namespace_0d390.xml
-
-
-// File: namespace_0d392.xml
-
-
-// File: namespace_0d394.xml
-
-
-// File: namespace_0d4.xml
-
-
-// File: namespace_0d402.xml
-
-
-// File: namespace_0d404.xml
-
-
-// File: namespace_0d406.xml
-
-
-// File: namespace_0d410.xml
-
-
-// File: namespace_0d412.xml
-
-
-// File: namespace_0d422.xml
-
-
-// File: namespace_0d435.xml
-
-
-// File: namespace_0d444.xml
-
-
-// File: namespace_0d446.xml
-
-
-// File: namespace_0d462.xml
-
-
-// File: namespace_0d483.xml
-
-
-// File: namespace_0d490.xml
-
-
-// File: namespace_0d499.xml
-
-
-// File: namespace_0d522.xml
-
-
-// File: namespace_0d530.xml
-
-
-// File: namespace_0d536.xml
-
-
-// File: namespace_0d538.xml
-
-
-// File: namespace_0d611.xml
-
-
-// File: namespace_0d86.xml
-
-
-// File: namespace_0d88.xml
-
-
-// File: namespace_0d90.xml
-
-
-// File: namespace_0d94.xml
+// File: namespace_0d0.xml
 
 
 // File: namespacealgo.xml
@@ -18141,12 +18279,24 @@ GISAS simulation with an extra long wavelength.
 %feature("docstring")  StandardSimulations::BasicSpecularMM "SpecularSimulation * StandardSimulations::BasicSpecularMM()
 ";
 
+%feature("docstring")  StandardSimulations::BasicSpecularPM "SpecularSimulation * StandardSimulations::BasicSpecularPM()
+";
+
+%feature("docstring")  StandardSimulations::BasicSpecularMP "SpecularSimulation * StandardSimulations::BasicSpecularMP()
+";
+
 %feature("docstring")  StandardSimulations::BasicSpecularQPP "SpecularSimulation * StandardSimulations::BasicSpecularQPP()
 ";
 
 %feature("docstring")  StandardSimulations::BasicSpecularQMM "SpecularSimulation * StandardSimulations::BasicSpecularQMM()
 ";
 
+%feature("docstring")  StandardSimulations::BasicSpecularQPM "SpecularSimulation * StandardSimulations::BasicSpecularQPM()
+";
+
+%feature("docstring")  StandardSimulations::BasicSpecularQMP "SpecularSimulation * StandardSimulations::BasicSpecularQMP()
+";
+
 %feature("docstring")  StandardSimulations::MiniOffSpec "OffSpecSimulation * StandardSimulations::MiniOffSpec()
 ";
 
@@ -18463,7 +18613,7 @@ global helper function for comparison of axes
 // File: MultiLayerFuncs_8cpp.xml
 %feature("docstring")  MaterialProfile "std::vector<complex_t> MaterialProfile(const MultiLayer &multilayer, int n_points, double z_min, double z_max)
 
-Calculate average material profile for given multilayer. 
+Calculate average material profile for given multilayer 
 ";
 
 %feature("docstring")  DefaultMaterialProfileLimits "std::pair<double, double> DefaultMaterialProfileLimits(const MultiLayer &multilayer)
@@ -18480,7 +18630,7 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: MultiLayerFuncs_8h.xml
 %feature("docstring")  MaterialProfile "BA_CORE_API_ std::vector<complex_t> MaterialProfile(const MultiLayer &multilayer, int n_points, double z_min, double z_max)
 
-Calculate average material profile for given multilayer. 
+Calculate average material profile for given multilayer 
 ";
 
 %feature("docstring")  DefaultMaterialProfileLimits "BA_CORE_API_ std::pair<double, double> DefaultMaterialProfileLimits(const MultiLayer &multilayer)
@@ -18929,9 +19079,6 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: FormFactorLongBoxLorentz_8h.xml
 
 
-// File: FormFactorPolyhedron_8cpp.xml
-
-
 // File: FormFactorPolyhedron_8h.xml
 
 
@@ -18965,12 +19112,6 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: FormFactorTetrahedron_8h.xml
 
 
-// File: FormFactorTriangle_8cpp.xml
-
-
-// File: FormFactorTriangle_8h.xml
-
-
 // File: FormFactorTruncatedCube_8cpp.xml
 
 
@@ -18989,12 +19130,45 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: FormFactorTruncatedSpheroid_8h.xml
 
 
+// File: IFormFactorPolyhedron_8cpp.xml
+
+
+// File: IFormFactorPolyhedron_8h.xml
+
+
+// File: IFormFactorPrism_8cpp.xml
+
+
+// File: IFormFactorPrism_8h.xml
+
+
 // File: IProfileRipple_8cpp.xml
 
 
 // File: IProfileRipple_8h.xml
 
 
+// File: PolyhedralComponents_8cpp.xml
+
+
+// File: PolyhedralComponents_8h.xml
+
+
+// File: PolyhedralTopology_8h.xml
+
+
+// File: Polyhedron_8cpp.xml
+
+
+// File: Polyhedron_8h.xml
+
+
+// File: Prism_8cpp.xml
+
+
+// File: Prism_8h.xml
+
+
 // File: Ripples_8cpp.xml
 
 
@@ -19534,6 +19708,24 @@ magnetization (in A/m)
 // File: SlicedFormFactorList_8h.xml
 
 
+// File: SpecularMagneticNewNCStrategy_8cpp.xml
+
+
+// File: SpecularMagneticNewNCStrategy_8h.xml
+
+
+// File: SpecularMagneticNewStrategy_8cpp.xml
+
+
+// File: SpecularMagneticNewStrategy_8h.xml
+
+
+// File: SpecularMagneticNewTanhStrategy_8cpp.xml
+
+
+// File: SpecularMagneticNewTanhStrategy_8h.xml
+
+
 // File: SpecularMagneticOldStrategy_8cpp.xml
 
 
@@ -19820,6 +20012,12 @@ Creates averaged material. Square refractive index of returned material is arith
 // File: MatrixRTCoefficients__v2_8h.xml
 
 
+// File: MatrixRTCoefficients__v3_8cpp.xml
+
+
+// File: MatrixRTCoefficients__v3_8h.xml
+
+
 // File: ScalarRTCoefficients_8h.xml
 
 
@@ -20092,6 +20290,12 @@ Generate vertices of centered ellipse with given semi-axes at height z.
 // File: CylindersBuilder_8h.xml
 
 
+// File: FeNiBiLayerBuilder_8cpp.xml
+
+
+// File: FeNiBiLayerBuilder_8h.xml
+
+
 // File: HomogeneousMultilayerBuilder_8cpp.xml
 
 
diff --git a/auto/Wrap/doxygen_fit.i b/auto/Wrap/doxygen_fit.i
index 26ba7ec8e32252fa92dd7b41f59d33c3304e7617..3c1ed3628364ff2f5b8e3af475d1b7531eb2d023 100644
--- a/auto/Wrap/doxygen_fit.i
+++ b/auto/Wrap/doxygen_fit.i
@@ -1375,28 +1375,7 @@ Internal state of a  WallclockTimer object.
 ";
 
 
-// File: namespace_0d11.xml
-
-
-// File: namespace_0d25.xml
-
-
-// File: namespace_0d29.xml
-
-
-// File: namespace_0d31.xml
-
-
-// File: namespace_0d35.xml
-
-
-// File: namespace_0d37.xml
-
-
-// File: namespace_0d4.xml
-
-
-// File: namespace_0d41.xml
+// File: namespace_0d0.xml
 
 
 // File: namespaceFit.xml
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index 111aa9b7c76e6adc2c36df68d63ec1e4ac5d45bc..537cbe73e2e89d387af79a2b8ccaa0eac92e8c2d 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -8166,13 +8166,9 @@ class IFormFactor(ISample):
 _libBornAgainCore.IFormFactor_swigregister(IFormFactor)
 
 
-def CreateTransformedFormFactor(formfactor, rot, translation):
-    r"""
-    CreateTransformedFormFactor(IFormFactor formfactor, IRotation rot, kvector_t translation) -> IFormFactor
-    IFormFactor* CreateTransformedFormFactor(const IFormFactor &formfactor, const IRotation &rot, kvector_t translation)
-
-    """
-    return _libBornAgainCore.CreateTransformedFormFactor(formfactor, rot, translation)
+def createTransformedFormFactor(formfactor, rot, translation):
+    r"""createTransformedFormFactor(IFormFactor formfactor, IRotation rot, kvector_t translation) -> IFormFactor"""
+    return _libBornAgainCore.createTransformedFormFactor(formfactor, rot, translation)
 class IFormFactorBorn(IFormFactor):
     r"""
 
@@ -14552,261 +14548,13 @@ class RoughnessModel(object):
 # Register RoughnessModel in _libBornAgainCore:
 _libBornAgainCore.RoughnessModel_swigregister(RoughnessModel)
 
-class PolygonalTopology(object):
-    r"""
-
-
-    For internal use in  PolyhedralFace.
-
-    C++ includes: FormFactorPolyhedron.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-    vertexIndices = property(_libBornAgainCore.PolygonalTopology_vertexIndices_get, _libBornAgainCore.PolygonalTopology_vertexIndices_set, doc=r"""vertexIndices : std::vector<(int,std::allocator<(int)>)>""")
-    symmetry_S2 = property(_libBornAgainCore.PolygonalTopology_symmetry_S2_get, _libBornAgainCore.PolygonalTopology_symmetry_S2_set, doc=r"""symmetry_S2 : bool""")
-
-    def __init__(self):
-        r"""
-        __init__(PolygonalTopology self) -> PolygonalTopology
-
-
-        For internal use in  PolyhedralFace.
-
-        C++ includes: FormFactorPolyhedron.h
-
-        """
-        _libBornAgainCore.PolygonalTopology_swiginit(self, _libBornAgainCore.new_PolygonalTopology())
-    __swig_destroy__ = _libBornAgainCore.delete_PolygonalTopology
-
-# Register PolygonalTopology in _libBornAgainCore:
-_libBornAgainCore.PolygonalTopology_swigregister(PolygonalTopology)
-
-class PolyhedralTopology(object):
-    r"""
-
-
-    For internal use in  FormFactorPolyhedron.
-
-    C++ includes: FormFactorPolyhedron.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-    faces = property(_libBornAgainCore.PolyhedralTopology_faces_get, _libBornAgainCore.PolyhedralTopology_faces_set, doc=r"""faces : std::vector<(PolygonalTopology,std::allocator<(PolygonalTopology)>)>""")
-    symmetry_Ci = property(_libBornAgainCore.PolyhedralTopology_symmetry_Ci_get, _libBornAgainCore.PolyhedralTopology_symmetry_Ci_set, doc=r"""symmetry_Ci : bool""")
-
-    def __init__(self):
-        r"""
-        __init__(PolyhedralTopology self) -> PolyhedralTopology
-
-
-        For internal use in  FormFactorPolyhedron.
-
-        C++ includes: FormFactorPolyhedron.h
-
-        """
-        _libBornAgainCore.PolyhedralTopology_swiginit(self, _libBornAgainCore.new_PolyhedralTopology())
-    __swig_destroy__ = _libBornAgainCore.delete_PolyhedralTopology
-
-# Register PolyhedralTopology in _libBornAgainCore:
-_libBornAgainCore.PolyhedralTopology_swigregister(PolyhedralTopology)
-
-class PolyhedralEdge(object):
-    r"""
-
-
-    One edge of a polygon, for form factor computation.
-
-    C++ includes: FormFactorPolyhedron.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, _Vlow, _Vhig):
-        r"""
-        __init__(PolyhedralEdge self, kvector_t _Vlow, kvector_t _Vhig) -> PolyhedralEdge
-        PolyhedralEdge::PolyhedralEdge(const kvector_t _Vlow, const kvector_t _Vhig)
-
-        """
-        _libBornAgainCore.PolyhedralEdge_swiginit(self, _libBornAgainCore.new_PolyhedralEdge(_Vlow, _Vhig))
-
-    def E(self):
-        r"""
-        E(PolyhedralEdge self) -> kvector_t
-        kvector_t PolyhedralEdge::E() const
-
-        """
-        return _libBornAgainCore.PolyhedralEdge_E(self)
-
-    def R(self):
-        r"""
-        R(PolyhedralEdge self) -> kvector_t
-        kvector_t PolyhedralEdge::R() const
-
-        """
-        return _libBornAgainCore.PolyhedralEdge_R(self)
-
-    def qE(self, q):
-        r"""
-        qE(PolyhedralEdge self, cvector_t q) -> complex_t
-        complex_t PolyhedralEdge::qE(cvector_t q) const
-
-        """
-        return _libBornAgainCore.PolyhedralEdge_qE(self, q)
-
-    def qR(self, q):
-        r"""
-        qR(PolyhedralEdge self, cvector_t q) -> complex_t
-        complex_t PolyhedralEdge::qR(cvector_t q) const
-
-        """
-        return _libBornAgainCore.PolyhedralEdge_qR(self, q)
-
-    def contrib(self, m, qpa, qrperp):
-        r"""
-        contrib(PolyhedralEdge self, int m, cvector_t qpa, complex_t qrperp) -> complex_t
-        complex_t PolyhedralEdge::contrib(int m, cvector_t qpa, complex_t qrperp) const
-
-        Returns sum_l=0^M/2 u^2l v^(M-2l) / (2l+1)!(M-2l)! - vperp^M/M! 
-
-        """
-        return _libBornAgainCore.PolyhedralEdge_contrib(self, m, qpa, qrperp)
-    __swig_destroy__ = _libBornAgainCore.delete_PolyhedralEdge
-
-# Register PolyhedralEdge in _libBornAgainCore:
-_libBornAgainCore.PolyhedralEdge_swigregister(PolyhedralEdge)
-
-class PolyhedralFace(object):
-    r"""
-
-
-    A polygon, for form factor computation.
-
-    C++ includes: FormFactorPolyhedron.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
-
-    @staticmethod
-    def diameter(V):
-        r"""diameter(vector_kvector_t V) -> double"""
-        return _libBornAgainCore.PolyhedralFace_diameter(V)
-
-    def __init__(self, *args):
-        r"""
-        __init__(PolyhedralFace self, vector_kvector_t _V=std::vector< kvector_t >(), bool _sym_S2=False) -> PolyhedralFace
-        PolyhedralFace::PolyhedralFace(const std::vector< kvector_t > &_V=std::vector< kvector_t >(), bool _sym_S2=false)
-
-        Sets internal variables for given vertex chain.
-
-        Parameters:
-        -----------
-
-        V: 
-        oriented vertex list
-
-        _sym_S2: 
-        true if face has a perpedicular two-fold symmetry axis 
-
-        """
-        _libBornAgainCore.PolyhedralFace_swiginit(self, _libBornAgainCore.new_PolyhedralFace(*args))
-
-    def area(self):
-        r"""
-        area(PolyhedralFace self) -> double
-        double PolyhedralFace::area() const
-
-        """
-        return _libBornAgainCore.PolyhedralFace_area(self)
-
-    def pyramidalVolume(self):
-        r"""
-        pyramidalVolume(PolyhedralFace self) -> double
-        double PolyhedralFace::pyramidalVolume() const
-
-        """
-        return _libBornAgainCore.PolyhedralFace_pyramidalVolume(self)
-
-    def radius3d(self):
-        r"""
-        radius3d(PolyhedralFace self) -> double
-        double PolyhedralFace::radius3d() const
-
-        """
-        return _libBornAgainCore.PolyhedralFace_radius3d(self)
-
-    def normalProjectionConj(self, q):
-        r"""
-        normalProjectionConj(PolyhedralFace self, cvector_t q) -> complex_t
-        complex_t PolyhedralFace::normalProjectionConj(cvector_t q) const
-
-        Returns conj(q)*normal [ BasicVector3D::dot is antilinear in 'this' argument]. 
-
-        """
-        return _libBornAgainCore.PolyhedralFace_normalProjectionConj(self, q)
-
-    def ff_n(self, m, q):
-        r"""
-        ff_n(PolyhedralFace self, int m, cvector_t q) -> complex_t
-        complex_t PolyhedralFace::ff_n(int m, cvector_t q) const
-
-        Returns contribution qn*f_n [of order q^(n+1)] from this face to the polyhedral form factor. 
-
-        """
-        return _libBornAgainCore.PolyhedralFace_ff_n(self, m, q)
-
-    def ff(self, q, sym_Ci):
-        r"""
-        ff(PolyhedralFace self, cvector_t q, bool sym_Ci) -> complex_t
-        complex_t PolyhedralFace::ff(cvector_t q, bool sym_Ci) const
-
-        Returns the contribution ff(q) of this face to the polyhedral form factor. 
-
-        """
-        return _libBornAgainCore.PolyhedralFace_ff(self, q, sym_Ci)
-
-    def ff_2D(self, qpa):
-        r"""
-        ff_2D(PolyhedralFace self, cvector_t qpa) -> complex_t
-        complex_t PolyhedralFace::ff_2D(cvector_t qpa) const
-
-        Returns the two-dimensional form factor of this face, for use in a prism. 
-
-        """
-        return _libBornAgainCore.PolyhedralFace_ff_2D(self, qpa)
-
-    def assert_Ci(self, other):
-        r"""
-        assert_Ci(PolyhedralFace self, PolyhedralFace other)
-        void PolyhedralFace::assert_Ci(const PolyhedralFace &other) const
-
-        Throws if deviation from inversion symmetry is detected. Does not check vertices. 
-
-        """
-        return _libBornAgainCore.PolyhedralFace_assert_Ci(self, other)
-    __swig_destroy__ = _libBornAgainCore.delete_PolyhedralFace
-
-# Register PolyhedralFace in _libBornAgainCore:
-_libBornAgainCore.PolyhedralFace_swigregister(PolyhedralFace)
-
-def PolyhedralFace_diameter(V):
-    r"""PolyhedralFace_diameter(vector_kvector_t V) -> double"""
-    return _libBornAgainCore.PolyhedralFace_diameter(V)
-
-class FormFactorPolyhedron(IFormFactorBorn):
+class IFormFactorPolyhedron(IFormFactorBorn):
     r"""
 
 
     A polyhedron, for form factor computation.
 
-    C++ includes: FormFactorPolyhedron.h
+    C++ includes: IFormFactorPolyhedron.h
 
     """
 
@@ -14815,88 +14563,86 @@ class FormFactorPolyhedron(IFormFactorBorn):
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IFormFactorPolyhedron
 
     def bottomZ(self, rotation):
         r"""
-        bottomZ(FormFactorPolyhedron self, IRotation rotation) -> double
-        double FormFactorPolyhedron::bottomZ(const IRotation &rotation) const override final
+        bottomZ(IFormFactorPolyhedron self, IRotation rotation) -> double
+        double IFormFactorPolyhedron::bottomZ(const IRotation &rotation) const override final
 
         Returns the z-coordinate of the lowest point in this shape after a given rotation. 
 
         """
-        return _libBornAgainCore.FormFactorPolyhedron_bottomZ(self, rotation)
+        return _libBornAgainCore.IFormFactorPolyhedron_bottomZ(self, rotation)
 
     def topZ(self, rotation):
         r"""
-        topZ(FormFactorPolyhedron self, IRotation rotation) -> double
-        double FormFactorPolyhedron::topZ(const IRotation &rotation) const override final
+        topZ(IFormFactorPolyhedron self, IRotation rotation) -> double
+        double IFormFactorPolyhedron::topZ(const IRotation &rotation) const override final
 
         Returns the z-coordinate of the lowest point in this shape after a given rotation. 
 
         """
-        return _libBornAgainCore.FormFactorPolyhedron_topZ(self, rotation)
+        return _libBornAgainCore.IFormFactorPolyhedron_topZ(self, rotation)
 
     def evaluate_for_q(self, q):
         r"""
-        evaluate_for_q(FormFactorPolyhedron self, cvector_t q) -> complex_t
-        complex_t FormFactorPolyhedron::evaluate_for_q(cvector_t q) const override final
+        evaluate_for_q(IFormFactorPolyhedron self, cvector_t q) -> complex_t
+        complex_t IFormFactorPolyhedron::evaluate_for_q(cvector_t q) const override final
 
-        Returns the form factor F(q) of this polyhedron, respecting the offset z_bottom. 
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
 
         """
-        return _libBornAgainCore.FormFactorPolyhedron_evaluate_for_q(self, q)
+        return _libBornAgainCore.IFormFactorPolyhedron_evaluate_for_q(self, q)
 
     def evaluate_centered(self, q):
         r"""
-        evaluate_centered(FormFactorPolyhedron self, cvector_t q) -> complex_t
-        complex_t FormFactorPolyhedron::evaluate_centered(cvector_t q) const
-
-        Returns the form factor F(q) of this polyhedron, with origin at z=0. 
+        evaluate_centered(IFormFactorPolyhedron self, cvector_t q) -> complex_t
+        complex_t IFormFactorPolyhedron::evaluate_centered(cvector_t q) const
 
         """
-        return _libBornAgainCore.FormFactorPolyhedron_evaluate_centered(self, q)
+        return _libBornAgainCore.IFormFactorPolyhedron_evaluate_centered(self, q)
 
     def volume(self):
         r"""
-        volume(FormFactorPolyhedron self) -> double
-        double FormFactorPolyhedron::volume() const override final
+        volume(IFormFactorPolyhedron self) -> double
+        double IFormFactorPolyhedron::volume() const override final
 
         Returns the total volume of the particle of this form factor's shape. 
 
         """
-        return _libBornAgainCore.FormFactorPolyhedron_volume(self)
+        return _libBornAgainCore.IFormFactorPolyhedron_volume(self)
 
     def radialExtension(self):
         r"""
-        radialExtension(FormFactorPolyhedron self) -> double
-        double FormFactorPolyhedron::radialExtension() const override final
+        radialExtension(IFormFactorPolyhedron self) -> double
+        double IFormFactorPolyhedron::radialExtension() const override final
 
         Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
 
         """
-        return _libBornAgainCore.FormFactorPolyhedron_radialExtension(self)
+        return _libBornAgainCore.IFormFactorPolyhedron_radialExtension(self)
 
     def assert_platonic(self):
         r"""
-        assert_platonic(FormFactorPolyhedron self)
-        void FormFactorPolyhedron::assert_platonic() const
+        assert_platonic(IFormFactorPolyhedron self)
+        void IFormFactorPolyhedron::assert_platonic() const
 
         Assertions for Platonic solid. 
 
         """
-        return _libBornAgainCore.FormFactorPolyhedron_assert_platonic(self)
-    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPolyhedron
+        return _libBornAgainCore.IFormFactorPolyhedron_assert_platonic(self)
 
-# Register FormFactorPolyhedron in _libBornAgainCore:
-_libBornAgainCore.FormFactorPolyhedron_swigregister(FormFactorPolyhedron)
+# Register IFormFactorPolyhedron in _libBornAgainCore:
+_libBornAgainCore.IFormFactorPolyhedron_swigregister(IFormFactorPolyhedron)
 
-class FormFactorPolygonalPrism(IFormFactorBorn):
+class IFormFactorPrism(IFormFactorBorn):
     r"""
 
 
     A prism with a polygonal base, for form factor computation.
 
-    C++ includes: FormFactorPolyhedron.h
+    C++ includes: IFormFactorPrism.h
 
     """
 
@@ -14905,118 +14651,68 @@ class FormFactorPolygonalPrism(IFormFactorBorn):
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IFormFactorPrism
 
     def bottomZ(self, rotation):
         r"""
-        bottomZ(FormFactorPolygonalPrism self, IRotation rotation) -> double
-        double FormFactorPolygonalPrism::bottomZ(const IRotation &rotation) const override final
+        bottomZ(IFormFactorPrism self, IRotation rotation) -> double
+        double IFormFactorPrism::bottomZ(const IRotation &rotation) const override final
 
         Returns the z-coordinate of the lowest point in this shape after a given rotation. 
 
         """
-        return _libBornAgainCore.FormFactorPolygonalPrism_bottomZ(self, rotation)
+        return _libBornAgainCore.IFormFactorPrism_bottomZ(self, rotation)
 
     def topZ(self, rotation):
         r"""
-        topZ(FormFactorPolygonalPrism self, IRotation rotation) -> double
-        double FormFactorPolygonalPrism::topZ(const IRotation &rotation) const override final
+        topZ(IFormFactorPrism self, IRotation rotation) -> double
+        double IFormFactorPrism::topZ(const IRotation &rotation) const override final
 
         Returns the z-coordinate of the lowest point in this shape after a given rotation. 
 
         """
-        return _libBornAgainCore.FormFactorPolygonalPrism_topZ(self, rotation)
+        return _libBornAgainCore.IFormFactorPrism_topZ(self, rotation)
 
     def evaluate_for_q(self, q):
         r"""
-        evaluate_for_q(FormFactorPolygonalPrism self, cvector_t q) -> complex_t
-        complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const override
+        evaluate_for_q(IFormFactorPrism self, cvector_t q) -> complex_t
+        complex_t IFormFactorPrism::evaluate_for_q(cvector_t q) const override
 
         Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
 
         """
-        return _libBornAgainCore.FormFactorPolygonalPrism_evaluate_for_q(self, q)
+        return _libBornAgainCore.IFormFactorPrism_evaluate_for_q(self, q)
 
     def volume(self):
         r"""
-        volume(FormFactorPolygonalPrism self) -> double
-        double FormFactorPolygonalPrism::volume() const override
+        volume(IFormFactorPrism self) -> double
+        double IFormFactorPrism::volume() const override
 
         Returns the volume of this prism. 
 
         """
-        return _libBornAgainCore.FormFactorPolygonalPrism_volume(self)
-
-    def getHeight(self):
-        r"""
-        getHeight(FormFactorPolygonalPrism self) -> double
-        double FormFactorPolygonalPrism::getHeight() const
-
-        """
-        return _libBornAgainCore.FormFactorPolygonalPrism_getHeight(self)
+        return _libBornAgainCore.IFormFactorPrism_volume(self)
 
     def radialExtension(self):
         r"""
-        radialExtension(FormFactorPolygonalPrism self) -> double
-        virtual double FormFactorPolygonalPrism::radialExtension() const override
+        radialExtension(IFormFactorPrism self) -> double
+        double IFormFactorPrism::radialExtension() const override
 
         Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
 
         """
-        return _libBornAgainCore.FormFactorPolygonalPrism_radialExtension(self)
-    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPolygonalPrism
-
-# Register FormFactorPolygonalPrism in _libBornAgainCore:
-_libBornAgainCore.FormFactorPolygonalPrism_swigregister(FormFactorPolygonalPrism)
-
-class FormFactorPolygonalSurface(IFormFactorBorn):
-    r"""
-
-
-    A polygonal surface, for testing form factor computations.
-
-    C++ includes: FormFactorPolyhedron.h
-
-    """
-
-    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
-    __repr__ = _swig_repr
-
-    def evaluate_for_q(self, q):
-        r"""
-        evaluate_for_q(FormFactorPolygonalSurface self, cvector_t q) -> complex_t
-        complex_t FormFactorPolygonalSurface::evaluate_for_q(cvector_t q) const override final
-
-        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
-
-        """
-        return _libBornAgainCore.FormFactorPolygonalSurface_evaluate_for_q(self, q)
+        return _libBornAgainCore.IFormFactorPrism_radialExtension(self)
 
-    def volume(self):
-        r"""
-        volume(FormFactorPolygonalSurface self) -> double
-        double FormFactorPolygonalSurface::volume() const override
-
-        Returns the total volume of the particle of this form factor's shape. 
-
-        """
-        return _libBornAgainCore.FormFactorPolygonalSurface_volume(self)
-
-    def radialExtension(self):
+    def getHeight(self):
         r"""
-        radialExtension(FormFactorPolygonalSurface self) -> double
-        double FormFactorPolygonalSurface::radialExtension() const override final
-
-        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+        getHeight(IFormFactorPrism self) -> double
+        double IFormFactorPrism::getHeight() const
 
         """
-        return _libBornAgainCore.FormFactorPolygonalSurface_radialExtension(self)
-    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPolygonalSurface
+        return _libBornAgainCore.IFormFactorPrism_getHeight(self)
 
-# Register FormFactorPolygonalSurface in _libBornAgainCore:
-_libBornAgainCore.FormFactorPolygonalSurface_swigregister(FormFactorPolygonalSurface)
+# Register IFormFactorPrism in _libBornAgainCore:
+_libBornAgainCore.IFormFactorPrism_swigregister(IFormFactorPrism)
 
 class IProfileRipple(IFormFactorBorn):
     r"""
@@ -15150,7 +14846,7 @@ class ISawtoothRipple(IProfileRipple):
 # Register ISawtoothRipple in _libBornAgainCore:
 _libBornAgainCore.ISawtoothRipple_swigregister(ISawtoothRipple)
 
-class FormFactorAnisoPyramid(FormFactorPolyhedron):
+class FormFactorAnisoPyramid(IFormFactorPolyhedron):
     r"""
 
 
@@ -15228,7 +14924,7 @@ class FormFactorAnisoPyramid(FormFactorPolyhedron):
 # Register FormFactorAnisoPyramid in _libBornAgainCore:
 _libBornAgainCore.FormFactorAnisoPyramid_swigregister(FormFactorAnisoPyramid)
 
-class FormFactorBox(FormFactorPolygonalPrism):
+class FormFactorBox(IFormFactorPrism):
     r"""
 
 
@@ -15291,7 +14987,7 @@ class FormFactorBox(FormFactorPolygonalPrism):
         volume(FormFactorBox self) -> double
         double FormFactorBox::volume() const override final
 
-        Returns the volume of this prism. 
+        Returns the total volume of the particle of this form factor's shape. 
 
         """
         return _libBornAgainCore.FormFactorBox_volume(self)
@@ -15311,7 +15007,7 @@ class FormFactorBox(FormFactorPolygonalPrism):
         evaluate_for_q(FormFactorBox self, cvector_t q) -> complex_t
         complex_t FormFactorBox::evaluate_for_q(cvector_t q) const override final
 
-        Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
 
         """
         return _libBornAgainCore.FormFactorBox_evaluate_for_q(self, q)
@@ -15320,7 +15016,7 @@ class FormFactorBox(FormFactorPolygonalPrism):
 # Register FormFactorBox in _libBornAgainCore:
 _libBornAgainCore.FormFactorBox_swigregister(FormFactorBox)
 
-class FormFactorCantellatedCube(FormFactorPolyhedron):
+class FormFactorCantellatedCube(IFormFactorPolyhedron):
     r"""
 
 
@@ -15472,7 +15168,7 @@ class FormFactorCone(IFormFactorBorn):
 # Register FormFactorCone in _libBornAgainCore:
 _libBornAgainCore.FormFactorCone_swigregister(FormFactorCone)
 
-class FormFactorCone6(FormFactorPolyhedron):
+class FormFactorCone6(IFormFactorPolyhedron):
     r"""
 
 
@@ -15680,7 +15376,7 @@ class FormFactorCosineRippleLorentz(ICosineRipple):
 # Register FormFactorCosineRippleLorentz in _libBornAgainCore:
 _libBornAgainCore.FormFactorCosineRippleLorentz_swigregister(FormFactorCosineRippleLorentz)
 
-class FormFactorCuboctahedron(FormFactorPolyhedron):
+class FormFactorCuboctahedron(IFormFactorPolyhedron):
     r"""
 
 
@@ -15840,7 +15536,7 @@ class FormFactorCylinder(IFormFactorBorn):
 # Register FormFactorCylinder in _libBornAgainCore:
 _libBornAgainCore.FormFactorCylinder_swigregister(FormFactorCylinder)
 
-class FormFactorDodecahedron(FormFactorPolyhedron):
+class FormFactorDodecahedron(IFormFactorPolyhedron):
     r"""
 
 
@@ -16410,7 +16106,7 @@ class FormFactorHollowSphere(IFormFactorBorn):
 # Register FormFactorHollowSphere in _libBornAgainCore:
 _libBornAgainCore.FormFactorHollowSphere_swigregister(FormFactorHollowSphere)
 
-class FormFactorIcosahedron(FormFactorPolyhedron):
+class FormFactorIcosahedron(IFormFactorPolyhedron):
     r"""
 
 
@@ -16644,7 +16340,7 @@ class FormFactorLongBoxLorentz(IFormFactorBorn):
 # Register FormFactorLongBoxLorentz in _libBornAgainCore:
 _libBornAgainCore.FormFactorLongBoxLorentz_swigregister(FormFactorLongBoxLorentz)
 
-class FormFactorPrism3(FormFactorPolygonalPrism):
+class FormFactorPrism3(IFormFactorPrism):
     r"""
 
 
@@ -16698,7 +16394,7 @@ class FormFactorPrism3(FormFactorPolygonalPrism):
 # Register FormFactorPrism3 in _libBornAgainCore:
 _libBornAgainCore.FormFactorPrism3_swigregister(FormFactorPrism3)
 
-class FormFactorPrism6(FormFactorPolygonalPrism):
+class FormFactorPrism6(IFormFactorPrism):
     r"""
 
 
@@ -16752,7 +16448,7 @@ class FormFactorPrism6(FormFactorPolygonalPrism):
 # Register FormFactorPrism6 in _libBornAgainCore:
 _libBornAgainCore.FormFactorPrism6_swigregister(FormFactorPrism6)
 
-class FormFactorPyramid(FormFactorPolyhedron):
+class FormFactorPyramid(IFormFactorPolyhedron):
     r"""
 
 
@@ -16960,7 +16656,7 @@ class FormFactorSawtoothRippleLorentz(ISawtoothRipple):
 # Register FormFactorSawtoothRippleLorentz in _libBornAgainCore:
 _libBornAgainCore.FormFactorSawtoothRippleLorentz_swigregister(FormFactorSawtoothRippleLorentz)
 
-class FormFactorTetrahedron(FormFactorPolyhedron):
+class FormFactorTetrahedron(IFormFactorPolyhedron):
     r"""
 
 
@@ -17030,7 +16726,7 @@ class FormFactorTetrahedron(FormFactorPolyhedron):
 # Register FormFactorTetrahedron in _libBornAgainCore:
 _libBornAgainCore.FormFactorTetrahedron_swigregister(FormFactorTetrahedron)
 
-class FormFactorTruncatedCube(FormFactorPolyhedron):
+class FormFactorTruncatedCube(IFormFactorPolyhedron):
     r"""
 
 
@@ -18434,7 +18130,7 @@ def MaterialProfile_cpp(multilayer, n_points, z_min, z_max):
     MaterialProfile_cpp(MultiLayer multilayer, int n_points, double z_min, double z_max) -> vector_complex_t
     BA_CORE_API_ std::vector<complex_t> MaterialProfile(const MultiLayer &multilayer, int n_points, double z_min, double z_max)
 
-    Calculate average material profile for given multilayer. 
+    Calculate average material profile for given multilayer 
 
     """
     return _libBornAgainCore.MaterialProfile_cpp(multilayer, n_points, z_min, z_max)
@@ -22158,29 +21854,17 @@ class HexagonalLattice(Lattice2D):
 _libBornAgainCore.HexagonalLattice_swigregister(HexagonalLattice)
 
 
-def CreateFCCLattice(lattice_constant, orientation):
-    r"""
-    CreateFCCLattice(double lattice_constant, ILatticeOrientation orientation) -> Lattice
-    Lattice LatticeUtils::CreateFCCLattice(double lattice_constant, const ILatticeOrientation &orientation)
-
-    """
-    return _libBornAgainCore.CreateFCCLattice(lattice_constant, orientation)
+def createFCCLattice(lattice_constant, orientation):
+    r"""createFCCLattice(double lattice_constant, ILatticeOrientation orientation) -> Lattice"""
+    return _libBornAgainCore.createFCCLattice(lattice_constant, orientation)
 
-def CreateHCPLattice(a, c, orientation):
-    r"""
-    CreateHCPLattice(double a, double c, ILatticeOrientation orientation) -> Lattice
-    Lattice LatticeUtils::CreateHCPLattice(double a, double c, const ILatticeOrientation &orientation)
+def createHCPLattice(a, c, orientation):
+    r"""createHCPLattice(double a, double c, ILatticeOrientation orientation) -> Lattice"""
+    return _libBornAgainCore.createHCPLattice(a, c, orientation)
 
-    """
-    return _libBornAgainCore.CreateHCPLattice(a, c, orientation)
-
-def CreateBCTLattice(a, c, orientation):
-    r"""
-    CreateBCTLattice(double a, double c, ILatticeOrientation orientation) -> Lattice
-    Lattice LatticeUtils::CreateBCTLattice(double a, double c, const ILatticeOrientation &orientation)
-
-    """
-    return _libBornAgainCore.CreateBCTLattice(a, c, orientation)
+def createBCTLattice(a, c, orientation):
+    r"""createBCTLattice(double a, double c, ILatticeOrientation orientation) -> Lattice"""
+    return _libBornAgainCore.createBCTLattice(a, c, orientation)
 class Material(object):
     r"""
 
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index da416eb43f72921b3ca28adc4b5ae1e8641d02be..3c24727a700532d4d51bfdf3bad496b9243b81e7 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -3184,260 +3184,254 @@ namespace Swig {
 #define SWIGTYPE_p_FormFactorIcosahedron swig_types[84]
 #define SWIGTYPE_p_FormFactorLongBoxGauss swig_types[85]
 #define SWIGTYPE_p_FormFactorLongBoxLorentz swig_types[86]
-#define SWIGTYPE_p_FormFactorPolygonalPrism swig_types[87]
-#define SWIGTYPE_p_FormFactorPolygonalSurface swig_types[88]
-#define SWIGTYPE_p_FormFactorPolyhedron swig_types[89]
-#define SWIGTYPE_p_FormFactorPrism3 swig_types[90]
-#define SWIGTYPE_p_FormFactorPrism6 swig_types[91]
-#define SWIGTYPE_p_FormFactorPyramid swig_types[92]
-#define SWIGTYPE_p_FormFactorSawtoothRippleBox swig_types[93]
-#define SWIGTYPE_p_FormFactorSawtoothRippleGauss swig_types[94]
-#define SWIGTYPE_p_FormFactorSawtoothRippleLorentz swig_types[95]
-#define SWIGTYPE_p_FormFactorSphereGaussianRadius swig_types[96]
-#define SWIGTYPE_p_FormFactorSphereLogNormalRadius swig_types[97]
-#define SWIGTYPE_p_FormFactorTetrahedron swig_types[98]
-#define SWIGTYPE_p_FormFactorTruncatedCube swig_types[99]
-#define SWIGTYPE_p_FormFactorTruncatedSphere swig_types[100]
-#define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[101]
-#define SWIGTYPE_p_FormFactorWeighted swig_types[102]
-#define SWIGTYPE_p_GISASSimulation swig_types[103]
-#define SWIGTYPE_p_GaussFisherPeakShape swig_types[104]
-#define SWIGTYPE_p_HexagonalLattice swig_types[105]
-#define SWIGTYPE_p_Histogram1D swig_types[106]
-#define SWIGTYPE_p_Histogram2D swig_types[107]
-#define SWIGTYPE_p_HorizontalLine swig_types[108]
-#define SWIGTYPE_p_IAbstractParticle swig_types[109]
-#define SWIGTYPE_p_IAxis swig_types[110]
-#define SWIGTYPE_p_IBackground swig_types[111]
-#define SWIGTYPE_p_IChiSquaredModule swig_types[112]
-#define SWIGTYPE_p_ICloneable swig_types[113]
-#define SWIGTYPE_p_IClusteredParticles swig_types[114]
-#define SWIGTYPE_p_ICosineRipple swig_types[115]
-#define SWIGTYPE_p_IDetector swig_types[116]
-#define SWIGTYPE_p_IDetector2D swig_types[117]
-#define SWIGTYPE_p_IDetectorResolution swig_types[118]
-#define SWIGTYPE_p_IDistribution1D swig_types[119]
-#define SWIGTYPE_p_IFTDecayFunction1D swig_types[120]
-#define SWIGTYPE_p_IFTDecayFunction2D swig_types[121]
-#define SWIGTYPE_p_IFTDistribution1D swig_types[122]
-#define SWIGTYPE_p_IFTDistribution2D swig_types[123]
-#define SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t swig_types[124]
-#define SWIGTYPE_p_IFactoryT_std__string_Simulation_t swig_types[125]
-#define SWIGTYPE_p_IFootprintFactor swig_types[126]
-#define SWIGTYPE_p_IFormFactor swig_types[127]
-#define SWIGTYPE_p_IFormFactorBorn swig_types[128]
-#define SWIGTYPE_p_IFormFactorDecorator swig_types[129]
-#define SWIGTYPE_p_IHistogram swig_types[130]
-#define SWIGTYPE_p_IIntensityFunction swig_types[131]
-#define SWIGTYPE_p_IInterferenceFunction swig_types[132]
-#define SWIGTYPE_p_ILatticeOrientation swig_types[133]
-#define SWIGTYPE_p_ILayout swig_types[134]
-#define SWIGTYPE_p_IMultiLayerBuilder swig_types[135]
-#define SWIGTYPE_p_INode swig_types[136]
-#define SWIGTYPE_p_INodeVisitor swig_types[137]
-#define SWIGTYPE_p_IObservable swig_types[138]
-#define SWIGTYPE_p_IObserver swig_types[139]
-#define SWIGTYPE_p_IParameterT_double_t swig_types[140]
-#define SWIGTYPE_p_IParameterized swig_types[141]
-#define SWIGTYPE_p_IParticle swig_types[142]
-#define SWIGTYPE_p_IPeakShape swig_types[143]
-#define SWIGTYPE_p_IPixel swig_types[144]
-#define SWIGTYPE_p_IProfileRectangularRipple swig_types[145]
-#define SWIGTYPE_p_IProfileRipple swig_types[146]
-#define SWIGTYPE_p_IResolutionFunction2D swig_types[147]
-#define SWIGTYPE_p_IRotation swig_types[148]
-#define SWIGTYPE_p_ISample swig_types[149]
-#define SWIGTYPE_p_ISawtoothRipple swig_types[150]
-#define SWIGTYPE_p_ISelectionRule swig_types[151]
-#define SWIGTYPE_p_IShape2D swig_types[152]
-#define SWIGTYPE_p_ISpecularScan swig_types[153]
-#define SWIGTYPE_p_IUnitConverter swig_types[154]
-#define SWIGTYPE_p_IVarianceFunction swig_types[155]
-#define SWIGTYPE_p_IdentityRotation swig_types[156]
-#define SWIGTYPE_p_Instrument swig_types[157]
-#define SWIGTYPE_p_IntensityDataIOFactory swig_types[158]
-#define SWIGTYPE_p_IntensityFunctionLog swig_types[159]
-#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[160]
-#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[161]
-#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[162]
-#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[163]
-#define SWIGTYPE_p_InterferenceFunction2DSuperLattice swig_types[164]
-#define SWIGTYPE_p_InterferenceFunction3DLattice swig_types[165]
-#define SWIGTYPE_p_InterferenceFunctionFinite2DLattice swig_types[166]
-#define SWIGTYPE_p_InterferenceFunctionFinite3DLattice swig_types[167]
-#define SWIGTYPE_p_InterferenceFunctionHardDisk swig_types[168]
-#define SWIGTYPE_p_InterferenceFunctionNone swig_types[169]
-#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[170]
-#define SWIGTYPE_p_InterferenceFunctionTwin swig_types[171]
-#define SWIGTYPE_p_IsGISAXSDetector swig_types[172]
-#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[173]
-#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[174]
-#define SWIGTYPE_p_IterationInfo swig_types[175]
-#define SWIGTYPE_p_Lattice swig_types[176]
-#define SWIGTYPE_p_Lattice2D swig_types[177]
-#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[178]
-#define SWIGTYPE_p_Layer swig_types[179]
-#define SWIGTYPE_p_LayerInterface swig_types[180]
-#define SWIGTYPE_p_LayerRoughness swig_types[181]
-#define SWIGTYPE_p_Line swig_types[182]
-#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[183]
-#define SWIGTYPE_p_Material swig_types[184]
-#define SWIGTYPE_p_MesoCrystal swig_types[185]
-#define SWIGTYPE_p_MillerIndex swig_types[186]
-#define SWIGTYPE_p_MillerIndexOrientation swig_types[187]
-#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[188]
-#define SWIGTYPE_p_MisesGaussPeakShape swig_types[189]
-#define SWIGTYPE_p_MultiLayer swig_types[190]
-#define SWIGTYPE_p_NodeMeta swig_types[191]
-#define SWIGTYPE_p_OffSpecSimulation swig_types[192]
-#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[193]
-#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[194]
-#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[195]
-#define SWIGTYPE_p_OutputDataT_bool_t swig_types[196]
-#define SWIGTYPE_p_OutputDataT_double_t swig_types[197]
-#define SWIGTYPE_p_ParaMeta swig_types[198]
-#define SWIGTYPE_p_ParameterDistribution swig_types[199]
-#define SWIGTYPE_p_ParameterPool swig_types[200]
-#define SWIGTYPE_p_ParameterSample swig_types[201]
-#define SWIGTYPE_p_Particle swig_types[202]
-#define SWIGTYPE_p_ParticleComposition swig_types[203]
-#define SWIGTYPE_p_ParticleCoreShell swig_types[204]
-#define SWIGTYPE_p_ParticleDistribution swig_types[205]
-#define SWIGTYPE_p_ParticleLayout swig_types[206]
-#define SWIGTYPE_p_ParticleLimits swig_types[207]
-#define SWIGTYPE_p_PoissonNoiseBackground swig_types[208]
-#define SWIGTYPE_p_Polygon swig_types[209]
-#define SWIGTYPE_p_PolygonPrivate swig_types[210]
-#define SWIGTYPE_p_PolygonalTopology swig_types[211]
-#define SWIGTYPE_p_PolyhedralEdge swig_types[212]
-#define SWIGTYPE_p_PolyhedralFace swig_types[213]
-#define SWIGTYPE_p_PolyhedralTopology swig_types[214]
-#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[215]
-#define SWIGTYPE_p_PyBuilderCallback swig_types[216]
-#define SWIGTYPE_p_PyObserverCallback swig_types[217]
-#define SWIGTYPE_p_QSpecScan swig_types[218]
-#define SWIGTYPE_p_RangedDistribution swig_types[219]
-#define SWIGTYPE_p_RangedDistributionCosine swig_types[220]
-#define SWIGTYPE_p_RangedDistributionGate swig_types[221]
-#define SWIGTYPE_p_RangedDistributionGaussian swig_types[222]
-#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[223]
-#define SWIGTYPE_p_RangedDistributionLorentz swig_types[224]
-#define SWIGTYPE_p_RealLimits swig_types[225]
-#define SWIGTYPE_p_RealParameter swig_types[226]
-#define SWIGTYPE_p_Rectangle swig_types[227]
-#define SWIGTYPE_p_RectangularDetector swig_types[228]
-#define SWIGTYPE_p_RectangularPixel swig_types[229]
-#define SWIGTYPE_p_RegionOfInterest swig_types[230]
-#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[231]
-#define SWIGTYPE_p_RotationEuler swig_types[232]
-#define SWIGTYPE_p_RotationX swig_types[233]
-#define SWIGTYPE_p_RotationY swig_types[234]
-#define SWIGTYPE_p_RotationZ swig_types[235]
-#define SWIGTYPE_p_RoughnessModelWrap swig_types[236]
-#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[237]
-#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[238]
-#define SWIGTYPE_p_SampleBuilderFactory swig_types[239]
-#define SWIGTYPE_p_ScanResolution swig_types[240]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[241]
-#define SWIGTYPE_p_Simulation swig_types[242]
-#define SWIGTYPE_p_Simulation2D swig_types[243]
-#define SWIGTYPE_p_SimulationFactory swig_types[244]
-#define SWIGTYPE_p_SimulationOptions swig_types[245]
-#define SWIGTYPE_p_SimulationResult swig_types[246]
-#define SWIGTYPE_p_SlicedParticle swig_types[247]
-#define SWIGTYPE_p_SlicingEffects swig_types[248]
-#define SWIGTYPE_p_SpecularDetector1D swig_types[249]
-#define SWIGTYPE_p_SpecularSimulation swig_types[250]
-#define SWIGTYPE_p_SphericalDetector swig_types[251]
-#define SWIGTYPE_p_SquareLattice swig_types[252]
-#define SWIGTYPE_p_ThreadInfo swig_types[253]
-#define SWIGTYPE_p_Transform3D swig_types[254]
-#define SWIGTYPE_p_VariableBinAxis swig_types[255]
-#define SWIGTYPE_p_VarianceConstantFunction swig_types[256]
-#define SWIGTYPE_p_VarianceSimFunction swig_types[257]
-#define SWIGTYPE_p_VerticalLine swig_types[258]
-#define SWIGTYPE_p_WavevectorInfo swig_types[259]
-#define SWIGTYPE_p_ZLimits swig_types[260]
-#define SWIGTYPE_p_allocator_type swig_types[261]
-#define SWIGTYPE_p_bool swig_types[262]
-#define SWIGTYPE_p_char swig_types[263]
-#define SWIGTYPE_p_const_iterator swig_types[264]
-#define SWIGTYPE_p_corr_matrix_t swig_types[265]
-#define SWIGTYPE_p_difference_type swig_types[266]
-#define SWIGTYPE_p_double swig_types[267]
-#define SWIGTYPE_p_first_type swig_types[268]
-#define SWIGTYPE_p_int swig_types[269]
-#define SWIGTYPE_p_iterator swig_types[270]
-#define SWIGTYPE_p_key_type swig_types[271]
-#define SWIGTYPE_p_long_long swig_types[272]
-#define SWIGTYPE_p_mapped_type swig_types[273]
-#define SWIGTYPE_p_observer_t swig_types[274]
-#define SWIGTYPE_p_p_PyObject swig_types[275]
-#define SWIGTYPE_p_parameters_t swig_types[276]
-#define SWIGTYPE_p_second_type swig_types[277]
-#define SWIGTYPE_p_short swig_types[278]
-#define SWIGTYPE_p_signed_char swig_types[279]
-#define SWIGTYPE_p_size_type swig_types[280]
-#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[281]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[282]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[283]
-#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[284]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[285]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[286]
-#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[287]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[288]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[289]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[290]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[291]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[292]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[293]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[294]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[295]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[296]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[297]
-#define SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t swig_types[298]
-#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[299]
-#define SWIGTYPE_p_std__functionT_void_fF_t swig_types[300]
-#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[301]
-#define SWIGTYPE_p_std__invalid_argument swig_types[302]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[303]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[304]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[305]
-#define SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t swig_types[306]
-#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[307]
-#define SWIGTYPE_p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t swig_types[308]
-#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[309]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[310]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[311]
-#define SWIGTYPE_p_std__vectorT_HomogeneousRegion_std__allocatorT_HomogeneousRegion_t_t swig_types[312]
-#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[313]
-#define SWIGTYPE_p_std__vectorT_ILayout_const_p_std__allocatorT_ILayout_const_p_t_t swig_types[314]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[315]
-#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[316]
-#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[317]
-#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[318]
-#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[319]
-#define SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t swig_types[320]
-#define SWIGTYPE_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t swig_types[321]
-#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[322]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[323]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[324]
-#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[325]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[326]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[327]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[328]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[329]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[330]
-#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[331]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[332]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[333]
-#define SWIGTYPE_p_unsigned_char swig_types[334]
-#define SWIGTYPE_p_unsigned_int swig_types[335]
-#define SWIGTYPE_p_unsigned_long_long swig_types[336]
-#define SWIGTYPE_p_unsigned_short swig_types[337]
-#define SWIGTYPE_p_value_type swig_types[338]
-static swig_type_info *swig_types[340];
-static swig_module_info swig_module = {swig_types, 339, 0, 0, 0, 0};
+#define SWIGTYPE_p_FormFactorPrism3 swig_types[87]
+#define SWIGTYPE_p_FormFactorPrism6 swig_types[88]
+#define SWIGTYPE_p_FormFactorPyramid swig_types[89]
+#define SWIGTYPE_p_FormFactorSawtoothRippleBox swig_types[90]
+#define SWIGTYPE_p_FormFactorSawtoothRippleGauss swig_types[91]
+#define SWIGTYPE_p_FormFactorSawtoothRippleLorentz swig_types[92]
+#define SWIGTYPE_p_FormFactorSphereGaussianRadius swig_types[93]
+#define SWIGTYPE_p_FormFactorSphereLogNormalRadius swig_types[94]
+#define SWIGTYPE_p_FormFactorTetrahedron swig_types[95]
+#define SWIGTYPE_p_FormFactorTruncatedCube swig_types[96]
+#define SWIGTYPE_p_FormFactorTruncatedSphere swig_types[97]
+#define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[98]
+#define SWIGTYPE_p_FormFactorWeighted swig_types[99]
+#define SWIGTYPE_p_GISASSimulation swig_types[100]
+#define SWIGTYPE_p_GaussFisherPeakShape swig_types[101]
+#define SWIGTYPE_p_HexagonalLattice swig_types[102]
+#define SWIGTYPE_p_Histogram1D swig_types[103]
+#define SWIGTYPE_p_Histogram2D swig_types[104]
+#define SWIGTYPE_p_HorizontalLine swig_types[105]
+#define SWIGTYPE_p_IAbstractParticle swig_types[106]
+#define SWIGTYPE_p_IAxis swig_types[107]
+#define SWIGTYPE_p_IBackground swig_types[108]
+#define SWIGTYPE_p_IChiSquaredModule swig_types[109]
+#define SWIGTYPE_p_ICloneable swig_types[110]
+#define SWIGTYPE_p_IClusteredParticles swig_types[111]
+#define SWIGTYPE_p_ICosineRipple swig_types[112]
+#define SWIGTYPE_p_IDetector swig_types[113]
+#define SWIGTYPE_p_IDetector2D swig_types[114]
+#define SWIGTYPE_p_IDetectorResolution swig_types[115]
+#define SWIGTYPE_p_IDistribution1D swig_types[116]
+#define SWIGTYPE_p_IFTDecayFunction1D swig_types[117]
+#define SWIGTYPE_p_IFTDecayFunction2D swig_types[118]
+#define SWIGTYPE_p_IFTDistribution1D swig_types[119]
+#define SWIGTYPE_p_IFTDistribution2D swig_types[120]
+#define SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t swig_types[121]
+#define SWIGTYPE_p_IFactoryT_std__string_Simulation_t swig_types[122]
+#define SWIGTYPE_p_IFootprintFactor swig_types[123]
+#define SWIGTYPE_p_IFormFactor swig_types[124]
+#define SWIGTYPE_p_IFormFactorBorn swig_types[125]
+#define SWIGTYPE_p_IFormFactorDecorator swig_types[126]
+#define SWIGTYPE_p_IFormFactorPolyhedron swig_types[127]
+#define SWIGTYPE_p_IFormFactorPrism swig_types[128]
+#define SWIGTYPE_p_IHistogram swig_types[129]
+#define SWIGTYPE_p_IIntensityFunction swig_types[130]
+#define SWIGTYPE_p_IInterferenceFunction swig_types[131]
+#define SWIGTYPE_p_ILatticeOrientation swig_types[132]
+#define SWIGTYPE_p_ILayout swig_types[133]
+#define SWIGTYPE_p_IMultiLayerBuilder swig_types[134]
+#define SWIGTYPE_p_INode swig_types[135]
+#define SWIGTYPE_p_INodeVisitor swig_types[136]
+#define SWIGTYPE_p_IObservable swig_types[137]
+#define SWIGTYPE_p_IObserver swig_types[138]
+#define SWIGTYPE_p_IParameterT_double_t swig_types[139]
+#define SWIGTYPE_p_IParameterized swig_types[140]
+#define SWIGTYPE_p_IParticle swig_types[141]
+#define SWIGTYPE_p_IPeakShape swig_types[142]
+#define SWIGTYPE_p_IPixel swig_types[143]
+#define SWIGTYPE_p_IProfileRectangularRipple swig_types[144]
+#define SWIGTYPE_p_IProfileRipple swig_types[145]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[146]
+#define SWIGTYPE_p_IRotation swig_types[147]
+#define SWIGTYPE_p_ISample swig_types[148]
+#define SWIGTYPE_p_ISawtoothRipple swig_types[149]
+#define SWIGTYPE_p_ISelectionRule swig_types[150]
+#define SWIGTYPE_p_IShape2D swig_types[151]
+#define SWIGTYPE_p_ISpecularScan swig_types[152]
+#define SWIGTYPE_p_IUnitConverter swig_types[153]
+#define SWIGTYPE_p_IVarianceFunction swig_types[154]
+#define SWIGTYPE_p_IdentityRotation swig_types[155]
+#define SWIGTYPE_p_Instrument swig_types[156]
+#define SWIGTYPE_p_IntensityDataIOFactory swig_types[157]
+#define SWIGTYPE_p_IntensityFunctionLog swig_types[158]
+#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[159]
+#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[160]
+#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[161]
+#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[162]
+#define SWIGTYPE_p_InterferenceFunction2DSuperLattice swig_types[163]
+#define SWIGTYPE_p_InterferenceFunction3DLattice swig_types[164]
+#define SWIGTYPE_p_InterferenceFunctionFinite2DLattice swig_types[165]
+#define SWIGTYPE_p_InterferenceFunctionFinite3DLattice swig_types[166]
+#define SWIGTYPE_p_InterferenceFunctionHardDisk swig_types[167]
+#define SWIGTYPE_p_InterferenceFunctionNone swig_types[168]
+#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[169]
+#define SWIGTYPE_p_InterferenceFunctionTwin swig_types[170]
+#define SWIGTYPE_p_IsGISAXSDetector swig_types[171]
+#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[172]
+#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[173]
+#define SWIGTYPE_p_IterationInfo swig_types[174]
+#define SWIGTYPE_p_Lattice swig_types[175]
+#define SWIGTYPE_p_Lattice2D swig_types[176]
+#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[177]
+#define SWIGTYPE_p_Layer swig_types[178]
+#define SWIGTYPE_p_LayerInterface swig_types[179]
+#define SWIGTYPE_p_LayerRoughness swig_types[180]
+#define SWIGTYPE_p_Line swig_types[181]
+#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[182]
+#define SWIGTYPE_p_Material swig_types[183]
+#define SWIGTYPE_p_MesoCrystal swig_types[184]
+#define SWIGTYPE_p_MillerIndex swig_types[185]
+#define SWIGTYPE_p_MillerIndexOrientation swig_types[186]
+#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[187]
+#define SWIGTYPE_p_MisesGaussPeakShape swig_types[188]
+#define SWIGTYPE_p_MultiLayer swig_types[189]
+#define SWIGTYPE_p_NodeMeta swig_types[190]
+#define SWIGTYPE_p_OffSpecSimulation swig_types[191]
+#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[192]
+#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[193]
+#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[194]
+#define SWIGTYPE_p_OutputDataT_bool_t swig_types[195]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[196]
+#define SWIGTYPE_p_ParaMeta swig_types[197]
+#define SWIGTYPE_p_ParameterDistribution swig_types[198]
+#define SWIGTYPE_p_ParameterPool swig_types[199]
+#define SWIGTYPE_p_ParameterSample swig_types[200]
+#define SWIGTYPE_p_Particle swig_types[201]
+#define SWIGTYPE_p_ParticleComposition swig_types[202]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[203]
+#define SWIGTYPE_p_ParticleDistribution swig_types[204]
+#define SWIGTYPE_p_ParticleLayout swig_types[205]
+#define SWIGTYPE_p_ParticleLimits swig_types[206]
+#define SWIGTYPE_p_PoissonNoiseBackground swig_types[207]
+#define SWIGTYPE_p_Polygon swig_types[208]
+#define SWIGTYPE_p_PolygonPrivate swig_types[209]
+#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[210]
+#define SWIGTYPE_p_PyBuilderCallback swig_types[211]
+#define SWIGTYPE_p_PyObserverCallback swig_types[212]
+#define SWIGTYPE_p_QSpecScan swig_types[213]
+#define SWIGTYPE_p_RangedDistribution swig_types[214]
+#define SWIGTYPE_p_RangedDistributionCosine swig_types[215]
+#define SWIGTYPE_p_RangedDistributionGate swig_types[216]
+#define SWIGTYPE_p_RangedDistributionGaussian swig_types[217]
+#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[218]
+#define SWIGTYPE_p_RangedDistributionLorentz swig_types[219]
+#define SWIGTYPE_p_RealLimits swig_types[220]
+#define SWIGTYPE_p_RealParameter swig_types[221]
+#define SWIGTYPE_p_Rectangle swig_types[222]
+#define SWIGTYPE_p_RectangularDetector swig_types[223]
+#define SWIGTYPE_p_RectangularPixel swig_types[224]
+#define SWIGTYPE_p_RegionOfInterest swig_types[225]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[226]
+#define SWIGTYPE_p_RotationEuler swig_types[227]
+#define SWIGTYPE_p_RotationX swig_types[228]
+#define SWIGTYPE_p_RotationY swig_types[229]
+#define SWIGTYPE_p_RotationZ swig_types[230]
+#define SWIGTYPE_p_RoughnessModelWrap swig_types[231]
+#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[232]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[233]
+#define SWIGTYPE_p_SampleBuilderFactory swig_types[234]
+#define SWIGTYPE_p_ScanResolution swig_types[235]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[236]
+#define SWIGTYPE_p_Simulation swig_types[237]
+#define SWIGTYPE_p_Simulation2D swig_types[238]
+#define SWIGTYPE_p_SimulationFactory swig_types[239]
+#define SWIGTYPE_p_SimulationOptions swig_types[240]
+#define SWIGTYPE_p_SimulationResult swig_types[241]
+#define SWIGTYPE_p_SlicedParticle swig_types[242]
+#define SWIGTYPE_p_SlicingEffects swig_types[243]
+#define SWIGTYPE_p_SpecularDetector1D swig_types[244]
+#define SWIGTYPE_p_SpecularSimulation swig_types[245]
+#define SWIGTYPE_p_SphericalDetector swig_types[246]
+#define SWIGTYPE_p_SquareLattice swig_types[247]
+#define SWIGTYPE_p_ThreadInfo swig_types[248]
+#define SWIGTYPE_p_Transform3D swig_types[249]
+#define SWIGTYPE_p_VariableBinAxis swig_types[250]
+#define SWIGTYPE_p_VarianceConstantFunction swig_types[251]
+#define SWIGTYPE_p_VarianceSimFunction swig_types[252]
+#define SWIGTYPE_p_VerticalLine swig_types[253]
+#define SWIGTYPE_p_WavevectorInfo swig_types[254]
+#define SWIGTYPE_p_ZLimits swig_types[255]
+#define SWIGTYPE_p_allocator_type swig_types[256]
+#define SWIGTYPE_p_bool swig_types[257]
+#define SWIGTYPE_p_char swig_types[258]
+#define SWIGTYPE_p_const_iterator swig_types[259]
+#define SWIGTYPE_p_corr_matrix_t swig_types[260]
+#define SWIGTYPE_p_difference_type swig_types[261]
+#define SWIGTYPE_p_double swig_types[262]
+#define SWIGTYPE_p_first_type swig_types[263]
+#define SWIGTYPE_p_int swig_types[264]
+#define SWIGTYPE_p_iterator swig_types[265]
+#define SWIGTYPE_p_key_type swig_types[266]
+#define SWIGTYPE_p_long_long swig_types[267]
+#define SWIGTYPE_p_mapped_type swig_types[268]
+#define SWIGTYPE_p_observer_t swig_types[269]
+#define SWIGTYPE_p_p_PyObject swig_types[270]
+#define SWIGTYPE_p_parameters_t swig_types[271]
+#define SWIGTYPE_p_second_type swig_types[272]
+#define SWIGTYPE_p_short swig_types[273]
+#define SWIGTYPE_p_signed_char swig_types[274]
+#define SWIGTYPE_p_size_type swig_types[275]
+#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[276]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[277]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[278]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[279]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[280]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[281]
+#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[282]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[283]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[284]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[285]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[286]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[287]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[288]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[289]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[290]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[291]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[292]
+#define SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t swig_types[293]
+#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[294]
+#define SWIGTYPE_p_std__functionT_void_fF_t swig_types[295]
+#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[296]
+#define SWIGTYPE_p_std__invalid_argument swig_types[297]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[298]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[299]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[300]
+#define SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t swig_types[301]
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[302]
+#define SWIGTYPE_p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t swig_types[303]
+#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[304]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[305]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[306]
+#define SWIGTYPE_p_std__vectorT_HomogeneousRegion_std__allocatorT_HomogeneousRegion_t_t swig_types[307]
+#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[308]
+#define SWIGTYPE_p_std__vectorT_ILayout_const_p_std__allocatorT_ILayout_const_p_t_t swig_types[309]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[310]
+#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[311]
+#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[312]
+#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[313]
+#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[314]
+#define SWIGTYPE_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t swig_types[315]
+#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[316]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[317]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[318]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[319]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[320]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[321]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[322]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[323]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[324]
+#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[325]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[326]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[327]
+#define SWIGTYPE_p_unsigned_char swig_types[328]
+#define SWIGTYPE_p_unsigned_int swig_types[329]
+#define SWIGTYPE_p_unsigned_long_long swig_types[330]
+#define SWIGTYPE_p_unsigned_short swig_types[331]
+#define SWIGTYPE_p_value_type swig_types[332]
+static swig_type_info *swig_types[334];
+static swig_module_info swig_module = {swig_types, 333, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -6997,8 +6991,8 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Core/HardParticle/FormFactorIcosahedron.h"
 #include "Core/HardParticle/FormFactorLongBoxGauss.h"
 #include "Core/HardParticle/FormFactorLongBoxLorentz.h"
-#include "Core/HardParticle/FormFactorPolyhedron.h"
-#include "Core/HardParticle/FormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPolyhedron.h"
+#include "Core/HardParticle/IFormFactorPrism.h"
 #include "Core/HardParticle/FormFactorPrism3.h"
 #include "Core/HardParticle/FormFactorPrism6.h"
 #include "Core/HardParticle/FormFactorPyramid.h"
@@ -69005,7 +68999,7 @@ SWIGINTERN PyObject *IFormFactor_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObje
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_CreateTransformedFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_createTransformedFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IFormFactor *arg1 = 0 ;
   IRotation *arg2 = 0 ;
@@ -69019,37 +69013,37 @@ SWIGINTERN PyObject *_wrap_CreateTransformedFormFactor(PyObject *SWIGUNUSEDPARM(
   PyObject *swig_obj[3] ;
   IFormFactor *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "CreateTransformedFormFactor", 3, 3, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "createTransformedFormFactor", 3, 3, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IFormFactor,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CreateTransformedFormFactor" "', argument " "1"" of type '" "IFormFactor const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "createTransformedFormFactor" "', argument " "1"" of type '" "IFormFactor const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CreateTransformedFormFactor" "', argument " "1"" of type '" "IFormFactor const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "createTransformedFormFactor" "', argument " "1"" of type '" "IFormFactor const &""'"); 
   }
   arg1 = reinterpret_cast< IFormFactor * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IRotation,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CreateTransformedFormFactor" "', argument " "2"" of type '" "IRotation const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "createTransformedFormFactor" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CreateTransformedFormFactor" "', argument " "2"" of type '" "IRotation const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "createTransformedFormFactor" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
   arg2 = reinterpret_cast< IRotation * >(argp2);
   {
     res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
     if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CreateTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'"); 
     }  
     if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CreateTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'");
     } else {
       kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
       arg3 = *temp;
       if (SWIG_IsNewObj(res3)) delete temp;
     }
   }
-  result = (IFormFactor *)CreateTransformedFormFactor((IFormFactor const &)*arg1,(IRotation const &)*arg2,arg3);
+  result = (IFormFactor *)createTransformedFormFactor((IFormFactor const &)*arg1,(IRotation const &)*arg2,arg3);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
   return resultobj;
 fail:
@@ -90835,995 +90829,20 @@ SWIGINTERN PyObject *RoughnessModel_swigregister(PyObject *SWIGUNUSEDPARM(self),
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_PolygonalTopology_vertexIndices_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IFormFactorPolyhedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  PolygonalTopology *arg1 = (PolygonalTopology *) 0 ;
-  std::vector< int,std::allocator< int > > *arg2 = (std::vector< int,std::allocator< int > > *) 0 ;
+  IFormFactorPolyhedron *arg1 = (IFormFactorPolyhedron *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolygonalTopology_vertexIndices_set", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolygonalTopology, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolygonalTopology_vertexIndices_set" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolygonalTopology_vertexIndices_set" "', argument " "2"" of type '" "std::vector< int,std::allocator< int > > *""'"); 
-  }
-  arg2 = reinterpret_cast< std::vector< int,std::allocator< int > > * >(argp2);
-  if (arg1) (arg1)->vertexIndices = *arg2;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolygonalTopology_vertexIndices_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolygonalTopology *arg1 = (PolygonalTopology *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  std::vector< int,std::allocator< int > > *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolygonalTopology, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolygonalTopology_vertexIndices_get" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
-  result = (std::vector< int,std::allocator< int > > *)& ((arg1)->vertexIndices);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolygonalTopology_symmetry_S2_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolygonalTopology *arg1 = (PolygonalTopology *) 0 ;
-  bool arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  bool val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolygonalTopology_symmetry_S2_set", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolygonalTopology, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolygonalTopology_symmetry_S2_set" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
-  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "PolygonalTopology_symmetry_S2_set" "', argument " "2"" of type '" "bool""'");
-  } 
-  arg2 = static_cast< bool >(val2);
-  if (arg1) (arg1)->symmetry_S2 = arg2;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolygonalTopology_symmetry_S2_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolygonalTopology *arg1 = (PolygonalTopology *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  bool result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolygonalTopology, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolygonalTopology_symmetry_S2_get" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
-  result = (bool) ((arg1)->symmetry_S2);
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_PolygonalTopology(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolygonalTopology *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "new_PolygonalTopology", 0, 0, 0)) SWIG_fail;
-  result = (PolygonalTopology *)new PolygonalTopology();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolygonalTopology, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_PolygonalTopology(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolygonalTopology *arg1 = (PolygonalTopology *) 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_PolygonalTopology, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PolygonalTopology" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *PolygonalTopology_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_PolygonalTopology, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *PolygonalTopology_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
-SWIGINTERN PyObject *_wrap_PolyhedralTopology_faces_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralTopology *arg1 = (PolyhedralTopology *) 0 ;
-  std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *arg2 = (std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralTopology_faces_set", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralTopology, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralTopology_faces_set" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralTopology_faces_set" "', argument " "2"" of type '" "std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *""'"); 
-  }
-  arg2 = reinterpret_cast< std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > * >(argp2);
-  if (arg1) (arg1)->faces = *arg2;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralTopology_faces_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralTopology *arg1 = (PolyhedralTopology *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralTopology, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralTopology_faces_get" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
-  result = (std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *)& ((arg1)->faces);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralTopology_symmetry_Ci_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralTopology *arg1 = (PolyhedralTopology *) 0 ;
-  bool arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  bool val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralTopology_symmetry_Ci_set", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralTopology, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralTopology_symmetry_Ci_set" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
-  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "PolyhedralTopology_symmetry_Ci_set" "', argument " "2"" of type '" "bool""'");
-  } 
-  arg2 = static_cast< bool >(val2);
-  if (arg1) (arg1)->symmetry_Ci = arg2;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralTopology_symmetry_Ci_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralTopology *arg1 = (PolyhedralTopology *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  bool result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralTopology, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralTopology_symmetry_Ci_get" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
-  result = (bool) ((arg1)->symmetry_Ci);
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_PolyhedralTopology(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralTopology *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "new_PolyhedralTopology", 0, 0, 0)) SWIG_fail;
-  result = (PolyhedralTopology *)new PolyhedralTopology();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralTopology, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_PolyhedralTopology(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralTopology *arg1 = (PolyhedralTopology *) 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_PolyhedralTopology, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PolyhedralTopology" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *PolyhedralTopology_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_PolyhedralTopology, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *PolyhedralTopology_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
-SWIGINTERN PyObject *_wrap_new_PolyhedralEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  kvector_t arg1 ;
-  kvector_t arg2 ;
-  void *argp1 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  PolyhedralEdge *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "new_PolyhedralEdge", 2, 2, swig_obj)) SWIG_fail;
-  {
-    res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_PolyhedralEdge" "', argument " "1"" of type '" "kvector_t const""'"); 
-    }  
-    if (!argp1) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_PolyhedralEdge" "', argument " "1"" of type '" "kvector_t const""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp1);
-      arg1 = *temp;
-      if (SWIG_IsNewObj(res1)) delete temp;
-    }
-  }
-  {
-    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 '" "new_PolyhedralEdge" "', argument " "2"" of type '" "kvector_t const""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_PolyhedralEdge" "', 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 = (PolyhedralEdge *)new PolyhedralEdge(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralEdge, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralEdge_E(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  kvector_t result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_E" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
-  result = ((PolyhedralEdge const *)arg1)->E();
-  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralEdge_R(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  kvector_t result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_R" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
-  result = ((PolyhedralEdge const *)arg1)->R();
-  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralEdge_qE(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
-  cvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  complex_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralEdge_qE", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_qE" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralEdge_qE" "', argument " "2"" of type '" "cvector_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralEdge_qE" "', argument " "2"" of type '" "cvector_t""'");
-    } else {
-      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  result = ((PolyhedralEdge const *)arg1)->qE(arg2);
-  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralEdge_qR(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
-  cvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  complex_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralEdge_qR", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_qR" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralEdge_qR" "', argument " "2"" of type '" "cvector_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralEdge_qR" "', argument " "2"" of type '" "cvector_t""'");
-    } else {
-      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  result = ((PolyhedralEdge const *)arg1)->qR(arg2);
-  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralEdge_contrib(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
-  int arg2 ;
-  cvector_t arg3 ;
-  complex_t arg4 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  int val2 ;
-  int ecode2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  std::complex< double > val4 ;
-  int ecode4 = 0 ;
-  PyObject *swig_obj[4] ;
-  complex_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralEdge_contrib", 4, 4, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_contrib" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
-  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "PolyhedralEdge_contrib" "', argument " "2"" of type '" "int""'");
-  } 
-  arg2 = static_cast< int >(val2);
-  {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "PolyhedralEdge_contrib" "', argument " "3"" of type '" "cvector_t""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralEdge_contrib" "', argument " "3"" of type '" "cvector_t""'");
-    } else {
-      cvector_t * temp = reinterpret_cast< cvector_t * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
-    }
-  }
-  ecode4 = SWIG_AsVal_std_complex_Sl_double_Sg_(swig_obj[3], &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "PolyhedralEdge_contrib" "', argument " "4"" of type '" "complex_t""'");
-  } 
-  arg4 = static_cast< complex_t >(val4);
-  result = ((PolyhedralEdge const *)arg1)->contrib(arg2,arg3,arg4);
-  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_PolyhedralEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralEdge *arg1 = (PolyhedralEdge *) 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_PolyhedralEdge, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PolyhedralEdge" "', argument " "1"" of type '" "PolyhedralEdge *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *PolyhedralEdge_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_PolyhedralEdge, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *PolyhedralEdge_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
-SWIGINTERN PyObject *_wrap_PolyhedralFace_diameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  std::vector< kvector_t,std::allocator< kvector_t > > *arg1 = 0 ;
-  int res1 = SWIG_OLDOBJ ;
   PyObject *swig_obj[1] ;
-  double result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  {
-    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
-    res1 = swig::asptr(swig_obj[0], &ptr);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_diameter" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_diameter" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
-    }
-    arg1 = ptr;
-  }
-  result = (double)PolyhedralFace::diameter((std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &)*arg1);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_PolyhedralFace__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  std::vector< kvector_t,std::allocator< kvector_t > > *arg1 = 0 ;
-  bool arg2 ;
-  int res1 = SWIG_OLDOBJ ;
-  bool val2 ;
-  int ecode2 = 0 ;
-  PolyhedralFace *result = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  {
-    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
-    res1 = swig::asptr(swig_obj[0], &ptr);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_PolyhedralFace" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_PolyhedralFace" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
-    }
-    arg1 = ptr;
-  }
-  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_PolyhedralFace" "', argument " "2"" of type '" "bool""'");
-  } 
-  arg2 = static_cast< bool >(val2);
-  result = (PolyhedralFace *)new PolyhedralFace((std::vector< kvector_t,std::allocator< kvector_t > > const &)*arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralFace, SWIG_POINTER_NEW |  0 );
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_PolyhedralFace__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  std::vector< kvector_t,std::allocator< kvector_t > > *arg1 = 0 ;
-  int res1 = SWIG_OLDOBJ ;
-  PolyhedralFace *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  {
-    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
-    res1 = swig::asptr(swig_obj[0], &ptr);
-    if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_PolyhedralFace" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_PolyhedralFace" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
-    }
-    arg1 = ptr;
-  }
-  result = (PolyhedralFace *)new PolyhedralFace((std::vector< kvector_t,std::allocator< kvector_t > > const &)*arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralFace, SWIG_POINTER_NEW |  0 );
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res1)) delete arg1;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_PolyhedralFace__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *result = 0 ;
-  
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (PolyhedralFace *)new PolyhedralFace();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralFace, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_PolyhedralFace(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_PolyhedralFace", 0, 2, argv))) SWIG_fail;
-  --argc;
-  if (argc == 0) {
-    return _wrap_new_PolyhedralFace__SWIG_2(self, argc, argv);
-  }
-  if (argc == 1) {
-    int _v;
-    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_PolyhedralFace__SWIG_1(self, argc, argv);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_bool(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_new_PolyhedralFace__SWIG_0(self, argc, argv);
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_PolyhedralFace'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    PolyhedralFace::PolyhedralFace(std::vector< kvector_t,std::allocator< kvector_t > > const &,bool)\n"
-    "    PolyhedralFace::PolyhedralFace(std::vector< kvector_t,std::allocator< kvector_t > > const &)\n"
-    "    PolyhedralFace::PolyhedralFace()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralFace_area(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *arg1 = (PolyhedralFace *) 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_PolyhedralFace, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_area" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
-  result = (double)((PolyhedralFace const *)arg1)->area();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralFace_pyramidalVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *arg1 = (PolyhedralFace *) 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_PolyhedralFace, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPolyhedron, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_pyramidalVolume" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFormFactorPolyhedron" "', argument " "1"" of type '" "IFormFactorPolyhedron *""'"); 
   }
-  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
-  result = (double)((PolyhedralFace const *)arg1)->pyramidalVolume();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralFace_radius3d(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *arg1 = (PolyhedralFace *) 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_PolyhedralFace, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_radius3d" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
-  result = (double)((PolyhedralFace const *)arg1)->radius3d();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralFace_normalProjectionConj(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
-  cvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  complex_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralFace_normalProjectionConj", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_normalProjectionConj" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralFace_normalProjectionConj" "', argument " "2"" of type '" "cvector_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_normalProjectionConj" "', argument " "2"" of type '" "cvector_t""'");
-    } else {
-      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  result = ((PolyhedralFace const *)arg1)->normalProjectionConj(arg2);
-  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralFace_ff_n(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
-  int arg2 ;
-  cvector_t arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  int val2 ;
-  int ecode2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  complex_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralFace_ff_n", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_ff_n" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
-  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "PolyhedralFace_ff_n" "', argument " "2"" of type '" "int""'");
-  } 
-  arg2 = static_cast< int >(val2);
-  {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "PolyhedralFace_ff_n" "', argument " "3"" of type '" "cvector_t""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_ff_n" "', argument " "3"" of type '" "cvector_t""'");
-    } else {
-      cvector_t * temp = reinterpret_cast< cvector_t * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
-    }
-  }
-  result = ((PolyhedralFace const *)arg1)->ff_n(arg2,arg3);
-  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralFace_ff(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
-  cvector_t arg2 ;
-  bool arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  bool val3 ;
-  int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
-  complex_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralFace_ff", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_ff" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralFace_ff" "', argument " "2"" of type '" "cvector_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_ff" "', argument " "2"" of type '" "cvector_t""'");
-    } else {
-      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  ecode3 = SWIG_AsVal_bool(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "PolyhedralFace_ff" "', argument " "3"" of type '" "bool""'");
-  } 
-  arg3 = static_cast< bool >(val3);
-  result = ((PolyhedralFace const *)arg1)->ff(arg2,arg3);
-  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralFace_ff_2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
-  cvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  complex_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralFace_ff_2D", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_ff_2D" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralFace_ff_2D" "', argument " "2"" of type '" "cvector_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_ff_2D" "', argument " "2"" of type '" "cvector_t""'");
-    } else {
-      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  result = ((PolyhedralFace const *)arg1)->ff_2D(arg2);
-  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_PolyhedralFace_assert_Ci(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
-  PolyhedralFace *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "PolyhedralFace_assert_Ci", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_assert_Ci" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_PolyhedralFace,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralFace_assert_Ci" "', argument " "2"" of type '" "PolyhedralFace const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_assert_Ci" "', argument " "2"" of type '" "PolyhedralFace const &""'"); 
-  }
-  arg2 = reinterpret_cast< PolyhedralFace * >(argp2);
-  ((PolyhedralFace const *)arg1)->assert_Ci((PolyhedralFace const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_delete_PolyhedralFace(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  PolyhedralFace *arg1 = (PolyhedralFace *) 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_PolyhedralFace, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PolyhedralFace" "', argument " "1"" of type '" "PolyhedralFace *""'"); 
-  }
-  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  arg1 = reinterpret_cast< IFormFactorPolyhedron * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -91832,20 +90851,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *PolyhedralFace_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_PolyhedralFace, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *PolyhedralFace_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
-SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_bottomZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPolyhedron_bottomZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  IFormFactorPolyhedron *arg1 = (IFormFactorPolyhedron *) 0 ;
   IRotation *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -91854,21 +90862,21 @@ SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_bottomZ(PyObject *SWIGUNUSEDPARM
   PyObject *swig_obj[2] ;
   double result;
   
-  if (!SWIG_Python_UnpackTuple(args, "FormFactorPolyhedron_bottomZ", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IFormFactorPolyhedron_bottomZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPolyhedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_bottomZ" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPolyhedron_bottomZ" "', argument " "1"" of type '" "IFormFactorPolyhedron const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
+  arg1 = reinterpret_cast< IFormFactorPolyhedron * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IRotation,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolyhedron_bottomZ" "', argument " "2"" of type '" "IRotation const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorPolyhedron_bottomZ" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolyhedron_bottomZ" "', argument " "2"" of type '" "IRotation const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorPolyhedron_bottomZ" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
   arg2 = reinterpret_cast< IRotation * >(argp2);
-  result = (double)((FormFactorPolyhedron const *)arg1)->bottomZ((IRotation const &)*arg2);
+  result = (double)((IFormFactorPolyhedron const *)arg1)->bottomZ((IRotation const &)*arg2);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -91876,9 +90884,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_topZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPolyhedron_topZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  IFormFactorPolyhedron *arg1 = (IFormFactorPolyhedron *) 0 ;
   IRotation *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -91887,21 +90895,21 @@ SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_topZ(PyObject *SWIGUNUSEDPARM(se
   PyObject *swig_obj[2] ;
   double result;
   
-  if (!SWIG_Python_UnpackTuple(args, "FormFactorPolyhedron_topZ", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IFormFactorPolyhedron_topZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPolyhedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_topZ" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPolyhedron_topZ" "', argument " "1"" of type '" "IFormFactorPolyhedron const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
+  arg1 = reinterpret_cast< IFormFactorPolyhedron * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IRotation,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolyhedron_topZ" "', argument " "2"" of type '" "IRotation const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorPolyhedron_topZ" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolyhedron_topZ" "', argument " "2"" of type '" "IRotation const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorPolyhedron_topZ" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
   arg2 = reinterpret_cast< IRotation * >(argp2);
-  result = (double)((FormFactorPolyhedron const *)arg1)->topZ((IRotation const &)*arg2);
+  result = (double)((IFormFactorPolyhedron const *)arg1)->topZ((IRotation const &)*arg2);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -91909,47 +90917,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
-  cvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  complex_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "FormFactorPolyhedron_evaluate_for_q", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_evaluate_for_q" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolyhedron_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolyhedron_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'");
-    } else {
-      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  result = ((FormFactorPolyhedron const *)arg1)->evaluate_for_q(arg2);
-  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_evaluate_centered(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPolyhedron_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  IFormFactorPolyhedron *arg1 = (IFormFactorPolyhedron *) 0 ;
   cvector_t arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -91958,26 +90928,26 @@ SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_evaluate_centered(PyObject *SWIG
   PyObject *swig_obj[2] ;
   complex_t result;
   
-  if (!SWIG_Python_UnpackTuple(args, "FormFactorPolyhedron_evaluate_centered", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IFormFactorPolyhedron_evaluate_for_q", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPolyhedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_evaluate_centered" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPolyhedron_evaluate_for_q" "', argument " "1"" of type '" "IFormFactorPolyhedron const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
+  arg1 = reinterpret_cast< IFormFactorPolyhedron * >(argp1);
   {
     res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolyhedron_evaluate_centered" "', argument " "2"" of type '" "cvector_t""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorPolyhedron_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolyhedron_evaluate_centered" "', argument " "2"" of type '" "cvector_t""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorPolyhedron_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'");
     } else {
       cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
       arg2 = *temp;
       if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
-  result = ((FormFactorPolyhedron const *)arg1)->evaluate_centered(arg2);
+  result = ((IFormFactorPolyhedron const *)arg1)->evaluate_for_q(arg2);
   resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
   return resultobj;
 fail:
@@ -91985,32 +90955,47 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_volume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPolyhedron_evaluate_centered(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  IFormFactorPolyhedron *arg1 = (IFormFactorPolyhedron *) 0 ;
+  cvector_t arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  complex_t result;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IFormFactorPolyhedron_evaluate_centered", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPolyhedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_volume" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPolyhedron_evaluate_centered" "', argument " "1"" of type '" "IFormFactorPolyhedron const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
-  result = (double)((FormFactorPolyhedron const *)arg1)->volume();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< IFormFactorPolyhedron * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorPolyhedron_evaluate_centered" "', argument " "2"" of type '" "cvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorPolyhedron_evaluate_centered" "', argument " "2"" of type '" "cvector_t""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((IFormFactorPolyhedron const *)arg1)->evaluate_centered(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_radialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPolyhedron_volume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  IFormFactorPolyhedron *arg1 = (IFormFactorPolyhedron *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -92018,12 +91003,12 @@ SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_radialExtension(PyObject *SWIGUN
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPolyhedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_radialExtension" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPolyhedron_volume" "', argument " "1"" of type '" "IFormFactorPolyhedron const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
-  result = (double)((FormFactorPolyhedron const *)arg1)->radialExtension();
+  arg1 = reinterpret_cast< IFormFactorPolyhedron * >(argp1);
+  result = (double)((IFormFactorPolyhedron const *)arg1)->volume();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -92031,43 +91016,44 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_assert_platonic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPolyhedron_radialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  IFormFactorPolyhedron *arg1 = (IFormFactorPolyhedron *) 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_FormFactorPolyhedron, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPolyhedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_assert_platonic" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPolyhedron_radialExtension" "', argument " "1"" of type '" "IFormFactorPolyhedron const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
-  ((FormFactorPolyhedron const *)arg1)->assert_platonic();
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IFormFactorPolyhedron * >(argp1);
+  result = (double)((IFormFactorPolyhedron const *)arg1)->radialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_FormFactorPolyhedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPolyhedron_assert_platonic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  IFormFactorPolyhedron *arg1 = (IFormFactorPolyhedron *) 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_FormFactorPolyhedron, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPolyhedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPolyhedron" "', argument " "1"" of type '" "FormFactorPolyhedron *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPolyhedron_assert_platonic" "', argument " "1"" of type '" "IFormFactorPolyhedron const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
-  delete arg1;
+  arg1 = reinterpret_cast< IFormFactorPolyhedron * >(argp1);
+  ((IFormFactorPolyhedron const *)arg1)->assert_platonic();
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -92075,49 +91061,38 @@ fail:
 }
 
 
-SWIGINTERN PyObject *FormFactorPolyhedron_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IFormFactorPolyhedron_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPolyhedron, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFormFactorPolyhedron, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_bottomZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_IFormFactorPrism(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 0 ;
-  IRotation *arg2 = 0 ;
+  IFormFactorPrism *arg1 = (IFormFactorPrism *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  double result;
+  PyObject *swig_obj[1] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "FormFactorPolygonalPrism_bottomZ", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolygonalPrism, 0 |  0 );
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPrism, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_bottomZ" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IRotation,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolygonalPrism_bottomZ" "', argument " "2"" of type '" "IRotation const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFormFactorPrism" "', argument " "1"" of type '" "IFormFactorPrism *""'"); 
   }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolygonalPrism_bottomZ" "', argument " "2"" of type '" "IRotation const &""'"); 
-  }
-  arg2 = reinterpret_cast< IRotation * >(argp2);
-  result = (double)((FormFactorPolygonalPrism const *)arg1)->bottomZ((IRotation const &)*arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< IFormFactorPrism * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_topZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPrism_bottomZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 0 ;
+  IFormFactorPrism *arg1 = (IFormFactorPrism *) 0 ;
   IRotation *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -92126,21 +91101,21 @@ SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_topZ(PyObject *SWIGUNUSEDPAR
   PyObject *swig_obj[2] ;
   double result;
   
-  if (!SWIG_Python_UnpackTuple(args, "FormFactorPolygonalPrism_topZ", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolygonalPrism, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IFormFactorPrism_bottomZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPrism, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_topZ" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPrism_bottomZ" "', argument " "1"" of type '" "IFormFactorPrism const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
+  arg1 = reinterpret_cast< IFormFactorPrism * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IRotation,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolygonalPrism_topZ" "', argument " "2"" of type '" "IRotation const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorPrism_bottomZ" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolygonalPrism_topZ" "', argument " "2"" of type '" "IRotation const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorPrism_bottomZ" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
   arg2 = reinterpret_cast< IRotation * >(argp2);
-  result = (double)((FormFactorPolygonalPrism const *)arg1)->topZ((IRotation const &)*arg2);
+  result = (double)((IFormFactorPrism const *)arg1)->bottomZ((IRotation const &)*arg2);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -92148,106 +91123,32 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPrism_topZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 0 ;
-  cvector_t arg2 ;
+  IFormFactorPrism *arg1 = (IFormFactorPrism *) 0 ;
+  IRotation *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
+  void *argp2 = 0 ;
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
-  complex_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "FormFactorPolygonalPrism_evaluate_for_q", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolygonalPrism, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_evaluate_for_q" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolygonalPrism_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolygonalPrism_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'");
-    } else {
-      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  result = ((FormFactorPolygonalPrism const *)arg1)->evaluate_for_q(arg2);
-  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_volume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 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_FormFactorPolygonalPrism, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IFormFactorPrism_topZ", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPrism, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_volume" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPrism_topZ" "', argument " "1"" of type '" "IFormFactorPrism const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
-  result = (double)((FormFactorPolygonalPrism const *)arg1)->volume();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 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_FormFactorPolygonalPrism, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_getHeight" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
+  arg1 = reinterpret_cast< IFormFactorPrism * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IRotation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorPrism_topZ" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
-  result = (double)((FormFactorPolygonalPrism const *)arg1)->getHeight();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_radialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 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_FormFactorPolygonalPrism, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_radialExtension" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorPrism_topZ" "', argument " "2"" of type '" "IRotation const &""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
-  result = (double)((FormFactorPolygonalPrism const *)arg1)->radialExtension();
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  result = (double)((IFormFactorPrism const *)arg1)->topZ((IRotation const &)*arg2);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -92255,38 +91156,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_FormFactorPolygonalPrism(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPrism_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 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_FormFactorPolygonalPrism, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPolygonalPrism" "', argument " "1"" of type '" "FormFactorPolygonalPrism *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *FormFactorPolygonalPrism_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *obj;
-  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPolygonalPrism, SWIG_NewClientData(obj));
-  return SWIG_Py_Void();
-}
-
-SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  IFormFactorPrism *arg1 = (IFormFactorPrism *) 0 ;
   cvector_t arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -92295,26 +91167,26 @@ SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_evaluate_for_q(PyObject *S
   PyObject *swig_obj[2] ;
   complex_t result;
   
-  if (!SWIG_Python_UnpackTuple(args, "FormFactorPolygonalSurface_evaluate_for_q", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "IFormFactorPrism_evaluate_for_q", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPrism, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalSurface_evaluate_for_q" "', argument " "1"" of type '" "FormFactorPolygonalSurface const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPrism_evaluate_for_q" "', argument " "1"" of type '" "IFormFactorPrism const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
+  arg1 = reinterpret_cast< IFormFactorPrism * >(argp1);
   {
     res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolygonalSurface_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorPrism_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolygonalSurface_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorPrism_evaluate_for_q" "', argument " "2"" of type '" "cvector_t""'");
     } else {
       cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
       arg2 = *temp;
       if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
-  result = ((FormFactorPolygonalSurface const *)arg1)->evaluate_for_q(arg2);
+  result = ((IFormFactorPrism const *)arg1)->evaluate_for_q(arg2);
   resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
   return resultobj;
 fail:
@@ -92322,9 +91194,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_volume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPrism_volume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  IFormFactorPrism *arg1 = (IFormFactorPrism *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -92332,12 +91204,12 @@ SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_volume(PyObject *SWIGUNUSE
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPrism, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalSurface_volume" "', argument " "1"" of type '" "FormFactorPolygonalSurface const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPrism_volume" "', argument " "1"" of type '" "IFormFactorPrism const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
-  result = (double)((FormFactorPolygonalSurface const *)arg1)->volume();
+  arg1 = reinterpret_cast< IFormFactorPrism * >(argp1);
+  result = (double)((IFormFactorPrism const *)arg1)->volume();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -92345,9 +91217,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_radialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPrism_radialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  IFormFactorPrism *arg1 = (IFormFactorPrism *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -92355,12 +91227,12 @@ SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_radialExtension(PyObject *
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPrism, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalSurface_radialExtension" "', argument " "1"" of type '" "FormFactorPolygonalSurface const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPrism_radialExtension" "', argument " "1"" of type '" "IFormFactorPrism const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
-  result = (double)((FormFactorPolygonalSurface const *)arg1)->radialExtension();
+  arg1 = reinterpret_cast< IFormFactorPrism * >(argp1);
+  result = (double)((IFormFactorPrism const *)arg1)->radialExtension();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -92368,32 +91240,33 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_FormFactorPolygonalSurface(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IFormFactorPrism_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  IFormFactorPrism *arg1 = (IFormFactorPrism *) 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_FormFactorPolygonalSurface, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IFormFactorPrism, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPolygonalSurface" "', argument " "1"" of type '" "FormFactorPolygonalSurface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorPrism_getHeight" "', argument " "1"" of type '" "IFormFactorPrism const *""'"); 
   }
-  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
+  arg1 = reinterpret_cast< IFormFactorPrism * >(argp1);
+  result = (double)((IFormFactorPrism const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *FormFactorPolygonalSurface_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *IFormFactorPrism_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPolygonalSurface, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFormFactorPrism, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
@@ -120856,7 +119729,7 @@ SWIGINTERN PyObject *HexagonalLattice_swiginit(PyObject *SWIGUNUSEDPARM(self), P
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_CreateFCCLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_createFCCLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   ILatticeOrientation *arg2 = 0 ;
@@ -120867,21 +119740,21 @@ SWIGINTERN PyObject *_wrap_CreateFCCLattice(PyObject *SWIGUNUSEDPARM(self), PyOb
   PyObject *swig_obj[2] ;
   SwigValueWrapper< Lattice > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "CreateFCCLattice", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "createFCCLattice", 2, 2, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateFCCLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "createFCCLattice" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_ILatticeOrientation,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CreateFCCLattice" "', argument " "2"" of type '" "ILatticeOrientation const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "createFCCLattice" "', argument " "2"" of type '" "ILatticeOrientation const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CreateFCCLattice" "', argument " "2"" of type '" "ILatticeOrientation const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "createFCCLattice" "', argument " "2"" of type '" "ILatticeOrientation const &""'"); 
   }
   arg2 = reinterpret_cast< ILatticeOrientation * >(argp2);
-  result = LatticeUtils::CreateFCCLattice(arg1,(ILatticeOrientation const &)*arg2);
+  result = LatticeUtils::createFCCLattice(arg1,(ILatticeOrientation const &)*arg2);
   resultobj = SWIG_NewPointerObj((new Lattice(static_cast< const Lattice& >(result))), SWIGTYPE_p_Lattice, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -120889,7 +119762,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_CreateHCPLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_createHCPLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -120903,26 +119776,26 @@ SWIGINTERN PyObject *_wrap_CreateHCPLattice(PyObject *SWIGUNUSEDPARM(self), PyOb
   PyObject *swig_obj[3] ;
   SwigValueWrapper< Lattice > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "CreateHCPLattice", 3, 3, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "createHCPLattice", 3, 3, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateHCPLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "createHCPLattice" "', 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 '" "CreateHCPLattice" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "createHCPLattice" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_ILatticeOrientation,  0  | 0);
   if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CreateHCPLattice" "', argument " "3"" of type '" "ILatticeOrientation const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "createHCPLattice" "', argument " "3"" of type '" "ILatticeOrientation const &""'"); 
   }
   if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CreateHCPLattice" "', argument " "3"" of type '" "ILatticeOrientation const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "createHCPLattice" "', argument " "3"" of type '" "ILatticeOrientation const &""'"); 
   }
   arg3 = reinterpret_cast< ILatticeOrientation * >(argp3);
-  result = LatticeUtils::CreateHCPLattice(arg1,arg2,(ILatticeOrientation const &)*arg3);
+  result = LatticeUtils::createHCPLattice(arg1,arg2,(ILatticeOrientation const &)*arg3);
   resultobj = SWIG_NewPointerObj((new Lattice(static_cast< const Lattice& >(result))), SWIGTYPE_p_Lattice, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -120930,7 +119803,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_CreateBCTLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_createBCTLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -120944,26 +119817,26 @@ SWIGINTERN PyObject *_wrap_CreateBCTLattice(PyObject *SWIGUNUSEDPARM(self), PyOb
   PyObject *swig_obj[3] ;
   SwigValueWrapper< Lattice > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "CreateBCTLattice", 3, 3, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "createBCTLattice", 3, 3, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateBCTLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "createBCTLattice" "', 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 '" "CreateBCTLattice" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "createBCTLattice" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_ILatticeOrientation,  0  | 0);
   if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CreateBCTLattice" "', argument " "3"" of type '" "ILatticeOrientation const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "createBCTLattice" "', argument " "3"" of type '" "ILatticeOrientation const &""'"); 
   }
   if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CreateBCTLattice" "', argument " "3"" of type '" "ILatticeOrientation const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "createBCTLattice" "', argument " "3"" of type '" "ILatticeOrientation const &""'"); 
   }
   arg3 = reinterpret_cast< ILatticeOrientation * >(argp3);
-  result = LatticeUtils::CreateBCTLattice(arg1,arg2,(ILatticeOrientation const &)*arg3);
+  result = LatticeUtils::createBCTLattice(arg1,arg2,(ILatticeOrientation const &)*arg3);
   resultobj = SWIG_NewPointerObj((new Lattice(static_cast< const Lattice& >(result))), SWIGTYPE_p_Lattice, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -126254,11 +125127,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "disown_IFormFactor", _wrap_disown_IFormFactor, METH_O, NULL},
 	 { "IFormFactor_swigregister", IFormFactor_swigregister, METH_O, NULL},
 	 { "IFormFactor_swiginit", IFormFactor_swiginit, METH_VARARGS, NULL},
-	 { "CreateTransformedFormFactor", _wrap_CreateTransformedFormFactor, METH_VARARGS, "\n"
-		"CreateTransformedFormFactor(IFormFactor formfactor, IRotation rot, kvector_t translation) -> IFormFactor\n"
-		"IFormFactor* CreateTransformedFormFactor(const IFormFactor &formfactor, const IRotation &rot, kvector_t translation)\n"
-		"\n"
-		""},
+	 { "createTransformedFormFactor", _wrap_createTransformedFormFactor, METH_VARARGS, "createTransformedFormFactor(IFormFactor formfactor, IRotation rot, kvector_t translation) -> IFormFactor"},
 	 { "new_IFormFactorBorn", _wrap_new_IFormFactorBorn, METH_VARARGS, "\n"
 		"IFormFactorBorn()\n"
 		"new_IFormFactorBorn(PyObject * _self, NodeMeta meta, vdouble1d_t PValues) -> IFormFactorBorn\n"
@@ -129992,259 +128861,105 @@ static PyMethodDef SwigMethods[] = {
 	 { "MultiLayer_swiginit", MultiLayer_swiginit, METH_VARARGS, NULL},
 	 { "delete_RoughnessModel", _wrap_delete_RoughnessModel, METH_O, "delete_RoughnessModel(RoughnessModel self)"},
 	 { "RoughnessModel_swigregister", RoughnessModel_swigregister, METH_O, NULL},
-	 { "PolygonalTopology_vertexIndices_set", _wrap_PolygonalTopology_vertexIndices_set, METH_VARARGS, "PolygonalTopology_vertexIndices_set(PolygonalTopology self, vector_integer_t vertexIndices)"},
-	 { "PolygonalTopology_vertexIndices_get", _wrap_PolygonalTopology_vertexIndices_get, METH_O, "PolygonalTopology_vertexIndices_get(PolygonalTopology self) -> vector_integer_t"},
-	 { "PolygonalTopology_symmetry_S2_set", _wrap_PolygonalTopology_symmetry_S2_set, METH_VARARGS, "PolygonalTopology_symmetry_S2_set(PolygonalTopology self, bool symmetry_S2)"},
-	 { "PolygonalTopology_symmetry_S2_get", _wrap_PolygonalTopology_symmetry_S2_get, METH_O, "PolygonalTopology_symmetry_S2_get(PolygonalTopology self) -> bool"},
-	 { "new_PolygonalTopology", _wrap_new_PolygonalTopology, METH_NOARGS, "\n"
-		"new_PolygonalTopology() -> PolygonalTopology\n"
-		"\n"
-		"\n"
-		"For internal use in  PolyhedralFace.\n"
-		"\n"
-		"C++ includes: FormFactorPolyhedron.h\n"
-		"\n"
-		""},
-	 { "delete_PolygonalTopology", _wrap_delete_PolygonalTopology, METH_O, "delete_PolygonalTopology(PolygonalTopology self)"},
-	 { "PolygonalTopology_swigregister", PolygonalTopology_swigregister, METH_O, NULL},
-	 { "PolygonalTopology_swiginit", PolygonalTopology_swiginit, METH_VARARGS, NULL},
-	 { "PolyhedralTopology_faces_set", _wrap_PolyhedralTopology_faces_set, METH_VARARGS, "PolyhedralTopology_faces_set(PolyhedralTopology self, std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > * faces)"},
-	 { "PolyhedralTopology_faces_get", _wrap_PolyhedralTopology_faces_get, METH_O, "PolyhedralTopology_faces_get(PolyhedralTopology self) -> std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *"},
-	 { "PolyhedralTopology_symmetry_Ci_set", _wrap_PolyhedralTopology_symmetry_Ci_set, METH_VARARGS, "PolyhedralTopology_symmetry_Ci_set(PolyhedralTopology self, bool symmetry_Ci)"},
-	 { "PolyhedralTopology_symmetry_Ci_get", _wrap_PolyhedralTopology_symmetry_Ci_get, METH_O, "PolyhedralTopology_symmetry_Ci_get(PolyhedralTopology self) -> bool"},
-	 { "new_PolyhedralTopology", _wrap_new_PolyhedralTopology, METH_NOARGS, "\n"
-		"new_PolyhedralTopology() -> PolyhedralTopology\n"
-		"\n"
-		"\n"
-		"For internal use in  FormFactorPolyhedron.\n"
-		"\n"
-		"C++ includes: FormFactorPolyhedron.h\n"
-		"\n"
-		""},
-	 { "delete_PolyhedralTopology", _wrap_delete_PolyhedralTopology, METH_O, "delete_PolyhedralTopology(PolyhedralTopology self)"},
-	 { "PolyhedralTopology_swigregister", PolyhedralTopology_swigregister, METH_O, NULL},
-	 { "PolyhedralTopology_swiginit", PolyhedralTopology_swiginit, METH_VARARGS, NULL},
-	 { "new_PolyhedralEdge", _wrap_new_PolyhedralEdge, METH_VARARGS, "\n"
-		"new_PolyhedralEdge(kvector_t _Vlow, kvector_t _Vhig) -> PolyhedralEdge\n"
-		"PolyhedralEdge::PolyhedralEdge(const kvector_t _Vlow, const kvector_t _Vhig)\n"
-		"\n"
-		""},
-	 { "PolyhedralEdge_E", _wrap_PolyhedralEdge_E, METH_O, "\n"
-		"PolyhedralEdge_E(PolyhedralEdge self) -> kvector_t\n"
-		"kvector_t PolyhedralEdge::E() const\n"
-		"\n"
-		""},
-	 { "PolyhedralEdge_R", _wrap_PolyhedralEdge_R, METH_O, "\n"
-		"PolyhedralEdge_R(PolyhedralEdge self) -> kvector_t\n"
-		"kvector_t PolyhedralEdge::R() const\n"
-		"\n"
-		""},
-	 { "PolyhedralEdge_qE", _wrap_PolyhedralEdge_qE, METH_VARARGS, "\n"
-		"PolyhedralEdge_qE(PolyhedralEdge self, cvector_t q) -> complex_t\n"
-		"complex_t PolyhedralEdge::qE(cvector_t q) const\n"
-		"\n"
-		""},
-	 { "PolyhedralEdge_qR", _wrap_PolyhedralEdge_qR, METH_VARARGS, "\n"
-		"PolyhedralEdge_qR(PolyhedralEdge self, cvector_t q) -> complex_t\n"
-		"complex_t PolyhedralEdge::qR(cvector_t q) const\n"
-		"\n"
-		""},
-	 { "PolyhedralEdge_contrib", _wrap_PolyhedralEdge_contrib, METH_VARARGS, "\n"
-		"PolyhedralEdge_contrib(PolyhedralEdge self, int m, cvector_t qpa, complex_t qrperp) -> complex_t\n"
-		"complex_t PolyhedralEdge::contrib(int m, cvector_t qpa, complex_t qrperp) const\n"
-		"\n"
-		"Returns sum_l=0^M/2 u^2l v^(M-2l) / (2l+1)!(M-2l)! - vperp^M/M! \n"
-		"\n"
-		""},
-	 { "delete_PolyhedralEdge", _wrap_delete_PolyhedralEdge, METH_O, "delete_PolyhedralEdge(PolyhedralEdge self)"},
-	 { "PolyhedralEdge_swigregister", PolyhedralEdge_swigregister, METH_O, NULL},
-	 { "PolyhedralEdge_swiginit", PolyhedralEdge_swiginit, METH_VARARGS, NULL},
-	 { "PolyhedralFace_diameter", _wrap_PolyhedralFace_diameter, METH_O, "PolyhedralFace_diameter(vector_kvector_t V) -> double"},
-	 { "new_PolyhedralFace", _wrap_new_PolyhedralFace, METH_VARARGS, "\n"
-		"PolyhedralFace(vector_kvector_t _V=std::vector< kvector_t >(), bool _sym_S2=False)\n"
-		"PolyhedralFace::PolyhedralFace(const std::vector< kvector_t > &_V=std::vector< kvector_t >(), bool _sym_S2=false)\n"
-		"\n"
-		"Sets internal variables for given vertex chain.\n"
-		"\n"
-		"Parameters:\n"
-		"-----------\n"
-		"\n"
-		"V: \n"
-		"oriented vertex list\n"
-		"\n"
-		"_sym_S2: \n"
-		"true if face has a perpedicular two-fold symmetry axis \n"
-		"\n"
-		""},
-	 { "PolyhedralFace_area", _wrap_PolyhedralFace_area, METH_O, "\n"
-		"PolyhedralFace_area(PolyhedralFace self) -> double\n"
-		"double PolyhedralFace::area() const\n"
-		"\n"
-		""},
-	 { "PolyhedralFace_pyramidalVolume", _wrap_PolyhedralFace_pyramidalVolume, METH_O, "\n"
-		"PolyhedralFace_pyramidalVolume(PolyhedralFace self) -> double\n"
-		"double PolyhedralFace::pyramidalVolume() const\n"
-		"\n"
-		""},
-	 { "PolyhedralFace_radius3d", _wrap_PolyhedralFace_radius3d, METH_O, "\n"
-		"PolyhedralFace_radius3d(PolyhedralFace self) -> double\n"
-		"double PolyhedralFace::radius3d() const\n"
-		"\n"
-		""},
-	 { "PolyhedralFace_normalProjectionConj", _wrap_PolyhedralFace_normalProjectionConj, METH_VARARGS, "\n"
-		"PolyhedralFace_normalProjectionConj(PolyhedralFace self, cvector_t q) -> complex_t\n"
-		"complex_t PolyhedralFace::normalProjectionConj(cvector_t q) const\n"
-		"\n"
-		"Returns conj(q)*normal [ BasicVector3D::dot is antilinear in 'this' argument]. \n"
+	 { "delete_IFormFactorPolyhedron", _wrap_delete_IFormFactorPolyhedron, METH_O, "\n"
+		"delete_IFormFactorPolyhedron(IFormFactorPolyhedron self)\n"
+		"IFormFactorPolyhedron::~IFormFactorPolyhedron()\n"
 		"\n"
 		""},
-	 { "PolyhedralFace_ff_n", _wrap_PolyhedralFace_ff_n, METH_VARARGS, "\n"
-		"PolyhedralFace_ff_n(PolyhedralFace self, int m, cvector_t q) -> complex_t\n"
-		"complex_t PolyhedralFace::ff_n(int m, cvector_t q) const\n"
-		"\n"
-		"Returns contribution qn*f_n [of order q^(n+1)] from this face to the polyhedral form factor. \n"
-		"\n"
-		""},
-	 { "PolyhedralFace_ff", _wrap_PolyhedralFace_ff, METH_VARARGS, "\n"
-		"PolyhedralFace_ff(PolyhedralFace self, cvector_t q, bool sym_Ci) -> complex_t\n"
-		"complex_t PolyhedralFace::ff(cvector_t q, bool sym_Ci) const\n"
-		"\n"
-		"Returns the contribution ff(q) of this face to the polyhedral form factor. \n"
-		"\n"
-		""},
-	 { "PolyhedralFace_ff_2D", _wrap_PolyhedralFace_ff_2D, METH_VARARGS, "\n"
-		"PolyhedralFace_ff_2D(PolyhedralFace self, cvector_t qpa) -> complex_t\n"
-		"complex_t PolyhedralFace::ff_2D(cvector_t qpa) const\n"
-		"\n"
-		"Returns the two-dimensional form factor of this face, for use in a prism. \n"
-		"\n"
-		""},
-	 { "PolyhedralFace_assert_Ci", _wrap_PolyhedralFace_assert_Ci, METH_VARARGS, "\n"
-		"PolyhedralFace_assert_Ci(PolyhedralFace self, PolyhedralFace other)\n"
-		"void PolyhedralFace::assert_Ci(const PolyhedralFace &other) const\n"
-		"\n"
-		"Throws if deviation from inversion symmetry is detected. Does not check vertices. \n"
-		"\n"
-		""},
-	 { "delete_PolyhedralFace", _wrap_delete_PolyhedralFace, METH_O, "delete_PolyhedralFace(PolyhedralFace self)"},
-	 { "PolyhedralFace_swigregister", PolyhedralFace_swigregister, METH_O, NULL},
-	 { "PolyhedralFace_swiginit", PolyhedralFace_swiginit, METH_VARARGS, NULL},
-	 { "FormFactorPolyhedron_bottomZ", _wrap_FormFactorPolyhedron_bottomZ, METH_VARARGS, "\n"
-		"FormFactorPolyhedron_bottomZ(FormFactorPolyhedron self, IRotation rotation) -> double\n"
-		"double FormFactorPolyhedron::bottomZ(const IRotation &rotation) const override final\n"
+	 { "IFormFactorPolyhedron_bottomZ", _wrap_IFormFactorPolyhedron_bottomZ, METH_VARARGS, "\n"
+		"IFormFactorPolyhedron_bottomZ(IFormFactorPolyhedron self, IRotation rotation) -> double\n"
+		"double IFormFactorPolyhedron::bottomZ(const IRotation &rotation) const override final\n"
 		"\n"
 		"Returns the z-coordinate of the lowest point in this shape after a given rotation. \n"
 		"\n"
 		""},
-	 { "FormFactorPolyhedron_topZ", _wrap_FormFactorPolyhedron_topZ, METH_VARARGS, "\n"
-		"FormFactorPolyhedron_topZ(FormFactorPolyhedron self, IRotation rotation) -> double\n"
-		"double FormFactorPolyhedron::topZ(const IRotation &rotation) const override final\n"
+	 { "IFormFactorPolyhedron_topZ", _wrap_IFormFactorPolyhedron_topZ, METH_VARARGS, "\n"
+		"IFormFactorPolyhedron_topZ(IFormFactorPolyhedron self, IRotation rotation) -> double\n"
+		"double IFormFactorPolyhedron::topZ(const IRotation &rotation) const override final\n"
 		"\n"
 		"Returns the z-coordinate of the lowest point in this shape after a given rotation. \n"
 		"\n"
 		""},
-	 { "FormFactorPolyhedron_evaluate_for_q", _wrap_FormFactorPolyhedron_evaluate_for_q, METH_VARARGS, "\n"
-		"FormFactorPolyhedron_evaluate_for_q(FormFactorPolyhedron self, cvector_t q) -> complex_t\n"
-		"complex_t FormFactorPolyhedron::evaluate_for_q(cvector_t q) const override final\n"
+	 { "IFormFactorPolyhedron_evaluate_for_q", _wrap_IFormFactorPolyhedron_evaluate_for_q, METH_VARARGS, "\n"
+		"IFormFactorPolyhedron_evaluate_for_q(IFormFactorPolyhedron self, cvector_t q) -> complex_t\n"
+		"complex_t IFormFactorPolyhedron::evaluate_for_q(cvector_t q) const override final\n"
 		"\n"
-		"Returns the form factor F(q) of this polyhedron, respecting the offset z_bottom. \n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
 		"\n"
 		""},
-	 { "FormFactorPolyhedron_evaluate_centered", _wrap_FormFactorPolyhedron_evaluate_centered, METH_VARARGS, "\n"
-		"FormFactorPolyhedron_evaluate_centered(FormFactorPolyhedron self, cvector_t q) -> complex_t\n"
-		"complex_t FormFactorPolyhedron::evaluate_centered(cvector_t q) const\n"
-		"\n"
-		"Returns the form factor F(q) of this polyhedron, with origin at z=0. \n"
+	 { "IFormFactorPolyhedron_evaluate_centered", _wrap_IFormFactorPolyhedron_evaluate_centered, METH_VARARGS, "\n"
+		"IFormFactorPolyhedron_evaluate_centered(IFormFactorPolyhedron self, cvector_t q) -> complex_t\n"
+		"complex_t IFormFactorPolyhedron::evaluate_centered(cvector_t q) const\n"
 		"\n"
 		""},
-	 { "FormFactorPolyhedron_volume", _wrap_FormFactorPolyhedron_volume, METH_O, "\n"
-		"FormFactorPolyhedron_volume(FormFactorPolyhedron self) -> double\n"
-		"double FormFactorPolyhedron::volume() const override final\n"
+	 { "IFormFactorPolyhedron_volume", _wrap_IFormFactorPolyhedron_volume, METH_O, "\n"
+		"IFormFactorPolyhedron_volume(IFormFactorPolyhedron self) -> double\n"
+		"double IFormFactorPolyhedron::volume() const override final\n"
 		"\n"
 		"Returns the total volume of the particle of this form factor's shape. \n"
 		"\n"
 		""},
-	 { "FormFactorPolyhedron_radialExtension", _wrap_FormFactorPolyhedron_radialExtension, METH_O, "\n"
-		"FormFactorPolyhedron_radialExtension(FormFactorPolyhedron self) -> double\n"
-		"double FormFactorPolyhedron::radialExtension() const override final\n"
+	 { "IFormFactorPolyhedron_radialExtension", _wrap_IFormFactorPolyhedron_radialExtension, METH_O, "\n"
+		"IFormFactorPolyhedron_radialExtension(IFormFactorPolyhedron self) -> double\n"
+		"double IFormFactorPolyhedron::radialExtension() const override final\n"
 		"\n"
 		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
 		"\n"
 		""},
-	 { "FormFactorPolyhedron_assert_platonic", _wrap_FormFactorPolyhedron_assert_platonic, METH_O, "\n"
-		"FormFactorPolyhedron_assert_platonic(FormFactorPolyhedron self)\n"
-		"void FormFactorPolyhedron::assert_platonic() const\n"
+	 { "IFormFactorPolyhedron_assert_platonic", _wrap_IFormFactorPolyhedron_assert_platonic, METH_O, "\n"
+		"IFormFactorPolyhedron_assert_platonic(IFormFactorPolyhedron self)\n"
+		"void IFormFactorPolyhedron::assert_platonic() const\n"
 		"\n"
 		"Assertions for Platonic solid. \n"
 		"\n"
 		""},
-	 { "delete_FormFactorPolyhedron", _wrap_delete_FormFactorPolyhedron, METH_O, "delete_FormFactorPolyhedron(FormFactorPolyhedron self)"},
-	 { "FormFactorPolyhedron_swigregister", FormFactorPolyhedron_swigregister, METH_O, NULL},
-	 { "FormFactorPolygonalPrism_bottomZ", _wrap_FormFactorPolygonalPrism_bottomZ, METH_VARARGS, "\n"
-		"FormFactorPolygonalPrism_bottomZ(FormFactorPolygonalPrism self, IRotation rotation) -> double\n"
-		"double FormFactorPolygonalPrism::bottomZ(const IRotation &rotation) const override final\n"
+	 { "IFormFactorPolyhedron_swigregister", IFormFactorPolyhedron_swigregister, METH_O, NULL},
+	 { "delete_IFormFactorPrism", _wrap_delete_IFormFactorPrism, METH_O, "\n"
+		"delete_IFormFactorPrism(IFormFactorPrism self)\n"
+		"IFormFactorPrism::~IFormFactorPrism()\n"
+		"\n"
+		""},
+	 { "IFormFactorPrism_bottomZ", _wrap_IFormFactorPrism_bottomZ, METH_VARARGS, "\n"
+		"IFormFactorPrism_bottomZ(IFormFactorPrism self, IRotation rotation) -> double\n"
+		"double IFormFactorPrism::bottomZ(const IRotation &rotation) const override final\n"
 		"\n"
 		"Returns the z-coordinate of the lowest point in this shape after a given rotation. \n"
 		"\n"
 		""},
-	 { "FormFactorPolygonalPrism_topZ", _wrap_FormFactorPolygonalPrism_topZ, METH_VARARGS, "\n"
-		"FormFactorPolygonalPrism_topZ(FormFactorPolygonalPrism self, IRotation rotation) -> double\n"
-		"double FormFactorPolygonalPrism::topZ(const IRotation &rotation) const override final\n"
+	 { "IFormFactorPrism_topZ", _wrap_IFormFactorPrism_topZ, METH_VARARGS, "\n"
+		"IFormFactorPrism_topZ(IFormFactorPrism self, IRotation rotation) -> double\n"
+		"double IFormFactorPrism::topZ(const IRotation &rotation) const override final\n"
 		"\n"
 		"Returns the z-coordinate of the lowest point in this shape after a given rotation. \n"
 		"\n"
 		""},
-	 { "FormFactorPolygonalPrism_evaluate_for_q", _wrap_FormFactorPolygonalPrism_evaluate_for_q, METH_VARARGS, "\n"
-		"FormFactorPolygonalPrism_evaluate_for_q(FormFactorPolygonalPrism self, cvector_t q) -> complex_t\n"
-		"complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const override\n"
+	 { "IFormFactorPrism_evaluate_for_q", _wrap_IFormFactorPrism_evaluate_for_q, METH_VARARGS, "\n"
+		"IFormFactorPrism_evaluate_for_q(IFormFactorPrism self, cvector_t q) -> complex_t\n"
+		"complex_t IFormFactorPrism::evaluate_for_q(cvector_t q) const override\n"
 		"\n"
 		"Returns the form factor F(q) of this polyhedron, respecting the offset height/2. \n"
 		"\n"
 		""},
-	 { "FormFactorPolygonalPrism_volume", _wrap_FormFactorPolygonalPrism_volume, METH_O, "\n"
-		"FormFactorPolygonalPrism_volume(FormFactorPolygonalPrism self) -> double\n"
-		"double FormFactorPolygonalPrism::volume() const override\n"
+	 { "IFormFactorPrism_volume", _wrap_IFormFactorPrism_volume, METH_O, "\n"
+		"IFormFactorPrism_volume(IFormFactorPrism self) -> double\n"
+		"double IFormFactorPrism::volume() const override\n"
 		"\n"
 		"Returns the volume of this prism. \n"
 		"\n"
 		""},
-	 { "FormFactorPolygonalPrism_getHeight", _wrap_FormFactorPolygonalPrism_getHeight, METH_O, "\n"
-		"FormFactorPolygonalPrism_getHeight(FormFactorPolygonalPrism self) -> double\n"
-		"double FormFactorPolygonalPrism::getHeight() const\n"
-		"\n"
-		""},
-	 { "FormFactorPolygonalPrism_radialExtension", _wrap_FormFactorPolygonalPrism_radialExtension, METH_O, "\n"
-		"FormFactorPolygonalPrism_radialExtension(FormFactorPolygonalPrism self) -> double\n"
-		"virtual double FormFactorPolygonalPrism::radialExtension() const override\n"
+	 { "IFormFactorPrism_radialExtension", _wrap_IFormFactorPrism_radialExtension, METH_O, "\n"
+		"IFormFactorPrism_radialExtension(IFormFactorPrism self) -> double\n"
+		"double IFormFactorPrism::radialExtension() const override\n"
 		"\n"
 		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
 		"\n"
 		""},
-	 { "delete_FormFactorPolygonalPrism", _wrap_delete_FormFactorPolygonalPrism, METH_O, "delete_FormFactorPolygonalPrism(FormFactorPolygonalPrism self)"},
-	 { "FormFactorPolygonalPrism_swigregister", FormFactorPolygonalPrism_swigregister, METH_O, NULL},
-	 { "FormFactorPolygonalSurface_evaluate_for_q", _wrap_FormFactorPolygonalSurface_evaluate_for_q, METH_VARARGS, "\n"
-		"FormFactorPolygonalSurface_evaluate_for_q(FormFactorPolygonalSurface self, cvector_t q) -> complex_t\n"
-		"complex_t FormFactorPolygonalSurface::evaluate_for_q(cvector_t q) const override final\n"
-		"\n"
-		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
-		"\n"
-		""},
-	 { "FormFactorPolygonalSurface_volume", _wrap_FormFactorPolygonalSurface_volume, METH_O, "\n"
-		"FormFactorPolygonalSurface_volume(FormFactorPolygonalSurface self) -> double\n"
-		"double FormFactorPolygonalSurface::volume() const override\n"
-		"\n"
-		"Returns the total volume of the particle of this form factor's shape. \n"
-		"\n"
-		""},
-	 { "FormFactorPolygonalSurface_radialExtension", _wrap_FormFactorPolygonalSurface_radialExtension, METH_O, "\n"
-		"FormFactorPolygonalSurface_radialExtension(FormFactorPolygonalSurface self) -> double\n"
-		"double FormFactorPolygonalSurface::radialExtension() const override final\n"
-		"\n"
-		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+	 { "IFormFactorPrism_getHeight", _wrap_IFormFactorPrism_getHeight, METH_O, "\n"
+		"IFormFactorPrism_getHeight(IFormFactorPrism self) -> double\n"
+		"double IFormFactorPrism::getHeight() const\n"
 		"\n"
 		""},
-	 { "delete_FormFactorPolygonalSurface", _wrap_delete_FormFactorPolygonalSurface, METH_O, "delete_FormFactorPolygonalSurface(FormFactorPolygonalSurface self)"},
-	 { "FormFactorPolygonalSurface_swigregister", FormFactorPolygonalSurface_swigregister, METH_O, NULL},
+	 { "IFormFactorPrism_swigregister", IFormFactorPrism_swigregister, METH_O, NULL},
 	 { "IProfileRipple_getLength", _wrap_IProfileRipple_getLength, METH_O, "\n"
 		"IProfileRipple_getLength(IProfileRipple self) -> double\n"
 		"double IProfileRipple::getLength() const\n"
@@ -130364,7 +129079,7 @@ static PyMethodDef SwigMethods[] = {
 		"FormFactorBox_volume(FormFactorBox self) -> double\n"
 		"double FormFactorBox::volume() const override final\n"
 		"\n"
-		"Returns the volume of this prism. \n"
+		"Returns the total volume of the particle of this form factor's shape. \n"
 		"\n"
 		""},
 	 { "FormFactorBox_radialExtension", _wrap_FormFactorBox_radialExtension, METH_O, "\n"
@@ -130378,7 +129093,7 @@ static PyMethodDef SwigMethods[] = {
 		"FormFactorBox_evaluate_for_q(FormFactorBox self, cvector_t q) -> complex_t\n"
 		"complex_t FormFactorBox::evaluate_for_q(cvector_t q) const override final\n"
 		"\n"
-		"Returns the form factor F(q) of this polyhedron, respecting the offset height/2. \n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
 		"\n"
 		""},
 	 { "delete_FormFactorBox", _wrap_delete_FormFactorBox, METH_O, "delete_FormFactorBox(FormFactorBox self)"},
@@ -132185,7 +130900,7 @@ static PyMethodDef SwigMethods[] = {
 		"MaterialProfile_cpp(MultiLayer multilayer, int n_points, double z_min, double z_max) -> vector_complex_t\n"
 		"BA_CORE_API_ std::vector<complex_t> MaterialProfile(const MultiLayer &multilayer, int n_points, double z_min, double z_max)\n"
 		"\n"
-		"Calculate average material profile for given multilayer. \n"
+		"Calculate average material profile for given multilayer \n"
 		"\n"
 		""},
 	 { "DefaultMaterialProfileLimits", _wrap_DefaultMaterialProfileLimits, METH_O, "\n"
@@ -134355,21 +133070,9 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_HexagonalLattice", _wrap_delete_HexagonalLattice, METH_O, "delete_HexagonalLattice(HexagonalLattice self)"},
 	 { "HexagonalLattice_swigregister", HexagonalLattice_swigregister, METH_O, NULL},
 	 { "HexagonalLattice_swiginit", HexagonalLattice_swiginit, METH_VARARGS, NULL},
-	 { "CreateFCCLattice", _wrap_CreateFCCLattice, METH_VARARGS, "\n"
-		"CreateFCCLattice(double lattice_constant, ILatticeOrientation orientation) -> Lattice\n"
-		"Lattice LatticeUtils::CreateFCCLattice(double lattice_constant, const ILatticeOrientation &orientation)\n"
-		"\n"
-		""},
-	 { "CreateHCPLattice", _wrap_CreateHCPLattice, METH_VARARGS, "\n"
-		"CreateHCPLattice(double a, double c, ILatticeOrientation orientation) -> Lattice\n"
-		"Lattice LatticeUtils::CreateHCPLattice(double a, double c, const ILatticeOrientation &orientation)\n"
-		"\n"
-		""},
-	 { "CreateBCTLattice", _wrap_CreateBCTLattice, METH_VARARGS, "\n"
-		"CreateBCTLattice(double a, double c, ILatticeOrientation orientation) -> Lattice\n"
-		"Lattice LatticeUtils::CreateBCTLattice(double a, double c, const ILatticeOrientation &orientation)\n"
-		"\n"
-		""},
+	 { "createFCCLattice", _wrap_createFCCLattice, METH_VARARGS, "createFCCLattice(double lattice_constant, ILatticeOrientation orientation) -> Lattice"},
+	 { "createHCPLattice", _wrap_createHCPLattice, METH_VARARGS, "createHCPLattice(double a, double c, ILatticeOrientation orientation) -> Lattice"},
+	 { "createBCTLattice", _wrap_createBCTLattice, METH_VARARGS, "createBCTLattice(double a, double c, ILatticeOrientation orientation) -> Lattice"},
 	 { "new_Material", _wrap_new_Material, METH_VARARGS, "\n"
 		"Material(Material material)\n"
 		"new_Material(Material material) -> Material\n"
@@ -134640,27 +133343,15 @@ static void *_p_ConstKBinAxisTo_p_VariableBinAxis(void *x, int *SWIGUNUSEDPARM(n
 static void *_p_CustomBinAxisTo_p_VariableBinAxis(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((VariableBinAxis *)  ((CustomBinAxis *) x));
 }
-static void *_p_FormFactorPrism3To_p_FormFactorPolygonalPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolygonalPrism *)  ((FormFactorPrism3 *) x));
-}
-static void *_p_FormFactorPrism6To_p_FormFactorPolygonalPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolygonalPrism *)  ((FormFactorPrism6 *) x));
-}
-static void *_p_FormFactorBoxTo_p_FormFactorPolygonalPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolygonalPrism *)  ((FormFactorBox *) x));
-}
 static void *_p_SimulationFactoryTo_p_IFactoryT_std__string_Simulation_t(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFactory< std::string,Simulation > *)  ((SimulationFactory *) x));
 }
 static void *_p_FormFactorPrism6To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPrism *) ((FormFactorPrism6 *) x));
 }
 static void *_p_FormFactorHemiEllipsoidTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorHemiEllipsoid *) x));
 }
-static void *_p_FormFactorPolygonalPrismTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *)  ((FormFactorPolygonalPrism *) x));
-}
 static void *_p_FormFactorFullSpheroidTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorFullSpheroid *) x));
 }
@@ -134682,18 +133373,18 @@ static void *_p_FormFactorSawtoothRippleGaussTo_p_IFormFactorBorn(void *x, int *
 static void *_p_FormFactorCosineRippleGaussTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *) (IProfileRipple *)(ICosineRipple *) ((FormFactorCosineRippleGauss *) x));
 }
-static void *_p_FormFactorPolygonalSurfaceTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *)  ((FormFactorPolygonalSurface *) x));
+static void *_p_IFormFactorPrismTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((IFormFactorPrism *) x));
+}
+static void *_p_FormFactorTruncatedCubeTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (IFormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
 }
 static void *_p_FormFactorCantellatedCubeTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
 }
 static void *_p_FormFactorFullSphereTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorFullSphere *) x));
 }
-static void *_p_FormFactorTruncatedCubeTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
-}
 static void *_p_FormFactorTruncatedSphereTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorTruncatedSphere *) x));
 }
@@ -134704,28 +133395,28 @@ static void *_p_FormFactorCylinderTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDP
     return (void *)((IFormFactorBorn *)  ((FormFactorCylinder *) x));
 }
 static void *_p_FormFactorBoxTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolygonalPrism *) ((FormFactorBox *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPrism *) ((FormFactorBox *) x));
 }
 static void *_p_FormFactorTetrahedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
 }
 static void *_p_FormFactorIcosahedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
 }
 static void *_p_FormFactorDodecahedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
 }
 static void *_p_FormFactorCuboctahedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
 }
-static void *_p_FormFactorPolyhedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *)  ((FormFactorPolyhedron *) x));
+static void *_p_IFormFactorPolyhedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((IFormFactorPolyhedron *) x));
 }
 static void *_p_FormFactorConeTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorCone *) x));
 }
 static void *_p_FormFactorCone6To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPolyhedron *) ((FormFactorCone6 *) x));
 }
 static void *_p_FormFactorSphereGaussianRadiusTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorSphereGaussianRadius *) x));
@@ -134764,13 +133455,13 @@ static void *_p_FormFactorCosineRippleBoxTo_p_IFormFactorBorn(void *x, int *SWIG
     return (void *)((IFormFactorBorn *) (IProfileRipple *)(ICosineRipple *) ((FormFactorCosineRippleBox *) x));
 }
 static void *_p_FormFactorPyramidTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPolyhedron *) ((FormFactorPyramid *) x));
 }
 static void *_p_FormFactorAnisoPyramidTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
 }
 static void *_p_FormFactorPrism3To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+    return (void *)((IFormFactorBorn *) (IFormFactorPrism *) ((FormFactorPrism3 *) x));
 }
 static void *_p_VariableBinAxisTo_p_IAxis(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IAxis *)  ((VariableBinAxis *) x));
@@ -134826,6 +133517,15 @@ static void *_p_Histogram2DTo_p_IHistogram(void *x, int *SWIGUNUSEDPARM(newmemor
 static void *_p_Histogram1DTo_p_IHistogram(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IHistogram *)  ((Histogram1D *) x));
 }
+static void *_p_FormFactorPrism3To_p_IFormFactorPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPrism *)  ((FormFactorPrism3 *) x));
+}
+static void *_p_FormFactorPrism6To_p_IFormFactorPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPrism *)  ((FormFactorPrism6 *) x));
+}
+static void *_p_FormFactorBoxTo_p_IFormFactorPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPrism *)  ((FormFactorBox *) x));
+}
 static void *_p_DistributionTrapezoidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IDistribution1D *) ((DistributionTrapezoid *) x));
 }
@@ -134859,9 +133559,6 @@ static void *_p_IdentityRotationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(new
 static void *_p_IRotationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IRotation *) x));
 }
-static void *_p_FormFactorPolygonalSurfaceTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
-}
 static void *_p_IUnitConverterTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IUnitConverter *) x));
 }
@@ -134902,19 +133599,19 @@ static void *_p_FTDistribution2DCauchyTo_p_ICloneable(void *x, int *SWIGUNUSEDPA
     return (void *)((ICloneable *) (IFTDistribution2D *) ((FTDistribution2DCauchy *) x));
 }
 static void *_p_FormFactorTetrahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
 }
 static void *_p_FormFactorIcosahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
 }
 static void *_p_FormFactorDodecahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
 }
 static void *_p_FormFactorCuboctahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
 }
-static void *_p_FormFactorPolyhedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+static void *_p_IFormFactorPolyhedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((IFormFactorPolyhedron *) x));
 }
 static void *_p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IInterferenceFunction *) ((InterferenceFunctionRadialParaCrystal *) x));
@@ -135001,16 +133698,19 @@ static void *_p_IFormFactorDecoratorTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM
     return (void *)((ICloneable *) (ISample *)(IFormFactor *) ((IFormFactorDecorator *) x));
 }
 static void *_p_FormFactorPyramidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorPyramid *) x));
 }
 static void *_p_FormFactorAnisoPyramidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
 }
 static void *_p_FormFactorTruncatedCubeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
 }
 static void *_p_FormFactorCantellatedCubeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
+}
+static void *_p_IFormFactorPrismTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((IFormFactorPrism *) x));
 }
 static void *_p_RangedDistributionTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((RangedDistribution *) x));
@@ -135147,6 +133847,9 @@ static void *_p_FormFactorFullSpheroidTo_p_ICloneable(void *x, int *SWIGUNUSEDPA
 static void *_p_ISpecularScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((ISpecularScan *) x));
 }
+static void *_p_HexagonalLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Lattice2D *) ((HexagonalLattice *) x));
+}
 static void *_p_SquareLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (Lattice2D *) ((SquareLattice *) x));
 }
@@ -135174,9 +133877,6 @@ static void *_p_InterferenceFunction1DLatticeTo_p_ICloneable(void *x, int *SWIGU
 static void *_p_IShape2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IShape2D *) x));
 }
-static void *_p_HexagonalLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Lattice2D *) ((HexagonalLattice *) x));
-}
 static void *_p_FootprintSquareTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFootprintFactor *) ((FootprintSquare *) x));
 }
@@ -135193,7 +133893,7 @@ static void *_p_FTDistribution1DGaussTo_p_ICloneable(void *x, int *SWIGUNUSEDPAR
     return (void *)((ICloneable *) (IFTDistribution1D *) ((FTDistribution1DGauss *) x));
 }
 static void *_p_FormFactorCone6To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCone6 *) x));
 }
 static void *_p_IDistribution1DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IDistribution1D *) x));
@@ -135229,7 +133929,7 @@ static void *_p_DistributionLogNormalTo_p_ICloneable(void *x, int *SWIGUNUSEDPAR
     return (void *)((ICloneable *) (IDistribution1D *) ((DistributionLogNormal *) x));
 }
 static void *_p_FormFactorBoxTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorBox *) x));
 }
 static void *_p_FTDistribution1DGateTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFTDistribution1D *) ((FTDistribution1DGate *) x));
@@ -135237,11 +133937,8 @@ static void *_p_FTDistribution1DGateTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM
 static void *_p_FormFactorLongBoxGaussTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
 }
-static void *_p_FormFactorPolygonalPrismTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
-}
 static void *_p_FormFactorPrism3To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism3 *) x));
 }
 static void *_p_FormFactorHemiEllipsoidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
@@ -135262,7 +133959,7 @@ static void *_p_DistributionLorentzTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(
     return (void *)((ICloneable *) (IDistribution1D *) ((DistributionLorentz *) x));
 }
 static void *_p_FormFactorPrism6To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism6 *) x));
 }
 static void *_p_FTDistribution2DConeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFTDistribution2D *) ((FTDistribution2DCone *) x));
@@ -135355,7 +134052,7 @@ static void *_p_InterferenceFunctionTwinTo_p_IInterferenceFunction(void *x, int
     return (void *)((IInterferenceFunction *)  ((InterferenceFunctionTwin *) x));
 }
 static void *_p_FormFactorBoxTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorBox *) x));
 }
 static void *_p_IBackgroundTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *) ((IBackground *) x));
@@ -135439,28 +134136,31 @@ static void *_p_IPeakShapeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newme
     return (void *)((IParameterized *) (INode *)(ISample *) ((IPeakShape *) x));
 }
 static void *_p_FormFactorPrism3To_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism3 *) x));
 }
 static void *_p_DistributionTrapezoidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(IDistribution1D *) ((DistributionTrapezoid *) x));
 }
-static void *_p_FormFactorPolyhedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+static void *_p_IFormFactorPolyhedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((IFormFactorPolyhedron *) x));
+}
+static void *_p_IFormFactorPrismTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((IFormFactorPrism *) x));
 }
 static void *_p_FormFactorCuboctahedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
 }
 static void *_p_FormFactorDodecahedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
 }
 static void *_p_FormFactorIcosahedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
 }
 static void *_p_FormFactorTetrahedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
 }
 static void *_p_FormFactorPrism6To_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism6 *) x));
 }
 static void *_p_SimulationTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *) ((Simulation *) x));
@@ -135501,12 +134201,6 @@ static void *_p_IFormFactorTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newm
 static void *_p_ISampleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *) ((ISample *) x));
 }
-static void *_p_FormFactorPolygonalSurfaceTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
-}
-static void *_p_FormFactorPolygonalPrismTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
-}
 static void *_p_FormFactorLongBoxGaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
 }
@@ -135556,10 +134250,10 @@ static void *_p_RotationYTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmem
     return (void *)((IParameterized *) (INode *)(IRotation *) ((RotationY *) x));
 }
 static void *_p_FormFactorCantellatedCubeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
 }
 static void *_p_FormFactorTruncatedCubeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
 }
 static void *_p_RotationZTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(IRotation *) ((RotationZ *) x));
@@ -135616,10 +134310,10 @@ static void *_p_LayerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)
     return (void *)((IParameterized *) (INode *)(ISample *) ((Layer *) x));
 }
 static void *_p_FormFactorAnisoPyramidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
 }
 static void *_p_FormFactorPyramidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorPyramid *) x));
 }
 static void *_p_FormFactorCylinderTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCylinder *) x));
@@ -135682,7 +134376,7 @@ static void *_p_FootprintSquareTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(
     return (void *)((IParameterized *) (INode *)(IFootprintFactor *) ((FootprintSquare *) x));
 }
 static void *_p_FormFactorCone6To_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+    return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCone6 *) x));
 }
 static void *_p_IFormFactorDecoratorTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *) ((IFormFactorDecorator *) x));
@@ -135793,14 +134487,11 @@ static void *_p_FootprintGaussTo_p_IFootprintFactor(void *x, int *SWIGUNUSEDPARM
     return (void *)((IFootprintFactor *)  ((FootprintGauss *) x));
 }
 static void *_p_FormFactorPrism6To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism6 *) x));
 }
 static void *_p_FormFactorHemiEllipsoidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
 }
-static void *_p_FormFactorPolygonalPrismTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
-}
 static void *_p_FormFactorFullSpheroidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
 }
@@ -135822,20 +134513,20 @@ static void *_p_FormFactorCosineRippleGaussTo_p_IFormFactor(void *x, int *SWIGUN
 static void *_p_FormFactorSawtoothRippleGaussTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *)(IProfileRipple *)(ISawtoothRipple *) ((FormFactorSawtoothRippleGauss *) x));
 }
-static void *_p_FormFactorPolygonalSurfaceTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+static void *_p_IFormFactorPrismTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((IFormFactorPrism *) x));
 }
 static void *_p_FormFactorCrystalTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *)  ((FormFactorCrystal *) x));
 }
 static void *_p_FormFactorCantellatedCubeTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
 }
 static void *_p_FormFactorFullSphereTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorFullSphere *) x));
 }
 static void *_p_FormFactorTruncatedCubeTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
 }
 static void *_p_FormFactorTruncatedSphereTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
@@ -135847,31 +134538,31 @@ static void *_p_FormFactorCylinderTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorCylinder *) x));
 }
 static void *_p_FormFactorBoxTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorBox *) x));
 }
 static void *_p_IFormFactorDecoratorTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *)  ((IFormFactorDecorator *) x));
 }
 static void *_p_FormFactorIcosahedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
 }
 static void *_p_FormFactorDodecahedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
 }
 static void *_p_FormFactorCuboctahedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
 }
-static void *_p_FormFactorPolyhedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+static void *_p_IFormFactorPolyhedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((IFormFactorPolyhedron *) x));
 }
 static void *_p_FormFactorTetrahedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
 }
 static void *_p_FormFactorConeTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorCone *) x));
 }
 static void *_p_FormFactorCone6To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCone6 *) x));
 }
 static void *_p_FormFactorSphereGaussianRadiusTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorSphereGaussianRadius *) x));
@@ -135909,26 +134600,26 @@ static void *_p_FormFactorWeightedTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(
 static void *_p_FormFactorSawtoothRippleLorentzTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *)(IProfileRipple *)(ISawtoothRipple *) ((FormFactorSawtoothRippleLorentz *) x));
 }
-static void *_p_FormFactorCosineRippleBoxTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(IProfileRipple *)(ICosineRipple *) ((FormFactorCosineRippleBox *) x));
-}
 static void *_p_FormFactorSawtoothRippleBoxTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *)(IProfileRipple *)(ISawtoothRipple *) ((FormFactorSawtoothRippleBox *) x));
 }
+static void *_p_FormFactorCosineRippleBoxTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IProfileRipple *)(ICosineRipple *) ((FormFactorCosineRippleBox *) x));
+}
 static void *_p_FormFactorPyramidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorPyramid *) x));
 }
 static void *_p_FormFactorAnisoPyramidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
 }
 static void *_p_FormFactorPrism3To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism3 *) x));
 }
 static void *_p_SampleBuilderFactoryTo_p_IFactoryT_std__string_IMultiLayerBuilder_t(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFactory< std::string,IMultiLayerBuilder > *)  ((SampleBuilderFactory *) x));
 }
 static void *_p_FormFactorBoxTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorBox *) x));
 }
 static void *_p_MultiLayerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *)  ((MultiLayer *) x));
@@ -135976,25 +134667,28 @@ static void *_p_MisesGaussPeakShapeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(new
     return (void *)((ISample *) (IPeakShape *) ((MisesGaussPeakShape *) x));
 }
 static void *_p_FormFactorPrism3To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism3 *) x));
 }
 static void *_p_FormFactorTetrahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
 }
 static void *_p_FormFactorIcosahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
 }
 static void *_p_FormFactorDodecahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
 }
 static void *_p_FormFactorCuboctahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
 }
-static void *_p_FormFactorPolyhedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+static void *_p_IFormFactorPolyhedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((IFormFactorPolyhedron *) x));
+}
+static void *_p_IFormFactorPrismTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((IFormFactorPrism *) x));
 }
 static void *_p_FormFactorPrism6To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism6 *) x));
 }
 static void *_p_ParticleCoreShellTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
@@ -136014,29 +134708,23 @@ static void *_p_FormFactorFullSphereTo_p_ISample(void *x, int *SWIGUNUSEDPARM(ne
 static void *_p_IFormFactorTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *)  ((IFormFactor *) x));
 }
-static void *_p_FormFactorPolygonalSurfaceTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
-}
 static void *_p_FormFactorLongBoxGaussTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
 }
-static void *_p_FormFactorPolygonalPrismTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
-}
 static void *_p_InterferenceFunctionHardDiskTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IInterferenceFunction *) ((InterferenceFunctionHardDisk *) x));
 }
-static void *_p_FormFactorFullSpheroidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
-}
 static void *_p_FormFactorTruncatedSpheroidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSpheroid *) x));
 }
+static void *_p_FormFactorFullSpheroidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
+}
 static void *_p_FormFactorTruncatedCubeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
 }
 static void *_p_FormFactorCantellatedCubeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
 }
 static void *_p_IFormFactorBornTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *) ((IFormFactorBorn *) x));
@@ -136069,10 +134757,10 @@ static void *_p_LayerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *)  ((Layer *) x));
 }
 static void *_p_FormFactorPyramidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorPyramid *) x));
 }
 static void *_p_FormFactorAnisoPyramidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
 }
 static void *_p_FormFactorEllipsoidalCylinderTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
@@ -136093,7 +134781,7 @@ static void *_p_IInterferenceFunctionTo_p_ISample(void *x, int *SWIGUNUSEDPARM(n
     return (void *)((ISample *)  ((IInterferenceFunction *) x));
 }
 static void *_p_FormFactorCone6To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCone6 *) x));
 }
 static void *_p_IFormFactorDecoratorTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *) ((IFormFactorDecorator *) x));
@@ -136162,7 +134850,7 @@ static void *_p_InterferenceFunctionFinite3DLatticeTo_p_ISample(void *x, int *SW
     return (void *)((ISample *) (IInterferenceFunction *) ((InterferenceFunctionFinite3DLattice *) x));
 }
 static void *_p_FormFactorBoxTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorBox *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorBox *) x));
 }
 static void *_p_IBackgroundTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((IBackground *) x));
@@ -136240,28 +134928,31 @@ static void *_p_IPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *) ((IPeakShape *) x));
 }
 static void *_p_FormFactorPrism3To_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism3 *) x));
 }
 static void *_p_DistributionTrapezoidTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IDistribution1D *) ((DistributionTrapezoid *) x));
 }
-static void *_p_FormFactorPolyhedronTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+static void *_p_IFormFactorPolyhedronTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((IFormFactorPolyhedron *) x));
+}
+static void *_p_IFormFactorPrismTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((IFormFactorPrism *) x));
 }
 static void *_p_FormFactorCuboctahedronTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
 }
 static void *_p_FormFactorDodecahedronTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
 }
 static void *_p_FormFactorIcosahedronTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
 }
 static void *_p_FormFactorTetrahedronTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
 }
 static void *_p_FormFactorPrism6To_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPrism *) ((FormFactorPrism6 *) x));
 }
 static void *_p_SimulationTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((Simulation *) x));
@@ -136302,12 +134993,6 @@ static void *_p_IFormFactorTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 static void *_p_ISampleTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((ISample *) x));
 }
-static void *_p_FormFactorPolygonalSurfaceTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
-}
-static void *_p_FormFactorPolygonalPrismTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
-}
 static void *_p_FormFactorLongBoxGaussTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
 }
@@ -136357,10 +135042,10 @@ static void *_p_RotationYTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IRotation *) ((RotationY *) x));
 }
 static void *_p_FormFactorCantellatedCubeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCantellatedCube *) x));
 }
 static void *_p_FormFactorTruncatedCubeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
 }
 static void *_p_RotationZTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IRotation *) ((RotationZ *) x));
@@ -136414,10 +135099,10 @@ static void *_p_LayerTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *) ((Layer *) x));
 }
 static void *_p_FormFactorAnisoPyramidTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
 }
 static void *_p_FormFactorPyramidTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorPyramid *) x));
 }
 static void *_p_FormFactorCylinderTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCylinder *) x));
@@ -136480,7 +135165,7 @@ static void *_p_FootprintSquareTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory
     return (void *)((INode *) (IFootprintFactor *) ((FootprintSquare *) x));
 }
 static void *_p_FormFactorCone6To_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+    return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IFormFactorPolyhedron *) ((FormFactorCone6 *) x));
 }
 static void *_p_IFormFactorDecoratorTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *)(IFormFactor *) ((IFormFactorDecorator *) x));
@@ -136701,32 +135386,32 @@ static void *_p_FTDistribution1DVoigtTo_p_IFTDistribution1D(void *x, int *SWIGUN
 static void *_p_CrystalTo_p_IClusteredParticles(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IClusteredParticles *)  ((Crystal *) x));
 }
-static void *_p_FormFactorCuboctahedronTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolyhedron *)  ((FormFactorCuboctahedron *) x));
+static void *_p_FormFactorCuboctahedronTo_p_IFormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPolyhedron *)  ((FormFactorCuboctahedron *) x));
 }
-static void *_p_FormFactorDodecahedronTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolyhedron *)  ((FormFactorDodecahedron *) x));
+static void *_p_FormFactorDodecahedronTo_p_IFormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPolyhedron *)  ((FormFactorDodecahedron *) x));
 }
-static void *_p_FormFactorIcosahedronTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolyhedron *)  ((FormFactorIcosahedron *) x));
+static void *_p_FormFactorIcosahedronTo_p_IFormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPolyhedron *)  ((FormFactorIcosahedron *) x));
 }
-static void *_p_FormFactorTetrahedronTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolyhedron *)  ((FormFactorTetrahedron *) x));
+static void *_p_FormFactorTetrahedronTo_p_IFormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPolyhedron *)  ((FormFactorTetrahedron *) x));
 }
-static void *_p_FormFactorCantellatedCubeTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolyhedron *)  ((FormFactorCantellatedCube *) x));
+static void *_p_FormFactorCantellatedCubeTo_p_IFormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPolyhedron *)  ((FormFactorCantellatedCube *) x));
 }
-static void *_p_FormFactorCone6To_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolyhedron *)  ((FormFactorCone6 *) x));
+static void *_p_FormFactorCone6To_p_IFormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPolyhedron *)  ((FormFactorCone6 *) x));
 }
-static void *_p_FormFactorTruncatedCubeTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolyhedron *)  ((FormFactorTruncatedCube *) x));
+static void *_p_FormFactorTruncatedCubeTo_p_IFormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPolyhedron *)  ((FormFactorTruncatedCube *) x));
 }
-static void *_p_FormFactorAnisoPyramidTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolyhedron *)  ((FormFactorAnisoPyramid *) x));
+static void *_p_FormFactorAnisoPyramidTo_p_IFormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPolyhedron *)  ((FormFactorAnisoPyramid *) x));
 }
-static void *_p_FormFactorPyramidTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((FormFactorPolyhedron *)  ((FormFactorPyramid *) x));
+static void *_p_FormFactorPyramidTo_p_IFormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorPolyhedron *)  ((FormFactorPyramid *) x));
 }
 static void *_p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IResolutionFunction2D *)  ((ResolutionFunction2DGaussian *) x));
@@ -136848,9 +135533,6 @@ static swig_type_info _swigt__p_FormFactorHollowSphere = {"_p_FormFactorHollowSp
 static swig_type_info _swigt__p_FormFactorIcosahedron = {"_p_FormFactorIcosahedron", "FormFactorIcosahedron *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorLongBoxGauss = {"_p_FormFactorLongBoxGauss", "FormFactorLongBoxGauss *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorLongBoxLorentz = {"_p_FormFactorLongBoxLorentz", "FormFactorLongBoxLorentz *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_FormFactorPolygonalPrism = {"_p_FormFactorPolygonalPrism", "FormFactorPolygonalPrism *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_FormFactorPolygonalSurface = {"_p_FormFactorPolygonalSurface", "FormFactorPolygonalSurface *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_FormFactorPolyhedron = {"_p_FormFactorPolyhedron", "FormFactorPolyhedron *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorPrism3 = {"_p_FormFactorPrism3", "FormFactorPrism3 *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorPrism6 = {"_p_FormFactorPrism6", "FormFactorPrism6 *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorPyramid = {"_p_FormFactorPyramid", "FormFactorPyramid *", 0, 0, (void*)0, 0};
@@ -136891,6 +135573,8 @@ static swig_type_info _swigt__p_IFootprintFactor = {"_p_IFootprintFactor", "IFoo
 static swig_type_info _swigt__p_IFormFactor = {"_p_IFormFactor", "std::vector< IFormFactor * >::value_type|IFormFactor *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IFormFactorBorn = {"_p_IFormFactorBorn", "IFormFactorBorn *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IFormFactorDecorator = {"_p_IFormFactorDecorator", "IFormFactorDecorator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFormFactorPolyhedron = {"_p_IFormFactorPolyhedron", "IFormFactorPolyhedron *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFormFactorPrism = {"_p_IFormFactorPrism", "IFormFactorPrism *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IHistogram = {"_p_IHistogram", "IHistogram *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IIntensityFunction = {"_p_IIntensityFunction", "IIntensityFunction *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IInterferenceFunction = {"_p_IInterferenceFunction", "IInterferenceFunction *", 0, 0, (void*)0, 0};
@@ -136972,10 +135656,6 @@ static swig_type_info _swigt__p_ParticleLimits = {"_p_ParticleLimits", "Particle
 static swig_type_info _swigt__p_PoissonNoiseBackground = {"_p_PoissonNoiseBackground", "PoissonNoiseBackground *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Polygon = {"_p_Polygon", "Polygon *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_PolygonPrivate = {"_p_PolygonPrivate", "PolygonPrivate *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_PolygonalTopology = {"_p_PolygonalTopology", "PolygonalTopology *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_PolyhedralEdge = {"_p_PolyhedralEdge", "PolyhedralEdge *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_PolyhedralFace = {"_p_PolyhedralFace", "PolyhedralFace *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_PolyhedralTopology = {"_p_PolyhedralTopology", "PolyhedralTopology *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ProgressHandler__Callback_t = {"_p_ProgressHandler__Callback_t", "ProgressHandler::Callback_t *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_PyBuilderCallback = {"_p_PyBuilderCallback", "PyBuilderCallback *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_PyObserverCallback = {"_p_PyObserverCallback", "PyObserverCallback *", 0, 0, (void*)0, 0};
@@ -137081,7 +135761,6 @@ static swig_type_info _swigt__p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t
 static swig_type_info _swigt__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t = {"_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t", "std::vector< Material const *,std::allocator< Material const * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t = {"_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t", "std::vector< ParaMeta,std::allocator< ParaMeta > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t = {"_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t", "std::vector< ParameterSample,std::allocator< ParameterSample > > *|std::vector< ParameterSample > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t = {"_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t", "std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t = {"_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t", "std::vector< RealParameter *,std::allocator< RealParameter * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t = {"_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t", "std::vector< SimulationElement,std::allocator< SimulationElement > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
@@ -137189,9 +135868,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_FormFactorIcosahedron,
   &_swigt__p_FormFactorLongBoxGauss,
   &_swigt__p_FormFactorLongBoxLorentz,
-  &_swigt__p_FormFactorPolygonalPrism,
-  &_swigt__p_FormFactorPolygonalSurface,
-  &_swigt__p_FormFactorPolyhedron,
   &_swigt__p_FormFactorPrism3,
   &_swigt__p_FormFactorPrism6,
   &_swigt__p_FormFactorPyramid,
@@ -137232,6 +135908,8 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_IFormFactor,
   &_swigt__p_IFormFactorBorn,
   &_swigt__p_IFormFactorDecorator,
+  &_swigt__p_IFormFactorPolyhedron,
+  &_swigt__p_IFormFactorPrism,
   &_swigt__p_IHistogram,
   &_swigt__p_IIntensityFunction,
   &_swigt__p_IInterferenceFunction,
@@ -137313,10 +135991,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_PoissonNoiseBackground,
   &_swigt__p_Polygon,
   &_swigt__p_PolygonPrivate,
-  &_swigt__p_PolygonalTopology,
-  &_swigt__p_PolyhedralEdge,
-  &_swigt__p_PolyhedralFace,
-  &_swigt__p_PolyhedralTopology,
   &_swigt__p_ProgressHandler__Callback_t,
   &_swigt__p_PyBuilderCallback,
   &_swigt__p_PyObserverCallback,
@@ -137422,7 +136096,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t,
   &_swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
   &_swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t,
-  &_swigt__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t,
   &_swigt__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t,
   &_swigt__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,
   &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
@@ -137530,9 +136203,6 @@ static swig_cast_info _swigc__p_FormFactorHollowSphere[] = {  {&_swigt__p_FormFa
 static swig_cast_info _swigc__p_FormFactorIcosahedron[] = {  {&_swigt__p_FormFactorIcosahedron, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorLongBoxGauss[] = {  {&_swigt__p_FormFactorLongBoxGauss, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorLongBoxLorentz[] = {  {&_swigt__p_FormFactorLongBoxLorentz, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_FormFactorPolygonalPrism[] = {  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, 0, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_FormFactorPolygonalPrism, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_FormFactorPolygonalSurface[] = {  {&_swigt__p_FormFactorPolygonalSurface, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_FormFactorPolyhedron[] = {  {&_swigt__p_FormFactorPolyhedron, 0, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_FormFactorPolyhedron, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPrism3[] = {  {&_swigt__p_FormFactorPrism3, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPrism6[] = {  {&_swigt__p_FormFactorPrism6, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPyramid[] = {  {&_swigt__p_FormFactorPyramid, 0, 0, 0},{0, 0, 0, 0}};
@@ -137556,7 +136226,7 @@ static swig_cast_info _swigc__p_IAbstractParticle[] = {  {&_swigt__p_ParticleCom
 static swig_cast_info _swigc__p_IAxis[] = {  {&_swigt__p_IAxis, 0, 0, 0},  {&_swigt__p_VariableBinAxis, _p_VariableBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_ConstKBinAxis, _p_ConstKBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_CustomBinAxis, _p_CustomBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_FixedBinAxis, _p_FixedBinAxisTo_p_IAxis, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IBackground[] = {  {&_swigt__p_IBackground, 0, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IBackground, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_IBackground, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IChiSquaredModule[] = {  {&_swigt__p_IChiSquaredModule, 0, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_IChiSquaredModule, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_Line, _p_LineTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionGate, _p_RangedDistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ICloneable, 0, 0},  {&_swigt__p_IUnitConverter, _p_IUnitConverterTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistribution, _p_RangedDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ICloneable, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionGaussian, _p_RangedDistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ScanResolution, _p_ScanResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionCosine, _p_RangedDistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_Polygon, _p_PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ICloneable, 0, 0},  {&_swigt__p_QSpecScan, _p_QSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_AngularSpecScan, _p_AngularSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_ISpecularScan, _p_ISpecularScanTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_IShape2D, _p_IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_ICloneable, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLogNormal, _p_RangedDistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLorentz, _p_RangedDistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_Line, _p_LineTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionGate, _p_RangedDistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_IUnitConverter, _p_IUnitConverterTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistribution, _p_RangedDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ICloneable, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionGaussian, _p_RangedDistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_ScanResolution, _p_ScanResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionCosine, _p_RangedDistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_Polygon, _p_PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ICloneable, 0, 0},  {&_swigt__p_QSpecScan, _p_QSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_AngularSpecScan, _p_AngularSpecScanTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_ISpecularScan, _p_ISpecularScanTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_IShape2D, _p_IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_ICloneable, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLogNormal, _p_RangedDistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLorentz, _p_RangedDistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IClusteredParticles[] = {  {&_swigt__p_IClusteredParticles, 0, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IClusteredParticles, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ICosineRipple[] = {  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ICosineRipple, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ICosineRipple, 0, 0},  {&_swigt__p_ICosineRipple, 0, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ICosineRipple, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDetector[] = {  {&_swigt__p_IDetector, 0, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IDetector, 0, 0},{0, 0, 0, 0}};
@@ -137570,21 +136240,23 @@ static swig_cast_info _swigc__p_IFTDistribution2D[] = {  {&_swigt__p_FTDistribut
 static swig_cast_info _swigc__p_IFactoryT_std__string_IMultiLayerBuilder_t[] = {  {&_swigt__p_IFactoryT_std__string_IMultiLayerBuilder_t, 0, 0, 0},  {&_swigt__p_SampleBuilderFactory, _p_SampleBuilderFactoryTo_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFactoryT_std__string_Simulation_t[] = {  {&_swigt__p_SimulationFactory, _p_SimulationFactoryTo_p_IFactoryT_std__string_Simulation_t, 0, 0},  {&_swigt__p_IFactoryT_std__string_Simulation_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFootprintFactor[] = {  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_IFootprintFactor, 0, 0},  {&_swigt__p_IFootprintFactor, 0, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_IFootprintFactor, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IFormFactor[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactor, 0, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IFormFactor, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IFormFactor, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IFormFactor, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IFormFactor, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactor, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IFormFactorBorn[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IFormFactorBorn, 0, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactorBorn, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFormFactor[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactor, 0, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IFormFactor, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IFormFactor, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IFormFactor, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IFormFactor, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactor, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFormFactorBorn[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IFormFactorBorn, 0, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactorBorn, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFormFactorDecorator[] = {  {&_swigt__p_IFormFactorDecorator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFormFactorPolyhedron[] = {  {&_swigt__p_IFormFactorPolyhedron, 0, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactorPolyhedron, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFormFactorPrism[] = {  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactorPrism, 0, 0},  {&_swigt__p_IFormFactorPrism, 0, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactorPrism, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactorPrism, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IHistogram[] = {  {&_swigt__p_IHistogram, 0, 0, 0},  {&_swigt__p_Histogram2D, _p_Histogram2DTo_p_IHistogram, 0, 0},  {&_swigt__p_Histogram1D, _p_Histogram1DTo_p_IHistogram, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IIntensityFunction[] = {  {&_swigt__p_IntensityFunctionSqrt, _p_IntensityFunctionSqrtTo_p_IIntensityFunction, 0, 0},  {&_swigt__p_IIntensityFunction, 0, 0, 0},  {&_swigt__p_IntensityFunctionLog, _p_IntensityFunctionLogTo_p_IIntensityFunction, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IInterferenceFunction[] = {  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_IInterferenceFunction, 0, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_IInterferenceFunction, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ILatticeOrientation[] = {  {&_swigt__p_ILatticeOrientation, 0, 0, 0},  {&_swigt__p_MillerIndexOrientation, _p_MillerIndexOrientationTo_p_ILatticeOrientation, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ILayout[] = {  {&_swigt__p_ILayout, 0, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ILayout, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IMultiLayerBuilder[] = {  {&_swigt__p_IMultiLayerBuilder, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INode, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_INode, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_INode, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INode, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INode, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INode, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INode, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_INode, 0, 0},  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INode, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INode, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INode, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INode, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_INode, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INode, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_INode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_INode, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INode, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INode, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INode, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INode, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INode, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INode, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INode, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INode, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_INode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INode, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INode, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INode, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_INode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INode, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_INode, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INode, 0, 0},  {&_swigt__p_Lattice, _p_LatticeTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INode, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_INode, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_INode, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INode, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INode, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INode, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INode, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_INode, 0, 0},  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INode, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INode, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INode, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INode, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_INode, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INode, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_INode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INode, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INode, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INode, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INode, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INode, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INode, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INode, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INode, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INode, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_INode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INode, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INode, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INode, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_INode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INode, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_INode, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INode, 0, 0},  {&_swigt__p_Lattice, _p_LatticeTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_INodeVisitor[] = {  {&_swigt__p_INodeVisitor, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObservable[] = {  {&_swigt__p_IObservable, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObserver[] = {  {&_swigt__p_IObserver, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IParameterT_double_t[] = {  {&_swigt__p_IParameterT_double_t, 0, 0, 0},  {&_swigt__p_RealParameter, _p_RealParameterTo_p_IParameterT_double_t, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_INode, _p_INodeTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_IParameterized, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_IParameterized, 0, 0},  {&_swigt__p_IMultiLayerBuilder, _p_IMultiLayerBuilderTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice, _p_LatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_PoissonNoiseBackground, _p_PoissonNoiseBackgroundTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_INode, _p_INodeTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_DepthProbeSimulation, _p_DepthProbeSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_IParameterized, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_IParameterized, 0, 0},  {&_swigt__p_IMultiLayerBuilder, _p_IMultiLayerBuilderTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Simulation2D, _p_Simulation2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice, _p_LatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParticle, 0, 0},  {&_swigt__p_IParticle, 0, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParticle, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IPeakShape[] = {  {&_swigt__p_IPeakShape, 0, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IPeakShape, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IPixel[] = {  {&_swigt__p_IPixel, 0, 0, 0},{0, 0, 0, 0}};
@@ -137592,7 +136264,7 @@ static swig_cast_info _swigc__p_IProfileRectangularRipple[] = {  {&_swigt__p_IPr
 static swig_cast_info _swigc__p_IProfileRipple[] = {  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IProfileRipple, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IProfileRipple, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IProfileRipple, 0, 0},  {&_swigt__p_IProfileRipple, 0, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IProfileRipple, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IResolutionFunction2D[] = {  {&_swigt__p_IResolutionFunction2D, 0, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IRotation[] = {  {&_swigt__p_RotationY, _p_RotationYTo_p_IRotation, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IRotation, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IRotation, 0, 0},  {&_swigt__p_IRotation, 0, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IRotation, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IRotation, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ISample[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISample, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISample, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ISample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISample, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISample, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISample, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISample, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ISample, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISample, 0, 0},  {&_swigt__p_ISample, 0, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ISample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ISample, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISample, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISample, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ISample, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISample, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ISample, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISample, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ISample, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ISample, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ISample, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ISample, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISample[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISample, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISample, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ISample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISample, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISample, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISample, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISample, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ISample, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISample, 0, 0},  {&_swigt__p_ISample, 0, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ISample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ISample, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISample, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISample, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ISample, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISample, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ISample, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISample, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ISample, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ISample, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ISample, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ISample, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISawtoothRipple[] = {  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ISawtoothRipple, 0, 0},  {&_swigt__p_ISawtoothRipple, 0, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ISawtoothRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ISawtoothRipple, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISelectionRule[] = {  {&_swigt__p_ISelectionRule, 0, 0, 0},  {&_swigt__p_SimpleSelectionRule, _p_SimpleSelectionRuleTo_p_ISelectionRule, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IShape2D[] = {  {&_swigt__p_Polygon, _p_PolygonTo_p_IShape2D, 0, 0},  {&_swigt__p_Line, _p_LineTo_p_IShape2D, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_IShape2D, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_IShape2D, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_IShape2D, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_IShape2D, 0, 0},  {&_swigt__p_IShape2D, 0, 0, 0},{0, 0, 0, 0}};
@@ -137654,10 +136326,6 @@ static swig_cast_info _swigc__p_ParticleLimits[] = {  {&_swigt__p_ParticleLimits
 static swig_cast_info _swigc__p_PoissonNoiseBackground[] = {  {&_swigt__p_PoissonNoiseBackground, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Polygon[] = {  {&_swigt__p_Polygon, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_PolygonPrivate[] = {  {&_swigt__p_PolygonPrivate, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_PolygonalTopology[] = {  {&_swigt__p_PolygonalTopology, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_PolyhedralEdge[] = {  {&_swigt__p_PolyhedralEdge, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_PolyhedralFace[] = {  {&_swigt__p_PolyhedralFace, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_PolyhedralTopology[] = {  {&_swigt__p_PolyhedralTopology, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ProgressHandler__Callback_t[] = {  {&_swigt__p_ProgressHandler__Callback_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_PyBuilderCallback[] = {  {&_swigt__p_PyBuilderCallback, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_PyObserverCallback[] = {  {&_swigt__p_PyObserverCallback, 0, 0, 0},{0, 0, 0, 0}};
@@ -137763,7 +136431,6 @@ static swig_cast_info _swigc__p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t
 static swig_cast_info _swigc__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t[] = {  {&_swigt__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t[] = {  {&_swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t[] = {  {&_swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t[] = {  {&_swigt__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t[] = {  {&_swigt__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t[] = {  {&_swigt__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = {  {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -137871,9 +136538,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_FormFactorIcosahedron,
   _swigc__p_FormFactorLongBoxGauss,
   _swigc__p_FormFactorLongBoxLorentz,
-  _swigc__p_FormFactorPolygonalPrism,
-  _swigc__p_FormFactorPolygonalSurface,
-  _swigc__p_FormFactorPolyhedron,
   _swigc__p_FormFactorPrism3,
   _swigc__p_FormFactorPrism6,
   _swigc__p_FormFactorPyramid,
@@ -137914,6 +136578,8 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_IFormFactor,
   _swigc__p_IFormFactorBorn,
   _swigc__p_IFormFactorDecorator,
+  _swigc__p_IFormFactorPolyhedron,
+  _swigc__p_IFormFactorPrism,
   _swigc__p_IHistogram,
   _swigc__p_IIntensityFunction,
   _swigc__p_IInterferenceFunction,
@@ -137995,10 +136661,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_PoissonNoiseBackground,
   _swigc__p_Polygon,
   _swigc__p_PolygonPrivate,
-  _swigc__p_PolygonalTopology,
-  _swigc__p_PolyhedralEdge,
-  _swigc__p_PolyhedralFace,
-  _swigc__p_PolyhedralTopology,
   _swigc__p_ProgressHandler__Callback_t,
   _swigc__p_PyBuilderCallback,
   _swigc__p_PyObserverCallback,
@@ -138104,7 +136766,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t,
   _swigc__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
   _swigc__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t,
-  _swigc__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t,
   _swigc__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t,
   _swigc__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,
   _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,