]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Merge branch 'Dev_1.1.0' of newgeom:newgeom into Dev_1.1.0
authornds <natalia.donis@opencascade.com>
Wed, 25 Mar 2015 09:32:49 +0000 (12:32 +0300)
committernds <natalia.donis@opencascade.com>
Wed, 25 Mar 2015 09:32:49 +0000 (12:32 +0300)
15 files changed:
CMakeLists.txt
src/GeomAPI/GeomAPI_AISObject.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp
src/Model/Model_AttributeRefList.cpp
src/Model/Model_AttributeReference.cpp
src/Model/Model_AttributeSelection.cpp
src/ModuleBase/ModuleBase_ResultPrs.cpp
src/PartSet/PartSet_icons.qrc
src/PartSet/icons/fillet.png [new file with mode: 0644]
src/SketchPlugin/SketchPlugin_Arc.cpp
src/SketchPlugin/SketchPlugin_Circle.cpp
src/SketchPlugin/SketchPlugin_Line.cpp
src/SketchPlugin/SketchPlugin_Point.cpp
src/SketchPlugin/SketchPlugin_Sketch.cpp
src/SketchPlugin/plugin-Sketch.xml

index f1042dade8d9700e911dd188a865d35ee3b9dbc9..bb42d8b4a6480861724889642a7b0d689e5dc0af 100644 (file)
@@ -41,7 +41,7 @@ IF(UNIX)
 ENDIF(UNIX)
 
 #IF(CMAKE_BUILD_TYPE MATCHES Release)
-  ADD_SUBDIRECTORY (doc)
+ADD_SUBDIRECTORY (doc)
 #ENDIF(CMAKE_BUILD_TYPE MATCHES Release)
 ADD_SUBDIRECTORY (src/Config)
 ADD_SUBDIRECTORY (src/Events)
index f4ae420490bada6d8d4b177459ba93c67198fb94..8f053f7cf90a838a5741d17fb442dc9d6e85ee29 100644 (file)
@@ -311,9 +311,9 @@ void GeomAPI_AISObject::getColor(int& theR, int& theG, int& theB)
     return;
 
   Quantity_Color aColor = anAIS->Color();
-  theR = aColor.Red()*255.;
-  theG = aColor.Green()*255.;
-  theB = aColor.Blue()*255.;
+  theR = (int)(aColor.Red()*255.);
+  theG = (int)(aColor.Green()*255.);
+  theB = (int)(aColor.Blue()*255.);
 }
 
 bool GeomAPI_AISObject::empty() const
index d2ab51bd555e31e6f16ef7b0b896bb97842eb4be..58a4684ddc132325c7c3bdc78bfcfe37eaea3a2d 100644 (file)
 
 #define DEB_PLACEMENT 1
 GeomAlgoAPI_Placement::GeomAlgoAPI_Placement(
-    std::shared_ptr<GeomAPI_Shape> theSourceSolid,
-    std::shared_ptr<GeomAPI_Shape> theDestSolid,
-    std::shared_ptr<GeomAPI_Shape> theSourceShape,
-    std::shared_ptr<GeomAPI_Shape> theDestShape,
-    bool theIsReverse,
-    bool theIsCentering)
+  std::shared_ptr<GeomAPI_Shape> theSourceSolid,
+  std::shared_ptr<GeomAPI_Shape> theDestSolid,
+  std::shared_ptr<GeomAPI_Shape> theSourceShape,
+  std::shared_ptr<GeomAPI_Shape> theDestShape,
+  bool theIsReverse,
+  bool theIsCentering)
   : myDone(false),
-    myShape(new GeomAPI_Shape())
+  myShape(new GeomAPI_Shape())
 {
   build(theSourceSolid, theDestSolid, theSourceShape, theDestShape, theIsReverse, theIsCentering);
 }
 
 void GeomAlgoAPI_Placement::build(
-    const std::shared_ptr<GeomAPI_Shape>& theSourceSolid,
-    const std::shared_ptr<GeomAPI_Shape>& theDestSolid,
-    const std::shared_ptr<GeomAPI_Shape>& theSourceShape,
-    const std::shared_ptr<GeomAPI_Shape>& theDestShape,
-    bool theIsReverse,
-    bool theIsCentering)
+  const std::shared_ptr<GeomAPI_Shape>& theSourceSolid,
+  const std::shared_ptr<GeomAPI_Shape>& theDestSolid,
+  const std::shared_ptr<GeomAPI_Shape>& theSourceShape,
+  const std::shared_ptr<GeomAPI_Shape>& theDestShape,
+  bool theIsReverse,
+  bool theIsCentering)
 {
   // Filling the parameters of the objects
   static const int aNbObjects = 2;
@@ -82,6 +82,30 @@ void GeomAlgoAPI_Placement::build(
     hasDirection[i] = aSrcDstDirections[i].SquareMagnitude() >= Precision::SquareConfusion();
   }
 
+  // Initial shapes
+  const TopoDS_Shape& aSourceShape = theSourceSolid->impl<TopoDS_Shape>();
+  const TopoDS_Shape& aDestShape = theDestSolid->impl<TopoDS_Shape>();
+  // Check the material of the solids to be on the correct side
+  BRepClass3d_SolidClassifier aClassifier;
+  static const double aTransStep = 10. * Precision::Confusion();
+  if (hasNormal[0]) {
+    aClassifier.Load(aSourceShape);
+    gp_Pnt aPoint = aSrcDstPoints[0];
+    aPoint.Translate(aSrcDstNormals[0] * aTransStep);
+    aClassifier.Perform(aPoint, Precision::Confusion());
+    if ((aClassifier.State() == TopAbs_OUT && !theIsReverse) ||
+      (aClassifier.State() == TopAbs_IN && theIsReverse))
+      aSrcDstNormals[0].Reverse();
+  }
+  if (hasNormal[1]) {
+    aClassifier.Load(aDestShape);
+    gp_Pnt aPoint = aSrcDstPoints[1];
+    aPoint.Translate(aSrcDstNormals[1] * aTransStep);
+    aClassifier.Perform(aPoint, Precision::Confusion());
+    if (aClassifier.State() == TopAbs_IN)
+      aSrcDstNormals[1].Reverse();
+  }
+
   // Calculate directions, which comply the normal, for vertices and edges
   if (!hasNormal[0] || !hasNormal[1]) {
     if (hasNormal[0] || hasNormal[1]) { // plane with line or vertex
@@ -90,10 +114,10 @@ void GeomAlgoAPI_Placement::build(
         gp_Vec aVec = aSrcDstNormals[1 - anInd].Crossed(aSrcDstDirections[anInd]);
         if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // normal and direction are collinear
           aVec = aSrcDstNormals[1 - anInd].Crossed(
-              gp_Vec(aSrcDstPoints[1 - anInd], aSrcDstPoints[anInd]));
+            gp_Vec(aSrcDstPoints[1 - anInd], aSrcDstPoints[anInd]));
           if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // normal and points direction are collinear
             if (Abs(aSrcDstNormals[1 - anInd].Y()) >= Precision::Confusion() || 
-                Abs(aSrcDstNormals[1 - anInd].Z()) >= Precision::Confusion())
+              Abs(aSrcDstNormals[1 - anInd].Z()) >= Precision::Confusion())
               aVec = gp::DX();
             else
               aVec = gp::DY();
@@ -111,7 +135,7 @@ void GeomAlgoAPI_Placement::build(
           aVec = aSrcDstDirections[0].Crossed(gp_Vec(aSrcDstPoints[0], aSrcDstPoints[1]));
           if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // lines are equal
             if (Abs(aSrcDstDirections[0].Y()) >= Precision::Confusion() ||
-                Abs(aSrcDstDirections[0].Z()) >= Precision::Confusion())
+              Abs(aSrcDstDirections[0].Z()) >= Precision::Confusion())
               aVec = gp::DX();
             else
               aVec = gp::DY();
@@ -119,8 +143,10 @@ void GeomAlgoAPI_Placement::build(
         }
         aSrcDstNormals[0] = aSrcDstDirections[0].Crossed(aVec);
         aSrcDstNormals[0].Normalize();
-        aSrcDstNormals[1] = aSrcDstDirections[1].Crossed(aVec).Reversed();
+        aSrcDstNormals[1] = aSrcDstDirections[1].Crossed(aVec);
         aSrcDstNormals[1].Normalize();
+        if (aSrcDstDirections[0].Dot(aSrcDstDirections[1]) < -Precision::Confusion())
+          aSrcDstNormals[1].Reverse();
       } else if (!hasDirection[0] && !hasDirection[1]) { // point - point
         aSrcDstNormals[0] = gp_Vec(aSrcDstPoints[0], aSrcDstPoints[1]);
         aSrcDstNormals[0].Normalize();
@@ -131,7 +157,7 @@ void GeomAlgoAPI_Placement::build(
         aVec.Cross(aSrcDstDirections[anInd]);
         if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // point is on line
           if (Abs(aSrcDstDirections[1 - anInd].Y()) >= Precision::Confusion() || 
-              Abs(aSrcDstDirections[1 - anInd].Z()) >= Precision::Confusion())
+            Abs(aSrcDstDirections[1 - anInd].Z()) >= Precision::Confusion())
             aVec = gp::DX();
           else
             aVec = gp::DY();
@@ -142,35 +168,14 @@ void GeomAlgoAPI_Placement::build(
     }
   }
 
-  // Initial shapes
-  const TopoDS_Shape& aSourceShape = theSourceSolid->impl<TopoDS_Shape>();
-  const TopoDS_Shape& aDestShape = theDestSolid->impl<TopoDS_Shape>();
+  // Reverse the normal if it was not done before
+  if (!hasNormal[0] && theIsReverse)
+    aSrcDstNormals[0].Reverse();
 
   // Calculate transformation
   gp_Trsf aTrsf;
   gp_Vec aSrcDir = aSrcDstNormals[0];
   gp_Vec aDstDir = aSrcDstNormals[1];
-  // Check the material of the solids to be on the correct side
-  BRepClass3d_SolidClassifier aClassifier;
-  static const double aTransStep = 10. * Precision::Confusion();
-  if (hasNormal[0]) {
-    aClassifier.Load(aSourceShape);
-    gp_Pnt aPoint = aSrcDstPoints[0];
-    aPoint.Translate(aSrcDir * aTransStep);
-    aClassifier.Perform(aPoint, Precision::Confusion());
-    if ((aClassifier.State() == TopAbs_OUT && !theIsReverse) ||
-        (aClassifier.State() == TopAbs_IN && theIsReverse))
-      aSrcDir.Reverse();
-  } else if (theIsReverse)
-    aSrcDir.Reverse();
-  if (hasNormal[1]) {
-    aClassifier.Load(aDestShape);
-    gp_Pnt aPoint = aSrcDstPoints[1];
-    aPoint.Translate(aDstDir * aTransStep);
-    aClassifier.Perform(aPoint, Precision::Confusion());
-    if (aClassifier.State() == TopAbs_IN)
-      aDstDir.Reverse();
-  }
   // Calculate rotation
   gp_Quaternion aRot(aSrcDir, aDstDir);
   aTrsf.SetRotation(aRot);
@@ -197,8 +202,8 @@ void GeomAlgoAPI_Placement::build(
         myMap.bind(aCurrentShape, aCurrentShape);
       }
 #ifdef DEB_PLACEMENT
-         int aNum = myMap.size();
-         cout << "MAP of Oriented shapes =" << aNum <<endl;
+      int aNum = myMap.size();
+      cout << "MAP of Oriented shapes =" << aNum <<endl;
 
 #endif
 
@@ -252,4 +257,4 @@ GeomAlgoAPI_Placement::~GeomAlgoAPI_Placement()
 {
   if (myImpl)
     myMap.clear();
-}
\ No newline at end of file
+}
index effa56db232cb21a0989fc801baad662fcf283a1..c9722835887b00258b8e1acbac9797dac0dd06c1 100644 (file)
@@ -16,6 +16,12 @@ void Model_AttributeRefList::append(ObjectPtr theObject)
 {
   std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(theObject->data());
   myRef->Append(aData->label().Father());  // store label of the object
+  // do it before the transaction finish to make just created/removed objects know dependencies
+  // and reference from composite feature is removed automatically
+  FeaturePtr anOwnerFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(owner());
+  if (anOwnerFeature.get()) {
+    aData->addBackReference(anOwnerFeature, id());
+  }
 
   owner()->data()->sendAttributeUpdated(this);
 }
index 43bbabe658fff74259890026c982b1302d55670c..91de64eb567de9f94889a6274c98f8ae8c6dcebc 100644 (file)
@@ -22,9 +22,9 @@ void Model_AttributeReference::setValue(ObjectPtr theObject)
   if(!theObject)
     return;
   if (!myIsInitialized || value() != theObject) {
-      std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(
-          theObject->data());
-      TDF_Label anObjLab = aData->label().Father(); // object label
+    std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(
+        theObject->data());
+    TDF_Label anObjLab = aData->label().Father(); // object label
 
     if (owner()->document() == theObject->document()) { // same document, use reference attribute
 
@@ -41,6 +41,12 @@ void Model_AttributeReference::setValue(ObjectPtr theObject)
       TDF_Tool::Entry(anObjLab, anEntry);
       TDataStd_AsciiString::Set(myRef->Label(), anEntry);
     }
+    // do it before the transaction finish to make just created/removed objects know dependencies
+    // and reference from composite feature is removed automatically
+    FeaturePtr anOwnerFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(owner());
+    if (anOwnerFeature.get()) {
+      aData->addBackReference(anOwnerFeature, id());
+    }
 
     owner()->data()->sendAttributeUpdated(this);
   }
index 0e643036fad65573de5acb540bf444fb84576950..625ee19da88204244684dc98935c06435a38c162 100644 (file)
@@ -15,7 +15,6 @@
 #include <ModelAPI_CompositeFeature.h>
 #include <GeomAPI_Shape.h>
 #include <GeomAPI_PlanarEdges.h>
-#include <GeomAlgoAPI_SketchBuilder.h>
 #include <Events_Error.h>
 
 #include <TNaming_Selector.hxx>
@@ -225,10 +224,12 @@ bool Model_AttributeSelection::update()
   } else if (aContext->groupName() == ModelAPI_ResultConstruction::group()) {
     // construction: identification by the results indexes, recompute faces and
     // take the face that more close by the indexes
-    std::shared_ptr<GeomAPI_PlanarEdges> aWirePtr = 
-      std::dynamic_pointer_cast<GeomAPI_PlanarEdges>(
-      std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext)->shape());
-    if (aWirePtr && aWirePtr->hasPlane()) { // sketch sub-element
+    ResultConstructionPtr aConstructionContext = 
+      std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
+    // sketch sub-element
+    if (aConstructionContext && 
+        std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aContext).get())
+    {
       TDF_Label aLab = myRef.myRef->Label();
       // getting a type of selected shape
       Handle(TDataStd_Integer) aTypeAttr;
@@ -251,15 +252,12 @@ bool Model_AttributeSelection::update()
 
       if (aShapeType == TopAbs_FACE) { // compound is for the whole sketch selection
         // If this is a wire with plane defined thin it is a sketch-like object
-        std::list<std::shared_ptr<GeomAPI_Shape> > aFaces;
-        GeomAlgoAPI_SketchBuilder::createFaces(aWirePtr->origin(), aWirePtr->dirX(),
-          aWirePtr->dirY(), aWirePtr->norm(), aWirePtr, aFaces);
-        if (aFaces.empty()) // no faces, update can not work correctly
+        if (!aConstructionContext->facesNum()) // no faces, update can not work correctly
           return false;
         // if there is no edges indexes, any face can be used: take the first
         std::shared_ptr<GeomAPI_Shape> aNewSelected;
         if (aNoIndexes) {
-          aNewSelected = *(aFaces.begin());
+          aNewSelected = aConstructionContext->face(0);
         } else { // searching for most looks-like initial face by the indexes
           // prepare edges of the current resut for the fast searching
           TColStd_MapOfTransient allCurves;
@@ -284,12 +282,11 @@ bool Model_AttributeSelection::update()
               }
             }
           }
-          // iterate new result faces and searching for these edges
-          std::list<std::shared_ptr<GeomAPI_Shape> >::iterator aFacesIter = aFaces.begin();
           double aBestFound = 0; // best percentage of found edges
-          for(; aFacesIter != aFaces.end(); aFacesIter++) {
+          for(int aFaceIndex = 0; aFaceIndex < aConstructionContext->facesNum(); aFaceIndex++) {
             int aFound = 0, aNotFound = 0;
-            TopExp_Explorer anEdgesExp((*aFacesIter)->impl<TopoDS_Shape>(), TopAbs_EDGE);
+            TopExp_Explorer anEdgesExp(
+              aConstructionContext->face(aFaceIndex)->impl<TopoDS_Shape>(), TopAbs_EDGE);
             for(; anEdgesExp.More(); anEdgesExp.Next()) {
               TopoDS_Edge anEdge = TopoDS::Edge(anEdgesExp.Current());
               if (!anEdge.IsNull()) {
@@ -306,7 +303,7 @@ bool Model_AttributeSelection::update()
               double aPercentage = double(aFound) / double(aFound + aNotFound);
               if (aPercentage > aBestFound) {
                 aBestFound = aPercentage;
-                aNewSelected = *aFacesIter;
+                aNewSelected = aConstructionContext->face(aFaceIndex);
               }
             }
           }
index a298dd29723c13b92e42b45c7d781673d795f09c..d6bd0cde8de26c65ad5b9724683b1612ec4e7ced 100644 (file)
@@ -7,8 +7,8 @@
 #include "ModuleBase_ResultPrs.h"
 
 #include <ModelAPI_Tools.h>
+#include <ModelAPI_ResultConstruction.h>
 #include <GeomAPI_PlanarEdges.h>
-#include <GeomAlgoAPI_SketchBuilder.h>
 
 #include <BRep_Builder.hxx>
 #include <AIS_Drawer.hxx>
@@ -43,11 +43,15 @@ void ModuleBase_ResultPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& t
   if (!aShapePtr)
     return;
   if (myIsSketchMode) {
-    std::shared_ptr<GeomAPI_PlanarEdges> aWirePtr = 
-      std::dynamic_pointer_cast<GeomAPI_PlanarEdges>(aShapePtr);
     myFacesList.clear();
-    GeomAlgoAPI_SketchBuilder::createFaces(aWirePtr->origin(), aWirePtr->dirX(),
-      aWirePtr->dirY(), aWirePtr->norm(), aWirePtr, myFacesList);
+    ResultConstructionPtr aConstruction = 
+      std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(myResult);
+    if (aConstruction.get()) {
+      int aFacesNum = aConstruction->facesNum();
+      for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) {
+        myFacesList.push_back(aConstruction->face(aFaceIndex));
+      }
+    }
   }
   myOriginalShape = aShapePtr->impl<TopoDS_Shape>();
   if (!myOriginalShape.IsNull()) {
index 90415fe296ee170dee7be2e535db85e569d65986..8c546fdb80073fbc7d9929ca6392fa02240db55d 100644 (file)
@@ -34,5 +34,6 @@
      <file>icons/vertical.png</file>
      <file>icons/equal.png</file>
      <file>icons/tangent.png</file>
+     <file>icons/fillet.png</file>
  </qresource>
  </RCC>
diff --git a/src/PartSet/icons/fillet.png b/src/PartSet/icons/fillet.png
new file mode 100644 (file)
index 0000000..7255240
Binary files /dev/null and b/src/PartSet/icons/fillet.png differ
index f4bc7f93e3e5aca6c75a8b88e3d620cbcc6ab5fd..27e3512ba0271294e165b54cf2566b7366146b82 100644 (file)
@@ -148,10 +148,6 @@ void SketchPlugin_Arc::move(double theDeltaX, double theDeltaY)
   if (!aData->isValid())
     return;
 
-  std::shared_ptr<GeomDataAPI_Point2D> aPoint1 = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-      aData->attribute(SketchPlugin_Arc::CENTER_ID()));
-  aPoint1->move(theDeltaX, theDeltaY);
-
   myStartUpdate = true;
   myEndUpdate = true;
   std::shared_ptr<GeomDataAPI_Point2D> aPoint2 = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
@@ -163,6 +159,10 @@ void SketchPlugin_Arc::move(double theDeltaX, double theDeltaY)
   aPoint3->move(theDeltaX, theDeltaY);
   myStartUpdate = false;
   myEndUpdate = false;
+
+  std::shared_ptr<GeomDataAPI_Point2D> aPoint1 = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+      aData->attribute(SketchPlugin_Arc::CENTER_ID()));
+  aPoint1->move(theDeltaX, theDeltaY);
 }
 
 double SketchPlugin_Arc::distanceToPoint(const std::shared_ptr<GeomAPI_Pnt2d>& thePoint)
@@ -190,7 +190,7 @@ double SketchPlugin_Arc::distanceToPoint(const std::shared_ptr<GeomAPI_Pnt2d>& t
 }
 
 bool SketchPlugin_Arc::isFixed() {
-  return data()->selection(EXTERNAL_ID())->context().get();
+  return data()->selection(EXTERNAL_ID())->context().get() != NULL;
 }
 
 bool SketchPlugin_Arc::isFeatureValid()
index 50b387414b82402e10bec366908b2d2d856f24fa..934f40a04eb331cf8a0fb0a37ba044140e29b9c7 100644 (file)
@@ -101,7 +101,7 @@ double SketchPlugin_Circle::distanceToPoint(const std::shared_ptr<GeomAPI_Pnt2d>
 }
 
 bool SketchPlugin_Circle::isFixed() {
-  return data()->selection(EXTERNAL_ID())->context().get();
+  return data()->selection(EXTERNAL_ID())->context().get() != NULL;
 }
 
 void SketchPlugin_Circle::attributeChanged(const std::string& theID) {
index f0c76538a92ff0973a46813f32945c8299bf854c..ea5d0a42b1e57039053e2a7ff2c63b1d0b34d0c5 100644 (file)
@@ -101,7 +101,7 @@ double SketchPlugin_Line::distanceToPoint(const std::shared_ptr<GeomAPI_Pnt2d>&
 }
 
 bool SketchPlugin_Line::isFixed() {
-  return data()->selection(EXTERNAL_ID())->context().get();
+  return data()->selection(EXTERNAL_ID())->context().get() != NULL;
 }
 
 void SketchPlugin_Line::attributeChanged(const std::string& theID) {
index 798140611b2755a7b86248a055617fa84aed4e44..036fde19db093340f6a632a0b73b2f860e7e26a7 100644 (file)
@@ -73,7 +73,7 @@ double SketchPlugin_Point::distanceToPoint(const std::shared_ptr<GeomAPI_Pnt2d>&
 }
 
 bool SketchPlugin_Point::isFixed() {
-  return data()->selection(EXTERNAL_ID())->context().get();
+  return data()->selection(EXTERNAL_ID())->context().get() != NULL;
 }
 
 void SketchPlugin_Point::attributeChanged(const std::string& theID) {
index 365db4ca69b59d5d4aca8311afa65980b1aca50a..b57c1e3ba21e7b587c0a4fd950c6a516fa3d082b 100644 (file)
@@ -115,9 +115,6 @@ void SketchPlugin_Sketch::execute()
     aBigWire->addEdge(*aShapeIt);
   }
   aBigWire->setPlane(anOrigin->pnt(), aDirX->dir(), aNorm->dir());
-
-//  GeomAlgoAPI_SketchBuilder::createFaces(anOrigin->pnt(), aDirX->dir(), aDirY->dir(), aNorm->dir(),
-//                                         aFeaturesPreview, aLoops, aWires);
   std::shared_ptr<ModelAPI_ResultConstruction> aConstr = document()->createConstruction(data());
   aConstr->setShape(aBigWire);
   setResult(aConstr);
index 4abd354b0ffa3a276aaa14c40a299ba977ea6c51..673816d770f9ea20824b9e86d6f2f614fd1d0a52 100644 (file)
         title="Mirror"
         tooltip="Create constraint mirroring group of objects"
         internal="1" />
-    <!--  SketchConstraintFillet  -->
-      <feature id="SketchConstraintFillet" title="Fillet" tooltip="Create constraint defining fillet between two objects">
+    </group>
+    <group id="Edit">
+      <!--  SketchConstraintFillet  -->
+      <feature id="SketchConstraintFillet" title="Fillet" tooltip="Create constraint defining fillet between two objects" icon=":icons/fillet.png">
         <sketch_constraint_shape_selector id="ConstraintEntityA" 
             label="First object" tooltip="Select line or arc" shape_types="edge">
         </sketch_constraint_shape_selector>