X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdimension.cpp;h=9c9e15c8dd5af0ed3824c7926775caab700c8ec8;hb=57056be35f9295400dd873a17d8468b3287ebc0c;hp=675afaff89c7c7a3cef7e4f98df0233a51fcaa91;hpb=8a5bf49d09b5a00ebea3ffc449519ad05b0326cc;p=architektonas diff --git a/src/dimension.cpp b/src/dimension.cpp index 675afaf..9c9e15c 100644 --- a/src/dimension.cpp +++ b/src/dimension.cpp @@ -27,17 +27,9 @@ Dimension::Dimension(Vector p1, Vector p2, DimensionType dt/*= DTLinear*/, Objec { // We set the size to 1/4 base unit. Could be anything. type = OTDimension; +// dimensionType = DTLinearHorz; } -#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) -{ - type = OTDimension; -} -#endif Dimension::~Dimension() { @@ -71,31 +63,71 @@ all objects move as a unified whole. // Draw an aligned dimension line Vector v(position, endpoint); double angle = v.Angle(); - Vector orthogonal = Vector::Normal(position, endpoint); +// Vector orthogonal = Vector::Normal(position, endpoint); Vector unit = v.Unit(); linePt1 = position, linePt2 = endpoint; // Horizontally aligned display #if 1 - Vector /*pos = position, endp = endpoint,*/ ortho; - double y1; + Vector ortho; + double x1, y1, length; - if ((angle < PI_OVER_2) || (angle > PI3_OVER_2)) + if (dimensionType == DTLinearVert) { - y1 = (position.y > endpoint.y ? position.y : endpoint.y); - ortho = Vector(0, 1.0); - angle = 0; + if ((angle < 0) || (angle > PI)) + // if ((angle < PI_OVER_2) || (angle > PI3_OVER_2)) + { + x1 = (position.x > endpoint.x ? position.x : endpoint.x); + y1 = (position.y > endpoint.y ? position.y : endpoint.y); + ortho = Vector(1.0, 0); + // ortho = Vector(0, 1.0); + angle = PI3_OVER_2; + // angle = 0; + } + else + { + x1 = (position.x > endpoint.x ? endpoint.x : position.x); + y1 = (position.y > endpoint.y ? endpoint.y : position.y); + ortho = Vector(-1.0, 0); + // ortho = Vector(0, -1.0); + angle = PI_OVER_2; + // angle = PI; + } + + linePt1.x = linePt2.x = x1; + length = fabs(position.y - endpoint.y); } - else + else if (dimensionType == DTLinearHorz) + { + if ((angle < PI_OVER_2) || (angle > PI3_OVER_2)) + { + x1 = (position.x > endpoint.x ? position.x : endpoint.x); + y1 = (position.y > endpoint.y ? position.y : endpoint.y); + ortho = Vector(0, 1.0); + angle = 0; + } + else + { + x1 = (position.x > endpoint.x ? endpoint.x : position.x); + y1 = (position.y > endpoint.y ? endpoint.y : position.y); + ortho = Vector(0, -1.0); + angle = PI; + } + + linePt1.y = linePt2.y = y1; + length = fabs(position.x - endpoint.x); + } + else if (dimensionType == DTLinear) { - y1 = (position.y > endpoint.y ? endpoint.y : position.y); - ortho = Vector(0, -1.0); - angle = PI; + angle = Vector(linePt1, linePt2).Angle(); + ortho = Vector::Normal(linePt1, linePt2); + length = v.Magnitude(); } -// pos.y = endp.y = y1; - linePt1.y = linePt2.y = y1; unit = Vector(linePt1, linePt2).Unit(); +// angle = Vector(linePt1, linePt2).Angle(); +// ortho = Vector::Normal(linePt1, linePt2); + Point p1 = linePt1 + (ortho * 10.0 * size); Point p2 = linePt2 + (ortho * 10.0 * size); Point p3 = linePt1 + (ortho * 16.0 * size); @@ -150,19 +182,12 @@ I believe they are pixels. // Draw length of dimension line... painter->SetFont(QFont("Arial", 8.0 * Painter::zoom * size)); -#if 0 - Vector v1((p1.x - p2.x) / 2.0, (p1.y - p2.y) / 2.0); - Point ctr = p2 + v1; -#else Point ctr = p2 + (Vector(p2, p1) / 2.0); -#endif #if 0 QString dimText = QString("%1\"").arg(Vector(endpoint - position).Magnitude()); #else QString dimText; -// double length = v.Magnitude(); - double length = fabs(position.x - endpoint.x); if (length < 12.0) dimText = QString("%1\"").arg(length); @@ -180,20 +205,19 @@ I believe they are pixels. painter->DrawAngledText(ctr, angle, dimText, size); -// need to make another handle drawing function in Painter, instead of this 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); + Point hp1 = (p1 + p2) / 2.0; + + if (hitFlipSwitch) + { + painter->SetPen(QPen(Qt::magenta, 1.0, Qt::SolidLine)); + painter->SetBrush(QBrush(QColor(Qt::magenta))); + painter->DrawArrowHandle(hp1, ortho.Angle() + PI); + painter->SetPen(QPen(Qt::magenta, 2.0, Qt::DotLine)); + } + + painter->DrawHandle(hp1); } } @@ -237,6 +261,13 @@ I believe they are pixels. draggingHandle2 = true; return true; } + else if (hitFlipSwitch) + { + FlipSides(); + hitFlipSwitch = hitLine = false; +// state = OSInactive; +// return true; + } state = OSInactive; return false; @@ -327,7 +358,8 @@ about keeping track of old states... /*virtual*/ bool Dimension::HitTest(Point point) { - Vector orthogonal = Vector::Normal(position, endpoint); +// Vector orthogonal = Vector::Normal(position, endpoint); + Vector orthogonal = Vector::Normal(linePt1, linePt2); // Get our line parallel to our points #if 0 Point p1 = position + (orthogonal * 10.0 * size); @@ -346,6 +378,7 @@ about keeping track of old states... // double t = Geometry::ParameterOfLineAndPoint(position, endpoint, point); double t = Geometry::ParameterOfLineAndPoint(p1, p2, point); double distance; + Point hFSPoint = Point((p1 + p2) / 2.0, point); if (t < 0.0) distance = v1.Magnitude(); @@ -364,7 +397,10 @@ about keeping track of old states... else if ((distance * Painter::zoom) < 5.0) hitLine = true; - return (hitPoint1 || hitPoint2 || hitLine ? true : false); + if ((hFSPoint.Magnitude() * Painter::zoom) < 8.0) + hitFlipSwitch = true; + + return (hitPoint1 || hitPoint2 || hitLine || hitFlipSwitch ? true : false); } @@ -373,12 +409,13 @@ void Dimension::SaveHitState(void) oldHitPoint1 = hitPoint1; oldHitPoint2 = hitPoint2; oldHitLine = hitLine; + oldHitFlipSwitch = hitFlipSwitch; } bool Dimension::HitStateChanged(void) { - if ((hitPoint1 != oldHitPoint1) || (hitPoint2 != oldHitPoint2) || (hitLine != oldHitLine)) + if ((hitPoint1 != oldHitPoint1) || (hitPoint2 != oldHitPoint2) || (hitLine != oldHitLine) || (hitFlipSwitch != oldHitFlipSwitch)) return true; return false;