]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Returned edges and vertexes as start and end shapes in placement.
authordbv <dbv@opencascade.com>
Tue, 1 Sep 2015 13:52:51 +0000 (16:52 +0300)
committerdbv <dbv@opencascade.com>
Tue, 1 Sep 2015 13:53:12 +0000 (16:53 +0300)
src/FeaturesPlugin/FeaturesPlugin_Placement.cpp
src/FeaturesPlugin/FeaturesPlugin_Placement.h
src/FeaturesPlugin/placement_widget.xml

index 38bf6f1d3df4e38a7293fa3fdedcde9d7e6719b7..1fcfa7618e3d27a44f9e9f4f65b400ca9ad2f7f0 100644 (file)
@@ -37,8 +37,8 @@ void FeaturesPlugin_Placement::initAttributes()
   // extrusion works with faces always
   aSelection->setSelectionType("SOLID");
 
-  data()->addAttribute(START_FACE_ID(), ModelAPI_AttributeSelection::typeId());
-  data()->addAttribute(END_FACE_ID(), ModelAPI_AttributeSelection::typeId());
+  data()->addAttribute(START_SHAPE_ID(), ModelAPI_AttributeSelection::typeId());
+  data()->addAttribute(END_SHAPE_ID(), ModelAPI_AttributeSelection::typeId());
   data()->addAttribute(REVERSE_ID(), ModelAPI_AttributeBoolean::typeId());
   data()->addAttribute(CENTERING_ID(), ModelAPI_AttributeBoolean::typeId());
 }
@@ -62,57 +62,78 @@ void FeaturesPlugin_Placement::execute()
     aContextes.push_back(anObjectAttr->context());
   }
 
-  // Verify the start face
-  AttributeSelectionPtr anObjRef = selection(START_FACE_ID());
+  // Verify the start shape
+  AttributeSelectionPtr anObjRef = selection(START_SHAPE_ID());
   if(!anObjRef) {
     return;
   }
-  std::shared_ptr<GeomAPI_Shape> aStartFace = anObjRef->value();
-  if(!aStartFace || !GeomAPI_Face(aStartFace).isPlanar()) {
-    static const std::string aSelectionError = "The start face selection is bad";
+  std::shared_ptr<GeomAPI_Shape> aStartShape = anObjRef->value();
+  if(!aStartShape) {
+    static const std::string aSelectionError = "The start shape selection is bad";
     setError(aSelectionError);
     return;
   }
 
 
-  std::shared_ptr<GeomAPI_Shape> aStartShape;
+  std::shared_ptr<GeomAPI_Shape> aStartShapeContext;
   ResultPtr aContextRes = anObjRef->context();
   if (aContextRes.get()) {
-    aStartShape = aContextRes->shape();
+    aStartShapeContext = aContextRes->shape();
   }
-  if(!aStartShape.get()) {
-    static const std::string aContextError = "The start face selection context is bad";
+  if(!aStartShapeContext.get()) {
+    static const std::string aContextError = "The start shape selection context is bad";
     setError(aContextError);
     return;
   }
 
-  // Verify the end face
-  anObjRef = selection(END_FACE_ID());
-  std::shared_ptr<GeomAPI_Shape> anEndFace = anObjRef->value();
-  if(!anEndFace || !GeomAPI_Face(anEndFace).isPlanar()) {
-    static const std::string aSelectionError = "The end face selection is bad";
+  // Verify the end shape
+  anObjRef = selection(END_SHAPE_ID());
+  std::shared_ptr<GeomAPI_Shape> anEndShape = anObjRef->value();
+  if(!anEndShape) {
+    static const std::string aSelectionError = "The end shape selection is bad";
     setError(aSelectionError);
     return;
   }
 
-  std::shared_ptr<GeomAPI_Shape> anEndShape;
+  std::shared_ptr<GeomAPI_Shape> anEndShapeContext;
   aContextRes = anObjRef->context();
   if(aContextRes.get()) {
-    anEndShape = aContextRes->shape();
+    anEndShapeContext = aContextRes->shape();
   }
-  if(!anEndShape.get()) {
-    static const std::string aContextError = "The end face selection context is bad";
+  if(!anEndShapeContext.get()) {
+    static const std::string aContextError = "The end shape selection context is bad";
     setError(aContextError);
     return;
   }
 
+  // Verify planarity of faces and linearity of edges
+  std::shared_ptr<GeomAPI_Shape> aShapes[2] = {aStartShape, anEndShape};
+  for (int i = 0; i < 2; i++) {
+    if (aShapes[i]->isFace()) {
+      std::shared_ptr<GeomAPI_Face> aFace(new GeomAPI_Face(aShapes[i]));
+      if (!aFace->isPlanar()) {
+        static const std::string aPlanarityError = "One of selected faces is not planar";
+        setError(aPlanarityError);
+        return;
+      }
+    }
+    else if (aShapes[i]->isEdge()) {
+      std::shared_ptr<GeomAPI_Edge> anEdge(new GeomAPI_Edge(aShapes[i]));
+      if (!anEdge->isLine()) {
+        static const std::string aLinearityError = "One of selected endges is not linear";
+        setError(aLinearityError);
+        return;
+      }
+    }
+  }
+
   // Flags of the Placement
   bool isReverse = boolean(REVERSE_ID())->value();
   bool isCentering = boolean(CENTERING_ID())->value();
 
   // Getting transformation.
   GeomAlgoAPI_Placement aPlacementAlgo(
-    aStartShape, anEndShape, aStartFace, anEndFace, isReverse, isCentering, true);
+    aStartShapeContext, anEndShapeContext, aStartShape, anEndShape, isReverse, isCentering, true);
   if(!aPlacementAlgo.isDone()) {
     static const std::string aFeatureError = "Placement algorithm failed";
     setError(aFeatureError);
index 46acd79e29fe1b3352aac69f0c19db920cac7736..498a771b22b3e339277fc6fd1458308cf7303175 100644 (file)
@@ -42,16 +42,16 @@ class FeaturesPlugin_Placement : public ModelAPI_Feature
   }
 
   /// attribute name of referenced object
-  inline static const std::string& START_FACE_ID()
+  inline static const std::string& START_SHAPE_ID()
   {
-    static const std::string MY_START_FACE_ID("placement_start_face");
-    return MY_START_FACE_ID;
+    static const std::string MY_START_SHAPE_ID("placement_start_shape");
+    return MY_START_SHAPE_ID;
   }
   /// attribute name of attractable face
-  inline static const std::string& END_FACE_ID()
+  inline static const std::string& END_SHAPE_ID()
   {
-    static const std::string MY_END_FACE_ID("placement_end_face");
-    return MY_END_FACE_ID;
+    static const std::string MY_END_SHAPE_ID("placement_end_shape");
+    return MY_END_SHAPE_ID;
   }
   /// attribute name of flag of reverse direction
   inline static const std::string& REVERSE_ID()
index 26f5a90112ccc6e96be289e9ee85d2beb968b550..4403f94f09b8673313334ffe352df3d2d4b1628c 100644 (file)
@@ -8,17 +8,17 @@
     type_choice=""
     concealment="true" >
   </multi_selector>
-  <shape_selector id="placement_start_face"
+  <shape_selector id="placement_start_shape"
     label="Select an object" 
     icon=":icons/placement_from.png"
-    tooltip="Select a start face"
-    shape_types="face"
+    tooltip="Select a start face, edge or vertex"
+    shape_types="face edge vertex"
   />
-  <shape_selector id="placement_end_face"
+  <shape_selector id="placement_end_shape"
     label="Select an object" 
     icon=":icons/placement_to.png"
-    tooltip="Select an end face"
-    shape_types="face>
+    tooltip="Select an end face, edge or vertex"
+    shape_types="face edge vertex">
     <validator id="PartSet_DifferentObjects"/>
   </shape_selector>
   <boolvalue id="placement_reverse_direction"