From f51c178d7de6d583f29098e02a58cb0f362fd399 Mon Sep 17 00:00:00 2001 From: jfa Date: Wed, 15 Oct 2008 11:31:40 +0000 Subject: [PATCH] Bug 0019996: EDF824 GEOM: Rotation Bug. Use gp_Trsf::PreMultiply() instead of Multiply(), because in Multiply() it seems to be a bug (OCC20523). --- src/GEOMImpl/GEOMImpl_RotateDriver.cxx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/GEOMImpl/GEOMImpl_RotateDriver.cxx b/src/GEOMImpl/GEOMImpl_RotateDriver.cxx index e3920b2ab..0246f6b2c 100644 --- a/src/GEOMImpl/GEOMImpl_RotateDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_RotateDriver.cxx @@ -107,7 +107,9 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const //aShape = aTransformation.Shape(); TopLoc_Location aLocOrig = anOriginal.Location(); gp_Trsf aTrsfOrig = aLocOrig.Transformation(); - TopLoc_Location aLocRes (aTrsf * aTrsfOrig); + //TopLoc_Location aLocRes (aTrsf * aTrsfOrig); // gp_Trsf::Multiply() has a bug + aTrsfOrig.PreMultiply(aTrsf); + TopLoc_Location aLocRes (aTrsfOrig); aShape = anOriginal.Located(aLocRes); } else if (aType == ROTATE_THREE_POINTS || aType == ROTATE_THREE_POINTS_COPY) { @@ -139,7 +141,9 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const //aShape = aTransformation.Shape(); TopLoc_Location aLocOrig = anOriginal.Location(); gp_Trsf aTrsfOrig = aLocOrig.Transformation(); - TopLoc_Location aLocRes (aTrsf * aTrsfOrig); + //TopLoc_Location aLocRes (aTrsf * aTrsfOrig); // gp_Trsf::Multiply() has a bug + aTrsfOrig.PreMultiply(aTrsf); + TopLoc_Location aLocRes (aTrsfOrig); aShape = anOriginal.Located(aLocRes); } else if (aType == ROTATE_1D) { @@ -172,7 +176,10 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const } else { aTrsf.SetRotation(AX1, i*angle*PI180); - TopLoc_Location aLocRes (aTrsf * aTrsfOrig); + //TopLoc_Location aLocRes (aTrsf * aTrsfOrig); // gp_Trsf::Multiply() has a bug + gp_Trsf aTrsfNew (aTrsfOrig); + aTrsfNew.PreMultiply(aTrsf); + TopLoc_Location aLocRes (aTrsfNew); B.Add(aCompound, anOriginal.Located(aLocRes)); } //NPAL18620: performance problem: multiple locations are accumulated @@ -256,7 +263,11 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const } else { aTrsf2.SetRotation(AX1, j*ang*PI180); - TopLoc_Location aLocRes (aTrsf2 * aTrsf1 * aTrsfOrig); + //TopLoc_Location aLocRes (aTrsf2 * aTrsf1 * aTrsfOrig); // gp_Trsf::Multiply() has a bug + gp_Trsf aTrsfNew (aTrsfOrig); + aTrsfNew.PreMultiply(aTrsf1); + aTrsfNew.PreMultiply(aTrsf2); + TopLoc_Location aLocRes (aTrsfNew); B.Add(aCompound, anOriginal.Located(aLocRes)); } //NPAL18620: performance problem: multiple locations are accumulated -- 2.39.2