X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketcherPrs%2FSketcherPrs_SymbolPrs.cpp;h=77b40fc8be0a23bfca4239792257ebb17ee31c2d;hb=d3883990177d27a12b8a2278cdbb82250ff19b79;hp=b502c47e9be3f3480a16f63bfc2b278197a42240;hpb=706361414a00e683cf7ecb6ca3e3a7e941833200;p=modules%2Fshaper.git diff --git a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp index b502c47e9..77b40fc8b 100644 --- a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp +++ b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp @@ -6,8 +6,13 @@ #include "SketcherPrs_SymbolPrs.h" #include "SketcherPrs_Tools.h" +#include "SketcherPrs_PositionMgr.h" #include +#include +#include + +#include #include #include @@ -18,6 +23,11 @@ #include #include #include +#include +#include +#include +#include +#include #include #include @@ -26,8 +36,6 @@ #include #include #include -#include -#include #ifdef WIN32 # define FSEP "\\" @@ -218,27 +226,43 @@ 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() { if (myIconsMap.count(iconName()) == 1) { return myIconsMap[iconName()]; } - TCollection_AsciiString aFile(getenv("NewGeomResources")); - aFile += FSEP; - aFile += iconName(); - Handle(Image_AlienPixMap) aPixMap = new Image_AlienPixMap(); - if (aPixMap->Load(aFile)) { - myIconsMap[iconName()] = aPixMap; - return aPixMap; + char* aEnv = getenv("NEWGEOM_ROOT_DIR"); + if (aEnv != NULL) { + TCollection_AsciiString aFile(aEnv); + aFile+=FSEP; + aFile+="resources"; + aFile += FSEP; + aFile += iconName(); + Handle(Image_AlienPixMap) aPixMap = new Image_AlienPixMap(); + if (aPixMap->Load(aFile)) { + myIconsMap[iconName()] = aPixMap; + return aPixMap; + } } + static const char aMsg[] = "Error! constraint images are not found"; + cout<Color(this, theColor); @@ -319,10 +348,12 @@ void SketcherPrs_SymbolPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& int aNbVertex = myPntArray->VertexNumber(); if (myOwner.IsNull()) { myOwner = new SelectMgr_EntityOwner(this); - for (int i = 1; i <= aNbVertex; i++) { - Handle(SketcherPrs_SensitivePoint) aSP = new SketcherPrs_SensitivePoint(myOwner, myPntArray, i); - mySPoints.Append(aSP); - } + } + + mySPoints.Clear(); + for (int i = 1; i <= aNbVertex; i++) { + Handle(SketcherPrs_SensitivePoint) aSP = new SketcherPrs_SensitivePoint(myOwner, i); + mySPoints.Append(aSP); } Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup(thePresentation); @@ -337,6 +368,9 @@ void SketcherPrs_SymbolPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& } aGroup->UserDraw(this, true); + + // Disable frustum culling for this object by marking it as mutable + aGroup->Structure()->SetMutable(true); //aGroup->AddPrimitiveArray(myPntArray); } @@ -346,8 +380,10 @@ void SketcherPrs_SymbolPrs::ComputeSelection(const Handle(SelectMgr_Selection)& const Standard_Integer aMode) { ClearSelected(); - for (int i = 1; i <= mySPoints.Length(); i++) - aSelection->Add(mySPoints.Value(i)); + if ((aMode == 0) || (aMode == SketcherPrs_Tools::Sel_Constraint)) { + for (int i = 1; i <= mySPoints.Length(); i++) + aSelection->Add(mySPoints.Value(i)); + } } @@ -388,6 +424,11 @@ void SketcherPrs_SymbolPrs::Render(const Handle(OpenGl_Workspace)& theWorkspace) if (theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT) aLineColor = theWorkspace->HighlightColor; + if (toHilight) + aCtx->core11fwd->glDisable (GL_LIGHTING); + else + aCtx->core11fwd->glEnable (GL_LIGHTING); + aCtx->SetColor4fv(*(const OpenGl_Vec4* )(aLineColor->rgb)); @@ -409,8 +450,13 @@ void SketcherPrs_SymbolPrs::Render(const Handle(OpenGl_Workspace)& theWorkspace) theWorkspace->EnableTexture (aTextureBack); aCtx->BindProgram (NULL); - // Update selection position - GetContext()->RecomputeSelectionOnly(this); + // 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()->MainSelector()->RebuildSensitivesTree (this); + GetContext()->MainSelector()->RebuildObjectsTree (false); + } } @@ -424,3 +470,54 @@ 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); + } +} + +void SketcherPrs_SymbolPrs::BoundingBox (Bnd_Box& theBndBox) +{ + Select3D_BndBox3d aTmpBox; + for (Select3D_EntitySequenceIter aPntIter (mySPoints); aPntIter.More(); aPntIter.Next()) + { + const Handle(Select3D_SensitiveEntity)& anEnt = aPntIter.Value(); + aTmpBox.Combine (anEnt->BoundingBox()); + } + + theBndBox.Update (aTmpBox.CornerMin().x(), aTmpBox.CornerMin().y(), aTmpBox.CornerMin().z(), + aTmpBox.CornerMax().x(), aTmpBox.CornerMax().y(), aTmpBox.CornerMax().z()); +} +