X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_ITransformOperations.cxx;h=012d9982d1d816a748d65db1391ea584d972a3ab;hb=ed87a1f7c81ec39992aff1f463d73dc81e5791e0;hp=7d6c5c792fad185f1696e5698fa6590e0c982202;hpb=e2dcf4323c7d7c36e8e1a4fda4dd6cf86c99be81;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx index 7d6c5c792..012d9982d 100644 --- a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx @@ -1,21 +1,32 @@ +// 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 +// +// 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, 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 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + #include #include -#include "utilities.h" -#include -#include - -#include -#include -#include -#include - -#include -#include - #include #include +#include #include #include #include @@ -23,6 +34,7 @@ #include #include +#include #include #include #include @@ -30,6 +42,33 @@ #include +#include +#include + +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC //============================================================================= @@ -90,6 +129,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateTwoPoints //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Translation driver failed"); return NULL; @@ -102,7 +142,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateTwoPoints } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.TranslateTwoPoints(" + GEOM::TPythonDump(aFunction) << "geompy.TranslateTwoPoints(" << theObject << ", " << thePoint1 << ", " << thePoint2 << ")"; SetErrorCode(OK); @@ -140,6 +180,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateDXDYDZ //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Translation driver failed"); return NULL; @@ -152,7 +193,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateDXDYDZ } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.TranslateDXDYDZ(" + GEOM::TPythonDump(aFunction) << "geompy.TranslateDXDYDZ(" << theObject << ", " << theX << ", " << theY << ", " << theZ << ")"; SetErrorCode(OK); @@ -193,6 +234,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateTwoPointsCopy //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Translation driver failed"); return NULL; @@ -245,6 +287,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateDXDYDZCopy //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Translation driver failed"); return NULL; @@ -297,6 +340,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateVector //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Translation driver failed"); return NULL; @@ -309,13 +353,12 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateVector } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.TranslateVector(" + GEOM::TPythonDump(aFunction) << "geompy.TranslateVector(" << theObject << ", " << theVector << ")"; SetErrorCode(OK); return theObject; } - //============================================================================= /*! * TranslateVectorCopy @@ -348,6 +391,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateVectorCopy //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Translation driver failed"); return NULL; @@ -367,6 +411,71 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateVectorCopy return aCopy; } +//============================================================================= +/*! + * TranslateVectorDistance + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateVectorDistance + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theVector, double theDistance, bool theCopy) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theVector.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + Handle(GEOM_Object) aCopy; //Add a new Copy object + Handle(GEOM_Function) aFunction; + + //Add a translate function + if (theCopy) { + aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + aFunction = aCopy->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_VECTOR_DISTANCE); + } + else { + aFunction = theObject->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_VECTOR_DISTANCE); + } + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; + + GEOMImpl_ITranslate aTI(aFunction); + aTI.SetVector(theVector->GetLastFunction()); + aTI.SetDistance(theDistance); +// aTI.SetShape(theObject->GetValue()); + aTI.SetOriginal(aLastFunction); + + //Compute the translation + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Translation driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + if (theCopy) { + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeTranslationVectorDistance(" + << theObject << ", " << theVector << ", " << theDistance << ")"; + SetErrorCode(OK); + return aCopy; + } + + GEOM::TPythonDump(aFunction) << "geompy.TranslateVectorDistance(" + << theObject << ", " << theVector << ", " << theDistance << ", " << theCopy << ")"; + SetErrorCode(OK); + return theObject; +} + //============================================================================= /*! * Translate1D @@ -378,7 +487,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate1D { SetErrorCode(KO); - if (theObject.IsNull() || theVector.IsNull()) return NULL; + if (theObject.IsNull()) return NULL; Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved @@ -393,14 +502,16 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate1D //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; - GEOMImpl_ITranslate aTI(aFunction); - aTI.SetVector(theVector->GetLastFunction()); + GEOMImpl_ITranslate aTI (aFunction); aTI.SetOriginal(aLastFunction); + if (!theVector.IsNull()) + aTI.SetVector(theVector->GetLastFunction()); aTI.SetStep1(theStep); aTI.SetNbIter1(theNbTimes); //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Translation driver failed"); return NULL; @@ -426,16 +537,16 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate1D */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Object) theObject, - Handle(GEOM_Object) theVector, - double theStep1, - Standard_Integer theNbTimes1, - Handle(GEOM_Object) theVector2, - double theStep2, - Standard_Integer theNbTimes2) + Handle(GEOM_Object) theVector, + double theStep1, + Standard_Integer theNbTimes1, + Handle(GEOM_Object) theVector2, + double theStep2, + Standard_Integer theNbTimes2) { SetErrorCode(KO); - if (theObject.IsNull() || theVector.IsNull() || theVector2.IsNull()) return NULL; + if (theObject.IsNull()) return NULL; Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved @@ -450,17 +561,20 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Obje //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; - GEOMImpl_ITranslate aTI(aFunction); - aTI.SetVector(theVector->GetLastFunction()); - aTI.SetVector2(theVector2->GetLastFunction()); + GEOMImpl_ITranslate aTI (aFunction); aTI.SetOriginal(aLastFunction); + if (!theVector.IsNull()) + aTI.SetVector(theVector->GetLastFunction()); aTI.SetStep1(theStep1); aTI.SetNbIter1(theNbTimes1); + if (!theVector2.IsNull()) + aTI.SetVector2(theVector2->GetLastFunction()); aTI.SetStep2(theStep2); aTI.SetNbIter2(theNbTimes2); //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Translation driver failed"); return NULL; @@ -481,6 +595,148 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Obje return aCopy; } +//============================================================================= +/*! + * TranslateShape1D + */ +//============================================================================= +/* +TopoDS_Shape GEOMImpl_ITransformOperations::TranslateShape1D (const TopoDS_Shape& theShape, + GEOMImpl_ITranslate* theTI) +{ + TopoDS_Shape aRes; + + // Vector + Handle(GEOM_Function) aVector = theTI->GetVector(); + if (aVector.IsNull()) { + StdFail_NotDone::Raise("Invalid object is given for vector argument"); + } + TopoDS_Shape aV = aVector->GetValue(); + if (aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) { + StdFail_NotDone::Raise("Invalid object is given for vector argument"); + } + TopoDS_Edge anEdge = TopoDS::Edge(aV); + + gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)); + gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge)); + if (aP1.Distance(aP2) < gp::Resolution()) { + StdFail_NotDone::Raise("Invalid object is given for vector argument"); + } + + // Step and Nb.times + Standard_Real step = theTI->GetStep1(); + Standard_Integer nbtimes = theTI->GetNbIter1(); + + // Make multi-translation + gp_Trsf aTrsf; + gp_Vec aVec; + TopoDS_Compound aCompound; + BRep_Builder B; + B.MakeCompound(aCompound); + + gp_Vec Vec (aP1, aP2); + Vec.Normalize(); + + TopLoc_Location aLocOrig = theShape.Location(); + gp_Trsf aTrsfOrig = aLocOrig.Transformation(); + + for (int i = 0; i < nbtimes; i++) { + aVec = Vec * (i * step); + aTrsf.SetTranslation(aVec); + //NPAL18620: performance problem: multiple locations are accumulated + // in shape and need a great time to process + //BRepBuilderAPI_Transform aTransformation(theShape, aTrsf, Standard_False); + //B.Add(aCompound, aTransformation.Shape()); + TopLoc_Location aLocRes (aTrsf * aTrsfOrig); + B.Add(aCompound, theShape.Located(aLocRes)); + } + aRes = aCompound; + + return aRes; +} +*/ + +//============================================================================= +/*! + * TranslateShape2D + */ +//============================================================================= +/* +TopoDS_Shape GEOMImpl_ITransformOperations::TranslateShape2D (const TopoDS_Shape& theShape, + GEOMImpl_ITranslate* theTI) +{ + TopoDS_Shape aRes; + + // Vectors + Handle(GEOM_Function) aVector1 = theTI->GetVector(); + Handle(GEOM_Function) aVector2 = theTI->GetVector2(); + + if (aVector1.IsNull() || aVector2.IsNull()) { + StdFail_NotDone::Raise("Invalid object is given for vector argument"); + } + + TopoDS_Shape aV1 = aVector1->GetValue(); + TopoDS_Shape aV2 = aVector2->GetValue(); + + if (aV1.IsNull() || aV1.ShapeType() != TopAbs_EDGE || + aV2.IsNull() || aV2.ShapeType() != TopAbs_EDGE) { + StdFail_NotDone::Raise("Invalid object is given for vector argument"); + } + + TopoDS_Edge anEdge1 = TopoDS::Edge(aV1); + TopoDS_Edge anEdge2 = TopoDS::Edge(aV2); + + gp_Pnt aP11 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge1)); + gp_Pnt aP12 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge1)); + gp_Pnt aP21 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge2)); + gp_Pnt aP22 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge2)); + + if (aP11.Distance(aP12) < gp::Resolution() || + aP21.Distance(aP22) < gp::Resolution()) { + StdFail_NotDone::Raise("Invalid object is given for vector argument"); + } + + gp_Vec Vec1 (aP11, aP12); + gp_Vec Vec2 (aP21, aP22); + + Vec1.Normalize(); + Vec2.Normalize(); + + // Step and Nb.times + Standard_Real step1 = theTI->GetStep1(), step2 = theTI->GetStep2(); + Standard_Integer nbtimes1 = theTI->GetNbIter1(), nbtimes2 = theTI->GetNbIter2(); + + // Make multi-translation + gp_Trsf aTrsf; + gp_Vec aVec; + Standard_Real DX, DY, DZ; + TopoDS_Compound aCompound; + BRep_Builder B; + B.MakeCompound(aCompound); + + TopLoc_Location aLocOrig = theShape.Location(); + gp_Trsf aTrsfOrig = aLocOrig.Transformation(); + + for (int i = 0; i < nbtimes1; i++) { + for (int j = 0; j < nbtimes2; j++) { + DX = i * step1 * Vec1.X() + j * step2 * Vec2.X(); + DY = i * step1 * Vec1.Y() + j * step2 * Vec2.Y(); + DZ = i * step1 * Vec1.Z() + j * step2 * Vec2.Z(); + aVec.SetCoord(DX, DY, DZ); + aTrsf.SetTranslation(aVec); + //NPAL18620: performance problem: multiple locations are accumulated + // in shape and need a great time to process + //BRepBuilderAPI_Transform aBRepTransformation(theShape, aTrsf, Standard_False); + //B.Add(aCompound, aBRepTransformation.Shape()); + TopLoc_Location aLocRes (aTrsf * aTrsfOrig); + B.Add(aCompound, theShape.Located(aLocRes)); + } + } + aRes = aCompound; + + return aRes; +} +*/ //============================================================================= /*! @@ -514,6 +770,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPlane //Compute the mirror try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Mirror driver failed"); return NULL; @@ -526,7 +783,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPlane } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.MirrorPlane(" + GEOM::TPythonDump(aFunction) << "geompy.MirrorByPlane(" << theObject << ", " << thePlane << ")"; SetErrorCode(OK); @@ -564,6 +821,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPlaneCopy //Compute the mirror try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Mirror driver failed"); return NULL; @@ -615,6 +873,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPoint //Compute the mirror try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Mirror driver failed"); return NULL; @@ -627,7 +886,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPoint } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.MirrorPoint(" + GEOM::TPythonDump(aFunction) << "geompy.MirrorByPoint(" << theObject << ", " << thePoint << ")"; SetErrorCode(OK); @@ -665,6 +924,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPointCopy //Compute the mirror try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Mirror driver failed"); return NULL; @@ -716,6 +976,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorAxis //Compute the mirror try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Mirror driver failed"); return NULL; @@ -728,7 +989,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorAxis } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.MirrorAxis(" + GEOM::TPythonDump(aFunction) << "geompy.MirrorByAxis(" << theObject << ", " << theAxis << ")"; SetErrorCode(OK); @@ -766,6 +1027,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorAxisCopy //Compute the mirror try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Mirror driver failed"); return NULL; @@ -815,6 +1077,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape //Compute the offset try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Offset driver failed"); return NULL; @@ -827,7 +1090,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.OffsetShape(" + GEOM::TPythonDump(aFunction) << "geompy.Offset(" << theObject << ", " << theOffset << ")"; SetErrorCode(OK); @@ -866,6 +1129,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy //Compute the offset try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Offset driver failed"); return NULL; @@ -886,6 +1150,147 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy } +//============================================================================= +/*! + * ProjectShapeCopy + */ +//============================================================================= +Handle(GEOM_Object) +GEOMImpl_ITransformOperations::ProjectShapeCopy (Handle(GEOM_Object) theSource, + Handle(GEOM_Object) theTarget) +{ + SetErrorCode(KO); + + if (theSource.IsNull() || theTarget.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theSource->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be projected + + Handle(GEOM_Object) aCopy; + + TopoDS_Shape aTarget = theTarget->GetValue(); + if ( aTarget.IsNull() ) return NULL; + if ( aTarget.ShapeType() == TopAbs_EDGE || + aTarget.ShapeType() == TopAbs_WIRE ) + { + // a TPythonDump prevents dumping ProjectPointOnWire(), + // dump of MakeProjection() is done at the end of this function + GEOM::TPythonDump preventDump(aLastFunction, /*append=*/true); + Standard_Integer dummy; + ProjectPointOnWire( theSource, theTarget, aCopy, dummy ); + if ( aCopy.IsNull() || !IsDone() ) + return NULL; + } + else + { + //Add a new Projection object + aCopy = GetEngine()->AddObject(GetDocID(), GEOM_PROJECTION); + + //Add a Projection function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_ProjectionDriver::GetID(), PROJECTION_COPY); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ProjectionDriver::GetID()) return NULL; + + GEOMImpl_IMirror aTI (aFunction); + aTI.SetPlane(theTarget->GetLastFunction()); + aTI.SetOriginal(aLastFunction); + + //Compute the Projection + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Projection driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + } + + //Make a Python command + Handle(GEOM_Function) aFunction = aCopy->GetLastFunction(); + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeProjection(" + << theSource << ", " << theTarget << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * ProjectPointOnWire + */ +//============================================================================= +Standard_Real GEOMImpl_ITransformOperations::ProjectPointOnWire + (Handle(GEOM_Object) thePoint, + Handle(GEOM_Object) theWire, + Handle(GEOM_Object) &thePointOnEdge, + Standard_Integer &theEdgeInWireIndex) +{ + Standard_Real aResult = -1.; + + SetErrorCode(KO); + + if (thePoint.IsNull() || theWire.IsNull()) { + return aResult; + } + + Handle(GEOM_Function) aLastFunction = thePoint->GetLastFunction(); + + if (aLastFunction.IsNull()) { + //There is no function which creates an object to be projected + return aResult; + } + + //Add a new Projection object + thePointOnEdge = GetEngine()->AddObject(GetDocID(), GEOM_PROJECTION); + + //Add a Projection function + Handle(GEOM_Function) aFunction = thePointOnEdge->AddFunction + (GEOMImpl_ProjectionDriver::GetID(), PROJECTION_ON_WIRE); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ProjectionDriver::GetID()) { + return aResult; + } + + GEOMImpl_IProjection aProj (aFunction); + aProj.SetPoint(aLastFunction); + aProj.SetShape(theWire->GetLastFunction()); + + //Compute the Projection + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Projection driver failed"); + return aResult; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return aResult; + } + + aResult = aProj.GetU(); + theEdgeInWireIndex = aProj.GetIndex(); + + + //Make a Python command + GEOM::TPythonDump(aFunction) << "(u, " << thePointOnEdge + << ", EdgeInWireIndex) = geompy.MakeProjectionOnWire(" << thePoint + << ", " << theWire << ")"; + + SetErrorCode(OK); + + return aResult; +} + //============================================================================= /*! * ScaleShape @@ -896,14 +1301,11 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::ScaleShape { SetErrorCode(KO); - if (theObject.IsNull() || thePoint.IsNull()) return NULL; + if (theObject.IsNull()) return NULL; Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be scaled - // Get last functions of the arguments - Handle(GEOM_Function) aPF = thePoint->GetLastFunction(); - //Add a scale function Handle(GEOM_Function) aFunction = theObject->AddFunction(GEOMImpl_ScaleDriver::GetID(), SCALE_SHAPE); @@ -912,13 +1314,20 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::ScaleShape //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ScaleDriver::GetID()) return NULL; + // Set arguments GEOMImpl_IScale aTI (aFunction); aTI.SetShape(anOriginal); - aTI.SetPoint(aPF); aTI.SetFactor(theFactor); + // Set point argument + if (!thePoint.IsNull()) { + Handle(GEOM_Function) aPF = thePoint->GetLastFunction(); + aTI.SetPoint(aPF); + } + //Compute the scale try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Scale driver failed"); return NULL; @@ -931,7 +1340,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::ScaleShape } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.ScaleShape(" + GEOM::TPythonDump(aFunction) << "geompy.Scale(" << theObject << ", " << thePoint << ", " << theFactor << ")"; SetErrorCode(OK); @@ -948,7 +1357,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::ScaleShapeCopy { SetErrorCode(KO); - if (theObject.IsNull() || thePoint.IsNull()) return NULL; + if (theObject.IsNull()) return NULL; Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be scaled @@ -964,13 +1373,20 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::ScaleShapeCopy //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ScaleDriver::GetID()) return NULL; + // Set arguments GEOMImpl_IScale aTI (aFunction); aTI.SetShape(anOriginal); - aTI.SetPoint(thePoint->GetLastFunction()); aTI.SetFactor(theFactor); + // Set point argument + if (!thePoint.IsNull()) { + Handle(GEOM_Function) aPF = thePoint->GetLastFunction(); + aTI.SetPoint(aPF); + } + //Compute the scale try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Scale driver failed"); return NULL; @@ -990,6 +1406,83 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::ScaleShapeCopy return aCopy; } +//============================================================================= +/*! + * ScaleShapeAlongAxes + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::ScaleShapeAlongAxes (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePoint, + double theFactorX, + double theFactorY, + double theFactorZ, + bool doCopy) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); + if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be scaled + + //Add a scale function + Handle(GEOM_Object) aCopy; //Add a new Copy object + Handle(GEOM_Function) aFunction; + if (doCopy) { + aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + aFunction = aCopy->AddFunction(GEOMImpl_ScaleDriver::GetID(), SCALE_SHAPE_AXES_COPY); + } + else { + aFunction = theObject->AddFunction(GEOMImpl_ScaleDriver::GetID(), SCALE_SHAPE_AXES); + } + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ScaleDriver::GetID()) return NULL; + + // Set arguments + GEOMImpl_IScale aTI (aFunction); + aTI.SetShape(anOriginal); + aTI.SetFactorX(theFactorX); + aTI.SetFactorY(theFactorY); + aTI.SetFactorZ(theFactorZ); + + // Set point (optional argument) + if (!thePoint.IsNull()) { + Handle(GEOM_Function) aPF = thePoint->GetLastFunction(); + aTI.SetPoint(aPF); + } + + //Compute the scale + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Scale driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + SetErrorCode(OK); + + //Make a Python command + if (doCopy) { + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeScaleAlongAxes(" + << theObject << ", " << thePoint << ", " + << theFactorX << ", " << theFactorY << ", " << theFactorZ << ")"; + return aCopy; + } + + GEOM::TPythonDump(aFunction) << "geompy.ScaleAlongAxes(" + << theObject << ", " << thePoint << ", " + << theFactorX << ", " << theFactorY << ", " << theFactorZ << ")"; + return theObject; +} + //============================================================================= /*! * PositionShape @@ -1000,30 +1493,32 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShape { SetErrorCode(KO); - if (theObject.IsNull() || theStartLCS.IsNull() || theEndLCS.IsNull()) return NULL; + if (theObject.IsNull() || theEndLCS.IsNull()) return NULL; Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be set in position - // Get last functions of the arguments - Handle(GEOM_Function) aStartLCS = theStartLCS->GetLastFunction(); - Handle(GEOM_Function) aEndLCS = theEndLCS->GetLastFunction(); - //Add a Position function + Standard_Integer aType = POSITION_SHAPE; + if (theStartLCS.IsNull()) aType = POSITION_SHAPE_FROM_GLOBAL; + Handle(GEOM_Function) aFunction = - theObject->AddFunction(GEOMImpl_PositionDriver::GetID(), POSITION_SHAPE); + theObject->AddFunction(GEOMImpl_PositionDriver::GetID(), aType); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_PositionDriver::GetID()) return NULL; + //Set operation arguments GEOMImpl_IPosition aTI (aFunction); aTI.SetShape(anOriginal); - aTI.SetStartLCS(aStartLCS); - aTI.SetEndLCS(aEndLCS); + aTI.SetEndLCS(theEndLCS->GetLastFunction()); + if (!theStartLCS.IsNull()) + aTI.SetStartLCS(theObject == theStartLCS ? anOriginal : theStartLCS->GetLastFunction()); //Compute the Position try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Position driver failed"); return NULL; @@ -1036,7 +1531,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShape } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.PositionShape(" + GEOM::TPythonDump(aFunction) << "geompy.Position(" << theObject << ", " << theStartLCS << ", " << theEndLCS << ")"; SetErrorCode(OK); @@ -1053,7 +1548,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShapeCopy { SetErrorCode(KO); - if (theObject.IsNull() || theStartLCS.IsNull() || theEndLCS.IsNull()) return NULL; + if (theObject.IsNull() || theEndLCS.IsNull()) return NULL; Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be set in position @@ -1062,8 +1557,11 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShapeCopy Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); //Add a position function + Standard_Integer aType = POSITION_SHAPE_COPY; + if (theStartLCS.IsNull()) aType = POSITION_SHAPE_FROM_GLOBAL_COPY; + Handle(GEOM_Function) aFunction = - aCopy->AddFunction(GEOMImpl_PositionDriver::GetID(), POSITION_SHAPE_COPY); + aCopy->AddFunction(GEOMImpl_PositionDriver::GetID(), aType); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly @@ -1071,11 +1569,13 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShapeCopy GEOMImpl_IPosition aTI (aFunction); aTI.SetShape(anOriginal); - aTI.SetStartLCS(theStartLCS->GetLastFunction()); aTI.SetEndLCS(theEndLCS->GetLastFunction()); + if (!theStartLCS.IsNull()) + aTI.SetStartLCS(theStartLCS->GetLastFunction()); //Compute the position try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Position driver failed"); return NULL; @@ -1097,25 +1597,92 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShapeCopy //============================================================================= /*! - * Rotate + * PositionAlongPath */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate (Handle(GEOM_Object) theObject, - Handle(GEOM_Object) theAxis, - double theAngle) +Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionAlongPath + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePath, + double theDistance, bool theCopy, bool theReverse) { SetErrorCode(KO); - if (theObject.IsNull() || theAxis.IsNull()) return NULL; + if (theObject.IsNull() || thePath.IsNull()) return NULL; - Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); - if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); + if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be set in position - // Get last functions of the arguments - Handle(GEOM_Function) anAF = theAxis->GetLastFunction(); + //Add a position function + Handle(GEOM_Function) aFunction; + Handle(GEOM_Object) aCopy; - //Add a rotate function - aFunction = theObject->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE); + if (theCopy) { + aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + aFunction = aCopy->AddFunction(GEOMImpl_PositionDriver::GetID(), POSITION_ALONG_PATH); + } + else + aFunction = theObject->AddFunction(GEOMImpl_PositionDriver::GetID(), POSITION_ALONG_PATH); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PositionDriver::GetID()) return NULL; + + GEOMImpl_IPosition aTI (aFunction); + aTI.SetShape(anOriginal); + aTI.SetPath(thePath->GetLastFunction()); + aTI.SetDistance(theDistance); + aTI.SetReverse(theReverse); + + //Compute the position + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Position driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + if (theCopy) { + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakePositionAlongPath(" + << theObject << ", " << thePath << ", " << theDistance << ", " << theCopy << ", " << theReverse << ")"; + SetErrorCode(OK); + return aCopy; + } + + GEOM::TPythonDump(aFunction) << "geompy.PositionAlongPath(" + << theObject << ", " << thePath << ", " << theDistance << ", " << theCopy << ", " << theReverse << ")"; + + SetErrorCode(OK); + return theObject; +} + +//============================================================================= +/*! + * Rotate + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis, + double theAngle) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theAxis.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + + // Get last functions of the arguments + Handle(GEOM_Function) anAF = theAxis->GetLastFunction(); + + //Add a rotate function + aFunction = theObject->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE); if (aFunction.IsNull()) return NULL; @@ -1129,6 +1696,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate (Handle(GEOM_Object) t //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Rotate driver failed"); return NULL; @@ -1141,8 +1709,8 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate (Handle(GEOM_Object) t } //Make a Python command - GEOM::TPythonDump(aFunction) << "geompy.TrsfOp.Rotate(" << theObject - << ", " << theAxis << ", " << theAngle * 180.0 / PI << "*math.pi/180.0)"; + GEOM::TPythonDump(aFunction) << "geompy.Rotate(" << theObject + << ", " << theAxis << ", " << theAngle * 180.0 / M_PI << "*math.pi/180.0)"; SetErrorCode(OK); return theObject; @@ -1150,10 +1718,12 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate (Handle(GEOM_Object) t //============================================================================= /*! - * Rotate + * RotateCopy */ //============================================================================= -Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis, double theAngle) +Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis, + double theAngle) { SetErrorCode(KO); @@ -1179,6 +1749,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Objec //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Rotate driver failed"); return NULL; @@ -1192,7 +1763,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Objec //Make a Python command GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeRotation(" << theObject - << ", " << theAxis << ", " << theAngle * 180.0 / PI << "*math.pi/180.0)"; + << ", " << theAxis << ", " << theAngle * 180.0 / M_PI << "*math.pi/180.0)"; SetErrorCode(OK); return aCopy; @@ -1200,7 +1771,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Objec //============================================================================= /*! - * Rotate1D + * Rotate1D (for MultiRotate1DNbTimes) */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) theObject, @@ -1209,7 +1780,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) { SetErrorCode(KO); - if (theObject.IsNull() || theAxis.IsNull()) return NULL; + if (theObject.IsNull()) return NULL; Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated @@ -1221,16 +1792,18 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_1D); if (aFunction.IsNull()) return NULL; - //Check if the function is set correctly + //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; GEOMImpl_IRotate aRI(aFunction); aRI.SetOriginal(aLastFunction); - aRI.SetAxis(theAxis->GetLastFunction()); + if (!theAxis.IsNull()) + aRI.SetAxis(theAxis->GetLastFunction()); aRI.SetNbIter1(theNbTimes); //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Rotate driver failed"); return NULL; @@ -1243,7 +1816,7 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) } //Make a Python command - GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MultiRotate1D(" + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MultiRotate1DNbTimes(" << theObject << ", " << theAxis << ", " << theNbTimes << ")"; SetErrorCode(OK); @@ -1252,19 +1825,78 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) //============================================================================= /*! - * Rotate2D + * Rotate1D (for MultiRotate1DByStep) + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis, + double theAngleStep, + Standard_Integer theNbSteps) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a rotate function + aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_1D_STEP); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; + + //Convert angle into degrees + double anAngleStep = theAngleStep * 180. / M_PI; + + GEOMImpl_IRotate aRI (aFunction); + aRI.SetOriginal(aLastFunction); + if (!theAxis.IsNull()) + aRI.SetAxis(theAxis->GetLastFunction()); + aRI.SetAngle(anAngleStep); + aRI.SetNbIter1(theNbSteps); + + //Compute the translation + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Rotate driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) + << aCopy << " = geompy.MultiRotate1DByStep(" << theObject << ", " + << theAxis << ", " << anAngleStep << "*math.pi/180.0, " << theNbSteps << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * Rotate2D (for MultiRotate2DNbTimes) */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object) theObject, - Handle(GEOM_Object) theAxis, - double theAngle, - Standard_Integer theNbTimes1, - double theStep, - Standard_Integer theNbTimes2) + Handle(GEOM_Object) theAxis, + Standard_Integer theNbObjects, + double theRadialStep, + Standard_Integer theNbSteps) { SetErrorCode(KO); - if (theObject.IsNull() || theAxis.IsNull()) return NULL; + if (theObject.IsNull()) return NULL; Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated @@ -1276,19 +1908,203 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object) aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_2D); if (aFunction.IsNull()) return NULL; - //Check if the function is set correctly + //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; - GEOMImpl_IRotate aRI(aFunction); - aRI.SetAxis(theAxis->GetLastFunction()); + double anAngle = 360. / (double)theNbObjects; + + GEOMImpl_IRotate aRI (aFunction); aRI.SetOriginal(aLastFunction); + if (!theAxis.IsNull()) + aRI.SetAxis(theAxis->GetLastFunction()); + aRI.SetAngle(anAngle); + aRI.SetNbIter1(theNbObjects); + aRI.SetStep(theRadialStep); + aRI.SetNbIter2(theNbSteps); + + //Compute the translation + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Rotate driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MultiRotate2DNbTimes(" + << theObject << ", " << theAxis << ", " << theNbObjects + << ", " << theRadialStep << ", " << theNbSteps << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * Rotate2D (for MultiRotate2DByStep) + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis, + double theAngleStep, + Standard_Integer theNbTimes1, + double theStep, + Standard_Integer theNbTimes2) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a rotate function + aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_2D); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; + + //Convert angle into degrees + double anAngleStep = theAngleStep * 180. / M_PI; + + GEOMImpl_IRotate aRI (aFunction); + aRI.SetOriginal(aLastFunction); + if (!theAxis.IsNull()) + aRI.SetAxis(theAxis->GetLastFunction()); + aRI.SetAngle(anAngleStep); aRI.SetNbIter1(theNbTimes1); - aRI.SetNbIter2(theNbTimes2); - aRI.SetAngle(theAngle); aRI.SetStep(theStep); + aRI.SetNbIter2(theNbTimes2); + + //Compute the translation + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Rotate driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) + << aCopy << " = geompy.MultiRotate2DByStep(" << theObject << ", " + << theAxis << ", " << anAngleStep << "*math.pi/180.0, " + << theNbTimes1 << ", " << theStep << ", " << theNbTimes2 << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * RotateThreePoints + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateThreePoints (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theCentPoint, + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theCentPoint.IsNull() || thePoint1.IsNull() || thePoint2.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + + // Get last functions of the arguments + Handle(GEOM_Function) aCPF = theCentPoint->GetLastFunction(); + Handle(GEOM_Function) aP1F = thePoint1->GetLastFunction(); + Handle(GEOM_Function) aP2F = thePoint2->GetLastFunction(); + + + //Add a rotate function + aFunction = theObject->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_THREE_POINTS); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; + + GEOMImpl_IRotate aRI(aFunction); + aRI.SetCentPoint(aCPF); + aRI.SetPoint1(aP1F); + aRI.SetPoint2(aP2F); + aRI.SetOriginal(aLastFunction); + + //Compute the translation + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Rotate driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << "geompy.RotateThreePoints(" << theObject + << ", " << theCentPoint << ", "<GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a rotate function + aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_THREE_POINTS_COPY); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; + + GEOMImpl_IRotate aRI(aFunction); + aRI.SetCentPoint(theCentPoint->GetLastFunction()); + aRI.SetPoint1(thePoint1->GetLastFunction()); + aRI.SetPoint2(thePoint2->GetLastFunction()); + aRI.SetOriginal(aLastFunction); //Compute the translation try { + OCC_CATCH_SIGNALS; if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Rotate driver failed"); return NULL; @@ -1301,9 +2117,152 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object) } //Make a Python command - GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MultiRotate2D(" - << theObject << ", " << theAxis << ", " << theAngle << ", " - << theNbTimes1 << ", " << theStep << ", " << theNbTimes2 << ")"; + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeRotationThreePoints(" << theObject + << ", " << theCentPoint << ", "<GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; // There is no function which creates an object to be transformed + + Handle(GEOM_Function) aSampleFunc = theSample->GetLastFunction(); + if (aSampleFunc.IsNull()) return NULL; // There is no function which creates a sample object + + // Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + // Add a transform function (depends on theSample function) + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(aSampleFunc->GetDriverGUID(), aSampleFunc->GetType()); + if (aFunction.IsNull()) return NULL; + + // Check if the function is set correctly + if (aFunction->GetDriverGUID() != aSampleFunc->GetDriverGUID()) return NULL; + + if (aSampleFunc->GetDriverGUID() == GEOMImpl_TranslateDriver::GetID()) { + switch (aSampleFunc->GetType()) { + case TRANSLATE_1D: + { + GEOMImpl_ITranslate aRI_sample (aSampleFunc); + GEOMImpl_ITranslate aRI_target (aFunction); + + aRI_target.SetVector(aRI_sample.GetVector()); + aRI_target.SetStep1(aRI_sample.GetStep1()); + aRI_target.SetNbIter1(aRI_sample.GetNbIter1()); + + aRI_target.SetOriginal(aLastFunction); + } + break; + case TRANSLATE_2D: + { + GEOMImpl_ITranslate aRI_sample (aSampleFunc); + GEOMImpl_ITranslate aRI_target (aFunction); + + aRI_target.SetVector(aRI_sample.GetVector()); + aRI_target.SetStep1(aRI_sample.GetStep1()); + aRI_target.SetNbIter1(aRI_sample.GetNbIter1()); + + aRI_target.SetVector2(aRI_sample.GetVector2()); + aRI_target.SetStep2(aRI_sample.GetStep2()); + aRI_target.SetNbIter2(aRI_sample.GetNbIter2()); + + aRI_target.SetOriginal(aLastFunction); + } + break; + default: + { + SetErrorCode("Not implemented case of TransformLikeOtherCopy"); + return NULL; + } + } + } + else if (aSampleFunc->GetDriverGUID() == GEOMImpl_RotateDriver::GetID()) { + switch (aSampleFunc->GetType()) { + case ROTATE_1D: + { + GEOMImpl_IRotate aRI_sample (aSampleFunc); + GEOMImpl_IRotate aRI_target (aFunction); + + aRI_target.SetAxis(aRI_sample.GetAxis()); + aRI_target.SetNbIter1(aRI_sample.GetNbIter1()); + + aRI_target.SetOriginal(aLastFunction); + } + break; + case ROTATE_2D: + { + GEOMImpl_IRotate aRI_sample (aSampleFunc); + GEOMImpl_IRotate aRI_target (aFunction); + + aRI_target.SetAxis(aRI_sample.GetAxis()); + + aRI_target.SetNbIter1(aRI_sample.GetNbIter1()); + aRI_target.SetNbIter2(aRI_sample.GetNbIter2()); + + aRI_target.SetAngle(aRI_sample.GetAngle()); + aRI_target.SetStep(aRI_sample.GetStep()); + + aRI_target.SetDir2(aRI_sample.GetDir2()); + + aRI_target.SetOriginal(aLastFunction); + } + break; + case ROTATE_THREE_POINTS_COPY: + { + GEOMImpl_IRotate aRI_sample (aSampleFunc); + GEOMImpl_IRotate aRI_target (aFunction); + + aRI_target.SetCentPoint(aRI_sample.GetCentPoint()); + aRI_target.SetPoint1(aRI_sample.GetPoint1()); + aRI_target.SetPoint2(aRI_sample.GetPoint2()); + + aRI_target.SetOriginal(aLastFunction); + } + break; + default: + { + SetErrorCode("Not implemented case of TransformLikeOtherCopy"); + return NULL; + } + } + } + else { + SetErrorCode("Not implemented case of TransformLikeOtherCopy"); + return NULL; + } + + // Compute the transformation + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + //GEOM::TPythonDump(aFunction) << aCopy << " = geompy.TransformLikeOtherCopy(" + // << theObject << ", " << theSample << ")"; SetErrorCode(OK); return aCopy;