X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdimension.cpp;h=7c4488d05bacbf27c4825b21d28a132a116846c0;hb=51de783e1c8d149c9dd9bd0999f2ad25dbe6edf2;hp=b3c8da6adc1ce7d2a1af9fbca481f13ef9d80fd2;hpb=4d6ba8a6eb781dbee818b6a55d21df7b52468936;p=architektonas diff --git a/src/dimension.cpp b/src/dimension.cpp index b3c8da6..7c4488d 100644 --- a/src/dimension.cpp +++ b/src/dimension.cpp @@ -45,14 +45,6 @@ Dimension::~Dimension() /* -The approach used below creates a hierarchy: Dimension is subservient to Line. - -Does this solve our problem of connected objects? Maybe, partially. Let's think this -through. It only works for endpoints, not points in the middle... - -Also: this is bad, depending on the Draw() function to update the internal - position(s) of the data of the object! (is it though?) - How to move: click once moves only the object/point clicked on, all connected objects deform themselves accordingly. click twice selects ALL connected objects; all objects move as a unified whole. @@ -61,16 +53,6 @@ all objects move as a unified whole. /*virtual*/ void Dimension::Draw(Painter * painter) { -#if 0 - // If there are valid Vector pointers in here, use them to update the internal - // positions. Otherwise, we just use the internal positions by default. - if (point1.object) - position = point1.object->GetPointAtParameter(point1.t); - - if (point2.object) - endpoint = point2.object->GetPointAtParameter(point2.t); -#endif - painter->SetPen(QPen(Qt::magenta, 2.0, Qt::DotLine)); if ((state == OSSelected) || ((state == OSInactive) && hitPoint1)) @@ -78,12 +60,10 @@ all objects move as a unified whole. if ((state == OSSelected) || ((state == OSInactive) && hitPoint2)) painter->DrawHandle(endpoint); -#if 1 + if (state == OSSelected) painter->SetPen(QPen(Qt::cyan, 1.0 * Painter::zoom * size, Qt::SolidLine)); else -// painter->SetPen(QPen(Qt::blue, 1.0, Qt::SolidLine)); -#endif painter->SetPen(QPen(Qt::blue, 1.0 * Painter::zoom * size, Qt::SolidLine)); painter->SetBrush(QBrush(QColor(Qt::blue))); @@ -91,16 +71,43 @@ all objects move as a unified whole. // Draw an aligned dimension line 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(); +// Horizontally aligned display +#if 1 + Vector pos = position, endp = endpoint, ortho; + double y1, y2; + + if ((angle < PI_OVER_2) || (angle > PI3_OVER_2)) + { + y1 = (pos.y > endp.y ? pos.y : endp.y); + y2 = (pos.y > endp.y ? endp.y : pos.y); + ortho = Vector(0, 1.0); + angle = 0; + } + else + { + y1 = (pos.y > endp.y ? endp.y : pos.y); + y2 = (pos.y > endp.y ? pos.y : endp.y); + ortho = Vector(0, -1.0); + angle = PI; + } + + pos.y = endp.y = y1; + unit = Vector(pos, endp).Unit(); + Point p1 = pos + (ortho * 10.0 * size); + Point p2 = endp + (ortho * 10.0 * size); + Point p3 = pos + (ortho * 16.0 * size); + Point p4 = endp + (ortho * 16.0 * size); + Point p5 = position + (ortho * 4.0 * size); + Point p6 = endpoint + (ortho * 4.0 * size); +#endif /* The numbers hardcoded into here, what are they? I believe they are pixels. */ - +#if 0 // Get our line parallel to our points Point p1 = position + (orthogonal * 10.0 * size); Point p2 = endpoint + (orthogonal * 10.0 * size); @@ -109,15 +116,15 @@ I believe they are pixels. Point p4 = endpoint + (orthogonal * 16.0 * size); Point p5 = position + (orthogonal * 4.0 * size); Point p6 = endpoint + (orthogonal * 4.0 * size); - - // Draw extension lines +#endif + // Draw extension lines (if certain type) painter->DrawLine(p3, p5); painter->DrawLine(p4, p6); // Calculate whether or not the arrowheads are too crowded to put inside // the extension lines. 9.0 is the length of the arrowhead. -// double t = Vector::Parameter(position, endpoint, endpoint - (unit * 9.0 * size)); - double t = Geometry::ParameterOfLineAndPoint(position, endpoint, endpoint - (unit * 9.0 * size)); +// double t = Geometry::ParameterOfLineAndPoint(position, endpoint, endpoint - (unit * 9.0 * size)); + double t = Geometry::ParameterOfLineAndPoint(pos, endp, endp - (unit * 9.0 * size)); //printf("Dimension::Draw(): t = %lf\n", t); // On the screen, it's acting like this is actually 58%... @@ -142,15 +149,19 @@ 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 = Vector(endpoint - position).Magnitude(); - double length = v.Magnitude(); +// double length = v.Magnitude(); + double length = fabs(position.x - endpoint.x); if (length < 12.0) dimText = QString("%1\"").arg(length); @@ -168,6 +179,7 @@ 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)