X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdimension.cpp;h=203e26ffead1dddb6400d67672fd4d29855f3395;hb=11802354d1ddc5bc571d83d8fc9b600618cb4372;hp=2107d67865e34c12fa0fa7feb8bde2f089e24b25;hpb=e11a07565fe5ef3dfafbf9a933d7a1575e058867;p=architektonas diff --git a/src/dimension.cpp b/src/dimension.cpp index 2107d67..203e26f 100644 --- a/src/dimension.cpp +++ b/src/dimension.cpp @@ -22,16 +22,19 @@ 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()), type(dt), 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; } // 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), type(dt), point1(p1), point2(p2) + length(0), dimensionType(dt), size(0.25), point1(p1), point2(p2) { + type = OTDimension; } @@ -53,7 +56,10 @@ Dimension::~Dimension() if (state == OSSelected) painter->SetPen(QPen(Qt::red, 2.0, Qt::DotLine)); else - painter->SetPen(QPen(Qt::blue, 1.0, Qt::SolidLine)); +// painter->SetPen(QPen(Qt::blue, 1.0, Qt::SolidLine)); + painter->SetPen(QPen(Qt::blue, 1.0 * Painter::zoom * size, Qt::SolidLine)); + + painter->SetBrush(QBrush(QColor(Qt::blue))); // Draw an aligned dimension line double angle = Vector(endpoint - position).Angle(); @@ -61,34 +67,57 @@ Dimension::~Dimension() Vector orthogonal = Vector(cos(orthoAngle), sin(orthoAngle)); Vector unit = Vector(endpoint - position).Unit(); -//NOTE: SCREEN_ZOOM is our kludge factor... We need to figure out a better -// way of doing this... - // Get our line parallel to our points - Point p1 = position + (orthogonal * 10.0 * SCREEN_ZOOM); - Point p2 = endpoint + (orthogonal * 10.0 * SCREEN_ZOOM); +// Arrowhead: +// Point p1 = head - (unit * 9.0 * size); +// Point p2 = p1 + (orthogonal * 3.0 * size); +// Point p3 = p1 - (orthogonal * 3.0 * size); + +/* +The numbers hardcoded into here, what are they? +I believe they are pixels. +*/ - // Draw main dimension line - painter->DrawLine(p1, p2); + // Get our line parallel to our points + Point p1 = position + (orthogonal * 10.0 * size); + Point p2 = endpoint + (orthogonal * 10.0 * size); - Point p3 = position + (orthogonal * 16.0 * SCREEN_ZOOM); - Point p4 = endpoint + (orthogonal * 16.0 * SCREEN_ZOOM); - Point p5 = position + (orthogonal * 4.0 * SCREEN_ZOOM); - Point p6 = endpoint + (orthogonal * 4.0 * SCREEN_ZOOM); + Point p3 = position + (orthogonal * 16.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 painter->DrawLine(p3, p5); painter->DrawLine(p4, p6); - painter->SetBrush(QBrush(QColor(Qt::blue))); - painter->DrawArrowhead(p1, p2); - painter->DrawArrowhead(p2, p1); + // 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)); +//printf("Dimension::Draw(): t = %lf\n", t); + + if (t > 0.5) + { + // Draw main dimension line + arrowheads + painter->DrawLine(p1, p2); + painter->DrawArrowhead(p1, p2, size); + painter->DrawArrowhead(p2, p1, size); + } + else + { + Point p7 = p1 - (unit * 9.0 * size); + Point p8 = p2 + (unit * 9.0 * size); + painter->DrawArrowhead(p1, p7, size); + painter->DrawArrowhead(p2, p8, size); + painter->DrawLine(p1, p1 - (unit * 14.0 * size)); + painter->DrawLine(p2, p2 + (unit * 14.0 * size)); + } // Draw length of dimension line... - painter->SetFont(QFont("Arial", 10.0 * Painter::zoom * SCREEN_ZOOM)); + painter->SetFont(QFont("Arial", 10.0 * Painter::zoom * size)); Vector v1((p1.x - p2.x) / 2.0, (p1.y - p2.y) / 2.0); Point ctr = p2 + v1; QString dimText = QString("%1\"").arg(Vector(endpoint - position).Magnitude()); - painter->DrawAngledText(ctr, angle, dimText); + painter->DrawAngledText(ctr, angle, dimText, size); } @@ -360,6 +389,29 @@ about keeping track of old states... } +/*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); + + return QRectF(QPointF(p1.x, p1.y), QPointF(p2.x, p2.y)); +} + + +#if 0 +/*virtual*/ ObjectType Dimension::Type(void) +{ + return OTDimension; +} +#endif + + void Dimension::FlipSides(void) { #if 0