]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix issues for choice of shape
authorJérôme <jerome.lucas@cesgenslab.fr>
Fri, 16 Oct 2020 15:01:32 +0000 (17:01 +0200)
committerJérôme <jerome.lucas@cesgenslab.fr>
Fri, 16 Oct 2020 15:01:32 +0000 (17:01 +0200)
src/FeaturesAPI/FeaturesAPI_Fillet.cpp
src/FeaturesAPI/FeaturesAPI_Fillet.h
src/FeaturesPlugin/CMakeLists.txt
src/FeaturesPlugin/FeaturesPlugin_Fillet.cpp
src/FeaturesPlugin/FeaturesPlugin_Fillet.h
src/FeaturesPlugin/FeaturesPlugin_VersionedChFi.cpp
src/FeaturesPlugin/FeaturesPlugin_VersionedChFi.h
src/FeaturesPlugin/FeaturesPlugin_WidgetFilletMultiRadiuses.cpp
src/FeaturesPlugin/fillet_widget.xml

index 49af22190750de2008023a0184165a42d3c09ebc..531586796b374a33452938ecd1a2ad1c32d0fdb1 100644 (file)
@@ -141,14 +141,14 @@ FeaturesAPI_Fillet2D::FeaturesAPI_Fillet2D(const std::shared_ptr<ModelAPI_Featur
 }
 
 FeaturesAPI_Fillet2D::FeaturesAPI_Fillet2D(const std::shared_ptr<ModelAPI_Feature>& theFeature,
-                                           const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                           const std::list<ModelHighAPI_Selection>& theEdgesFaces,
                                            const ModelHighAPI_Double& theRadius1,
                                            const ModelHighAPI_Double& theRadius2)
   : FeaturesAPI_Fillet(theFeature)
 {
   if (initialize()) {
     fillAttribute(FeaturesPlugin_Fillet::CREATION_METHOD_VARYING_RADIUS(), mycreationMethod);
-    fillAttribute(theBaseObjects, mybaseObjects);
+    fillAttribute(theEdgesFaces, myedgesfacesselected);
     fillAttribute(theRadius1, mystartRadius);
     fillAttribute(theRadius2, myendRadius);
 
@@ -218,16 +218,15 @@ FeaturesAPI_Fillet2D::FeaturesAPI_Fillet2D(const std::shared_ptr<ModelAPI_Featur
 }
 
 FeaturesAPI_Fillet2D::FeaturesAPI_Fillet2D(const std::shared_ptr<ModelAPI_Feature>& theFeature,
-                                           const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                           const std::list<ModelHighAPI_Selection>& theEdgesFaces,
                                            const std::list<ModelHighAPI_Double>& thepointCurvCood,
                                            const std::list<ModelHighAPI_Double>& theRadius)
   : FeaturesAPI_Fillet(theFeature)
 {
   if (initialize()) {
     fillAttribute(FeaturesPlugin_Fillet::CREATION_METHOD_MULTIPLES_RADIUSES(), mycreationMethod);
-    fillAttribute(FeaturesPlugin_Fillet::CREATION_METHOD_BY_CURVILEAR_ABSCISSA(),
-                  mycreationMethodmulti);
-    fillAttribute(theBaseObjects, mybaseObjects);
+    fillAttribute(FeaturesPlugin_Fillet::CREATION_METHOD_BY_CURVILEAR_ABSCISSA(), mycreationMethodmulti);
+    fillAttribute(theEdgesFaces, myedgesfacesselected);
 
     int aRowIndex = 0;
     myvaluescurv()->setSize( thepointCurvCood.size(), 2 );
@@ -298,8 +297,7 @@ void FeaturesAPI_Fillet2D::dump(ModelHighAPI_Dumper& theDumper) const
           aBase->selectionList(FeaturesPlugin_Fillet::ARRAY_POINT_RADIUS_BY_POINTS());
       AttributeTablesPtr anAttrTable =
           aBase->tables(FeaturesPlugin_Fillet::VALUES_ID());
-      theDumper << aBase << " = model.addFilletMultiRadiusByPoints(" << aDocName;
-      theDumper << ", " << anAttrEdgeSelec;
+      theDumper << aBase << " = model.addFilletMultiRadiusByPoints(" << aDocName << ", " << anAttrEdgeSelec;
       theDumper << ", " << anAttrPoint ;
       theDumper<<", [";
       for(int aRow = 0; aRow < myvalues()->rows(); aRow++) {
@@ -311,10 +309,10 @@ void FeaturesAPI_Fillet2D::dump(ModelHighAPI_Dumper& theDumper) const
       theDumper<<"]";
 
     }else{
-      AttributeTablesPtr anAttrTable =
-          aBase->tables(FeaturesPlugin_Fillet::VALUES_CURV_ID());
-      theDumper << aBase << " = model.addFilletMultiRadiusBycurvAbs(" << aDocName;
-      theDumper << ", " << anAttrObjects;
+      AttributeSelectionListPtr anAttrEdgesFaces =
+                      aBase->selectionList(FeaturesPlugin_Fillet::EDGES_FACES_LIST_ID());
+      AttributeTablesPtr anAttrTable = aBase->tables(FeaturesPlugin_Fillet::VALUES_CURV_ID());
+      theDumper << aBase << " = model.addFilletMultiRadiusBycurvAbs(" << aDocName << ", " << anAttrEdgesFaces;
       theDumper << ", ";
       theDumper<<"[";
       for(int aRow = 0; aRow < myvaluescurv()->rows(); aRow++) {
@@ -332,14 +330,18 @@ void FeaturesAPI_Fillet2D::dump(ModelHighAPI_Dumper& theDumper) const
       theDumper<<"]";
     }
   }else
-  {  theDumper << aBase << " = model.addFillet(" << aDocName << ", " << anAttrObjects;
+  { 
 
     std::string aCreationMethod = aBase->string(FeaturesPlugin_Fillet::CREATION_METHOD())->value();
 
     if(aCreationMethod == FeaturesPlugin_Fillet::CREATION_METHOD_SINGLE_RADIUS()) {
+       theDumper << aBase << " = model.addFillet(" << aDocName << ", " << anAttrObjects;
       AttributeDoublePtr anAttrRadius = aBase->real(FeaturesPlugin_Fillet::RADIUS_ID());
       theDumper << ", " << anAttrRadius;
     } else if(aCreationMethod == FeaturesPlugin_Fillet::CREATION_METHOD_VARYING_RADIUS()) {
+      AttributeSelectionListPtr anAttrEdgesFaces =
+                      aBase->selectionList(FeaturesPlugin_Fillet::EDGES_FACES_LIST_ID());
+      theDumper << aBase << " = model.addFillet(" << aDocName << ", " << anAttrEdgesFaces;
       AttributeDoublePtr anAttrRadius1 = aBase->real(FeaturesPlugin_Fillet::START_RADIUS_ID());
       AttributeDoublePtr anAttrRadius2 = aBase->real(FeaturesPlugin_Fillet::END_RADIUS_ID());
       theDumper << ", " << anAttrRadius1 << ", " << anAttrRadius2;
index 367ec3523d5d864bac526c438499269d46a06cf3..c61c032d27a8d20d794675aa0bab53f04623a68b 100644 (file)
@@ -127,7 +127,7 @@ public:
   /// Constructor with values.
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_Fillet2D(const std::shared_ptr<ModelAPI_Feature>& theFeature,
-                                const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                const std::list<ModelHighAPI_Selection>& theEdgesFaces,
                                 const ModelHighAPI_Double& theRadius1,
                                 const ModelHighAPI_Double& theRadius2);
 
@@ -141,14 +141,14 @@ public:
   /// Constructor with values.
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_Fillet2D(const std::shared_ptr<ModelAPI_Feature>& theFeature,
-                                const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                const std::list<ModelHighAPI_Selection>& theEdgesFaces,
                                 const std::list<ModelHighAPI_Double>& thepointCurvCood,
                                 const std::list<ModelHighAPI_Double>& theRadius);
   /// Destructor.
   FEATURESAPI_EXPORT
   virtual ~FeaturesAPI_Fillet2D();
 
-  INTERFACE_10(FeaturesPlugin_Fillet::ID(),
+  INTERFACE_11(FeaturesPlugin_Fillet::ID(),
               creationMethod, FeaturesPlugin_Fillet::CREATION_METHOD(),
                               ModelAPI_AttributeString,
                               /** Creation method */,
@@ -160,10 +160,13 @@ public:
                            /** Base objects */,
               edgeselected, FeaturesPlugin_Fillet::EDGE_SELECTED_ID(),
                            ModelAPI_AttributeSelection,
-                           /** Base objects */,
+                           /** edge objects */,
+              edgesfacesselected, FeaturesPlugin_Fillet::EDGES_FACES_LIST_ID(),
+                           ModelAPI_AttributeSelectionList,
+                           /** edge and face objects */,
               arraypointradiusbypoint, FeaturesPlugin_Fillet::ARRAY_POINT_RADIUS_BY_POINTS(),
                            ModelAPI_AttributeSelectionList,
-                           /** Base objects */,
+                           /** selection points  */,
               myvalues, FeaturesPlugin_Fillet::VALUES_ID(),
                            ModelAPI_AttributeTables,
                            /** table for methode multi-radiuses by point */,
index 5c3ecc45ca148cdd841b603375441f0876e01ec4..08980575028dace120ca7cdc1f82a1850b654924 100644 (file)
@@ -683,6 +683,7 @@ ADD_UNIT_TESTS(TestExtrusion.py
                TestFillet_MultiLevelCompound_v95_2.py
                TestFillet_MultiLevelCompound_v95_3.py
                TestFillet_MultiLevelCompound_v95_4.py
+               TestFillet_MultiRadius.py
                TestChamfer_MultiLevelCompound_v0_1.py
                TestChamfer_MultiLevelCompound_v0_2.py
                TestChamfer_MultiLevelCompound_v0_3.py
index eb8794a033891a9115dba2ad81d1885087e9a467..41b786e7319a3d8dd4a0e998d9c97e4c45e0652c 100644 (file)
@@ -66,6 +66,9 @@ void FeaturesPlugin_Fillet::initAttributes()
   
   AttributePtr aSelectionList =
       data()->addAttribute(OBJECT_LIST_ID(), ModelAPI_AttributeSelectionList::typeId());
+
+  data()->addAttribute(EDGES_FACES_LIST_ID(), ModelAPI_AttributeSelectionList::typeId());
+
   data()->addAttribute(START_RADIUS_ID(), ModelAPI_AttributeDouble::typeId());
   data()->addAttribute(END_RADIUS_ID(), ModelAPI_AttributeDouble::typeId());
 
@@ -107,32 +110,26 @@ void FeaturesPlugin_Fillet::initAttributes()
 
 AttributePtr FeaturesPlugin_Fillet::objectsAttribute()
 { 
-  return attribute(OBJECT_LIST_ID());
-}
-
-void FeaturesPlugin_Fillet::attributeChanged(const std::string& theID)
-{
-  if (theID == EDGE_SELECTED_ID() 
-      && string(CREATION_METHOD())->value() == CREATION_METHOD_MULTIPLES_RADIUSES()
-      && string(CREATION_METHOD_MULTIPLES_RADIUSES())->value() == CREATION_METHOD_BY_POINTS()) {
-      
-    AttributeSelectionPtr anEdges =
-      std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(attribute(EDGE_SELECTED_ID()));
-    AttributeSelectionListPtr array = selectionList(OBJECT_LIST_ID());
-    if(array->isInitialized())
-      array->clear();
-    array->append(anEdges->context(), anEdges->value()); // anEdges->namingName() );
+  if( string(CREATION_METHOD())->value() == CREATION_METHOD_MULTIPLES_RADIUSES() )
+  {
+    if( string(CREATION_METHOD_MULTIPLES_RADIUSES())->value() == CREATION_METHOD_BY_POINTS())
+    {
+      return attribute(EDGE_SELECTED_ID());
+    }else{
+      return attribute(EDGES_FACES_LIST_ID());
+    }
+  }else if ( string(CREATION_METHOD())->value() == CREATION_METHOD_VARYING_RADIUS() )
+  {
+       return attribute(EDGES_FACES_LIST_ID());
 
   }
-  if( theID == OBJECT_LIST_ID() && 
-          !(string(CREATION_METHOD())->value() == CREATION_METHOD_MULTIPLES_RADIUSES()
-            && string(CREATION_METHOD_MULTIPLES_RADIUSES())->value() == CREATION_METHOD_BY_POINTS() ) ){
-      
-      data()->selection(EDGE_SELECTED_ID())->setValue(ObjectPtr(),GeomShapePtr());
 
-  }
+ return attribute(OBJECT_LIST_ID());
 
-  data()->execState(ModelAPI_StateMustBeUpdated);
+}
+
+void FeaturesPlugin_Fillet::attributeChanged(const std::string& theID)
+{
 }
 
 const std::string& FeaturesPlugin_Fillet::modifiedShapePrefix() const
index ff7f2774d459b7a300072451692bc106e87520d1..98b406cbe5d0fd85cb44eb6d8f6a740417005d2d 100644 (file)
@@ -91,6 +91,12 @@ public:
     static const std::string MY_OBJECT_LIST_ID("main_objects");
     return MY_OBJECT_LIST_ID;
   }
+  /// Attribute name of main objects.
+  inline static const std::string& EDGES_FACES_LIST_ID()
+  {
+    static const std::string MY_EDGES_FACES_LIST_ID("edges_faces_seleted");
+    return MY_EDGES_FACES_LIST_ID;
+  }
 
   /// Attribute name of start radius.
   inline static const std::string& START_RADIUS_ID()
index 7738cf1fec9278fbdcdf461f660910aaec5f4cdb..5a13070b26afc4a1b11306a9e3232195c2e25b3b 100644 (file)
@@ -114,58 +114,77 @@ bool FeaturesPlugin_VersionedChFi::processAttribute(const AttributePtr& theAttri
 {
   bool isStoreFullHierarchy = data()->version() == CHAMFERFILLET_VERSION_1;
 
+  AttributeSelectionPtr anObject = 
+                    std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(theAttribute);
+
+  if( anObject.get() )
+  {
+    if ( !addShapeInHierarchy(anObject , theObjects, isStoreFullHierarchy) ) 
+      return false;
+    return true;
+  }
   AttributeSelectionListPtr anObjectsSelList =
       std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(theAttribute);
   for (int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); ++anObjectsIndex) {
     AttributeSelectionPtr anObjectAttr = anObjectsSelList->value(anObjectsIndex);
-    GeomShapePtr anObject = anObjectAttr->value();
-    if (!anObject)
+
+    if ( !addShapeInHierarchy(anObjectAttr , theObjects, isStoreFullHierarchy) ) 
+       return false;
+  }
+  return true;
+}
+
+bool FeaturesPlugin_VersionedChFi::addShapeInHierarchy(const AttributeSelectionPtr& theAttribute,
+                                                       GeomAPI_ShapeHierarchy& theObjects,
+                                                       bool theIsStoreFullHierarchy)
+{
+  GeomShapePtr anObject = theAttribute->value();
+  if (!anObject)
+    return false;
+
+  ResultPtr aContext = theAttribute->context();
+  GeomShapePtr aParent;
+  if (aContext.get()) {
+    ResultBodyPtr aCtxOwner = ModelAPI_Tools::bodyOwner(aContext);
+    if (aCtxOwner && aCtxOwner->shape()->shapeType() == GeomAPI_Shape::COMPSOLID)
+    {
+      aContext = aCtxOwner;
+    }
+    aParent = aContext->shape();
+    if (!aParent)
       return false;
 
-    ResultPtr aContext = anObjectAttr->context();
-    GeomShapePtr aParent;
-    if (aContext.get()) {
-      ResultBodyPtr aCtxOwner = ModelAPI_Tools::bodyOwner(aContext);
-      if (aCtxOwner && aCtxOwner->shape()->shapeType() == GeomAPI_Shape::COMPSOLID)
-      {
-        aContext = aCtxOwner;
+    // store full shape hierarchy for the corresponding version only
+    if (anObject->shapeType() <= GeomAPI_Shape::SOLID)
+    {
+      ListOfShape anEdges;
+      collectSubs(aParent, anEdges, GeomAPI_Shape::EDGE);
+      for (ListOfShape::iterator anIt = anEdges.begin(); anIt != anEdges.end(); ++anIt) {
+        theObjects.addObject(*anIt);
+        theObjects.addParent(*anIt, aParent);
       }
-      aParent = aContext->shape();
+    }else
+    {
+      theObjects.addObject(anObject);
+      theObjects.addParent(anObject, aParent);
+    }
+    
+    if (theIsStoreFullHierarchy)
+      ModelAPI_Tools::fillShapeHierarchy(aParent, aContext, theObjects);
+  } else { // get it from a feature
+    FeaturePtr aFeature = theAttribute->contextFeature();
+    if (aFeature.get()) {
+      aParent = aFeature->firstResult()->shape();
       if (!aParent)
         return false;
 
-      // store full shape hierarchy for the corresponding version only
-      if (anObject->shapeType() <= GeomAPI_Shape::SOLID)
-      {
-        ListOfShape anEdges;
-        collectSubs(aParent, anEdges, GeomAPI_Shape::EDGE);
-        for (ListOfShape::iterator anIt = anEdges.begin(); anIt != anEdges.end(); ++anIt) {
-          theObjects.addObject(*anIt);
-          theObjects.addParent(*anIt, aParent);
-        }
-      }else
-      {
-        theObjects.addObject(anObject);
-        theObjects.addParent(anObject, aParent);
-      }
-      
-      if (isStoreFullHierarchy)
-        ModelAPI_Tools::fillShapeHierarchy(aParent, aContext, theObjects);
-    } else { // get it from a feature
-      FeaturePtr aFeature = anObjectAttr->contextFeature();
-      if (aFeature.get()) {
-        aParent = aFeature->firstResult()->shape();
-        if (!aParent)
-          return false;
-
-        ListOfShape anEdges;
-        collectSubs(aParent, anEdges, GeomAPI_Shape::EDGE);
-        for (ListOfShape::iterator anIt = anEdges.begin(); anIt != anEdges.end(); ++anIt) {
-          theObjects.addObject(*anIt);
-          theObjects.addParent(*anIt, aParent);
-        }
+      ListOfShape anEdges;
+      collectSubs(aParent, anEdges, GeomAPI_Shape::EDGE);
+      for (ListOfShape::iterator anIt = anEdges.begin(); anIt != anEdges.end(); ++anIt) {
+        theObjects.addObject(*anIt);
+        theObjects.addParent(*anIt, aParent);
       }
     }
   }
   return true;
-}
+}
\ No newline at end of file
index 85072f9966f97d719d5728efa978f841a5e21acb..8e51fe6e4fd743f896ff767f4ede097670ed8531 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <GeomAPI_Shape.h>
 #include <GeomAPI_ShapeHierarchy.h>
+#include <ModelAPI_AttributeSelection.h>
 
 #include <ModelAPI_Feature.h>
 
@@ -48,6 +49,11 @@ protected:
   /// Process SelectionList attribute and fill the objects hierarchy.
   bool processAttribute(const std::shared_ptr<ModelAPI_Attribute>& theAttribute,
                         GeomAPI_ShapeHierarchy& theObjects);
+  
+  // Add Shape in the object hierarchy 
+  bool addShapeInHierarchy(const AttributeSelectionPtr& theAttribute,
+                           GeomAPI_ShapeHierarchy& theObjects,
+                           bool theIsStoreFullHierarchy);
 
   /// Return attribute storing the selected objects of the operation.
   virtual std::shared_ptr<ModelAPI_Attribute> objectsAttribute() = 0;
index bcd3c225d21743d9d08449d0bdc8db3703a4aeb7..4dfe53b66f62009b8615e5b837a064482daf7d68 100644 (file)
@@ -175,12 +175,10 @@ ModuleBase_WidgetSelector(theParent, theWorkshop, theData), myHeaderEditor(0),
 
   myDelegate = new DataArrayItemDelegate(myTypeMethodeBypoint);
 
-  //JL_CGLB myDataTbl->installEventFilter(this);
   myDataTbl->setItemDelegate(myDelegate);
 
   myDataTbl->verticalHeader()->hide();
   myDataTbl->setRowHeight(0, 25);
- //JL_CGLB  myDataTbl->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
 
   if(myTypeMethodeBypoint){
     myfirstRowValue.push_back("Start extremity");
@@ -210,7 +208,6 @@ ModuleBase_WidgetSelector(theParent, theWorkshop, theData), myHeaderEditor(0),
 
 
   myDataTbl->setHorizontalHeaderLabels(aHeaders);
-  //myDataTbl->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
 
   QTableWidgetItem* aItem;
   for(int j =0; j<3;j++)
@@ -492,38 +489,36 @@ void FeaturesPlugin_WidgetFilletMultiRadiuses::onAdd()
 {
   QModelIndex index = myDataTbl->currentIndex();
   int i  = index.row();
-  if( i == -1 )
-    return false; 
-
-  if( !myDataTbl->currentItem()->isSelected() && myDataTbl->rowCount() >2 ) 
-     return false;
-
-  myDataTbl->blockSignals(true);
+  if( i != -1 
+      && !(!myDataTbl->currentItem()->isSelected() && myDataTbl->rowCount() >2)) 
+  {
 
-  if ( i == myDataTbl->rowCount() -1)
-    i = myDataTbl->rowCount() - 2;
+    myDataTbl->blockSignals(true);
 
-  if ( i == 0)
-    i = 1;
-  else
-    i= i+1;
-  myDataTbl->model()->insertRow(i);
+    if ( i == myDataTbl->rowCount() -1)
+      i = myDataTbl->rowCount() - 2;
 
-  QTableWidgetItem* aItem =0;
+    if ( i == 0)
+      i = 1;
+    else
+      i= i+1;
+    myDataTbl->model()->insertRow(i);
 
-  aItem = myDataTbl->item( i, 0 );
-  aItem = new QTableWidgetItem( "" );
-  myDataTbl->setItem(i, 0, aItem);
+    QTableWidgetItem* aItem =0;
 
-  aItem = new QTableWidgetItem("0.1");
-  myDataTbl->setItem(i, 1, aItem);
+    aItem = myDataTbl->item( i, 0 );
+    aItem = new QTableWidgetItem( "" );
+    myDataTbl->setItem(i, 0, aItem);
+    aItem = new QTableWidgetItem("0.1");
+    myDataTbl->setItem(i, 1, aItem);
 
-  aItem = new QTableWidgetItem("0.5");
-  myDataTbl->setItem(i, 2, aItem);
-  myDataTbl->blockSignals(false);
+    aItem = new QTableWidgetItem("0.5");
+    myDataTbl->setItem(i, 2, aItem);
+    myDataTbl->blockSignals(false);
 
-  emit valuesChanged();
-  myDataTbl->setCurrentCell( i, 0);
+    emit valuesChanged();
+    myDataTbl->setCurrentCell( i, 0);
+  }
 }
 
 //**********************************************************************************
index 766fb0cb4716111bc8d47535d20869cdfca8e2d0..bedfb94e39a4d77ef34c325b08743d371c8d225e 100644 (file)
@@ -26,7 +26,7 @@
          title="Varying radius"
          tooltip="Fillet with varying radius"
          icon="icons/Features/fillet_var_radius.png">
-      <multi_selector id="main_objects"
+      <multi_selector id="edges_faces_seleted"
                       label="Faces or/and edges"
                       icon=""
                       tooltip="Select objects"
          tooltip="Fillet with multiple radiuses"
          icon="icons/Features/fillet_var_multiple_radiuses.png">
       <toolbox id="by_point_method">
-        <box id="by_curvilinear_abscissa_methode"
-         title="By curvilinear abscissa"
-         tooltip="Fillet with multiple radiuses by curvilinear abscissa"
-         icon="icons/Features/fillet_multiradius_by_curv.png">
-          <multi_selector id="main_objects"
-                      label="Edges or/and faces"
-                      icon=""
-                      tooltip="Select objects"
-                      shape_types="edges faces"
-                      use_choice="false"
-                      concealment="true">
-          <validator id="PartSet_DifferentObjects"/>
-          <validator id="FeaturesPlugin_ValidatorFilletSelection"/>
-          </multi_selector>
-          <multiradiuscurv-panel id="array_point_radius_by_point"
-            filter_points="false">
-            <validator id="GeomValidators_ShapeType" parameters="empty,vertex"/>
-          </multiradiuscurv-panel>
-        </box>
         <box id="by_points"
          title="By points"
          tooltip="Fillet with multiple radiuses by points"
           </multiradius-panel>
           <validator id="FeaturesPlugin_ValidatorFilletSelection" parameters = "main_objects"/>
         </box>
+        <box id="by_curvilinear_abscissa_methode"
+         title="By curvilinear abscissa"
+         tooltip="Fillet with multiple radiuses by curvilinear abscissa"
+         icon="icons/Features/fillet_multiradius_by_curv.png">
+          <multi_selector id="edges_faces_seleted"
+                      label="Edges or/and faces"
+                      icon=""
+                      tooltip="Select objects"
+                      shape_types="edges faces"
+                      use_choice="false"
+                      concealment="true">
+          <validator id="PartSet_DifferentObjects"/>
+          <validator id="FeaturesPlugin_ValidatorFilletSelection"/>
+          </multi_selector>
+          <multiradiuscurv-panel id="array_point_radius_by_point"
+            filter_points="false">
+            <validator id="GeomValidators_ShapeType" parameters="empty,vertex"/>
+          </multiradiuscurv-panel>
+        </box>
       </toolbox>
     </box>
   </toolbox>