X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FGEOMImpl%2FGEOMImpl_SplineDriver.cxx;h=3865908ee541575d650cccbc9d28c480a7321497;hb=ed87a1f7c81ec39992aff1f463d73dc81e5791e0;hp=a94f0a2797182fd96d403d702d6bb586bb8ef439;hpb=465e84c52edb243fa36d581abc659b1c97156c64;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_SplineDriver.cxx b/src/GEOMImpl/GEOMImpl_SplineDriver.cxx index a94f0a279..3865908ee 100644 --- a/src/GEOMImpl/GEOMImpl_SplineDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_SplineDriver.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 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 @@ -6,7 +6,7 @@ // 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 -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,14 +18,16 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// -#include +#include "GEOMImpl_SplineDriver.hxx" -#include -#include +#include "GEOMImpl_ISpline.hxx" +#include "GEOMImpl_Types.hxx" +#include "GEOMImpl_ICurveParametric.hxx" -#include -#include +#include "GEOM_Function.hxx" +#include "GEOMUtils.hxx" #include #include @@ -39,7 +41,6 @@ #include #include -//#include #include #include @@ -49,8 +50,6 @@ #include #include -#include - #include //======================================================================= @@ -111,9 +110,9 @@ Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const if (useCoords) { int anArrayLength = aCoordsArray->Length(); for (int i = 0, j = 1; i <= (anArrayLength-3); i += 3) { - gp_Pnt aPnt = gp_Pnt(aCoordsArray->Value(i+1), aCoordsArray->Value(i+2), aCoordsArray->Value(i+3)); - points.SetValue(j, aPnt); - j++; + gp_Pnt aPnt = gp_Pnt(aCoordsArray->Value(i+1), aCoordsArray->Value(i+2), aCoordsArray->Value(i+3)); + points.SetValue(j, aPnt); + j++; } } @@ -122,22 +121,22 @@ Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const if (aType == SPLINE_BEZIER && aCI.GetIsClosed()) { TopoDS_Vertex aV1; if (useCoords) { - aV1 = BRepBuilderAPI_MakeVertex(points.Value(1)); + aV1 = BRepBuilderAPI_MakeVertex(points.Value(1)); } else { - Handle(GEOM_Function) aFPoint = Handle(GEOM_Function)::DownCast(aPoints->Value(1)); - TopoDS_Shape aFirstPnt = aFPoint->GetValue(); - aV1 = TopoDS::Vertex(aFirstPnt); + Handle(GEOM_Function) aFPoint = Handle(GEOM_Function)::DownCast(aPoints->Value(1)); + TopoDS_Shape aFirstPnt = aFPoint->GetValue(); + aV1 = TopoDS::Vertex(aFirstPnt); } TopoDS_Vertex aV2; if (useCoords) { - aV2 = BRepBuilderAPI_MakeVertex(points.Value(aLen)); + aV2 = BRepBuilderAPI_MakeVertex(points.Value(aLen)); } else { - Handle(GEOM_Function) aLPoint = Handle(GEOM_Function)::DownCast(aPoints->Value(aLen)); - TopoDS_Shape aLastPnt = aLPoint->GetValue(); - aV2 = TopoDS::Vertex(aLastPnt); + Handle(GEOM_Function) aLPoint = Handle(GEOM_Function)::DownCast(aPoints->Value(aLen)); + TopoDS_Shape aLastPnt = aLPoint->GetValue(); + aV2 = TopoDS::Vertex(aLastPnt); } if (!aV1.IsNull() && !aV2.IsNull() && !aV1.IsSame(aV2)) { @@ -153,7 +152,7 @@ Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const for (ind = 1; ind <= aLen; ind++) { gp_Pnt aP; if (useCoords) { - aP = points.Value(ind); + aP = points.Value(ind); if (!isSeveral && ind > 1) { if (aP.Distance(aPrevP) > Precision::Confusion()) { isSeveral = Standard_True; @@ -163,18 +162,18 @@ Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const aPrevP = aP; } else { - Handle(GEOM_Function) aRefPoint = Handle(GEOM_Function)::DownCast(aPoints->Value(ind)); - TopoDS_Shape aShapePnt = aRefPoint->GetValue(); - if (aShapePnt.ShapeType() == TopAbs_VERTEX) { - aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); - if (!isSeveral && ind > 1) { - if (aP.Distance(aPrevP) > Precision::Confusion()) { - isSeveral = Standard_True; - } - } - CurvePoints.SetValue(ind, aP); - aPrevP = aP; - } + Handle(GEOM_Function) aRefPoint = Handle(GEOM_Function)::DownCast(aPoints->Value(ind)); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + if (aShapePnt.ShapeType() == TopAbs_VERTEX) { + aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + if (!isSeveral && ind > 1) { + if (aP.Distance(aPrevP) > Precision::Confusion()) { + isSeveral = Standard_True; + } + } + CurvePoints.SetValue(ind, aP); + aPrevP = aP; + } } } @@ -241,8 +240,9 @@ Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aVec1Sh = aVec1Ref->GetValue(); TopoDS_Shape aVec2Sh = aVec2Ref->GetValue(); - gp_Vec aV1 = GEOMUtils::GetVector(aVec1Sh); - gp_Vec aV2 = GEOMUtils::GetVector(aVec2Sh); + // take orientation of edge into account to avoid regressions, as it was implemented so + gp_Vec aV1 = GEOMUtils::GetVector(aVec1Sh, Standard_True); + gp_Vec aV2 = GEOMUtils::GetVector(aVec2Sh, Standard_True); GBC.Load(aV1, aV2, /*Scale*/Standard_True); } @@ -266,45 +266,72 @@ Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const return 1; } +//================================================================================ +/*! + * \brief Returns a name of creation operation and names and values of creation parameters + */ +//================================================================================ -//======================================================================= -//function : GEOMImpl_SplineDriver_Type_ -//purpose : -//======================================================================= -Standard_EXPORT Handle_Standard_Type& GEOMImpl_SplineDriver_Type_() +bool GEOMImpl_SplineDriver:: +GetCreationInformation(std::string& theOperationName, + std::vector& theParams) { - - static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); - if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); - static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); - static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); - if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); - - - static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; - static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_SplineDriver", - sizeof(GEOMImpl_SplineDriver), - 1, - (Standard_Address)_Ancestors, - (Standard_Address)NULL); - - return _aType; -} - -//======================================================================= -//function : DownCast -//purpose : -//======================================================================= -const Handle(GEOMImpl_SplineDriver) Handle(GEOMImpl_SplineDriver)::DownCast(const Handle(Standard_Transient)& AnObject) -{ - Handle(GEOMImpl_SplineDriver) _anOtherObject; - - if (!AnObject.IsNull()) { - if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_SplineDriver))) { - _anOtherObject = Handle(GEOMImpl_SplineDriver)((Handle(GEOMImpl_SplineDriver)&)AnObject); - } + if (Label().IsNull()) return 0; + Handle(GEOM_Function) function = GEOM_Function::GetFunction(Label()); + + GEOMImpl_ISpline aCI( function ); + GEOMImpl_ICurveParametric aPI( function ); + Standard_Integer aType = function->GetType(); + + theOperationName = "CURVE"; + + switch ( aType ) { + case SPLINE_BEZIER: + case SPLINE_INTERPOLATION: + case SPLINE_INTERPOL_TANGENTS: + + AddParam( theParams, "Type", ( aType == SPLINE_BEZIER ? "Bezier" : "Interpolation")); + + if ( aPI.HasData() ) + { + AddParam( theParams, "X(t) equation", aPI.GetExprX() ); + AddParam( theParams, "Y(t) equation", aPI.GetExprY() ); + AddParam( theParams, "Z(t) equation", aPI.GetExprZ() ); + AddParam( theParams, "Min t", aPI.GetParamMin() ); + AddParam( theParams, "Max t", aPI.GetParamMax() ); + if ( aPI.GetParamNbStep() ) + AddParam( theParams, "Number of steps", aPI.GetParamNbStep() ); + else + AddParam( theParams, "t step", aPI.GetParamStep() ); + } + else + { + if ( aCI.GetConstructorType() == COORD_CONSTRUCTOR ) + { + Handle(TColStd_HArray1OfReal) coords = aCI.GetCoordinates(); + GEOM_Param& pntParam = AddParam( theParams, "Points"); + pntParam << ( coords->Length() ) / 3 << " points: "; + for ( int i = coords->Lower(), nb = coords->Upper(); i <= nb; ) + pntParam << "( " << coords->Value( i++ ) + << ", " << coords->Value( i++ ) + << ", " << coords->Value( i++ ) << " ) "; + } + else + { + AddParam( theParams, "Points", aCI.GetPoints() ); + } + Handle(GEOM_Function) v1 = aCI.GetFirstVector(); + Handle(GEOM_Function) v2 = aCI.GetLastVector(); + if ( !v1.IsNull() ) AddParam( theParams, "First tangent vector", v1 ); + if ( !v2.IsNull() ) AddParam( theParams, "Last tangent vector", v2 ); + } + break; + default: + return false; } - return _anOtherObject ; + return true; } + +IMPLEMENT_STANDARD_HANDLE (GEOMImpl_SplineDriver,GEOM_BaseDriver); +IMPLEMENT_STANDARD_RTTIEXT (GEOMImpl_SplineDriver,GEOM_BaseDriver);