diff --git a/Core/Aggregate/FTDecay1D.cpp b/Core/Aggregate/FTDecay1D.cpp
index 4cabbbcb682e8cff0f70125ca59efe2ee31afac5..7a7ebcedba0e57afd21ef5b91b5b387a584df423 100644
--- a/Core/Aggregate/FTDecay1D.cpp
+++ b/Core/Aggregate/FTDecay1D.cpp
@@ -13,28 +13,24 @@
 // ************************************************************************** //
 
 #include "Core/Aggregate/FTDecay1D.h"
-#include "Core/Basics/Algorithms.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Parametrization/ParameterPool.h"
 #include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 #include <algorithm>
 
-using algo::concat;
-
 IFTDecayFunction1D::IFTDecayFunction1D(double decay_length) : m_decay_length(decay_length)
 {
     registerParameter("DecayLength", &m_decay_length);
 }
 
-IFTDecayFunction1D::IFTDecayFunction1D(const INode* parent, const std::vector<const char*>& PName,
-                                       const std::vector<const char*>& PUnit,
-                                       const std::vector<double>& PMin,
-                                       const std::vector<double>& PMax,
-                                       const std::vector<double>& /*PDefault*/,
-                                       const std::vector<double>& P)
-    : INode(parent, concat({"DecayLength"}, PName), concat({"nm"}, PUnit), concat({0}, PMin),
-            concat({INF}, PMax), {}, P)
+IFTDecayFunction1D::IFTDecayFunction1D(const NodeMeta& meta, const std::vector<double>& PValues)
+    : INode(nodeMetaUnion(
+                {
+                    {"DecayLength", "nm", "Half-width", 0, INF, 1.},
+                },
+                meta),
+            PValues)
 {
 }
 
diff --git a/Core/Aggregate/FTDecay1D.h b/Core/Aggregate/FTDecay1D.h
index 4a03d064909c8f308a35f4b1385476554fb77b38..4f50b54d513cfb3e5027b086ca99feaf24822794 100644
--- a/Core/Aggregate/FTDecay1D.h
+++ b/Core/Aggregate/FTDecay1D.h
@@ -30,10 +30,7 @@ public:
     //! Constructor of one-dimensional decay function.
     //! @param decay_length: half-width of the distribution in nanometers
     IFTDecayFunction1D(double decay_length);
-    IFTDecayFunction1D(const INode* parent, const std::vector<const char*>& PName,
-                       const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                       const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                       const std::vector<double>& P);
+    IFTDecayFunction1D(const NodeMeta& meta, const std::vector<double>& PValues);
 
     virtual IFTDecayFunction1D* clone() const = 0;
     virtual double evaluate(double q) const = 0;
diff --git a/Core/Aggregate/FTDecay2D.cpp b/Core/Aggregate/FTDecay2D.cpp
index f04d4555aae6598e8d5cde0363ab030bc36920cd..14c3dc9e70ad1213e8dc81cf0ebb2103782fedf5 100644
--- a/Core/Aggregate/FTDecay2D.cpp
+++ b/Core/Aggregate/FTDecay2D.cpp
@@ -13,15 +13,12 @@
 // ************************************************************************** //
 
 #include "Core/Aggregate/FTDecay2D.h"
-#include "Core/Basics/Algorithms.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Parametrization/ParameterPool.h"
 #include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 #include <algorithm>
 
-using algo::concat;
-
 //! Constructor of two-dimensional decay function in reciprocal space.
 //! @param decay_length_x: the decay length in nanometers along x-axis of the distribution
 //! @param decay_length_y: the decay length in nanometers along y-axis of the distribution
@@ -35,15 +32,13 @@ IFTDecayFunction2D::IFTDecayFunction2D(double decay_length_x, double decay_lengt
     registerParameter("Gamma", &m_gamma).setUnit("rad").setLimited(-M_PI_2, M_PI_2);
 }
 
-IFTDecayFunction2D::IFTDecayFunction2D(const INode* parent, const std::vector<const char*>& PName,
-                                       const std::vector<const char*>& PUnit,
-                                       const std::vector<double>& PMin,
-                                       const std::vector<double>& PMax,
-                                       const std::vector<double>& /*PDefault*/,
-                                       const std::vector<double>& P)
-    : INode(parent, concat({"DecayLengthX", "DecayLengthY", "Gamma"}, PName),
-            concat({"nm", "nm", "rad"}, PUnit), concat({0, 0, -M_PI_2}, PMin),
-            concat({INF, INF, +M_PI_2}, PMax), {}, P)
+IFTDecayFunction2D::IFTDecayFunction2D(const NodeMeta& meta, const std::vector<double>& PValues)
+    : INode(nodeMetaUnion({{"DecayLengthX", "nm", "Half-width along x axis", 0, INF, 1.},
+                           {"DecayLengthY", "nm", "Half-width along y axis", 0, INF, 1.},
+                           {"Gamma", "rad", "orientation with respect to the first lattice vector",
+                            -M_PI_2, +M_PI_2, 0}},
+                          meta),
+            PValues)
 {
 }
 
diff --git a/Core/Aggregate/FTDecay2D.h b/Core/Aggregate/FTDecay2D.h
index c1d61e30eb2b083a48acb66dd06b3b6ed5129c82..35582e311bbd3a431f33ad8386fb24ccd8ecf6d1 100644
--- a/Core/Aggregate/FTDecay2D.h
+++ b/Core/Aggregate/FTDecay2D.h
@@ -26,10 +26,7 @@ class BA_CORE_API_ IFTDecayFunction2D : public ICloneable, public INode
 {
 public:
     IFTDecayFunction2D(double decay_length_x, double decay_length_y, double gamma);
-    IFTDecayFunction2D(const INode* parent, const std::vector<const char*>& PName,
-                       const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                       const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                       const std::vector<double>& P);
+    IFTDecayFunction2D(const NodeMeta& meta, const std::vector<double>& PValues);
 
     virtual IFTDecayFunction2D* clone() const = 0;
 
diff --git a/Core/Aggregate/FTDistributions1D.cpp b/Core/Aggregate/FTDistributions1D.cpp
index 65e2ff6758b17c5c356bfbf93c9e18e434e4a86a..9729236120f39664088cfce823bf552057111b42 100644
--- a/Core/Aggregate/FTDistributions1D.cpp
+++ b/Core/Aggregate/FTDistributions1D.cpp
@@ -13,7 +13,6 @@
 // ************************************************************************** //
 
 #include "Core/Aggregate/FTDistributions1D.h"
-#include "Core/Basics/Algorithms.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Parametrization/ParameterPool.h"
@@ -21,8 +20,6 @@
 #include "Core/Tools/MathFunctions.h"
 #include <limits>
 
-using algo::concat;
-
 namespace
 {
 const double CosineDistributionFactor = 1.0 / 3.0 - 2.0 / M_PI / M_PI;
@@ -33,14 +30,8 @@ IFTDistribution1D::IFTDistribution1D(double omega) : m_omega(omega)
     registerParameter("Omega", &m_omega);
 }
 
-IFTDistribution1D::IFTDistribution1D(const INode* parent, const std::vector<const char*>& PName,
-                                     const std::vector<const char*>& PUnit,
-                                     const std::vector<double>& PMin,
-                                     const std::vector<double>& PMax,
-                                     const std::vector<double>& /*PDefault*/,
-                                     const std::vector<double>& P)
-    : INode(parent, concat({"DecayLength"}, PName), concat({"nm"}, PUnit), concat({0}, PMin),
-            concat({INF}, PMax), {}, P)
+IFTDistribution1D::IFTDistribution1D(const NodeMeta& meta, const std::vector<double>& PValues)
+    : INode(nodeMetaUnion({{"Omega", "nm", "Half-width", 0, INF, 1.}}, meta), PValues)
 {
 }
 
diff --git a/Core/Aggregate/FTDistributions1D.h b/Core/Aggregate/FTDistributions1D.h
index 381f84f1545708b2f46fd6b065038aa76a630d03..691685936fbdafd48c0ae6ee3721213de21996e9 100644
--- a/Core/Aggregate/FTDistributions1D.h
+++ b/Core/Aggregate/FTDistributions1D.h
@@ -29,10 +29,7 @@ public:
     //! Constructor of one-dimensional probability distribution.
     //! @param omega: half-width of the distribution in nanometers
     IFTDistribution1D(double omega);
-    IFTDistribution1D(const INode* parent, const std::vector<const char*>& PName,
-                      const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                      const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                      const std::vector<double>& P);
+    IFTDistribution1D(const NodeMeta& meta, const std::vector<double>& PValues);
 
     virtual IFTDistribution1D* clone() const = 0;
 
diff --git a/Core/Aggregate/FTDistributions2D.cpp b/Core/Aggregate/FTDistributions2D.cpp
index 39f0af61937b3496f89f346dbe8f29639dd79490..6f0a6f07728d8378fc2ff2e4a16c8ed0470bae79 100644
--- a/Core/Aggregate/FTDistributions2D.cpp
+++ b/Core/Aggregate/FTDistributions2D.cpp
@@ -36,14 +36,14 @@ IFTDistribution2D::IFTDistribution2D(double omega_x, double omega_y, double gamm
     registerParameter("Gamma", &m_gamma).setUnit("rad").setLimited(-M_PI_2, M_PI_2);
 }
 
-IFTDistribution2D::IFTDistribution2D(const INode* parent, const std::vector<const char*>& PName,
-                                     const std::vector<const char*>& PUnit,
-                                     const std::vector<double>& PMin,
-                                     const std::vector<double>& PMax,
-                                     const std::vector<double>& /*PDefault*/,
-                                     const std::vector<double>& P)
-    : INode(parent, concat({"DecayLength"}, PName), concat({"nm"}, PUnit), concat({0}, PMin),
-            concat({INF}, PMax), {}, P)
+IFTDistribution2D::IFTDistribution2D(const NodeMeta& meta, const std::vector<double>& PValues)
+    : INode(nodeMetaUnion({{"OmegaX", "nm", "Half-width along x axis", 0, INF, 1.},
+                           {"OmegaY", "nm", "Half-width along y axis", 0, INF, 1.},
+                           {"Gamma", "rad",
+                            "direct-space orientation with respect to the first lattice vector",
+                            -M_PI_2, +M_PI_2, 0}},
+                          meta),
+            PValues)
 {
 }
 
diff --git a/Core/Aggregate/FTDistributions2D.h b/Core/Aggregate/FTDistributions2D.h
index 566356390c88625fc4d8db13899e7fb1a3440482..825d5add10517ce8b64b5145431a1bd448b81280 100644
--- a/Core/Aggregate/FTDistributions2D.h
+++ b/Core/Aggregate/FTDistributions2D.h
@@ -28,10 +28,7 @@ class BA_CORE_API_ IFTDistribution2D : public ICloneable, public INode
 {
 public:
     IFTDistribution2D(double omega_x, double omega_y, double gamma);
-    IFTDistribution2D(const INode* parent, const std::vector<const char*>& PName,
-                      const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                      const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                      const std::vector<double>& P);
+    IFTDistribution2D(const NodeMeta& meta, const std::vector<double>& PValues);
 
     IFTDistribution2D* clone() const = 0;
 
diff --git a/Core/Detector/IResolutionFunction2D.cpp b/Core/Detector/IResolutionFunction2D.cpp
index 1bd40d3d5fb7c5422d25bee6ca61d3f1bae59d91..07022757157ce23686a3ecaffce8251418dddc9e 100644
--- a/Core/Detector/IResolutionFunction2D.cpp
+++ b/Core/Detector/IResolutionFunction2D.cpp
@@ -14,13 +14,8 @@
 
 #include "Core/Detector/IResolutionFunction2D.h"
 
-IResolutionFunction2D::IResolutionFunction2D(const INode* parent,
-                                             const std::vector<const char*>& PName,
-                                             const std::vector<const char*>& PUnit,
-                                             const std::vector<double>& PMin,
-                                             const std::vector<double>& PMax,
-                                             const std::vector<double>& PDefault,
-                                             const std::vector<double>& P)
-    : INode{parent, PName, PUnit, PMin, PMax, PDefault, P}
+IResolutionFunction2D::IResolutionFunction2D(const NodeMeta& meta,
+                                             const std::vector<double>& PValues)
+    : INode(meta, PValues)
 {
 }
diff --git a/Core/Detector/IResolutionFunction2D.h b/Core/Detector/IResolutionFunction2D.h
index 45fb36d8ba1781ead497d0e7b20f78605cd84634..f97ceb2b71851cee30dc0ad78e156e09d4fc2343 100644
--- a/Core/Detector/IResolutionFunction2D.h
+++ b/Core/Detector/IResolutionFunction2D.h
@@ -25,10 +25,7 @@ class BA_CORE_API_ IResolutionFunction2D : public ICloneable, public INode
 {
 public:
     IResolutionFunction2D() = default;
-    IResolutionFunction2D(const INode* parent, const std::vector<const char*>& PName,
-                          const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                          const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                          const std::vector<double>& P);
+    IResolutionFunction2D(const NodeMeta& meta, const std::vector<double>& PValues);
 
     virtual ~IResolutionFunction2D() {}
 
diff --git a/Core/HardParticle/FormFactorPolyhedron.cpp b/Core/HardParticle/FormFactorPolyhedron.cpp
index e723a31007b7592b205eddf406f90bec1a9e5104..ab3cda4e776a021a8d201682047e52edfdeae55d 100644
--- a/Core/HardParticle/FormFactorPolyhedron.cpp
+++ b/Core/HardParticle/FormFactorPolyhedron.cpp
@@ -420,14 +420,8 @@ void FormFactorPolyhedron::setLimits(double _q, int _n)
 }
 #endif
 
-FormFactorPolyhedron::FormFactorPolyhedron(const INode* parent,
-                                           const std::vector<const char*>& PName,
-                                           const std::vector<const char*>& PUnit,
-                                           const std::vector<double>& PMin,
-                                           const std::vector<double>& PMax,
-                                           const std::vector<double>& PDefault,
-                                           const std::vector<double>& P)
-    : IFormFactorBorn{parent, PName, PUnit, PMin, PMax, PDefault, P}
+FormFactorPolyhedron::FormFactorPolyhedron(const NodeMeta& meta, const std::vector<double>& PValues)
+    : IFormFactorBorn(meta, PValues)
 {
 }
 
@@ -611,14 +605,9 @@ void FormFactorPolyhedron::assert_platonic() const
 //  FormFactorPolygonalPrism implementation
 //**************************************************************************************************
 
-FormFactorPolygonalPrism::FormFactorPolygonalPrism(const INode* parent,
-                                                   const std::vector<const char*>& PName,
-                                                   const std::vector<const char*>& PUnit,
-                                                   const std::vector<double>& PMin,
-                                                   const std::vector<double>& PMax,
-                                                   const std::vector<double>& PDefault,
-                                                   const std::vector<double>& P)
-    : IFormFactorBorn{parent, PName, PUnit, PMin, PMax, PDefault, P}
+FormFactorPolygonalPrism::FormFactorPolygonalPrism(const NodeMeta& meta,
+                                                   const std::vector<double>& PValues)
+    : IFormFactorBorn(meta, PValues)
 {
 }
 
@@ -687,14 +676,9 @@ complex_t FormFactorPolygonalPrism::evaluate_for_q(cvector_t q) const
 //  FormFactorPolygonalSurface implementation
 //**************************************************************************************************
 
-FormFactorPolygonalSurface::FormFactorPolygonalSurface(const INode* parent,
-                                                       const std::vector<const char*>& PName,
-                                                       const std::vector<const char*>& PUnit,
-                                                       const std::vector<double>& PMin,
-                                                       const std::vector<double>& PMax,
-                                                       const std::vector<double>& PDefault,
-                                                       const std::vector<double>& P)
-    : IFormFactorBorn{parent, PName, PUnit, PMin, PMax, PDefault, P}
+FormFactorPolygonalSurface::FormFactorPolygonalSurface(const NodeMeta& meta,
+                                                       const std::vector<double>& PValues)
+    : IFormFactorBorn(meta, PValues)
 {
 }
 
diff --git a/Core/HardParticle/FormFactorPolyhedron.h b/Core/HardParticle/FormFactorPolyhedron.h
index 3c46336c8d1f1f3484da0f147641fcc524e6c624..dd5c3000e0b7140c5ee4c0e0a12adbe2c8d02e2b 100644
--- a/Core/HardParticle/FormFactorPolyhedron.h
+++ b/Core/HardParticle/FormFactorPolyhedron.h
@@ -105,10 +105,7 @@ public:
 #endif
 
     FormFactorPolyhedron() {}
-    FormFactorPolyhedron(const INode* parent, const std::vector<const char*>& PName,
-                         const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                         const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                         const std::vector<double>& P);
+    FormFactorPolyhedron(const NodeMeta& meta, const std::vector<double>& PValues);
 
     double bottomZ(const IRotation& rotation) const override final;
     double topZ(const IRotation& rotation) const override final;
@@ -143,10 +140,7 @@ class BA_CORE_API_ FormFactorPolygonalPrism : public IFormFactorBorn
 {
 public:
     FormFactorPolygonalPrism() = default;
-    FormFactorPolygonalPrism(const INode* parent, const std::vector<const char*>& PName,
-                             const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                             const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                             const std::vector<double>& P);
+    FormFactorPolygonalPrism(const NodeMeta& meta, const std::vector<double>& PValues);
 
     double bottomZ(const IRotation& rotation) const override final;
     double topZ(const IRotation& rotation) const override final;
@@ -169,10 +163,7 @@ class BA_CORE_API_ FormFactorPolygonalSurface : public IFormFactorBorn
 {
 public:
     FormFactorPolygonalSurface() = default;
-    FormFactorPolygonalSurface(const INode* parent, const std::vector<const char*>& PName,
-                               const std::vector<const char*>& PUnit,
-                               const std::vector<double>& PMin, const std::vector<double>& PMax,
-                               const std::vector<double>& PDefault, const std::vector<double>& P);
+    FormFactorPolygonalSurface(const NodeMeta& meta, const std::vector<double>& PValues);
 
     complex_t evaluate_for_q(cvector_t q) const override final;
     double volume() const override { return 0; }
diff --git a/Core/Parametrization/INode.cpp b/Core/Parametrization/INode.cpp
index 3a93d8eea8de51ad13be9eb00a61f383aa509e0d..02bd5603c9972d49544914f81d7eb79eb83d526f 100644
--- a/Core/Parametrization/INode.cpp
+++ b/Core/Parametrization/INode.cpp
@@ -13,6 +13,7 @@
 // ************************************************************************** //
 
 #include "Core/Parametrization/INode.h"
+#include "Core/Basics/Algorithms.h"
 #include "Core/Basics/Assert.h"
 #include "Core/Parametrization/IterationStrategy.h"
 #include "Core/Parametrization/NodeIterator.h"
@@ -22,37 +23,30 @@
 #include <algorithm>
 #include <exception>
 
-INode::INode(const INode* parent, const std::vector<const char*>& PName,
-             const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-             const std::vector<double>& PMax, const std::vector<double>& PDefault,
-             const std::vector<double>& P)
-    : m_parent(parent), m_NP(PName.size())
+NodeMeta nodeMetaUnion(const std::vector<ParaMeta>& base, const NodeMeta& other)
 {
-    ASSERT(PUnit.size() == m_NP);
-    ASSERT(PMin.size() <= m_NP);
-    ASSERT(PMax.size() <= m_NP);
-    ASSERT(PDefault.size() <= m_NP);
-    if (P.size() > m_NP)
-        throw std::runtime_error("Too many parameter values supplied to node constructor");
-    if (P.size() < m_NP && PDefault.size() < m_NP)
-        throw std::runtime_error("Not enough parameter values supplied to node constructor");
-    m_P.resize(m_NP);
+    return {other.parent, other.className, other.tooltip, algo::concat(base, other.paraMeta)};
+}
 
+INode::INode(const NodeMeta& meta, const std::vector<double>& PValues)
+    : m_parent(meta.parent), /*m_tooltip(meta.tooltip),*/
+      m_NP(meta.paraMeta.size())
+{
+    m_P.resize(m_NP);
+    setName(meta.className);
     for (size_t i = 0; i < m_NP; ++i) {
-        m_P[i] = i < P.size() ? P[i] : PDefault[i];
-
-        auto& reg = registerParameter(PName[i], &m_P[i]);
-        reg.setUnit(PUnit[i]);
-        const double pmi = i < PMin.size() ? PMin[i] : -INF;
-        const double pma = i < PMax.size() ? PMax[i] : +INF;
-        if (pmi == -INF) {
-            ASSERT(pma == +INF);
+        m_P[i] = PValues[i];
+        const ParaMeta& pm = meta.paraMeta[i];
+        auto& reg = registerParameter(pm.name, &m_P[i]);
+        reg.setUnit(pm.unit);
+        if (pm.vMin == -INF) {
+            ASSERT(pm.vMax == +INF);
             // nothing to do
-        } else if (pma == +INF) {
-            ASSERT(pmi == 0);
+        } else if (pm.vMax == +INF) {
+            ASSERT(pm.vMin == 0);
             reg.setNonnegative();
         } else {
-            reg.setLimited(pmi, pma);
+            reg.setLimited(pm.vMin, pm.vMax);
         }
     }
 }
diff --git a/Core/Parametrization/INode.h b/Core/Parametrization/INode.h
index 76ec763fbd9210b21e7d618bb126a37ceb1133fc..1fdcef8511bb5a5e30d2259c822dc0c8a499ad30 100644
--- a/Core/Parametrization/INode.h
+++ b/Core/Parametrization/INode.h
@@ -23,6 +23,26 @@
 
 const double INF = std::numeric_limits<double>::infinity();
 
+//! Metadata of one model parameter.
+struct BA_CORE_API_ ParaMeta {
+    std::string name;
+    std::string unit;
+    std::string tooltip;
+    double vMin;
+    double vMax;
+    double vDefault;
+};
+
+//! Metadata of one model node.
+struct BA_CORE_API_ NodeMeta {
+    INode* parent;
+    std::string className;
+    std::string tooltip;
+    std::vector<ParaMeta> paraMeta;
+};
+
+NodeMeta nodeMetaUnion(const std::vector<ParaMeta>& base, const NodeMeta& other);
+
 //! Base class for tree-like structures containing parameterized objects.
 //! @ingroup tools_internal
 
@@ -30,10 +50,7 @@ class BA_CORE_API_ INode : public IParameterized
 {
 public:
     INode() : m_parent{nullptr}, m_NP{0} {}
-    INode(const INode* parent, const std::vector<const char*>& PName,
-          const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-          const std::vector<double>& PMax, const std::vector<double>& PDefault,
-          const std::vector<double>& P);
+    INode(const NodeMeta& meta, const std::vector<double>& PValues);
 
     virtual ~INode() {}
 
@@ -63,6 +80,8 @@ public:
 
 private:
     const INode* m_parent;
+    // const std::string m_className;
+    // const std::string m_tooltip;
 
 protected:
     const size_t m_NP;
diff --git a/Core/Scattering/IFormFactor.cpp b/Core/Scattering/IFormFactor.cpp
index 7d996b2f37dabc8d17d294cb7169ffbf05f208de..2e9b4cf062f61b6e7d4a2297a821cddc585fb3b8 100644
--- a/Core/Scattering/IFormFactor.cpp
+++ b/Core/Scattering/IFormFactor.cpp
@@ -30,11 +30,8 @@ bool ShapeOutsideLimits(const IFormFactor& formfactor, ZLimits limits, const IRo
                         kvector_t translation);
 } // namespace
 
-IFormFactor::IFormFactor(const INode* parent, const std::vector<const char*>& PName,
-                         const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                         const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                         const std::vector<double>& P)
-    : ISample{parent, PName, PUnit, PMin, PMax, PDefault, P}
+IFormFactor::IFormFactor(const NodeMeta& meta, const std::vector<double>& PValues)
+    : ISample(meta, PValues)
 {
 }
 
diff --git a/Core/Scattering/IFormFactor.h b/Core/Scattering/IFormFactor.h
index 2c9af7e65ec43a40c0fcce4c2bf90f55d64e01e8..1107a95ca37813c394268e1cb9f73bb52a365325 100644
--- a/Core/Scattering/IFormFactor.h
+++ b/Core/Scattering/IFormFactor.h
@@ -41,10 +41,7 @@ class BA_CORE_API_ IFormFactor : public ISample
 {
 public:
     IFormFactor() = default;
-    IFormFactor(const INode* parent, const std::vector<const char*>& PName,
-                const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                const std::vector<double>& P);
+    IFormFactor(const NodeMeta& meta, const std::vector<double>& PValues);
 
     ~IFormFactor() = default;
     IFormFactor* clone() const override = 0;
diff --git a/Core/Scattering/IFormFactorBorn.cpp b/Core/Scattering/IFormFactorBorn.cpp
index 3b13c4d2ce7ea13cb525d0811c81d995a5418fae..f32ec459aab1561dadfec79aeb7ad87e6e7df56e 100644
--- a/Core/Scattering/IFormFactorBorn.cpp
+++ b/Core/Scattering/IFormFactorBorn.cpp
@@ -18,11 +18,8 @@
 #include "Core/Scattering/Rotations.h"
 #include "Core/Vector/WavevectorInfo.h"
 
-IFormFactorBorn::IFormFactorBorn(const INode* parent, const std::vector<const char*>& PName,
-                                 const std::vector<const char*>& PUnit,
-                                 const std::vector<double>& PMin, const std::vector<double>& PMax,
-                                 const std::vector<double>& PDefault, const std::vector<double>& P)
-    : IFormFactor{parent, PName, PUnit, PMin, PMax, PDefault, P}
+IFormFactorBorn::IFormFactorBorn(const NodeMeta& meta, const std::vector<double>& PValues)
+    : IFormFactor(meta, PValues)
 {
 }
 
diff --git a/Core/Scattering/IFormFactorBorn.h b/Core/Scattering/IFormFactorBorn.h
index da4f1e2df0b9913e445db5f73bdd73179f6b1b8f..fa2555168156b4afac7ec18c38ed4fe82d9aba82 100644
--- a/Core/Scattering/IFormFactorBorn.h
+++ b/Core/Scattering/IFormFactorBorn.h
@@ -33,10 +33,7 @@ class BA_CORE_API_ IFormFactorBorn : public IFormFactor
 {
 public:
     IFormFactorBorn() = default;
-    IFormFactorBorn(const INode* parent, const std::vector<const char*>& PName,
-                    const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                    const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                    const std::vector<double>& P);
+    IFormFactorBorn(const NodeMeta& meta, const std::vector<double>& PValues);
 
     IFormFactorBorn* clone() const override = 0;
 
diff --git a/Core/Scattering/ISample.cpp b/Core/Scattering/ISample.cpp
index ed5b83283538b1a48ff5d932d2cdb78046956473..903b945ffa607cf85058db325bf6af204ab3ba21 100644
--- a/Core/Scattering/ISample.cpp
+++ b/Core/Scattering/ISample.cpp
@@ -18,13 +18,7 @@
 #include <algorithm>
 #include <sstream>
 
-ISample::ISample(const INode* parent, const std::vector<const char*>& PName,
-                 const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                 const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                 const std::vector<double>& P)
-    : INode{parent, PName, PUnit, PMin, PMax, PDefault, P}
-{
-}
+ISample::ISample(const NodeMeta& meta, const std::vector<double>& PValues) : INode(meta, PValues) {}
 
 std::vector<const Material*> ISample::containedMaterials() const
 {
diff --git a/Core/Scattering/ISample.h b/Core/Scattering/ISample.h
index 9532a373e62de41a59718cb0d935e4653aa78fe6..3001709573825727d128c7dd69c1abacdb385c70 100644
--- a/Core/Scattering/ISample.h
+++ b/Core/Scattering/ISample.h
@@ -28,10 +28,7 @@ class BA_CORE_API_ ISample : public ICloneable, public INode
 {
 public:
     ISample() = default;
-    ISample(const INode* parent, const std::vector<const char*>& PName,
-            const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-            const std::vector<double>& PMax, const std::vector<double>& PDefault,
-            const std::vector<double>& P);
+    ISample(const NodeMeta& meta, const std::vector<double>& PValues);
 
     //! Returns a clone of this ISample object.
     ISample* clone() const override = 0;
diff --git a/Core/Scattering/Rotations.cpp b/Core/Scattering/Rotations.cpp
index 8bff3b355e6ae62518df89c3399888079665531c..7eca01bf8b03b6b05c9dd2cab4953cb9c86e7fc0 100644
--- a/Core/Scattering/Rotations.cpp
+++ b/Core/Scattering/Rotations.cpp
@@ -17,11 +17,8 @@
 #include "Core/Parametrization/RealParameter.h"
 #include "Core/Vector/Transform3D.h"
 
-IRotation::IRotation(const INode* parent, const std::vector<const char*>& PName,
-                     const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-                     const std::vector<double>& PMax, const std::vector<double>& PDefault,
-                     const std::vector<double>& P)
-    : INode{parent, PName, PUnit, PMin, PMax, PDefault, P}
+IRotation::IRotation(const NodeMeta& meta, const std::vector<double>& PValues)
+    : INode(meta, PValues)
 {
 }
 
diff --git a/Core/Scattering/Rotations.h b/Core/Scattering/Rotations.h
index b870a903f71e8555c2b4716dfdf0653d4185d1bb..1dd312fcc22d4df78d0826358658125306524305 100644
--- a/Core/Scattering/Rotations.h
+++ b/Core/Scattering/Rotations.h
@@ -31,10 +31,7 @@ public:
     static IRotation* createIdentity();
 
     IRotation() = default;
-    IRotation(const INode* parent, const std::vector<const char*>& PName,
-              const std::vector<const char*>& PUnit, const std::vector<double>& PMin,
-              const std::vector<double>& PMax, const std::vector<double>& PDefault,
-              const std::vector<double>& P);
+    IRotation(const NodeMeta& meta, const std::vector<double>& PValues);
 
     virtual IRotation* clone() const = 0;
 
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index bf3f89e6f3293e0b3f9d4d1eb74ee03d7849b522..56116d85307a6461d16649d3a07f09a7d586d99c 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -6106,6 +6106,49 @@ def IParameterized_ZComponentName(base_name):
     r"""IParameterized_ZComponentName(std::string const & base_name) -> std::string"""
     return _libBornAgainCore.IParameterized_ZComponentName(base_name)
 
+class ParaMeta(object):
+    r"""Proxy of C++ ParaMeta class."""
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+    name = property(_libBornAgainCore.ParaMeta_name_get, _libBornAgainCore.ParaMeta_name_set, doc=r"""name : std::string""")
+    unit = property(_libBornAgainCore.ParaMeta_unit_get, _libBornAgainCore.ParaMeta_unit_set, doc=r"""unit : std::string""")
+    tooltip = property(_libBornAgainCore.ParaMeta_tooltip_get, _libBornAgainCore.ParaMeta_tooltip_set, doc=r"""tooltip : std::string""")
+    vMin = property(_libBornAgainCore.ParaMeta_vMin_get, _libBornAgainCore.ParaMeta_vMin_set, doc=r"""vMin : double""")
+    vMax = property(_libBornAgainCore.ParaMeta_vMax_get, _libBornAgainCore.ParaMeta_vMax_set, doc=r"""vMax : double""")
+    vDefault = property(_libBornAgainCore.ParaMeta_vDefault_get, _libBornAgainCore.ParaMeta_vDefault_set, doc=r"""vDefault : double""")
+
+    def __init__(self):
+        r"""__init__(ParaMeta self) -> ParaMeta"""
+        _libBornAgainCore.ParaMeta_swiginit(self, _libBornAgainCore.new_ParaMeta())
+    __swig_destroy__ = _libBornAgainCore.delete_ParaMeta
+
+# Register ParaMeta in _libBornAgainCore:
+_libBornAgainCore.ParaMeta_swigregister(ParaMeta)
+INF = cvar.INF
+
+class NodeMeta(object):
+    r"""Proxy of C++ NodeMeta class."""
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+    parent = property(_libBornAgainCore.NodeMeta_parent_get, _libBornAgainCore.NodeMeta_parent_set, doc=r"""parent : p.INode""")
+    className = property(_libBornAgainCore.NodeMeta_className_get, _libBornAgainCore.NodeMeta_className_set, doc=r"""className : std::string""")
+    tooltip = property(_libBornAgainCore.NodeMeta_tooltip_get, _libBornAgainCore.NodeMeta_tooltip_set, doc=r"""tooltip : std::string""")
+    paraMeta = property(_libBornAgainCore.NodeMeta_paraMeta_get, _libBornAgainCore.NodeMeta_paraMeta_set, doc=r"""paraMeta : std::vector<(ParaMeta,std::allocator<(ParaMeta)>)>""")
+
+    def __init__(self):
+        r"""__init__(NodeMeta self) -> NodeMeta"""
+        _libBornAgainCore.NodeMeta_swiginit(self, _libBornAgainCore.new_NodeMeta())
+    __swig_destroy__ = _libBornAgainCore.delete_NodeMeta
+
+# Register NodeMeta in _libBornAgainCore:
+_libBornAgainCore.NodeMeta_swigregister(NodeMeta)
+
+
+def nodeMetaUnion(base, other):
+    r"""nodeMetaUnion(std::vector< ParaMeta,std::allocator< ParaMeta > > const & base, NodeMeta other) -> NodeMeta"""
+    return _libBornAgainCore.nodeMetaUnion(base, other)
 class INode(IParameterized):
     r"""
 
@@ -6122,7 +6165,7 @@ class INode(IParameterized):
     def __init__(self, *args):
         r"""
         __init__(INode self) -> INode
-        __init__(INode self, INode parent, std::vector< char const *,std::allocator< char const * > > const & PName, std::vector< char const *,std::allocator< char const * > > const & PUnit, vdouble1d_t PMin, vdouble1d_t PMax, vdouble1d_t PDefault, vdouble1d_t P) -> INode
+        __init__(INode self, NodeMeta meta, vdouble1d_t PValues) -> INode
         INode::INode(const INode *parent, const std::vector< const char * > PName, const std::vector< const char * > PUnit, const std::vector< double > PMin, const std::vector< double > PMax, const std::vector< double > PDefault, std::vector< double > P)
 
         """
@@ -6224,7 +6267,6 @@ class INode(IParameterized):
 
 # Register INode in _libBornAgainCore:
 _libBornAgainCore.INode_swigregister(INode)
-INF = cvar.INF
 
 class INodeVisitor(object):
     r"""
@@ -7912,7 +7954,7 @@ class ISample(ICloneable, INode):
     def __init__(self, *args):
         r"""
         __init__(ISample self) -> ISample
-        __init__(ISample self, INode parent, std::vector< char const *,std::allocator< char const * > > const & PName, std::vector< char const *,std::allocator< char const * > > const & PUnit, vdouble1d_t PMin, vdouble1d_t PMax, vdouble1d_t PDefault, vdouble1d_t P) -> ISample
+        __init__(ISample self, NodeMeta meta, vdouble1d_t PValues) -> ISample
         ISample::ISample(const INode *parent, const std::vector< const char * > PName, const std::vector< const char * > PUnit, const std::vector< double > PMin, const std::vector< double > PMax, const std::vector< double > PDefault, std::vector< double > P)
 
         """
@@ -7980,7 +8022,7 @@ class IFormFactor(ISample):
     def __init__(self, *args):
         r"""
         __init__(IFormFactor self) -> IFormFactor
-        __init__(IFormFactor self, INode parent, std::vector< char const *,std::allocator< char const * > > const & PName, std::vector< char const *,std::allocator< char const * > > const & PUnit, vdouble1d_t PMin, vdouble1d_t PMax, vdouble1d_t PDefault, vdouble1d_t P) -> IFormFactor
+        __init__(IFormFactor self, NodeMeta meta, vdouble1d_t PValues) -> IFormFactor
         IFormFactor::IFormFactor(const INode *parent, const std::vector< const char * > PName, const std::vector< const char * > PUnit, const std::vector< double > PMin, const std::vector< double > PMax, const std::vector< double > PDefault, std::vector< double > P)
 
         """
@@ -8112,7 +8154,7 @@ class IFormFactorBorn(IFormFactor):
     def __init__(self, *args):
         r"""
         __init__(IFormFactorBorn self) -> IFormFactorBorn
-        __init__(IFormFactorBorn self, INode parent, std::vector< char const *,std::allocator< char const * > > const & PName, std::vector< char const *,std::allocator< char const * > > const & PUnit, vdouble1d_t PMin, vdouble1d_t PMax, vdouble1d_t PDefault, vdouble1d_t P) -> IFormFactorBorn
+        __init__(IFormFactorBorn self, NodeMeta meta, vdouble1d_t PValues) -> IFormFactorBorn
         IFormFactorBorn::IFormFactorBorn(const INode *parent, const std::vector< const char * > PName, const std::vector< const char * > PUnit, const std::vector< double > PMin, const std::vector< double > PMax, const std::vector< double > PDefault, std::vector< double > P)
 
         """
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index 56a269c1b028bb6797df2c74188486cffe1a7192..cdb25818d7ad844131e8584274a4909b76ae3135 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -3254,160 +3254,162 @@ namespace Swig {
 #define SWIGTYPE_p_MillerIndex swig_types[186]
 #define SWIGTYPE_p_MillerIndexOrientation swig_types[187]
 #define SWIGTYPE_p_MultiLayer swig_types[188]
-#define SWIGTYPE_p_OffSpecSimulation swig_types[189]
-#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[190]
-#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[191]
-#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[192]
-#define SWIGTYPE_p_OutputDataT_bool_t swig_types[193]
-#define SWIGTYPE_p_OutputDataT_double_t swig_types[194]
-#define SWIGTYPE_p_ParameterDistribution swig_types[195]
-#define SWIGTYPE_p_ParameterPool swig_types[196]
-#define SWIGTYPE_p_ParameterSample swig_types[197]
-#define SWIGTYPE_p_Particle swig_types[198]
-#define SWIGTYPE_p_ParticleComposition swig_types[199]
-#define SWIGTYPE_p_ParticleCoreShell swig_types[200]
-#define SWIGTYPE_p_ParticleDistribution swig_types[201]
-#define SWIGTYPE_p_ParticleLayout swig_types[202]
-#define SWIGTYPE_p_ParticleLimits swig_types[203]
-#define SWIGTYPE_p_PoissonNoiseBackground swig_types[204]
-#define SWIGTYPE_p_Polygon swig_types[205]
-#define SWIGTYPE_p_PolygonPrivate swig_types[206]
-#define SWIGTYPE_p_PolygonalTopology swig_types[207]
-#define SWIGTYPE_p_PolyhedralEdge swig_types[208]
-#define SWIGTYPE_p_PolyhedralFace swig_types[209]
-#define SWIGTYPE_p_PolyhedralTopology swig_types[210]
-#define SWIGTYPE_p_ProfileBar swig_types[211]
-#define SWIGTYPE_p_ProfileRipple1 swig_types[212]
-#define SWIGTYPE_p_ProfileRipple2 swig_types[213]
-#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[214]
-#define SWIGTYPE_p_PyBuilderCallback swig_types[215]
-#define SWIGTYPE_p_PyObserverCallback swig_types[216]
-#define SWIGTYPE_p_QSpecScan swig_types[217]
-#define SWIGTYPE_p_RangedDistribution swig_types[218]
-#define SWIGTYPE_p_RangedDistributionCosine swig_types[219]
-#define SWIGTYPE_p_RangedDistributionGate swig_types[220]
-#define SWIGTYPE_p_RangedDistributionGaussian swig_types[221]
-#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[222]
-#define SWIGTYPE_p_RangedDistributionLorentz swig_types[223]
-#define SWIGTYPE_p_RealLimits swig_types[224]
-#define SWIGTYPE_p_RealParameter swig_types[225]
-#define SWIGTYPE_p_Rectangle swig_types[226]
-#define SWIGTYPE_p_RectangularDetector swig_types[227]
-#define SWIGTYPE_p_RectangularPixel swig_types[228]
-#define SWIGTYPE_p_RegionOfInterest swig_types[229]
-#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[230]
-#define SWIGTYPE_p_RotationEuler swig_types[231]
-#define SWIGTYPE_p_RotationX swig_types[232]
-#define SWIGTYPE_p_RotationY swig_types[233]
-#define SWIGTYPE_p_RotationZ swig_types[234]
-#define SWIGTYPE_p_RoughnessModelWrap swig_types[235]
-#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[236]
-#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[237]
-#define SWIGTYPE_p_SampleBuilderFactory swig_types[238]
-#define SWIGTYPE_p_ScanResolution swig_types[239]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[240]
-#define SWIGTYPE_p_Simulation swig_types[241]
-#define SWIGTYPE_p_Simulation2D swig_types[242]
-#define SWIGTYPE_p_SimulationFactory swig_types[243]
-#define SWIGTYPE_p_SimulationOptions swig_types[244]
-#define SWIGTYPE_p_SimulationResult swig_types[245]
-#define SWIGTYPE_p_SlicedParticle swig_types[246]
-#define SWIGTYPE_p_SlicingEffects swig_types[247]
-#define SWIGTYPE_p_SpecularDetector1D swig_types[248]
-#define SWIGTYPE_p_SpecularSimulation swig_types[249]
-#define SWIGTYPE_p_SphericalDetector swig_types[250]
-#define SWIGTYPE_p_SphericalPixel swig_types[251]
-#define SWIGTYPE_p_SquareLattice swig_types[252]
-#define SWIGTYPE_p_ThreadInfo swig_types[253]
-#define SWIGTYPE_p_Transform3D swig_types[254]
-#define SWIGTYPE_p_VariableBinAxis swig_types[255]
-#define SWIGTYPE_p_VarianceConstantFunction swig_types[256]
-#define SWIGTYPE_p_VarianceSimFunction swig_types[257]
-#define SWIGTYPE_p_VerticalLine swig_types[258]
-#define SWIGTYPE_p_VonMisesFisherGaussPeakShape swig_types[259]
-#define SWIGTYPE_p_VonMisesGaussPeakShape swig_types[260]
-#define SWIGTYPE_p_WavevectorInfo swig_types[261]
-#define SWIGTYPE_p_ZLimits swig_types[262]
-#define SWIGTYPE_p_allocator_type swig_types[263]
-#define SWIGTYPE_p_bool swig_types[264]
-#define SWIGTYPE_p_char swig_types[265]
-#define SWIGTYPE_p_const_iterator swig_types[266]
-#define SWIGTYPE_p_corr_matrix_t swig_types[267]
-#define SWIGTYPE_p_difference_type swig_types[268]
-#define SWIGTYPE_p_double swig_types[269]
-#define SWIGTYPE_p_first_type swig_types[270]
-#define SWIGTYPE_p_int swig_types[271]
-#define SWIGTYPE_p_iterator swig_types[272]
-#define SWIGTYPE_p_key_type swig_types[273]
-#define SWIGTYPE_p_long_long swig_types[274]
-#define SWIGTYPE_p_mapped_type swig_types[275]
-#define SWIGTYPE_p_observer_t swig_types[276]
-#define SWIGTYPE_p_p_PyObject swig_types[277]
-#define SWIGTYPE_p_parameters_t swig_types[278]
-#define SWIGTYPE_p_second_type swig_types[279]
-#define SWIGTYPE_p_short swig_types[280]
-#define SWIGTYPE_p_signed_char swig_types[281]
-#define SWIGTYPE_p_size_type swig_types[282]
-#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[283]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[284]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[285]
-#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[286]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[287]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[288]
-#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[289]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[290]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[291]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[292]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[293]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[294]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[295]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[296]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[297]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[298]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[299]
-#define SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t swig_types[300]
-#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[301]
-#define SWIGTYPE_p_std__functionT_void_fF_t swig_types[302]
-#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[303]
-#define SWIGTYPE_p_std__invalid_argument swig_types[304]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[305]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[306]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[307]
-#define SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t swig_types[308]
-#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[309]
-#define SWIGTYPE_p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t swig_types[310]
-#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[311]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[312]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[313]
-#define SWIGTYPE_p_std__vectorT_HomogeneousRegion_std__allocatorT_HomogeneousRegion_t_t swig_types[314]
-#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[315]
-#define SWIGTYPE_p_std__vectorT_ILayout_const_p_std__allocatorT_ILayout_const_p_t_t swig_types[316]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[317]
-#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[318]
-#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[319]
-#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[320]
-#define SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t swig_types[321]
-#define SWIGTYPE_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t swig_types[322]
-#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[323]
-#define SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t swig_types[324]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[325]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[326]
-#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[327]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[328]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[329]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[330]
-#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[331]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[332]
-#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[333]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[334]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[335]
-#define SWIGTYPE_p_unsigned_char swig_types[336]
-#define SWIGTYPE_p_unsigned_int swig_types[337]
-#define SWIGTYPE_p_unsigned_long_long swig_types[338]
-#define SWIGTYPE_p_unsigned_short swig_types[339]
-#define SWIGTYPE_p_value_type swig_types[340]
-static swig_type_info *swig_types[342];
-static swig_module_info swig_module = {swig_types, 341, 0, 0, 0, 0};
+#define SWIGTYPE_p_NodeMeta swig_types[189]
+#define SWIGTYPE_p_OffSpecSimulation swig_types[190]
+#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[191]
+#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[192]
+#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[193]
+#define SWIGTYPE_p_OutputDataT_bool_t swig_types[194]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[195]
+#define SWIGTYPE_p_ParaMeta swig_types[196]
+#define SWIGTYPE_p_ParameterDistribution swig_types[197]
+#define SWIGTYPE_p_ParameterPool swig_types[198]
+#define SWIGTYPE_p_ParameterSample swig_types[199]
+#define SWIGTYPE_p_Particle swig_types[200]
+#define SWIGTYPE_p_ParticleComposition swig_types[201]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[202]
+#define SWIGTYPE_p_ParticleDistribution swig_types[203]
+#define SWIGTYPE_p_ParticleLayout swig_types[204]
+#define SWIGTYPE_p_ParticleLimits swig_types[205]
+#define SWIGTYPE_p_PoissonNoiseBackground swig_types[206]
+#define SWIGTYPE_p_Polygon swig_types[207]
+#define SWIGTYPE_p_PolygonPrivate swig_types[208]
+#define SWIGTYPE_p_PolygonalTopology swig_types[209]
+#define SWIGTYPE_p_PolyhedralEdge swig_types[210]
+#define SWIGTYPE_p_PolyhedralFace swig_types[211]
+#define SWIGTYPE_p_PolyhedralTopology swig_types[212]
+#define SWIGTYPE_p_ProfileBar swig_types[213]
+#define SWIGTYPE_p_ProfileRipple1 swig_types[214]
+#define SWIGTYPE_p_ProfileRipple2 swig_types[215]
+#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[216]
+#define SWIGTYPE_p_PyBuilderCallback swig_types[217]
+#define SWIGTYPE_p_PyObserverCallback swig_types[218]
+#define SWIGTYPE_p_QSpecScan swig_types[219]
+#define SWIGTYPE_p_RangedDistribution swig_types[220]
+#define SWIGTYPE_p_RangedDistributionCosine swig_types[221]
+#define SWIGTYPE_p_RangedDistributionGate swig_types[222]
+#define SWIGTYPE_p_RangedDistributionGaussian swig_types[223]
+#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[224]
+#define SWIGTYPE_p_RangedDistributionLorentz swig_types[225]
+#define SWIGTYPE_p_RealLimits swig_types[226]
+#define SWIGTYPE_p_RealParameter swig_types[227]
+#define SWIGTYPE_p_Rectangle swig_types[228]
+#define SWIGTYPE_p_RectangularDetector swig_types[229]
+#define SWIGTYPE_p_RectangularPixel swig_types[230]
+#define SWIGTYPE_p_RegionOfInterest swig_types[231]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[232]
+#define SWIGTYPE_p_RotationEuler swig_types[233]
+#define SWIGTYPE_p_RotationX swig_types[234]
+#define SWIGTYPE_p_RotationY swig_types[235]
+#define SWIGTYPE_p_RotationZ swig_types[236]
+#define SWIGTYPE_p_RoughnessModelWrap swig_types[237]
+#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[238]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[239]
+#define SWIGTYPE_p_SampleBuilderFactory swig_types[240]
+#define SWIGTYPE_p_ScanResolution swig_types[241]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[242]
+#define SWIGTYPE_p_Simulation swig_types[243]
+#define SWIGTYPE_p_Simulation2D swig_types[244]
+#define SWIGTYPE_p_SimulationFactory swig_types[245]
+#define SWIGTYPE_p_SimulationOptions swig_types[246]
+#define SWIGTYPE_p_SimulationResult swig_types[247]
+#define SWIGTYPE_p_SlicedParticle swig_types[248]
+#define SWIGTYPE_p_SlicingEffects swig_types[249]
+#define SWIGTYPE_p_SpecularDetector1D swig_types[250]
+#define SWIGTYPE_p_SpecularSimulation swig_types[251]
+#define SWIGTYPE_p_SphericalDetector swig_types[252]
+#define SWIGTYPE_p_SphericalPixel swig_types[253]
+#define SWIGTYPE_p_SquareLattice swig_types[254]
+#define SWIGTYPE_p_ThreadInfo swig_types[255]
+#define SWIGTYPE_p_Transform3D swig_types[256]
+#define SWIGTYPE_p_VariableBinAxis swig_types[257]
+#define SWIGTYPE_p_VarianceConstantFunction swig_types[258]
+#define SWIGTYPE_p_VarianceSimFunction swig_types[259]
+#define SWIGTYPE_p_VerticalLine swig_types[260]
+#define SWIGTYPE_p_VonMisesFisherGaussPeakShape swig_types[261]
+#define SWIGTYPE_p_VonMisesGaussPeakShape swig_types[262]
+#define SWIGTYPE_p_WavevectorInfo swig_types[263]
+#define SWIGTYPE_p_ZLimits swig_types[264]
+#define SWIGTYPE_p_allocator_type swig_types[265]
+#define SWIGTYPE_p_bool swig_types[266]
+#define SWIGTYPE_p_char swig_types[267]
+#define SWIGTYPE_p_const_iterator swig_types[268]
+#define SWIGTYPE_p_corr_matrix_t swig_types[269]
+#define SWIGTYPE_p_difference_type swig_types[270]
+#define SWIGTYPE_p_double swig_types[271]
+#define SWIGTYPE_p_first_type swig_types[272]
+#define SWIGTYPE_p_int swig_types[273]
+#define SWIGTYPE_p_iterator swig_types[274]
+#define SWIGTYPE_p_key_type swig_types[275]
+#define SWIGTYPE_p_long_long swig_types[276]
+#define SWIGTYPE_p_mapped_type swig_types[277]
+#define SWIGTYPE_p_observer_t swig_types[278]
+#define SWIGTYPE_p_p_PyObject swig_types[279]
+#define SWIGTYPE_p_parameters_t swig_types[280]
+#define SWIGTYPE_p_second_type swig_types[281]
+#define SWIGTYPE_p_short swig_types[282]
+#define SWIGTYPE_p_signed_char swig_types[283]
+#define SWIGTYPE_p_size_type swig_types[284]
+#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[285]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[286]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[287]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[288]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[289]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[290]
+#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[291]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[292]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[293]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[294]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[295]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[296]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[297]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[298]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[299]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[300]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[301]
+#define SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t swig_types[302]
+#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[303]
+#define SWIGTYPE_p_std__functionT_void_fF_t swig_types[304]
+#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[305]
+#define SWIGTYPE_p_std__invalid_argument swig_types[306]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[307]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[308]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[309]
+#define SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t swig_types[310]
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[311]
+#define SWIGTYPE_p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t swig_types[312]
+#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[313]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[314]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[315]
+#define SWIGTYPE_p_std__vectorT_HomogeneousRegion_std__allocatorT_HomogeneousRegion_t_t swig_types[316]
+#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[317]
+#define SWIGTYPE_p_std__vectorT_ILayout_const_p_std__allocatorT_ILayout_const_p_t_t swig_types[318]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[319]
+#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[320]
+#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[321]
+#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[322]
+#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[323]
+#define SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t swig_types[324]
+#define SWIGTYPE_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t swig_types[325]
+#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[326]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[327]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[328]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[329]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[330]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[331]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[332]
+#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[333]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[334]
+#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[335]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[336]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[337]
+#define SWIGTYPE_p_unsigned_char swig_types[338]
+#define SWIGTYPE_p_unsigned_int swig_types[339]
+#define SWIGTYPE_p_unsigned_long_long swig_types[340]
+#define SWIGTYPE_p_unsigned_short swig_types[341]
+#define SWIGTYPE_p_value_type swig_types[342]
+static swig_type_info *swig_types[344];
+static swig_module_info swig_module = {swig_types, 343, 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)
 
@@ -8081,7 +8083,7 @@ SwigDirector_INode::SwigDirector_INode(PyObject *self): INode(), Swig::Director(
 
 
 
-SwigDirector_INode::SwigDirector_INode(PyObject *self, INode const *parent, std::vector< char const *, std::allocator< char const * > > const &PName, std::vector< char const *, std::allocator< char const * > > const &PUnit, std::vector< double, std::allocator< double > > const &PMin, std::vector< double, std::allocator< double > > const &PMax, std::vector< double, std::allocator< double > > const &PDefault, std::vector< double, std::allocator< double > > const &P): INode(parent, PName, PUnit, PMin, PMax, PDefault, P), Swig::Director(self) {
+SwigDirector_INode::SwigDirector_INode(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues): INode(meta, PValues), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((INode *)this, this); 
 }
 
@@ -8304,7 +8306,7 @@ SwigDirector_ISample::SwigDirector_ISample(PyObject *self): ISample(), Swig::Dir
 
 
 
-SwigDirector_ISample::SwigDirector_ISample(PyObject *self, INode const *parent, std::vector< char const *, std::allocator< char const * > > const &PName, std::vector< char const *, std::allocator< char const * > > const &PUnit, std::vector< double, std::allocator< double > > const &PMin, std::vector< double, std::allocator< double > > const &PMax, std::vector< double, std::allocator< double > > const &PDefault, std::vector< double, std::allocator< double > > const &P): ISample(parent, PName, PUnit, PMin, PMax, PDefault, P), Swig::Director(self) {
+SwigDirector_ISample::SwigDirector_ISample(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues): ISample(meta, PValues), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((ISample *)this, this); 
 }
 
@@ -8638,7 +8640,7 @@ SwigDirector_IFormFactor::SwigDirector_IFormFactor(PyObject *self): IFormFactor(
 
 
 
-SwigDirector_IFormFactor::SwigDirector_IFormFactor(PyObject *self, INode const *parent, std::vector< char const *, std::allocator< char const * > > const &PName, std::vector< char const *, std::allocator< char const * > > const &PUnit, std::vector< double, std::allocator< double > > const &PMin, std::vector< double, std::allocator< double > > const &PMax, std::vector< double, std::allocator< double > > const &PDefault, std::vector< double, std::allocator< double > > const &P): IFormFactor(parent, PName, PUnit, PMin, PMax, PDefault, P), Swig::Director(self) {
+SwigDirector_IFormFactor::SwigDirector_IFormFactor(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues): IFormFactor(meta, PValues), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((IFormFactor *)this, this); 
 }
 
@@ -9283,7 +9285,7 @@ SwigDirector_IFormFactorBorn::SwigDirector_IFormFactorBorn(PyObject *self): IFor
 
 
 
-SwigDirector_IFormFactorBorn::SwigDirector_IFormFactorBorn(PyObject *self, INode const *parent, std::vector< char const *, std::allocator< char const * > > const &PName, std::vector< char const *, std::allocator< char const * > > const &PUnit, std::vector< double, std::allocator< double > > const &PMin, std::vector< double, std::allocator< double > > const &PMax, std::vector< double, std::allocator< double > > const &PDefault, std::vector< double, std::allocator< double > > const &P): IFormFactorBorn(parent, PName, PUnit, PMin, PMax, PDefault, P), Swig::Director(self) {
+SwigDirector_IFormFactorBorn::SwigDirector_IFormFactorBorn(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues): IFormFactorBorn(meta, PValues), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((IFormFactorBorn *)this, this); 
 }
 
@@ -53690,6 +53692,689 @@ SWIGINTERN PyObject *Swig_var_INF_get(void) {
 }
 
 
+SWIGINTERN PyObject *_wrap_ParaMeta_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ParaMeta_name_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_name_set" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParaMeta_name_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParaMeta_name_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->name = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_name_get" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  result = (std::string *) & ((arg1)->name);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_unit_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ParaMeta_unit_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_unit_set" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParaMeta_unit_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParaMeta_unit_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->unit = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_unit_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_unit_get" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  result = (std::string *) & ((arg1)->unit);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_tooltip_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ParaMeta_tooltip_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_tooltip_set" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParaMeta_tooltip_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParaMeta_tooltip_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->tooltip = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_tooltip_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_tooltip_get" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  result = (std::string *) & ((arg1)->tooltip);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_vMin_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ParaMeta_vMin_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_vMin_set" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ParaMeta_vMin_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->vMin = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_vMin_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_vMin_get" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  result = (double) ((arg1)->vMin);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_vMax_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ParaMeta_vMax_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_vMax_set" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ParaMeta_vMax_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->vMax = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_vMax_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_vMax_get" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  result = (double) ((arg1)->vMax);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_vDefault_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ParaMeta_vDefault_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_vDefault_set" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ParaMeta_vDefault_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->vDefault = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParaMeta_vDefault_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParaMeta_vDefault_get" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  result = (double) ((arg1)->vDefault);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParaMeta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_ParaMeta", 0, 0, 0)) SWIG_fail;
+  result = (ParaMeta *)new ParaMeta();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParaMeta, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ParaMeta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParaMeta *arg1 = (ParaMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParaMeta, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ParaMeta" "', argument " "1"" of type '" "ParaMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< ParaMeta * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ParaMeta_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ParaMeta, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *ParaMeta_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_NodeMeta_parent_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *arg1 = (NodeMeta *) 0 ;
+  INode *arg2 = (INode *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "NodeMeta_parent_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_NodeMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "NodeMeta_parent_set" "', argument " "1"" of type '" "NodeMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< NodeMeta * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INode, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "NodeMeta_parent_set" "', argument " "2"" of type '" "INode *""'"); 
+  }
+  arg2 = reinterpret_cast< INode * >(argp2);
+  if (arg1) (arg1)->parent = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_NodeMeta_parent_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *arg1 = (NodeMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  INode *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_NodeMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "NodeMeta_parent_get" "', argument " "1"" of type '" "NodeMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< NodeMeta * >(argp1);
+  result = (INode *) ((arg1)->parent);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_INode, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_NodeMeta_className_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *arg1 = (NodeMeta *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "NodeMeta_className_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_NodeMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "NodeMeta_className_set" "', argument " "1"" of type '" "NodeMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< NodeMeta * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "NodeMeta_className_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "NodeMeta_className_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->className = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_NodeMeta_className_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *arg1 = (NodeMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_NodeMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "NodeMeta_className_get" "', argument " "1"" of type '" "NodeMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< NodeMeta * >(argp1);
+  result = (std::string *) & ((arg1)->className);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_NodeMeta_tooltip_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *arg1 = (NodeMeta *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "NodeMeta_tooltip_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_NodeMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "NodeMeta_tooltip_set" "', argument " "1"" of type '" "NodeMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< NodeMeta * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "NodeMeta_tooltip_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "NodeMeta_tooltip_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->tooltip = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_NodeMeta_tooltip_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *arg1 = (NodeMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_NodeMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "NodeMeta_tooltip_get" "', argument " "1"" of type '" "NodeMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< NodeMeta * >(argp1);
+  result = (std::string *) & ((arg1)->tooltip);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_NodeMeta_paraMeta_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *arg1 = (NodeMeta *) 0 ;
+  std::vector< ParaMeta,std::allocator< ParaMeta > > *arg2 = (std::vector< ParaMeta,std::allocator< ParaMeta > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "NodeMeta_paraMeta_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_NodeMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "NodeMeta_paraMeta_set" "', argument " "1"" of type '" "NodeMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< NodeMeta * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "NodeMeta_paraMeta_set" "', argument " "2"" of type '" "std::vector< ParaMeta,std::allocator< ParaMeta > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< ParaMeta,std::allocator< ParaMeta > > * >(argp2);
+  if (arg1) (arg1)->paraMeta = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_NodeMeta_paraMeta_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *arg1 = (NodeMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< ParaMeta,std::allocator< ParaMeta > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_NodeMeta, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "NodeMeta_paraMeta_get" "', argument " "1"" of type '" "NodeMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< NodeMeta * >(argp1);
+  result = (std::vector< ParaMeta,std::allocator< ParaMeta > > *)& ((arg1)->paraMeta);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_NodeMeta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_NodeMeta", 0, 0, 0)) SWIG_fail;
+  result = (NodeMeta *)new NodeMeta();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_NodeMeta, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_NodeMeta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  NodeMeta *arg1 = (NodeMeta *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_NodeMeta, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_NodeMeta" "', argument " "1"" of type '" "NodeMeta *""'"); 
+  }
+  arg1 = reinterpret_cast< NodeMeta * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *NodeMeta_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_NodeMeta, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *NodeMeta_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_nodeMetaUnion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ParaMeta,std::allocator< ParaMeta > > *arg1 = 0 ;
+  NodeMeta *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  NodeMeta result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "nodeMetaUnion", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "nodeMetaUnion" "', argument " "1"" of type '" "std::vector< ParaMeta,std::allocator< ParaMeta > > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "nodeMetaUnion" "', argument " "1"" of type '" "std::vector< ParaMeta,std::allocator< ParaMeta > > const &""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ParaMeta,std::allocator< ParaMeta > > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_NodeMeta,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "nodeMetaUnion" "', argument " "2"" of type '" "NodeMeta const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "nodeMetaUnion" "', argument " "2"" of type '" "NodeMeta const &""'"); 
+  }
+  arg2 = reinterpret_cast< NodeMeta * >(argp2);
+  result = nodeMetaUnion((std::vector< ParaMeta,std::allocator< ParaMeta > > const &)*arg1,(NodeMeta const &)*arg2);
+  resultobj = SWIG_NewPointerObj((new NodeMeta(static_cast< const NodeMeta& >(result))), SWIGTYPE_p_NodeMeta, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_new_INode__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   PyObject *arg1 = (PyObject *) 0 ;
@@ -53715,122 +54400,58 @@ fail:
 SWIGINTERN PyObject *_wrap_new_INode__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   PyObject *arg1 = (PyObject *) 0 ;
-  INode *arg2 = (INode *) 0 ;
-  std::vector< char const *,std::allocator< char const * > > *arg3 = 0 ;
-  std::vector< char const *,std::allocator< char const * > > *arg4 = 0 ;
-  std::vector< double,std::allocator< double > > *arg5 = 0 ;
-  std::vector< double,std::allocator< double > > *arg6 = 0 ;
-  std::vector< double,std::allocator< double > > *arg7 = 0 ;
-  std::vector< double,std::allocator< double > > *arg8 = 0 ;
+  NodeMeta *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
   void *argp2 = 0 ;
   int res2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  void *argp4 = 0 ;
-  int res4 = 0 ;
-  int res5 = SWIG_OLDOBJ ;
-  int res6 = SWIG_OLDOBJ ;
-  int res7 = SWIG_OLDOBJ ;
-  int res8 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
   INode *result = 0 ;
   
-  if ((nobjs < 8) || (nobjs > 8)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   arg1 = swig_obj[0];
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INode, 0 |  0 );
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_NodeMeta,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_INode" "', argument " "2"" of type '" "INode const *""'"); 
-  }
-  arg2 = reinterpret_cast< INode * >(argp2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_INode" "', argument " "3"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INode" "', argument " "3"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  arg3 = reinterpret_cast< std::vector< char const *,std::allocator< char const * > > * >(argp3);
-  res4 = SWIG_ConvertPtr(swig_obj[3], &argp4, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,  0  | 0);
-  if (!SWIG_IsOK(res4)) {
-    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_INode" "', argument " "4"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_INode" "', argument " "2"" of type '" "NodeMeta const &""'"); 
   }
-  if (!argp4) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INode" "', argument " "4"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  arg4 = reinterpret_cast< std::vector< char const *,std::allocator< char const * > > * >(argp4);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res5 = swig::asptr(swig_obj[4], &ptr);
-    if (!SWIG_IsOK(res5)) {
-      SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "new_INode" "', argument " "5"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INode" "', argument " "5"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg5 = ptr;
-  }
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res6 = swig::asptr(swig_obj[5], &ptr);
-    if (!SWIG_IsOK(res6)) {
-      SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "new_INode" "', argument " "6"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INode" "', argument " "6"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg6 = ptr;
-  }
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res7 = swig::asptr(swig_obj[6], &ptr);
-    if (!SWIG_IsOK(res7)) {
-      SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "new_INode" "', argument " "7"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INode" "', argument " "7"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg7 = ptr;
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INode" "', argument " "2"" of type '" "NodeMeta const &""'"); 
   }
+  arg2 = reinterpret_cast< NodeMeta * >(argp2);
   {
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res8 = swig::asptr(swig_obj[7], &ptr);
-    if (!SWIG_IsOK(res8)) {
-      SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "new_INode" "', argument " "8"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_INode" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INode" "', argument " "8"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INode" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
     }
-    arg8 = ptr;
+    arg3 = ptr;
   }
   if ( arg1 != Py_None ) {
     /* subclassed */
-    result = (INode *)new SwigDirector_INode(arg1,(INode const *)arg2,(std::vector< char const *,std::allocator< char const * > > const &)*arg3,(std::vector< char const *,std::allocator< char const * > > const &)*arg4,(std::vector< double,std::allocator< double > > const &)*arg5,(std::vector< double,std::allocator< double > > const &)*arg6,(std::vector< double,std::allocator< double > > const &)*arg7,(std::vector< double,std::allocator< double > > const &)*arg8); 
+    result = (INode *)new SwigDirector_INode(arg1,(NodeMeta const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3); 
   } else {
     SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
     SWIG_fail;
   }
   
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_INode, SWIG_POINTER_NEW |  0 );
-  if (SWIG_IsNewObj(res5)) delete arg5;
-  if (SWIG_IsNewObj(res6)) delete arg6;
-  if (SWIG_IsNewObj(res7)) delete arg7;
-  if (SWIG_IsNewObj(res8)) delete arg8;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res5)) delete arg5;
-  if (SWIG_IsNewObj(res6)) delete arg6;
-  if (SWIG_IsNewObj(res7)) delete arg7;
-  if (SWIG_IsNewObj(res8)) delete arg8;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return NULL;
 }
 
 
 SWIGINTERN PyObject *_wrap_new_INode(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
-  PyObject *argv[9] = {
+  PyObject *argv[4] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_INode", 0, 8, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_INode", 0, 3, argv))) SWIG_fail;
   --argc;
   if (argc == 1) {
     int _v;
@@ -53839,38 +54460,17 @@ SWIGINTERN PyObject *_wrap_new_INode(PyObject *self, PyObject *args) {
       return _wrap_new_INode__SWIG_0(self, argc, argv);
     }
   }
-  if (argc == 8) {
+  if (argc == 3) {
     int _v;
     _v = (argv[0] != 0);
     if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_INode, 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_NodeMeta, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
         _v = SWIG_CheckState(res);
         if (_v) {
-          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
-          _v = SWIG_CheckState(res);
-          if (_v) {
-            int res = swig::asptr(argv[4], (std::vector< double,std::allocator< double > >**)(0));
-            _v = SWIG_CheckState(res);
-            if (_v) {
-              int res = swig::asptr(argv[5], (std::vector< double,std::allocator< double > >**)(0));
-              _v = SWIG_CheckState(res);
-              if (_v) {
-                int res = swig::asptr(argv[6], (std::vector< double,std::allocator< double > >**)(0));
-                _v = SWIG_CheckState(res);
-                if (_v) {
-                  int res = swig::asptr(argv[7], (std::vector< double,std::allocator< double > >**)(0));
-                  _v = SWIG_CheckState(res);
-                  if (_v) {
-                    return _wrap_new_INode__SWIG_1(self, argc, argv);
-                  }
-                }
-              }
-            }
-          }
+          return _wrap_new_INode__SWIG_1(self, argc, argv);
         }
       }
     }
@@ -53880,7 +54480,7 @@ fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_INode'.\n"
     "  Possible C/C++ prototypes are:\n"
     "    INode::INode()\n"
-    "    INode::INode(PyObject *,INode const *,std::vector< char const *,std::allocator< char const * > > const &,std::vector< char const *,std::allocator< char const * > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n");
+    "    INode::INode(PyObject *,NodeMeta const &,std::vector< double,std::allocator< double > > const &)\n");
   return 0;
 }
 
@@ -67403,122 +68003,58 @@ fail:
 SWIGINTERN PyObject *_wrap_new_ISample__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   PyObject *arg1 = (PyObject *) 0 ;
-  INode *arg2 = (INode *) 0 ;
-  std::vector< char const *,std::allocator< char const * > > *arg3 = 0 ;
-  std::vector< char const *,std::allocator< char const * > > *arg4 = 0 ;
-  std::vector< double,std::allocator< double > > *arg5 = 0 ;
-  std::vector< double,std::allocator< double > > *arg6 = 0 ;
-  std::vector< double,std::allocator< double > > *arg7 = 0 ;
-  std::vector< double,std::allocator< double > > *arg8 = 0 ;
+  NodeMeta *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
   void *argp2 = 0 ;
   int res2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  void *argp4 = 0 ;
-  int res4 = 0 ;
-  int res5 = SWIG_OLDOBJ ;
-  int res6 = SWIG_OLDOBJ ;
-  int res7 = SWIG_OLDOBJ ;
-  int res8 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
   ISample *result = 0 ;
   
-  if ((nobjs < 8) || (nobjs > 8)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   arg1 = swig_obj[0];
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INode, 0 |  0 );
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_NodeMeta,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ISample" "', argument " "2"" of type '" "INode const *""'"); 
-  }
-  arg2 = reinterpret_cast< INode * >(argp2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_ISample" "', argument " "3"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ISample" "', argument " "2"" of type '" "NodeMeta const &""'"); 
   }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ISample" "', argument " "3"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  arg3 = reinterpret_cast< std::vector< char const *,std::allocator< char const * > > * >(argp3);
-  res4 = SWIG_ConvertPtr(swig_obj[3], &argp4, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,  0  | 0);
-  if (!SWIG_IsOK(res4)) {
-    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_ISample" "', argument " "4"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  if (!argp4) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ISample" "', argument " "4"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  arg4 = reinterpret_cast< std::vector< char const *,std::allocator< char const * > > * >(argp4);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res5 = swig::asptr(swig_obj[4], &ptr);
-    if (!SWIG_IsOK(res5)) {
-      SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "new_ISample" "', argument " "5"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ISample" "', argument " "5"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg5 = ptr;
-  }
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res6 = swig::asptr(swig_obj[5], &ptr);
-    if (!SWIG_IsOK(res6)) {
-      SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "new_ISample" "', argument " "6"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ISample" "', argument " "6"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg6 = ptr;
-  }
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res7 = swig::asptr(swig_obj[6], &ptr);
-    if (!SWIG_IsOK(res7)) {
-      SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "new_ISample" "', argument " "7"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ISample" "', argument " "7"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg7 = ptr;
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ISample" "', argument " "2"" of type '" "NodeMeta const &""'"); 
   }
+  arg2 = reinterpret_cast< NodeMeta * >(argp2);
   {
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res8 = swig::asptr(swig_obj[7], &ptr);
-    if (!SWIG_IsOK(res8)) {
-      SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "new_ISample" "', argument " "8"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_ISample" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ISample" "', argument " "8"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ISample" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
     }
-    arg8 = ptr;
+    arg3 = ptr;
   }
   if ( arg1 != Py_None ) {
     /* subclassed */
-    result = (ISample *)new SwigDirector_ISample(arg1,(INode const *)arg2,(std::vector< char const *,std::allocator< char const * > > const &)*arg3,(std::vector< char const *,std::allocator< char const * > > const &)*arg4,(std::vector< double,std::allocator< double > > const &)*arg5,(std::vector< double,std::allocator< double > > const &)*arg6,(std::vector< double,std::allocator< double > > const &)*arg7,(std::vector< double,std::allocator< double > > const &)*arg8); 
+    result = (ISample *)new SwigDirector_ISample(arg1,(NodeMeta const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3); 
   } else {
     SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
     SWIG_fail;
   }
   
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, SWIG_POINTER_NEW |  0 );
-  if (SWIG_IsNewObj(res5)) delete arg5;
-  if (SWIG_IsNewObj(res6)) delete arg6;
-  if (SWIG_IsNewObj(res7)) delete arg7;
-  if (SWIG_IsNewObj(res8)) delete arg8;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res5)) delete arg5;
-  if (SWIG_IsNewObj(res6)) delete arg6;
-  if (SWIG_IsNewObj(res7)) delete arg7;
-  if (SWIG_IsNewObj(res8)) delete arg8;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return NULL;
 }
 
 
 SWIGINTERN PyObject *_wrap_new_ISample(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
-  PyObject *argv[9] = {
+  PyObject *argv[4] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_ISample", 0, 8, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_ISample", 0, 3, argv))) SWIG_fail;
   --argc;
   if (argc == 1) {
     int _v;
@@ -67527,38 +68063,17 @@ SWIGINTERN PyObject *_wrap_new_ISample(PyObject *self, PyObject *args) {
       return _wrap_new_ISample__SWIG_0(self, argc, argv);
     }
   }
-  if (argc == 8) {
+  if (argc == 3) {
     int _v;
     _v = (argv[0] != 0);
     if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_INode, 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_NodeMeta, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
         _v = SWIG_CheckState(res);
         if (_v) {
-          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
-          _v = SWIG_CheckState(res);
-          if (_v) {
-            int res = swig::asptr(argv[4], (std::vector< double,std::allocator< double > >**)(0));
-            _v = SWIG_CheckState(res);
-            if (_v) {
-              int res = swig::asptr(argv[5], (std::vector< double,std::allocator< double > >**)(0));
-              _v = SWIG_CheckState(res);
-              if (_v) {
-                int res = swig::asptr(argv[6], (std::vector< double,std::allocator< double > >**)(0));
-                _v = SWIG_CheckState(res);
-                if (_v) {
-                  int res = swig::asptr(argv[7], (std::vector< double,std::allocator< double > >**)(0));
-                  _v = SWIG_CheckState(res);
-                  if (_v) {
-                    return _wrap_new_ISample__SWIG_1(self, argc, argv);
-                  }
-                }
-              }
-            }
-          }
+          return _wrap_new_ISample__SWIG_1(self, argc, argv);
         }
       }
     }
@@ -67568,7 +68083,7 @@ fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_ISample'.\n"
     "  Possible C/C++ prototypes are:\n"
     "    ISample::ISample()\n"
-    "    ISample::ISample(PyObject *,INode const *,std::vector< char const *,std::allocator< char const * > > const &,std::vector< char const *,std::allocator< char const * > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n");
+    "    ISample::ISample(PyObject *,NodeMeta const &,std::vector< double,std::allocator< double > > const &)\n");
   return 0;
 }
 
@@ -67762,122 +68277,58 @@ fail:
 SWIGINTERN PyObject *_wrap_new_IFormFactor__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   PyObject *arg1 = (PyObject *) 0 ;
-  INode *arg2 = (INode *) 0 ;
-  std::vector< char const *,std::allocator< char const * > > *arg3 = 0 ;
-  std::vector< char const *,std::allocator< char const * > > *arg4 = 0 ;
-  std::vector< double,std::allocator< double > > *arg5 = 0 ;
-  std::vector< double,std::allocator< double > > *arg6 = 0 ;
-  std::vector< double,std::allocator< double > > *arg7 = 0 ;
-  std::vector< double,std::allocator< double > > *arg8 = 0 ;
+  NodeMeta *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
   void *argp2 = 0 ;
   int res2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  void *argp4 = 0 ;
-  int res4 = 0 ;
-  int res5 = SWIG_OLDOBJ ;
-  int res6 = SWIG_OLDOBJ ;
-  int res7 = SWIG_OLDOBJ ;
-  int res8 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
   IFormFactor *result = 0 ;
   
-  if ((nobjs < 8) || (nobjs > 8)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   arg1 = swig_obj[0];
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INode, 0 |  0 );
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_NodeMeta,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IFormFactor" "', argument " "2"" of type '" "INode const *""'"); 
-  }
-  arg2 = reinterpret_cast< INode * >(argp2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_IFormFactor" "', argument " "3"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactor" "', argument " "3"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  arg3 = reinterpret_cast< std::vector< char const *,std::allocator< char const * > > * >(argp3);
-  res4 = SWIG_ConvertPtr(swig_obj[3], &argp4, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,  0  | 0);
-  if (!SWIG_IsOK(res4)) {
-    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_IFormFactor" "', argument " "4"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  if (!argp4) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactor" "', argument " "4"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  arg4 = reinterpret_cast< std::vector< char const *,std::allocator< char const * > > * >(argp4);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res5 = swig::asptr(swig_obj[4], &ptr);
-    if (!SWIG_IsOK(res5)) {
-      SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "new_IFormFactor" "', argument " "5"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactor" "', argument " "5"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg5 = ptr;
-  }
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res6 = swig::asptr(swig_obj[5], &ptr);
-    if (!SWIG_IsOK(res6)) {
-      SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "new_IFormFactor" "', argument " "6"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactor" "', argument " "6"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg6 = ptr;
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IFormFactor" "', argument " "2"" of type '" "NodeMeta const &""'"); 
   }
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res7 = swig::asptr(swig_obj[6], &ptr);
-    if (!SWIG_IsOK(res7)) {
-      SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "new_IFormFactor" "', argument " "7"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactor" "', argument " "7"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg7 = ptr;
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactor" "', argument " "2"" of type '" "NodeMeta const &""'"); 
   }
+  arg2 = reinterpret_cast< NodeMeta * >(argp2);
   {
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res8 = swig::asptr(swig_obj[7], &ptr);
-    if (!SWIG_IsOK(res8)) {
-      SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "new_IFormFactor" "', argument " "8"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_IFormFactor" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactor" "', argument " "8"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactor" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
     }
-    arg8 = ptr;
+    arg3 = ptr;
   }
   if ( arg1 != Py_None ) {
     /* subclassed */
-    result = (IFormFactor *)new SwigDirector_IFormFactor(arg1,(INode const *)arg2,(std::vector< char const *,std::allocator< char const * > > const &)*arg3,(std::vector< char const *,std::allocator< char const * > > const &)*arg4,(std::vector< double,std::allocator< double > > const &)*arg5,(std::vector< double,std::allocator< double > > const &)*arg6,(std::vector< double,std::allocator< double > > const &)*arg7,(std::vector< double,std::allocator< double > > const &)*arg8); 
+    result = (IFormFactor *)new SwigDirector_IFormFactor(arg1,(NodeMeta const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3); 
   } else {
     SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
     SWIG_fail;
   }
   
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, SWIG_POINTER_NEW |  0 );
-  if (SWIG_IsNewObj(res5)) delete arg5;
-  if (SWIG_IsNewObj(res6)) delete arg6;
-  if (SWIG_IsNewObj(res7)) delete arg7;
-  if (SWIG_IsNewObj(res8)) delete arg8;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res5)) delete arg5;
-  if (SWIG_IsNewObj(res6)) delete arg6;
-  if (SWIG_IsNewObj(res7)) delete arg7;
-  if (SWIG_IsNewObj(res8)) delete arg8;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return NULL;
 }
 
 
 SWIGINTERN PyObject *_wrap_new_IFormFactor(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
-  PyObject *argv[9] = {
+  PyObject *argv[4] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IFormFactor", 0, 8, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IFormFactor", 0, 3, argv))) SWIG_fail;
   --argc;
   if (argc == 1) {
     int _v;
@@ -67886,38 +68337,17 @@ SWIGINTERN PyObject *_wrap_new_IFormFactor(PyObject *self, PyObject *args) {
       return _wrap_new_IFormFactor__SWIG_0(self, argc, argv);
     }
   }
-  if (argc == 8) {
+  if (argc == 3) {
     int _v;
     _v = (argv[0] != 0);
     if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_INode, 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_NodeMeta, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
         _v = SWIG_CheckState(res);
         if (_v) {
-          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
-          _v = SWIG_CheckState(res);
-          if (_v) {
-            int res = swig::asptr(argv[4], (std::vector< double,std::allocator< double > >**)(0));
-            _v = SWIG_CheckState(res);
-            if (_v) {
-              int res = swig::asptr(argv[5], (std::vector< double,std::allocator< double > >**)(0));
-              _v = SWIG_CheckState(res);
-              if (_v) {
-                int res = swig::asptr(argv[6], (std::vector< double,std::allocator< double > >**)(0));
-                _v = SWIG_CheckState(res);
-                if (_v) {
-                  int res = swig::asptr(argv[7], (std::vector< double,std::allocator< double > >**)(0));
-                  _v = SWIG_CheckState(res);
-                  if (_v) {
-                    return _wrap_new_IFormFactor__SWIG_1(self, argc, argv);
-                  }
-                }
-              }
-            }
-          }
+          return _wrap_new_IFormFactor__SWIG_1(self, argc, argv);
         }
       }
     }
@@ -67927,7 +68357,7 @@ fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_IFormFactor'.\n"
     "  Possible C/C++ prototypes are:\n"
     "    IFormFactor::IFormFactor()\n"
-    "    IFormFactor::IFormFactor(PyObject *,INode const *,std::vector< char const *,std::allocator< char const * > > const &,std::vector< char const *,std::allocator< char const * > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n");
+    "    IFormFactor::IFormFactor(PyObject *,NodeMeta const &,std::vector< double,std::allocator< double > > const &)\n");
   return 0;
 }
 
@@ -68581,122 +69011,58 @@ fail:
 SWIGINTERN PyObject *_wrap_new_IFormFactorBorn__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   PyObject *arg1 = (PyObject *) 0 ;
-  INode *arg2 = (INode *) 0 ;
-  std::vector< char const *,std::allocator< char const * > > *arg3 = 0 ;
-  std::vector< char const *,std::allocator< char const * > > *arg4 = 0 ;
-  std::vector< double,std::allocator< double > > *arg5 = 0 ;
-  std::vector< double,std::allocator< double > > *arg6 = 0 ;
-  std::vector< double,std::allocator< double > > *arg7 = 0 ;
-  std::vector< double,std::allocator< double > > *arg8 = 0 ;
+  NodeMeta *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
   void *argp2 = 0 ;
   int res2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  void *argp4 = 0 ;
-  int res4 = 0 ;
-  int res5 = SWIG_OLDOBJ ;
-  int res6 = SWIG_OLDOBJ ;
-  int res7 = SWIG_OLDOBJ ;
-  int res8 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
   IFormFactorBorn *result = 0 ;
   
-  if ((nobjs < 8) || (nobjs > 8)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   arg1 = swig_obj[0];
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INode, 0 |  0 );
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_NodeMeta,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IFormFactorBorn" "', argument " "2"" of type '" "INode const *""'"); 
-  }
-  arg2 = reinterpret_cast< INode * >(argp2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_IFormFactorBorn" "', argument " "3"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactorBorn" "', argument " "3"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  arg3 = reinterpret_cast< std::vector< char const *,std::allocator< char const * > > * >(argp3);
-  res4 = SWIG_ConvertPtr(swig_obj[3], &argp4, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,  0  | 0);
-  if (!SWIG_IsOK(res4)) {
-    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_IFormFactorBorn" "', argument " "4"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  if (!argp4) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactorBorn" "', argument " "4"" of type '" "std::vector< char const *,std::allocator< char const * > > const &""'"); 
-  }
-  arg4 = reinterpret_cast< std::vector< char const *,std::allocator< char const * > > * >(argp4);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res5 = swig::asptr(swig_obj[4], &ptr);
-    if (!SWIG_IsOK(res5)) {
-      SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "new_IFormFactorBorn" "', argument " "5"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactorBorn" "', argument " "5"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg5 = ptr;
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IFormFactorBorn" "', argument " "2"" of type '" "NodeMeta const &""'"); 
   }
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res6 = swig::asptr(swig_obj[5], &ptr);
-    if (!SWIG_IsOK(res6)) {
-      SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "new_IFormFactorBorn" "', argument " "6"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactorBorn" "', argument " "6"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg6 = ptr;
-  }
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res7 = swig::asptr(swig_obj[6], &ptr);
-    if (!SWIG_IsOK(res7)) {
-      SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "new_IFormFactorBorn" "', argument " "7"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactorBorn" "', argument " "7"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg7 = ptr;
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactorBorn" "', argument " "2"" of type '" "NodeMeta const &""'"); 
   }
+  arg2 = reinterpret_cast< NodeMeta * >(argp2);
   {
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res8 = swig::asptr(swig_obj[7], &ptr);
-    if (!SWIG_IsOK(res8)) {
-      SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "new_IFormFactorBorn" "', argument " "8"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_IFormFactorBorn" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactorBorn" "', argument " "8"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IFormFactorBorn" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
     }
-    arg8 = ptr;
+    arg3 = ptr;
   }
   if ( arg1 != Py_None ) {
     /* subclassed */
-    result = (IFormFactorBorn *)new SwigDirector_IFormFactorBorn(arg1,(INode const *)arg2,(std::vector< char const *,std::allocator< char const * > > const &)*arg3,(std::vector< char const *,std::allocator< char const * > > const &)*arg4,(std::vector< double,std::allocator< double > > const &)*arg5,(std::vector< double,std::allocator< double > > const &)*arg6,(std::vector< double,std::allocator< double > > const &)*arg7,(std::vector< double,std::allocator< double > > const &)*arg8); 
+    result = (IFormFactorBorn *)new SwigDirector_IFormFactorBorn(arg1,(NodeMeta const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3); 
   } else {
     SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
     SWIG_fail;
   }
   
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactorBorn, SWIG_POINTER_NEW |  0 );
-  if (SWIG_IsNewObj(res5)) delete arg5;
-  if (SWIG_IsNewObj(res6)) delete arg6;
-  if (SWIG_IsNewObj(res7)) delete arg7;
-  if (SWIG_IsNewObj(res8)) delete arg8;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res5)) delete arg5;
-  if (SWIG_IsNewObj(res6)) delete arg6;
-  if (SWIG_IsNewObj(res7)) delete arg7;
-  if (SWIG_IsNewObj(res8)) delete arg8;
+  if (SWIG_IsNewObj(res3)) delete arg3;
   return NULL;
 }
 
 
 SWIGINTERN PyObject *_wrap_new_IFormFactorBorn(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
-  PyObject *argv[9] = {
+  PyObject *argv[4] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IFormFactorBorn", 0, 8, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IFormFactorBorn", 0, 3, argv))) SWIG_fail;
   --argc;
   if (argc == 1) {
     int _v;
@@ -68705,38 +69071,17 @@ SWIGINTERN PyObject *_wrap_new_IFormFactorBorn(PyObject *self, PyObject *args) {
       return _wrap_new_IFormFactorBorn__SWIG_0(self, argc, argv);
     }
   }
-  if (argc == 8) {
+  if (argc == 3) {
     int _v;
     _v = (argv[0] != 0);
     if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_INode, 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_NodeMeta, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
         _v = SWIG_CheckState(res);
         if (_v) {
-          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t, SWIG_POINTER_NO_NULL | 0);
-          _v = SWIG_CheckState(res);
-          if (_v) {
-            int res = swig::asptr(argv[4], (std::vector< double,std::allocator< double > >**)(0));
-            _v = SWIG_CheckState(res);
-            if (_v) {
-              int res = swig::asptr(argv[5], (std::vector< double,std::allocator< double > >**)(0));
-              _v = SWIG_CheckState(res);
-              if (_v) {
-                int res = swig::asptr(argv[6], (std::vector< double,std::allocator< double > >**)(0));
-                _v = SWIG_CheckState(res);
-                if (_v) {
-                  int res = swig::asptr(argv[7], (std::vector< double,std::allocator< double > >**)(0));
-                  _v = SWIG_CheckState(res);
-                  if (_v) {
-                    return _wrap_new_IFormFactorBorn__SWIG_1(self, argc, argv);
-                  }
-                }
-              }
-            }
-          }
+          return _wrap_new_IFormFactorBorn__SWIG_1(self, argc, argv);
         }
       }
     }
@@ -68746,7 +69091,7 @@ fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_IFormFactorBorn'.\n"
     "  Possible C/C++ prototypes are:\n"
     "    IFormFactorBorn::IFormFactorBorn()\n"
-    "    IFormFactorBorn::IFormFactorBorn(PyObject *,INode const *,std::vector< char const *,std::allocator< char const * > > const &,std::vector< char const *,std::allocator< char const * > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n");
+    "    IFormFactorBorn::IFormFactorBorn(PyObject *,NodeMeta const &,std::vector< double,std::allocator< double > > const &)\n");
   return 0;
 }
 
@@ -123266,9 +123611,38 @@ static PyMethodDef SwigMethods[] = {
 	 { "disown_IParameterized", _wrap_disown_IParameterized, METH_O, NULL},
 	 { "IParameterized_swigregister", IParameterized_swigregister, METH_O, NULL},
 	 { "IParameterized_swiginit", IParameterized_swiginit, METH_VARARGS, NULL},
+	 { "ParaMeta_name_set", _wrap_ParaMeta_name_set, METH_VARARGS, "ParaMeta_name_set(ParaMeta self, std::string const & name)"},
+	 { "ParaMeta_name_get", _wrap_ParaMeta_name_get, METH_O, "ParaMeta_name_get(ParaMeta self) -> std::string const &"},
+	 { "ParaMeta_unit_set", _wrap_ParaMeta_unit_set, METH_VARARGS, "ParaMeta_unit_set(ParaMeta self, std::string const & unit)"},
+	 { "ParaMeta_unit_get", _wrap_ParaMeta_unit_get, METH_O, "ParaMeta_unit_get(ParaMeta self) -> std::string const &"},
+	 { "ParaMeta_tooltip_set", _wrap_ParaMeta_tooltip_set, METH_VARARGS, "ParaMeta_tooltip_set(ParaMeta self, std::string const & tooltip)"},
+	 { "ParaMeta_tooltip_get", _wrap_ParaMeta_tooltip_get, METH_O, "ParaMeta_tooltip_get(ParaMeta self) -> std::string const &"},
+	 { "ParaMeta_vMin_set", _wrap_ParaMeta_vMin_set, METH_VARARGS, "ParaMeta_vMin_set(ParaMeta self, double vMin)"},
+	 { "ParaMeta_vMin_get", _wrap_ParaMeta_vMin_get, METH_O, "ParaMeta_vMin_get(ParaMeta self) -> double"},
+	 { "ParaMeta_vMax_set", _wrap_ParaMeta_vMax_set, METH_VARARGS, "ParaMeta_vMax_set(ParaMeta self, double vMax)"},
+	 { "ParaMeta_vMax_get", _wrap_ParaMeta_vMax_get, METH_O, "ParaMeta_vMax_get(ParaMeta self) -> double"},
+	 { "ParaMeta_vDefault_set", _wrap_ParaMeta_vDefault_set, METH_VARARGS, "ParaMeta_vDefault_set(ParaMeta self, double vDefault)"},
+	 { "ParaMeta_vDefault_get", _wrap_ParaMeta_vDefault_get, METH_O, "ParaMeta_vDefault_get(ParaMeta self) -> double"},
+	 { "new_ParaMeta", _wrap_new_ParaMeta, METH_NOARGS, "new_ParaMeta() -> ParaMeta"},
+	 { "delete_ParaMeta", _wrap_delete_ParaMeta, METH_O, "delete_ParaMeta(ParaMeta self)"},
+	 { "ParaMeta_swigregister", ParaMeta_swigregister, METH_O, NULL},
+	 { "ParaMeta_swiginit", ParaMeta_swiginit, METH_VARARGS, NULL},
+	 { "NodeMeta_parent_set", _wrap_NodeMeta_parent_set, METH_VARARGS, "NodeMeta_parent_set(NodeMeta self, INode parent)"},
+	 { "NodeMeta_parent_get", _wrap_NodeMeta_parent_get, METH_O, "NodeMeta_parent_get(NodeMeta self) -> INode"},
+	 { "NodeMeta_className_set", _wrap_NodeMeta_className_set, METH_VARARGS, "NodeMeta_className_set(NodeMeta self, std::string const & className)"},
+	 { "NodeMeta_className_get", _wrap_NodeMeta_className_get, METH_O, "NodeMeta_className_get(NodeMeta self) -> std::string const &"},
+	 { "NodeMeta_tooltip_set", _wrap_NodeMeta_tooltip_set, METH_VARARGS, "NodeMeta_tooltip_set(NodeMeta self, std::string const & tooltip)"},
+	 { "NodeMeta_tooltip_get", _wrap_NodeMeta_tooltip_get, METH_O, "NodeMeta_tooltip_get(NodeMeta self) -> std::string const &"},
+	 { "NodeMeta_paraMeta_set", _wrap_NodeMeta_paraMeta_set, METH_VARARGS, "NodeMeta_paraMeta_set(NodeMeta self, std::vector< ParaMeta,std::allocator< ParaMeta > > * paraMeta)"},
+	 { "NodeMeta_paraMeta_get", _wrap_NodeMeta_paraMeta_get, METH_O, "NodeMeta_paraMeta_get(NodeMeta self) -> std::vector< ParaMeta,std::allocator< ParaMeta > > *"},
+	 { "new_NodeMeta", _wrap_new_NodeMeta, METH_NOARGS, "new_NodeMeta() -> NodeMeta"},
+	 { "delete_NodeMeta", _wrap_delete_NodeMeta, METH_O, "delete_NodeMeta(NodeMeta self)"},
+	 { "NodeMeta_swigregister", NodeMeta_swigregister, METH_O, NULL},
+	 { "NodeMeta_swiginit", NodeMeta_swiginit, METH_VARARGS, NULL},
+	 { "nodeMetaUnion", _wrap_nodeMetaUnion, METH_VARARGS, "nodeMetaUnion(std::vector< ParaMeta,std::allocator< ParaMeta > > const & base, NodeMeta other) -> NodeMeta"},
 	 { "new_INode", _wrap_new_INode, METH_VARARGS, "\n"
 		"INode()\n"
-		"new_INode(PyObject * _self, INode parent, std::vector< char const *,std::allocator< char const * > > const & PName, std::vector< char const *,std::allocator< char const * > > const & PUnit, vdouble1d_t PMin, vdouble1d_t PMax, vdouble1d_t PDefault, vdouble1d_t P) -> INode\n"
+		"new_INode(PyObject * _self, NodeMeta meta, vdouble1d_t PValues) -> INode\n"
 		"INode::INode(const INode *parent, const std::vector< const char * > PName, const std::vector< const char * > PUnit, const std::vector< double > PMin, const std::vector< double > PMax, const std::vector< double > PDefault, std::vector< double > P)\n"
 		"\n"
 		""},
@@ -124417,7 +124791,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "ThreadInfo_swiginit", ThreadInfo_swiginit, METH_VARARGS, NULL},
 	 { "new_ISample", _wrap_new_ISample, METH_VARARGS, "\n"
 		"ISample()\n"
-		"new_ISample(PyObject * _self, INode parent, std::vector< char const *,std::allocator< char const * > > const & PName, std::vector< char const *,std::allocator< char const * > > const & PUnit, vdouble1d_t PMin, vdouble1d_t PMax, vdouble1d_t PDefault, vdouble1d_t P) -> ISample\n"
+		"new_ISample(PyObject * _self, NodeMeta meta, vdouble1d_t PValues) -> ISample\n"
 		"ISample::ISample(const INode *parent, const std::vector< const char * > PName, const std::vector< const char * > PUnit, const std::vector< double > PMin, const std::vector< double > PMax, const std::vector< double > PDefault, std::vector< double > P)\n"
 		"\n"
 		""},
@@ -124448,7 +124822,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "ISample_swiginit", ISample_swiginit, METH_VARARGS, NULL},
 	 { "new_IFormFactor", _wrap_new_IFormFactor, METH_VARARGS, "\n"
 		"IFormFactor()\n"
-		"new_IFormFactor(PyObject * _self, INode parent, std::vector< char const *,std::allocator< char const * > > const & PName, std::vector< char const *,std::allocator< char const * > > const & PUnit, vdouble1d_t PMin, vdouble1d_t PMax, vdouble1d_t PDefault, vdouble1d_t P) -> IFormFactor\n"
+		"new_IFormFactor(PyObject * _self, NodeMeta meta, vdouble1d_t PValues) -> IFormFactor\n"
 		"IFormFactor::IFormFactor(const INode *parent, const std::vector< const char * > PName, const std::vector< const char * > PUnit, const std::vector< double > PMin, const std::vector< double > PMax, const std::vector< double > PDefault, std::vector< double > P)\n"
 		"\n"
 		""},
@@ -124525,7 +124899,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "new_IFormFactorBorn", _wrap_new_IFormFactorBorn, METH_VARARGS, "\n"
 		"IFormFactorBorn()\n"
-		"new_IFormFactorBorn(PyObject * _self, INode parent, std::vector< char const *,std::allocator< char const * > > const & PName, std::vector< char const *,std::allocator< char const * > > const & PUnit, vdouble1d_t PMin, vdouble1d_t PMax, vdouble1d_t PDefault, vdouble1d_t P) -> IFormFactorBorn\n"
+		"new_IFormFactorBorn(PyObject * _self, NodeMeta meta, vdouble1d_t PValues) -> IFormFactorBorn\n"
 		"IFormFactorBorn::IFormFactorBorn(const INode *parent, const std::vector< const char * > PName, const std::vector< const char * > PUnit, const std::vector< double > PMin, const std::vector< double > PMax, const std::vector< double > PDefault, std::vector< double > P)\n"
 		"\n"
 		""},
@@ -135834,12 +136208,14 @@ static swig_type_info _swigt__p_MesoCrystal = {"_p_MesoCrystal", "MesoCrystal *"
 static swig_type_info _swigt__p_MillerIndex = {"_p_MillerIndex", "MillerIndex *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_MillerIndexOrientation = {"_p_MillerIndexOrientation", "MillerIndexOrientation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_MultiLayer = {"_p_MultiLayer", "MultiLayer *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_NodeMeta = {"_p_NodeMeta", "NodeMeta *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_OffSpecSimulation = {"_p_OffSpecSimulation", "OffSpecSimulation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_OutputDataIteratorT_double_OutputDataT_double_t_t = {"_p_OutputDataIteratorT_double_OutputDataT_double_t_t", "OutputData< double >::iterator *|OutputDataIterator< double,OutputData< double > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t = {"_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t", "OutputDataIterator< double const,OutputData< double > const > *|OutputData< double >::const_iterator *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_OutputDataT_CumulativeValue_t = {"_p_OutputDataT_CumulativeValue_t", "OutputData< CumulativeValue > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_OutputDataT_bool_t = {"_p_OutputDataT_bool_t", "OutputData< bool > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_OutputDataT_double_t = {"_p_OutputDataT_double_t", "OutputData< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ParaMeta = {"_p_ParaMeta", "ParaMeta *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ParameterDistribution = {"_p_ParameterDistribution", "ParameterDistribution *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ParameterPool = {"_p_ParameterPool", "ParameterPool *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ParameterSample = {"_p_ParameterSample", "std::vector< ParameterSample >::value_type *|ParameterSample *", 0, 0, (void*)0, 0};
@@ -135965,11 +136341,11 @@ static swig_type_info _swigt__p_std__vectorT_ILayout_const_p_std__allocatorT_ILa
 static swig_type_info _swigt__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t = {"_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t", "std::vector< INode const *,std::allocator< INode const * > > *|std::vector< INode const * > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t = {"_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t", "std::vector< INode *,std::allocator< INode * > > *|std::vector< INode * > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t = {"_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t", "std::vector< Material const *,std::allocator< Material const * > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t = {"_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t", "std::vector< ParaMeta,std::allocator< ParaMeta > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t = {"_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t", "std::vector< ParameterSample,std::allocator< ParameterSample > > *|std::vector< ParameterSample > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t = {"_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t", "std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t = {"_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t", "std::vector< RealParameter *,std::allocator< RealParameter * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t = {"_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t", "std::vector< SimulationElement,std::allocator< SimulationElement > > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t = {"_p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t", "std::vector< char const *,std::allocator< char const * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
 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};
 static swig_type_info _swigt__p_std__vectorT_size_t_std__allocatorT_size_t_t_t = {"_p_std__vectorT_size_t_std__allocatorT_size_t_t_t", "std::vector< size_t,std::allocator< size_t > > *", 0, 0, (void*)0, 0};
@@ -136177,12 +136553,14 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_MillerIndex,
   &_swigt__p_MillerIndexOrientation,
   &_swigt__p_MultiLayer,
+  &_swigt__p_NodeMeta,
   &_swigt__p_OffSpecSimulation,
   &_swigt__p_OutputDataIteratorT_double_OutputDataT_double_t_t,
   &_swigt__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t,
   &_swigt__p_OutputDataT_CumulativeValue_t,
   &_swigt__p_OutputDataT_bool_t,
   &_swigt__p_OutputDataT_double_t,
+  &_swigt__p_ParaMeta,
   &_swigt__p_ParameterDistribution,
   &_swigt__p_ParameterPool,
   &_swigt__p_ParameterSample,
@@ -136308,11 +136686,11 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t,
   &_swigt__p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t,
   &_swigt__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t,
+  &_swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
   &_swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t,
   &_swigt__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t,
   &_swigt__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t,
   &_swigt__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,
-  &_swigt__p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,
   &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
   &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
   &_swigt__p_std__vectorT_size_t_std__allocatorT_size_t_t_t,
@@ -136520,12 +136898,14 @@ static swig_cast_info _swigc__p_MesoCrystal[] = {  {&_swigt__p_MesoCrystal, 0, 0
 static swig_cast_info _swigc__p_MillerIndex[] = {  {&_swigt__p_MillerIndex, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_MillerIndexOrientation[] = {  {&_swigt__p_MillerIndexOrientation, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_MultiLayer[] = {  {&_swigt__p_MultiLayer, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_NodeMeta[] = {  {&_swigt__p_NodeMeta, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_OffSpecSimulation[] = {  {&_swigt__p_OffSpecSimulation, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_OutputDataIteratorT_double_OutputDataT_double_t_t[] = {  {&_swigt__p_OutputDataIteratorT_double_OutputDataT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t[] = {  {&_swigt__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_OutputDataT_CumulativeValue_t[] = {  {&_swigt__p_OutputDataT_CumulativeValue_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_OutputDataT_bool_t[] = {  {&_swigt__p_OutputDataT_bool_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_OutputDataT_double_t[] = {  {&_swigt__p_OutputDataT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ParaMeta[] = {  {&_swigt__p_ParaMeta, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ParameterDistribution[] = {  {&_swigt__p_ParameterDistribution, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ParameterPool[] = {  {&_swigt__p_ParameterPool, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ParameterSample[] = {  {&_swigt__p_ParameterSample, 0, 0, 0},{0, 0, 0, 0}};
@@ -136651,11 +137031,11 @@ static swig_cast_info _swigc__p_std__vectorT_ILayout_const_p_std__allocatorT_ILa
 static swig_cast_info _swigc__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t[] = {  {&_swigt__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t[] = {  {&_swigt__p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t[] = {  {&_swigt__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t[] = {  {&_swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t[] = {  {&_swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t[] = {  {&_swigt__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t[] = {  {&_swigt__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t[] = {  {&_swigt__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t[] = {  {&_swigt__p_std__vectorT_char_const_p_std__allocatorT_char_const_p_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}};
 static swig_cast_info _swigc__p_std__vectorT_size_t_std__allocatorT_size_t_t_t[] = {  {&_swigt__p_std__vectorT_size_t_std__allocatorT_size_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -136863,12 +137243,14 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_MillerIndex,
   _swigc__p_MillerIndexOrientation,
   _swigc__p_MultiLayer,
+  _swigc__p_NodeMeta,
   _swigc__p_OffSpecSimulation,
   _swigc__p_OutputDataIteratorT_double_OutputDataT_double_t_t,
   _swigc__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t,
   _swigc__p_OutputDataT_CumulativeValue_t,
   _swigc__p_OutputDataT_bool_t,
   _swigc__p_OutputDataT_double_t,
+  _swigc__p_ParaMeta,
   _swigc__p_ParameterDistribution,
   _swigc__p_ParameterPool,
   _swigc__p_ParameterSample,
@@ -136994,11 +137376,11 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t,
   _swigc__p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t,
   _swigc__p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t,
+  _swigc__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
   _swigc__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t,
   _swigc__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t,
   _swigc__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t,
   _swigc__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,
-  _swigc__p_std__vectorT_char_const_p_std__allocatorT_char_const_p_t_t,
   _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
   _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
   _swigc__p_std__vectorT_size_t_std__allocatorT_size_t_t_t,
diff --git a/auto/Wrap/libBornAgainCore_wrap.h b/auto/Wrap/libBornAgainCore_wrap.h
index 5e57ea61c17b450f34197c3cf3be748be8dcb2cd..6be650fb65d92d5109bfe24b902e52e3000f5d9f 100644
--- a/auto/Wrap/libBornAgainCore_wrap.h
+++ b/auto/Wrap/libBornAgainCore_wrap.h
@@ -106,7 +106,7 @@ class SwigDirector_INode : public INode, public Swig::Director {
 
 public:
     SwigDirector_INode(PyObject *self);
-    SwigDirector_INode(PyObject *self, INode const *parent, std::vector< char const *, std::allocator< char const * > > const &PName, std::vector< char const *, std::allocator< char const * > > const &PUnit, std::vector< double, std::allocator< double > > const &PMin, std::vector< double, std::allocator< double > > const &PMax, std::vector< double, std::allocator< double > > const &PDefault, std::vector< double, std::allocator< double > > const &P);
+    SwigDirector_INode(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues);
     virtual ~SwigDirector_INode();
     virtual ParameterPool *createParameterTree() const;
     virtual void onChange();
@@ -154,7 +154,7 @@ class SwigDirector_ISample : public ISample, public Swig::Director {
 
 public:
     SwigDirector_ISample(PyObject *self);
-    SwigDirector_ISample(PyObject *self, INode const *parent, std::vector< char const *, std::allocator< char const * > > const &PName, std::vector< char const *, std::allocator< char const * > > const &PUnit, std::vector< double, std::allocator< double > > const &PMin, std::vector< double, std::allocator< double > > const &PMax, std::vector< double, std::allocator< double > > const &PDefault, std::vector< double, std::allocator< double > > const &P);
+    SwigDirector_ISample(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues);
     virtual ~SwigDirector_ISample();
     virtual ISample *clone() const;
     virtual void transferToCPP();
@@ -205,7 +205,7 @@ class SwigDirector_IFormFactor : public IFormFactor, public Swig::Director {
 
 public:
     SwigDirector_IFormFactor(PyObject *self);
-    SwigDirector_IFormFactor(PyObject *self, INode const *parent, std::vector< char const *, std::allocator< char const * > > const &PName, std::vector< char const *, std::allocator< char const * > > const &PUnit, std::vector< double, std::allocator< double > > const &PMin, std::vector< double, std::allocator< double > > const &PMax, std::vector< double, std::allocator< double > > const &PDefault, std::vector< double, std::allocator< double > > const &P);
+    SwigDirector_IFormFactor(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues);
     virtual ~SwigDirector_IFormFactor();
     virtual IFormFactor *clone() const;
     virtual void transferToCPP();
@@ -270,7 +270,7 @@ class SwigDirector_IFormFactorBorn : public IFormFactorBorn, public Swig::Direct
 
 public:
     SwigDirector_IFormFactorBorn(PyObject *self);
-    SwigDirector_IFormFactorBorn(PyObject *self, INode const *parent, std::vector< char const *, std::allocator< char const * > > const &PName, std::vector< char const *, std::allocator< char const * > > const &PUnit, std::vector< double, std::allocator< double > > const &PMin, std::vector< double, std::allocator< double > > const &PMax, std::vector< double, std::allocator< double > > const &PDefault, std::vector< double, std::allocator< double > > const &P);
+    SwigDirector_IFormFactorBorn(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues);
     virtual ~SwigDirector_IFormFactorBorn();
     virtual IFormFactorBorn *clone() const;
     virtual void transferToCPP();