21854: Add persistent dimensions

- Bugs with selection of dimension arguments from Object Browser. Remarks for construction of sphere, cone, cylinder diameters.
This commit is contained in:
apl 2014-01-24 14:45:48 +00:00
parent 41744f1d7b
commit e2aeb4c11e
2 changed files with 47 additions and 19 deletions

View File

@ -297,11 +297,29 @@ void MeasureGUI_CreateDimensionDlg::SelectionIntoArgument()
return; return;
} }
GEOM::GeomObjPtr aSelected = getSelected( mySelectionModes );
if ( aSelected.isNull() )
{
ActiveArgs()->SelectionIntoArguments( GEOM::GeomObjPtr() );
return;
}
GEOM::GeomObjPtr aSelectedMain =
!aSelected->IsMainShape()
? aSelected->GetMainShape()
: GEOM::GeomObjPtr();
if ( myParentObj != aSelected && myParentObj != aSelectedMain )
{
ActiveArgs()->SelectionIntoArguments( GEOM::GeomObjPtr() );
return;
}
StopLocalEditing(); StopLocalEditing();
erasePreview(); erasePreview();
ActiveArgs()->SelectionIntoArguments( getSelected( mySelectionModes ) ); ActiveArgs()->SelectionIntoArguments( aSelected );
} }
//================================================================================= //=================================================================================

View File

@ -477,31 +477,46 @@ Handle(AIS_DiameterDimension) MeasureGUI_DimensionCreateTool::Diameter( const GE
BRepAdaptor_Surface aSurf( aMeasuredFace ); BRepAdaptor_Surface aSurf( aMeasuredFace );
Standard_Real aUmin = aSurf.FirstUParameter();
Standard_Real aUmax = aSurf.LastUParameter();
Standard_Real aVmin = aSurf.FirstVParameter(); Standard_Real aVmin = aSurf.FirstVParameter();
Standard_Real aVmax = aSurf.LastVParameter(); Standard_Real aVmax = aSurf.LastVParameter();
// get arguments of closed sphere // get arguments of sphere (the sphere should not be cutted at v-center)
if ( aSurf.GetType() == GeomAbs_Sphere ) if ( aSurf.GetType() == GeomAbs_Sphere )
{ {
if ( !aSurf.IsUClosed() || !aSurf.IsVClosed() ) if ( aVmax <= Precision::PConfusion() || aVmin >= Precision::PConfusion() )
{ {
return NULL; return NULL;
} }
// take circle in XOY plane from sphere Handle(Geom_Surface) aBasisSurface = Handle(Geom_Surface)::DownCast(
gp_Sphere aSphere = aSurf.Sphere(); aSurf.Surface().Surface()->Transformed( aSurf.Trsf() ) );
gp_Ax2 anAx2 = gp_Ax2( aSphere.Location(), gp::DZ() );
aCircle = new Geom_Circle( anAx2, aSphere.Radius() ); Handle(Geom_Curve) aCurve = aBasisSurface->VIso( 0.0 );
if ( aCurve->IsKind( STANDARD_TYPE( Geom_Circle ) ) )
{
aPmin = aUmin;
aPmax = aUmax;
aCircle = Handle(Geom_Circle)::DownCast( aCurve );
}
else if ( aCurve->IsKind( STANDARD_TYPE( Geom_TrimmedCurve ) ) )
{
Handle(Geom_TrimmedCurve) aTrimmedCurve = Handle(Geom_TrimmedCurve)::DownCast( aCurve );
aPmin = aTrimmedCurve->FirstParameter();
aPmax = aTrimmedCurve->LastParameter();
aCircle = Handle(Geom_Circle)::DownCast( aTrimmedCurve );
}
break; break;
} }
// get arguments of closed cone // get arguments of cone
if ( aSurf.GetType() == GeomAbs_Cone ) if ( aSurf.GetType() == GeomAbs_Cone )
{ {
if ( !aSurf.IsUClosed() || !aSurf.IsVClosed() ) aPmin = aUmin;
{ aPmax = aUmax;
return NULL;
}
gp_Cone aCone = aSurf.Cone(); gp_Cone aCone = aSurf.Cone();
gp_Ax2 anAx2 = aCone.Position().Ax2(); gp_Ax2 anAx2 = aCone.Position().Ax2();
@ -516,11 +531,6 @@ Handle(AIS_DiameterDimension) MeasureGUI_DimensionCreateTool::Diameter( const GE
// get arguments of closed torus or cylinder // get arguments of closed torus or cylinder
if ( aSurf.GetType() == GeomAbs_Torus || aSurf.GetType() == GeomAbs_Cylinder ) if ( aSurf.GetType() == GeomAbs_Torus || aSurf.GetType() == GeomAbs_Cylinder )
{ {
if ( !aSurf.IsUClosed() || !aSurf.IsVClosed() )
{
return NULL;
}
Handle(Geom_Surface) aBasisSurface = Handle(Geom_Surface)::DownCast( Handle(Geom_Surface) aBasisSurface = Handle(Geom_Surface)::DownCast(
aSurf.Surface().Surface()->Transformed( aSurf.Trsf() ) ); aSurf.Surface().Surface()->Transformed( aSurf.Trsf() ) );
@ -528,8 +538,8 @@ Handle(AIS_DiameterDimension) MeasureGUI_DimensionCreateTool::Diameter( const GE
if ( aCurve->IsKind( STANDARD_TYPE( Geom_Circle ) ) ) if ( aCurve->IsKind( STANDARD_TYPE( Geom_Circle ) ) )
{ {
aPmin = aSurf.FirstUParameter(); aPmin = aUmin;
aPmax = aSurf.LastUParameter(); aPmax = aUmax;
aCircle = Handle(Geom_Circle)::DownCast( aCurve ); aCircle = Handle(Geom_Circle)::DownCast( aCurve );
} }
else if ( aCurve->IsKind( STANDARD_TYPE( Geom_TrimmedCurve ) ) ) else if ( aCurve->IsKind( STANDARD_TYPE( Geom_TrimmedCurve ) ) )