X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdimension.cpp;h=db2a2085d42bd730048aa536a3d31ffebe1320cc;hb=6ce9d9112c232f02b2be6cbdedbeb89c28bc713a;hp=8b930f05230af7b112af9a4a3e0143f8ab4860b6;hpb=2af76acd67a2703859c11446be3be4d3ff8ff4b4;p=architektonas diff --git a/src/dimension.cpp b/src/dimension.cpp index 8b930f0..db2a208 100644 --- a/src/dimension.cpp +++ b/src/dimension.cpp @@ -56,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(); @@ -64,21 +67,11 @@ Dimension::~Dimension() Vector orthogonal = Vector(cos(orthoAngle), sin(orthoAngle)); Vector unit = Vector(endpoint - position).Unit(); -#if 0 -//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); - - // Draw main dimension line - painter->DrawLine(p1, p2); +// Arrowhead: +// Point p1 = head - (unit * 9.0 * size); +// Point p2 = p1 + (orthogonal * 3.0 * size); +// Point p3 = p1 - (orthogonal * 3.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); -#else /* The numbers hardcoded into here, what are they? I believe they are pixels. @@ -88,32 +81,67 @@ I believe they are pixels. Point p1 = position + (orthogonal * 10.0 * size); Point p2 = endpoint + (orthogonal * 10.0 * size); - // Draw main dimension line - painter->DrawLine(p1, p2); - 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); -#endif // 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); - painter->DrawArrowhead(p1, p2, size); - painter->DrawArrowhead(p2, p1, size); + // 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 = Vector::Parameter(position, endpoint, position + (unit * 9.0 * size)); +// double t = Vector::Parameter(endpoint, position, position + (unit * 9.0 * size)); +//printf("Dimension::Draw(): t = %lf\n", t); + +// On the screen, it's acting like this is actually 58%... +// This is correct, we want it to happen at > 50% + if (t > 0.58) + { + // Draw main dimension line + arrowheads + painter->DrawLine(p1, p2); + painter->DrawArrowhead(p1, p2, size); + painter->DrawArrowhead(p2, p1, size); + } + else + { + // Draw outside arrowheads + 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)); + painter->SetFont(QFont("Arial", 8.0 * Painter::zoom * size)); Vector v1((p1.x - p2.x) / 2.0, (p1.y - p2.y) / 2.0); Point ctr = p2 + v1; + +#if 0 QString dimText = QString("%1\"").arg(Vector(endpoint - position).Magnitude()); -// painter->DrawAngledText(ctr, angle, dimText); +#else + QString dimText; + double length = Vector(endpoint - position).Magnitude(); + + if (length < 12.0) + dimText = QString("%1\"").arg(length); + else + { + double feet = (double)((int)length / 12); + double inches = length - (feet * 12.0); + + if (inches == 0) + dimText = QString("%1'").arg(feet); + else + dimText = QString("%1' %2\"").arg(feet).arg(inches); + } +#endif + painter->DrawAngledText(ctr, angle, dimText, size); } @@ -313,7 +341,26 @@ about keeping track of old states... /*virtual*/ void Dimension::Enumerate(FILE * file) { - fprintf(file, "DIMENSION (%lf,%lf) (%lf,%lf) %i\n", position.x, position.y, endpoint.x, endpoint.y, type); + fprintf(file, "DIMENSION %i (%lf,%lf) (%lf,%lf) %i\n", layer, position.x, position.y, endpoint.x, endpoint.y, type); +} + + +/*virtual*/ Object * Dimension::Copy(void) +{ +#warning "!!! This doesn't take care of attached Dimensions !!!" +/* +This is a real problem. While having a pointer in the Dimension to this line's points +is fast & easy, it creates a huge problem when trying to replicate an object like this. + +Maybe a way to fix that then, is to have reference numbers instead of pointers. That +way, if you copy them, ... you might still have problems. Because you can't be sure if +a copy will be persistant or not, you then *definitely* do not want them to have the +same reference number. +*/ + + Dimension * d = new Dimension(position, endpoint, dimensionType, parent); + d->size = size; + return d; }