From c98a88fe1fd3ccd7597a3edd6a49a801049456bc Mon Sep 17 00:00:00 2001 From: jfa Date: Sun, 4 May 2008 07:55:25 +0000 Subject: [PATCH] Bug in GEOM: bad rotation (on zero angle) and multirotations of rotated object (found during investigation of NPAL19665) --- src/GEOMImpl/GEOMImpl_RotateDriver.cxx | 75 ++++++++++++++++++++------ 1 file changed, 58 insertions(+), 17 deletions(-) diff --git a/src/GEOMImpl/GEOMImpl_RotateDriver.cxx b/src/GEOMImpl/GEOMImpl_RotateDriver.cxx index c6655fa58..4540ac8f3 100644 --- a/src/GEOMImpl/GEOMImpl_RotateDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_RotateDriver.cxx @@ -125,11 +125,12 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aV1)); aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aV2)); - gp_Vec aVec1(aCP, aP1); - gp_Vec aVec2(aCP, aP2); - gp_Dir aDir(aVec1 ^ aVec2); - gp_Ax1 anAx1(aCP, aDir); + gp_Vec aVec1 (aCP, aP1); + gp_Vec aVec2 (aCP, aP2); + gp_Dir aDir (aVec1 ^ aVec2); + gp_Ax1 anAx1 (aCP, aDir); Standard_Real anAngle = aVec1.Angle(aVec2); + if (fabs(anAngle) < Precision::Angular()) anAngle += 2*PI; // NPAL19665 aTrsf.SetRotation(anAx1, anAngle); //NPAL18620: performance problem: multiple locations are accumulated // in shape and need a great time to process @@ -165,20 +166,23 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const gp_Trsf aTrsfOrig = aLocOrig.Transformation(); for (int i = 0; i < nbtimes; i++ ) { - aTrsf.SetRotation(AX1, i*angle*PI180); + if (i == 0) { // NPAL19665 + B.Add(aCompound, anOriginal); + } + else { + aTrsf.SetRotation(AX1, i*angle*PI180); + TopLoc_Location aLocRes (aTrsf * aTrsfOrig); + B.Add(aCompound, anOriginal.Located(aLocRes)); + } //NPAL18620: performance problem: multiple locations are accumulated // in shape and need a great time to process //BRepBuilderAPI_Transform aBRepTransformation(anOriginal, aTrsf, Standard_False); //B.Add(aCompound, aBRepTransformation.Shape()); - TopLoc_Location aLocRes (aTrsf * aTrsfOrig); - B.Add(aCompound, anOriginal.Located(aLocRes)); } aShape = aCompound; } else if (aType == ROTATE_2D) { - Standard_Real DX, DY, DZ; - //Get direction Handle(GEOM_Function) anAxis = RI.GetAxis(); if(anAxis.IsNull()) return 0; @@ -219,7 +223,7 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const if ( P1.IsEqual(P2, Precision::Confusion() ) ) return 0; - gp_Vec Vec(P1.X()-P2.X(), P1.Y()-P2.Y(), P1.Z()-P2.Z()); + gp_Vec Vec (P1.X()-P2.X(), P1.Y()-P2.Y(), P1.Z()-P2.Z()); Vec.Normalize(); Standard_Integer nbtimes2 = RI.GetNbIter2(); @@ -234,21 +238,58 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const TopoDS_Compound aCompound; BRep_Builder B; B.MakeCompound( aCompound ); + + Standard_Real DX, DY, DZ; + + // tmp for (int i = 0; i < nbtimes2; i++ ) { + DX = i * step * Vec.X(); + DY = i * step * Vec.Y(); + DZ = i * step * Vec.Z(); + aVec.SetCoord( DX, DY, DZ ); + aVec = i * step * Vec; + + aTrsf1.SetTranslation(aVec); + for (int j = 0; j < nbtimes1; j++ ) { - DX = i * step * Vec.X(); - DY = i * step * Vec.Y(); - DZ = i * step * Vec.Z(); - aVec.SetCoord( DX, DY, DZ ); - aTrsf1.SetTranslation(aVec); aTrsf2.SetRotation(AX1, j*ang*PI180); + + gp_Trsf aTrsf3 = aTrsf1 * aTrsfOrig; + gp_Trsf aTrsf4 = aTrsf2 * aTrsf3; + gp_Trsf aTrsf5 = aTrsf2 * aTrsf1 * aTrsfOrig; + + gp_Trsf aTrsf6 = aTrsf2 * aTrsfOrig; + + gp_Pnt aP1 = P1.Transformed(aTrsf6); + gp_Pnt aP2 = P1.Transformed(aTrsf4); + gp_Pnt aP3 = P1.Transformed(aTrsf3); + gp_Pnt aP4 = P1.Transformed(aTrsf3); + } + } + // tmp + + for (int i = 0; i < nbtimes2; i++ ) { + DX = i * step * Vec.X(); + DY = i * step * Vec.Y(); + DZ = i * step * Vec.Z(); + aVec.SetCoord( DX, DY, DZ ); + aTrsf1.SetTranslation(aVec); + + for (int j = 0; j < nbtimes1; j++ ) { + if (j == 0) { // NPAL19665 + TopLoc_Location aLocRes (aTrsf1 * aTrsfOrig); + B.Add(aCompound, anOriginal.Located(aLocRes)); + } + else { + aTrsf2.SetRotation(AX1, j*ang*PI180); + TopLoc_Location aLocRes (aTrsf2 * aTrsf1 * aTrsfOrig); + B.Add(aCompound, anOriginal.Located(aLocRes)); + } //NPAL18620: performance problem: multiple locations are accumulated // in shape and need a great time to process //BRepBuilderAPI_Transform aBRepTrsf1 (anOriginal, aTrsf1, Standard_False); //BRepBuilderAPI_Transform aBRepTrsf2 (aBRepTrsf1.Shape(), aTrsf2, Standard_False); //B.Add(aCompound, aBRepTrsf2.Shape()); - TopLoc_Location aLocRes (aTrsf2 * aTrsf1 * aTrsfOrig); - B.Add(aCompound, anOriginal.Located(aLocRes)); } }