]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
External point/edge on trihedron when it is selected in the viewer. Create a sketch...
authornds <nds@opencascade.com>
Wed, 18 Nov 2015 09:47:59 +0000 (12:47 +0300)
committernds <nds@opencascade.com>
Wed, 18 Nov 2015 09:48:25 +0000 (12:48 +0300)
src/PartSet/PartSet_WidgetPoint2d.cpp
src/XGUI/XGUI_Selection.cpp
src/XGUI/XGUI_Selection.h

index ccf1a3f14970daeba86c286352b3c1e733076b30..7f44ef9489f8faf0c7e72fffcd0c2a49bfed42df 100644 (file)
@@ -352,9 +352,9 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous
     ObjectPtr aObject = aObjects.front();
     FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aObject);
     bool anExternal = false;
-    if (aSelectedFeature.get() != NULL) {
-      std::shared_ptr<SketchPlugin_Feature> aSPFeature = 
-              std::dynamic_pointer_cast<SketchPlugin_Feature>(aSelectedFeature);
+      std::shared_ptr<SketchPlugin_Feature> aSPFeature;
+      if (aSelectedFeature.get() != NULL)
+        aSPFeature = std::dynamic_pointer_cast<SketchPlugin_Feature>(aSelectedFeature);
       if ((!aSPFeature) && (!aShape.IsNull())) {
         anExternal = true;
         ResultPtr aFixedObject = PartSet_Tools::findFixedObjectByExternal(aShape, aObject, mySketch);
@@ -377,7 +377,6 @@ void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMous
           emit focusOutWidget(this);
         }
       }
-    }
     if (!anExternal) {
       double aX, aY;
       bool isProcessed = false;
index 49b69883083fb7b99c9857aea76db05c680dc0ad..1b6f86542f9b2dfa79f6576a6741846e1a61b0df 100644 (file)
@@ -27,6 +27,8 @@
 
 #include <set>
 
+#define DEBUG_DELIVERY
+
 XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop)
     : myWorkshop(theWorkshop)
 {
@@ -126,9 +128,14 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs,
     // the located method is called in the context to obtain the shape by the SelectedShape() method,
     // so the shape is located by the same rules
     TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location());
+#ifndef DEBUG_DELIVERY
+    if (aShape.IsNull())
+      aShape = findAxisShape(anIO);
+#endif
     if (!aShape.IsNull())
       thePrs.setShape(aShape);
   } else {
+#ifdef DEBUG_DELIVERY
     // Fill by trihedron shapes
     Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(anIO);
     if (!aAxis.IsNull()) {
@@ -154,6 +161,7 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs,
           thePrs.setShape(aVertex);
       }
     }
+#endif
   }
      
   XGUI_Displayer* aDisplayer = myWorkshop->displayer();
@@ -262,6 +270,9 @@ void XGUI_Selection::selectedShapes(NCollection_List<TopoDS_Shape>& theList,
 
   for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
     TopoDS_Shape aShape = aContext->SelectedShape();
+    if (aShape.IsNull()) {
+      aShape = findAxisShape(aContext->SelectedInteractive());
+    }
     if (!aShape.IsNull()) {
       theList.Append(aShape);
       Handle(SelectMgr_EntityOwner) aEO = aContext->SelectedOwner();
@@ -315,3 +326,35 @@ void XGUI_Selection::entityOwners(const Handle(AIS_InteractiveObject)& theObject
     }
   }
 }
+
+//**************************************************************
+TopoDS_Shape XGUI_Selection::findAxisShape(Handle(AIS_InteractiveObject) theIO) const
+{
+  TopoDS_Shape aShape;
+  // Fill by trihedron shapes
+  Handle(AIS_Axis) aAxis = Handle(AIS_Axis)::DownCast(theIO);
+  if (!aAxis.IsNull()) {
+    // an Axis from Trihedron
+    Handle(Geom_Line) aLine = aAxis->Component();
+    Handle(Prs3d_DatumAspect) DA = aAxis->Attributes()->DatumAspect();
+    Handle(Geom_TrimmedCurve) aTLine = new Geom_TrimmedCurve(aLine, 0, DA->FirstAxisLength());
+
+    BRep_Builder aBuilder;      
+    TopoDS_Edge aEdge;
+    aBuilder.MakeEdge(aEdge, aTLine, Precision::Confusion());
+    if (!aEdge.IsNull())
+      aShape = aEdge;
+  } else {
+    Handle(AIS_Point) aPoint = Handle(AIS_Point)::DownCast(theIO);
+    if (!aPoint.IsNull()) {
+      // A point from trihedron
+      Handle(Geom_Point) aPnt = aPoint->Component();
+      BRep_Builder aBuilder;
+      TopoDS_Vertex aVertex;
+      aBuilder.MakeVertex(aVertex, aPnt->Pnt(), Precision::Confusion());
+      if (!aVertex.IsNull())
+        aShape = aVertex;
+    }
+  }
+  return aShape;
+}
index 5e4b672bc7b09a5419251749045322611eb28f6e..d81ef7edaee93256265560b29a70aafb891a7505 100644 (file)
@@ -106,6 +106,11 @@ protected:
   /// \param thePresentations an output list of presentation
   void getSelectedInBrowser(QList<ModuleBase_ViewerPrs>& thePresentations) const;
 
+  /// Generates a vertex or edge by the give IO if it is an AIS created on trihedron
+  /// \param theIO a selected object
+  /// \return created shape or empty shape
+  TopoDS_Shape findAxisShape(Handle(AIS_InteractiveObject) theIO) const;
+
 private:
   XGUI_Workshop* myWorkshop;
 };