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
{
// 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();
}
}
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;
};
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);
myAspect = new Graphic3d_AspectMarker3d();
else
myAspect = new Graphic3d_AspectMarker3d(aIcon);
+
+ myAspect->SetColor(myCustomColor);
}
}
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);
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
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,
}
//*********************************************************************************
-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);
}
//*********************************************************************************