-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File: SketcherPrs_SymbolPrs.cpp
-// Created: 12 March 2015
-// Author: Vitaly SMETANNIKOV
+// Copyright (C) 2014-2019 CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
#include "SketcherPrs_SymbolPrs.h"
#include "SketcherPrs_Tools.h"
#include <GeomAPI_Vertex.h>
#include <GeomAPI_Curve.h>
+#include <ModelAPI_Tools.h>
+
#include <Events_InfoMessage.h>
#include <Graphic3d_ArrayOfSegments.hxx>
#include <StdPrs_DeflectionCurve.hxx>
#include <StdPrs_Point.hxx>
#include <StdPrs_Curve.hxx>
+#include <Prs3d_LineAspect.hxx>
#include <OpenGl_Element.hxx>
#include <OpenGl_GraphicDriver.hxx>
#endif
/// Step between icons
-static const double MyDist = 0.02;
+static const double MyDist = 0.015;
//**************************************************************
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
{
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();
}
}
OpenGl_PrimitiveArray::Render(theWorkspace);
+
+ // Update selection position only if there is no selected object
+ // because it can corrupt selection of other objects
+ if (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)
+ SketchPlugin_Sketch* theSketcher)
+ : AIS_InteractiveObject(), myConstraint(theConstraint),
+ myIsCustomColor(false),
+ mySketcher(theSketcher)
{
SetAutoHilight(Standard_False);
- myPntArray = new Graphic3d_ArrayOfPoints(1);
- myPntArray->AddVertex(0., 0., 0.);
}
//*********************************************************************************
SketcherPrs_PositionMgr* aMgr = SketcherPrs_PositionMgr::get();
// Empty memory in position manager
aMgr->deleteConstraint(this);
+
+ Handle(Prs3d_Presentation) aSelPrs =
+ GetSelectPresentation(Handle(PrsMgr_PresentationManager3d)());
+ if (!aSelPrs.IsNull()) {
+ if (!aSelPrs->Groups().IsEmpty()) {
+ aSelPrs->Clear();
+ }
+ aSelPrs->Erase();
+ }
+ Handle(Prs3d_Presentation) aHilightPrs =
+ GetHilightPresentation(Handle(PrsMgr_PresentationManager3d)());
+ if (!aHilightPrs.IsNull()) {
+ if (!aHilightPrs->Groups().IsEmpty()) {
+ aHilightPrs->Clear();
+ }
+ aHilightPrs->Erase();
+ }
}
#ifdef _WINDOWS
aFile = std::string(anEnv) +
FSEP + "share" + FSEP + "salome" + FSEP + "resources" + FSEP + "shaper";
} else {
- anEnv = getenv("OPENPARTS_ROOT_DIR");
+ anEnv = getenv("CADBUILDER_ROOT_DIR");
if (anEnv)
aFile = std::string(anEnv) + FSEP + "resources";
}
aFile += iconName();
Handle(Image_AlienPixMap) aPixMap = new Image_AlienPixMap();
if (aPixMap->Load(aFile.c_str())) {
+ int aRatio = SketcherPrs_Tools::pixelRatio();
+ if (aRatio > 1) {
+ Handle(Image_AlienPixMap) aSizedMap = new Image_AlienPixMap();
+ Standard_Size aWidth = aPixMap->Width() * aRatio;
+ Standard_Size aHeigh = aPixMap->Height() * aRatio;
+ aSizedMap->InitTrash(aPixMap->Format(), aWidth, aHeigh);
+ for (Standard_Size i = 0; i < aWidth; i++) {
+ for (Standard_Size j = 0; j < aHeigh; j++) {
+ aSizedMap->SetPixelColor(i, j, aPixMap->PixelColor(i / aRatio, j / aRatio));
+ }
+ }
+ aPixMap = aSizedMap;
+ }
myIconsMap[iconName()] = aPixMap;
return aPixMap;
}
myAspect = new Graphic3d_AspectMarker3d();
else
myAspect = new Graphic3d_AspectMarker3d(aIcon);
+
+ myAspect->SetColor(myCustomColor);
}
}
void SketcherPrs_SymbolPrs::HilightSelected(const Handle(PrsMgr_PresentationManager3d)& thePM,
const SelectMgr_SequenceOfOwner& theOwners)
{
-
Handle( Prs3d_Presentation ) aSelectionPrs = GetSelectPresentation( thePM );
aSelectionPrs->Clear();
drawLines(aSelectionPrs, GetContext()->SelectionStyle()->Color());
//*********************************************************************************
void SketcherPrs_SymbolPrs::HilightOwnerWithColor(
const Handle(PrsMgr_PresentationManager3d)& thePM,
- const Handle(Graphic3d_HighlightStyle)& theStyle,
+ const Handle(Prs3d_Drawer)& theStyle,
const Handle(SelectMgr_EntityOwner)& theOwner)
{
thePM->Color(this, theStyle);
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);
const Handle(Prs3d_Presentation)& thePresentation,
const Standard_Integer theMode)
{
+ if (!plane().get())
+ return;
// Create an icon
prepareAspect();
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()) {
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
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);
+
+ Handle(Prs3d_Presentation) aPrs = Presentation();
+ if (!aPrs.IsNull()) {
+ if (myIsCustomColor) {
+ Handle(Graphic3d_PresentationAttributes) aAttr = new Graphic3d_PresentationAttributes();
+ aAttr->SetColor(myCustomColor);
+ aPrs->Highlight(aAttr);
+ }
+ else {
+ aPrs->UnHighlight();
+ }
}
}
//*********************************************************************************
void SketcherPrs_SymbolPrs::drawShape(const std::shared_ptr<GeomAPI_Shape>& theShape,
- const Handle(Prs3d_Presentation)& thePrs) const
+ const Handle(Prs3d_Presentation)& thePrs,
+ Quantity_Color theColor) const
{
+ Handle(Graphic3d_AspectLine3d) aLineAspect =
+ new Graphic3d_AspectLine3d(theColor, Aspect_TOL_SOLID, 2);
+
+ Handle(Prs3d_LineAspect) aLinesStyle = myDrawer->LineAspect();
+ Handle(Graphic3d_AspectLine3d) aOldStyle = aLinesStyle->Aspect();
+ aLinesStyle->SetAspect(aLineAspect);
+ myDrawer->SetLineAspect(aLinesStyle);
+
if (theShape->isEdge()) {
// The shape is edge
std::shared_ptr<GeomAPI_Curve> aCurve =
Handle(Geom_CartesianPoint) aPoint = new Geom_CartesianPoint(aPnt->impl<gp_Pnt>());
StdPrs_Point::Add(thePrs, aPoint, myDrawer);
}
+
+ aLinesStyle->SetAspect(aOldStyle);
+ myDrawer->SetLineAspect(aLinesStyle);
}
//*********************************************************************************
void SketcherPrs_SymbolPrs::drawListOfShapes(
const std::shared_ptr<ModelAPI_AttributeRefList>& theListAttr,
- const Handle(Prs3d_Presentation)& thePrs) const
+ const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const
{
int aNb = theListAttr->size();
if (aNb == 0)
aObj = theListAttr->object(i);
std::shared_ptr<GeomAPI_Shape> aShape = SketcherPrs_Tools::getShape(aObj);
if (aShape.get() != NULL)
- drawShape(aShape, thePrs);
+ drawShape(aShape, thePrs, theColor);
}
}
theBndBox.Update (aTmpBox.CornerMin().x(), aTmpBox.CornerMin().y(), aTmpBox.CornerMin().z(),
aTmpBox.CornerMax().x(), aTmpBox.CornerMax().y(), aTmpBox.CornerMax().z());
}
-