From 04a6cbd7fdff4bc813a6058af7062d012b900c5a Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 21 Apr 2016 14:00:04 +0200
Subject: [PATCH] Dodecahedron reacts to parameter change. This almost solves
 bug 1413. Still TODO: same for prisms.

---
 Core/FormFactors/FormFactorCone6.cpp          | 103 ++--
 Core/FormFactors/FormFactorCone6.h            |  15 +-
 Core/FormFactors/FormFactorCuboctahedron.cpp  | 100 ++--
 Core/FormFactors/FormFactorCuboctahedron.h    |  26 +-
 Core/FormFactors/FormFactorIcosahedron.cpp    |  70 +--
 Core/FormFactors/FormFactorIcosahedron.h      |  12 +-
 Core/FormFactors/FormFactorPyramid.cpp        |  91 ++-
 Core/FormFactors/FormFactorPyramid.h          |  10 +-
 Core/FormFactors/FormFactorTetrahedron.cpp    |  93 ++-
 Core/FormFactors/FormFactorTetrahedron.h      |  27 +-
 Core/FormFactors/FormFactorTruncatedCube.cpp  |  81 ++-
 Core/FormFactors/FormFactorTruncatedCube.h    |   9 +-
 Core/PythonAPI/libBornAgainCore.py            | 174 +-----
 Core/PythonAPI/libBornAgainCore_wrap.cxx      | 539 ++----------------
 Core/Tools/BornAgainNamespace.h               |   1 +
 Core/Tools/IParameterized.h                   |   2 +-
 Doc/UserManual/FormFactors.tex                |   6 +-
 .../JWu/{dode_test.py => par_changed.py}      |   9 +-
 18 files changed, 357 insertions(+), 1011 deletions(-)
 rename dev-tools/ad-hoc/JWu/{dode_test.py => par_changed.py} (75%)

diff --git a/Core/FormFactors/FormFactorCone6.cpp b/Core/FormFactors/FormFactorCone6.cpp
index d59e724916c..409d14a8332 100644
--- a/Core/FormFactors/FormFactorCone6.cpp
+++ b/Core/FormFactors/FormFactorCone6.cpp
@@ -18,25 +18,36 @@
 
 #include <cmath>
 
-FormFactorCone6::FormFactorCone6(double radius, double height, double alpha)
-    : FormFactorPolyhedron( polyhedral_faces( radius, height, alpha ), 0. )
-    , m_radius(radius)
+FormFactorCone6::FormFactorCone6(double base_edge, double height, double alpha)
+    : FormFactorPolyhedron()
+    , m_base_edge(base_edge)
     , m_height(height)
     , m_alpha(alpha)
 {
     setName(BornAgain::FFCone6Type);
-    check_initialization();
-    init_parameters();
+    registerParameter(BornAgain::BaseEdge, &m_base_edge, AttLimits::n_positive());
+    registerParameter(BornAgain::Height, &m_height, AttLimits::n_positive());
+    registerParameter(BornAgain::Alpha, &m_alpha, AttLimits::n_positive());
+    onChange();
 }
 
-std::vector<PolyhedralFace> FormFactorCone6::polyhedral_faces(
-    double radius, double height, double alpha)
+void FormFactorCone6::onChange()
 {
-    std::vector<PolyhedralFace> faces;
-    double a = radius;
+    if(m_height > m_base_edge*std::tan(m_alpha)) {
+        std::ostringstream ostr;
+        ostr << "FormFactorCone6() -> Error in class initialization with parameters";
+        ostr << " base_edge:" << m_base_edge;
+        ostr << " height:" << m_height;
+        ostr << " alpha[rad]:" << m_alpha << "\n\n";
+        ostr << "Check for 'height <= base_edge*tan(alpha)' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+
+    m_faces.clear();
+    double a = m_base_edge;
     double as = a/2;
     double ac = a*sqrt(3)/2;
-    double b = radius - 2*height/sqrt(3)/std::tan(alpha);
+    double b = m_base_edge - 2*m_height/sqrt(3)/std::tan(m_alpha);
 
     if( std::abs(b)<1e-14*a ) {
         // true pyramid
@@ -49,14 +60,14 @@ std::vector<PolyhedralFace> FormFactorCone6::polyhedral_faces(
             { -as, -ac, 0. },
             {  as, -ac, 0. },
             // top:
-            {  0.,  0., height } };
-        faces.push_back( PolyhedralFace( { V[ 5], V[ 4], V[ 3], V[ 2], V[ 1], V[ 0] }, true ) );
-        faces.push_back( PolyhedralFace( { V[ 0], V[ 1], V[ 6] } ) );
-        faces.push_back( PolyhedralFace( { V[ 1], V[ 2], V[ 6] } ) );
-        faces.push_back( PolyhedralFace( { V[ 2], V[ 3], V[ 6] } ) );
-        faces.push_back( PolyhedralFace( { V[ 3], V[ 4], V[ 6] } ) );
-        faces.push_back( PolyhedralFace( { V[ 4], V[ 5], V[ 6] } ) );
-        faces.push_back( PolyhedralFace( { V[ 5], V[ 0], V[ 6] } ) );
+            {  0.,  0., m_height } };
+        m_faces.push_back( PolyhedralFace( { V[ 5], V[ 4], V[ 3], V[ 2], V[ 1], V[ 0] }, true ) );
+        m_faces.push_back( PolyhedralFace( { V[ 0], V[ 1], V[ 6] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 1], V[ 2], V[ 6] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 2], V[ 3], V[ 6] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 3], V[ 4], V[ 6] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 4], V[ 5], V[ 6] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 5], V[ 0], V[ 6] } ) );
 
     } else {
         // frustum
@@ -72,51 +83,31 @@ std::vector<PolyhedralFace> FormFactorCone6::polyhedral_faces(
             { -as, -ac, 0. },
             {  as, -ac, 0. },
             // top:
-            {  b,   0., height },
-            {  bs,  bc, height },
-            { -bs,  bc, height },
-            { -b,   0., height },
-            { -bs, -bc, height },
-            {  bs, -bc, height } };
-        faces.push_back( PolyhedralFace( { V[ 5], V[ 4], V[ 3], V[ 2], V[ 1], V[ 0] }, true ) );
-        faces.push_back( PolyhedralFace( { V[ 0], V[ 1], V[ 7], V[ 6] } ) );
-        faces.push_back( PolyhedralFace( { V[ 1], V[ 2], V[ 8], V[ 7] } ) );
-        faces.push_back( PolyhedralFace( { V[ 2], V[ 3], V[ 9], V[ 8] } ) );
-        faces.push_back( PolyhedralFace( { V[ 3], V[ 4], V[10], V[ 9] } ) );
-        faces.push_back( PolyhedralFace( { V[ 4], V[ 5], V[11], V[10] } ) );
-        faces.push_back( PolyhedralFace( { V[ 5], V[ 0], V[ 6], V[11] } ) );
-        faces.push_back( PolyhedralFace( { V[ 6], V[ 7], V[ 8], V[ 9], V[10], V[11] }, true ) );
-
-    }
-    return faces;
-}
+            {  b,   0., m_height },
+            {  bs,  bc, m_height },
+            { -bs,  bc, m_height },
+            { -b,   0., m_height },
+            { -bs, -bc, m_height },
+            {  bs, -bc, m_height } };
+        m_faces.push_back( PolyhedralFace( { V[ 5], V[ 4], V[ 3], V[ 2], V[ 1], V[ 0] }, true ) );
+        m_faces.push_back( PolyhedralFace( { V[ 0], V[ 1], V[ 7], V[ 6] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 1], V[ 2], V[ 8], V[ 7] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 2], V[ 3], V[ 9], V[ 8] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 3], V[ 4], V[10], V[ 9] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 4], V[ 5], V[11], V[10] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 5], V[ 0], V[ 6], V[11] } ) );
+        m_faces.push_back( PolyhedralFace( { V[ 6], V[ 7], V[ 8], V[ 9], V[10], V[11] }, true ) );
 
-bool FormFactorCone6::check_initialization() const
-{
-    bool result(true);
-    if(m_height > m_radius*std::tan(m_alpha)) {
-        std::ostringstream ostr;
-        ostr << "FormFactorCone6() -> Error in class initialization with parameters";
-        ostr << " radius:" << m_radius;
-        ostr << " height:" << m_height;
-        ostr << " alpha[rad]:" << m_alpha << "\n\n";
-        ostr << "Check for 'height <= radius*tan(alpha)' failed.";
-        throw Exceptions::ClassInitializationException(ostr.str());
     }
-    return result;
-}
+    m_z_origin = 0;
+    m_sym_Ci = false;
 
-void FormFactorCone6::init_parameters()
-{
-    clearParameterPool();
-    registerParameter(BornAgain::Radius, &m_radius, AttLimits::n_positive());
-    registerParameter(BornAgain::Height, &m_height, AttLimits::n_positive());
-    registerParameter(BornAgain::Alpha, &m_alpha, AttLimits::n_positive());
+    FormFactorPolyhedron::precompute();
 }
 
 FormFactorCone6* FormFactorCone6::clone() const
 {
-   return new FormFactorCone6(m_radius, m_height, m_alpha);
+   return new FormFactorCone6(m_base_edge, m_height, m_alpha);
 }
 
 void FormFactorCone6::accept(ISampleVisitor *visitor) const
diff --git a/Core/FormFactors/FormFactorCone6.h b/Core/FormFactors/FormFactorCone6.h
index cb79a2fc906..f610b6a8811 100644
--- a/Core/FormFactors/FormFactorCone6.h
+++ b/Core/FormFactors/FormFactorCone6.h
@@ -25,27 +25,20 @@ class BA_CORE_API_ FormFactorCone6 : public FormFactorPolyhedron
 {
 public:
     //! @brief Cone6 constructor
-    //! @param radius of hexagonal base (different from R in IsGisaxs)
+    //! @param base_edge of hexagonal base (different from R in IsGisaxs)
     //! @param height of Cone6
     //! @param angle in radians between base and facet
-    FormFactorCone6(double radius, double height,  double alpha);
-
-    static std::vector<PolyhedralFace> polyhedral_faces(
-        double radius, double height,  double alpha);
+    FormFactorCone6(double base_edge, double height,  double alpha);
 
     virtual FormFactorCone6* clone() const;
-
     virtual void accept(ISampleVisitor *visitor) const;
 
     double getHeight() const { return m_height; }
     double getAlpha() const { return m_alpha; }
 
-protected:
-    virtual bool check_initialization() const;
-    virtual void init_parameters();
-
 private:
-    double m_radius;
+    virtual void onChange() final;
+    double m_base_edge;
     double m_height;
     double m_alpha;
 };
diff --git a/Core/FormFactors/FormFactorCuboctahedron.cpp b/Core/FormFactors/FormFactorCuboctahedron.cpp
index 56839fbcbdb..1d89df7af00 100644
--- a/Core/FormFactors/FormFactorCuboctahedron.cpp
+++ b/Core/FormFactors/FormFactorCuboctahedron.cpp
@@ -18,60 +18,30 @@
 #include "FormFactorPyramid.h"
 #include "MathFunctions.h"
 
+//! @brief Cuboctahedron constructor
+//! @param length of one side of Cuboctahedron's square base
+//! @param height of bottom of Cuboctahedron
+//! @param height_ratio: height top part/height bottom part
+//! @param alpha: angle in radians between base and facet
+
 FormFactorCuboctahedron::FormFactorCuboctahedron(
     double length, double height, double height_ratio, double alpha)
-    : FormFactorPolyhedron( polyhedral_faces( length, height, height_ratio, alpha ), 0. )
+    : FormFactorPolyhedron()
     , m_length(length)
     , m_height(height)
     , m_height_ratio(height_ratio)
     , m_alpha(alpha)
 {
     setName(BornAgain::FFCuboctahedronType);
-    check_initialization();
-    init_parameters();
-}
-
-std::vector<PolyhedralFace> FormFactorCuboctahedron::polyhedral_faces(
-    double length, double height, double height_ratio, double alpha)
-{
-    double a = length/2 - height/std::tan(alpha);
-    double b = length/2;
-    double c = length/2 - height*height_ratio/std::tan(alpha);
-
-    kvector_t V[12] = {
-        // base:
-        { -a, -a, 0. },
-        {  a, -a, 0. },
-        {  a,  a, 0. },
-        { -a,  a, 0. },
-        // middle
-        { -b, -b, height },
-        {  b, -b, height },
-        {  b,  b, height },
-        { -b,  b, height },
-        // top
-        { -c, -c, height*(1+height_ratio) },
-        {  c, -c, height*(1+height_ratio) },
-        {  c,  c, height*(1+height_ratio) },
-        { -c,  c, height*(1+height_ratio) } };
-    std::vector<PolyhedralFace> faces;
-    faces.push_back( PolyhedralFace( { V[ 3], V[ 2], V[ 1], V[ 0] }, true ) );
-    faces.push_back( PolyhedralFace( { V[ 0], V[ 1], V[ 5], V[ 4] } ) );
-    faces.push_back( PolyhedralFace( { V[ 1], V[ 2], V[ 6], V[ 5] } ) );
-    faces.push_back( PolyhedralFace( { V[ 2], V[ 3], V[ 7], V[ 6] } ) );
-    faces.push_back( PolyhedralFace( { V[ 3], V[ 0], V[ 4], V[ 7] } ) );
-    faces.push_back( PolyhedralFace( { V[ 4], V[ 5], V[ 9], V[ 8] } ) );
-    faces.push_back( PolyhedralFace( { V[ 5], V[ 6], V[10], V[ 9] } ) );
-    faces.push_back( PolyhedralFace( { V[ 6], V[ 7], V[11], V[10] } ) );
-    faces.push_back( PolyhedralFace( { V[ 7], V[ 4], V[ 8], V[11] } ) );
-    faces.push_back( PolyhedralFace( { V[ 8], V[ 9], V[10], V[11] }, true ) );
-
-    return faces;
+    registerParameter(BornAgain::Height, &m_height, AttLimits::n_positive());
+    registerParameter(BornAgain::HeightRatio, &m_height_ratio, AttLimits::n_positive());
+    registerParameter(BornAgain::Length, &m_length, AttLimits::n_positive());
+    registerParameter(BornAgain::Alpha, &m_alpha, AttLimits::n_positive());
+    onChange();
 }
 
-bool FormFactorCuboctahedron::check_initialization() const
+void FormFactorCuboctahedron::onChange()
 {
-    bool result(true);
     if(2.*m_height > m_length*std::tan(m_alpha)*std::min(1.,1.0/m_height_ratio)) {
         std::ostringstream ostr;
         ostr << "FormFactorCuboctahedron() -> Error in class initialization with parameters";
@@ -82,16 +52,42 @@ bool FormFactorCuboctahedron::check_initialization() const
         ostr << "Check for '2.*height <= length*tan(alpha)*min(1.,1.0/height_ratio)' failed.";
         throw Exceptions::ClassInitializationException(ostr.str());
     }
-    return result;
-}
+    double a = m_length/2 - m_height/std::tan(m_alpha);
+    double b = m_length/2;
+    double c = m_length/2 - m_height*m_height_ratio/std::tan(m_alpha);
 
-void FormFactorCuboctahedron::init_parameters()
-{
-    clearParameterPool();
-    registerParameter(BornAgain::Height, &m_height, AttLimits::n_positive());
-    registerParameter(BornAgain::HeightRatio, &m_height_ratio, AttLimits::n_positive());
-    registerParameter(BornAgain::Length, &m_length, AttLimits::n_positive());
-    registerParameter(BornAgain::Alpha, &m_alpha, AttLimits::n_positive());
+    kvector_t V[12] = {
+        // base:
+        { -a, -a, 0. },
+        {  a, -a, 0. },
+        {  a,  a, 0. },
+        { -a,  a, 0. },
+        // middle
+        { -b, -b, m_height },
+        {  b, -b, m_height },
+        {  b,  b, m_height },
+        { -b,  b, m_height },
+        // top
+        { -c, -c, m_height*(1+m_height_ratio) },
+        {  c, -c, m_height*(1+m_height_ratio) },
+        {  c,  c, m_height*(1+m_height_ratio) },
+        { -c,  c, m_height*(1+m_height_ratio) } };
+    m_faces.clear();
+    m_faces.push_back( PolyhedralFace( { V[ 3], V[ 2], V[ 1], V[ 0] }, true ) );
+    m_faces.push_back( PolyhedralFace( { V[ 0], V[ 1], V[ 5], V[ 4] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 1], V[ 2], V[ 6], V[ 5] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 2], V[ 3], V[ 7], V[ 6] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 3], V[ 0], V[ 4], V[ 7] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 4], V[ 5], V[ 9], V[ 8] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 5], V[ 6], V[10], V[ 9] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 6], V[ 7], V[11], V[10] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 7], V[ 4], V[ 8], V[11] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 8], V[ 9], V[10], V[11] }, true ) );
+
+    m_z_origin = 0;
+    m_sym_Ci = false;
+
+    FormFactorPolyhedron::precompute();
 }
 
 FormFactorCuboctahedron* FormFactorCuboctahedron::clone() const
diff --git a/Core/FormFactors/FormFactorCuboctahedron.h b/Core/FormFactors/FormFactorCuboctahedron.h
index 1cf86695051..73288e7b6c1 100644
--- a/Core/FormFactors/FormFactorCuboctahedron.h
+++ b/Core/FormFactors/FormFactorCuboctahedron.h
@@ -25,29 +25,18 @@
 class BA_CORE_API_ FormFactorCuboctahedron : public FormFactorPolyhedron
 {
 public:
-    //! @brief Cuboctahedron constructor
-    //! @param length of one side of Cuboctahedron's square base
-    //! @param height of bottom of Cuboctahedron
-    //! @param height_ratio : height top part/height bottom part
-    //! @param angle in radians between base and facet
-
     FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha);
-    virtual ~FormFactorCuboctahedron() {}
-
-    static std::vector<PolyhedralFace> polyhedral_faces(
-        double length, double height, double height_ratio, double alpha);
 
     virtual FormFactorCuboctahedron *clone() const final;
     virtual void accept(ISampleVisitor *visitor) const final;
 
-    double getHeight() const;
-    double getHeightRatio() const;
-    double getLength() const;
-    double getAlpha() const;
+    double getLength() const { return m_length; }
+    double getHeight() const { return m_height; }
+    double getHeightRatio() const { return m_height_ratio; }
+    double getAlpha() const { return m_alpha; }
 
 private:
-    virtual bool check_initialization() const final;
-    virtual void init_parameters() final;
+    virtual void onChange() final;
 
     double m_length;
     double m_height;
@@ -55,9 +44,4 @@ private:
     double m_alpha;
 };
 
-inline double FormFactorCuboctahedron::getHeight() const { return m_height; }
-inline double FormFactorCuboctahedron::getHeightRatio() const { return m_height_ratio; }
-inline double FormFactorCuboctahedron::getLength() const { return m_length; }
-inline double FormFactorCuboctahedron::getAlpha() const { return m_alpha; }
-
 #endif // FORMFACTORCUBOCTAHEDRON_H
diff --git a/Core/FormFactors/FormFactorIcosahedron.cpp b/Core/FormFactors/FormFactorIcosahedron.cpp
index a092b26c417..baf38aea1a5 100644
--- a/Core/FormFactors/FormFactorIcosahedron.cpp
+++ b/Core/FormFactors/FormFactorIcosahedron.cpp
@@ -20,18 +20,17 @@
 
 
 FormFactorIcosahedron::FormFactorIcosahedron(double edge)
-    : FormFactorPolyhedron( polyhedral_faces(edge), -0.7557613140761708*edge, true )
+    : FormFactorPolyhedron()
     , m_edge(edge)
 {
     setName(BornAgain::FFIcosahedronType);
-    check_initialization();
-    assert_platonic();
-    init_parameters();
+    registerParameter(BornAgain::Edge, &m_edge);
+    onChange();
 }
 
-std::vector<PolyhedralFace> FormFactorIcosahedron::polyhedral_faces(double edge)
+void FormFactorIcosahedron::onChange()
 {
-    double a = edge;
+    double a = m_edge;
     kvector_t V[12] = {
         {  0.5773502691896258*a,                   0*a, -0.7557613140761708*a},
         {  -0.288675134594813*a,                 0.5*a, -0.7557613140761708*a},
@@ -45,40 +44,39 @@ std::vector<PolyhedralFace> FormFactorIcosahedron::polyhedral_faces(double edge)
         { -0.5773502691896258*a,                   0*a,  0.7557613140761708*a},
         {   0.288675134594813*a,                 0.5*a,  0.7557613140761708*a},
         {   0.288675134594813*a,                -0.5*a,  0.7557613140761708*a} };
-    std::vector<PolyhedralFace> faces;
+    m_faces.clear();
     // bottom:
-    faces.push_back( PolyhedralFace( { V[ 0], V[ 2], V[ 1] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 0], V[ 2], V[ 1] } ) );
     // 1st row:
-    faces.push_back( PolyhedralFace( { V[ 0], V[ 5], V[ 2] } ) );
-    faces.push_back( PolyhedralFace( { V[ 2], V[ 3], V[ 1] } ) );
-    faces.push_back( PolyhedralFace( { V[ 1], V[ 4], V[ 0] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 0], V[ 5], V[ 2] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 2], V[ 3], V[ 1] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 1], V[ 4], V[ 0] } ) );
     // 2nd row:
-    faces.push_back( PolyhedralFace( { V[ 0], V[ 6], V[ 5] } ) );
-    faces.push_back( PolyhedralFace( { V[ 2], V[ 5], V[ 8] } ) );
-    faces.push_back( PolyhedralFace( { V[ 2], V[ 8], V[ 3] } ) );
-    faces.push_back( PolyhedralFace( { V[ 1], V[ 3], V[ 7] } ) );
-    faces.push_back( PolyhedralFace( { V[ 1], V[ 7], V[ 4] } ) );
-    faces.push_back( PolyhedralFace( { V[ 0], V[ 4], V[ 6] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 0], V[ 6], V[ 5] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 2], V[ 5], V[ 8] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 2], V[ 8], V[ 3] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 1], V[ 3], V[ 7] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 1], V[ 7], V[ 4] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 0], V[ 4], V[ 6] } ) );
     // 3rd row:
-    faces.push_back( PolyhedralFace( { V[ 3], V[ 8], V[ 9] } ) );
-    faces.push_back( PolyhedralFace( { V[ 5], V[11], V[ 8] } ) );
-    faces.push_back( PolyhedralFace( { V[ 5], V[ 6], V[11] } ) );
-    faces.push_back( PolyhedralFace( { V[ 4], V[10], V[ 6] } ) );
-    faces.push_back( PolyhedralFace( { V[ 4], V[ 7], V[10] } ) );
-    faces.push_back( PolyhedralFace( { V[ 3], V[ 9], V[ 7] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 3], V[ 8], V[ 9] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 5], V[11], V[ 8] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 5], V[ 6], V[11] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 4], V[10], V[ 6] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 4], V[ 7], V[10] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 3], V[ 9], V[ 7] } ) );
     // 4th row:
-    faces.push_back( PolyhedralFace( { V[ 8], V[11], V[ 9] } ) );
-    faces.push_back( PolyhedralFace( { V[ 6], V[10], V[11] } ) );
-    faces.push_back( PolyhedralFace( { V[ 7], V[ 9], V[10] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 8], V[11], V[ 9] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 6], V[10], V[11] } ) );
+    m_faces.push_back( PolyhedralFace( { V[ 7], V[ 9], V[10] } ) );
     // top:
-    faces.push_back( PolyhedralFace( { V[ 9], V[11], V[10] } ) );
-    return faces;
-}
+    m_faces.push_back( PolyhedralFace( { V[ 9], V[11], V[10] } ) );
+    assert_platonic();
 
-void FormFactorIcosahedron::init_parameters()
-{
-    clearParameterPool();
-    registerParameter(BornAgain::Edge, &m_edge);
+    m_z_origin = -0.7557613140761708*a;
+    m_sym_Ci = true;
+
+    FormFactorPolyhedron::precompute();
 }
 
 FormFactorIcosahedron* FormFactorIcosahedron::clone() const
@@ -90,9 +88,3 @@ void FormFactorIcosahedron::accept(ISampleVisitor *visitor) const
 {
     visitor->visit(this);
 }
-
-bool FormFactorIcosahedron::check_initialization() const
-{
-    bool result(true);
-    return result;
-}
diff --git a/Core/FormFactors/FormFactorIcosahedron.h b/Core/FormFactors/FormFactorIcosahedron.h
index 2d14f4cadb4..6de60ce8f07 100644
--- a/Core/FormFactors/FormFactorIcosahedron.h
+++ b/Core/FormFactors/FormFactorIcosahedron.h
@@ -25,24 +25,16 @@
 class BA_CORE_API_ FormFactorIcosahedron : public FormFactorPolyhedron
 {
 public:
-    //! @brief Constructs a regular icosahedron
-    //! @param edge length
     FormFactorIcosahedron(double edge);
 
-    static std::vector<PolyhedralFace> polyhedral_faces(double edge);
-
     virtual FormFactorIcosahedron *clone() const final;
     virtual void accept(ISampleVisitor *visitor) const final;
 
-    double getEdge() const;
+    double getEdge() const { return m_edge; }
 
 private:
-    virtual bool check_initialization() const;
-    virtual void init_parameters();
-
+    virtual void onChange() final;
     double m_edge;
 };
 
-inline double FormFactorIcosahedron::getEdge() const { return m_edge; }
-
 #endif // FORMFACTORICOSAHEDRON_H
diff --git a/Core/FormFactors/FormFactorPyramid.cpp b/Core/FormFactors/FormFactorPyramid.cpp
index af230c4375e..d53e510d1bb 100644
--- a/Core/FormFactors/FormFactorPyramid.cpp
+++ b/Core/FormFactors/FormFactorPyramid.cpp
@@ -16,23 +16,39 @@
 #include "FormFactorPyramid.h"
 #include "BornAgainNamespace.h"
 
+//! @brief Pyramid constructor
+//! @param length of one side of Pyramid's square base
+//! @param height of Pyramid
+//! @param angle in radians between base and facet
+
 FormFactorPyramid::FormFactorPyramid(double length, double height, double alpha)
-    : FormFactorPolyhedron( polyhedral_faces( length, height, alpha ), 0. )
+    : FormFactorPolyhedron()
     , m_length(length)
     , m_height(height)
     , m_alpha(alpha)
 {
     setName(BornAgain::FFPyramidType);
-    check_initialization();
-    init_parameters();
+    registerParameter(BornAgain::Length, &m_length, AttLimits::n_positive());
+    registerParameter(BornAgain::Height, &m_height, AttLimits::n_positive());
+    registerParameter(BornAgain::Alpha, &m_alpha, AttLimits::n_positive());
+    onChange();
 }
 
-std::vector<PolyhedralFace> FormFactorPyramid::polyhedral_faces(
-    double length, double height, double alpha)
+void FormFactorPyramid::onChange()
 {
-    std::vector<PolyhedralFace> faces;
-    double a = length/2;
-    double b = length/2 - height/std::tan(alpha);
+    if(m_height > m_length*std::tan(m_alpha)) {
+        std::ostringstream ostr;
+        ostr << "FormFactorPyramid() -> Error in class initialization with parameters";
+        ostr << " length:" << m_length;
+        ostr << " height:" << m_height;
+        ostr << " alpha[rad]:" << m_alpha << "\n\n";
+        ostr << "Check for 'height <= length*tan(alpha)' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+
+    m_faces.clear();
+    double a = m_length/2;
+    double b = m_length/2 - m_height/std::tan(m_alpha);
 
     if( std::abs(b)<1e-14*a ) {
         // true pyramid
@@ -43,13 +59,13 @@ std::vector<PolyhedralFace> FormFactorPyramid::polyhedral_faces(
             {  a,  a, 0. },
             { -a,  a, 0. },
             // top:
-            { 0., 0., height } };
-        faces.push_back( PolyhedralFace( { V[3], V[2], V[1], V[0] }, true ) );
-        faces.push_back( PolyhedralFace( { V[0], V[1], V[4] } ) );
-        faces.push_back( PolyhedralFace( { V[1], V[2], V[4] } ) );
-        faces.push_back( PolyhedralFace( { V[2], V[3], V[4] } ) );
-        faces.push_back( PolyhedralFace( { V[3], V[0], V[4] } ) );
-        
+            { 0., 0., m_height } };
+        m_faces.push_back( PolyhedralFace( { V[3], V[2], V[1], V[0] }, true ) );
+        m_faces.push_back( PolyhedralFace( { V[0], V[1], V[4] } ) );
+        m_faces.push_back( PolyhedralFace( { V[1], V[2], V[4] } ) );
+        m_faces.push_back( PolyhedralFace( { V[2], V[3], V[4] } ) );
+        m_faces.push_back( PolyhedralFace( { V[3], V[0], V[4] } ) );
+
     } else {
         // frustum
         kvector_t V[8] = {
@@ -59,41 +75,22 @@ std::vector<PolyhedralFace> FormFactorPyramid::polyhedral_faces(
             {  a,  a, 0. },
             { -a,  a, 0. },
             // top:
-            { -b, -b, height },
-            {  b, -b, height },
-            {  b,  b, height },
-            { -b,  b, height } };
-        faces.push_back( PolyhedralFace( { V[3], V[2], V[1], V[0] }, true ) );
-        faces.push_back( PolyhedralFace( { V[0], V[1], V[5], V[4] } ) );
-        faces.push_back( PolyhedralFace( { V[1], V[2], V[6], V[5] } ) );
-        faces.push_back( PolyhedralFace( { V[2], V[3], V[7], V[6] } ) );
-        faces.push_back( PolyhedralFace( { V[3], V[0], V[4], V[7] } ) );
-        faces.push_back( PolyhedralFace( { V[4], V[5], V[6], V[7] }, true ) );
+            { -b, -b, m_height },
+            {  b, -b, m_height },
+            {  b,  b, m_height },
+            { -b,  b, m_height } };
+        m_faces.push_back( PolyhedralFace( { V[3], V[2], V[1], V[0] }, true ) );
+        m_faces.push_back( PolyhedralFace( { V[0], V[1], V[5], V[4] } ) );
+        m_faces.push_back( PolyhedralFace( { V[1], V[2], V[6], V[5] } ) );
+        m_faces.push_back( PolyhedralFace( { V[2], V[3], V[7], V[6] } ) );
+        m_faces.push_back( PolyhedralFace( { V[3], V[0], V[4], V[7] } ) );
+        m_faces.push_back( PolyhedralFace( { V[4], V[5], V[6], V[7] }, true ) );
     }
-    return faces;
-}
 
-bool FormFactorPyramid::check_initialization() const
-{
-    bool result(true);
-    if(m_height > m_length*std::tan(m_alpha)) {
-        std::ostringstream ostr;
-        ostr << "FormFactorPyramid() -> Error in class initialization with parameters";
-        ostr << " length:" << m_length;
-        ostr << " height:" << m_height;
-        ostr << " alpha[rad]:" << m_alpha << "\n\n";
-        ostr << "Check for 'height <= length*tan(alpha)' failed.";
-        throw Exceptions::ClassInitializationException(ostr.str());
-    }
-    return result;
-}
+    m_z_origin = 0;
+    m_sym_Ci = false;
 
-void FormFactorPyramid::init_parameters()
-{
-    clearParameterPool();
-    registerParameter(BornAgain::Length, &m_length, AttLimits::n_positive());
-    registerParameter(BornAgain::Height, &m_height, AttLimits::n_positive());
-    registerParameter(BornAgain::Alpha, &m_alpha, AttLimits::n_positive());
+    FormFactorPolyhedron::precompute();
 }
 
 FormFactorPyramid* FormFactorPyramid::clone() const
diff --git a/Core/FormFactors/FormFactorPyramid.h b/Core/FormFactors/FormFactorPyramid.h
index 22ec7ad6ba0..f984deca82d 100644
--- a/Core/FormFactors/FormFactorPyramid.h
+++ b/Core/FormFactors/FormFactorPyramid.h
@@ -24,15 +24,8 @@
 class BA_CORE_API_ FormFactorPyramid : public FormFactorPolyhedron
 {
 public:
-    //! @brief Pyramid constructor
-    //! @param length of one side of Pyramid's square base
-    //! @param height of Pyramid
-    //! @param angle in radians between base and facet
     FormFactorPyramid(double length, double height, double alpha);
 
-    static std::vector<PolyhedralFace> polyhedral_faces(
-        double length, double height,  double alpha);
-
     virtual FormFactorPyramid* clone() const final;
     virtual void accept(ISampleVisitor *visitor) const final;
 
@@ -41,8 +34,7 @@ public:
     double getAlpha() const { return m_alpha; }
 
 private:
-    virtual bool check_initialization() const final;
-    virtual void init_parameters() final;
+    virtual void onChange() final;
 
     double m_length;
     double m_height;
diff --git a/Core/FormFactors/FormFactorTetrahedron.cpp b/Core/FormFactors/FormFactorTetrahedron.cpp
index 8748050a8fd..aa02217cb3f 100644
--- a/Core/FormFactors/FormFactorTetrahedron.cpp
+++ b/Core/FormFactors/FormFactorTetrahedron.cpp
@@ -18,29 +18,43 @@
 #include "BornAgainNamespace.h"
 #include "IntegratorComplex.h"
 
+//! @brief Tetrahedron constructor
+//! @param length of a side of Tetrahedron's base
+//! @param height of Tetrahedron
+//! @param angle in radians between base and facet
+
 FormFactorTetrahedron::FormFactorTetrahedron(double length, double height, double alpha)
-    : FormFactorPolyhedron( polyhedral_faces( length, height, alpha ), 0. )
+    : FormFactorPolyhedron()
+    , m_length(length)
+    , m_height(height)
+    , m_alpha(alpha)
 {
     setName(BornAgain::FFTetrahedronType);
-    m_height = height;
-    m_length = length;
-    m_alpha = alpha;
-    check_initialization();
-    init_parameters();
+    registerParameter(BornAgain::Height, &m_height, AttLimits::n_positive());
+    registerParameter(BornAgain::Length, &m_length, AttLimits::n_positive());
+    registerParameter(BornAgain::Alpha, &m_alpha, AttLimits::n_positive());
+    onChange();
 }
 
-FormFactorTetrahedron::~FormFactorTetrahedron() {}
-
-std::vector<PolyhedralFace> FormFactorTetrahedron::polyhedral_faces(
-    double length, double height, double alpha)
+void FormFactorTetrahedron::onChange()
 {
-    std::vector<PolyhedralFace> faces;
+    if (2*std::sqrt(3.) * m_height > m_length*std::tan(m_alpha)) {
+        std::ostringstream ostr;
+        ostr << "FormFactorTetrahedron() -> Error in class initialization with parameters ";
+        ostr << " height:" << m_height;
+        ostr << " length:" << m_length;
+        ostr << " alpha[rad]:" << m_alpha << "\n\n";
+        ostr << "Check for '2.*sqrt(3.) * height <= length*tan(alpha)' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+
+    m_faces.clear();
 
-    double a = length;
+    double a = m_length;
     double as = a/2;
     double ac = a/sqrt(3)/2;
     double ah = a/sqrt(3);
-    double b = a - 2*sqrt(3)*height/std::tan(alpha);
+    double b = a - 2*sqrt(3)*m_height/std::tan(m_alpha);
 
     if( std::abs(b)<1e-14*a ) {
         // true pyramid
@@ -50,11 +64,11 @@ std::vector<PolyhedralFace> FormFactorTetrahedron::polyhedral_faces(
             {  as, -ac, 0. },
             {  0.,  ah, 0. },
             // top:
-            {  0.,  0., height } };
-        faces.push_back( PolyhedralFace( { V[2], V[1], V[0] } ) );
-        faces.push_back( PolyhedralFace( { V[0], V[1], V[3] } ) );
-        faces.push_back( PolyhedralFace( { V[1], V[2], V[3] } ) );
-        faces.push_back( PolyhedralFace( { V[2], V[0], V[3] } ) );
+            {  0.,  0., m_height } };
+        m_faces.push_back( PolyhedralFace( { V[2], V[1], V[0] } ) );
+        m_faces.push_back( PolyhedralFace( { V[0], V[1], V[3] } ) );
+        m_faces.push_back( PolyhedralFace( { V[1], V[2], V[3] } ) );
+        m_faces.push_back( PolyhedralFace( { V[2], V[0], V[3] } ) );
 
     } else {
         // frustum
@@ -68,39 +82,18 @@ std::vector<PolyhedralFace> FormFactorTetrahedron::polyhedral_faces(
             {  as, -ac, 0. },
             {  0.,  ah, 0. },
             // top:
-            { -bs, -bc, height },
-            {  bs, -bc, height },
-            {  0.,  bh, height } };
-        faces.push_back( PolyhedralFace( { V[2], V[1], V[0] } ) );
-        faces.push_back( PolyhedralFace( { V[0], V[1], V[4], V[3] } ) );
-        faces.push_back( PolyhedralFace( { V[1], V[2], V[5], V[4] } ) );
-        faces.push_back( PolyhedralFace( { V[2], V[0], V[3], V[5] } ) );
-        faces.push_back( PolyhedralFace( { V[3], V[4], V[5] } ) );
+            { -bs, -bc, m_height },
+            {  bs, -bc, m_height },
+            {  0.,  bh, m_height } };
+        m_faces.push_back( PolyhedralFace( { V[2], V[1], V[0] } ) );
+        m_faces.push_back( PolyhedralFace( { V[0], V[1], V[4], V[3] } ) );
+        m_faces.push_back( PolyhedralFace( { V[1], V[2], V[5], V[4] } ) );
+        m_faces.push_back( PolyhedralFace( { V[2], V[0], V[3], V[5] } ) );
+        m_faces.push_back( PolyhedralFace( { V[3], V[4], V[5] } ) );
     }
-    return faces;
-}
-
-bool FormFactorTetrahedron::check_initialization() const
-{
-    bool result(true);
-    if (2*std::sqrt(3.) * m_height > m_length*std::tan(m_alpha)) {
-        std::ostringstream ostr;
-        ostr << "FormFactorTetrahedron() -> Error in class initialization with parameters ";
-        ostr << " height:" << m_height;
-        ostr << " length:" << m_length;
-        ostr << " alpha[rad]:" << m_alpha << "\n\n";
-        ostr << "Check for '2.*sqrt(3.) * height <= length*tan(alpha)' failed.";
-        throw Exceptions::ClassInitializationException(ostr.str());
-    }
-    return result;
-}
-
-void FormFactorTetrahedron::init_parameters()
-{
-    clearParameterPool();
-    registerParameter(BornAgain::Height, &m_height, AttLimits::n_positive());
-    registerParameter(BornAgain::Length, &m_length, AttLimits::n_positive());
-    registerParameter(BornAgain::Alpha, &m_alpha, AttLimits::n_positive());
+    m_z_origin = 0;
+    m_sym_Ci = false;
+    FormFactorPolyhedron::precompute();
 }
 
 FormFactorTetrahedron* FormFactorTetrahedron::clone() const
diff --git a/Core/FormFactors/FormFactorTetrahedron.h b/Core/FormFactors/FormFactorTetrahedron.h
index 6d8c08bb2c2..9946f0db5f1 100644
--- a/Core/FormFactors/FormFactorTetrahedron.h
+++ b/Core/FormFactors/FormFactorTetrahedron.h
@@ -21,39 +21,24 @@
 //! @class FormFactorTetrahedron
 //! @ingroup formfactors
 //! @brief The formfactor of tetrahedron.
+
 class BA_CORE_API_ FormFactorTetrahedron : public FormFactorPolyhedron
 {
 public:
-    //! @brief Tetrahedron constructor
-    //! @param length of a side of Tetrahedron's base
-    //! @param height of Tetrahedron
-    //! @param angle in radians between base and facet
     FormFactorTetrahedron(double length, double height, double alpha);
-    virtual ~FormFactorTetrahedron();
-
-    static std::vector<PolyhedralFace> polyhedral_faces(
-        double length, double height,  double alpha);
 
     virtual FormFactorTetrahedron *clone() const;
-
     virtual void accept(ISampleVisitor *visitor) const;
 
-    double getHeight() const;
-    double getLength() const;
-    double getAlpha() const;
-
-protected:
-    virtual bool check_initialization() const;
-    virtual void init_parameters();
+    double getLength() const { return m_length; }
+    double getHeight() const { return m_height; }
+    double getAlpha() const { return m_alpha; }
 
 private:
-    double m_height;
+    virtual void onChange() final;
     double m_length;
+    double m_height;
     double m_alpha;
 };
 
-inline double FormFactorTetrahedron::getHeight() const { return m_height; }
-inline double FormFactorTetrahedron::getLength() const { return m_length; }
-inline double FormFactorTetrahedron::getAlpha() const { return m_alpha; }
-
 #endif // FORMFACTORTETRAHEDRON_H
diff --git a/Core/FormFactors/FormFactorTruncatedCube.cpp b/Core/FormFactors/FormFactorTruncatedCube.cpp
index 40543aba70c..c92d2ac660d 100644
--- a/Core/FormFactors/FormFactorTruncatedCube.cpp
+++ b/Core/FormFactors/FormFactorTruncatedCube.cpp
@@ -19,22 +19,34 @@
 #include "MathFunctions.h"
 
 
+//! @param side length of the full cube
+//! @param side length of the trirectangular tetrahedron removed from each vertex of the cube
+
 FormFactorTruncatedCube::FormFactorTruncatedCube(
    double length, double removed_length)
-    : FormFactorPolyhedron( polyhedral_faces(length, removed_length), -length/2, true )
+    : FormFactorPolyhedron()
     , m_length(length)
     , m_removed_length(removed_length)
 {
     setName(BornAgain::FFTruncatedCubeType);
-    check_initialization();
-    init_parameters();
+    registerParameter(BornAgain::Length, &m_length);
+    registerParameter(BornAgain::RemovedLength, &m_removed_length);
+    onChange();
 }
 
-std::vector<PolyhedralFace> FormFactorTruncatedCube::polyhedral_faces(
-   double length, double removed_length)
+void FormFactorTruncatedCube::onChange()
 {
-    double a = length/2;
-    double b = removed_length;
+    if(m_removed_length > 0.5*m_length) {
+        std::ostringstream ostr;
+        ostr << "::FormFactorTruncatedCube() -> Error in class initialization ";
+        ostr << "with parameters 'length':" << m_length;
+        ostr << " 'removed_length':" << m_removed_length << "\n\n";
+        ostr << "Check for removed_length <= 0.5*length failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+
+    double a = m_length/2;
+    double b = m_removed_length;
 
     kvector_t V[24] = {
         { -a+b, -a  , -a   },
@@ -61,29 +73,26 @@ std::vector<PolyhedralFace> FormFactorTruncatedCube::polyhedral_faces(
         {  a-b,  a  ,  a   },
         {  a  ,  a-b,  a   },
         {  a  ,  a  ,  a-b } };
-    std::vector<PolyhedralFace> faces;
-    faces.push_back( PolyhedralFace( { V[ 0],V[ 1],V[ 7],V[ 6], V[ 9],V[10],V[ 4],V[ 3] }, true ) );
-    faces.push_back( PolyhedralFace( { V[ 0],V[ 2],V[ 1] } ) );
-    faces.push_back( PolyhedralFace( { V[ 3],V[ 4],V[ 5] } ) );
-    faces.push_back( PolyhedralFace( { V[ 9],V[11],V[10] } ) );
-    faces.push_back( PolyhedralFace( { V[ 6],V[ 7],V[ 8] } ) );
-    faces.push_back( PolyhedralFace( { V[ 0],V[ 3],V[ 5],V[17], V[15],V[12],V[14],V[ 2] }, true ) );
-    faces.push_back( PolyhedralFace( { V[ 4],V[10],V[11],V[23], V[22],V[16],V[17],V[ 5] }, true ) );
-    faces.push_back( PolyhedralFace( { V[ 1],V[ 2],V[14],V[13], V[19],V[20],V[ 8],V[ 7] }, true ) );
-    faces.push_back( PolyhedralFace( { V[ 6],V[ 8],V[20],V[18], V[21],V[23],V[11],V[ 9] }, true ) );
-    faces.push_back( PolyhedralFace( { V[15],V[17],V[16] } ) );
-    faces.push_back( PolyhedralFace( { V[12],V[13],V[14] } ) );
-    faces.push_back( PolyhedralFace( { V[18],V[20],V[19] } ) );
-    faces.push_back( PolyhedralFace( { V[21],V[22],V[23] } ) );
-    faces.push_back( PolyhedralFace( { V[12],V[15],V[16],V[22], V[21],V[18],V[19],V[13] }, true ) );
-    return faces;
-}
+    m_faces.clear();
+    m_faces.push_back( PolyhedralFace({ V[ 0],V[ 1],V[ 7],V[ 6], V[ 9],V[10],V[ 4],V[ 3] }, true ));
+    m_faces.push_back( PolyhedralFace({ V[ 0],V[ 2],V[ 1] } ));
+    m_faces.push_back( PolyhedralFace({ V[ 3],V[ 4],V[ 5] } ));
+    m_faces.push_back( PolyhedralFace({ V[ 9],V[11],V[10] } ));
+    m_faces.push_back( PolyhedralFace({ V[ 6],V[ 7],V[ 8] } ));
+    m_faces.push_back( PolyhedralFace({ V[ 0],V[ 3],V[ 5],V[17], V[15],V[12],V[14],V[ 2] }, true ));
+    m_faces.push_back( PolyhedralFace({ V[ 4],V[10],V[11],V[23], V[22],V[16],V[17],V[ 5] }, true ));
+    m_faces.push_back( PolyhedralFace({ V[ 1],V[ 2],V[14],V[13], V[19],V[20],V[ 8],V[ 7] }, true ));
+    m_faces.push_back( PolyhedralFace({ V[ 6],V[ 8],V[20],V[18], V[21],V[23],V[11],V[ 9] }, true ));
+    m_faces.push_back( PolyhedralFace({ V[15],V[17],V[16] } ));
+    m_faces.push_back( PolyhedralFace({ V[12],V[13],V[14] } ));
+    m_faces.push_back( PolyhedralFace({ V[18],V[20],V[19] } ));
+    m_faces.push_back( PolyhedralFace({ V[21],V[22],V[23] } ));
+    m_faces.push_back( PolyhedralFace({ V[12],V[15],V[16],V[22], V[21],V[18],V[19],V[13] }, true ));
 
-void FormFactorTruncatedCube::init_parameters()
-{
-    clearParameterPool();
-    registerParameter(BornAgain::Length, &m_length);
-    registerParameter(BornAgain::RemovedLength, &m_removed_length);
+    m_z_origin = -m_length/2;
+    m_sym_Ci = true;
+
+    FormFactorPolyhedron::precompute();
 }
 
 FormFactorTruncatedCube* FormFactorTruncatedCube::clone() const
@@ -95,17 +104,3 @@ void FormFactorTruncatedCube::accept(ISampleVisitor *visitor) const
 {
     visitor->visit(this);
 }
-
-bool FormFactorTruncatedCube::check_initialization() const
-{
-    bool result(true);
-    if(m_removed_length > 0.5*m_length) {
-        std::ostringstream ostr;
-        ostr << "::FormFactorTruncatedCube() -> Error in class initialization ";
-        ostr << "with parameters 'length':" << m_length;
-        ostr << " 'removed_length':" << m_removed_length << "\n\n";
-        ostr << "Check for removed_length <= 0.5*length failed.";
-        throw Exceptions::ClassInitializationException(ostr.str());
-    }
-    return result;
-}
diff --git a/Core/FormFactors/FormFactorTruncatedCube.h b/Core/FormFactors/FormFactorTruncatedCube.h
index 2de65cfd142..fdb5a569026 100644
--- a/Core/FormFactors/FormFactorTruncatedCube.h
+++ b/Core/FormFactors/FormFactorTruncatedCube.h
@@ -25,13 +25,8 @@
 class BA_CORE_API_ FormFactorTruncatedCube : public FormFactorPolyhedron
 {
 public:
-    //! @brief Truncated cube constructor
-    //! @param side length of the full cube
-    //! @param side length of the trirectangular tetrahedron removed from each vertex of the cube
     FormFactorTruncatedCube(double length, double removed_length);
 
-    static std::vector<PolyhedralFace> polyhedral_faces(double length, double removed_length);
-
     virtual FormFactorTruncatedCube *clone() const final;
     virtual void accept(ISampleVisitor *visitor) const final;
 
@@ -39,9 +34,7 @@ public:
     double getRemovedLength() const { return m_removed_length; }
 
 private:
-    virtual bool check_initialization() const;
-    virtual void init_parameters();
-
+    virtual void onChange() final;
     double m_length;
     double m_removed_length;
 };
diff --git a/Core/PythonAPI/libBornAgainCore.py b/Core/PythonAPI/libBornAgainCore.py
index 4095d379dc4..d632920d698 100644
--- a/Core/PythonAPI/libBornAgainCore.py
+++ b/Core/PythonAPI/libBornAgainCore.py
@@ -8847,9 +8847,9 @@ class FormFactorCone6(FormFactorPolyhedron):
     __getattr__ = lambda self, name: _swig_getattr(self, FormFactorCone6, name)
     __repr__ = _swig_repr
 
-    def __init__(self, radius, height, alpha):
+    def __init__(self, base_edge, height, alpha):
         """
-        __init__(FormFactorCone6 self, double radius, double height, double alpha) -> FormFactorCone6
+        __init__(FormFactorCone6 self, double base_edge, double height, double alpha) -> FormFactorCone6
 
         FormFactorCone6::FormFactorCone6(double radius, double height, double alpha)
 
@@ -8868,20 +8868,12 @@ class FormFactorCone6(FormFactorPolyhedron):
         in radians between base and facet 
 
         """
-        this = _libBornAgainCore.new_FormFactorCone6(radius, height, alpha)
+        this = _libBornAgainCore.new_FormFactorCone6(base_edge, height, alpha)
         try:
             self.this.append(this)
         except:
             self.this = this
 
-    def polyhedral_faces(radius, height, alpha):
-        """polyhedral_faces(double radius, double height, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-        return _libBornAgainCore.FormFactorCone6_polyhedral_faces(radius, height, alpha)
-
-    if _newclass:
-        polyhedral_faces = staticmethod(polyhedral_faces)
-    __swig_getmethods__["polyhedral_faces"] = lambda x: polyhedral_faces
-
     def clone(self):
         """
         clone(FormFactorCone6 self) -> FormFactorCone6
@@ -8916,18 +8908,6 @@ class FormFactorCone6(FormFactorPolyhedron):
         return _libBornAgainCore.FormFactorCone6_getHeight(self)
 
 
-    def getRadius(self):
-        """
-        getRadius(FormFactorCone6 self) -> double
-
-        double FormFactorCone6::getRadius() const 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.FormFactorCone6_getRadius(self)
-
-
     def getAlpha(self):
         """
         getAlpha(FormFactorCone6 self) -> double
@@ -8942,10 +8922,6 @@ class FormFactorCone6(FormFactorPolyhedron):
 FormFactorCone6_swigregister = _libBornAgainCore.FormFactorCone6_swigregister
 FormFactorCone6_swigregister(FormFactorCone6)
 
-def FormFactorCone6_polyhedral_faces(radius, height, alpha):
-    """FormFactorCone6_polyhedral_faces(double radius, double height, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-    return _libBornAgainCore.FormFactorCone6_polyhedral_faces(radius, height, alpha)
-
 class FormFactorCrystal(IFormFactorBorn):
     """
 
@@ -9117,16 +9093,6 @@ class FormFactorCuboctahedron(FormFactorPolyhedron):
             self.this.append(this)
         except:
             self.this = this
-    __swig_destroy__ = _libBornAgainCore.delete_FormFactorCuboctahedron
-    __del__ = lambda self: None
-
-    def polyhedral_faces(length, height, height_ratio, alpha):
-        """polyhedral_faces(double length, double height, double height_ratio, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-        return _libBornAgainCore.FormFactorCuboctahedron_polyhedral_faces(length, height, height_ratio, alpha)
-
-    if _newclass:
-        polyhedral_faces = staticmethod(polyhedral_faces)
-    __swig_getmethods__["polyhedral_faces"] = lambda x: polyhedral_faces
 
     def clone(self):
         """
@@ -9152,16 +9118,14 @@ class FormFactorCuboctahedron(FormFactorPolyhedron):
         return _libBornAgainCore.FormFactorCuboctahedron_accept(self, visitor)
 
 
-    def getRadius(self):
+    def getLength(self):
         """
-        getRadius(FormFactorCuboctahedron self) -> double
-
-        double FormFactorCuboctahedron::getRadius() const final
+        getLength(FormFactorCuboctahedron self) -> double
 
-        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+        double FormFactorCuboctahedron::getLength() const 
 
         """
-        return _libBornAgainCore.FormFactorCuboctahedron_getRadius(self)
+        return _libBornAgainCore.FormFactorCuboctahedron_getLength(self)
 
 
     def getHeight(self):
@@ -9184,16 +9148,6 @@ class FormFactorCuboctahedron(FormFactorPolyhedron):
         return _libBornAgainCore.FormFactorCuboctahedron_getHeightRatio(self)
 
 
-    def getLength(self):
-        """
-        getLength(FormFactorCuboctahedron self) -> double
-
-        double FormFactorCuboctahedron::getLength() const 
-
-        """
-        return _libBornAgainCore.FormFactorCuboctahedron_getLength(self)
-
-
     def getAlpha(self):
         """
         getAlpha(FormFactorCuboctahedron self) -> double
@@ -9203,13 +9157,11 @@ class FormFactorCuboctahedron(FormFactorPolyhedron):
         """
         return _libBornAgainCore.FormFactorCuboctahedron_getAlpha(self)
 
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorCuboctahedron
+    __del__ = lambda self: None
 FormFactorCuboctahedron_swigregister = _libBornAgainCore.FormFactorCuboctahedron_swigregister
 FormFactorCuboctahedron_swigregister(FormFactorCuboctahedron)
 
-def FormFactorCuboctahedron_polyhedral_faces(length, height, height_ratio, alpha):
-    """FormFactorCuboctahedron_polyhedral_faces(double length, double height, double height_ratio, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-    return _libBornAgainCore.FormFactorCuboctahedron_polyhedral_faces(length, height, height_ratio, alpha)
-
 class FormFactorCylinder(IFormFactorBorn):
     """
 
@@ -10103,14 +10055,6 @@ class FormFactorIcosahedron(FormFactorPolyhedron):
         except:
             self.this = this
 
-    def polyhedral_faces(edge):
-        """polyhedral_faces(double edge) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-        return _libBornAgainCore.FormFactorIcosahedron_polyhedral_faces(edge)
-
-    if _newclass:
-        polyhedral_faces = staticmethod(polyhedral_faces)
-    __swig_getmethods__["polyhedral_faces"] = lambda x: polyhedral_faces
-
     def clone(self):
         """
         clone(FormFactorIcosahedron self) -> FormFactorIcosahedron
@@ -10135,18 +10079,6 @@ class FormFactorIcosahedron(FormFactorPolyhedron):
         return _libBornAgainCore.FormFactorIcosahedron_accept(self, visitor)
 
 
-    def getRadius(self):
-        """
-        getRadius(FormFactorIcosahedron self) -> double
-
-        double FormFactorIcosahedron::getRadius() const 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.FormFactorIcosahedron_getRadius(self)
-
-
     def getEdge(self):
         """
         getEdge(FormFactorIcosahedron self) -> double
@@ -10161,10 +10093,6 @@ class FormFactorIcosahedron(FormFactorPolyhedron):
 FormFactorIcosahedron_swigregister = _libBornAgainCore.FormFactorIcosahedron_swigregister
 FormFactorIcosahedron_swigregister(FormFactorIcosahedron)
 
-def FormFactorIcosahedron_polyhedral_faces(edge):
-    """FormFactorIcosahedron_polyhedral_faces(double edge) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-    return _libBornAgainCore.FormFactorIcosahedron_polyhedral_faces(edge)
-
 class FormFactorLongBoxGauss(IFormFactorBorn):
     """Proxy of C++ FormFactorLongBoxGauss class"""
     __swig_setmethods__ = {}
@@ -11330,14 +11258,6 @@ class FormFactorPyramid(FormFactorPolyhedron):
         except:
             self.this = this
 
-    def polyhedral_faces(length, height, alpha):
-        """polyhedral_faces(double length, double height, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-        return _libBornAgainCore.FormFactorPyramid_polyhedral_faces(length, height, alpha)
-
-    if _newclass:
-        polyhedral_faces = staticmethod(polyhedral_faces)
-    __swig_getmethods__["polyhedral_faces"] = lambda x: polyhedral_faces
-
     def clone(self):
         """
         clone(FormFactorPyramid self) -> FormFactorPyramid
@@ -11362,18 +11282,6 @@ class FormFactorPyramid(FormFactorPolyhedron):
         return _libBornAgainCore.FormFactorPyramid_accept(self, visitor)
 
 
-    def getRadius(self):
-        """
-        getRadius(FormFactorPyramid self) -> double
-
-        double FormFactorPyramid::getRadius() const 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.FormFactorPyramid_getRadius(self)
-
-
     def getHeight(self):
         """
         getHeight(FormFactorPyramid self) -> double
@@ -11408,10 +11316,6 @@ class FormFactorPyramid(FormFactorPolyhedron):
 FormFactorPyramid_swigregister = _libBornAgainCore.FormFactorPyramid_swigregister
 FormFactorPyramid_swigregister(FormFactorPyramid)
 
-def FormFactorPyramid_polyhedral_faces(length, height, alpha):
-    """FormFactorPyramid_polyhedral_faces(double length, double height, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-    return _libBornAgainCore.FormFactorPyramid_polyhedral_faces(length, height, alpha)
-
 class FormFactorRipple1(IFormFactorBorn):
     """
 
@@ -11996,16 +11900,6 @@ class FormFactorTetrahedron(FormFactorPolyhedron):
             self.this.append(this)
         except:
             self.this = this
-    __swig_destroy__ = _libBornAgainCore.delete_FormFactorTetrahedron
-    __del__ = lambda self: None
-
-    def polyhedral_faces(length, height, alpha):
-        """polyhedral_faces(double length, double height, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-        return _libBornAgainCore.FormFactorTetrahedron_polyhedral_faces(length, height, alpha)
-
-    if _newclass:
-        polyhedral_faces = staticmethod(polyhedral_faces)
-    __swig_getmethods__["polyhedral_faces"] = lambda x: polyhedral_faces
 
     def clone(self):
         """
@@ -12031,16 +11925,14 @@ class FormFactorTetrahedron(FormFactorPolyhedron):
         return _libBornAgainCore.FormFactorTetrahedron_accept(self, visitor)
 
 
-    def getRadius(self):
+    def getLength(self):
         """
-        getRadius(FormFactorTetrahedron self) -> double
-
-        double FormFactorTetrahedron::getRadius() const
+        getLength(FormFactorTetrahedron self) -> double
 
-        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+        double FormFactorTetrahedron::getLength() const 
 
         """
-        return _libBornAgainCore.FormFactorTetrahedron_getRadius(self)
+        return _libBornAgainCore.FormFactorTetrahedron_getLength(self)
 
 
     def getHeight(self):
@@ -12053,16 +11945,6 @@ class FormFactorTetrahedron(FormFactorPolyhedron):
         return _libBornAgainCore.FormFactorTetrahedron_getHeight(self)
 
 
-    def getLength(self):
-        """
-        getLength(FormFactorTetrahedron self) -> double
-
-        double FormFactorTetrahedron::getLength() const 
-
-        """
-        return _libBornAgainCore.FormFactorTetrahedron_getLength(self)
-
-
     def getAlpha(self):
         """
         getAlpha(FormFactorTetrahedron self) -> double
@@ -12072,13 +11954,11 @@ class FormFactorTetrahedron(FormFactorPolyhedron):
         """
         return _libBornAgainCore.FormFactorTetrahedron_getAlpha(self)
 
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorTetrahedron
+    __del__ = lambda self: None
 FormFactorTetrahedron_swigregister = _libBornAgainCore.FormFactorTetrahedron_swigregister
 FormFactorTetrahedron_swigregister(FormFactorTetrahedron)
 
-def FormFactorTetrahedron_polyhedral_faces(length, height, alpha):
-    """FormFactorTetrahedron_polyhedral_faces(double length, double height, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-    return _libBornAgainCore.FormFactorTetrahedron_polyhedral_faces(length, height, alpha)
-
 class FormFactorTrivial(IFormFactorBorn):
     """Proxy of C++ FormFactorTrivial class"""
     __swig_setmethods__ = {}
@@ -12216,14 +12096,6 @@ class FormFactorTruncatedCube(FormFactorPolyhedron):
         except:
             self.this = this
 
-    def polyhedral_faces(length, removed_length):
-        """polyhedral_faces(double length, double removed_length) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-        return _libBornAgainCore.FormFactorTruncatedCube_polyhedral_faces(length, removed_length)
-
-    if _newclass:
-        polyhedral_faces = staticmethod(polyhedral_faces)
-    __swig_getmethods__["polyhedral_faces"] = lambda x: polyhedral_faces
-
     def clone(self):
         """
         clone(FormFactorTruncatedCube self) -> FormFactorTruncatedCube
@@ -12248,18 +12120,6 @@ class FormFactorTruncatedCube(FormFactorPolyhedron):
         return _libBornAgainCore.FormFactorTruncatedCube_accept(self, visitor)
 
 
-    def getRadius(self):
-        """
-        getRadius(FormFactorTruncatedCube self) -> double
-
-        double FormFactorTruncatedCube::getRadius() const 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.FormFactorTruncatedCube_getRadius(self)
-
-
     def getLength(self):
         """
         getLength(FormFactorTruncatedCube self) -> double
@@ -12284,10 +12144,6 @@ class FormFactorTruncatedCube(FormFactorPolyhedron):
 FormFactorTruncatedCube_swigregister = _libBornAgainCore.FormFactorTruncatedCube_swigregister
 FormFactorTruncatedCube_swigregister(FormFactorTruncatedCube)
 
-def FormFactorTruncatedCube_polyhedral_faces(length, removed_length):
-    """FormFactorTruncatedCube_polyhedral_faces(double length, double removed_length) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"""
-    return _libBornAgainCore.FormFactorTruncatedCube_polyhedral_faces(length, removed_length)
-
 class FormFactorTruncatedSphere(IFormFactorBorn):
     """
 
diff --git a/Core/PythonAPI/libBornAgainCore_wrap.cxx b/Core/PythonAPI/libBornAgainCore_wrap.cxx
index c77f00fa7d1..dfc0b76c5c0 100644
--- a/Core/PythonAPI/libBornAgainCore_wrap.cxx
+++ b/Core/PythonAPI/libBornAgainCore_wrap.cxx
@@ -3649,23 +3649,22 @@ namespace Swig {
 #define SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t swig_types[231]
 #define SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t swig_types[232]
 #define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[233]
-#define SWIGTYPE_p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t swig_types[234]
-#define SWIGTYPE_p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t swig_types[235]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[236]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[237]
-#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[238]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[239]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[240]
-#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[241]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[242]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[243]
-#define SWIGTYPE_p_unsigned_char swig_types[244]
-#define SWIGTYPE_p_unsigned_int swig_types[245]
-#define SWIGTYPE_p_unsigned_long_long swig_types[246]
-#define SWIGTYPE_p_unsigned_short swig_types[247]
-#define SWIGTYPE_p_value_type swig_types[248]
-static swig_type_info *swig_types[250];
-static swig_module_info swig_module = {swig_types, 249, 0, 0, 0, 0};
+#define SWIGTYPE_p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t swig_types[234]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[235]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[236]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[237]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[238]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[239]
+#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[240]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[241]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[242]
+#define SWIGTYPE_p_unsigned_char swig_types[243]
+#define SWIGTYPE_p_unsigned_int swig_types[244]
+#define SWIGTYPE_p_unsigned_long_long swig_types[245]
+#define SWIGTYPE_p_unsigned_short swig_types[246]
+#define SWIGTYPE_p_value_type swig_types[247]
+static swig_type_info *swig_types[249];
+static swig_module_info swig_module = {swig_types, 248, 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)
 
@@ -51172,46 +51171,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorCone6_polyhedral_faces(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double arg3 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  SwigValueWrapper< std::vector< PolyhedralFace,std::allocator< PolyhedralFace > > > result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OOO:FormFactorCone6_polyhedral_faces",&obj0,&obj1,&obj2)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "FormFactorCone6_polyhedral_faces" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FormFactorCone6_polyhedral_faces" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FormFactorCone6_polyhedral_faces" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = FormFactorCone6::polyhedral_faces(arg1,arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >(static_cast< const std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >& >(result))), SWIGTYPE_p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorCone6_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
@@ -51286,28 +51245,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorCone6_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone6_getRadius",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone6, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone6_getRadius" "', argument " "1"" of type '" "FormFactorCone6 const *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorCone6 * >(argp1);
-  result = (double)((FormFactorCone6 const *)arg1)->getRadius();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorCone6_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
@@ -51653,76 +51590,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_FormFactorCuboctahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorCuboctahedron",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorCuboctahedron" "', argument " "1"" of type '" "FormFactorCuboctahedron *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_polyhedral_faces(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double arg3 ;
-  double arg4 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  double val4 ;
-  int ecode4 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  PyObject * obj3 = 0 ;
-  SwigValueWrapper< std::vector< PolyhedralFace,std::allocator< PolyhedralFace > > > result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OOOO:FormFactorCuboctahedron_polyhedral_faces",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "FormFactorCuboctahedron_polyhedral_faces" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FormFactorCuboctahedron_polyhedral_faces" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FormFactorCuboctahedron_polyhedral_faces" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  ecode4 = SWIG_AsVal_double(obj3, &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "FormFactorCuboctahedron_polyhedral_faces" "', argument " "4"" of type '" "double""'");
-  } 
-  arg4 = static_cast< double >(val4);
-  result = FormFactorCuboctahedron::polyhedral_faces(arg1,arg2,arg3,arg4);
-  resultobj = SWIG_NewPointerObj((new std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >(static_cast< const std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >& >(result))), SWIGTYPE_p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
@@ -51775,7 +51642,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
   void *argp1 = 0 ;
@@ -51783,13 +51650,13 @@ SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getRadius(PyObject *SWIGUNUSE
   PyObject * obj0 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_getRadius",&obj0)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_getLength",&obj0)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_getRadius" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_getLength" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
   }
   arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
-  result = (double)((FormFactorCuboctahedron const *)arg1)->getRadius();
+  result = (double)((FormFactorCuboctahedron const *)arg1)->getLength();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -51841,7 +51708,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
   void *argp1 = 0 ;
@@ -51849,13 +51716,13 @@ SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getLength(PyObject *SWIGUNUSE
   PyObject * obj0 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_getLength",&obj0)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_getAlpha",&obj0)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_getLength" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_getAlpha" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
   }
   arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
-  result = (double)((FormFactorCuboctahedron const *)arg1)->getLength();
+  result = (double)((FormFactorCuboctahedron const *)arg1)->getAlpha();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -51863,22 +51730,21 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_FormFactorCuboctahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_getAlpha",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorCuboctahedron",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_getAlpha" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorCuboctahedron" "', argument " "1"" of type '" "FormFactorCuboctahedron *""'"); 
   }
   arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
-  result = (double)((FormFactorCuboctahedron const *)arg1)->getAlpha();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
@@ -53594,28 +53460,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorIcosahedron_polyhedral_faces(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  PyObject * obj0 = 0 ;
-  SwigValueWrapper< std::vector< PolyhedralFace,std::allocator< PolyhedralFace > > > result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorIcosahedron_polyhedral_faces",&obj0)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "FormFactorIcosahedron_polyhedral_faces" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  result = FormFactorIcosahedron::polyhedral_faces(arg1);
-  resultobj = SWIG_NewPointerObj((new std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >(static_cast< const std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >& >(result))), SWIGTYPE_p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorIcosahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorIcosahedron *arg1 = (FormFactorIcosahedron *) 0 ;
@@ -53668,28 +53512,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorIcosahedron_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorIcosahedron *arg1 = (FormFactorIcosahedron *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorIcosahedron_getRadius",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorIcosahedron, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorIcosahedron_getRadius" "', argument " "1"" of type '" "FormFactorIcosahedron const *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorIcosahedron * >(argp1);
-  result = (double)((FormFactorIcosahedron const *)arg1)->getRadius();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorIcosahedron_getEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorIcosahedron *arg1 = (FormFactorIcosahedron *) 0 ;
@@ -55942,46 +55764,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPyramid_polyhedral_faces(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double arg3 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  SwigValueWrapper< std::vector< PolyhedralFace,std::allocator< PolyhedralFace > > > result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OOO:FormFactorPyramid_polyhedral_faces",&obj0,&obj1,&obj2)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "FormFactorPyramid_polyhedral_faces" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FormFactorPyramid_polyhedral_faces" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FormFactorPyramid_polyhedral_faces" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = FormFactorPyramid::polyhedral_faces(arg1,arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >(static_cast< const std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >& >(result))), SWIGTYPE_p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorPyramid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
@@ -56034,28 +55816,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorPyramid_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPyramid_getRadius",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPyramid, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPyramid_getRadius" "', argument " "1"" of type '" "FormFactorPyramid const *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorPyramid * >(argp1);
-  result = (double)((FormFactorPyramid const *)arg1)->getRadius();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorPyramid_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
@@ -57240,67 +57000,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_FormFactorTetrahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorTetrahedron",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorTetrahedron" "', argument " "1"" of type '" "FormFactorTetrahedron *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_polyhedral_faces(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double arg3 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  SwigValueWrapper< std::vector< PolyhedralFace,std::allocator< PolyhedralFace > > > result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OOO:FormFactorTetrahedron_polyhedral_faces",&obj0,&obj1,&obj2)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "FormFactorTetrahedron_polyhedral_faces" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FormFactorTetrahedron_polyhedral_faces" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FormFactorTetrahedron_polyhedral_faces" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = FormFactorTetrahedron::polyhedral_faces(arg1,arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >(static_cast< const std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >& >(result))), SWIGTYPE_p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
@@ -57353,7 +57052,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
   void *argp1 = 0 ;
@@ -57361,13 +57060,13 @@ SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getRadius(PyObject *SWIGUNUSEDP
   PyObject * obj0 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTetrahedron_getRadius",&obj0)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTetrahedron_getLength",&obj0)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_getRadius" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_getLength" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
   }
   arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
-  result = (double)((FormFactorTetrahedron const *)arg1)->getRadius();
+  result = (double)((FormFactorTetrahedron const *)arg1)->getLength();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -57397,7 +57096,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
   void *argp1 = 0 ;
@@ -57405,13 +57104,13 @@ SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getLength(PyObject *SWIGUNUSEDP
   PyObject * obj0 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTetrahedron_getLength",&obj0)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTetrahedron_getAlpha",&obj0)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_getLength" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_getAlpha" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
   }
   arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
-  result = (double)((FormFactorTetrahedron const *)arg1)->getLength();
+  result = (double)((FormFactorTetrahedron const *)arg1)->getAlpha();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -57419,22 +57118,21 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_FormFactorTetrahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTetrahedron_getAlpha",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorTetrahedron",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_getAlpha" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorTetrahedron" "', argument " "1"" of type '" "FormFactorTetrahedron *""'"); 
   }
   arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
-  result = (double)((FormFactorTetrahedron const *)arg1)->getAlpha();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
@@ -57633,37 +57331,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorTruncatedCube_polyhedral_faces(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  SwigValueWrapper< std::vector< PolyhedralFace,std::allocator< PolyhedralFace > > > result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorTruncatedCube_polyhedral_faces",&obj0,&obj1)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(obj0, &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "FormFactorTruncatedCube_polyhedral_faces" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FormFactorTruncatedCube_polyhedral_faces" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = FormFactorTruncatedCube::polyhedral_faces(arg1,arg2);
-  resultobj = SWIG_NewPointerObj((new std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >(static_cast< const std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >& >(result))), SWIGTYPE_p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorTruncatedCube_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTruncatedCube *arg1 = (FormFactorTruncatedCube *) 0 ;
@@ -57716,28 +57383,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_FormFactorTruncatedCube_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  FormFactorTruncatedCube *arg1 = (FormFactorTruncatedCube *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedCube_getRadius",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedCube, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedCube_getRadius" "', argument " "1"" of type '" "FormFactorTruncatedCube const *""'"); 
-  }
-  arg1 = reinterpret_cast< FormFactorTruncatedCube * >(argp1);
-  result = (double)((FormFactorTruncatedCube const *)arg1)->getRadius();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_FormFactorTruncatedCube_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTruncatedCube *arg1 = (FormFactorTruncatedCube *) 0 ;
@@ -94037,7 +93682,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { (char *)"FormFactorCone_swigregister", FormFactorCone_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_FormFactorCone6", _wrap_new_FormFactorCone6, METH_VARARGS, (char *)"\n"
-		"new_FormFactorCone6(double radius, double height, double alpha) -> FormFactorCone6\n"
+		"new_FormFactorCone6(double base_edge, double height, double alpha) -> FormFactorCone6\n"
 		"\n"
 		"FormFactorCone6::FormFactorCone6(double radius, double height, double alpha)\n"
 		"\n"
@@ -94056,7 +93701,6 @@ static PyMethodDef SwigMethods[] = {
 		"in radians between base and facet \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorCone6_polyhedral_faces", _wrap_FormFactorCone6_polyhedral_faces, METH_VARARGS, (char *)"FormFactorCone6_polyhedral_faces(double radius, double height, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"},
 	 { (char *)"FormFactorCone6_clone", _wrap_FormFactorCone6_clone, METH_VARARGS, (char *)"\n"
 		"FormFactorCone6_clone(FormFactorCone6 self) -> FormFactorCone6\n"
 		"\n"
@@ -94079,14 +93723,6 @@ static PyMethodDef SwigMethods[] = {
 		"double FormFactorCone6::getHeight() const \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorCone6_getRadius", _wrap_FormFactorCone6_getRadius, METH_VARARGS, (char *)"\n"
-		"FormFactorCone6_getRadius(FormFactorCone6 self) -> double\n"
-		"\n"
-		"double FormFactorCone6::getRadius() const 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"
-		""},
 	 { (char *)"FormFactorCone6_getAlpha", _wrap_FormFactorCone6_getAlpha, METH_VARARGS, (char *)"\n"
 		"FormFactorCone6_getAlpha(FormFactorCone6 self) -> double\n"
 		"\n"
@@ -94194,13 +93830,6 @@ static PyMethodDef SwigMethods[] = {
 		"in radians between base and facet \n"
 		"\n"
 		""},
-	 { (char *)"delete_FormFactorCuboctahedron", _wrap_delete_FormFactorCuboctahedron, METH_VARARGS, (char *)"\n"
-		"delete_FormFactorCuboctahedron(FormFactorCuboctahedron self)\n"
-		"\n"
-		"virtual FormFactorCuboctahedron::~FormFactorCuboctahedron()\n"
-		"\n"
-		""},
-	 { (char *)"FormFactorCuboctahedron_polyhedral_faces", _wrap_FormFactorCuboctahedron_polyhedral_faces, METH_VARARGS, (char *)"FormFactorCuboctahedron_polyhedral_faces(double length, double height, double height_ratio, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"},
 	 { (char *)"FormFactorCuboctahedron_clone", _wrap_FormFactorCuboctahedron_clone, METH_VARARGS, (char *)"\n"
 		"FormFactorCuboctahedron_clone(FormFactorCuboctahedron self) -> FormFactorCuboctahedron\n"
 		"\n"
@@ -94217,12 +93846,10 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorCuboctahedron_getRadius", _wrap_FormFactorCuboctahedron_getRadius, METH_VARARGS, (char *)"\n"
-		"FormFactorCuboctahedron_getRadius(FormFactorCuboctahedron self) -> double\n"
-		"\n"
-		"double FormFactorCuboctahedron::getRadius() const final\n"
+	 { (char *)"FormFactorCuboctahedron_getLength", _wrap_FormFactorCuboctahedron_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorCuboctahedron_getLength(FormFactorCuboctahedron self) -> double\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"
+		"double FormFactorCuboctahedron::getLength() const \n"
 		"\n"
 		""},
 	 { (char *)"FormFactorCuboctahedron_getHeight", _wrap_FormFactorCuboctahedron_getHeight, METH_VARARGS, (char *)"\n"
@@ -94237,18 +93864,18 @@ static PyMethodDef SwigMethods[] = {
 		"double FormFactorCuboctahedron::getHeightRatio() const \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorCuboctahedron_getLength", _wrap_FormFactorCuboctahedron_getLength, METH_VARARGS, (char *)"\n"
-		"FormFactorCuboctahedron_getLength(FormFactorCuboctahedron self) -> double\n"
-		"\n"
-		"double FormFactorCuboctahedron::getLength() const \n"
-		"\n"
-		""},
 	 { (char *)"FormFactorCuboctahedron_getAlpha", _wrap_FormFactorCuboctahedron_getAlpha, METH_VARARGS, (char *)"\n"
 		"FormFactorCuboctahedron_getAlpha(FormFactorCuboctahedron self) -> double\n"
 		"\n"
 		"double FormFactorCuboctahedron::getAlpha() const \n"
 		"\n"
 		""},
+	 { (char *)"delete_FormFactorCuboctahedron", _wrap_delete_FormFactorCuboctahedron, METH_VARARGS, (char *)"\n"
+		"delete_FormFactorCuboctahedron(FormFactorCuboctahedron self)\n"
+		"\n"
+		"virtual FormFactorCuboctahedron::~FormFactorCuboctahedron()\n"
+		"\n"
+		""},
 	 { (char *)"FormFactorCuboctahedron_swigregister", FormFactorCuboctahedron_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_FormFactorCylinder", _wrap_new_FormFactorCylinder, METH_VARARGS, (char *)"\n"
 		"new_FormFactorCylinder(double radius, double height) -> FormFactorCylinder\n"
@@ -94762,7 +94389,6 @@ static PyMethodDef SwigMethods[] = {
 		"length \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorIcosahedron_polyhedral_faces", _wrap_FormFactorIcosahedron_polyhedral_faces, METH_VARARGS, (char *)"FormFactorIcosahedron_polyhedral_faces(double edge) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"},
 	 { (char *)"FormFactorIcosahedron_clone", _wrap_FormFactorIcosahedron_clone, METH_VARARGS, (char *)"\n"
 		"FormFactorIcosahedron_clone(FormFactorIcosahedron self) -> FormFactorIcosahedron\n"
 		"\n"
@@ -94779,14 +94405,6 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorIcosahedron_getRadius", _wrap_FormFactorIcosahedron_getRadius, METH_VARARGS, (char *)"\n"
-		"FormFactorIcosahedron_getRadius(FormFactorIcosahedron self) -> double\n"
-		"\n"
-		"double FormFactorIcosahedron::getRadius() const 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"
-		""},
 	 { (char *)"FormFactorIcosahedron_getEdge", _wrap_FormFactorIcosahedron_getEdge, METH_VARARGS, (char *)"\n"
 		"FormFactorIcosahedron_getEdge(FormFactorIcosahedron self) -> double\n"
 		"\n"
@@ -95466,7 +95084,6 @@ static PyMethodDef SwigMethods[] = {
 		"in radians between base and facet \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorPyramid_polyhedral_faces", _wrap_FormFactorPyramid_polyhedral_faces, METH_VARARGS, (char *)"FormFactorPyramid_polyhedral_faces(double length, double height, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"},
 	 { (char *)"FormFactorPyramid_clone", _wrap_FormFactorPyramid_clone, METH_VARARGS, (char *)"\n"
 		"FormFactorPyramid_clone(FormFactorPyramid self) -> FormFactorPyramid\n"
 		"\n"
@@ -95483,14 +95100,6 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorPyramid_getRadius", _wrap_FormFactorPyramid_getRadius, METH_VARARGS, (char *)"\n"
-		"FormFactorPyramid_getRadius(FormFactorPyramid self) -> double\n"
-		"\n"
-		"double FormFactorPyramid::getRadius() const 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"
-		""},
 	 { (char *)"FormFactorPyramid_getHeight", _wrap_FormFactorPyramid_getHeight, METH_VARARGS, (char *)"\n"
 		"FormFactorPyramid_getHeight(FormFactorPyramid self) -> double\n"
 		"\n"
@@ -95847,13 +95456,6 @@ static PyMethodDef SwigMethods[] = {
 		"in radians between base and facet \n"
 		"\n"
 		""},
-	 { (char *)"delete_FormFactorTetrahedron", _wrap_delete_FormFactorTetrahedron, METH_VARARGS, (char *)"\n"
-		"delete_FormFactorTetrahedron(FormFactorTetrahedron self)\n"
-		"\n"
-		"FormFactorTetrahedron::~FormFactorTetrahedron()\n"
-		"\n"
-		""},
-	 { (char *)"FormFactorTetrahedron_polyhedral_faces", _wrap_FormFactorTetrahedron_polyhedral_faces, METH_VARARGS, (char *)"FormFactorTetrahedron_polyhedral_faces(double length, double height, double alpha) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"},
 	 { (char *)"FormFactorTetrahedron_clone", _wrap_FormFactorTetrahedron_clone, METH_VARARGS, (char *)"\n"
 		"FormFactorTetrahedron_clone(FormFactorTetrahedron self) -> FormFactorTetrahedron\n"
 		"\n"
@@ -95870,12 +95472,10 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorTetrahedron_getRadius", _wrap_FormFactorTetrahedron_getRadius, METH_VARARGS, (char *)"\n"
-		"FormFactorTetrahedron_getRadius(FormFactorTetrahedron self) -> double\n"
-		"\n"
-		"double FormFactorTetrahedron::getRadius() const\n"
+	 { (char *)"FormFactorTetrahedron_getLength", _wrap_FormFactorTetrahedron_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorTetrahedron_getLength(FormFactorTetrahedron self) -> double\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"
+		"double FormFactorTetrahedron::getLength() const \n"
 		"\n"
 		""},
 	 { (char *)"FormFactorTetrahedron_getHeight", _wrap_FormFactorTetrahedron_getHeight, METH_VARARGS, (char *)"\n"
@@ -95884,18 +95484,18 @@ static PyMethodDef SwigMethods[] = {
 		"double FormFactorTetrahedron::getHeight() const \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorTetrahedron_getLength", _wrap_FormFactorTetrahedron_getLength, METH_VARARGS, (char *)"\n"
-		"FormFactorTetrahedron_getLength(FormFactorTetrahedron self) -> double\n"
-		"\n"
-		"double FormFactorTetrahedron::getLength() const \n"
-		"\n"
-		""},
 	 { (char *)"FormFactorTetrahedron_getAlpha", _wrap_FormFactorTetrahedron_getAlpha, METH_VARARGS, (char *)"\n"
 		"FormFactorTetrahedron_getAlpha(FormFactorTetrahedron self) -> double\n"
 		"\n"
 		"double FormFactorTetrahedron::getAlpha() const \n"
 		"\n"
 		""},
+	 { (char *)"delete_FormFactorTetrahedron", _wrap_delete_FormFactorTetrahedron, METH_VARARGS, (char *)"\n"
+		"delete_FormFactorTetrahedron(FormFactorTetrahedron self)\n"
+		"\n"
+		"FormFactorTetrahedron::~FormFactorTetrahedron()\n"
+		"\n"
+		""},
 	 { (char *)"FormFactorTetrahedron_swigregister", FormFactorTetrahedron_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_FormFactorTrivial", _wrap_new_FormFactorTrivial, METH_VARARGS, (char *)"\n"
 		"new_FormFactorTrivial() -> FormFactorTrivial\n"
@@ -95971,7 +95571,6 @@ static PyMethodDef SwigMethods[] = {
 		"length of the trirectangular tetrahedron removed from each vertex of the cube \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorTruncatedCube_polyhedral_faces", _wrap_FormFactorTruncatedCube_polyhedral_faces, METH_VARARGS, (char *)"FormFactorTruncatedCube_polyhedral_faces(double length, double removed_length) -> std::vector< PolyhedralFace,std::allocator< PolyhedralFace > >"},
 	 { (char *)"FormFactorTruncatedCube_clone", _wrap_FormFactorTruncatedCube_clone, METH_VARARGS, (char *)"\n"
 		"FormFactorTruncatedCube_clone(FormFactorTruncatedCube self) -> FormFactorTruncatedCube\n"
 		"\n"
@@ -95988,14 +95587,6 @@ static PyMethodDef SwigMethods[] = {
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
 		""},
-	 { (char *)"FormFactorTruncatedCube_getRadius", _wrap_FormFactorTruncatedCube_getRadius, METH_VARARGS, (char *)"\n"
-		"FormFactorTruncatedCube_getRadius(FormFactorTruncatedCube self) -> double\n"
-		"\n"
-		"double FormFactorTruncatedCube::getRadius() const 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"
-		""},
 	 { (char *)"FormFactorTruncatedCube_getLength", _wrap_FormFactorTruncatedCube_getLength, METH_VARARGS, (char *)"\n"
 		"FormFactorTruncatedCube_getLength(FormFactorTruncatedCube self) -> double\n"
 		"\n"
@@ -103677,7 +103268,6 @@ static swig_type_info _swigt__p_std__vectorT_IParticle_const_p_std__allocatorT_I
 static swig_type_info _swigt__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t = {"_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t", "std::vector< ISample const *,std::allocator< ISample const * > > *|std::vector< ISample const * > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t = {"_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t", "std::vector< ISample *,std::allocator< ISample * > > *|std::vector< ISample * > *", 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 > > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t = {"_p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t", "std::vector< PolyhedralFace,std::allocator< PolyhedralFace > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t = {"_p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t", "std::vector< RealParameterWrapper,std::allocator< RealParameterWrapper > > *", 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 > > *|vdouble1d_t *|std::vector< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
@@ -103928,7 +103518,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t,
   &_swigt__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t,
   &_swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t,
-  &_swigt__p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t,
   &_swigt__p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t,
   &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
   &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
@@ -104179,7 +103768,6 @@ static swig_cast_info _swigc__p_std__vectorT_IParticle_const_p_std__allocatorT_I
 static swig_cast_info _swigc__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t[] = {  {&_swigt__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t[] = {  {&_swigt__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_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_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t[] = {  {&_swigt__p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t[] = {  {&_swigt__p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_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}};
 static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = {  {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -104430,7 +104018,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t,
   _swigc__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t,
   _swigc__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t,
-  _swigc__p_std__vectorT_PolyhedralFace_std__allocatorT_PolyhedralFace_t_t,
   _swigc__p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t,
   _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
   _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
diff --git a/Core/Tools/BornAgainNamespace.h b/Core/Tools/BornAgainNamespace.h
index 123516341a2..670545e84fd 100644
--- a/Core/Tools/BornAgainNamespace.h
+++ b/Core/Tools/BornAgainNamespace.h
@@ -156,6 +156,7 @@ const std::string MeanRadius = "MeanRadius";
 const std::string SigmaRadius = "SigmaRadius";
 const std::string FullWidth = "FullWidth";
 const std::string Edge = "Edge";
+const std::string BaseEdge = "BaseEdge";
 const std::string Length = "Length";
 const std::string RemovedLength = "RemovedLength";
 const std::string Width = "Width";
diff --git a/Core/Tools/IParameterized.h b/Core/Tools/IParameterized.h
index 12889b85fd4..c7cbc42060d 100644
--- a/Core/Tools/IParameterized.h
+++ b/Core/Tools/IParameterized.h
@@ -61,7 +61,7 @@ public:
 
 protected:
     //! Action to be taken in inherited class when a parameter has changed.
-    virtual void onChange() { std::cerr << "DEBUG: IPar'ed::onChange\n"; }
+    virtual void onChange() {}
 
     //! Prints a representation of this IParameterized object to the given output stream.
     //! default implementation prints "IParameterized:" and the parameter pool
diff --git a/Doc/UserManual/FormFactors.tex b/Doc/UserManual/FormFactors.tex
index a292c65661e..3806f97f1a8 100644
--- a/Doc/UserManual/FormFactors.tex
+++ b/Doc/UserManual/FormFactors.tex
@@ -498,13 +498,13 @@ except for a substitution $z\to\rho$ in our expression for~$F$.
 \FloatBarrier
 \paragraph{Syntax and parameters}\strut\\[-2ex plus .2ex minus .2ex]
 \begin{lstlisting}
-  FormFactorCone6(radius,height, alpha)
+  FormFactorCone6(base_edge,height, alpha)
 \end{lstlisting}
 with the parameters
 \begin{itemize}
-\item \texttt{radius} of the regular hexagonal base, $R$,
+\item \texttt{base\_edge}, edge of the regular hexagonal base, $R$,
 \item \texttt{height}, $H$,
-\item \texttt{alpha}, between the base and a side face, $\alpha$.
+\item \texttt{alpha}, dihedral angle between the base and a side face, $\alpha$.
 \end{itemize}
 Note that the orthographic projection does not show~$\alpha$,
 but the angle~$\beta$ between the base and a side edge.
diff --git a/dev-tools/ad-hoc/JWu/dode_test.py b/dev-tools/ad-hoc/JWu/par_changed.py
similarity index 75%
rename from dev-tools/ad-hoc/JWu/dode_test.py
rename to dev-tools/ad-hoc/JWu/par_changed.py
index d6611589dbc..131d6174428 100644
--- a/dev-tools/ad-hoc/JWu/dode_test.py
+++ b/dev-tools/ad-hoc/JWu/par_changed.py
@@ -12,18 +12,17 @@ n    = 3
 results = []
 edge = 30
 
-title = 'face normal'
+title = 'E=30'
 trafo = ba.RotationY(26.5651*degree)
-ff = ba.FormFactorDodecahedron(edge*nanometer)
+ff = ba.FormFactorPrism3(edge*nanometer,20*nanometer)
 data = bp.run_simulation(det,ff,trafo)
 results.append( bp.Result(0, data, title) )
 
 pool = ff.getParameterPool()
 print( pool.getParameterNames() )
-pool.setParameterValue('Edge', 10)
+pool.setParameterValue('Length', 10 )
 
-title = 'vertex normal'
-ff = ba.FormFactorDodecahedron(edge*nanometer)
+title = 'E=10'
 data = bp.run_simulation(det,ff,trafo)
 results.append( bp.Result(1, data, title) )
 
-- 
GitLab