-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File: PartSet_ResultSketchPrs.h
-// Created: 25 March 2015
-// Author: Natalia ERMOLAEVA
+// Copyright (C) 2014-2017 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<mailto:webmaster.salome@opencascade.com>
+//
#include "PartSet_ResultSketchPrs.h"
#include "PartSet_Tools.h"
#include "ModuleBase_Tools.h"
+#include <ModelAPI_Events.h>
#include <ModelAPI_Tools.h>
#include <ModelAPI_ResultConstruction.h>
+#include <ModelAPI_ResultCompSolid.h>
#include <GeomAPI_PlanarEdges.h>
-#include <Events_Error.h>
+#include <Events_InfoMessage.h>
+#include <Events_Loop.h>
#include <SketchPlugin_SketchEntity.h>
+#include <SketcherPrs_Tools.h>
+
#include <Config_PropManager.h>
#include <BRep_Builder.hxx>
#include <Prs3d_PointAspect.hxx>
#include <TopoDS_Builder.hxx>
#include <SelectMgr_SelectionManager.hxx>
-#include <StdPrs_WFDeflectionShape.hxx>
+#include <StdPrs_WFShape.hxx>
#include <StdSelect_BRepSelectionTool.hxx>
#include <Graphic3d_AspectLine3d.hxx>
#include <Prs3d_LineAspect.hxx>
+#include <Graphic3d_AspectMarker3d.hxx>
#define DEBUG_WIRE
//*******************************************************************************************
-IMPLEMENT_STANDARD_HANDLE(PartSet_ResultSketchPrs, ViewerData_AISShape);
IMPLEMENT_STANDARD_RTTIEXT(PartSet_ResultSketchPrs, ViewerData_AISShape);
PartSet_ResultSketchPrs::PartSet_ResultSketchPrs(ResultPtr theResult)
TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
Set(aShape);
Handle(Prs3d_Drawer) aDrawer = Attributes();
- if (aDrawer->HasOwnPointAspect())
+ if (aDrawer->HasOwnPointAspect())
aDrawer->PointAspect()->SetTypeOfMarker(Aspect_TOM_PLUS);
else
aDrawer->SetPointAspect(new Prs3d_PointAspect(Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.));
// Activate individual repaintng if this is a part of compsolid
ResultCompSolidPtr aCompSolid = ModelAPI_Tools::compSolidOwner(myResult);
SetAutoHilight(aCompSolid.get() == NULL);
-}
-bool PartSet_ResultSketchPrs::isValidShapeType(const TopAbs_ShapeEnum& theBaseType,
- const TopAbs_ShapeEnum& theCheckedType)
-{
- bool aValid = theBaseType == theCheckedType;
- if (!aValid) {
- // currently this functionality is for all, as we have no separate wire selection mode
- // lately it should be corrected to have the following check only for sketch presentations
- aValid = theBaseType == TopAbs_FACE && theCheckedType == TopAbs_WIRE;
- }
- return aValid;
+ ModuleBase_Tools::setPointBallHighlighting(this);
}
-
-void PartSet_ResultSketchPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& thePresentationManager,
- const Handle(Prs3d_Presentation)& thePresentation,
- const Standard_Integer theMode)
+void PartSet_ResultSketchPrs::Compute(
+ const Handle(PrsMgr_PresentationManager3d)& thePresentationManager,
+ const Handle(Prs3d_Presentation)& thePresentation,
+ const Standard_Integer theMode)
{
thePresentation->Clear();
- std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(myResult);
- if (!aShapePtr) {
- Events_Error::throwException("An empty AIS presentation: PartSet_ResultSketchPrs");
- return;
- }
+ TopoDS_Shape aResultShape;
+ TopoDS_Compound anAuxiliaryCompound;
+ NCollection_List<TopoDS_Shape> aFaceList;
+ fillShapes(aResultShape, anAuxiliaryCompound, mySketchFaceList);
- {
- std::vector<int> aColor;
- aColor = Config_PropManager::color("Visualization", "result_body_color",
- ("200,200,230"));
- Standard_Real anAuxiliaryWidth = 3.;
- Standard_Integer anAuxiliaryLineStyle = 0;
-
- SetColor(Quantity_Color(aColor[0] / 255., aColor[1] / 255., aColor[2] / 255., Quantity_TOC_RGB));
-
- //thePresentation->Clear();
- Handle(Prs3d_Drawer) aDrawer = Attributes();
- setWidth(aDrawer, anAuxiliaryWidth);
- // set line style
- Handle(Prs3d_LineAspect) aLineAspect;
+ bool aReadyToDisplay = !aResultShape.IsNull() || !anAuxiliaryCompound.IsNull();
- Aspect_TypeOfLine aType = (Aspect_TypeOfLine)anAuxiliaryLineStyle;
- if (aDrawer->HasOwnLineAspect()) {
- aLineAspect = aDrawer->LineAspect();
+ if (aReadyToDisplay) {
+ if (!aResultShape.IsNull()) {
+ myOriginalShape = aResultShape;
+ if (!myOriginalShape.IsNull())
+ Set(myOriginalShape);
}
- if (aDrawer->HasOwnWireAspect()) {
- aLineAspect = aDrawer->WireAspect();
- }
- Quantity_Color aCurrentColor;
- Aspect_TypeOfLine aPrevLineType;
- Standard_Real aCurrentWidth;
- aLineAspect->Aspect()->Values(aCurrentColor, aPrevLineType, aCurrentWidth);
- bool isChangedLineType = aType != aPrevLineType;
- if (isChangedLineType) {
- aLineAspect->SetTypeOfLine(aType);
- }
- // end of set line style
+ myAuxiliaryCompound = anAuxiliaryCompound;
}
- myFacesList.clear();
- ResultConstructionPtr aConstruction =
- std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(myResult);
- if (aConstruction.get()) {
- int aFacesNum = aConstruction->facesNum();
- for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) {
- myFacesList.push_back(aConstruction->face(aFaceIndex));
- }
- }
-
- myOriginalShape = aShapePtr->impl<TopoDS_Shape>();
- if (!myOriginalShape.IsNull()) {
- Set(myOriginalShape);
-
- // change deviation coefficient to provide more precise circle
- ModuleBase_Tools::setDefaultDeviationCoefficient(myOriginalShape, Attributes());
- AIS_Shape::Compute(thePresentationManager, thePresentation, theMode);
- }
- else
- Events_Error::throwException("An empty AIS presentation: PartSet_ResultSketchPrs");
-
-
- // create auxiliary shapes
- FeaturePtr aResultFeature = ModelAPI_Feature::feature(myResult);
- CompositeFeaturePtr aSketchFeature = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>
- (aResultFeature);
- std::list<ResultPtr> anAuxiliaryResults;
- for (int i = 0; i < aSketchFeature->numberOfSubs(); i++) {
- FeaturePtr aFeature = aSketchFeature->subFeature(i);
- if (PartSet_Tools::isAuxiliarySketchEntity(aFeature)) {
- std::list<ResultPtr> aResults = aFeature->results();
- std::list<ResultPtr>::const_iterator aIt;
- for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) {
- ResultPtr aResult = *aIt;
- if (aResult.get() && aResult->shape().get())
- anAuxiliaryResults.push_back(aResult);
- }
- }
- }
- if (anAuxiliaryResults.size() > 0) {
- Quantity_Color aPrevColor;
- Color(aPrevColor);
- Standard_Real aPrevWidth = Width();
+ setAuxiliaryPresentationStyle(false);
- std::vector<int> aColor;
- aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color",
- SKETCH_AUXILIARY_COLOR);
- Standard_Real anAuxiliaryWidth = 1.;
- Standard_Integer anAuxiliaryLineStyle = 3;
+ // change deviation coefficient to provide more precise circle
+ //ModuleBase_Tools::setDefaultDeviationCoefficient(myResult, Attributes());
+ AIS_Shape::Compute(thePresentationManager, thePresentation, theMode);
- SetColor(Quantity_Color(aColor[0] / 255., aColor[1] / 255., aColor[2] / 255., Quantity_TOC_RGB));
+ if (!myAuxiliaryCompound.IsNull()) {
+ setAuxiliaryPresentationStyle(true);
- //thePresentation->Clear();
Handle(Prs3d_Drawer) aDrawer = Attributes();
- setWidth(aDrawer, anAuxiliaryWidth);
- // set line style
- Handle(Prs3d_LineAspect) aLineAspect;
-
- Aspect_TypeOfLine aType = (Aspect_TypeOfLine)anAuxiliaryLineStyle;
- if (aDrawer->HasOwnLineAspect()) {
- aLineAspect = aDrawer->LineAspect();
- }
- if (aDrawer->HasOwnWireAspect()) {
- aLineAspect = aDrawer->WireAspect();
- }
- Quantity_Color aCurrentColor;
- Aspect_TypeOfLine aPrevLineType;
- Standard_Real aCurrentWidth;
- aLineAspect->Aspect()->Values(aCurrentColor, aPrevLineType, aCurrentWidth);
- bool isChangedLineType = aType != aPrevLineType;
- if (isChangedLineType) {
- aLineAspect->SetTypeOfLine(aType);
- }
- // end of set line style
-
- BRep_Builder aBuilder;
- TopoDS_Compound aComp;
- aBuilder.MakeCompound(aComp);
+ StdPrs_WFShape::Add(thePresentation, myAuxiliaryCompound, aDrawer);
+ }
- std::list<ResultPtr>::const_iterator anIt = anAuxiliaryResults.begin(),
- aLast = anAuxiliaryResults.end();
- for (; anIt != aLast; anIt++) {
- ResultPtr aResult = *anIt;
- if (aResult.get()) {
- GeomShapePtr aGeomShape = aResult->shape();
- if (aGeomShape.get()) {
- const TopoDS_Shape& aShape = aGeomShape->impl<TopoDS_Shape>();
- if (!aShape.IsNull())
- aBuilder.Add(aComp, aShape);
- }
- }
- }
- myAuxiliaryCompound = aComp;
- StdPrs_WFDeflectionShape::Add(thePresentation, aComp, aDrawer);
-
- // restore presentation properties
- //SetColor(aPrevColor);
- //setWidth(aDrawer, aPrevWidth);
- //if (isChangedLineType) {
- // aLineAspect->SetTypeOfLine(aPrevLineType);
- //}
+ if (!aReadyToDisplay) {
+ Events_InfoMessage("PartSet_ResultSketchPrs",
+ "An empty AIS presentation: PartSet_ResultSketchPrs").send();
+ static const Events_ID anEvent = Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION);
+ ModelAPI_EventCreator::get()->sendUpdated(myResult, anEvent);
}
}
TopTools_IndexedMapOfShape aSubShapes;
TopExp::MapShapes (theShape, theType, aSubShapes);
- Standard_Boolean isComesFromDecomposition = !((aSubShapes.Extent() == 1) && (theShape == aSubShapes (1)));
+ Standard_Boolean
+ isComesFromDecomposition = !((aSubShapes.Extent() == 1) && (theShape == aSubShapes (1)));
int anExtent = aSubShapes.Extent();
for (Standard_Integer aShIndex = 1; aShIndex <= aSubShapes.Extent(); ++aShIndex)
{
#endif
void PartSet_ResultSketchPrs::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
- const Standard_Integer aMode)
+ const Standard_Integer theMode)
{
- if (aMode > 8)
+ int aMode = theMode;
+
+ if (aMode > 8 &&
+ aMode != SketcherPrs_Tools::Sel_Sketch_Face &&
+ aMode != SketcherPrs_Tools::Sel_Sketch_Wire)
// In order to avoid using custom selection modes
return;
- if (aMode == AIS_Shape::SelectionMode(TopAbs_FACE)) {
+ bool aShapeIsChanged = false;
+ double aPrevDeviation = Attributes()->DeviationCoefficient();
+ if (aMode == SketcherPrs_Tools::Sel_Sketch_Face ||
+ aMode == SketcherPrs_Tools::Sel_Sketch_Wire) {
+ aMode = (aMode == SketcherPrs_Tools::Sel_Sketch_Face) ? AIS_Shape::SelectionMode(TopAbs_FACE)
+ : AIS_Shape::SelectionMode(TopAbs_WIRE);
#ifdef DEBUG_WIRE
const TopoDS_Shape& aShape = Shape();
debugInfo(aShape, TopAbs_VERTEX); // 24
TopoDS_Compound aComp;
aBuilder.MakeCompound(aComp);
aBuilder.Add(aComp, myOriginalShape);
- std::list<std::shared_ptr<GeomAPI_Shape>>::const_iterator aIt;
- for (aIt = myFacesList.cbegin(); aIt != myFacesList.cend(); ++aIt) {
- TopoDS_Shape aFace = (*aIt)->impl<TopoDS_Shape>();
+
+ for(NCollection_List<TopoDS_Shape>::Iterator anIt(mySketchFaceList); anIt.More(); anIt.Next()) {
+ const TopoDS_Shape& aFace = anIt.Value();
aBuilder.Add(aComp, aFace);
- // for sketch presentation in the face mode wires should be selectable also
- // accoring to #1343 Improvement of Extrusion and Revolution operations
- appendShapeSelection(aSelection, aFace, TopAbs_WIRE);
}
#ifdef DEBUG_WIRE
debugInfo(aComp, TopAbs_VERTEX); // 24
debugInfo(aComp, TopAbs_FACE); // 2
#endif
Set(aComp);
- } else
+ double aBodyDefDeflection = Config_PropManager::real("Visualization", "body_deflection");
+ Attributes()->SetDeviationCoefficient(aBodyDefDeflection);
+ aShapeIsChanged = true;
+ }
+ else
Set(myOriginalShape);
// append auxiliary compound to selection of edges/vertices
if (aMode == AIS_Shape::SelectionMode(TopAbs_EDGE) ||
aMode == AIS_Shape::SelectionMode(TopAbs_VERTEX)) {
- bool isVertex = aMode == AIS_Shape::SelectionMode(TopAbs_VERTEX);
+ bool isVertex = aMode == AIS_Shape::SelectionMode(TopAbs_VERTEX);
appendShapeSelection(aSelection, myAuxiliaryCompound, isVertex ? TopAbs_VERTEX : TopAbs_EDGE);
}
AIS_Shape::ComputeSelection(aSelection, aMode);
+
+ if (aShapeIsChanged) {
+ Attributes()->SetDeviationCoefficient(aPrevDeviation);
+ Set(myOriginalShape);
+ }
}
void PartSet_ResultSketchPrs::appendShapeSelection(const Handle(SelectMgr_Selection)& theSelection,
} catch ( Standard_Failure ) {
}
}
+
+void PartSet_ResultSketchPrs::setAuxiliaryPresentationStyle(const bool isAuxiliary)
+{
+ Standard_Integer aLineStyle = isAuxiliary?
+ SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY() :
+ SketchPlugin_SketchEntity::SKETCH_LINE_STYLE();
+
+ Handle(Prs3d_Drawer) aDrawer = Attributes();
+
+ // set line style
+ Handle(Prs3d_LineAspect) aLineAspect;
+
+ Aspect_TypeOfLine aType = (Aspect_TypeOfLine)aLineStyle;
+ if (aDrawer->HasOwnLineAspect()) {
+ aLineAspect = aDrawer->LineAspect();
+ }
+ if (aDrawer->HasOwnWireAspect()) {
+ aLineAspect = aDrawer->WireAspect();
+ }
+ Quantity_Color aCurrentColor = aLineAspect->Aspect()->Color();
+ Aspect_TypeOfLine aPrevLineType = aLineAspect->Aspect()->Type();
+ Standard_Real aCurrentWidth = aLineAspect->Aspect()->Width();
+ bool isChangedLineType = aType != aPrevLineType;
+ if (isChangedLineType) {
+ Handle(Prs3d_LineAspect) aAspect = new Prs3d_LineAspect(aCurrentColor, aType, aCurrentWidth);
+ aDrawer->SetLineAspect(aAspect);
+ aDrawer->SetWireAspect(aAspect);
+ SetAttributes(aDrawer);
+ }
+}
+
+void PartSet_ResultSketchPrs::fillShapes(TopoDS_Shape& theResultShape,
+ TopoDS_Compound& theAuxiliaryCompound,
+ NCollection_List<TopoDS_Shape>& theFaceList)
+{
+ //if (!aResultShape.IsNull() || !anAuxiliaryCompound.IsNull())
+ std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(myResult);
+ if (!aShapePtr)
+ return;
+
+ theFaceList.Clear();
+ ResultConstructionPtr aConstruction =
+ std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(myResult);
+ if (aConstruction.get()) {
+ int aFacesNum = aConstruction->facesNum();
+ for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) {
+ std::shared_ptr<GeomAPI_Face> aFaceShape = aConstruction->face(aFaceIndex);
+ if (aFaceShape.get()) {
+ TopoDS_Shape aFace = (aFaceShape)->impl<TopoDS_Shape>();
+ theFaceList.Append(aFace);
+ }
+ }
+ }
+ theResultShape = aShapePtr->impl<TopoDS_Shape>();
+
+ /// find auxiliary shapes
+ FeaturePtr aResultFeature = ModelAPI_Feature::feature(myResult);
+ CompositeFeaturePtr aSketchFeature = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>
+ (aResultFeature);
+ std::list<ResultPtr> anAuxiliaryResults;
+ for (int i = 0; i < aSketchFeature->numberOfSubs(); i++) {
+ FeaturePtr aFeature = aSketchFeature->subFeature(i);
+ if (PartSet_Tools::isAuxiliarySketchEntity(aFeature)) {
+ std::list<ResultPtr> aResults = aFeature->results();
+ std::list<ResultPtr>::const_iterator aIt;
+ for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) {
+ ResultPtr aResult = *aIt;
+ if (aResult.get() && aResult->shape().get())
+ anAuxiliaryResults.push_back(aResult);
+ }
+ }
+ else {
+ /// append not-edges shapes, e.g. center of a circle, an arc, a point feature
+ const std::list<std::shared_ptr<ModelAPI_Result> >& aRes = aFeature->results();
+ std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aResIter = aRes.cbegin();
+ for (; aResIter != aRes.cend(); aResIter++) {
+ std::shared_ptr<ModelAPI_ResultConstruction> aConstr = std::dynamic_pointer_cast<
+ ModelAPI_ResultConstruction>(*aResIter);
+ if (aConstr) {
+ std::shared_ptr<GeomAPI_Shape> aGeomShape = aConstr->shape();
+ if (aGeomShape.get()) {
+ const TopoDS_Shape& aShape = aGeomShape->impl<TopoDS_Shape>();
+ if (aShape.ShapeType() != TopAbs_EDGE)
+ anAuxiliaryResults.push_back(aConstr);
+ }
+ }
+ }
+ }
+ }
+
+ if (anAuxiliaryResults.size() > 0) {
+ BRep_Builder aBuilder;
+ //TopoDS_Compound aComp;
+ aBuilder.MakeCompound(theAuxiliaryCompound);
+ std::list<ResultPtr>::const_iterator anIt = anAuxiliaryResults.begin(),
+ aLast = anAuxiliaryResults.end();
+ for (; anIt != aLast; anIt++) {
+ ResultPtr aResult = *anIt;
+ if (aResult.get()) {
+ GeomShapePtr aGeomShape = aResult->shape();
+ if (aGeomShape.get()) {
+ const TopoDS_Shape& aShape = aGeomShape->impl<TopoDS_Shape>();
+ if (!aShape.IsNull())
+ aBuilder.Add(theAuxiliaryCompound, aShape);
+ }
+ }
+ }
+ }
+}