X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_ResultSketchPrs.cpp;h=d23125683ca8ae9868af9b340982a876810e5b84;hb=383021cb51c4720904096ca851db5ee79255b402;hp=f0db6da461c1ce429b9462e372b856a8bc7d799b;hpb=e892b35a396a675c38a2808477956dcfb935fe1a;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_ResultSketchPrs.cpp b/src/PartSet/PartSet_ResultSketchPrs.cpp index f0db6da46..d23125683 100755 --- a/src/PartSet/PartSet_ResultSketchPrs.cpp +++ b/src/PartSet/PartSet_ResultSketchPrs.cpp @@ -8,14 +8,18 @@ #include "PartSet_Tools.h" #include "ModuleBase_Tools.h" +#include #include #include #include -#include +#include +#include #include +#include + #include #include @@ -59,165 +63,45 @@ PartSet_ResultSketchPrs::PartSet_ResultSketchPrs(ResultPtr theResult) SetAutoHilight(aCompSolid.get() == NULL); } -bool PartSet_ResultSketchPrs::isValidShapeType(const TopAbs_ShapeEnum& theBaseType, - const TopAbs_ShapeEnum& theCheckedType) -{ - bool aValid = theBaseType == theCheckedType; - if (!aValid) { - // currently this functionality is for all, as we have no separate wire selection mode - // lately it should be corrected to have the following check only for sketch presentations - aValid = theBaseType == TopAbs_FACE && theCheckedType == TopAbs_WIRE; - } - return aValid; -} - - void PartSet_ResultSketchPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) { thePresentation->Clear(); - std::shared_ptr aShapePtr = ModelAPI_Tools::shape(myResult); - if (!aShapePtr) { - Events_Error::throwException("An empty AIS presentation: PartSet_ResultSketchPrs"); - return; - } + TopoDS_Shape aResultShape; + TopoDS_Compound anAuxiliaryCompound; + NCollection_List aFaceList; + fillShapes(aResultShape, anAuxiliaryCompound, mySketchFaceList); - { - std::vector aColor; - aColor = Config_PropManager::color("Visualization", "result_body_color", - ("200,200,230")); - Standard_Real anAuxiliaryWidth = 3.; - Standard_Integer anAuxiliaryLineStyle = 0; - - SetColor(Quantity_Color(aColor[0] / 255., aColor[1] / 255., aColor[2] / 255., Quantity_TOC_RGB)); - - //thePresentation->Clear(); - Handle(Prs3d_Drawer) aDrawer = Attributes(); - setWidth(aDrawer, anAuxiliaryWidth); - // set line style - Handle(Prs3d_LineAspect) aLineAspect; - - Aspect_TypeOfLine aType = (Aspect_TypeOfLine)anAuxiliaryLineStyle; - if (aDrawer->HasOwnLineAspect()) { - aLineAspect = aDrawer->LineAspect(); - } - if (aDrawer->HasOwnWireAspect()) { - aLineAspect = aDrawer->WireAspect(); - } - Quantity_Color aCurrentColor; - Aspect_TypeOfLine aPrevLineType; - Standard_Real aCurrentWidth; - aLineAspect->Aspect()->Values(aCurrentColor, aPrevLineType, aCurrentWidth); - bool isChangedLineType = aType != aPrevLineType; - if (isChangedLineType) { - aLineAspect->SetTypeOfLine(aType); - } - // end of set line style - } + bool aReadyToDisplay = !aResultShape.IsNull() || !anAuxiliaryCompound.IsNull(); - myFacesList.clear(); - ResultConstructionPtr aConstruction = - std::dynamic_pointer_cast(myResult); - if (aConstruction.get()) { - int aFacesNum = aConstruction->facesNum(); - for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) { - myFacesList.push_back(aConstruction->face(aFaceIndex)); + if (aReadyToDisplay) { + if (!aResultShape.IsNull()) { + myOriginalShape = aResultShape; + if (!myOriginalShape.IsNull()) + Set(myOriginalShape); } + myAuxiliaryCompound = anAuxiliaryCompound; } - myOriginalShape = aShapePtr->impl(); - if (!myOriginalShape.IsNull()) { - Set(myOriginalShape); + setAuxiliaryPresentationStyle(false); - // change deviation coefficient to provide more precise circle - ModuleBase_Tools::setDefaultDeviationCoefficient(myOriginalShape, Attributes()); - AIS_Shape::Compute(thePresentationManager, thePresentation, theMode); - } - else - Events_Error::throwException("An empty AIS presentation: PartSet_ResultSketchPrs"); + // change deviation coefficient to provide more precise circle + ModuleBase_Tools::setDefaultDeviationCoefficient(myResult, Attributes()); + AIS_Shape::Compute(thePresentationManager, thePresentation, theMode); + if (!myAuxiliaryCompound.IsNull()) { + setAuxiliaryPresentationStyle(true); - // create auxiliary shapes - FeaturePtr aResultFeature = ModelAPI_Feature::feature(myResult); - CompositeFeaturePtr aSketchFeature = std::dynamic_pointer_cast - (aResultFeature); - std::list anAuxiliaryResults; - for (int i = 0; i < aSketchFeature->numberOfSubs(); i++) { - FeaturePtr aFeature = aSketchFeature->subFeature(i); - if (PartSet_Tools::isAuxiliarySketchEntity(aFeature)) { - std::list aResults = aFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { - ResultPtr aResult = *aIt; - if (aResult.get() && aResult->shape().get()) - anAuxiliaryResults.push_back(aResult); - } - } - } - if (anAuxiliaryResults.size() > 0) { - Quantity_Color aPrevColor; - Color(aPrevColor); - Standard_Real aPrevWidth = Width(); - - std::vector aColor; - aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color", - SKETCH_AUXILIARY_COLOR); - Standard_Real anAuxiliaryWidth = 1.; - Standard_Integer anAuxiliaryLineStyle = 3; - - SetColor(Quantity_Color(aColor[0] / 255., aColor[1] / 255., aColor[2] / 255., Quantity_TOC_RGB)); - - //thePresentation->Clear(); Handle(Prs3d_Drawer) aDrawer = Attributes(); - setWidth(aDrawer, anAuxiliaryWidth); - // set line style - Handle(Prs3d_LineAspect) aLineAspect; - - Aspect_TypeOfLine aType = (Aspect_TypeOfLine)anAuxiliaryLineStyle; - if (aDrawer->HasOwnLineAspect()) { - aLineAspect = aDrawer->LineAspect(); - } - if (aDrawer->HasOwnWireAspect()) { - aLineAspect = aDrawer->WireAspect(); - } - Quantity_Color aCurrentColor; - Aspect_TypeOfLine aPrevLineType; - Standard_Real aCurrentWidth; - aLineAspect->Aspect()->Values(aCurrentColor, aPrevLineType, aCurrentWidth); - bool isChangedLineType = aType != aPrevLineType; - if (isChangedLineType) { - aLineAspect->SetTypeOfLine(aType); - } - // end of set line style - - BRep_Builder aBuilder; - TopoDS_Compound aComp; - aBuilder.MakeCompound(aComp); + StdPrs_WFDeflectionShape::Add(thePresentation, myAuxiliaryCompound, aDrawer); + } - std::list::const_iterator anIt = anAuxiliaryResults.begin(), - aLast = anAuxiliaryResults.end(); - for (; anIt != aLast; anIt++) { - ResultPtr aResult = *anIt; - if (aResult.get()) { - GeomShapePtr aGeomShape = aResult->shape(); - if (aGeomShape.get()) { - const TopoDS_Shape& aShape = aGeomShape->impl(); - if (!aShape.IsNull()) - aBuilder.Add(aComp, aShape); - } - } - } - myAuxiliaryCompound = aComp; - StdPrs_WFDeflectionShape::Add(thePresentation, aComp, aDrawer); - - // restore presentation properties - //SetColor(aPrevColor); - //setWidth(aDrawer, aPrevWidth); - //if (isChangedLineType) { - // aLineAspect->SetTypeOfLine(aPrevLineType); - //} + if (!aReadyToDisplay) { + Events_InfoMessage("PartSet_ResultSketchPrs", "An empty AIS presentation: PartSet_ResultSketchPrs").send(); + static const Events_ID anEvent = Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION); + ModelAPI_EventCreator::get()->sendUpdated(myResult, anEvent); } } @@ -238,13 +122,21 @@ void debugInfo(const TopoDS_Shape& theShape, const TopAbs_ShapeEnum theType) #endif void PartSet_ResultSketchPrs::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer aMode) + const Standard_Integer theMode) { - if (aMode > 8) + int aMode = theMode; + + if (aMode > 8 && + aMode != SketcherPrs_Tools::Sel_Sketch_Face && + aMode != SketcherPrs_Tools::Sel_Sketch_Wire) // In order to avoid using custom selection modes return; - if (aMode == AIS_Shape::SelectionMode(TopAbs_FACE)) { + bool aShapeIsChanged = false; + if (aMode == SketcherPrs_Tools::Sel_Sketch_Face || + aMode == SketcherPrs_Tools::Sel_Sketch_Wire) { + aMode = (aMode == SketcherPrs_Tools::Sel_Sketch_Face) ? AIS_Shape::SelectionMode(TopAbs_FACE) + : AIS_Shape::SelectionMode(TopAbs_WIRE); #ifdef DEBUG_WIRE const TopoDS_Shape& aShape = Shape(); debugInfo(aShape, TopAbs_VERTEX); // 24 @@ -256,13 +148,10 @@ void PartSet_ResultSketchPrs::ComputeSelection(const Handle(SelectMgr_Selection) TopoDS_Compound aComp; aBuilder.MakeCompound(aComp); aBuilder.Add(aComp, myOriginalShape); - std::list>::const_iterator aIt; - for (aIt = myFacesList.cbegin(); aIt != myFacesList.cend(); ++aIt) { - TopoDS_Shape aFace = (*aIt)->impl(); + + for(NCollection_List::Iterator anIt(mySketchFaceList); anIt.More(); anIt.Next()) { + const TopoDS_Shape& aFace = anIt.Value(); aBuilder.Add(aComp, aFace); - // for sketch presentation in the face mode wires should be selectable also - // accoring to #1343 Improvement of Extrusion and Revolution operations - appendShapeSelection(aSelection, aFace, TopAbs_WIRE); } #ifdef DEBUG_WIRE debugInfo(aComp, TopAbs_VERTEX); // 24 @@ -271,18 +160,23 @@ void PartSet_ResultSketchPrs::ComputeSelection(const Handle(SelectMgr_Selection) debugInfo(aComp, TopAbs_FACE); // 2 #endif Set(aComp); - } else + aShapeIsChanged = true; + } + else Set(myOriginalShape); // append auxiliary compound to selection of edges/vertices if (aMode == AIS_Shape::SelectionMode(TopAbs_EDGE) || aMode == AIS_Shape::SelectionMode(TopAbs_VERTEX)) { - bool isVertex = aMode == AIS_Shape::SelectionMode(TopAbs_VERTEX); + bool isVertex = aMode == AIS_Shape::SelectionMode(TopAbs_VERTEX); appendShapeSelection(aSelection, myAuxiliaryCompound, isVertex ? TopAbs_VERTEX : TopAbs_EDGE); } AIS_Shape::ComputeSelection(aSelection, aMode); + + if (aShapeIsChanged) + Set(myOriginalShape); } void PartSet_ResultSketchPrs::appendShapeSelection(const Handle(SelectMgr_Selection)& theSelection, @@ -302,3 +196,126 @@ void PartSet_ResultSketchPrs::appendShapeSelection(const Handle(SelectMgr_Select } catch ( Standard_Failure ) { } } + +void PartSet_ResultSketchPrs::setAuxiliaryPresentationStyle(const bool isAuxiliary) +{ + std::vector aColor; + Standard_Real aWidth; + Standard_Integer aLineStyle; + + if (!isAuxiliary) { + aColor = Config_PropManager::color("Visualization", "result_construction_color", + ModelAPI_ResultConstruction::DEFAULT_COLOR()); + aWidth = PartSet_Tools::getAISDefaultWidth();// default width value + aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE(); + } + else { + aColor = Config_PropManager::color("Visualization", "result_construction_color", + ModelAPI_ResultConstruction::DEFAULT_COLOR()); + aWidth = PartSet_Tools::getAISDefaultWidth();// default width value + aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY(); + } + + Handle(Prs3d_Drawer) aDrawer = Attributes(); + setColor(aDrawer, Quantity_Color(aColor[0] / 255., aColor[1] / 255., aColor[2] / 255., + Quantity_TOC_RGB)); + + setWidth(aDrawer, aWidth); + // set line style + Handle(Prs3d_LineAspect) aLineAspect; + + Aspect_TypeOfLine aType = (Aspect_TypeOfLine)aLineStyle; + if (aDrawer->HasOwnLineAspect()) { + aLineAspect = aDrawer->LineAspect(); + } + if (aDrawer->HasOwnWireAspect()) { + aLineAspect = aDrawer->WireAspect(); + } + Quantity_Color aCurrentColor; + Aspect_TypeOfLine aPrevLineType; + Standard_Real aCurrentWidth; + aLineAspect->Aspect()->Values(aCurrentColor, aPrevLineType, aCurrentWidth); + bool isChangedLineType = aType != aPrevLineType; + if (isChangedLineType) { + aLineAspect->SetTypeOfLine(aType); + } +} + +void PartSet_ResultSketchPrs::fillShapes(TopoDS_Shape& theResultShape, + TopoDS_Compound& theAuxiliaryCompound, + NCollection_List& theFaceList) +{ + //if (!aResultShape.IsNull() || !anAuxiliaryCompound.IsNull()) + std::shared_ptr aShapePtr = ModelAPI_Tools::shape(myResult); + if (!aShapePtr) + return; + + theFaceList.Clear(); + ResultConstructionPtr aConstruction = + std::dynamic_pointer_cast(myResult); + if (aConstruction.get()) { + int aFacesNum = aConstruction->facesNum(); + for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) { + std::shared_ptr aFaceShape = aConstruction->face(aFaceIndex); + if (aFaceShape.get()) { + TopoDS_Shape aFace = (aFaceShape)->impl(); + theFaceList.Append(aFace); + } + } + } + theResultShape = aShapePtr->impl(); + + /// find auxiliary shapes + FeaturePtr aResultFeature = ModelAPI_Feature::feature(myResult); + CompositeFeaturePtr aSketchFeature = std::dynamic_pointer_cast + (aResultFeature); + std::list anAuxiliaryResults; + for (int i = 0; i < aSketchFeature->numberOfSubs(); i++) { + FeaturePtr aFeature = aSketchFeature->subFeature(i); + if (PartSet_Tools::isAuxiliarySketchEntity(aFeature)) { + std::list aResults = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { + ResultPtr aResult = *aIt; + if (aResult.get() && aResult->shape().get()) + anAuxiliaryResults.push_back(aResult); + } + } + else { + /// append not-edges shapes, e.g. center of a circle, an arc, a point feature + const std::list >& aRes = aFeature->results(); + std::list >::const_iterator aResIter = aRes.cbegin(); + for (; aResIter != aRes.cend(); aResIter++) { + std::shared_ptr aConstr = std::dynamic_pointer_cast< + ModelAPI_ResultConstruction>(*aResIter); + if (aConstr) { + std::shared_ptr aGeomShape = aConstr->shape(); + if (aGeomShape.get()) { + const TopoDS_Shape& aShape = aGeomShape->impl(); + if (aShape.ShapeType() != TopAbs_EDGE) + anAuxiliaryResults.push_back(aConstr); + } + } + } + } + } + + if (anAuxiliaryResults.size() > 0) { + BRep_Builder aBuilder; + //TopoDS_Compound aComp; + aBuilder.MakeCompound(theAuxiliaryCompound); + std::list::const_iterator anIt = anAuxiliaryResults.begin(), + aLast = anAuxiliaryResults.end(); + for (; anIt != aLast; anIt++) { + ResultPtr aResult = *anIt; + if (aResult.get()) { + GeomShapePtr aGeomShape = aResult->shape(); + if (aGeomShape.get()) { + const TopoDS_Shape& aShape = aGeomShape->impl(); + if (!aShape.IsNull()) + aBuilder.Add(theAuxiliaryCompound, aShape); + } + } + } + } +}