0025335: Visualization - method ::SelectedShape() in AIS_LocalContext and AIS_Interac...
authorduv <duv@opencascade.com>
Wed, 8 Oct 2014 09:01:51 +0000 (13:01 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 9 Oct 2014 12:31:02 +0000 (16:31 +0400)
Shape location overriding fixed by combining AIS object transformation and shape location.
Also incorrect highlight presentation (and sensitive) placement was possible.

src/AIS/AIS_InteractiveContext_1.cxx
src/AIS/AIS_LocalContext_1.cxx
src/AIS/AIS_Shape.cxx
src/ViewerTest/ViewerTest.cxx
tests/bugs/vis/bug25335 [new file with mode: 0644]

index 9d041b0..90168e8 100644 (file)
@@ -1122,10 +1122,14 @@ TopoDS_Shape AIS_InteractiveContext::SelectedShape() const
 {
   if (!HasOpenedContext())
   {
-    TopoDS_Shape sh;
-    Handle(AIS_Shape) shape = Handle(AIS_Shape)::DownCast(SelectedInteractive());
-    if (!shape.IsNull()) sh = shape->Shape().Located (SelectedInteractive()->Transformation());
-    return sh;
+    TopoDS_Shape aResShape;
+    Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (SelectedInteractive());
+    if (!aShape.IsNull())
+    {
+      aResShape = aShape->Shape().Located (TopLoc_Location (SelectedInteractive()->Transformation()) * aShape->Shape().Location());
+    }
+
+    return aResShape;
   } 
   else
   {
index 280c1c0..6ef3585 100644 (file)
@@ -776,15 +776,14 @@ HasShape() const
 //==================================================
 TopoDS_Shape AIS_LocalContext::SelectedShape() const 
 {
-  static TopoDS_Shape aSh;
-  Handle(Standard_Transient) Tr = AIS_Selection::CurrentSelection()->Value();
-  Handle(SelectMgr_EntityOwner) EO = *((Handle(SelectMgr_EntityOwner)*)&Tr);
-  Handle(StdSelect_BRepOwner) BRO = Handle(StdSelect_BRepOwner)::DownCast(EO);
-  if( BRO.IsNull() ) 
+  Handle(Standard_Transient) aTr = AIS_Selection::CurrentSelection()->Value();
+  Handle(SelectMgr_EntityOwner) anEO = *((Handle(SelectMgr_EntityOwner)*)&aTr);
+  Handle(StdSelect_BRepOwner) aBRO = Handle(StdSelect_BRepOwner)::DownCast(anEO);
+  if( aBRO.IsNull() ) 
   {
-    return aSh;
+    return TopoDS_Shape();
   }
-  return BRO->Shape().Located (BRO->Location());
+  return aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location());
 }
 
 //==================================================
index 468b684..780349e 100644 (file)
@@ -379,10 +379,6 @@ void AIS_Shape::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
   static TopAbs_ShapeEnum TypOfSel;
   TypOfSel = AIS_Shape::SelectionType(aMode);
   TopoDS_Shape shape = myshape;
-  if( HasTransformation() ) {
-    gp_Trsf trsf = Transformation();
-    shape = shape.Located(TopLoc_Location(trsf)*shape.Location());
-  }
 
 // POP protection against crash in low layers
 
index a1597da..9ef3bce 100644 (file)
@@ -4080,6 +4080,54 @@ static int VPickShape( Draw_Interpretor& di, Standard_Integer argc, const char**
 }
 
 //=======================================================================
+//function : VPickSelected
+//purpose  :
+//=======================================================================
+static int VPickSelected (Draw_Interpretor& , Standard_Integer theArgNb, const char** theArgs)
+{
+  static Standard_Integer aCount = 0;
+  TCollection_AsciiString aName = "PickedShape_";
+
+  if (theArgNb > 1)
+  {
+    aName = theArgs[1];
+  }
+  else
+  {
+    aName = aName + aCount++ + "_";
+  }
+
+  Standard_Integer anIdx = 0;
+  for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected(), ++anIdx)
+  {
+    TopoDS_Shape aShape;
+    if (TheAISContext()->HasSelectedShape())
+    {
+      aShape = TheAISContext()->SelectedShape();
+    }
+    else
+    {
+      Handle(AIS_InteractiveObject) IO = TheAISContext()->SelectedInteractive();
+      aShape = (*((Handle(AIS_Shape)*) &IO))->Shape();
+    }
+
+    TCollection_AsciiString aCurrentName = aName;
+    if (anIdx > 0)
+    {
+      aCurrentName += anIdx;
+    }
+
+    DBRep::Set ((aCurrentName).ToCString(), aShape);
+
+    Handle(AIS_Shape) aNewShape = new AIS_Shape (aShape);
+    GetMapOfAIS().Bind (aNewShape, aCurrentName);
+    TheAISContext()->Display (aNewShape);
+  }
+
+  return 0;
+}
+
+//=======================================================================
 //function : list of known objects
 //purpose  :
 //=======================================================================
@@ -4636,6 +4684,9 @@ void ViewerTest::Commands(Draw_Interpretor& theCommands)
   theCommands.Add("vr", "vr : reading of the shape",
                  __FILE__,vr, group);
 
+  theCommands.Add("vpickselected", "vpickselected [name]: extract selected shape.",
+    __FILE__, VPickSelected, group);
+
 }
 
 //=====================================================================
diff --git a/tests/bugs/vis/bug25335 b/tests/bugs/vis/bug25335
new file mode 100644 (file)
index 0000000..f8835cf
--- /dev/null
@@ -0,0 +1,24 @@
+puts "================"
+puts "OCC25335"
+puts "================"
+puts ""
+#######################################################################################
+# Visualization - method ::SelectedShape() in AIS_LocalContext and AIS_InteractiveContext overrides shape transformation
+#######################################################################################
+
+vinit
+
+box b 1 1 1
+vdisplay b
+btranslate b 1 0 0
+vselmode 2 1
+vfit
+vselect 299 352
+vpickselected
+vsetlocation b 0 1 0
+vzfit
+vselect 233 188
+vpickselected
+vsetlocation b -2 2 0
+vfit
+