From: Shamus Hammons Date: Tue, 11 Feb 2014 03:21:50 +0000 (-0600) Subject: Initial stab at horizontally aligned Dimensions. X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=architektonas;a=commitdiff_plain;h=51de783e1c8d149c9dd9bd0999f2ad25dbe6edf2 Initial stab at horizontally aligned Dimensions. --- 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) diff --git a/src/dimension.h b/src/dimension.h index ba30b8f..c3709b6 100644 --- a/src/dimension.h +++ b/src/dimension.h @@ -15,7 +15,6 @@ class Dimension: public Object public: Dimension(Vector, Vector, DimensionType dt = DTLinear, Object * p = 0); -// Dimension(Connection, Connection, DimensionType dt = DTLinear, Object * p = 0); ~Dimension(); virtual void Draw(Painter *); @@ -28,9 +27,6 @@ class Dimension: public Object virtual Object * Copy(void); virtual Vector GetPointAtParameter(double parameter); virtual void MovePointAtParameter(double parameter, Vector); -// virtual void Connect(Object *, double); -// virtual void Disconnect(Object *, double); -// virtual void DisconnectAll(Object *); virtual QRectF Extents(void); void FlipSides(void); @@ -57,12 +53,6 @@ class Dimension: public Object bool oldHitPoint1, oldHitPoint2, oldHitLine, oldHitFlipSwitch; public: double size; // Size of arrows/text in base units - - private: - // We use these in lieu of the built-in connected[] array; no reason to - // do it this way especially -// Connection point1; -// Connection point2; }; #endif // __DIMENSION_H__ diff --git a/src/mathconstants.h b/src/mathconstants.h index c180d14..1910a4e 100644 --- a/src/mathconstants.h +++ b/src/mathconstants.h @@ -16,5 +16,6 @@ #define PI 3.14159265358979323846264338327 #define PI_OVER_2 (PI / 2.0) +#define PI3_OVER_2 ((3.0 * PI) / 2.0) #define RADIANS_TO_DEGREES (180.0 / PI) #define DEGREES_TO_RADIANS (PI / 180.0)