mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-01-28 06:10:34 +05:00
Picking point on the shape
This commit is contained in:
parent
ca6fba5742
commit
29139022cc
@ -46,6 +46,7 @@
|
||||
|
||||
#include <OCCViewer_ViewModel.h>
|
||||
#include <OCCViewer_ViewManager.h>
|
||||
#include <OCCViewer_ViewWindow.h>
|
||||
#include <SVTK_ViewModel.h>
|
||||
#include <SALOME_Prs.h>
|
||||
#include <SALOME_ListIO.hxx>
|
||||
@ -66,12 +67,24 @@
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QPushButton>
|
||||
#include <QStack>
|
||||
#include <QTableWidget>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include <AIS_InteractiveContext.hxx>
|
||||
#include <AIS_ListOfInteractive.hxx>
|
||||
#include <AIS_ListIteratorOfListOfInteractive.hxx>
|
||||
|
||||
#include <Bnd_Box.hxx>
|
||||
#include <BRepAdaptor_CompCurve.hxx>
|
||||
#include <BRepAdaptor_Curve.hxx>
|
||||
#include <BRepAdaptor_Surface.hxx>
|
||||
#include <BRepBndLib.hxx>
|
||||
#include <BRep_Tool.hxx>
|
||||
|
||||
#include <SelectMgr_ViewerSelector.hxx>
|
||||
|
||||
#include <TopoDS.hxx>
|
||||
#include <TopExp.hxx>
|
||||
#include <TopExp_Explorer.hxx>
|
||||
#include <TopTools_IndexedMapOfShape.hxx>
|
||||
@ -79,6 +92,8 @@
|
||||
#include <TColStd_MapOfInteger.hxx>
|
||||
#include <TColStd_DataMapIteratorOfDataMapOfIntegerInteger.hxx>
|
||||
|
||||
#include <NCollection_Handle.hxx>
|
||||
|
||||
#include <limits>
|
||||
|
||||
#include <SALOMEDS_wrap.hxx>
|
||||
@ -420,9 +435,12 @@ void MeasureGUI_AnnotationDlg::SelectionIntoArgument()
|
||||
activateSelection();
|
||||
|
||||
if ( !myShape->_is_nil() ) {
|
||||
TopoDS_Shape aShape;
|
||||
GEOMBase::GetShape( myShape.get(), aShape );
|
||||
anAttachPoint = getAttachPoint( aShape );
|
||||
if ( !getPickedPoint( anAttachPoint ) )
|
||||
{
|
||||
TopoDS_Shape aShape;
|
||||
GEOMBase::GetShape( myShape.get(), aShape );
|
||||
anAttachPoint = getAttachPoint( aShape );
|
||||
}
|
||||
}
|
||||
} else if ( myEditCurrentArgument == mySubShapeName ) {
|
||||
if ( !myShape->_is_nil() ) {
|
||||
@ -446,7 +464,12 @@ void MeasureGUI_AnnotationDlg::SelectionIntoArgument()
|
||||
aSubShape = aCurrentSubShape;
|
||||
}
|
||||
}
|
||||
anAttachPoint = getAttachPoint( aSubShape );
|
||||
|
||||
if ( !getPickedPoint( anAttachPoint ) )
|
||||
{
|
||||
anAttachPoint = getAttachPoint( aSubShape );
|
||||
}
|
||||
|
||||
myAnnotationProperties.ShapeIndex = aSubShapeIndex;
|
||||
}
|
||||
}
|
||||
@ -671,14 +694,113 @@ void MeasureGUI_AnnotationDlg::redisplayPreview()
|
||||
}
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : getPickedPoint
|
||||
// purpose : finds picked point in active viewer on the selected shape
|
||||
//=================================================================================
|
||||
bool MeasureGUI_AnnotationDlg::getPickedPoint( gp_Pnt& thePnt )
|
||||
{
|
||||
const SUIT_ViewWindow* anActiveView = GEOMBase_Helper::getActiveView();
|
||||
if ( !anActiveView )
|
||||
return false;
|
||||
|
||||
const OCCViewer_ViewWindow* anOccView = qobject_cast<const OCCViewer_ViewWindow*>( anActiveView );
|
||||
if ( !anOccView )
|
||||
return false;
|
||||
|
||||
OCCViewer_ViewManager* aVM = ( OCCViewer_ViewManager* )anOccView->getViewManager();
|
||||
OCCViewer_Viewer* aViewer = aVM->getOCCViewer();
|
||||
|
||||
Handle(AIS_InteractiveContext) anAISContext = aViewer->getAISContext();
|
||||
Handle(SelectMgr_ViewerSelector) aSelector;
|
||||
if ( anAISContext->HasOpenedContext() )
|
||||
aSelector = anAISContext->LocalSelector();
|
||||
else
|
||||
aSelector = anAISContext->MainSelector();
|
||||
|
||||
if ( aSelector->NbPicked() < 1 )
|
||||
return false;
|
||||
|
||||
thePnt = aSelector->PickedPoint( 1 );
|
||||
return true;
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// function : getAttachPoint
|
||||
// purpose : finds a point on shape to attach annotation object
|
||||
// purpose : computes default attachment point on the shape
|
||||
//=================================================================================
|
||||
gp_Pnt MeasureGUI_AnnotationDlg::getAttachPoint( const TopoDS_Shape& theShape )
|
||||
{
|
||||
gp_Pnt aPoint = gp_Pnt( 0, 0, 0 );
|
||||
TopoDS_Shape aAttachShape;
|
||||
if ( theShape.ShapeType() == TopAbs_COMPOUND )
|
||||
{
|
||||
QStack< NCollection_Handle<TopoDS_Iterator> > aItStack;
|
||||
aItStack.push( NCollection_Handle<TopoDS_Iterator>( new TopoDS_Iterator( theShape ) ) );
|
||||
while ( aAttachShape.IsNull() && !aItStack.empty() )
|
||||
{
|
||||
NCollection_Handle<TopoDS_Iterator> 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<TopoDS_Iterator>( new TopoDS_Iterator( aShape ) ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
aAttachShape = theShape;
|
||||
}
|
||||
|
||||
return aPoint;
|
||||
if ( aAttachShape.ShapeType() == TopAbs_COMPSOLID
|
||||
|| aAttachShape.ShapeType() == TopAbs_SOLID
|
||||
|| aAttachShape.ShapeType() == TopAbs_SHELL )
|
||||
{
|
||||
Bnd_Box aBox;
|
||||
BRepBndLib::Add( aAttachShape, aBox );
|
||||
const gp_Pnt aMin = aBox.CornerMin();
|
||||
const gp_Pnt aMax = aBox.CornerMax();
|
||||
return 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 )
|
||||
{
|
||||
BRepAdaptor_Surface aFace( TopoDS::Face( aAttachShape ) );
|
||||
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 );
|
||||
}
|
||||
else if ( aAttachShape.ShapeType() == TopAbs_WIRE )
|
||||
{
|
||||
BRepAdaptor_CompCurve aWire( TopoDS::Wire( aAttachShape ) );
|
||||
const Standard_Real aP1 = aWire.FirstParameter();
|
||||
const Standard_Real aP2 = aWire.LastParameter();
|
||||
return aWire.Value( ( aP1 + aP2 ) / 2.0 );
|
||||
}
|
||||
else if ( aAttachShape.ShapeType() == TopAbs_EDGE )
|
||||
{
|
||||
BRepAdaptor_Curve aEdge( TopoDS::Edge( aAttachShape ) );
|
||||
const Standard_Real aP1 = aEdge.FirstParameter();
|
||||
const Standard_Real aP2 = aEdge.LastParameter();
|
||||
return aEdge.Value( ( aP1 + aP2 ) / 2.0 );
|
||||
}
|
||||
else if ( aAttachShape.ShapeType() == TopAbs_VERTEX )
|
||||
{
|
||||
return BRep_Tool::Pnt( TopoDS::Vertex( aAttachShape ) );
|
||||
}
|
||||
|
||||
return gp_Pnt( 0.0, 0.0, 0.0 );
|
||||
}
|
||||
|
||||
|
1
src/MeasureGUI/MeasureGUI_AnnotationDlg.h
Executable file → Normal file
1
src/MeasureGUI/MeasureGUI_AnnotationDlg.h
Executable file → Normal file
@ -89,6 +89,7 @@ private:
|
||||
void activateSelectionArgument( QPushButton* theSelectionButton );
|
||||
void activateSelection();
|
||||
TopAbs_ShapeEnum getShapeType() const;
|
||||
bool getPickedPoint(gp_Pnt& thePnt);
|
||||
gp_Pnt getAttachPoint( const TopoDS_Shape& theShape );
|
||||
|
||||
private:
|
||||
|
Loading…
Reference in New Issue
Block a user