[TD]implement BrokenView
This commit is contained in:
@@ -642,6 +642,7 @@ gp_Vec DrawUtil::closestBasis(gp_Vec inVec)
|
||||
return gp_Vec(togp_Dir(closestBasis(toVector3d(inVec))));
|
||||
}
|
||||
|
||||
//! returns stdX, stdY or stdZ.
|
||||
Base::Vector3d DrawUtil::closestBasis(Base::Vector3d v)
|
||||
{
|
||||
Base::Vector3d result(0.0, -1, 0);
|
||||
@@ -698,6 +699,63 @@ Base::Vector3d DrawUtil::closestBasis(Base::Vector3d v)
|
||||
return Base::Vector3d(1.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
//! returns +/- stdX, stdY or stdZ.
|
||||
Base::Vector3d DrawUtil::closestBasisOriented(Base::Vector3d v)
|
||||
{
|
||||
Base::Vector3d result(0.0, -1, 0);
|
||||
Base::Vector3d stdX(1.0, 0.0, 0.0);
|
||||
Base::Vector3d stdY(0.0, 1.0, 0.0);
|
||||
Base::Vector3d stdZ(0.0, 0.0, 1.0);
|
||||
Base::Vector3d stdXr(-1.0, 0.0, 0.0);
|
||||
Base::Vector3d stdYr(0.0, -1.0, 0.0);
|
||||
Base::Vector3d stdZr(0.0, 0.0, -1.0);
|
||||
|
||||
//first check if already a basis
|
||||
if (v.Dot(stdX) == 1.0 || v.Dot(stdY) == 1.0 || v.Dot(stdZ) == 1.0) {
|
||||
return v;
|
||||
}
|
||||
if (v.Dot(stdX) == -1.0 || v.Dot(stdY) == -1.0 || v.Dot(stdZ) == -1.0) {
|
||||
return v;
|
||||
}
|
||||
|
||||
//not a basis. find smallest angle with a basis.
|
||||
double angleX, angleY, angleZ, angleXr, angleYr, angleZr, angleMin;
|
||||
angleX = stdX.GetAngle(v);
|
||||
angleY = stdY.GetAngle(v);
|
||||
angleZ = stdZ.GetAngle(v);
|
||||
angleXr = stdXr.GetAngle(v);
|
||||
angleYr = stdYr.GetAngle(v);
|
||||
angleZr = stdZr.GetAngle(v);
|
||||
|
||||
angleMin = std::min({angleX, angleY, angleZ, angleXr, angleYr, angleZr});
|
||||
if (angleX == angleMin) {
|
||||
return Base::Vector3d(1.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
if (angleY == angleMin) {
|
||||
return Base::Vector3d(0.0, 1.0, 0.0);
|
||||
}
|
||||
|
||||
if (angleZ == angleMin) {
|
||||
return Base::Vector3d(0.0, 0.0, 1.0);
|
||||
}
|
||||
|
||||
if (angleXr == angleMin) {
|
||||
return Base::Vector3d(-1.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
if (angleYr == angleMin) {
|
||||
return Base::Vector3d(0.0, -1.0, 0.0);
|
||||
}
|
||||
|
||||
if (angleZr == angleMin) {
|
||||
return Base::Vector3d(0.0, 0.0, -1.0);
|
||||
}
|
||||
|
||||
//should not get to here
|
||||
return Base::Vector3d(1.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
Base::Vector3d DrawUtil::closestBasis(Base::Vector3d vDir, gp_Ax2 coordSys)
|
||||
{
|
||||
gp_Dir gDir(vDir.x, vDir.y, vDir.z);
|
||||
|
||||
Reference in New Issue
Block a user