/*
-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.
/*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))
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)));
// 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);
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%...
// 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);
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)
public:
Dimension(Vector, Vector, DimensionType dt = DTLinear, Object * p = 0);
-// Dimension(Connection, Connection, DimensionType dt = DTLinear, Object * p = 0);
~Dimension();
virtual void Draw(Painter *);
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);
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__