From 631fbe38f52222a65f1c3bcefb11a616d6806dd6 Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Tue, 30 Jul 2013 09:20:30 -0500 Subject: [PATCH] First step towards resizable grid and sane zoom setting. --- res/snap-to-grid-tool.png | Bin 1318 -> 878 bytes src/applicationwindow.cpp | 6 ++- src/blockwidget.cpp | 2 - src/dimension.cpp | 38 ++++++++++--- src/dimension.h | 2 +- src/drawingview.cpp | 110 ++++++++++++++++---------------------- src/painter.cpp | 19 +++++-- src/painter.h | 6 +-- 8 files changed, 100 insertions(+), 83 deletions(-) diff --git a/res/snap-to-grid-tool.png b/res/snap-to-grid-tool.png index 33a74037e83e7bb21b12871cea609bf7876f0798..9102e1dc6fffad935f5d47b6fb2e2782bcb52227 100644 GIT binary patch delta 849 zcmV-X1Frn03hoAwDt`a~0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i*r26(SLG$#zQs00R3-L_t(|+U=XqYZE~f$3HubC{ndnt7s1jQmN*o>p{FEc<`bp z|A2be>fM_M{{eqo#ec$+f@~2Lp^JL(2d%bR@CQ`t52US{&VPD&3q#p$n{3kVZr+0- zWReN<{mgrB=1mfhHCok+BKP^L$n(gNwK_jTmzx4m017|>C;$bZ0J_(_suxWI2fI}N z2MqxQ(Cs;(Xw_h7j2ADQZ|zdn`Bn11LL%4$dVm4oIB*PD42^jVyzs4^Z}sylIT9Ir zqyZwC+fHBz7=H$;z)9c;uoYMWobppXDUV|svo;DBt!!@wb6o3tIkZUNB?Y;wZ3 z0-ONOhQ>S^iHhj~{XiW!5BR_!usI<)r^Ry*uq#V4uWYc}?*mQ)XMnyIg!}=X0*x|m zgOM~Vk4dk;2Ojv=Muh_)ll}rc1n!HN-@qd99e54AlYdoCGAl{&bC!8*bPkx43?A1b zLz3aAfTO?&utjn}>=E&z{grWz!UB+k%xq}PHy{+DeZVCVKj4U8kX;}KFb{kz#ZlO| zHjFW{-$h=d*p=ZdcZ>A?*l?( zD!^f2Z<2W5+Fwq;b%r*?3%o)D@U3kCZ-AG;Phb+b;fRk{`>nYAlC&A=vw01Hy0jz< zmX)v1fa_A`P5@6F@%Yw8p)upY9pIdF-vh?8?tcKCxDl#5t(NjpV-AGC4F~avmCEKp z>G}lBwc|#JW&pS?MSS2KSyyYp3SN?0K{}Tw&CajmIbfw#PqJFG0GtzJ+sv#(%y(j3 zE&U=V6AV|e~oDfC;$bZ02F`%Pyl7KN{O^g bwKC{GEw~ugcr}W|00000NkvXXu0mjf@H2HQ delta 1293 zcmV+o1@ijt2Br#-Du4d~{{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i*q-5C$lU_KJ}J00gs1L_t(|+U=XmZ(Bta#(y)uiJLaD^CWc(eE?DmO&7#!g({>N zAy6fjh&3$OfrMDFXj#w&qEtd+!ymu`5SwngBod7`&<44*f`5RBN>Ue^C=GE!?x(o0qjt6M*joUVDpoiEtNyG=l)AQ&J}5N@Z%T_bg_D zB!p5@hJXlg6n}URcwK236(}@L z+L>by^Xz4ugWO<%@9F0+q)_Wt7j+AxyvZfbGR1S%zT{TJQb6Fchj}`grkxC}Ea94r zl(>XhB21P}rs-hLeC}VmxnqdP;837i9EMoo0N3f_4u4Y|ts3kNAs|G7er__rFwb(8 zJ|+p1MdG3nNL(BWgjvF28HWOrA`*pQ)!Q2-pb!w!#o!e|flDuGPVp@#xJWnu&_ez} z$gc%auPH59B1)E?nx$^ri(pF12yhzs02l;X{OrSr<$=$D&*Mtn50Vbp1snkSw+g&* z)fM2YT7Tf1QVD7e^Xvn-5LYT4L?xI9ZUZyG3am-|M>Iu8#2q*#t^E?JbfmScI zLTktoEeW6H!1e-hr3xu2$BmbgKsT`4fY-o5;D2pXFg<}US(YB=c#61EI`zFI+4I4lrjnf9GSfKTxEOyP7ZUCYHGOBXBb+8HU}6Z`^j-H;Hg zrhfr)L{UEcDjN)bzz6s%zy+ftMCA#BL=p0}52r!k1@JU*7C7M%{2AcCT1TR;qpfIE z1hfNhm~ODkBlus-6rz5_=C*MJ81I+5!M-YcSO?x5m&&9-v62cb&_Tg4WUYq}m^s+$AS0rpz4M>>BI)6Kkl{&RwZPdT;0Xh+!dXr7Ri%FXNC=$};zn6bD0OhxfKP$n)_^Y& za19tXGI^gFs$|m)#(w8zW;yID0yc9bmH^IG1HRVw!cQLxaXBGG9ynqI&J1u7n184M zzEne6fM>h%&hHw^WF;p0000gridSpacing = 12.0 / Painter::zoom; - zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing)); +// zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing)); + zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(drawing->gridSpacing)); drawing->UpdateGridBackground(); drawing->update(); } @@ -328,7 +329,8 @@ x 2 = (-426, -301) // This just zooms leaving origin intact... should zoom out at the current center! [DONE] Painter::zoom /= zoomFactor; drawing->gridSpacing = 12.0 / Painter::zoom; - zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing)); +// zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing)); + zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(drawing->gridSpacing)); drawing->UpdateGridBackground(); drawing->update(); } diff --git a/src/blockwidget.cpp b/src/blockwidget.cpp index cd08070..d493eba 100644 --- a/src/blockwidget.cpp +++ b/src/blockwidget.cpp @@ -44,14 +44,12 @@ BlockWidget::BlockWidget(void): QWidget() QPushButton * pb2 = new QPushButton("-"); QPushButton * pb3 = new QPushButton("Edit"); QPushButton * pb4 = new QPushButton("Import"); -// QPushButton * pb5 = new QPushButton("v"); QHBoxLayout * hbox1 = new QHBoxLayout; hbox1->addWidget(pb1); hbox1->addWidget(pb2); hbox1->addWidget(pb3); hbox1->addWidget(pb4); -// hbox1->addWidget(pb5); hbox1->addStretch(); QVBoxLayout * mainLayout = new QVBoxLayout; diff --git a/src/dimension.cpp b/src/dimension.cpp index 29eaf69..021f300 100644 --- a/src/dimension.cpp +++ b/src/dimension.cpp @@ -22,8 +22,10 @@ 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()), dimensionType(dt), point1(NULL), point2(NULL) + length(p2.Magnitude()), dimensionType(dt), point1(NULL), point2(NULL), + size(0.25) { + // We set the size to 1/4 base unit. Could be anything. type = OTDimension; } @@ -31,7 +33,8 @@ Dimension::Dimension(Vector p1, Vector p2, DimensionType dt/*= DTLinear*/ ,Objec // 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), dimensionType(dt), point1(p1), point2(p2) + length(0), dimensionType(dt), point1(p1), point2(p2), + size(0.25) { type = OTDimension; } @@ -63,6 +66,7 @@ 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 @@ -76,21 +80,43 @@ Dimension::~Dimension() 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. +*/ + + // Get our line parallel to our points + 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); +// painter->DrawArrowhead(p2, p1); + painter->DrawArrowhead(p1, p2, size); + painter->DrawArrowhead(p2, p1, size); // Draw length of dimension line... - painter->SetFont(QFont("Arial", 10.0 * Painter::zoom * SCREEN_ZOOM)); +// 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); + painter->DrawAngledText(ctr, angle, dimText, size); } diff --git a/src/dimension.h b/src/dimension.h index efd5ea6..4afc2ac 100644 --- a/src/dimension.h +++ b/src/dimension.h @@ -25,7 +25,6 @@ class Dimension: public Object virtual void Disconnect(Object *, double); virtual void DisconnectAll(Object *); virtual QRectF Extents(void); -// virtual ObjectType Type(void); void FlipSides(void); protected: @@ -39,6 +38,7 @@ class Dimension: public Object bool objectWasDragged; double length; DimensionType dimensionType; + double size; // Size of arrows/text in base units // We use these in lieu of the built-in connected[] array; no reason to // do it this way especially diff --git a/src/drawingview.cpp b/src/drawingview.cpp index 23c1d49..1a6d120 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -44,7 +44,7 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent), // The value in the settings file will override this. useAntialiasing(true), - gridBackground(256, 256), + gridBackground(512, 512), scale(1.0), offsetX(-10), offsetY(-10), document(Vector(0, 0)), // gridSpacing(32.0), collided(false), rotateTool(false), rx(150.0), ry(150.0), @@ -79,30 +79,51 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent), // Alternate way to do the above... line->SetDimensionOnLine(); #endif -// connect(toolAction, SIGNAL(ObjectReady(Object *)), this, -// SLOT(AddNewObjectToDocument(Object *))); -//This works, now how to scroll it??? -// QPixmap pm(256, 256); + +/* +Here we set the grid size in pixels--12 in this case. Initially, we have our +zoom set to make this represent 12 inches at a zoom factor of 25%. (This is +arbitrary.) So, to be able to decouple the grid size from the zoom, we need +to be able to set the size of the background grid (which we do here at an +arbitrary 12 pixels) to anything we want (within reason, of course :-). + +The drawing enforces the grid spacing through the drawing->gridSpacing variable. + + drawing->gridSpacing = 12.0 / Painter::zoom; + +Painter::zoom is the zoom factor for the drawing, and all mouse clicks are +translated to Cartesian coordinates through this. (Initially, Painter::zoom is +set to 1.0. SCREEN_ZOOM is set to 1.0/4.0.) + +Really, the 100% zoom level can be set at *any* zoom level, it's more of a +convenience function than any measure of absolutes. Doing things that way we +could rid ourselves of the whole SCREEN_ZOOM parameter and all the attendant +shittyness that comes with it. + +However, it seems that SCREEN_ZOOM is used to make text and arrow sizes show up +a certain way, which means we should probably create something else in those +objects to take its place--like some kind of scale factor. This would seem to +imply that certain point sizes actually *do* tie things like fonts to absolute +sizes on the screen, but not necessarily because you could have an inch scale +with text that is quite small relative to other objects on the screen, which +currently you have to zoom in to see (and which blows up the text). Point sizes +in an application like this are a bit meaningless; even though an inch is an +inch regardless of the zoom level a piece of text can be larger or smaller than +this. Maybe this is the case for having a base unit and basing point sizes off +of that. + + +*/ QPainter pmp(&gridBackground); -#if 0 - pmp.fillRect(0, 0, 256, 256, Qt::lightGray); - - pmp.fillRect(0, 64, 64, 64, Qt::darkGray); - pmp.fillRect(0, 192, 64, 64, Qt::darkGray); - pmp.fillRect(64, 0, 64, 64, Qt::darkGray); - pmp.fillRect(64, 128, 64, 64, Qt::darkGray); - pmp.fillRect(128, 64, 64, 64, Qt::darkGray); - pmp.fillRect(128, 192, 64, 64, Qt::darkGray); - pmp.fillRect(192, 0, 64, 64, Qt::darkGray); - pmp.fillRect(192, 128, 64, 64, Qt::darkGray); -#else - pmp.fillRect(0, 0, 256, 256, QColor(240, 240, 240)); + pmp.fillRect(0, 0, 512, 512, QColor(240, 240, 240)); pmp.setPen(QPen(QColor(210, 210, 255), 2.0, Qt::SolidLine)); - for(int i=0; i<255; i+=12) - pmp.drawLine(i, 0, i, 255); - for(int i=0; i<255; i+=12) - pmp.drawLine(0, i, 255, i); -#endif + + for(int i=0; i<511; i+=12) + { + pmp.drawLine(i, 0, i, 511); + pmp.drawLine(0, i, 511, i); + } + pmp.end(); UpdateGridBackground(); } @@ -157,23 +178,6 @@ void DrawingView::SetAddDimensionToolActive(bool state/*= true*/) void DrawingView::UpdateGridBackground(void) { -#if 0 -// Shift the background to match our scrolling... -QBrush newBrush = *backgroundBrush; -//QMatrix brushMatrix = backgroundBrush->matrix(); -QTransform brushMatrix = backgroundBrush->transform(); -brushMatrix.translate(Painter::origin.x, Painter::origin.y); -//brushMatrix.translate(15.0, 15.0); -//backgroundBrush->setMatrix(brushMatrix); -//backgroundBrush->setTransform(brushMatrix); -newBrush.setTransform(brushMatrix); -QPalette pal = palette(); -//pal.setBrush(backgroundRole(), *backgroundBrush); -pal.setBrush(backgroundRole(), newBrush); -setPalette(pal); -//Background painting does not honor the transformation matrix (either one)... -// So... -#else //was: 128 #define BG_BRUSH_SPAN 72 // Transform the origin to Qt coordinates @@ -192,7 +196,6 @@ setPalette(pal); pal.setBrush(backgroundRole(), QBrush(pm)); setAutoFillBackground(true); setPalette(pal); -#endif } @@ -231,9 +234,6 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/) QPainter qtPainter(this); Painter painter(&qtPainter); -// qtPainter.setBackground(QBrush(Qt::DiagCrossPattern)); -// qtPainter.setBackgroundMode(Qt::OpaqueMode); - if (useAntialiasing) qtPainter.setRenderHint(QPainter::Antialiasing); @@ -249,6 +249,7 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/) // Draw supplemental (tool related) points // NOTE that this can be done as an action! // In that case, we would need access to the document... +// [We can do that by making the document a class object...] if (rotateTool) { painter.SetPen(QPen(QColor(0, 200, 0), 2.0, Qt::SolidLine)); @@ -257,26 +258,7 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/) } // Maybe we can make the grid into a background brush instead, and let Qt deal -// with it??? - // Draw grid - -#if 0 - painter.setPen(QPen(QColor(90, 90, 90), 1.0, Qt::DotLine)); - - //these two loops kill performance! - // Also, these overwrite our coordinate axes - for(double x=0; xfont()).width(text); // int textHeight = QFontMetrics(painter->font()).height(); // NOTE: SCREEN_ZOOM is a kludge to make things look right at screen resolution... - QRectF textBox(-100.0 * zoom * SCREEN_ZOOM, -100.0 * zoom * SCREEN_ZOOM, 200.0 * zoom * SCREEN_ZOOM, 200.0 * zoom * SCREEN_ZOOM); // x, y, w, h; x/y = upper left corner +// QRectF textBox(-100.0 * zoom * SCREEN_ZOOM, -100.0 * zoom * SCREEN_ZOOM, 200.0 * zoom * SCREEN_ZOOM, 200.0 * zoom * SCREEN_ZOOM); // x, y, w, h; x/y = upper left corner + QRectF textBox(-100.0 * zoom * size, -100.0 * zoom * size, 200.0 * zoom * size, 200.0 * zoom * size); // x, y, w, h; x/y = upper left corner // This is in pixels. Might not render correctly at all zoom levels. // Need to figure out if dimensions are always rendered at one size regardless of zoom, // or if they have a definite size, and are thus zoomable. // If zoomable, this is incorrect: // (Added zoom, so this is correct now :-) - float yOffset = -12.0 * zoom * SCREEN_ZOOM; +// float yOffset = -12.0 * zoom * SCREEN_ZOOM; + float yOffset = -12.0 * zoom * size; // Fix text so it isn't upside down... if ((angle > PI * 0.5) && (angle < PI * 1.5)) { angle += PI; - yOffset = 12.0 * zoom * SCREEN_ZOOM; +// yOffset = 12.0 * zoom * SCREEN_ZOOM; + yOffset = 12.0 * zoom * size; } #if 0 @@ -245,7 +248,7 @@ void Painter::DrawText(QRectF rect, int type, QString text) } -void Painter::DrawArrowhead(Vector head, Vector tail) +void Painter::DrawArrowhead(Vector head, Vector tail, double size) { QPolygonF arrow; @@ -255,10 +258,16 @@ void Painter::DrawArrowhead(Vector head, Vector tail) Vector orthogonal = Vector(cos(orthoAngle), sin(orthoAngle)); Vector unit = Vector(head - tail).Unit(); +#if 0 // NOTE: SCREEN_ZOOM is a kludge to make things look right at scale... Point p1 = head - (unit * 9.0 * SCREEN_ZOOM); Point p2 = p1 + (orthogonal * 3.0 * SCREEN_ZOOM); Point p3 = p1 - (orthogonal * 3.0 * SCREEN_ZOOM); +#else + Point p1 = head - (unit * 9.0 * size); + Point p2 = p1 + (orthogonal * 3.0 * size); + Point p3 = p1 - (orthogonal * 3.0 * size); +#endif Point p4 = CartesianToQtCoords(head); Point p5 = CartesianToQtCoords(p2); diff --git a/src/painter.h b/src/painter.h index aeda1fd..219547c 100644 --- a/src/painter.h +++ b/src/painter.h @@ -4,7 +4,7 @@ #include #include "vector.h" -#define SCREEN_ZOOM (1.0 / 4.0) +//#define SCREEN_ZOOM (1.0 / 4.0) // Forward declarations @@ -18,7 +18,7 @@ class Painter void SetBrush(QBrush); void SetFont(QFont); void SetPen(QPen); - void DrawAngledText(Vector, double, QString); + void DrawAngledText(Vector, double, QString, double); void DrawArc(Vector, double, double, double); void DrawEllipse(Vector, double, double); void DrawHandle(Vector); @@ -28,7 +28,7 @@ class Painter void DrawRoundedRect(QRectF, double, double); void DrawRect(QRectF); void DrawText(QRectF, int, QString); - void DrawArrowhead(Vector, Vector); + void DrawArrowhead(Vector, Vector, double); public: static Vector CartesianToQtCoords(Vector); -- 2.37.2