From a2a6f8464c5606841480f78b672c2c981a22e72a Mon Sep 17 00:00:00 2001 From: apl Date: Wed, 16 Nov 2016 12:04:58 +0300 Subject: [PATCH] Corrective patch for bring-to-front and auto-selection of position on compound shape --- src/GEOMGUI/GEOMGUI_AnnotationMgr.cxx | 8 +- src/MeasureGUI/MeasureGUI_AnnotationDlg.cxx | 96 ++++++++------------- src/MeasureGUI/MeasureGUI_AnnotationDlg.h | 2 +- 3 files changed, 43 insertions(+), 63 deletions(-) diff --git a/src/GEOMGUI/GEOMGUI_AnnotationMgr.cxx b/src/GEOMGUI/GEOMGUI_AnnotationMgr.cxx index 9f085c5d1..b7f4e9f9d 100755 --- a/src/GEOMGUI/GEOMGUI_AnnotationMgr.cxx +++ b/src/GEOMGUI/GEOMGUI_AnnotationMgr.cxx @@ -87,8 +87,6 @@ SALOME_Prs* GEOMGUI_AnnotationMgr::CreatePresentation( const GEOMGUI_AnnotationA aPresentation->SetIsScreenFixed( theProperty.IsScreenFixed ); - setDisplayProperties( aPresentation, aView, getEntry( theObject ).c_str() ); - TopoDS_Shape aShape = GEOM_Client::get_client().GetShape( GeometryGUI::GetGeomGen(), theObject ); if ( !aShape.IsNull() ) { @@ -111,6 +109,8 @@ SALOME_Prs* GEOMGUI_AnnotationMgr::CreatePresentation( const GEOMGUI_AnnotationA } } + setDisplayProperties( aPresentation, aView, getEntry( theObject ).c_str() ); + // add Prs to preview SUIT_ViewWindow* vw = getApplication()->desktop()->activeWindow(); SOCC_Prs* aPrs = @@ -412,8 +412,6 @@ void GEOMGUI_AnnotationMgr::UpdateVisibleAnnotations( const QString& theEntry, S if ( aPresentation.IsNull() ) continue; - setDisplayProperties( aPresentation, aView, theEntry ); - if ( !aShape.IsNull() ) { gp_Ax3 aShapeLCS = gp_Ax3().Transformed( aShape.Location().Transformation() ); @@ -430,6 +428,8 @@ void GEOMGUI_AnnotationMgr::UpdateVisibleAnnotations( const QString& theEntry, S } } + setDisplayProperties( aPresentation, aView, theEntry ); + aView->getAISContext()->Redisplay( aPresentation ); } } diff --git a/src/MeasureGUI/MeasureGUI_AnnotationDlg.cxx b/src/MeasureGUI/MeasureGUI_AnnotationDlg.cxx index 62020ff9c..400baef26 100755 --- a/src/MeasureGUI/MeasureGUI_AnnotationDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_AnnotationDlg.cxx @@ -503,12 +503,11 @@ void MeasureGUI_AnnotationDlg::SelectionIntoArgument() TopoDS_Shape aShape; GEOMBase::GetShape( myShape.get(), aShape ); - if ( !getPickedPoint( anAttachPoint, aShape ) ) { + hasAttachPoint = getPickedPoint( anAttachPoint, aShape ); + if ( !hasAttachPoint ) { - anAttachPoint = getAttachPoint( aShape ); + anAttachPoint = getAttachPoint( aShape, hasAttachPoint ); } - - hasAttachPoint = true; } } else if ( myEditCurrentArgument == mySubShapeName ) { if ( !myShape->_is_nil() ) { @@ -537,11 +536,11 @@ void MeasureGUI_AnnotationDlg::SelectionIntoArgument() TopoDS_Shape aShape; GEOMBase::GetShape( myShape.get(), aShape ); - if ( !getPickedPoint( anAttachPoint, aSubShape ) ) { + hasAttachPoint = getPickedPoint( anAttachPoint, aSubShape ); + if ( !hasAttachPoint ) { - anAttachPoint = getAttachPoint( aSubShape ); + anAttachPoint = getAttachPoint( aSubShape, hasAttachPoint ); } - hasAttachPoint = true; } } } @@ -739,6 +738,11 @@ bool MeasureGUI_AnnotationDlg::isValid( QString& theMessage ) //RETURN_WITH_MSG( CORBA::is_nil( myShape ), tr( "NO_FIELD" ) ) } } + + if ( myIsCreation ) { + RETURN_WITH_MSG( !myIsPositionDefined, tr( "NO_POSITION" ) ) + } + return true; } @@ -869,8 +873,9 @@ bool MeasureGUI_AnnotationDlg::getPickedPoint( gp_Pnt& thePnt, const TopoDS_Shap { if ( theShape.ShapeType() == TopAbs_VERTEX ) { - thePnt = getAttachPoint( theShape ); - return true; + bool isOk = false; + thePnt = getAttachPoint( theShape, isOk ); + return isOk; } const SUIT_ViewWindow* anActiveView = GEOMBase_Helper::getActiveView(); @@ -902,80 +907,55 @@ bool MeasureGUI_AnnotationDlg::getPickedPoint( gp_Pnt& thePnt, const TopoDS_Shap // function : getAttachPoint // purpose : computes default attachment point on the shape //================================================================================= -gp_Pnt MeasureGUI_AnnotationDlg::getAttachPoint( const TopoDS_Shape& theShape ) +gp_Pnt MeasureGUI_AnnotationDlg::getAttachPoint( const TopoDS_Shape& theShape, bool& theIsOk ) { - TopoDS_Shape aAttachShape; - if ( theShape.ShapeType() == TopAbs_COMPOUND ) - { - QStack< NCollection_Handle > aItStack; - aItStack.push( NCollection_Handle( new TopoDS_Iterator( theShape ) ) ); - while ( aAttachShape.IsNull() && !aItStack.empty() ) - { - NCollection_Handle anIt = aItStack.top(); - if ( !anIt->More() ) - { - aItStack.pop(); - } - else - { - const TopoDS_Shape& aShape = anIt->Value(); - if ( aShape.ShapeType() != TopAbs_COMPSOLID ) - { - aAttachShape = aShape; - } - else - { - aItStack.push( NCollection_Handle( new TopoDS_Iterator( aShape ) ) ); - } - } - } - } - else - { - aAttachShape = theShape; - } - - if ( aAttachShape.ShapeType() == TopAbs_COMPSOLID - || aAttachShape.ShapeType() == TopAbs_SOLID - || aAttachShape.ShapeType() == TopAbs_SHELL ) + gp_Pnt aPnt( 0.0, 0.0, 0.0 ); + theIsOk = true; + if ( theShape.ShapeType() == TopAbs_COMPSOLID + || theShape.ShapeType() == TopAbs_SOLID + || theShape.ShapeType() == TopAbs_SHELL ) { Bnd_Box aBox; - BRepBndLib::Add( aAttachShape, aBox ); + BRepBndLib::Add( theShape, aBox ); const gp_Pnt aMin = aBox.CornerMin(); const gp_Pnt aMax = aBox.CornerMax(); - return gp_Pnt( (aMin.X() + aMax.X()) / 2.0, + aPnt = gp_Pnt( (aMin.X() + aMax.X()) / 2.0, (aMin.Y() + aMax.Y()) / 2.0, (aMin.Z() + aMax.Z()) / 2.0 ); } - else if ( aAttachShape.ShapeType() == TopAbs_FACE ) + else if ( theShape.ShapeType() == TopAbs_FACE ) { - BRepAdaptor_Surface aFace( TopoDS::Face( aAttachShape ) ); + BRepAdaptor_Surface aFace( TopoDS::Face( theShape ) ); const Standard_Real aU1 = aFace.FirstUParameter(); const Standard_Real aU2 = aFace.LastUParameter(); const Standard_Real aV1 = aFace.FirstVParameter(); const Standard_Real aV2 = aFace.LastVParameter(); - return aFace.Value( ( aU1 + aU2 ) / 2.0, ( aV1 + aV2 ) / 2.0 ); + aPnt = aFace.Value( ( aU1 + aU2 ) / 2.0, ( aV1 + aV2 ) / 2.0 ); } - else if ( aAttachShape.ShapeType() == TopAbs_WIRE ) + else if ( theShape.ShapeType() == TopAbs_WIRE ) { - BRepAdaptor_CompCurve aWire( TopoDS::Wire( aAttachShape ) ); + BRepAdaptor_CompCurve aWire( TopoDS::Wire( theShape ) ); const Standard_Real aP1 = aWire.FirstParameter(); const Standard_Real aP2 = aWire.LastParameter(); - return aWire.Value( ( aP1 + aP2 ) / 2.0 ); + aPnt = aWire.Value( ( aP1 + aP2 ) / 2.0 ); } - else if ( aAttachShape.ShapeType() == TopAbs_EDGE ) + else if ( theShape.ShapeType() == TopAbs_EDGE ) { - BRepAdaptor_Curve aEdge( TopoDS::Edge( aAttachShape ) ); + BRepAdaptor_Curve aEdge( TopoDS::Edge( theShape ) ); const Standard_Real aP1 = aEdge.FirstParameter(); const Standard_Real aP2 = aEdge.LastParameter(); - return aEdge.Value( ( aP1 + aP2 ) / 2.0 ); + aPnt = aEdge.Value( ( aP1 + aP2 ) / 2.0 ); } - else if ( aAttachShape.ShapeType() == TopAbs_VERTEX ) + else if ( theShape.ShapeType() == TopAbs_VERTEX ) + { + aPnt = BRep_Tool::Pnt( TopoDS::Vertex( theShape ) ); + } + else { - return BRep_Tool::Pnt( TopoDS::Vertex( aAttachShape ) ); + theIsOk = false; } - return gp_Pnt( 0.0, 0.0, 0.0 ); + return aPnt; } //================================================================================= diff --git a/src/MeasureGUI/MeasureGUI_AnnotationDlg.h b/src/MeasureGUI/MeasureGUI_AnnotationDlg.h index a29d88712..75ef0dafe 100755 --- a/src/MeasureGUI/MeasureGUI_AnnotationDlg.h +++ b/src/MeasureGUI/MeasureGUI_AnnotationDlg.h @@ -97,7 +97,7 @@ private: TopAbs_ShapeEnum getShapeType() const; bool getPickedPoint( gp_Pnt& thePnt, const TopoDS_Shape& theShape ); - gp_Pnt getAttachPoint( const TopoDS_Shape& theShape ); + gp_Pnt getAttachPoint( const TopoDS_Shape& theShape, bool& theIsOk ); gp_Pnt getDefaultPosition( const gp_Pnt& theAttach ); private: -- 2.39.2