X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_ProjectionDriver.cxx;h=57d8422425912ad1194b4a15c270a8fcf92bee0f;hb=31b91717e01915431d5658a7054af18a7b7044d5;hp=0c34bc8c26570c689a3dc37fbcb9bb5dc3b0b483;hpb=ee311dbb3223d7d71d39f542ae251fc8c0f55c4f;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx b/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx index 0c34bc8c2..57d842242 100644 --- a/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ProjectionDriver.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -33,6 +33,8 @@ #include #include +#include +#include #include #include #include @@ -91,7 +93,7 @@ GEOMImpl_ProjectionDriver::GEOMImpl_ProjectionDriver() //function : Execute //purpose : //======================================================================= -Standard_Integer GEOMImpl_ProjectionDriver::Execute(TFunction_Logbook& log) const +Standard_Integer GEOMImpl_ProjectionDriver::Execute(LOGBOOK& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); @@ -245,7 +247,11 @@ Standard_Integer GEOMImpl_ProjectionDriver::Execute(TFunction_Logbook& log) cons if (aShape.IsNull()) return 0; aFunction->SetValue(aShape); - log.SetTouched(Label()); +#if OCC_VERSION_MAJOR < 7 + log.SetTouched(Label()); +#else + log->SetTouched(Label()); +#endif } else if (aType == PROJECTION_ON_WIRE) { // Perform projection of point on a wire or an edge. GEOMImpl_IProjection aProj (aFunction); @@ -428,10 +434,11 @@ Standard_Integer GEOMImpl_ProjectionDriver::Execute(TFunction_Logbook& log) cons } // Get the face. - const TopAbs_ShapeEnum aType = aShape.ShapeType(); - const Standard_Real aRadius = aProj.GetRadius(); - const Standard_Real aStartAngle = aProj.GetStartAngle(); - const Standard_Real aLengthAngle = aProj.GetAngleLength(); + const TopAbs_ShapeEnum aType = aShape.ShapeType(); + const Standard_Real aRadius = aProj.GetRadius(); + const Standard_Real aStartAngle = aProj.GetStartAngle(); + const Standard_Real aLengthAngle = aProj.GetAngleLength(); + const Standard_Real aRotationAngle = aProj.GetAngleRotation(); if (aType != TopAbs_WIRE && aType != TopAbs_FACE) { return 0; @@ -441,8 +448,8 @@ Standard_Integer GEOMImpl_ProjectionDriver::Execute(TFunction_Logbook& log) cons return 0; } - TopoDS_Shape aProjShape = - projectOnCylinder(aShape, aRadius, aStartAngle, aLengthAngle); + TopoDS_Shape aProjShape = projectOnCylinder + (aShape, aRadius, aStartAngle, aLengthAngle, aRotationAngle); if (aProjShape.IsNull()) { return 0; @@ -504,6 +511,8 @@ GetCreationInformation(std::string& theOperationName, AddParam(theParams, "Length angle", aLengthAngle); } + AddParam(theParams, "Rotation angle", aProj.GetAngleRotation()); + break; } default: @@ -523,7 +532,8 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder (const TopoDS_Shape &theShape, const Standard_Real theRadius, const Standard_Real theStartAngle, - const Standard_Real theAngleLength) const + const Standard_Real theAngleLength, + const Standard_Real theAngleRotation) const { TopoDS_Shape aResult; @@ -596,8 +606,6 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder // Compute 2d translation transformation. TopoDS_Wire anOuterWire = BRepTools::OuterWire(aFace); - Standard_Real aU[2]; - Standard_Real aV[2]; BRepTools_WireExplorer aOWExp(anOuterWire, aFace); if (!aOWExp.More()) { @@ -605,21 +613,63 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder return aResult; } - // Compute anisotropic transformation from a face's 2d space - // to cylinder's 2d space. - BRepTools::UVBounds(aFace, anOuterWire, aU[0], aU[1], aV[0], aV[1]); - + // Rotate 2D presentation of face. TopoDS_Vertex aFirstVertex = aOWExp.CurrentVertex(); TopoDS_Edge aFirstEdge = aOWExp.Current(); gp_Pnt aPnt = BRep_Tool::Pnt(aFirstVertex); BRepAdaptor_Curve2d anAdaptorCurve(aFirstEdge, aFace); Standard_Real aParam = BRep_Tool::Parameter(aFirstVertex, aFirstEdge, aFace); - gp_Pnt2d aPntUV = anAdaptorCurve.Value(aParam); + gp_Pnt2d aPntUV; + gp_Vec2d aVecUV; + gp_Vec2d aVecU0(1., 0); + + anAdaptorCurve.D1(aParam, aPntUV, aVecUV); + + if (aVecUV.Magnitude() <= gp::Resolution()) { + return aResult; + } + + if (aFirstEdge.Orientation() == TopAbs_REVERSED) { + aVecUV.Reverse(); + } + + const Standard_Real anAngle = aVecUV.Angle(aVecU0) + theAngleRotation; + const Standard_Boolean isToRotate = Abs(anAngle) > Precision::Angular(); + gp_Trsf2d aRotTrsf; + Bnd_Box2d aUVBox; + Standard_Real aPar[2]; + if (isToRotate) { + aRotTrsf.SetRotation(aPntUV, anAngle); + } + + for (; aOWExp.More(); aOWExp.Next()) { + TopoDS_Edge anEdge = aOWExp.Current(); + Handle(Geom2d_Curve) aCurve = + BRep_Tool::CurveOnSurface(anEdge, aFace, aPar[0], aPar[1]); + + if (aCurve.IsNull()) { + continue; + } + + if (isToRotate) { + aCurve = Handle(Geom2d_Curve)::DownCast(aCurve->Transformed(aRotTrsf)); + } + + BndLib_Add2dCurve::Add(aCurve, aPar[0], aPar[1], 0., aUVBox); + } + + Standard_Real aU[2]; + Standard_Real aV[2]; + + aUVBox.Get(aU[0], aV[0], aU[1], aV[1]); + + // Compute anisotropic transformation from a face's 2d space + // to cylinder's 2d space. GEOMUtils::Trsf2d aTrsf2d (1./theRadius, 0., theStartAngle - aU[0]/theRadius, - 0., 1., aPnt.Z() - 0.5*(aV[1] - aV[0]) - aPntUV.Y()); + 0., 1., aPnt.Z() - aPntUV.Y()); // Compute scaling trsf. const Standard_Boolean isToScale = theAngleLength >= Precision::Angular(); @@ -640,7 +690,6 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder new Geom_CylindricalSurface(gp_Ax3(), theRadius); GeomAdaptor_Surface aGACyl(aCylinder); TopExp_Explorer anExp(aFace, TopAbs_WIRE); - Standard_Real aPar[2]; TopTools_ListOfShape aWires; Standard_Real aUResol = aGACyl.UResolution(Precision::Confusion()); Standard_Real aVResol = aGACyl.VResolution(Precision::Confusion()); @@ -659,8 +708,16 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder continue; } + if (isToRotate) { + aCurve = Handle(Geom2d_Curve)::DownCast(aCurve->Transformed(aRotTrsf)); + } + // Transform the curve to cylinder's parametric space. +#if OCC_VERSION_MAJOR < 7 GEOMUtils::Handle(HTrsfCurve2d) aTrsfCurve = +#else + Handle(GEOMUtils::HTrsfCurve2d) aTrsfCurve = +#endif new GEOMUtils::HTrsfCurve2d(aCurve, aPar[0], aPar[1], aTrsf2d); Approx_Curve2d aConv (aTrsfCurve, aPar[0], aPar[1], aUResol, aVResol, GeomAbs_C1, @@ -750,5 +807,4 @@ TopoDS_Shape GEOMImpl_ProjectionDriver::projectOnCylinder return aResult; } -IMPLEMENT_STANDARD_HANDLE (GEOMImpl_ProjectionDriver,GEOM_BaseDriver); -IMPLEMENT_STANDARD_RTTIEXT (GEOMImpl_ProjectionDriver,GEOM_BaseDriver); +OCCT_IMPLEMENT_STANDARD_RTTIEXT (GEOMImpl_ProjectionDriver,GEOM_BaseDriver);