X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FPartSet%2FPartSet_OperationPrs.cpp;h=31efa6041197b8ece3291807446e71b0db9c12fd;hb=bd953380ed26bbef84337e8b2148d930969b5abe;hp=98bd33298ad97893bd67d675ac121f5379b88883;hpb=9ddad7aadf48e6754d8ddeea4eaf0c37c66a9b8f;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_OperationPrs.cpp b/src/PartSet/PartSet_OperationPrs.cpp index 98bd33298..31efa6041 100755 --- a/src/PartSet/PartSet_OperationPrs.cpp +++ b/src/PartSet/PartSet_OperationPrs.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -28,16 +29,25 @@ #include #include #include +#include -#include +#include +#include #include -#include +#include #include +#include +#include +#include +#include +#include + //#define DEBUG_EMPTY_SHAPE +//#define DEBUG_OPERATION_PRS // multi-rotation/translation operation //#define DEBUG_HIDE_COPY_ATTRIBUTE @@ -46,18 +56,26 @@ #include #endif -IMPLEMENT_STANDARD_HANDLE(PartSet_OperationPrs, ViewerData_AISShape); IMPLEMENT_STANDARD_RTTIEXT(PartSet_OperationPrs, ViewerData_AISShape); PartSet_OperationPrs::PartSet_OperationPrs(ModuleBase_IWorkshop* theWorkshop) : ViewerData_AISShape(TopoDS_Shape()), myWorkshop(theWorkshop), myUseAISWidth(false) { +#ifdef DEBUG_OPERATION_PRS + qDebug("PartSet_OperationPrs::PartSet_OperationPrs"); +#endif myShapeColor = Quantity_Color(1, 1, 1, Quantity_TOC_RGB); + + // first presentation for having correct Compute until presentation with shapes are set + gp_Pnt aPnt(0.0, 0.0, 0.0); + BRepBuilderAPI_MakeVertex aMaker(aPnt); + TopoDS_Vertex aVertex = aMaker.Vertex(); + myShapeToPrsMap.Bind(aVertex, NULL); } bool PartSet_OperationPrs::hasShapes() { - return !myFeatureShapes.empty(); + return !myShapeToPrsMap.IsEmpty(); } void PartSet_OperationPrs::setShapeColor(const Quantity_Color& theColor) @@ -70,56 +88,58 @@ void PartSet_OperationPrs::useAISWidth() myUseAISWidth = true; } -void PartSet_OperationPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) +void PartSet_OperationPrs::Compute( + const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) { +#ifdef DEBUG_OPERATION_PRS + qDebug("PartSet_OperationPrs::Compute -- begin"); +#endif + SetColor(myShapeColor); thePresentation->Clear(); + bool aReadyToDisplay = !myShapeToPrsMap.IsEmpty(); XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(myWorkshop)->displayer(); Handle(Prs3d_Drawer) aDrawer = Attributes(); - // create presentations on the base of the shapes - bool anEmptyAIS = true; - QMap >::const_iterator anIt = myFeatureShapes.begin(), - aLast = myFeatureShapes.end(); - for (; anIt != aLast; anIt++) { - ObjectPtr anObject = anIt.key(); - QList aShapes = anIt.value(); - QList::const_iterator aShIt = aShapes.begin(), aShLast = aShapes.end(); - for (; aShIt != aShLast; aShIt++) { - GeomShapePtr aGeomShape = *aShIt; - // the shape should not be checked here on empty value because it should be checked in - // appendShapeIfVisible() on the step of filling myFeatureShapes list - // the reason is to avoid empty AIS object visualized in the viewer - //if (!aGeomShape.get()) continue; - TopoDS_Shape aShape = aGeomShape.get() ? aGeomShape->impl() : TopoDS_Shape(); - // change deviation coefficient to provide more precise circle - ModuleBase_Tools::setDefaultDeviationCoefficient(aShape, aDrawer); - - if (myUseAISWidth) { - AISObjectPtr anAISPtr = aDisplayer->getAISObject(anObject); - if (anAISPtr.get()) { - Handle(AIS_InteractiveObject) anIO = anAISPtr->impl(); - if (!anIO.IsNull()) { - int aWidth = anIO->Width(); - /// workaround for zero width. Else, there will be a crash - if (aWidth == 0) { // width returns of TSolid shape is zero - bool isDisplayed = !anIO->GetContext().IsNull(); - aWidth = PartSet_Tools::getAISDefaultWidth();// default width value - } - setWidth(aDrawer, aWidth); - } + BRep_Builder aBuilder; + TopoDS_Compound aComp; + aBuilder.MakeCompound(aComp); + for(NCollection_DataMap::Iterator + anIter(myShapeToPrsMap); anIter.More(); anIter.Next()) { + const TopoDS_Shape& aShape = anIter.Key(); + aBuilder.Add(aComp, aShape); + // change deviation coefficient to provide more precise circle + // as there is no result, the shape is processed to correct deviation. To be unified + ModuleBase_Tools::setDefaultDeviationCoefficient(aShape, aDrawer); + + if (myUseAISWidth) { + Handle(AIS_InteractiveObject) anIO = anIter.Value(); + if (!anIO.IsNull()) { + int aWidth = anIO->Width(); + /// workaround for zero width. Else, there will be a crash + if (aWidth == 0) { // width returns of TSolid shape is zero + bool isDisplayed = !anIO->GetContext().IsNull(); + aWidth = PartSet_Tools::getAISDefaultWidth();// default width value } + setWidth(aDrawer, aWidth); } - StdPrs_WFDeflectionShape::Add(thePresentation, aShape, aDrawer); - if (anEmptyAIS) - anEmptyAIS = false; } + StdPrs_WFShape::Add(thePresentation, aShape, aDrawer); + } + Set(aComp); + if (!aReadyToDisplay) { + Events_InfoMessage("PartSet_OperationPrs", + "An empty AIS presentation: PartSet_OperationPrs").send(); + std::shared_ptr aMsg = std::shared_ptr( + new Events_Message(Events_Loop::eventByName(EVENT_EMPTY_OPERATION_PRESENTATION))); + Events_Loop::loop()->send(aMsg); } - if (anEmptyAIS) - Events_Error::throwException("An empty AIS presentation: PartSet_OperationPrs"); +#ifdef DEBUG_OPERATION_PRS + qDebug("PartSet_OperationPrs::Compute -- end"); +#endif } void PartSet_OperationPrs::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, @@ -128,6 +148,11 @@ void PartSet_OperationPrs::ComputeSelection(const Handle(SelectMgr_Selection)& a // the presentation is not used in the selection } +NCollection_DataMap& PartSet_OperationPrs::shapesMap() +{ + return myShapeToPrsMap; +} + bool isSubObject(const ObjectPtr& theObject, const FeaturePtr& theFeature) { bool isSub = false; @@ -145,7 +170,8 @@ void PartSet_OperationPrs::addValue(const ObjectPtr& theObject, const GeomShapeP if (theObject.get()) { ResultPtr aResult = std::dynamic_pointer_cast(theObject); if (aResult.get()) { - ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast(theObject); + ResultCompSolidPtr aCompsolidResult = + std::dynamic_pointer_cast(theObject); if (aCompsolidResult.get()) { if (aCompsolidResult->numberOfSubs() > 0) { for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { @@ -162,7 +188,8 @@ void PartSet_OperationPrs::addValue(const ObjectPtr& theObject, const GeomShapeP else { FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); if (aFeature.get()) { - AttributeBooleanPtr aCopyAttr = aFeature->data()->boolean(SketchPlugin_SketchEntity::COPY_ID()); + AttributeBooleanPtr aCopyAttr = + aFeature->data()->boolean(SketchPlugin_SketchEntity::COPY_ID()); if (aCopyAttr.get()) { bool isCopy = aCopyAttr->value(); if (isCopy) @@ -232,7 +259,7 @@ void PartSet_OperationPrs::getFeatureShapes(const FeaturePtr& theFeature, std::string anAttrType = anAttribute->attributeType(); if (anAttrType == ModelAPI_AttributeSelectionList::typeId()) { - std::shared_ptr aCurSelList = + std::shared_ptr aCurSelList = std::dynamic_pointer_cast(anAttribute); for(int i = 0; i < aCurSelList->size(); i++) { std::shared_ptr aSelAttribute = aCurSelList->value(i); @@ -266,7 +293,8 @@ void PartSet_OperationPrs::getFeatureShapes(const FeaturePtr& theFeature, ObjectPtr anObject; GeomShapePtr aShape; if (anAttrType == ModelAPI_AttributeRefAttr::typeId()) { - AttributeRefAttrPtr anAttr = std::dynamic_pointer_cast(anAttribute); + AttributeRefAttrPtr anAttr = + std::dynamic_pointer_cast(anAttribute); if (anAttr->isObject()) { anObject = anAttr->object(); } @@ -281,12 +309,14 @@ void PartSet_OperationPrs::getFeatureShapes(const FeaturePtr& theFeature, } } if (anAttrType == ModelAPI_AttributeSelection::typeId()) { - AttributeSelectionPtr anAttr = std::dynamic_pointer_cast(anAttribute); + AttributeSelectionPtr anAttr = + std::dynamic_pointer_cast(anAttribute); anObject = anAttr->context(); aShape = anAttr->value(); } if (anAttrType == ModelAPI_AttributeReference::typeId()) { - AttributeReferencePtr anAttr = std::dynamic_pointer_cast(anAttribute); + AttributeReferencePtr anAttr = + std::dynamic_pointer_cast(anAttribute); anObject = anAttr->value(); } addValue(anObject, aShape, theFeature, theWorkshop, theObjectShapes); @@ -307,9 +337,10 @@ void PartSet_OperationPrs::getResultShapes(const FeaturePtr& theFeature, XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(theWorkshop)->displayer(); - std::list aFeatureResults = theFeature->results(); - std::list::const_iterator aRIt = aFeatureResults.begin(), - aRLast = aFeatureResults.end(); + std::list aResults; + ModelAPI_Tools::allResults(theFeature, aResults); + std::list::const_iterator aRIt = aResults.begin(), + aRLast = aResults.end(); for (; aRIt != aRLast; aRIt++) { ResultPtr aResult = *aRIt; GeomShapePtr aGeomShape = aResult->shape(); @@ -318,18 +349,15 @@ void PartSet_OperationPrs::getResultShapes(const FeaturePtr& theFeature, } void PartSet_OperationPrs::getHighlightedShapes(ModuleBase_IWorkshop* theWorkshop, - QMap >& theObjectShapes) + QMap >& theObjectShapes) { theObjectShapes.clear(); QList aValues; - ModuleBase_IPropertyPanel* aPanel = theWorkshop->propertyPanel(); - if (aPanel) { - ModuleBase_ModelWidget* aWidget = aPanel->activeWidget(); - if (aWidget) { - aWidget->getHighlighted(aValues); - } - } + ModuleBase_ModelWidget* anActiveWidget = theWorkshop->module()->activeWidget(); + if (anActiveWidget) + anActiveWidget->getHighlighted(aValues); QList aShapes; QList::const_iterator anIIt = aValues.begin(), @@ -360,3 +388,40 @@ bool PartSet_OperationPrs::isSelectionAttribute(const AttributePtr& theAttribute anAttrType == ModelAPI_AttributeSelection::typeId() || anAttrType == ModelAPI_AttributeReference::typeId(); } + +void PartSet_OperationPrs::fillShapeList( + const QMap >& theFeatureShapes, + ModuleBase_IWorkshop* theWorkshop, + NCollection_DataMap& theShapeToPrsMap) +{ + theShapeToPrsMap.Clear(); + + XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(theWorkshop)->displayer(); + + // create presentations on the base of the shapes + QMap >::const_iterator anIt = theFeatureShapes.begin(), + aLast = theFeatureShapes.end(); + for (; anIt != aLast; anIt++) { + ObjectPtr anObject = anIt.key(); + QList aShapes = anIt.value(); + QList::const_iterator aShIt = aShapes.begin(), aShLast = aShapes.end(); + for (; aShIt != aShLast; aShIt++) { + GeomShapePtr aGeomShape = *aShIt; + // the shape should not be checked here on empty value because it should be checked in + // appendShapeIfVisible() on the step of filling theFeatureShapes list + // the reason is to avoid empty AIS object visualized in the viewer + //if (!aGeomShape.get()) continue; + TopoDS_Shape aShape = aGeomShape.get() ? aGeomShape->impl() : TopoDS_Shape(); + if (aShape.IsNull()) + continue; + + // change deviation coefficient to provide more precise circle + Handle(AIS_InteractiveObject) anIO; + AISObjectPtr anAISPtr = aDisplayer->getAISObject(anObject); + if (anAISPtr.get()) + anIO = anAISPtr->impl(); + theShapeToPrsMap.Bind(aShape, anIO); + } + } +}