X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdimension.cpp;h=b3c8da6adc1ce7d2a1af9fbca481f13ef9d80fd2;hb=4d6ba8a6eb781dbee818b6a55d21df7b52468936;hp=27823b39135fb8f7f7ed87f4d482476672a42b19;hpb=9590e4ed45fd4e05eccc16bd8e9d51596aea5a6d;p=architektonas diff --git a/src/dimension.cpp b/src/dimension.cpp index 27823b3..b3c8da6 100644 --- a/src/dimension.cpp +++ b/src/dimension.cpp @@ -23,21 +23,21 @@ Dimension::Dimension(Vector p1, Vector p2, DimensionType dt/*= DTLinear*/, Object * p/*= NULL*/): Object(p1, p), endpoint(p2), dragging(false), draggingHandle1(false), draggingHandle2(false), - length(p2.Magnitude()), dimensionType(dt), size(0.25), point1(NULL), point2(NULL) + length(p2.Magnitude()), dimensionType(dt), size(0.25)//, point1(NULL), point2(NULL) { // We set the size to 1/4 base unit. Could be anything. type = OTDimension; } - +#if 0 // This is bad, p1 & p2 could be NULL, causing much consternation... Dimension::Dimension(Connection p1, Connection p2, DimensionType dt/*= DTLinear*/, Object * p/*= NULL*/): dragging(false), draggingHandle1(false), draggingHandle2(false), - length(0), dimensionType(dt), size(0.25), point1(p1), point2(p2) + length(0), dimensionType(dt), size(0.25)//, point1(p1), point2(p2) { type = OTDimension; } - +#endif Dimension::~Dimension() { @@ -89,15 +89,12 @@ all objects move as a unified whole. painter->SetBrush(QBrush(QColor(Qt::blue))); // Draw an aligned dimension line - double angle = Vector(endpoint - position).Angle(); - double orthoAngle = angle + (PI / 2.0); - Vector orthogonal = Vector(cos(orthoAngle), sin(orthoAngle)); - Vector unit = Vector(endpoint - position).Unit(); - -// Arrowhead: -// Point p1 = head - (unit * 9.0 * size); -// Point p2 = p1 + (orthogonal * 3.0 * size); -// Point p3 = p1 - (orthogonal * 3.0 * size); + Vector v(position, endpoint); + double angle = v.Angle(); +// double orthoAngle = angle + (PI / 2.0); +// Vector orthogonal = Vector(cos(orthoAngle), sin(orthoAngle)); + Vector orthogonal = Vector::Normal(position, endpoint); + Vector unit = v.Unit(); /* The numbers hardcoded into here, what are they? @@ -152,7 +149,8 @@ I believe they are pixels. QString dimText = QString("%1\"").arg(Vector(endpoint - position).Magnitude()); #else QString dimText; - double length = Vector(endpoint - position).Magnitude(); +// double length = Vector(endpoint - position).Magnitude(); + double length = v.Magnitude(); if (length < 12.0) dimText = QString("%1\"").arg(length); @@ -169,6 +167,21 @@ I believe they are pixels. #endif painter->DrawAngledText(ctr, angle, dimText, size); + + if (hitLine) + { + Point p9 = ((position + endpoint) / 2.0) + (orthogonal * 14.0) + + (unit * 7.0); + + Point p10 = p9 + (orthogonal * -7.0); + Point p11 = p10 + (unit * 7.0); + Point p12 = p11 + (orthogonal * 7.0); + Point p13 = p12 + (unit * -7.0); + painter->DrawLine(p10, p11); + painter->DrawLine(p11, p12); + painter->DrawLine(p12, p13); + painter->DrawLine(p13, p10); + } } @@ -299,28 +312,39 @@ about keeping track of old states... /*virtual*/ bool Dimension::HitTest(Point point) { - hitPoint1 = hitPoint2 = false; -// Vector lineSegment(position, endpoint); + Vector orthogonal = Vector::Normal(position, endpoint); + // Get our line parallel to our points + Point p1 = position + (orthogonal * 10.0 * size); + Point p2 = endpoint + (orthogonal * 10.0 * size); + Point p3(p1, point); + + hitPoint1 = hitPoint2 = hitLine = hitFlipSwitch = false; Vector v1(position, point); Vector v2(endpoint, point); +// Vector lineSegment(position, endpoint); + Vector lineSegment(p1, p2); // double t = Geometry::ParameterOfLineAndPoint(position, endpoint, point); -// double distance; + double t = Geometry::ParameterOfLineAndPoint(p1, p2, point); + double distance; -// if (t < 0.0) -// distance = v1.Magnitude(); -// else if (t > 1.0) -// distance = v2.Magnitude(); -// else + if (t < 0.0) + distance = v1.Magnitude(); + else if (t > 1.0) + distance = v2.Magnitude(); + else // distance = ?Det?(ls, v1) / |ls| // distance = fabs((lineSegment.x * v1.y - v1.x * lineSegment.y) -// / lineSegment.Magnitude()); + distance = fabs((lineSegment.x * p3.y - p3.x * lineSegment.y) + / lineSegment.Magnitude()); if ((v1.Magnitude() * Painter::zoom) < 8.0) hitPoint1 = true; else if ((v2.Magnitude() * Painter::zoom) < 8.0) hitPoint2 = true; + else if ((distance * Painter::zoom) < 5.0) + hitLine = true; - return (hitPoint1 || hitPoint2 ? true : false); + return (hitPoint1 || hitPoint2 || hitLine ? true : false); } @@ -328,13 +352,13 @@ void Dimension::SaveHitState(void) { oldHitPoint1 = hitPoint1; oldHitPoint2 = hitPoint2; -// oldHitLine = hitLine; + oldHitLine = hitLine; } bool Dimension::HitStateChanged(void) { - if ((hitPoint1 != oldHitPoint1) || (hitPoint2 != oldHitPoint2)) + if ((hitPoint1 != oldHitPoint1) || (hitPoint2 != oldHitPoint2) || (hitLine != oldHitLine)) return true; return false; @@ -387,7 +411,7 @@ same reference number. {} // Not sure how to handle this case :-P } - +#if 0 /*virtual*/ void Dimension::Connect(Object * obj, double param) { // There are four possibilities here... @@ -444,18 +468,18 @@ same reference number. if (point2.object == obj) point2.object = NULL; } - +#endif /*virtual*/ QRectF Dimension::Extents(void) { Point p1 = position; Point p2 = endpoint; - if (point1.object) - p1 = point1.object->GetPointAtParameter(point1.t); - - if (point2.object) - p2 = point2.object->GetPointAtParameter(point2.t); +// if (point1.object) +// p1 = point1.object->GetPointAtParameter(point1.t); +// +// if (point2.object) +// p2 = point2.object->GetPointAtParameter(point2.t); return QRectF(QPointF(p1.x, p1.y), QPointF(p2.x, p2.y)); } @@ -471,10 +495,12 @@ same reference number. void Dimension::FlipSides(void) { -#if 0 +#if 1 Vector tmp = position; position = endpoint; endpoint = tmp; +//Not sure this matters... +//#warning "!!! May need to swap parameter values on connected objects !!!" #else Connection tmp = point1; point1 = point2;