X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_OperationPrs.cpp;h=58b5a53f50a2d1d93972b8bb9adc0cc63b19a013;hb=1105bfe31c0304ffacd85363d070322049d564f1;hp=1f9bd11b5d057a1ea217f755a0591c8f3e708c0e;hpb=9ddba1caf0817c1e95c55d4c5b8ae6de23cbe6d5;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_OperationPrs.cpp b/src/PartSet/PartSet_OperationPrs.cpp index 1f9bd11b5..58b5a53f5 100755 --- a/src/PartSet/PartSet_OperationPrs.cpp +++ b/src/PartSet/PartSet_OperationPrs.cpp @@ -7,14 +7,28 @@ #include "PartSet_OperationPrs.h" #include "PartSet_Tools.h" +#include "XGUI_Workshop.h" +#include "XGUI_ModuleConnector.h" +#include "XGUI_Displayer.h" + +#include "ModuleBase_Tools.h" +#include "ModuleBase_IModule.h" + #include #include #include #include #include #include +#include +#include +#include +#include + #include +#include + #include #include @@ -25,6 +39,8 @@ IMPLEMENT_STANDARD_RTTIEXT(PartSet_OperationPrs, ViewerData_AISShape); PartSet_OperationPrs::PartSet_OperationPrs(ModuleBase_IWorkshop* theWorkshop) : ViewerData_AISShape(TopoDS_Shape()), myFeature(FeaturePtr()), myWorkshop(theWorkshop) { + myShapeColor = ModuleBase_Tools::color("Visualization", "construction_plane_color", "1,1,0"); + myResultColor = ModuleBase_Tools::color("Visualization", "construction_plane_color", "0,1,0"); } bool PartSet_OperationPrs::canActivate(const FeaturePtr& theFeature) @@ -45,36 +61,81 @@ void PartSet_OperationPrs::setFeature(const FeaturePtr& theFeature) updateShapes(); } -bool PartSet_OperationPrs::dependOn(const ObjectPtr& theResult) +/*bool PartSet_OperationPrs::dependOn(const ObjectPtr& theResult) { return myFeatureShapes.contains(theResult); -} +}*/ void PartSet_OperationPrs::updateShapes() { myFeatureShapes.clear(); getFeatureShapes(myFeatureShapes); + + myFeatureResults.clear(); + if (myFeature) + myFeatureResults = myFeature->results(); +} + +bool PartSet_OperationPrs::hasShapes() +{ + return !myFeatureShapes.empty() || !myFeatureResults.empty(); } 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); + thePresentation->Clear(); + XGUI_Displayer* aDisplayer = workshop()->displayer(); // create presentations on the base of the shapes Handle(Prs3d_Drawer) aDrawer = Attributes(); QMap >::const_iterator anIt = myFeatureShapes.begin(), aLast = myFeatureShapes.end(); for (; anIt != aLast; anIt++) { + ObjectPtr anObject = anIt.key(); + if (!isVisible(aDisplayer, anObject)) + continue; QList aShapes = anIt.value(); QList::const_iterator aShIt = aShapes.begin(), aShLast = aShapes.end(); for (; aShIt != aShLast; aShIt++) { GeomShapePtr aGeomShape = *aShIt; + 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); } } + + 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, @@ -83,15 +144,72 @@ void PartSet_OperationPrs::ComputeSelection(const Handle(SelectMgr_Selection)& a // the presentation is not used in the selection } +bool PartSet_OperationPrs::isVisible(XGUI_Displayer* theDisplayer, const ObjectPtr& theObject) +{ + bool aVisible = false; + GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theObject); + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aPrs.get() || aResult.get()) + aVisible = theDisplayer->isVisible(theObject); + else { + // check if all results of the feature are visible + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + std::list aResults = aFeature->results(); + std::list::const_iterator aIt; + aVisible = !aResults.empty(); + for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { + aVisible = aVisible && theDisplayer->isVisible(*aIt); + } + } + return aVisible; +} + +bool isSubObject(const ObjectPtr& theObject, const FeaturePtr& theFeature) +{ + bool isSub = false; + CompositeFeaturePtr aComposite = std::dynamic_pointer_cast(theFeature); + if (aComposite.get()) + isSub = aComposite->isSub(theObject); + + return isSub; +} + void addValue(const ObjectPtr& theObject, const GeomShapePtr& theShape, + const FeaturePtr& theFeature, QMap >& theObjectShapes) { - if (theObjectShapes.contains(theObject)) - theObjectShapes[theObject].append(theShape); - else { - QList aShapes; - aShapes.append(theShape); - theObjectShapes[theObject] = aShapes; + if (theObject.get()) { + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult.get()) { + ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast(theObject); + if (aCompsolidResult.get()) { + for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { + ResultPtr aSubResult = aCompsolidResult->subResult(i); + if (aSubResult.get()) { + GeomShapePtr aShape; + addValue(aSubResult, aShape, theFeature, theObjectShapes); + } + } + return; + } + } + + + GeomShapePtr aShape = theShape; + if (!aShape.get()) { + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult.get()) + aShape = aResult->shape(); + } + if (!isSubObject(theObject, theFeature)) { + if (theObjectShapes.contains(theObject)) + theObjectShapes[theObject].append(aShape); + else { + QList aShapes; + aShapes.append(aShape); + theObjectShapes[theObject] = aShapes; + } + } } } @@ -100,6 +218,8 @@ void PartSet_OperationPrs::getFeatureShapes(QMap if (!myFeature.get()) return; + ModelAPI_ValidatorsFactory* aValidators = ModelAPI_Session::get()->validators(); + QList aShapes; std::list anAttributes = myFeature->data()->attributes(""); std::list::const_iterator anIt = anAttributes.begin(), aLast = anAttributes.end(); @@ -108,6 +228,9 @@ void PartSet_OperationPrs::getFeatureShapes(QMap if (!isSelectionAttribute(anAttribute)) continue; + if (!aValidators->isCase(myFeature, anAttribute->id())) + continue; // this attribute is not participated in the current case + std::string anAttrType = anAttribute->attributeType(); if (anAttrType == ModelAPI_AttributeSelectionList::typeId()) { @@ -117,9 +240,15 @@ void PartSet_OperationPrs::getFeatureShapes(QMap std::shared_ptr aSelAttribute = aCurSelList->value(i); ResultPtr aResult = aSelAttribute->context(); GeomShapePtr aShape = aSelAttribute->value(); - if (!aShape.get()) - aShape = aResult->shape(); - addValue(aResult, aShape, theObjectShapes); + addValue(aResult, aShape, myFeature, theObjectShapes); + } + } + if (anAttrType == ModelAPI_AttributeRefList::typeId()) { + std::shared_ptr aCurSelList = + std::dynamic_pointer_cast(anAttribute); + for (int i = 0; i < aCurSelList->size(); i++) { + GeomShapePtr aShape; + addValue(aCurSelList->object(i), aShape, myFeature, theObjectShapes); } } else { @@ -148,15 +277,7 @@ void PartSet_OperationPrs::getFeatureShapes(QMap AttributeReferencePtr anAttr = std::dynamic_pointer_cast(anAttribute); anObject = anAttr->value(); } - - if (anObject.get()) { - if (!aShape.get()) { - ResultPtr aResult = std::dynamic_pointer_cast(anObject); - if (aResult.get()) - aShape = aResult->shape(); - } - addValue(anObject, aShape, theObjectShapes); - } + addValue(anObject, aShape, myFeature, theObjectShapes); } } } @@ -166,7 +287,14 @@ bool PartSet_OperationPrs::isSelectionAttribute(const AttributePtr& theAttribute std::string anAttrType = theAttribute->attributeType(); return anAttrType == ModelAPI_AttributeSelectionList::typeId() || + anAttrType == ModelAPI_AttributeRefList::typeId() || anAttrType == ModelAPI_AttributeRefAttr::typeId() || anAttrType == ModelAPI_AttributeSelection::typeId() || anAttrType == ModelAPI_AttributeReference::typeId(); } + +XGUI_Workshop* PartSet_OperationPrs::workshop() const +{ + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + return aConnector->workshop(); +}