[TD]oblique section lines
This commit is contained in:
@@ -284,6 +284,62 @@ bool DrawUtil::fpCompare(const double& d1, const double& d2, double tolerance)
|
||||
return result;
|
||||
}
|
||||
|
||||
//brute force intersection points of line(point, dir) with box(xRange, yRange)
|
||||
std::pair<Base::Vector3d, Base::Vector3d> DrawUtil::boxIntersect2d(Base::Vector3d point,
|
||||
Base::Vector3d dirIn,
|
||||
double xRange,
|
||||
double yRange)
|
||||
{
|
||||
std::pair<Base::Vector3d, Base::Vector3d> result;
|
||||
Base::Vector3d p1, p2;
|
||||
Base::Vector3d dir = dirIn;
|
||||
dir.Normalize();
|
||||
// y = mx + b
|
||||
// m = (y1 - y0) / (x1 - x0)
|
||||
if (DrawUtil::fpCompare(dir.x, 0.0) ) {
|
||||
p1 = Base::Vector3d(0.0, - yRange / 2.0, 0.0);
|
||||
p2 = Base::Vector3d(0.0, yRange / 2.0, 0.0);
|
||||
} else {
|
||||
double slope = dir.y / dir.x;
|
||||
double left = -xRange / 2.0;
|
||||
double right = xRange / 2.0;
|
||||
double top = yRange / 2.0;
|
||||
double bottom = -yRange / 2.0;
|
||||
double yLeft = point.y - slope * (point.x - left) ;
|
||||
double yRight = point.y - slope * (point.x - right);
|
||||
double xTop = point.x - ( (point.y - top) / slope );
|
||||
double xBottom = point.x - ( (point.y - bottom) / slope );
|
||||
|
||||
if ( (bottom < yLeft) &&
|
||||
(top > yLeft) ) {
|
||||
p1 = Base::Vector3d(left, yLeft);
|
||||
} else if (yLeft <= bottom) {
|
||||
p1 = Base::Vector3d(xBottom, bottom);
|
||||
} else if (yLeft >= top) {
|
||||
p1 = Base::Vector3d(xTop, top);
|
||||
}
|
||||
|
||||
if ( (bottom < yRight) &&
|
||||
(top > yRight) ) {
|
||||
p2 = Base::Vector3d(right, yRight);
|
||||
} else if (yRight <= bottom) {
|
||||
p2 = Base::Vector3d(xBottom, bottom);
|
||||
} else if (yRight >= top) {
|
||||
p2 = Base::Vector3d(xTop, top);
|
||||
}
|
||||
}
|
||||
result.first = p1;
|
||||
result.second = p2;
|
||||
Base::Vector3d dirCheck = p2 - p1;
|
||||
dirCheck.Normalize();
|
||||
if (!dir.IsEqual(dirCheck, 0.00001)) {
|
||||
result.first = p2;
|
||||
result.second = p1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Base::Vector3d DrawUtil::vertex2Vector(const TopoDS_Vertex& v)
|
||||
{
|
||||
gp_Pnt gp = BRep_Tool::Pnt(v);
|
||||
|
||||
@@ -79,6 +79,10 @@ class TechDrawExport DrawUtil {
|
||||
static bool isFirstVert(TopoDS_Edge e, TopoDS_Vertex v, double tolerance = VERTEXTOLERANCE);
|
||||
static bool isLastVert(TopoDS_Edge e, TopoDS_Vertex v, double tolerance = VERTEXTOLERANCE);
|
||||
static bool fpCompare(const double& d1, const double& d2, double tolerance = FLT_EPSILON);
|
||||
static std::pair<Base::Vector3d, Base::Vector3d> boxIntersect2d(Base::Vector3d point,
|
||||
Base::Vector3d dir,
|
||||
double xRange,
|
||||
double yRange) ;
|
||||
static Base::Vector3d vertex2Vector(const TopoDS_Vertex& v);
|
||||
static std::string formatVector(const Base::Vector3d& v);
|
||||
static std::string formatVector(const gp_Dir& v);
|
||||
|
||||
@@ -677,6 +677,38 @@ TopoDS_Face DrawViewSection::projectFace(const TopoDS_Shape &face,
|
||||
return projectedFace;
|
||||
}
|
||||
|
||||
|
||||
//calculate the ends of the section line in BaseView's coords
|
||||
std::pair<Base::Vector3d, Base::Vector3d> DrawViewSection::sectionLineEnds(void)
|
||||
{
|
||||
std::pair<Base::Vector3d, Base::Vector3d> result;
|
||||
|
||||
auto sNorm = SectionNormal.getValue();
|
||||
double angle = M_PI / 2.0;
|
||||
auto axis = getBaseDVP()->Direction.getValue();
|
||||
Base::Vector3d stdOrg(0.0, 0.0, 0.0);
|
||||
Base::Vector3d sLineDir = DrawUtil::vecRotate(sNorm, angle, axis, stdOrg);
|
||||
sLineDir.Normalize();
|
||||
Base::Vector3d sLineDir2 = - axis.Cross(sNorm);
|
||||
sLineDir2.Normalize();
|
||||
Base::Vector3d sLineOnBase = getBaseDVP()->projectPoint(sLineDir2);
|
||||
sLineOnBase.Normalize();
|
||||
|
||||
auto sOrigin = SectionOrigin.getValue();
|
||||
Base::Vector3d adjSectionOrg = sOrigin - getBaseDVP()->getOriginalCentroid();
|
||||
Base::Vector3d sOrgOnBase = getBaseDVP()->projectPoint(adjSectionOrg);
|
||||
sOrgOnBase /= getScale();
|
||||
|
||||
auto bbx = getBaseDVP()->getBoundingBox();
|
||||
double xRange = bbx.MaxX - bbx.MinX;
|
||||
xRange /= getScale();
|
||||
double yRange = bbx.MaxY - bbx.MinY;
|
||||
yRange /= getScale();
|
||||
result = DrawUtil::boxIntersect2d(sOrgOnBase, sLineOnBase, xRange, yRange);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//this should really be in BoundBox.h
|
||||
//!check if point is in box or on boundary of box
|
||||
//!compare to isInBox which doesn't allow on boundary
|
||||
|
||||
@@ -119,6 +119,8 @@ public:
|
||||
static const char* SectionDirEnums[];
|
||||
static const char* CutSurfaceEnums[];
|
||||
|
||||
std::pair<Base::Vector3d, Base::Vector3d> sectionLineEnds(void);
|
||||
|
||||
protected:
|
||||
TopoDS_Compound sectionFaces;
|
||||
std::vector<TopoDS_Wire> sectionFaceWires;
|
||||
|
||||
Reference in New Issue
Block a user