X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_OperationPrs.cpp;h=98bd33298ad97893bd67d675ac121f5379b88883;hb=f85d1c600b80b23dfc3d9904571ce27beae7b6dd;hp=b4a5fb5a1636340eb50db3325d5a2bb74c082ce2;hpb=bb4472b719a70fac9842ed33f16a4ce1f6877d79;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_OperationPrs.cpp b/src/PartSet/PartSet_OperationPrs.cpp index b4a5fb5a1..98bd33298 100755 --- a/src/PartSet/PartSet_OperationPrs.cpp +++ b/src/PartSet/PartSet_OperationPrs.cpp @@ -10,6 +10,13 @@ #include "XGUI_Workshop.h" #include "XGUI_ModuleConnector.h" #include "XGUI_Displayer.h" +#include "XGUI_Tools.h" + +#include "ModuleBase_Tools.h" +#include "ModuleBase_IModule.h" +#include +#include +#include #include #include @@ -17,8 +24,12 @@ #include #include #include +#include +#include +#include +#include -#include +#include #include @@ -26,66 +37,89 @@ #include +//#define DEBUG_EMPTY_SHAPE + +// multi-rotation/translation operation +//#define DEBUG_HIDE_COPY_ATTRIBUTE +#ifdef DEBUG_HIDE_COPY_ATTRIBUTE +#include +#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()), myFeature(FeaturePtr()), myWorkshop(theWorkshop) +: ViewerData_AISShape(TopoDS_Shape()), myWorkshop(theWorkshop), myUseAISWidth(false) { + 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) +void PartSet_OperationPrs::useAISWidth() { - return myFeatureShapes.contains(theResult); -} - -void PartSet_OperationPrs::updateShapes() -{ - myFeatureShapes.clear(); - getFeatureShapes(myFeatureShapes); + myUseAISWidth = true; } void PartSet_OperationPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, const Handle(Prs3d_Presentation)& thePresentation, const Standard_Integer theMode) { + SetColor(myShapeColor); thePresentation->Clear(); - XGUI_Displayer* aDisplayer = workshop()->displayer(); - // create presentations on the base of the shapes + 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(); - 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; - TopoDS_Shape aShape = aGeomShape->impl(); + // 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); + } + } + } StdPrs_WFDeflectionShape::Add(thePresentation, aShape, aDrawer); + if (anEmptyAIS) + anEmptyAIS = false; } } + if (anEmptyAIS) + Events_Error::throwException("An empty AIS presentation: PartSet_OperationPrs"); } void PartSet_OperationPrs::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, @@ -94,26 +128,6 @@ 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; @@ -124,31 +138,97 @@ bool isSubObject(const ObjectPtr& theObject, const FeaturePtr& theFeature) return isSub; } -void addValue(const ObjectPtr& theObject, const GeomShapePtr& theShape, - QMap >& theObjectShapes) +void PartSet_OperationPrs::addValue(const ObjectPtr& theObject, const GeomShapePtr& theShape, + const FeaturePtr& theFeature, ModuleBase_IWorkshop* theWorkshop, + 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()) { + if (aCompsolidResult->numberOfSubs() > 0) { + for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { + ResultPtr aSubResult = aCompsolidResult->subResult(i); + if (aSubResult.get()) { + GeomShapePtr aShape; + addValue(aSubResult, aShape, theFeature, theWorkshop, theObjectShapes); + } + } + return; + } + } +#ifdef DEBUG_HIDE_COPY_ATTRIBUTE + else { + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature.get()) { + AttributeBooleanPtr aCopyAttr = aFeature->data()->boolean(SketchPlugin_SketchEntity::COPY_ID()); + if (aCopyAttr.get()) { + bool isCopy = aCopyAttr->value(); + if (isCopy) + return; + } + } + } +#endif + } + + GeomShapePtr aShape = theShape; + if (!aShape.get()) { + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult.get()) + aShape = aResult->shape(); + } + if (!isSubObject(theObject, theFeature)) + appendShapeIfVisible(theWorkshop, theObject, aShape, theObjectShapes); + } +} + +void PartSet_OperationPrs::appendShapeIfVisible(ModuleBase_IWorkshop* theWorkshop, + const ObjectPtr& theObject, + GeomShapePtr theGeomShape, + QMap >& theObjectShapes) +{ + XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(theWorkshop)->displayer(); + if (XGUI_Displayer::isVisible(aDisplayer, theObject)) { + if (theGeomShape.get()) { + if (theObjectShapes.contains(theObject)) + theObjectShapes[theObject].append(theGeomShape); + else { + QList aShapes; + aShapes.append(theGeomShape); + theObjectShapes[theObject] = aShapes; + } + } else { + #ifdef DEBUG_EMPTY_SHAPE + qDebug(QString("Empty shape in result, result: %1") + .arg(ModuleBase_Tools::objectInfo(theObject)).toStdString().c_str()); + #endif + } } } -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(theFeature, anAttribute->id())) + continue; // this attribute is not participated in the current case + std::string anAttrType = anAttribute->attributeType(); if (anAttrType == ModelAPI_AttributeSelectionList::typeId()) { @@ -158,10 +238,28 @@ 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(); - if (!isSubObject(aResult, myFeature)) - addValue(aResult, aShape, theObjectShapes); + addValue(aResult, aShape, theFeature, theWorkshop, theObjectShapes); + } + } + if (anAttrType == ModelAPI_AttributeRefList::typeId()) { + std::shared_ptr aCurSelList = + std::dynamic_pointer_cast(anAttribute); + for (int i = 0; i < aCurSelList->size(); i++) { + ObjectPtr anObject = aCurSelList->object(i); + FeaturePtr aFeature = std::dynamic_pointer_cast(anObject); + // if a feature is stored in the attribute, we should obtain the feature results + // e.g. feature rectangle uses parameters feature lines in the attribute + if (aFeature.get()) { + getResultShapes(aFeature, theWorkshop, theObjectShapes, false); + } + else { + ResultPtr aResult = std::dynamic_pointer_cast(anObject); + if (aResult.get()) { + GeomShapePtr aShape = aResult->shape(); + if (aShape.get()) + addValue(aResult, aShape, theFeature, theWorkshop, theObjectShapes); + } + } } } else { @@ -173,7 +271,8 @@ void PartSet_OperationPrs::getFeatureShapes(QMap anObject = anAttr->object(); } else { - aShape = PartSet_Tools::findShapeBy2DPoint(anAttr, myWorkshop); + AttributePtr anAttribute = anAttr->attr(); + aShape = PartSet_Tools::findShapeBy2DPoint(anAttribute, 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()) @@ -190,32 +289,74 @@ void PartSet_OperationPrs::getFeatureShapes(QMap AttributeReferencePtr anAttr = std::dynamic_pointer_cast(anAttribute); anObject = anAttr->value(); } + addValue(anObject, aShape, theFeature, theWorkshop, theObjectShapes); + } + } +} - if (anObject.get()) { - if (!aShape.get()) { - ResultPtr aResult = std::dynamic_pointer_cast(anObject); - if (aResult.get()) - aShape = aResult->shape(); - } - if (!isSubObject(anObject, myFeature)) - addValue(anObject, aShape, theObjectShapes); +void PartSet_OperationPrs::getResultShapes(const FeaturePtr& theFeature, + ModuleBase_IWorkshop* theWorkshop, + QMap >& theObjectShapes, + const bool theListShouldBeCleared) +{ + if (theListShouldBeCleared) + theObjectShapes.clear(); + + if (!theFeature.get()) + return; + + XGUI_Displayer* aDisplayer = XGUI_Tools::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; + GeomShapePtr aGeomShape = aResult->shape(); + appendShapeIfVisible(theWorkshop, aResult, aGeomShape, theObjectShapes); + } +} + +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_ViewerPrsPtr aPrs = *anIIt; + ObjectPtr anObject = aPrs->object(); + + GeomShapePtr aGeomShape = aPrs->shape(); + if (!aGeomShape.get() || aGeomShape->isNull()) { + ResultPtr aResult = std::dynamic_pointer_cast(anObject); + if (aResult.get()) { + aGeomShape = aResult->shape(); } } + appendShapeIfVisible(theWorkshop, anObject, aGeomShape, theObjectShapes); } } + 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(); -}