2014-02-18 12:44:41 +06:00
// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
2005-12-05 21:23:52 +05:00
//
2012-08-09 13:58:02 +06:00
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
2005-12-05 21:23:52 +05:00
//
2012-08-09 13:58:02 +06:00
// 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
2014-02-18 12:44:41 +06:00
// version 2.1 of the License, or (at your option) any later version.
2009-02-13 17:16:39 +05:00
//
2012-08-09 13:58:02 +06:00
// 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.
2009-02-13 17:16:39 +05:00
//
2012-08-09 13:58:02 +06:00
// 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
2009-02-13 17:16:39 +05:00
//
2012-08-09 13:58:02 +06:00
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
2005-12-05 21:23:52 +05:00
//
2012-08-09 13:58:02 +06:00
2005-08-11 10:43:57 +06:00
# include <Standard_Stream.hxx>
# include <GEOMImpl_ArcDriver.hxx>
# include <GEOMImpl_IArc.hxx>
# include <GEOMImpl_Types.hxx>
# include <GEOM_Function.hxx>
2004-12-01 15:39:14 +05:00
# include <BRepBuilderAPI_MakeEdge.hxx>
# include <BRep_Tool.hxx>
# include <TopoDS.hxx>
# include <TopoDS_Shape.hxx>
# include <TopoDS_Edge.hxx>
# include <TopoDS_Vertex.hxx>
# include <TopAbs.hxx>
# include <TopExp.hxx>
# include <GC_MakeArcOfCircle.hxx>
2008-03-07 12:45:34 +05:00
# include <GC_MakeCircle.hxx>
2009-02-13 17:16:39 +05:00
# include <GC_MakeArcOfEllipse.hxx>
# include <GC_MakeEllipse.hxx>
2004-12-01 15:39:14 +05:00
# include <Standard_ConstructionError.hxx>
# include <Precision.hxx>
# include <gp_Pnt.hxx>
# include <gp_Vec.hxx>
2008-03-07 12:45:34 +05:00
# include <gp_Circ.hxx>
2009-02-13 17:16:39 +05:00
# include <gp_Elips.hxx>
2008-03-07 12:45:34 +05:00
# include <Geom_Circle.hxx>
2009-02-13 17:16:39 +05:00
# include <Geom_Ellipse.hxx>
2008-03-07 12:45:34 +05:00
# include "utilities.h"
2004-12-01 15:39:14 +05:00
//=======================================================================
//function : GetID
//purpose :
//=======================================================================
const Standard_GUID & GEOMImpl_ArcDriver : : GetID ( )
{
static Standard_GUID aArcDriver ( " FF1BBB35-5D14-4df2-980B-3A668264EA16 " ) ;
return aArcDriver ;
}
//=======================================================================
//function : GEOMImpl_ArcDriver
//purpose :
//=======================================================================
GEOMImpl_ArcDriver : : GEOMImpl_ArcDriver ( )
{
}
//=======================================================================
//function : Execute
//purpose :
//=======================================================================
Standard_Integer GEOMImpl_ArcDriver : : Execute ( TFunction_Logbook & log ) const
{
if ( Label ( ) . IsNull ( ) ) return 0 ;
Handle ( GEOM_Function ) aFunction = GEOM_Function : : GetFunction ( Label ( ) ) ;
GEOMImpl_IArc aCI ( aFunction ) ;
Standard_Integer aType = aFunction - > GetType ( ) ;
TopoDS_Shape aShape ;
2009-02-13 17:16:39 +05:00
if ( ( aType = = CIRC_ARC_THREE_PNT ) | | ( aType = = CIRC_ARC_CENTER ) | | ( aType = = ELLIPSE_ARC_CENTER_TWO_PNT ) )
2008-03-07 12:45:34 +05:00
{
2004-12-01 15:39:14 +05:00
Handle ( GEOM_Function ) aRefPoint1 = aCI . GetPoint1 ( ) ;
Handle ( GEOM_Function ) aRefPoint2 = aCI . GetPoint2 ( ) ;
Handle ( GEOM_Function ) aRefPoint3 = aCI . GetPoint3 ( ) ;
2008-03-07 12:45:34 +05:00
2004-12-01 15:39:14 +05:00
TopoDS_Shape aShapePnt1 = aRefPoint1 - > GetValue ( ) ;
TopoDS_Shape aShapePnt2 = aRefPoint2 - > GetValue ( ) ;
TopoDS_Shape aShapePnt3 = aRefPoint3 - > GetValue ( ) ;
2008-03-07 12:45:34 +05:00
2004-12-01 15:39:14 +05:00
if ( aShapePnt1 . ShapeType ( ) = = TopAbs_VERTEX & &
aShapePnt2 . ShapeType ( ) = = TopAbs_VERTEX & &
2008-03-07 12:45:34 +05:00
aShapePnt3 . ShapeType ( ) = = TopAbs_VERTEX )
{
2004-12-01 15:39:14 +05:00
gp_Pnt aP1 = BRep_Tool : : Pnt ( TopoDS : : Vertex ( aShapePnt1 ) ) ;
gp_Pnt aP2 = BRep_Tool : : Pnt ( TopoDS : : Vertex ( aShapePnt2 ) ) ;
gp_Pnt aP3 = BRep_Tool : : Pnt ( TopoDS : : Vertex ( aShapePnt3 ) ) ;
2008-03-07 12:45:34 +05:00
2004-12-01 15:39:14 +05:00
if ( aP1 . Distance ( aP2 ) < gp : : Resolution ( ) | |
aP1 . Distance ( aP3 ) < gp : : Resolution ( ) | |
aP2 . Distance ( aP3 ) < gp : : Resolution ( ) )
Standard_ConstructionError : : Raise ( " Arc creation aborted: coincident points given " ) ;
2008-03-07 12:45:34 +05:00
2004-12-01 15:39:14 +05:00
if ( gp_Vec ( aP1 , aP2 ) . IsParallel ( gp_Vec ( aP1 , aP3 ) , Precision : : Angular ( ) ) )
Standard_ConstructionError : : Raise ( " Arc creation aborted: points lay on one line " ) ;
2008-03-07 12:45:34 +05:00
if ( aType = = CIRC_ARC_THREE_PNT )
{
GC_MakeArcOfCircle arc ( aP1 , aP2 , aP3 ) ;
aShape = BRepBuilderAPI_MakeEdge ( arc ) . Edge ( ) ;
2009-02-13 17:16:39 +05:00
} else if ( aType = = CIRC_ARC_CENTER ) { // CIRC_ARC_CENTER
2008-03-07 12:45:34 +05:00
Standard_Boolean sense = aCI . GetSense ( ) ;
Standard_Real aRad = aP1 . Distance ( aP2 ) ;
gp_Vec aV1 ( aP1 , aP2 ) ;
gp_Vec aV2 ( aP1 , aP3 ) ;
gp_Vec aN = aV1 ^ aV2 ;
if ( sense )
aN = - aN ;
GC_MakeCircle circ ( aP1 , aN , aRad ) ;
Handle ( Geom_Circle ) aGeomCirc = circ . Value ( ) ;
GC_MakeArcOfCircle arc ( aGeomCirc - > Circ ( ) , aP2 , aP3 , Standard_True ) ;
aShape = BRepBuilderAPI_MakeEdge ( arc ) . Edge ( ) ;
2009-02-13 17:16:39 +05:00
} else if ( aType = = ELLIPSE_ARC_CENTER_TWO_PNT ) { // ELLIPSE_ARC_CENTER_TWO_PNT
2012-08-09 13:58:02 +06:00
if ( aP1 . Distance ( aP2 ) < = aP1 . Distance ( aP3 ) ) {
// Standard_ConstructionError::Raise("Arc creation aborted: the distance from Center Point to Point 1 needs to be bigger than the distance from Center Point to Point 2");
gp_Pnt aTmpP = aP2 ;
aP2 = aP3 ;
aP3 = aTmpP ;
}
GC_MakeEllipse ellipse ( aP2 , aP3 , aP1 ) ;
Handle ( Geom_Ellipse ) aGeomEllipse = ellipse . Value ( ) ;
// gp_Vec aV1 (aP1, aP2);
// gp_Vec aV2 (aP1, aP3);
//
// double alpha = fabs(aV1.Angle(aV2));
GC_MakeArcOfEllipse arc ( aGeomEllipse - > Elips ( ) , aP2 , aP3 , Standard_True ) ;
aShape = BRepBuilderAPI_MakeEdge ( arc ) . Edge ( ) ;
2008-03-07 12:45:34 +05:00
}
2004-12-01 15:39:14 +05:00
}
2009-02-13 17:16:39 +05:00
}
else {
2004-12-01 15:39:14 +05:00
}
if ( aShape . IsNull ( ) ) return 0 ;
aFunction - > SetValue ( aShape ) ;
log . SetTouched ( Label ( ) ) ;
2008-03-07 12:45:34 +05:00
return 1 ;
2004-12-01 15:39:14 +05:00
}
2013-06-17 18:44:32 +06:00
//================================================================================
/*!
* \ brief Returns a name of creation operation and names and values of creation parameters
*/
//================================================================================
bool GEOMImpl_ArcDriver : :
GetCreationInformation ( std : : string & theOperationName ,
std : : vector < GEOM_Param > & theParams )
2004-12-01 15:39:14 +05:00
{
2013-06-17 18:44:32 +06:00
if ( Label ( ) . IsNull ( ) ) return 0 ;
Handle ( GEOM_Function ) function = GEOM_Function : : GetFunction ( Label ( ) ) ;
GEOMImpl_IArc aCI ( function ) ;
Standard_Integer aType = function - > GetType ( ) ;
theOperationName = " ARC " ;
switch ( aType ) {
case CIRC_ARC_THREE_PNT :
AddParam ( theParams , " Point 1 " , aCI . GetPoint1 ( ) ) ;
AddParam ( theParams , " Point 2 " , aCI . GetPoint2 ( ) ) ;
AddParam ( theParams , " Point 3 " , aCI . GetPoint3 ( ) ) ;
break ;
case CIRC_ARC_CENTER :
AddParam ( theParams , " Center Point " , aCI . GetPoint1 ( ) ) ;
AddParam ( theParams , " Point Start " , aCI . GetPoint2 ( ) ) ;
AddParam ( theParams , " Point End " , aCI . GetPoint3 ( ) ) ;
AddParam ( theParams , " Reverse " , aCI . GetSense ( ) ) ;
break ;
case ELLIPSE_ARC_CENTER_TWO_PNT :
AddParam ( theParams , " Center Point " , aCI . GetPoint1 ( ) ) ;
AddParam ( theParams , " Point 1 " , aCI . GetPoint2 ( ) ) ;
AddParam ( theParams , " Point 2 " , aCI . GetPoint3 ( ) ) ;
break ;
default :
return false ;
}
return true ;
2004-12-01 15:39:14 +05:00
}
2013-06-17 18:44:32 +06:00
IMPLEMENT_STANDARD_HANDLE ( GEOMImpl_ArcDriver , GEOM_BaseDriver ) ;
2004-12-01 15:39:14 +05:00
2013-06-17 18:44:32 +06:00
IMPLEMENT_STANDARD_RTTIEXT ( GEOMImpl_ArcDriver , GEOM_BaseDriver ) ;