X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_OperationPrs.cpp;h=0e7db772b3c8ee528d645641b3a37ae1db429a76;hb=64bd95cebe79a5639800635efb7b0d21f13c079c;hp=31efa6041197b8ece3291807446e71b0db9c12fd;hpb=c795030a80f70473cfcd9bd1bbe2d65f3b25fb0b;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_OperationPrs.cpp b/src/PartSet/PartSet_OperationPrs.cpp old mode 100755 new mode 100644 index 31efa6041..0e7db772b --- a/src/PartSet/PartSet_OperationPrs.cpp +++ b/src/PartSet/PartSet_OperationPrs.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: PartSet_OperationPrs.cpp -// Created: 01 Jul 2015 -// Author: Natalia ERMOLAEVA +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "PartSet_OperationPrs.h" #include "PartSet_Tools.h" @@ -28,7 +41,7 @@ #include #include #include -#include +#include #include #include @@ -45,6 +58,7 @@ #include #include #include +#include //#define DEBUG_EMPTY_SHAPE //#define DEBUG_OPERATION_PRS @@ -71,6 +85,14 @@ PartSet_OperationPrs::PartSet_OperationPrs(ModuleBase_IWorkshop* theWorkshop) BRepBuilderAPI_MakeVertex aMaker(aPnt); TopoDS_Vertex aVertex = aMaker.Vertex(); myShapeToPrsMap.Bind(aVertex, NULL); + + Handle(Prs3d_Drawer) aDrawer = Attributes(); + Handle(Prs3d_IsoAspect) aUIsoAspect = new Prs3d_IsoAspect(myShapeColor, Aspect_TOL_SOLID, 1, 0); + Handle(Prs3d_IsoAspect) aVIsoAspect = new Prs3d_IsoAspect(myShapeColor, Aspect_TOL_SOLID, 1, 0); + aDrawer->SetUIsoAspect(aUIsoAspect); + aDrawer->SetVIsoAspect(aVIsoAspect); + aDrawer->SetIsoOnPlane(false); + //aDrawer->SetTypeOfDeflection(Aspect_TOD_ABSOLUTE); } bool PartSet_OperationPrs::hasShapes() @@ -101,7 +123,6 @@ void PartSet_OperationPrs::Compute( 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 BRep_Builder aBuilder; @@ -114,6 +135,8 @@ void PartSet_OperationPrs::Compute( // 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); + //This presentation is not used for selection, so it don't need highlighting + //ModuleBase_Tools::setDefaultDeviationCoefficient(aShape, DynamicHilightAttributes()); if (myUseAISWidth) { Handle(AIS_InteractiveObject) anIO = anIter.Value(); @@ -121,13 +144,17 @@ void PartSet_OperationPrs::Compute( 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_WFShape::Add(thePresentation, aShape, aDrawer); + try { + StdPrs_WFShape::Add(thePresentation, aShape, aDrawer); + } + catch (...) { + return; + } } Set(aComp); if (!aReadyToDisplay) { @@ -170,12 +197,12 @@ 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); - if (aCompsolidResult.get()) { - if (aCompsolidResult->numberOfSubs() > 0) { - for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { - ResultPtr aSubResult = aCompsolidResult->subResult(i); + ResultBodyPtr aBodyResult = + std::dynamic_pointer_cast(theObject); + if (aBodyResult.get()) { + if (aBodyResult->numberOfSubs() > 0) { + for(int i = 0; i < aBodyResult->numberOfSubs(); i++) { + ResultPtr aSubResult = aBodyResult->subResult(i); if (aSubResult.get()) { GeomShapePtr aShape; addValue(aSubResult, aShape, theFeature, theWorkshop, theObjectShapes); @@ -202,9 +229,9 @@ void PartSet_OperationPrs::addValue(const ObjectPtr& theObject, const GeomShapeP GeomShapePtr aShape = theShape; if (!aShape.get()) { - ResultPtr aResult = std::dynamic_pointer_cast(theObject); - if (aResult.get()) - aShape = aResult->shape(); + ResultPtr aRes = std::dynamic_pointer_cast(theObject); + if (aRes.get()) + aShape = aRes->shape(); } if (!isSubObject(theObject, theFeature)) appendShapeIfVisible(theWorkshop, theObject, aShape, theObjectShapes); @@ -216,22 +243,19 @@ void PartSet_OperationPrs::appendShapeIfVisible(ModuleBase_IWorkshop* theWorksho 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 + 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 } } @@ -293,19 +317,19 @@ void PartSet_OperationPrs::getFeatureShapes(const FeaturePtr& theFeature, ObjectPtr anObject; GeomShapePtr aShape; if (anAttrType == ModelAPI_AttributeRefAttr::typeId()) { - AttributeRefAttrPtr anAttr = + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(anAttribute); - if (anAttr->isObject()) { - anObject = anAttr->object(); + if (aRefAttr->isObject()) { + anObject = aRefAttr->object(); } else { - AttributePtr anAttribute = anAttr->attr(); - aShape = PartSet_Tools::findShapeBy2DPoint(anAttribute, theWorkshop); + AttributePtr anAttr = aRefAttr->attr(); + 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()) continue; - anObject = anAttr->attr()->owner(); + anObject = anAttr->owner(); } } if (anAttrType == ModelAPI_AttributeSelection::typeId()) { @@ -335,16 +359,51 @@ void PartSet_OperationPrs::getResultShapes(const FeaturePtr& theFeature, if (!theFeature.get()) return; - XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(theWorkshop)->displayer(); - 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(); - appendShapeIfVisible(theWorkshop, aResult, aGeomShape, theObjectShapes); + if (!aResult->isDisabled()) { + GeomShapePtr aGeomShape = aResult->shape(); + appendShapeIfVisible(theWorkshop, aResult, aGeomShape, theObjectShapes); + } + } +} + +void PartSet_OperationPrs::getPresentationShapes(const FeaturePtr& theFeature, + ModuleBase_IWorkshop* theWorkshop, + QMap >& theObjectShapes, + const bool theListShouldBeCleared) +{ + if (theListShouldBeCleared) + theObjectShapes.clear(); + + if (!theFeature.get() || !theFeature->data()->isValid()) // if feature is already removed + return; + + XGUI_Displayer* aDisplayer = XGUI_Tools::workshop(theWorkshop)->displayer(); + + GeomPresentablePtr aPrs = std::dynamic_pointer_cast(theFeature); + if (!aPrs.get()) + return; + + AISObjectPtr anAIS = aPrs->getAISObject(aDisplayer->getAISObject(theFeature)); + if (!anAIS.get()) + return; + + Handle(AIS_InteractiveObject) anAISPrs = anAIS->impl(); + if (!anAISPrs.IsNull()) { + Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(anAISPrs); + if (!aShapePrs.IsNull()) { + TopoDS_Shape aShape = aShapePrs->Shape(); + if (!aShape.IsNull()) { + std::shared_ptr aGeomShape(new GeomAPI_Shape()); + aGeomShape->setImpl(new TopoDS_Shape(aShape)); + appendShapeIfVisible(theWorkshop, theFeature, aGeomShape, theObjectShapes); + } + } } }