Salome HOME
Issue #2029 Change the color of the Sketch when fully constrained
[modules/shaper.git] / src / SketcherPrs / SketcherPrs_SymbolPrs.cpp
index 37841f4b195e1b98b6ef2a53ffff998c7a97f6a1..cc56dd55d9902ca6f2a5c93752fc83e3285bff7e 100644 (file)
@@ -50,10 +50,11 @@ static const double MyDist = 0.02;
 class SketcherPrs_SymbolArray: public OpenGl_PrimitiveArray
 {
 public:
-  SketcherPrs_SymbolArray(const OpenGl_GraphicDriver* theDriver, 
-    const Handle(SketcherPrs_SymbolPrs)& theObj) 
-    :OpenGl_PrimitiveArray(theDriver, theObj->myPntArray->Type(), theObj->myPntArray->Indices(), 
-    theObj->myPntArray->Attributes(), theObj->myPntArray->Bounds()), myObj(theObj) {}
+  SketcherPrs_SymbolArray(const OpenGl_GraphicDriver* theDriver,
+    const Handle(SketcherPrs_SymbolPrs)& theObj, const Handle(AIS_InteractiveContext)& theCtx)
+    :OpenGl_PrimitiveArray(theDriver, theObj->myPntArray->Type(), theObj->myPntArray->Indices(),
+    theObj->myPntArray->Attributes(), theObj->myPntArray->Bounds()), myObj(theObj),
+    myContext(theCtx) {}
 
   virtual void Render(const Handle(OpenGl_Workspace)& theWorkspace) const
   {
@@ -64,10 +65,13 @@ public:
       // Update points coordinate taking the viewer scale into account
       myObj->updateIfReadyToDisplay(MyDist * aScale);
       if (myIsVboInit) {
-        const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext();
-        Handle(Graphic3d_Buffer) aAttr = myObj->myPntArray->Attributes();
-        myVboAttribs->init(aCtx, 0, aAttr->NbElements,
-                           aAttr->Data(), GL_NONE, aAttr->Stride);
+        if (myVboAttribs) {
+          const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext();
+          Handle(Graphic3d_Buffer) aAttr = myObj->myPntArray->Attributes();
+          myVboAttribs->init(aCtx, 0, aAttr->NbElements,
+                             aAttr->Data(), GL_NONE, aAttr->Stride);
+        } else
+          myIsVboInit = false;
       } else {
         myAttribs = myObj->myPntArray->Attributes();
         myIndices = myObj->myPntArray->Indices();
@@ -75,10 +79,18 @@ public:
       }
     }
     OpenGl_PrimitiveArray::Render(theWorkspace);
+
+    // Update selection position only if there is no selected object
+    // because it can corrupt selection of other objects
+    if ((myContext->NbCurrents() == 0) && (myContext->NbSelected() == 0))  {
+      myContext->MainSelector()->RebuildSensitivesTree(myObj);
+      myContext->MainSelector()->RebuildObjectsTree (false);
+    }
   }
 
 private:
   Handle(SketcherPrs_SymbolPrs) myObj;
+  Handle(AIS_InteractiveContext) myContext;
 };
 
 
@@ -91,7 +103,7 @@ std::map<const char*, Handle(Image_AlienPixMap)> SketcherPrs_SymbolPrs::myIconsM
 
 SketcherPrs_SymbolPrs::SketcherPrs_SymbolPrs(ModelAPI_Feature* theConstraint,
                                              const std::shared_ptr<GeomAPI_Ax3>& thePlane)
- : AIS_InteractiveObject(), myConstraint(theConstraint), myPlane(thePlane), myIsConflicting(false)
+ : AIS_InteractiveObject(), myConstraint(theConstraint), myPlane(thePlane), myIsCustomColor(false)
 {
   SetAutoHilight(Standard_False);
   myPntArray = new Graphic3d_ArrayOfPoints(1);
@@ -153,6 +165,8 @@ void SketcherPrs_SymbolPrs::prepareAspect()
       myAspect = new Graphic3d_AspectMarker3d();
     else
       myAspect = new Graphic3d_AspectMarker3d(aIcon);
+
+    myAspect->SetColor(myCustomColor);
   }
 }
 
@@ -203,7 +217,7 @@ void SketcherPrs_SymbolPrs::HilightOwnerWithColor(
   Handle( Prs3d_Presentation ) aHilightPrs = GetHilightPresentation( thePM );
   aHilightPrs->Clear();
   drawLines(aHilightPrs, theStyle->Color());
-  aHilightPrs->SetZLayer (Graphic3d_ZLayerId_Topmost);
+  aHilightPrs->SetZLayer(Graphic3d_ZLayerId_Topmost);
 
   if (thePM->IsImmediateModeOn())
     thePM->AddToImmediateList(aHilightPrs);
@@ -221,7 +235,7 @@ void SketcherPrs_SymbolPrs::Compute(
   Handle(AIS_InteractiveContext) aCtx = GetContext();
   Handle(OpenGl_GraphicDriver) aDriver =
     Handle(OpenGl_GraphicDriver)::DownCast(aCtx->CurrentViewer()->Driver());
-  if (aDriver.IsNull()) 
+  if (aDriver.IsNull())
     return;
 
   // Update points with default shift value
@@ -251,16 +265,16 @@ void SketcherPrs_SymbolPrs::Compute(
   aBnd.Clear();
   for (int i = 1; i <= myPntArray->ItemNumber(); i++) {
     aVert = myPntArray->Vertice(i);
-    aBnd.Add (Graphic3d_Vec4((float)aVert.X(), (float)aVert.Y(), (float)aVert.Z(), 1.0f));
+    aBnd.Add(Graphic3d_Vec4((float)aVert.X(), (float)aVert.Y(), (float)aVert.Z(), 1.0f));
   }
 
   // Pint the group with custom procedure (see Render)
-  SketcherPrs_SymbolArray* aElem = 
-    new SketcherPrs_SymbolArray((OpenGl_GraphicDriver*)aDriver->This(), this);
+  SketcherPrs_SymbolArray* aElem =
+    new SketcherPrs_SymbolArray((OpenGl_GraphicDriver*)aDriver->This(), this, GetContext());
   aGroup->AddElement(aElem);
 
   // Disable frustum culling for this object by marking it as mutable
-  //aGroup->Structure()->SetMutable(true);
+  aGroup->Structure()->SetMutable(true);
 
   if (!aReadyToDisplay)
     SketcherPrs_Tools::sendEmptyPresentationError(myConstraint,
@@ -280,22 +294,17 @@ void SketcherPrs_SymbolPrs::ComputeSelection(const Handle(SelectMgr_Selection)&
 }
 
 //*********************************************************************************
-void SketcherPrs_SymbolPrs::SetConflictingConstraint(const bool& theConflicting,
-                                                     const std::vector<int>& theColor)
+void SketcherPrs_SymbolPrs::SetCustomColor(const std::vector<int>& theColor)
 {
-  if (theConflicting)
-  {
-    if (!myAspect.IsNull())
-      myAspect->SetColor (Quantity_Color (theColor[0] / 255., theColor[1] / 255.,
-                          theColor[2] / 255., Quantity_TOC_RGB));
-    myIsConflicting = true;
-  }
+  myIsCustomColor = !theColor.empty();
+  if (myIsCustomColor)
+    myCustomColor = Quantity_Color(theColor[0] / 255., theColor[1] / 255.,
+                                   theColor[2] / 255., Quantity_TOC_RGB);
   else
-  {
-    if (!myAspect.IsNull())
-      myAspect->SetColor (Quantity_Color (1.0, 1.0, 0.0, Quantity_TOC_RGB));
-    myIsConflicting = false;
-  }
+    myCustomColor = Quantity_Color (1.0, 1.0, 0.0, Quantity_TOC_RGB);
+
+  if (!myAspect.IsNull())
+    myAspect->SetColor (myCustomColor);
 }
 
 //*********************************************************************************