//! calculate the section Normal/Projection Direction given baseView projection direction and section name Base::Vector3d DrawViewSection::getSectionVector (const std::string sectionName) { Base::Vector3d result; 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); double adjustAngle = 0.0; if (getBaseDPGI() != nullptr) { adjustAngle = getBaseDPGI()->getRotateAngle(); } Base::Vector3d view = getBaseDVP()->Direction.getValue(); view.Normalize(); Base::Vector3d left = view.Cross(stdZ); left.Normalize(); Base::Vector3d up = view.Cross(left); up.Normalize(); double dot = view.Dot(stdZ); if (sectionName == "Up") { result = up; if (DrawUtil::fpCompare(dot,1.0)) { //view = stdZ result = (-1.0 * stdY); } else if (DrawUtil::fpCompare(dot,-1.0)) { //view = -stdZ result = stdY; } } else if (sectionName == "Down") { result = up * -1.0; if (DrawUtil::fpCompare(dot,1.0)) { //view = stdZ result = stdY; } else if (DrawUtil::fpCompare(dot, -1.0)) { //view = -stdZ result = (-1.0 * stdY); } } else if (sectionName == "Left") { result = left * -1.0; if (DrawUtil::fpCompare(fabs(dot),1.0)) { //view = +/- stdZ result = stdX; } } else if (sectionName == "Right") { result = left; if (DrawUtil::fpCompare(fabs(dot),1.0)) { result = -1.0 * stdX; } } else { Base::Console().Log("Error - DVS::getSectionVector - bad sectionName: %s\n",sectionName.c_str()); result = stdZ; } Base::Vector3d adjResult = DrawUtil::vecRotate(result,adjustAngle,view); return adjResult; }
/// utility non-class member functions //! gets a coordinate system that matches view system used in 3D with +Z up (or +Y up if neccessary) //! used for individual views, but not secondary views in projection groups gp_Ax2 TechDrawGeometry::getViewAxis(const Base::Vector3d origin, const Base::Vector3d& direction, const bool flip) { gp_Pnt inputCenter(origin.x,origin.y,origin.z); Base::Vector3d stdZ(0.0,0.0,1.0); Base::Vector3d flipDirection(direction.x,-direction.y,direction.z); if (!flip) { flipDirection = Base::Vector3d(direction.x,direction.y,direction.z); } Base::Vector3d cross = flipDirection; //special cases if (flipDirection == stdZ) { cross = Base::Vector3d(1.0,0.0,0.0); } else if (flipDirection == (stdZ * -1.0)) { cross = Base::Vector3d(1.0,0.0,0.0); } else { cross.Normalize(); cross = cross.Cross(stdZ); } gp_Ax2 viewAxis; viewAxis = gp_Ax2(inputCenter, gp_Dir(flipDirection.x, flipDirection.y, flipDirection.z), // gp_Dir(1.0, 1.0, 0.0)); gp_Dir(cross.x, cross.y, cross.z)); return viewAxis; }