X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketcherPrs%2FSketcherPrs_SymbolPrs.cpp;h=9a7e9a43178df9d3460a6f9708133ede2718f951;hb=aea15db62bec148b6bfd5db468c682b1695c3449;hp=f7ef9256ef03ba9e36697376cd5155972b873d61;hpb=ad777acf40828575ffa8a9ba6db103a7cc17dd71;p=modules%2Fshaper.git diff --git a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp index f7ef9256e..9a7e9a431 100644 --- a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp +++ b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp @@ -6,19 +6,27 @@ #include "SketcherPrs_SymbolPrs.h" #include "SketcherPrs_Tools.h" +#include "SketcherPrs_PositionMgr.h" #include +#include +#include #include #include #include -#include +#include #include #include #include #include #include +#include +#include +#include +#include +#include #include #include @@ -37,7 +45,7 @@ #endif /// Step between icons -static const double MyDist = 0.03; +static const double MyDist = 0.02; /// Function to convert opengl data type GLenum toGlDataType (const Graphic3d_TypeOfData theType, GLint& theNbComp) @@ -219,13 +227,20 @@ IMPLEMENT_STANDARD_RTTIEXT(SketcherPrs_SymbolPrs, AIS_InteractiveObject); std::map SketcherPrs_SymbolPrs::myIconsMap; -SketcherPrs_SymbolPrs::SketcherPrs_SymbolPrs(SketchPlugin_Constraint* theConstraint, +SketcherPrs_SymbolPrs::SketcherPrs_SymbolPrs(ModelAPI_Feature* theConstraint, const std::shared_ptr& thePlane) : AIS_InteractiveObject(), myConstraint(theConstraint), myPlane(thePlane) { SetAutoHilight(Standard_False); } +SketcherPrs_SymbolPrs::~SketcherPrs_SymbolPrs() +{ + SketcherPrs_PositionMgr* aMgr = SketcherPrs_PositionMgr::get(); + aMgr->deleteConstraint(this); +} + + Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon() { @@ -317,6 +332,17 @@ void SketcherPrs_SymbolPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& if (!updatePoints(20)) return; + int aNbVertex = myPntArray->VertexNumber(); + if (myOwner.IsNull()) { + myOwner = new SelectMgr_EntityOwner(this); + } + + mySPoints.Clear(); + for (int i = 1; i <= aNbVertex; i++) { + Handle(SketcherPrs_SensitivePoint) aSP = new SketcherPrs_SensitivePoint(myOwner, myPntArray, i); + mySPoints.Append(aSP); + } + Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup(thePresentation); aGroup->SetPrimitivesAspect(myAspect); @@ -325,7 +351,7 @@ void SketcherPrs_SymbolPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& aBnd.Clear(); for (int i = 1; i <= myPntArray->ItemNumber(); i++) { aVert = myPntArray->Vertice(i); - aBnd.Add (Graphic3d_Vec4 (aVert.X(), aVert.Y(), aVert.Z(), 1.0f)); + aBnd.Add (Graphic3d_Vec4((float)aVert.X(), (float)aVert.Y(), (float)aVert.Z(), 1.0f)); } aGroup->UserDraw(this, true); @@ -338,13 +364,9 @@ void SketcherPrs_SymbolPrs::ComputeSelection(const Handle(SelectMgr_Selection)& const Standard_Integer aMode) { ClearSelected(); - //if (!updatePoints(20)) - // return; - - Handle(SelectMgr_EntityOwner) aOwn = new SelectMgr_EntityOwner(this); - for (int i = 1; i <= myPntArray->VertexNumber(); i++) { - Handle(Select3D_SensitivePoint) aSP = new Select3D_SensitivePoint(aOwn, myPntArray->Vertice(i)); - aSelection->Add(aSP); + if ((aMode == 0) || (aMode == SketcherPrs_Tools::Sel_Constraint)) { + for (int i = 1; i <= mySPoints.Length(); i++) + aSelection->Add(mySPoints.Value(i)); } } @@ -406,6 +428,11 @@ void SketcherPrs_SymbolPrs::Render(const Handle(OpenGl_Workspace)& theWorkspace) } theWorkspace->EnableTexture (aTextureBack); aCtx->BindProgram (NULL); + + // Update selection position only if there is no selected object + // because it can corrupt selection of other objects + if ((GetContext()->NbCurrents() == 0) && (GetContext()->NbSelected() == 0)) + GetContext()->RecomputeSelectionOnly(this); } @@ -419,3 +446,41 @@ void SketcherPrs_SymbolPrs::Release (OpenGl_Context* theContext) } } +void SketcherPrs_SymbolPrs::drawShape(const std::shared_ptr& theShape, + const Handle(Prs3d_Presentation)& thePrs) const +{ + if (theShape->isEdge()) { + std::shared_ptr aCurve = + std::shared_ptr(new GeomAPI_Curve(theShape)); + if (aCurve->isLine()) { + GeomAdaptor_Curve aCurv(aCurve->impl(), aCurve->startParam(), aCurve->endParam()); + StdPrs_Curve::Add(thePrs, aCurv, myDrawer); + } else { + GeomAdaptor_Curve aAdaptor(aCurve->impl(), aCurve->startParam(), aCurve->endParam()); + StdPrs_DeflectionCurve::Add(thePrs,aAdaptor,myDrawer); + } + } else if (theShape->isVertex()) { + std::shared_ptr aVertex = + std::shared_ptr(new GeomAPI_Vertex(theShape)); + std::shared_ptr aPnt = aVertex->point(); + Handle(Geom_CartesianPoint) aPoint = new Geom_CartesianPoint(aPnt->impl()); + StdPrs_Point::Add(thePrs, aPoint, myDrawer); + } +} + +void SketcherPrs_SymbolPrs::drawListOfShapes(const std::shared_ptr& theListAttr, + const Handle(Prs3d_Presentation)& thePrs) const +{ + int aNb = theListAttr->size(); + if (aNb == 0) + return; + int i; + ObjectPtr aObj; + for (i = 0; i < aNb; i++) { + aObj = theListAttr->object(i); + std::shared_ptr aShape = SketcherPrs_Tools::getShape(aObj); + if (aShape.get() != NULL) + drawShape(aShape, thePrs); + } +} +