mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
0031673: Draw Harness, ViewerTest - command vlocation applies transformation in opposite order
gp_Trsf::SetRotationPart() - added method replacing rotation matrix without reseting other components, similar to existing SetTraslationPart() and SetScaleFactor(). Transformation multiplication order has been fixed for vlocation arguments -rotate, -translate, -mirror and -scale. Added -prerotate, -pretranslate, -premirror and -prescale options following previous behavior. vlocation -setRotation now uses new method gp_Trsf::SetRotationPart() for consistency with methods -setLocation and -setScale.
This commit is contained in:
@@ -3958,7 +3958,8 @@ static Standard_Integer VSetLocation (Draw_Interpretor& theDI,
|
||||
++anArgIter;
|
||||
aContext->SetLocation (anObj, anObj2->LocalTransformation());
|
||||
}
|
||||
else if (anArg == "-rotate")
|
||||
else if (anArg == "-rotate"
|
||||
|| anArg == "-prerotate")
|
||||
{
|
||||
toPrintInfo = Standard_False;
|
||||
if (anArgIter + 7 >= theArgNb)
|
||||
@@ -3977,10 +3978,18 @@ static Standard_Integer VSetLocation (Draw_Interpretor& theDI,
|
||||
Draw::Atof (theArgVec[anArgIter + 7]) * (M_PI / 180.0));
|
||||
anArgIter += 7;
|
||||
|
||||
aTrsf = anObj->LocalTransformation() * aTrsf;
|
||||
if (anArg == "-prerotate")
|
||||
{
|
||||
aTrsf = anObj->LocalTransformation() * aTrsf;
|
||||
}
|
||||
else
|
||||
{
|
||||
aTrsf = aTrsf * anObj->LocalTransformation();
|
||||
}
|
||||
aContext->SetLocation (anObj, aTrsf);
|
||||
}
|
||||
else if (anArg == "-translate")
|
||||
else if (anArg == "-translate"
|
||||
|| anArg == "-pretranslate")
|
||||
{
|
||||
toPrintInfo = Standard_False;
|
||||
gp_Vec aLocVec;
|
||||
@@ -3994,10 +4003,18 @@ static Standard_Integer VSetLocation (Draw_Interpretor& theDI,
|
||||
|
||||
gp_Trsf aTrsf;
|
||||
aTrsf.SetTranslationPart (aLocVec);
|
||||
aTrsf = anObj->LocalTransformation() * aTrsf;
|
||||
if (anArg == "-pretranslate")
|
||||
{
|
||||
aTrsf = anObj->LocalTransformation() * aTrsf;
|
||||
}
|
||||
else
|
||||
{
|
||||
aTrsf = aTrsf * anObj->LocalTransformation();
|
||||
}
|
||||
aContext->SetLocation (anObj, aTrsf);
|
||||
}
|
||||
else if (anArg == "-scale"
|
||||
|| anArg == "-prescale"
|
||||
|| anArg == "-setscale")
|
||||
{
|
||||
toPrintInfo = Standard_False;
|
||||
@@ -4050,7 +4067,8 @@ static Standard_Integer VSetLocation (Draw_Interpretor& theDI,
|
||||
|
||||
if (toPrintScale)
|
||||
{
|
||||
if (anArg == "-setscale")
|
||||
if (anArg == "-setscale"
|
||||
|| anArg == "-prescale")
|
||||
{
|
||||
Message::SendFail() << "Syntax error at '" << anArg << "'";
|
||||
return 1;
|
||||
@@ -4081,17 +4099,25 @@ static Standard_Integer VSetLocation (Draw_Interpretor& theDI,
|
||||
if (hasScaleLoc)
|
||||
{
|
||||
aTrsf.SetScale (aScaleLoc, aScale);
|
||||
}
|
||||
else
|
||||
{
|
||||
aTrsf.SetScaleFactor (aScale);
|
||||
}
|
||||
|
||||
if (anArg == "-prescale")
|
||||
{
|
||||
aTrsf = anObj->LocalTransformation() * aTrsf;
|
||||
}
|
||||
else
|
||||
{
|
||||
aTrsf = anObj->LocalTransformation();
|
||||
aTrsf.SetScaleFactor (aTrsf.ScaleFactor() * aScale);
|
||||
aTrsf = aTrsf * anObj->LocalTransformation();
|
||||
}
|
||||
aContext->SetLocation (anObj, aTrsf);
|
||||
}
|
||||
}
|
||||
else if (anArg == "-mirror")
|
||||
else if (anArg == "-mirror"
|
||||
|| anArg == "-premirror")
|
||||
{
|
||||
toPrintInfo = Standard_False;
|
||||
if (anArgIter + 6 >= theArgNb)
|
||||
@@ -4108,7 +4134,14 @@ static Standard_Integer VSetLocation (Draw_Interpretor& theDI,
|
||||
Draw::Atof(theArgVec[theArgNb - 2]),
|
||||
Draw::Atof(theArgVec[theArgNb - 1]))));
|
||||
anArgIter += 6;
|
||||
aTrsf = anObj->LocalTransformation() * aTrsf;
|
||||
if (anArg == "-premirror")
|
||||
{
|
||||
aTrsf = anObj->LocalTransformation() * aTrsf;
|
||||
}
|
||||
else
|
||||
{
|
||||
aTrsf = aTrsf * anObj->LocalTransformation();
|
||||
}
|
||||
aContext->SetLocation (anObj, aTrsf);
|
||||
}
|
||||
else if (anArg == "-setrotation"
|
||||
@@ -4141,7 +4174,7 @@ static Standard_Integer VSetLocation (Draw_Interpretor& theDI,
|
||||
aQuatArgs[2].RealValue(),
|
||||
aQuatArgs[3].RealValue());
|
||||
gp_Trsf aTrsf = anObj->LocalTransformation();
|
||||
aTrsf.SetRotation (aQuat);
|
||||
aTrsf.SetRotationPart (aQuat);
|
||||
aContext->SetLocation (anObj, aTrsf);
|
||||
continue;
|
||||
}
|
||||
@@ -6567,27 +6600,24 @@ void ViewerTest::ObjectCommands(Draw_Interpretor& theCommands)
|
||||
|
||||
theCommands.Add ("vlocation",
|
||||
"vlocation name"
|
||||
"\n\t\t: [-reset]"
|
||||
"\n\t\t: [-copyFrom otherName]"
|
||||
"\n\t\t: [-translate X Y [Z]]"
|
||||
"\n\t\t: [-rotate x y z dx dy dz angle]"
|
||||
"\n\t\t: [-scale [X Y Z] scale]"
|
||||
"\n\t\t: [-mirror x y z dx dy dz]"
|
||||
"\n\t\t: [-setLocation X Y [Z]]"
|
||||
"\n\t\t: [-setRotation QX QY QZ QW]"
|
||||
"\n\t\t: [-setScale [X Y Z] scale]"
|
||||
"\n\t\t: [-inheritParentTrsf {on|off}]"
|
||||
"\n\t\t: [-reset] [-copyFrom otherName]"
|
||||
"\n\t\t: [-translate X Y [Z]] [-rotate x y z dx dy dz angle] [-scale [X Y Z] scale]"
|
||||
"\n\t\t: [-pretranslate X Y [Z]] [-prerotate x y z dx dy dz angle] [-prescale [X Y Z] scale]"
|
||||
"\n\t\t: [-mirror x y z dx dy dz] [-premirror x y z dx dy dz]"
|
||||
"\n\t\t: [-setLocation X Y [Z]] [-setRotation QX QY QZ QW] [-setScale [X Y Z] scale]"
|
||||
"\n\t\t: Object local transformation management:"
|
||||
"\n\t\t: -reset reset transformation to identity"
|
||||
"\n\t\t: -translate translate object"
|
||||
"\n\t\t: -rotate applies rotation to local transformation"
|
||||
"\n\t\t: -scale applies scale to local transformation"
|
||||
"\n\t\t: -mirror applies mirror to local transformation"
|
||||
"\n\t\t: -setLocation assign object location"
|
||||
"\n\t\t: -setRotation assign object rotation (quaternion)"
|
||||
"\n\t\t: -setScale assign object scale factor"
|
||||
"\n\t\t: -inheritParentTrsf option to inherit parent"
|
||||
"\n\t\t: transformation or not (ON by default)",
|
||||
"\n\t\t: -reset resets transformation to identity"
|
||||
"\n\t\t: -translate applies translation vector"
|
||||
"\n\t\t: -rotate applies rotation around axis"
|
||||
"\n\t\t: -scale applies scale factor with optional anchor"
|
||||
"\n\t\t: -mirror applies mirror transformation"
|
||||
"\n\t\t: -pretranslate pre-multiplies translation vector"
|
||||
"\n\t\t: -prerotate pre-multiplies rotation around axis"
|
||||
"\n\t\t: -prescale pre-multiplies scale transformation"
|
||||
"\n\t\t: -premirror pre-multiplies mirror transformation"
|
||||
"\n\t\t: -setLocation overrides translation part"
|
||||
"\n\t\t: -setRotation overrides rotation part with specified quaternion"
|
||||
"\n\t\t: -setScale overrides scale factor",
|
||||
__FILE__, VSetLocation, group);
|
||||
theCommands.Add ("vsetlocation",
|
||||
"alias for vlocation",
|
||||
|
@@ -129,6 +129,57 @@ void gp_Trsf::SetRotation (const gp_Quaternion& R)
|
||||
matrix = R.GetMatrix();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetRotationPart
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void gp_Trsf::SetRotationPart (const gp_Quaternion& theR)
|
||||
{
|
||||
const bool hasRotation = !theR.IsEqual (gp_Quaternion());
|
||||
if (hasRotation)
|
||||
{
|
||||
matrix = theR.GetMatrix();
|
||||
}
|
||||
else
|
||||
{
|
||||
matrix.SetIdentity();
|
||||
}
|
||||
|
||||
switch (shape)
|
||||
{
|
||||
case gp_Identity:
|
||||
{
|
||||
if (hasRotation)
|
||||
{
|
||||
shape = gp_Rotation;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case gp_Rotation:
|
||||
{
|
||||
if (!hasRotation)
|
||||
{
|
||||
shape = gp_Identity;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case gp_Translation:
|
||||
case gp_PntMirror:
|
||||
case gp_Ax1Mirror:
|
||||
case gp_Ax2Mirror:
|
||||
case gp_Scale:
|
||||
case gp_CompoundTrsf:
|
||||
case gp_Other:
|
||||
{
|
||||
if (hasRotation)
|
||||
{
|
||||
shape = gp_CompoundTrsf;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetScale
|
||||
//purpose :
|
||||
|
@@ -110,13 +110,14 @@ public:
|
||||
//! A1 is the rotation axis and Ang is the angular value of the
|
||||
//! rotation in radians.
|
||||
Standard_EXPORT void SetRotation (const gp_Ax1& A1, const Standard_Real Ang);
|
||||
|
||||
|
||||
//! Changes the transformation into a rotation defined by quaternion.
|
||||
//! Note that rotation is performed around origin, i.e.
|
||||
//! no translation is involved.
|
||||
Standard_EXPORT void SetRotation (const gp_Quaternion& R);
|
||||
|
||||
|
||||
//! Replaces the rotation part with specified quaternion.
|
||||
Standard_EXPORT void SetRotationPart (const gp_Quaternion& R);
|
||||
|
||||
//! Changes the transformation into a scale.
|
||||
//! P is the center of the scale and S is the scaling value.
|
||||
|
Reference in New Issue
Block a user