Salome HOME
Meet the coding style (line length <= 100)
[modules/shaper.git] / src / SketcherPrs / SketcherPrs_SymbolPrs.cpp
index 37841f4b195e1b98b6ef2a53ffff998c7a97f6a1..2dfcc68f31301bfdc554c0ffa75ec82388715767 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
   {
@@ -62,12 +63,15 @@ public:
       Handle(OpenGl_View) aView = theWorkspace->View();
       double aScale = aView->Camera()->Scale();
       // Update points coordinate taking the viewer scale into account
-      myObj->updateIfReadyToDisplay(MyDist * aScale);
+      myObj->updateIfReadyToDisplay(MyDist * aScale, myObj->myIsCustomColor);
       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,11 +103,9 @@ 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);
-  myPntArray->AddVertex(0., 0., 0.);
 }
 
 //*********************************************************************************
@@ -153,6 +163,8 @@ void SketcherPrs_SymbolPrs::prepareAspect()
       myAspect = new Graphic3d_AspectMarker3d();
     else
       myAspect = new Graphic3d_AspectMarker3d(aIcon);
+
+    myAspect->SetColor(myCustomColor);
   }
 }
 
@@ -203,7 +215,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,14 +233,14 @@ 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
   // it updates array of points if the presentation is ready to display, or the array of points
   // contains the previous values
 
-  bool aReadyToDisplay = updateIfReadyToDisplay(20);
+  bool aReadyToDisplay = updateIfReadyToDisplay(20, myIsCustomColor);
 
   int aNbVertex = myPntArray->VertexNumber();
   if (myOwner.IsNull()) {
@@ -240,9 +252,12 @@ void SketcherPrs_SymbolPrs::Compute(
   for (int i = 1; i <= aNbVertex; i++) {
     Handle(SketcherPrs_SensitivePoint) aSP = new SketcherPrs_SensitivePoint(myOwner, i);
     mySPoints.Append(aSP);
+    if (myIsCustomColor)
+      myPntArray->SetVertexColor(i, myCustomColor);
   }
 
-  Handle(OpenGl_Group) aGroup = Handle(OpenGl_Group)::DownCast(thePresentation->NewGroup());
+  Handle(OpenGl_Group) aGroup =
+    Handle(OpenGl_Group)::DownCast(Prs3d_Root::CurrentGroup (thePresentation));
   aGroup->SetPrimitivesAspect(myAspect);
 
   // Recompute boundary box of the group
@@ -251,16 +266,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 +295,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);
 }
 
 //*********************************************************************************