diff --git a/GUI/Model/Files/DatafilesSet.cpp b/GUI/Model/Files/DatafilesSet.cpp
index 6bcaed4366b6ccbabd86549fcef67f1eca8e32b9..c2a105bd1c8856c297f9e894a305f4738c53774b 100644
--- a/GUI/Model/Files/DatafilesSet.cpp
+++ b/GUI/Model/Files/DatafilesSet.cpp
@@ -33,20 +33,31 @@ DatafilesSet::DatafilesSet()
 
 DatafilesSet::~DatafilesSet() = default;
 
-QVector<DataItem*> DatafilesSet::dataItems() const
+void DatafilesSet::insertDatafileItem(DatafileItem* dfi)
 {
-    QVector<DataItem*> result;
-    for (auto* dfile_item : dfileItems())
-        if (auto* data_item = dfile_item->dataItem())
-            result.push_back(data_item);
+    m_dfile_items.emplace_back(dfi);
+}
 
-    return result;
+void DatafilesSet::removeDatafileItem(DatafileItem* dfi)
+{
+    ASSERT(dfi);
+    int index = dfileItems().indexOf(dfi);
+    m_dfile_items.erase(m_dfile_items.begin() + index);
 }
 
 void DatafilesSet::clear()
 {
+    for (auto* dfi : dfileItems())
+        removeDatafileItem(dfi);
+}
+
+QVector<DataItem*> DatafilesSet::dataItems() const
+{
+    QVector<DataItem*> result;
     for (auto* dfile_item : dfileItems())
-        removeDatafileItem(dfile_item);
+        if (auto* data_item = dfile_item->dataItem())
+            result.push_back(data_item);
+    return result;
 }
 
 void DatafilesSet::writeTo(QXmlStreamWriter* w) const
@@ -113,11 +124,6 @@ void DatafilesSet::readDatafiles(const QString& projectDir, MessageService* mess
     dataFilesCleaner.recollectDataNames(dataItems());
 }
 
-void DatafilesSet::insertDatafileItem(DatafileItem* dfi)
-{
-    m_dfile_items.emplace_back(dfi);
-}
-
 QVector<DatafileItem*> DatafilesSet::dfileItems() const
 {
     QVector<DatafileItem*> items(m_dfile_items.size());
@@ -126,13 +132,6 @@ QVector<DatafileItem*> DatafilesSet::dfileItems() const
     return items;
 }
 
-void DatafilesSet::removeDatafileItem(DatafileItem* dfile_item)
-{
-    ASSERT(dfile_item);
-    int index = dfileItems().indexOf(dfile_item);
-    m_dfile_items.erase(m_dfile_items.begin() + index);
-}
-
 QStringList DatafilesSet::realItemNames() const
 {
     QStringList result;
diff --git a/GUI/Model/Files/DatafilesSet.h b/GUI/Model/Files/DatafilesSet.h
index 36bc2693bcc0bbb83fde946eb26f4cd9f02ec3ad..38f9e45ec9875b971b234543a2ebc76cf4c0c768 100644
--- a/GUI/Model/Files/DatafilesSet.h
+++ b/GUI/Model/Files/DatafilesSet.h
@@ -31,7 +31,7 @@ public:
     ~DatafilesSet();
 
     void insertDatafileItem(DatafileItem* dfi);
-    void removeDatafileItem(DatafileItem* realItem);
+    void removeDatafileItem(DatafileItem* dfi);
     void clear();
     void readFrom(QXmlStreamReader* r);
     void readDatafiles(const QString& projectDir, MessageService* messageService);
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index 6a86acb46a9e2b4f1981f2613900f94e1b352c07..9e881cbff67652dc085ac3cedb103013a73d624f 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -2853,6 +2853,23 @@ class IParticle(ISampleNode):
 
 # Register IParticle in _libBornAgainSample:
 _libBornAgainSample.IParticle_swigregister(IParticle)
+class ShapeIndexes(object):
+    r"""Proxy of C++ ShapeIndexes class."""
+
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+    min = property(_libBornAgainSample.ShapeIndexes_min_get, _libBornAgainSample.ShapeIndexes_min_set, doc=r"""min : I3""")
+    max = property(_libBornAgainSample.ShapeIndexes_max_get, _libBornAgainSample.ShapeIndexes_max_set, doc=r"""max : I3""")
+    basisIndexes = property(_libBornAgainSample.ShapeIndexes_basisIndexes_get, _libBornAgainSample.ShapeIndexes_basisIndexes_set, doc=r"""basisIndexes : std::vector<(I3,std::allocator<(I3)>)>""")
+    k_pairs = property(_libBornAgainSample.ShapeIndexes_k_pairs_get, _libBornAgainSample.ShapeIndexes_k_pairs_set, doc=r"""k_pairs : std::vector<(std::vector<(std::vector<(std::pair<(int,int)>,std::allocator<(std::pair<(int,int)>)>)>,std::allocator<(std::vector<(std::pair<(int,int)>,std::allocator<(std::pair<(int,int)>)>)>)>)>,std::allocator<(std::vector<(std::vector<(std::pair<(int,int)>,std::allocator<(std::pair<(int,int)>)>)>,std::allocator<(std::vector<(std::pair<(int,int)>,std::allocator<(std::pair<(int,int)>)>)>)>)>)>)>""")
+
+    def __init__(self):
+        r"""__init__(ShapeIndexes self) -> ShapeIndexes"""
+        _libBornAgainSample.ShapeIndexes_swiginit(self, _libBornAgainSample.new_ShapeIndexes())
+    __swig_destroy__ = _libBornAgainSample.delete_ShapeIndexes
+
+# Register ShapeIndexes in _libBornAgainSample:
+_libBornAgainSample.ShapeIndexes_swigregister(ShapeIndexes)
 class Mesocrystal(IParticle):
     r"""Proxy of C++ Mesocrystal class."""
 
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index c2a7c3c4499655abfeb2498c7736337ad1908ba9..261fb5d1064dc4fb94f2e4a97e1e56f124ad5345 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -3739,68 +3739,71 @@ namespace Swig {
 #define SWIGTYPE_p_SawtoothRippleBox swig_types[95]
 #define SWIGTYPE_p_SawtoothRippleGauss swig_types[96]
 #define SWIGTYPE_p_SawtoothRippleLorentz swig_types[97]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[98]
-#define SWIGTYPE_p_Span swig_types[99]
-#define SWIGTYPE_p_Sphere swig_types[100]
-#define SWIGTYPE_p_Spheroid swig_types[101]
-#define SWIGTYPE_p_SpinMatrix swig_types[102]
-#define SWIGTYPE_p_SquareLattice2D swig_types[103]
-#define SWIGTYPE_p_TruncatedCube swig_types[104]
-#define SWIGTYPE_p_TruncatedSphere swig_types[105]
-#define SWIGTYPE_p_TruncatedSpheroid swig_types[106]
-#define SWIGTYPE_p_Vec3T_double_t swig_types[107]
-#define SWIGTYPE_p_Vec3T_int_t swig_types[108]
-#define SWIGTYPE_p_Vec3T_std__complexT_double_t_t swig_types[109]
-#define SWIGTYPE_p_WavevectorInfo swig_types[110]
-#define SWIGTYPE_p_allocator_type swig_types[111]
-#define SWIGTYPE_p_char swig_types[112]
-#define SWIGTYPE_p_difference_type swig_types[113]
-#define SWIGTYPE_p_first_type swig_types[114]
-#define SWIGTYPE_p_int swig_types[115]
-#define SWIGTYPE_p_key_type swig_types[116]
-#define SWIGTYPE_p_long_long swig_types[117]
-#define SWIGTYPE_p_mapped_type swig_types[118]
-#define SWIGTYPE_p_p_PyObject swig_types[119]
-#define SWIGTYPE_p_second_type swig_types[120]
-#define SWIGTYPE_p_short swig_types[121]
-#define SWIGTYPE_p_signed_char swig_types[122]
-#define SWIGTYPE_p_size_type swig_types[123]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[124]
-#define SWIGTYPE_p_std__allocatorT_Vec3T_double_t_t swig_types[125]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[126]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[127]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[128]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[129]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[130]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[131]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_t_t swig_types[132]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_t_t swig_types[133]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[134]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[135]
-#define SWIGTYPE_p_std__functionT_double_fdoubleF_t swig_types[136]
-#define SWIGTYPE_p_std__invalid_argument swig_types[137]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[138]
-#define SWIGTYPE_p_std__mapT_std__string_double_t swig_types[139]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[140]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_t swig_types[141]
-#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[142]
-#define SWIGTYPE_p_std__vectorT_Vec3T_double_t_t swig_types[143]
-#define SWIGTYPE_p_std__vectorT_double_t swig_types[144]
-#define SWIGTYPE_p_std__vectorT_int_t swig_types[145]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_t swig_types[146]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_t swig_types[147]
-#define SWIGTYPE_p_std__vectorT_std__string_t swig_types[148]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_t_t swig_types[149]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_t_t swig_types[150]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_t swig_types[151]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[152]
-#define SWIGTYPE_p_unsigned_char swig_types[153]
-#define SWIGTYPE_p_unsigned_int swig_types[154]
-#define SWIGTYPE_p_unsigned_long_long swig_types[155]
-#define SWIGTYPE_p_unsigned_short swig_types[156]
-#define SWIGTYPE_p_value_type swig_types[157]
-static swig_type_info *swig_types[159];
-static swig_module_info swig_module = {swig_types, 158, 0, 0, 0, 0};
+#define SWIGTYPE_p_ShapeIndexes swig_types[98]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[99]
+#define SWIGTYPE_p_Span swig_types[100]
+#define SWIGTYPE_p_Sphere swig_types[101]
+#define SWIGTYPE_p_Spheroid swig_types[102]
+#define SWIGTYPE_p_SpinMatrix swig_types[103]
+#define SWIGTYPE_p_SquareLattice2D swig_types[104]
+#define SWIGTYPE_p_TruncatedCube swig_types[105]
+#define SWIGTYPE_p_TruncatedSphere swig_types[106]
+#define SWIGTYPE_p_TruncatedSpheroid swig_types[107]
+#define SWIGTYPE_p_Vec3T_double_t swig_types[108]
+#define SWIGTYPE_p_Vec3T_int_t swig_types[109]
+#define SWIGTYPE_p_Vec3T_std__complexT_double_t_t swig_types[110]
+#define SWIGTYPE_p_WavevectorInfo swig_types[111]
+#define SWIGTYPE_p_allocator_type swig_types[112]
+#define SWIGTYPE_p_char swig_types[113]
+#define SWIGTYPE_p_difference_type swig_types[114]
+#define SWIGTYPE_p_first_type swig_types[115]
+#define SWIGTYPE_p_int swig_types[116]
+#define SWIGTYPE_p_key_type swig_types[117]
+#define SWIGTYPE_p_long_long swig_types[118]
+#define SWIGTYPE_p_mapped_type swig_types[119]
+#define SWIGTYPE_p_p_PyObject swig_types[120]
+#define SWIGTYPE_p_second_type swig_types[121]
+#define SWIGTYPE_p_short swig_types[122]
+#define SWIGTYPE_p_signed_char swig_types[123]
+#define SWIGTYPE_p_size_type swig_types[124]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[125]
+#define SWIGTYPE_p_std__allocatorT_Vec3T_double_t_t swig_types[126]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[127]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[128]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[129]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[130]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[131]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[132]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_t_t swig_types[133]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_t_t swig_types[134]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[135]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[136]
+#define SWIGTYPE_p_std__functionT_double_fdoubleF_t swig_types[137]
+#define SWIGTYPE_p_std__invalid_argument swig_types[138]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[139]
+#define SWIGTYPE_p_std__mapT_std__string_double_t swig_types[140]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[141]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_t swig_types[142]
+#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[143]
+#define SWIGTYPE_p_std__vectorT_Vec3T_double_t_t swig_types[144]
+#define SWIGTYPE_p_std__vectorT_Vec3T_int_t_std__allocatorT_Vec3T_int_t_t_t swig_types[145]
+#define SWIGTYPE_p_std__vectorT_double_t swig_types[146]
+#define SWIGTYPE_p_std__vectorT_int_t swig_types[147]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_t swig_types[148]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_t swig_types[149]
+#define SWIGTYPE_p_std__vectorT_std__string_t swig_types[150]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_t_t swig_types[151]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_t_t swig_types[152]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_std__allocatorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_t_t swig_types[153]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_t swig_types[154]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[155]
+#define SWIGTYPE_p_unsigned_char swig_types[156]
+#define SWIGTYPE_p_unsigned_int swig_types[157]
+#define SWIGTYPE_p_unsigned_long_long swig_types[158]
+#define SWIGTYPE_p_unsigned_short swig_types[159]
+#define SWIGTYPE_p_value_type swig_types[160]
+static swig_type_info *swig_types[162];
+static swig_module_info swig_module = {swig_types, 161, 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)
 
@@ -38180,6 +38183,290 @@ SWIGINTERN PyObject *IParticle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyOb
   return SWIG_Py_Void();
 }
 
+SWIGINTERN PyObject *_wrap_ShapeIndexes_min_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *arg1 = (ShapeIndexes *) 0 ;
+  I3 *arg2 = (I3 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  (void)self;
+  if (!SWIG_Python_UnpackTuple(args, "ShapeIndexes_min_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ShapeIndexes, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ShapeIndexes_min_set" "', argument " "1"" of type '" "ShapeIndexes *""'"); 
+  }
+  arg1 = reinterpret_cast< ShapeIndexes * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_Vec3T_int_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ShapeIndexes_min_set" "', argument " "2"" of type '" "I3 *""'"); 
+  }
+  arg2 = reinterpret_cast< I3 * >(argp2);
+  if (arg1) (arg1)->min = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ShapeIndexes_min_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *arg1 = (ShapeIndexes *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  I3 *result = 0 ;
+  
+  (void)self;
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ShapeIndexes, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ShapeIndexes_min_get" "', argument " "1"" of type '" "ShapeIndexes *""'"); 
+  }
+  arg1 = reinterpret_cast< ShapeIndexes * >(argp1);
+  result = (I3 *)& ((arg1)->min);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Vec3T_int_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ShapeIndexes_max_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *arg1 = (ShapeIndexes *) 0 ;
+  I3 *arg2 = (I3 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  (void)self;
+  if (!SWIG_Python_UnpackTuple(args, "ShapeIndexes_max_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ShapeIndexes, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ShapeIndexes_max_set" "', argument " "1"" of type '" "ShapeIndexes *""'"); 
+  }
+  arg1 = reinterpret_cast< ShapeIndexes * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_Vec3T_int_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ShapeIndexes_max_set" "', argument " "2"" of type '" "I3 *""'"); 
+  }
+  arg2 = reinterpret_cast< I3 * >(argp2);
+  if (arg1) (arg1)->max = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ShapeIndexes_max_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *arg1 = (ShapeIndexes *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  I3 *result = 0 ;
+  
+  (void)self;
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ShapeIndexes, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ShapeIndexes_max_get" "', argument " "1"" of type '" "ShapeIndexes *""'"); 
+  }
+  arg1 = reinterpret_cast< ShapeIndexes * >(argp1);
+  result = (I3 *)& ((arg1)->max);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Vec3T_int_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ShapeIndexes_basisIndexes_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *arg1 = (ShapeIndexes *) 0 ;
+  std::vector< I3,std::allocator< I3 > > *arg2 = (std::vector< I3,std::allocator< I3 > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  (void)self;
+  if (!SWIG_Python_UnpackTuple(args, "ShapeIndexes_basisIndexes_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ShapeIndexes, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ShapeIndexes_basisIndexes_set" "', argument " "1"" of type '" "ShapeIndexes *""'"); 
+  }
+  arg1 = reinterpret_cast< ShapeIndexes * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_Vec3T_int_t_std__allocatorT_Vec3T_int_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ShapeIndexes_basisIndexes_set" "', argument " "2"" of type '" "std::vector< I3,std::allocator< I3 > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< I3,std::allocator< I3 > > * >(argp2);
+  if (arg1) (arg1)->basisIndexes = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ShapeIndexes_basisIndexes_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *arg1 = (ShapeIndexes *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< I3,std::allocator< I3 > > *result = 0 ;
+  
+  (void)self;
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ShapeIndexes, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ShapeIndexes_basisIndexes_get" "', argument " "1"" of type '" "ShapeIndexes *""'"); 
+  }
+  arg1 = reinterpret_cast< ShapeIndexes * >(argp1);
+  result = (std::vector< I3,std::allocator< I3 > > *)& ((arg1)->basisIndexes);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_Vec3T_int_t_std__allocatorT_Vec3T_int_t_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ShapeIndexes_k_pairs_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *arg1 = (ShapeIndexes *) 0 ;
+  std::vector< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > >,std::allocator< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > > > > *arg2 = (std::vector< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > >,std::allocator< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  (void)self;
+  if (!SWIG_Python_UnpackTuple(args, "ShapeIndexes_k_pairs_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ShapeIndexes, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ShapeIndexes_k_pairs_set" "', argument " "1"" of type '" "ShapeIndexes *""'"); 
+  }
+  arg1 = reinterpret_cast< ShapeIndexes * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_std__allocatorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ShapeIndexes_k_pairs_set" "', argument " "2"" of type '" "std::vector< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > >,std::allocator< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > > > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > >,std::allocator< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > > > > * >(argp2);
+  if (arg1) (arg1)->k_pairs = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ShapeIndexes_k_pairs_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *arg1 = (ShapeIndexes *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > >,std::allocator< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > > > > *result = 0 ;
+  
+  (void)self;
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ShapeIndexes, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ShapeIndexes_k_pairs_get" "', argument " "1"" of type '" "ShapeIndexes *""'"); 
+  }
+  arg1 = reinterpret_cast< ShapeIndexes * >(argp1);
+  result = (std::vector< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > >,std::allocator< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > > > > *)& ((arg1)->k_pairs);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_std__allocatorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ShapeIndexes(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *result = 0 ;
+  
+  (void)self;
+  if (!SWIG_Python_UnpackTuple(args, "new_ShapeIndexes", 0, 0, 0)) SWIG_fail;
+  {
+    try {
+      result = (ShapeIndexes *)new ShapeIndexes();
+    } catch (const std::exception& ex) {
+      // message shown in the Python interpreter
+      const std::string msg {
+        "BornAgain C++ Exception: " + std::string(ex.what())
+      };
+      SWIG_exception(SWIG_RuntimeError, msg.c_str());
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ShapeIndexes, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ShapeIndexes(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  ShapeIndexes *arg1 = (ShapeIndexes *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  (void)self;
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ShapeIndexes, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ShapeIndexes" "', argument " "1"" of type '" "ShapeIndexes *""'"); 
+  }
+  arg1 = reinterpret_cast< ShapeIndexes * >(argp1);
+  {
+    try {
+      delete arg1;
+    } catch (const std::exception& ex) {
+      // message shown in the Python interpreter
+      const std::string msg {
+        "BornAgain C++ Exception: " + std::string(ex.what())
+      };
+      SWIG_exception(SWIG_RuntimeError, msg.c_str());
+    }
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ShapeIndexes_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ShapeIndexes, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *ShapeIndexes_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
 SWIGINTERN PyObject *_wrap_new_Mesocrystal(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   Crystal *arg1 = 0 ;
@@ -71375,6 +71662,18 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "IParticle_rotate", _wrap_IParticle_rotate, METH_VARARGS, "IParticle_rotate(IParticle self, IRotation rotation) -> IParticle"},
 	 { "IParticle_swigregister", IParticle_swigregister, METH_O, NULL},
+	 { "ShapeIndexes_min_set", _wrap_ShapeIndexes_min_set, METH_VARARGS, "ShapeIndexes_min_set(ShapeIndexes self, I3 * min)"},
+	 { "ShapeIndexes_min_get", _wrap_ShapeIndexes_min_get, METH_O, "ShapeIndexes_min_get(ShapeIndexes self) -> I3 *"},
+	 { "ShapeIndexes_max_set", _wrap_ShapeIndexes_max_set, METH_VARARGS, "ShapeIndexes_max_set(ShapeIndexes self, I3 * max)"},
+	 { "ShapeIndexes_max_get", _wrap_ShapeIndexes_max_get, METH_O, "ShapeIndexes_max_get(ShapeIndexes self) -> I3 *"},
+	 { "ShapeIndexes_basisIndexes_set", _wrap_ShapeIndexes_basisIndexes_set, METH_VARARGS, "ShapeIndexes_basisIndexes_set(ShapeIndexes self, std::vector< I3,std::allocator< I3 > > * basisIndexes)"},
+	 { "ShapeIndexes_basisIndexes_get", _wrap_ShapeIndexes_basisIndexes_get, METH_O, "ShapeIndexes_basisIndexes_get(ShapeIndexes self) -> std::vector< I3,std::allocator< I3 > > *"},
+	 { "ShapeIndexes_k_pairs_set", _wrap_ShapeIndexes_k_pairs_set, METH_VARARGS, "ShapeIndexes_k_pairs_set(ShapeIndexes self, std::vector< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > >,std::allocator< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > > > > * k_pairs)"},
+	 { "ShapeIndexes_k_pairs_get", _wrap_ShapeIndexes_k_pairs_get, METH_O, "ShapeIndexes_k_pairs_get(ShapeIndexes self) -> std::vector< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > >,std::allocator< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > > > > *"},
+	 { "new_ShapeIndexes", _wrap_new_ShapeIndexes, METH_NOARGS, "new_ShapeIndexes() -> ShapeIndexes"},
+	 { "delete_ShapeIndexes", _wrap_delete_ShapeIndexes, METH_O, "delete_ShapeIndexes(ShapeIndexes self)"},
+	 { "ShapeIndexes_swigregister", ShapeIndexes_swigregister, METH_O, NULL},
+	 { "ShapeIndexes_swiginit", ShapeIndexes_swiginit, METH_VARARGS, NULL},
 	 { "new_Mesocrystal", _wrap_new_Mesocrystal, METH_VARARGS, "new_Mesocrystal(Crystal crystal, IFormFactor formfactor) -> Mesocrystal"},
 	 { "delete_Mesocrystal", _wrap_delete_Mesocrystal, METH_O, "delete_Mesocrystal(Mesocrystal self)"},
 	 { "Mesocrystal_clone", _wrap_Mesocrystal_clone, METH_O, "Mesocrystal_clone(Mesocrystal self) -> Mesocrystal"},
@@ -73563,6 +73862,7 @@ static swig_type_info _swigt__p_RoughnessModelWrap__RoughnessModel = {"_p_Roughn
 static swig_type_info _swigt__p_SawtoothRippleBox = {"_p_SawtoothRippleBox", "SawtoothRippleBox *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SawtoothRippleGauss = {"_p_SawtoothRippleGauss", "SawtoothRippleGauss *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SawtoothRippleLorentz = {"_p_SawtoothRippleLorentz", "SawtoothRippleLorentz *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ShapeIndexes = {"_p_ShapeIndexes", "ShapeIndexes *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SimpleSelectionRule = {"_p_SimpleSelectionRule", "SimpleSelectionRule *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Span = {"_p_Span", "Span *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Sphere = {"_p_Sphere", "Sphere *", 0, 0, (void*)0, 0};
@@ -73609,6 +73909,7 @@ static swig_type_info _swigt__p_std__pairT_double_double_t = {"_p_std__pairT_dou
 static swig_type_info _swigt__p_std__vectorT_INode_const_p_t = {"_p_std__vectorT_INode_const_p_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_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_Vec3T_double_t_t = {"_p_std__vectorT_Vec3T_double_t_t", "std::vector< Vec3< double >,std::allocator< Vec3< double > > > *|std::vector< Vec3< double > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_Vec3T_int_t_std__allocatorT_Vec3T_int_t_t_t = {"_p_std__vectorT_Vec3T_int_t_std__allocatorT_Vec3T_int_t_t_t", "std::vector< I3,std::allocator< I3 > > *|std::vector< Vec3< int >,std::allocator< Vec3< int > > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_double_t = {"_p_std__vectorT_double_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_int_t = {"_p_std__vectorT_int_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_std__complexT_double_t_t = {"_p_std__vectorT_std__complexT_double_t_t", "std::vector< std::complex< double >,std::allocator< std::complex< double > > > *|std::vector< std::complex< double > > *", 0, 0, (void*)0, 0};
@@ -73616,6 +73917,7 @@ static swig_type_info _swigt__p_std__vectorT_std__pairT_double_double_t_t = {"_p
 static swig_type_info _swigt__p_std__vectorT_std__string_t = {"_p_std__vectorT_std__string_t", "std::vector< std::string,std::allocator< std::string > > *|std::vector< std::string > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_std__vectorT_double_t_t = {"_p_std__vectorT_std__vectorT_double_t_t", "std::vector< std::vector< double,std::allocator< double > > > *|std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *|std::vector< std::vector< double > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_std__vectorT_int_t_t = {"_p_std__vectorT_std__vectorT_int_t_t", "std::vector< std::vector< int,std::allocator< int > > > *|std::vector< std::vector< int,std::allocator< int > >,std::allocator< std::vector< int,std::allocator< int > > > > *|std::vector< std::vector< int > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_std__allocatorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_t_t = {"_p_std__vectorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_std__allocatorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_t_t", "std::vector< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > >,std::allocator< std::vector< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > >,std::allocator< std::vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > > > > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_unsigned_long_t = {"_p_std__vectorT_unsigned_long_t", "std::vector< unsigned long,std::allocator< unsigned long > > *|std::vector< unsigned long > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_swig__SwigPyIterator = {"_p_swig__SwigPyIterator", "swig::SwigPyIterator *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "uint8_t *|uint_fast8_t *|uint_least8_t *|unsigned char *", 0, 0, (void*)0, 0};
@@ -73723,6 +74025,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_SawtoothRippleBox,
   &_swigt__p_SawtoothRippleGauss,
   &_swigt__p_SawtoothRippleLorentz,
+  &_swigt__p_ShapeIndexes,
   &_swigt__p_SimpleSelectionRule,
   &_swigt__p_Span,
   &_swigt__p_Sphere,
@@ -73769,6 +74072,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__vectorT_INode_const_p_t,
   &_swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
   &_swigt__p_std__vectorT_Vec3T_double_t_t,
+  &_swigt__p_std__vectorT_Vec3T_int_t_std__allocatorT_Vec3T_int_t_t_t,
   &_swigt__p_std__vectorT_double_t,
   &_swigt__p_std__vectorT_int_t,
   &_swigt__p_std__vectorT_std__complexT_double_t_t,
@@ -73776,6 +74080,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__vectorT_std__string_t,
   &_swigt__p_std__vectorT_std__vectorT_double_t_t,
   &_swigt__p_std__vectorT_std__vectorT_int_t_t,
+  &_swigt__p_std__vectorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_std__allocatorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_t_t,
   &_swigt__p_std__vectorT_unsigned_long_t,
   &_swigt__p_swig__SwigPyIterator,
   &_swigt__p_unsigned_char,
@@ -73883,6 +74188,7 @@ static swig_cast_info _swigc__p_RoughnessModelWrap__RoughnessModel[] = {  {&_swi
 static swig_cast_info _swigc__p_SawtoothRippleBox[] = {  {&_swigt__p_SawtoothRippleBox, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SawtoothRippleGauss[] = {  {&_swigt__p_SawtoothRippleGauss, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SawtoothRippleLorentz[] = {  {&_swigt__p_SawtoothRippleLorentz, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ShapeIndexes[] = {  {&_swigt__p_ShapeIndexes, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SimpleSelectionRule[] = {  {&_swigt__p_SimpleSelectionRule, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Span[] = {  {&_swigt__p_Span, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Sphere[] = {  {&_swigt__p_Sphere, 0, 0, 0},{0, 0, 0, 0}};
@@ -73929,6 +74235,7 @@ static swig_cast_info _swigc__p_std__pairT_double_double_t[] = {  {&_swigt__p_st
 static swig_cast_info _swigc__p_std__vectorT_INode_const_p_t[] = {  {&_swigt__p_std__vectorT_INode_const_p_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_Vec3T_double_t_t[] = {  {&_swigt__p_std__vectorT_Vec3T_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_Vec3T_int_t_std__allocatorT_Vec3T_int_t_t_t[] = {  {&_swigt__p_std__vectorT_Vec3T_int_t_std__allocatorT_Vec3T_int_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_double_t[] = {  {&_swigt__p_std__vectorT_double_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_int_t[] = {  {&_swigt__p_std__vectorT_int_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_std__complexT_double_t_t[] = {  {&_swigt__p_std__vectorT_std__complexT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -73936,6 +74243,7 @@ static swig_cast_info _swigc__p_std__vectorT_std__pairT_double_double_t_t[] = {
 static swig_cast_info _swigc__p_std__vectorT_std__string_t[] = {  {&_swigt__p_std__vectorT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_std__vectorT_double_t_t[] = {  {&_swigt__p_std__vectorT_std__vectorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_std__vectorT_int_t_t[] = {  {&_swigt__p_std__vectorT_std__vectorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_std__allocatorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_t_t[] = {  {&_swigt__p_std__vectorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_std__allocatorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_unsigned_long_t[] = {  {&_swigt__p_std__vectorT_unsigned_long_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_swig__SwigPyIterator[] = {  {&_swigt__p_swig__SwigPyIterator, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_unsigned_char[] = {  {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}};
@@ -74043,6 +74351,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_SawtoothRippleBox,
   _swigc__p_SawtoothRippleGauss,
   _swigc__p_SawtoothRippleLorentz,
+  _swigc__p_ShapeIndexes,
   _swigc__p_SimpleSelectionRule,
   _swigc__p_Span,
   _swigc__p_Sphere,
@@ -74089,6 +74398,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__vectorT_INode_const_p_t,
   _swigc__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
   _swigc__p_std__vectorT_Vec3T_double_t_t,
+  _swigc__p_std__vectorT_Vec3T_int_t_std__allocatorT_Vec3T_int_t_t_t,
   _swigc__p_std__vectorT_double_t,
   _swigc__p_std__vectorT_int_t,
   _swigc__p_std__vectorT_std__complexT_double_t_t,
@@ -74096,6 +74406,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__vectorT_std__string_t,
   _swigc__p_std__vectorT_std__vectorT_double_t_t,
   _swigc__p_std__vectorT_std__vectorT_int_t_t,
+  _swigc__p_std__vectorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_std__allocatorT_std__vectorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_std__allocatorT_std__vectorT_std__pairT_int_int_t_std__allocatorT_std__pairT_int_int_t_t_t_t_t_t_t,
   _swigc__p_std__vectorT_unsigned_long_t,
   _swigc__p_swig__SwigPyIterator,
   _swigc__p_unsigned_char,