X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_OperationPrs.cpp;h=aa12287afaf7254f7245484fcbf1940967297287;hb=031179ada6681b874314c450eeda806f9f8abd28;hp=9f52a502d035ba62e4f290737138cb6ee668b189;hpb=42985955d89fa845790a7e38609f5b6838285147;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_OperationPrs.cpp b/src/PartSet/PartSet_OperationPrs.cpp index 9f52a502d..aa12287af 100755 --- a/src/PartSet/PartSet_OperationPrs.cpp +++ b/src/PartSet/PartSet_OperationPrs.cpp @@ -13,6 +13,8 @@ #include "ModuleBase_Tools.h" #include "ModuleBase_IModule.h" +#include +#include #include #include @@ -31,73 +33,43 @@ #include +static const int AIS_DEFAULT_WIDTH = 2; + 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()), myFeature(FeaturePtr()), myWorkshop(theWorkshop) +: ViewerData_AISShape(TopoDS_Shape()), myWorkshop(theWorkshop), myUseAISWidth(false) { - myShapeColor = ModuleBase_Tools::color("Visualization", "construction_plane_color", "1,1,0"); - myResultColor = ModuleBase_Tools::color("Visualization", "construction_plane_color", "0,1,0"); + myShapeColor = Quantity_Color(1, 1, 1, Quantity_TOC_RGB); } -bool PartSet_OperationPrs::canActivate(const FeaturePtr& theFeature) +bool PartSet_OperationPrs::hasShapes() { - bool aHasSelectionAttribute = false; - - std::list anAttributes = theFeature->data()->attributes(""); - std::list::const_iterator anIt = anAttributes.begin(), aLast = anAttributes.end(); - for (; anIt != aLast && !aHasSelectionAttribute; anIt++) - aHasSelectionAttribute = isSelectionAttribute(*anIt); - - return aHasSelectionAttribute; + return !myFeatureShapes.empty(); } -void PartSet_OperationPrs::setFeature(const FeaturePtr& theFeature) +void PartSet_OperationPrs::setShapeColor(const Quantity_Color& theColor) { - myFeature = theFeature; - updateShapes(); + myShapeColor = theColor; } -/*bool PartSet_OperationPrs::dependOn(const ObjectPtr& theResult) -{ - return myFeatureShapes.contains(theResult); -}*/ - -void PartSet_OperationPrs::updateShapes() +void PartSet_OperationPrs::useAISWidth() { - myFeatureShapes.clear(); - getFeatureShapes(myFeatureShapes); - - myFeatureResults.clear(); - if (myFeature) - myFeatureResults = myFeature->results(); -} - -bool PartSet_OperationPrs::hasShapes() -{ - return !myFeatureShapes.empty() || !myFeatureResults.empty(); + myUseAISWidth = true; } void PartSet_OperationPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, const Handle(Prs3d_Presentation)& thePresentation, const Standard_Integer theMode) { - if (!hasShapes()) - return; - // when the feature can not be visualized in the module, the operation preview should not - // be visualized also - if (!myWorkshop->module()->canDisplayObject(myFeature)) - return; - - Quantity_Color aColor(1., 1., 0., Quantity_TOC_RGB); // yellow - SetColor(aColor); - + SetColor(myShapeColor); thePresentation->Clear(); - XGUI_Displayer* aDisplayer = workshop()->displayer(); - // create presentations on the base of the shapes + XGUI_Displayer* aDisplayer = workshop(myWorkshop)->displayer(); Handle(Prs3d_Drawer) aDrawer = Attributes(); + + // create presentations on the base of the shapes QMap >::const_iterator anIt = myFeatureShapes.begin(), aLast = myFeatureShapes.end(); for (; anIt != aLast; anIt++) { @@ -113,27 +85,25 @@ void PartSet_OperationPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& t TopoDS_Shape aShape = aGeomShape->impl(); // 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 = AIS_DEFAULT_WIDTH;// default width value + } + setWidth(aDrawer, aWidth); + } + } + } StdPrs_WFDeflectionShape::Add(thePresentation, aShape, aDrawer); } } - - aColor = Quantity_Color(0., 1., 0., Quantity_TOC_RGB); // green - SetColor(aColor); - - std::list::const_iterator aRIt = myFeatureResults.begin(), - aRLast = myFeatureResults.end(); - for (; aRIt != aRLast; aRIt++) { - ResultPtr aResult = *aRIt; - if (!isVisible(aDisplayer, aResult)) - continue; - GeomShapePtr aGeomShape = aResult->shape(); - if (!aGeomShape.get()) - continue; - TopoDS_Shape aShape = aGeomShape->impl(); - // change deviation coefficient to provide more precise circle - ModuleBase_Tools::setDefaultDeviationCoefficient(aShape, aDrawer); - StdPrs_WFDeflectionShape::Add(thePresentation, aShape, aDrawer); - } } void PartSet_OperationPrs::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, @@ -147,8 +117,21 @@ bool PartSet_OperationPrs::isVisible(XGUI_Displayer* theDisplayer, const ObjectP bool aVisible = false; GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); ResultPtr aResult = std::dynamic_pointer_cast(theObject); - if (aPrs.get() || aResult.get()) + if (aPrs.get() || aResult.get()) { aVisible = theDisplayer->isVisible(theObject); + // compsolid is not visualized in the viewer, but should have presentation when all sub solids are + // visible. It is useful for highlight presentation where compsolid shape is selectable + if (!aVisible && aResult->groupName() == ModelAPI_ResultCompSolid::group()) { + ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast(aResult); + if (aCompsolidResult.get() != NULL) { // change colors for all sub-solids + bool anAllSubsVisible = aCompsolidResult->numberOfSubs() > 0; + for(int i = 0; i < aCompsolidResult->numberOfSubs() && anAllSubsVisible; i++) { + anAllSubsVisible = theDisplayer->isVisible(aCompsolidResult->subResult(i)); + } + aVisible = anAllSubsVisible; + } + } + } else { // check if all results of the feature are visible FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); @@ -211,22 +194,25 @@ void addValue(const ObjectPtr& theObject, const GeomShapePtr& theShape, } } -void PartSet_OperationPrs::getFeatureShapes(QMap >& theObjectShapes) +void PartSet_OperationPrs::getFeatureShapes(const FeaturePtr& theFeature, + ModuleBase_IWorkshop* theWorkshop, + QMap >& theObjectShapes) { - if (!myFeature.get()) + theObjectShapes.clear(); + if (!theFeature.get()) return; ModelAPI_ValidatorsFactory* aValidators = ModelAPI_Session::get()->validators(); QList aShapes; - std::list anAttributes = myFeature->data()->attributes(""); + std::list anAttributes = theFeature->data()->attributes(""); std::list::const_iterator anIt = anAttributes.begin(), aLast = anAttributes.end(); for (; anIt != aLast; anIt++) { AttributePtr anAttribute = *anIt; if (!isSelectionAttribute(anAttribute)) continue; - if (!aValidators->isCase(myFeature, anAttribute->id())) + if (!aValidators->isCase(theFeature, anAttribute->id())) continue; // this attribute is not participated in the current case std::string anAttrType = anAttribute->attributeType(); @@ -238,7 +224,7 @@ void PartSet_OperationPrs::getFeatureShapes(QMap std::shared_ptr aSelAttribute = aCurSelList->value(i); ResultPtr aResult = aSelAttribute->context(); GeomShapePtr aShape = aSelAttribute->value(); - addValue(aResult, aShape, myFeature, theObjectShapes); + addValue(aResult, aShape, theFeature, theObjectShapes); } } if (anAttrType == ModelAPI_AttributeRefList::typeId()) { @@ -246,7 +232,7 @@ void PartSet_OperationPrs::getFeatureShapes(QMap std::dynamic_pointer_cast(anAttribute); for (int i = 0; i < aCurSelList->size(); i++) { GeomShapePtr aShape; - addValue(aCurSelList->object(i), aShape, myFeature, theObjectShapes); + addValue(aCurSelList->object(i), aShape, theFeature, theObjectShapes); } } else { @@ -258,7 +244,7 @@ void PartSet_OperationPrs::getFeatureShapes(QMap anObject = anAttr->object(); } else { - aShape = PartSet_Tools::findShapeBy2DPoint(anAttr, myWorkshop); + aShape = PartSet_Tools::findShapeBy2DPoint(anAttr, theWorkshop); // the distance point is not found if the point is selected in the 2nd time // TODO: after debug, this check can be removed if (!aShape.get()) @@ -275,11 +261,89 @@ void PartSet_OperationPrs::getFeatureShapes(QMap AttributeReferencePtr anAttr = std::dynamic_pointer_cast(anAttribute); anObject = anAttr->value(); } - addValue(anObject, aShape, myFeature, theObjectShapes); + addValue(anObject, aShape, theFeature, theObjectShapes); + } + } +} + +void PartSet_OperationPrs::getResultShapes(const FeaturePtr& theFeature, + ModuleBase_IWorkshop* theWorkshop, + QMap >& theObjectShapes) +{ + theObjectShapes.clear(); + + if (!theFeature.get()) + return; + + XGUI_Displayer* aDisplayer = workshop(theWorkshop)->displayer(); + + std::list aFeatureResults = theFeature->results(); + std::list::const_iterator aRIt = aFeatureResults.begin(), + aRLast = aFeatureResults.end(); + for (; aRIt != aRLast; aRIt++) { + ResultPtr aResult = *aRIt; + if (!isVisible(aDisplayer, aResult)) + continue; + GeomShapePtr aGeomShape = aResult->shape(); + if (!aGeomShape.get()) + continue; + + if (theObjectShapes.contains(aResult)) + theObjectShapes[aResult].append(aGeomShape); + else { + QList aShapes; + aShapes.append(aGeomShape); + theObjectShapes[aResult] = aShapes; + } + } +} + +void PartSet_OperationPrs::getHighlightedShapes(ModuleBase_IWorkshop* theWorkshop, + QMap >& theObjectShapes) +{ + theObjectShapes.clear(); + + QList aValues; + ModuleBase_IPropertyPanel* aPanel = theWorkshop->propertyPanel(); + if (aPanel) { + ModuleBase_ModelWidget* aWidget = aPanel->activeWidget(); + if (aWidget) { + aWidget->getHighlighted(aValues); + } + } + + QList aShapes; + QList::const_iterator anIIt = aValues.begin(), + aILast = aValues.end(); + for (; anIIt != aILast; anIIt++) { + ModuleBase_ViewerPrs aPrs = *anIIt; + ObjectPtr anObject = aPrs.object(); + + GeomShapePtr aGeomShape; + + TopoDS_Shape aShape = aPrs.shape(); + if (!aShape.IsNull()) { + aGeomShape = GeomShapePtr(new GeomAPI_Shape()); + aGeomShape->setImpl(new TopoDS_Shape(aShape)); + } + else { + ResultPtr aResult = std::dynamic_pointer_cast(anObject); + if (aResult.get()) { + aGeomShape = aResult->shape(); + } + } + + if (theObjectShapes.contains(anObject)) + theObjectShapes[anObject].append(aGeomShape); + else { + QList aShapes; + aShapes.append(aGeomShape); + theObjectShapes[anObject] = aShapes; } } } + bool PartSet_OperationPrs::isSelectionAttribute(const AttributePtr& theAttribute) { std::string anAttrType = theAttribute->attributeType(); @@ -291,8 +355,8 @@ bool PartSet_OperationPrs::isSelectionAttribute(const AttributePtr& theAttribute anAttrType == ModelAPI_AttributeReference::typeId(); } -XGUI_Workshop* PartSet_OperationPrs::workshop() const +XGUI_Workshop* PartSet_OperationPrs::workshop(ModuleBase_IWorkshop* theWorkshop) { - XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_ModuleConnector* aConnector = dynamic_cast(theWorkshop); return aConnector->workshop(); }