From 3f1e5ba1d42ab40edf75cf05df16b0e25d0821cb Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Fri, 10 Feb 2017 21:26:39 -0600 Subject: [PATCH] Make selections encompass Dimension objects. --- src/dimension.cpp | 676 ------------------------------------ src/dimension.h | 65 ---- src/drawdimensionaction.cpp | 141 -------- src/drawdimensionaction.h | 34 -- src/drawingview.cpp | 2 + src/structs.h | 3 +- 6 files changed, 4 insertions(+), 917 deletions(-) delete mode 100644 src/dimension.cpp delete mode 100644 src/dimension.h delete mode 100644 src/drawdimensionaction.cpp delete mode 100644 src/drawdimensionaction.h diff --git a/src/dimension.cpp b/src/dimension.cpp deleted file mode 100644 index 1e9b785..0000000 --- a/src/dimension.cpp +++ /dev/null @@ -1,676 +0,0 @@ -// dimension.cpp: Dimension object -// -// Part of the Architektonas Project -// (C) 2011 Underground Software -// See the README and GPLv3 files for licensing and warranty information -// -// JLH = James Hammons -// -// WHO WHEN WHAT -// --- ---------- ------------------------------------------------------------ -// JLH 04/04/2011 Created this file, basic rendering -// JLH 03/14/2013 Updated to new connection system -// - -#include "dimension.h" - -#include -#include "geometry.h" -#include "mathconstants.h" -#include "painter.h" - - -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), size(0.25)//, point1(NULL), point2(NULL) -{ - // We set the size to 1/4 base unit. Could be anything. - type = OTDimension; -// dimensionType = DTLinearHorz; -} - - -Dimension::~Dimension() -{ -} - - -/* -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) -{ - painter->SetPen(QPen(Qt::magenta, 2.0, Qt::DotLine)); - - if ((state == OSSelected) || ((state == OSInactive) && hitPoint1)) - painter->DrawHandle(position); - - if ((state == OSSelected) || ((state == OSInactive) && hitPoint2)) - painter->DrawHandle(endpoint); - - if (state == OSSelected) - painter->SetPen(QPen(Qt::cyan, 1.0 * Painter::zoom * size, Qt::SolidLine)); - else - 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(); -// Vector orthogonal = Vector::Normal(position, endpoint); - Vector unit = v.Unit(); - linePt1 = position, linePt2 = endpoint; - -// Horizontally aligned display -#if 1 - Vector ortho; - double x1, y1, length; - - if (dimensionType == DTLinearVert) - { - if ((angle < 0) || (angle > PI)) - { - x1 = (position.x > endpoint.x ? position.x : endpoint.x); - y1 = (position.y > endpoint.y ? position.y : endpoint.y); - ortho = Vector(1.0, 0); - angle = PI3_OVER_2; - } - else - { - x1 = (position.x > endpoint.x ? endpoint.x : position.x); - y1 = (position.y > endpoint.y ? endpoint.y : position.y); - ortho = Vector(-1.0, 0); - angle = PI_OVER_2; - } - - linePt1.x = linePt2.x = x1; - length = fabs(position.y - endpoint.y); - } - else if (dimensionType == DTLinearHorz) - { - if ((angle < PI_OVER_2) || (angle > PI3_OVER_2)) - { - x1 = (position.x > endpoint.x ? position.x : endpoint.x); - y1 = (position.y > endpoint.y ? position.y : endpoint.y); - ortho = Vector(0, 1.0); - angle = 0; - } - else - { - x1 = (position.x > endpoint.x ? endpoint.x : position.x); - y1 = (position.y > endpoint.y ? endpoint.y : position.y); - ortho = Vector(0, -1.0); - angle = PI; - } - - linePt1.y = linePt2.y = y1; - length = fabs(position.x - endpoint.x); - } - else if (dimensionType == DTLinear) - { - angle = Vector(linePt1, linePt2).Angle(); - ortho = Vector::Normal(linePt1, linePt2); - length = v.Magnitude(); - } - - unit = Vector(linePt1, linePt2).Unit(); -// angle = Vector(linePt1, linePt2).Angle(); -// ortho = Vector::Normal(linePt1, linePt2); - - Point p1 = linePt1 + (ortho * 10.0 * size); - Point p2 = linePt2 + (ortho * 10.0 * size); - Point p3 = linePt1 + (ortho * 16.0 * size); - Point p4 = linePt2 + (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 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 (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 = Geometry::ParameterOfLineAndPoint(position, endpoint, endpoint - (unit * 9.0 * size)); -// double t = Geometry::ParameterOfLineAndPoint(pos, endp, endp - (unit * 9.0 * size)); - double t = Geometry::ParameterOfLineAndPoint(linePt1, linePt2, linePt2 - (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", 8.0 * Painter::zoom * size)); - Point ctr = p2 + (Vector(p2, p1) / 2.0); - -#if 0 - QString dimText = QString("%1\"").arg(Vector(endpoint - position).Magnitude()); -#else - QString dimText; - - 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); - - if (hitLine) - { - Point hp1 = (p1 + p2) / 2.0; - Point hp2 = (p1 + hp1) / 2.0; - Point hp3 = (hp1 + p2) / 2.0; - - if (hitFlipSwitch) - { - painter->SetPen(QPen(Qt::magenta, 1.0, Qt::SolidLine)); - painter->SetBrush(QBrush(QColor(Qt::magenta))); - painter->DrawArrowHandle(hp1, ortho.Angle() + PI); - painter->SetPen(QPen(Qt::magenta, 2.0, Qt::DotLine)); - } - - painter->DrawHandle(hp1); - painter->SetPen(QPen(Qt::blue, 1.0 * Painter::zoom * size, Qt::SolidLine)); - - if (hitChangeSwitch1) - { - painter->SetPen(QPen(Qt::magenta, 1.0, Qt::SolidLine)); - painter->SetBrush(QBrush(QColor(Qt::magenta))); - painter->DrawArrowToLineHandle(hp2, (dimensionType == DTLinearVert ? v.Angle() - PI_OVER_2 : (v.Angle() < PI ? PI : 0))); - painter->SetPen(QPen(Qt::magenta, 2.0, Qt::DotLine)); - } - - painter->DrawHandle(hp2); - painter->SetPen(QPen(Qt::blue, 1.0 * Painter::zoom * size, Qt::SolidLine)); - - if (hitChangeSwitch2) - { - painter->SetPen(QPen(Qt::magenta, 1.0, Qt::SolidLine)); - painter->SetBrush(QBrush(QColor(Qt::magenta))); - painter->DrawArrowToLineHandle(hp3, (dimensionType == DTLinearHorz ? v.Angle() - PI_OVER_2 : (v.Angle() > PI_OVER_2 && v.Angle() < PI3_OVER_2 ? PI3_OVER_2 : PI_OVER_2))); - painter->SetPen(QPen(Qt::magenta, 2.0, Qt::DotLine)); - } - - painter->DrawHandle(hp3); - } -} - - -/*virtual*/ Vector Dimension::Center(void) -{ - // Technically, this is the midpoint but who are we to quibble? :-) - Vector v((position.x - endpoint.x) / 2.0, (position.y - endpoint.y) / 2.0); - return endpoint + v; -} - - -/*virtual*/ bool Dimension::Collided(Vector point) -{ - // Someone told us to fuck off, so we'll fuck off. :-) - if (ignoreClicks) - return false; - - // We can assume this, since this is a mouse down event here. - objectWasDragged = false; - HitTest(point); - - // Now that we've done our hit testing on the non-snapped point, snap it if - // necessary... - if (snapToGrid) - point = SnapPointToGrid(point); - - if (snapPointIsValid) - point = snapPoint; - - if (hitPoint1) - { - oldState = state; - state = OSSelected; - oldPoint = position; - draggingHandle1 = true; - return true; - } - else if (hitPoint2) - { - oldState = state; - state = OSSelected; - oldPoint = endpoint; - draggingHandle2 = true; - return true; - } - else if (hitFlipSwitch) - { - FlipSides(); - hitFlipSwitch = hitLine = false; -// state = OSInactive; -// return true; - } - else if (hitChangeSwitch1) - { - // There are three cases here: aligned, horizontal, & vertical. Aligned - // and horizontal do the same thing, vertical goes back to linear. - if (dimensionType == DTLinearVert) - dimensionType = DTLinear; - else - dimensionType = DTLinearVert; - - hitFlipSwitch = hitLine = false; - } - else if (hitChangeSwitch2) - { - // There are three cases here: aligned, horizontal, & vertical. Aligned - // and vertical do the same thing, horizontal goes back to linear. - if (dimensionType == DTLinearHorz) - dimensionType = DTLinear; - else - dimensionType = DTLinearHorz; - - hitFlipSwitch = hitLine = false; - } - - state = OSInactive; - return false; -} - - -/*virtual*/ bool Dimension::PointerMoved(Vector point) -{ - if (selectionInProgress) - { - // Check for whether or not the rect contains this line - if (selection.contains(position.x, position.y) - && selection.contains(endpoint.x, endpoint.y)) - state = OSSelected; - else - state = OSInactive; - - return false; - } - - // Hit test tells us what we hit (if anything) through boolean variables. (It - // also tells us whether or not the state changed. --not any more) - SaveHitState(); - bool hovered = HitTest(point); - needUpdate = HitStateChanged(); - - if (snapToGrid) - point = SnapPointToGrid(point); - - if (snapPointIsValid) - point = snapPoint; - - objectWasDragged = (/*draggingLine |*/ draggingHandle1 | draggingHandle2); - - if (objectWasDragged) - { - Vector delta = point - oldPoint; - - if (draggingHandle1)// || draggingLine) - position += delta; - - if (draggingHandle2)// || draggingLine) - endpoint += delta; - - oldPoint = point; - needUpdate = true; - } - - return hovered; -} - - -/*virtual*/ void Dimension::PointerReleased(void) -{ -/* if (draggingHandle1 || draggingHandle2) - { - // Set the length (in case the global state was set to fixed (or not)) - if (Object::fixedLength) - { - - if (draggingHandle1) // startpoint - { - Vector v = Vector(endpoint, position).Unit() * length; - position = endpoint + v; - } - else // endpoint - { - Vector v = Vector(position, endpoint).Unit() * length; - endpoint = position + v; - } - } - else*/ - { - // Otherwise, we calculate the new length, just in case on the next move - // it turns out to have a fixed length. :-) - length = Vector(endpoint - position).Magnitude(); - } -/* }*/ - - dragging = false; - draggingHandle1 = false; - draggingHandle2 = false; - - // Here we check for just a click: If object was clicked and dragged, then - // revert to the old state (OSInactive). Otherwise, keep the new state that - // we set. -/*Maybe it would be better to just check for "object was dragged" state and not have to worry -about keeping track of old states... -*/ - if (objectWasDragged) - state = oldState; -} - - -/*virtual*/ bool Dimension::HitTest(Point point) -{ -// Vector orthogonal = Vector::Normal(position, endpoint); - Vector orthogonal = Vector::Normal(linePt1, linePt2); - // Get our line parallel to our points -#if 0 - Point p1 = position + (orthogonal * 10.0 * size); - Point p2 = endpoint + (orthogonal * 10.0 * size); -#else - Point p1 = linePt1 + (orthogonal * 10.0 * size); - Point p2 = linePt2 + (orthogonal * 10.0 * size); -#endif - Point p3(p1, point); - - hitPoint1 = hitPoint2 = hitLine = hitFlipSwitch = hitChangeSwitch1 - = hitChangeSwitch2 = false; - Vector v1(position, point); - Vector v2(endpoint, point); -// Vector lineSegment(position, endpoint); - Vector lineSegment(p1, p2); -// double t = Geometry::ParameterOfLineAndPoint(position, endpoint, point); - double t = Geometry::ParameterOfLineAndPoint(p1, p2, point); - double distance; - Point midpoint = (p1 + p2) / 2.0; - Point hFSPoint = Point(midpoint, point); - Point hCS1Point = Point((p1 + midpoint) / 2.0, point); - Point hCS2Point = Point((midpoint + p2) / 2.0, point); - - if (t < 0.0) - distance = v1.Magnitude(); - else if (t > 1.0) - distance = v2.Magnitude(); - else - // distance = ?Det?(ls, v1) / |ls| -// distance = fabs((lineSegment.x * v1.y - v1.x * lineSegment.y) - distance = fabs((lineSegment.x * p3.y - p3.x * lineSegment.y) - / lineSegment.Magnitude()); - - if ((v1.Magnitude() * Painter::zoom) < 8.0) - hitPoint1 = true; - else if ((v2.Magnitude() * Painter::zoom) < 8.0) - hitPoint2 = true; - else if ((distance * Painter::zoom) < 5.0) - hitLine = true; - - if ((hFSPoint.Magnitude() * Painter::zoom) < 8.0) - hitFlipSwitch = true; - else if ((hCS1Point.Magnitude() * Painter::zoom) < 8.0) - hitChangeSwitch1 = true; - else if ((hCS2Point.Magnitude() * Painter::zoom) < 8.0) - hitChangeSwitch2 = true; - - return (hitPoint1 || hitPoint2 || hitLine || hitFlipSwitch || hitChangeSwitch1 || hitChangeSwitch2 ? true : false); -} - - -void Dimension::SaveHitState(void) -{ - oldHitPoint1 = hitPoint1; - oldHitPoint2 = hitPoint2; - oldHitLine = hitLine; - oldHitFlipSwitch = hitFlipSwitch; - oldHitChangeSwitch1 = hitChangeSwitch1; - oldHitChangeSwitch2 = hitChangeSwitch2; -} - - -bool Dimension::HitStateChanged(void) -{ - if ((hitPoint1 != oldHitPoint1) || (hitPoint2 != oldHitPoint2) - || (hitLine != oldHitLine) || (hitFlipSwitch != oldHitFlipSwitch) - || (hitChangeSwitch1 != oldHitChangeSwitch1) - || (hitChangeSwitch2 != oldHitChangeSwitch2)) - return true; - - return false; -} - - -/*virtual*/ void Dimension::Translate(Vector amount) -{ - position += amount; - endpoint += amount; -} - - -/*virtual*/ void Dimension::Rotate(Point point, double angle) -{ - Point l1 = Geometry::RotatePointAroundPoint(position, point, angle); - Point l2 = Geometry::RotatePointAroundPoint(endpoint, point, angle); - position = l1; - endpoint = l2; -} - - -/*virtual*/ void Dimension::Mirror(Point p1, Point p2) -{ - Point l1 = Geometry::MirrorPointAroundLine(position, p1, p2); - Point l2 = Geometry::MirrorPointAroundLine(endpoint, p1, p2); - position = l1; - endpoint = l2; -} - - -/*virtual*/ void Dimension::Save(void) -{ - Object::Save(); - oldEndpoint = endpoint; -} - - -/*virtual*/ void Dimension::Restore(void) -{ - Object::Restore(); - endpoint = oldEndpoint; -} - - -/*virtual*/ void Dimension::Enumerate(FILE * file) -{ - fprintf(file, "DIMENSION %i (%lf,%lf) (%lf,%lf) %i\n", layer, position.x, position.y, endpoint.x, endpoint.y, dimensionType); -} - - -/*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; -} - - -// Dimensions are special: they contain exactly *two* points. Here, we check -// only for zero/non-zero in returning the correct points. -/*virtual*/ Vector Dimension::GetPointAtParameter(double parameter) -{ - if (parameter == 0) - return position; - - return endpoint; -} - - -/*virtual*/ void Dimension::MovePointAtParameter(double parameter, Vector v) -{ - if (parameter == 0) - position += v; - else if (parameter == 1.0) - endpoint += v; - else - {} // Not sure how to handle this case :-P -} - -#if 0 -/*virtual*/ void Dimension::Connect(Object * obj, double param) -{ - // There are four possibilities here... - // The param is only looking for 0 or 1 here. - if (point1.object == NULL && point2.object == NULL) - { - point1.object = obj; - point1.t = param; - } - else if (point1.object == NULL && point2.object != NULL) - { - if (point2.t == param) - point2.object = obj; - else - { - point1.object = obj; - point1.t = param; - } - } - else if (point1.object != NULL && point2.object == NULL) - { - if (point1.t == param) - point1.object = obj; - else - { - point2.object = obj; - point2.t = param; - } - } - else if (point1.object != NULL && point2.object != NULL) - { - if (point1.t == param) - point1.object = obj; - else - point2.object = obj; - } -} - - -/*virtual*/ void Dimension::Disconnect(Object * obj, double param) -{ - if (point1.object == obj && point1.t == param) - point1.object = NULL; - else if (point2.object == obj && point2.t == param) - point2.object = NULL; -} - - -/*virtual*/ void Dimension::DisconnectAll(Object * obj) -{ - if (point1.object == obj) - point1.object = NULL; - - if (point2.object == obj) - point2.object = NULL; -} -#endif - -/*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 1 - Vector tmp = position; - position = endpoint; - endpoint = tmp; -//Not sure this matters... -//#warning "!!! May need to swap parameter values on connected objects !!!" -#else - Connection tmp = point1; - point1 = point2; - point2 = tmp; -// double tmp = point1.t; -// point1.t = point2.t; -// point2.t = tmp; -// Object * tmp = point1.object; -// point1.object = point2.object; -// point2.object = tmp; -#endif - needUpdate = true; -} - diff --git a/src/dimension.h b/src/dimension.h deleted file mode 100644 index b3993b0..0000000 --- a/src/dimension.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef __DIMENSION_H__ -#define __DIMENSION_H__ - -#include "object.h" - -class Line; - -enum DimensionType { DTLinear, DTLinearVert, DTLinearHorz, DTRadial, DTDiametric, DTCircumferential, DTAngular, DTLeader }; - -class Dimension: public Object -{ - friend class Line; - friend class Geometry; - - public: - Dimension(Vector, Vector, DimensionType dt = DTLinear, Object * p = 0); - ~Dimension(); - - virtual void Draw(Painter *); - virtual Vector Center(void); - virtual bool Collided(Vector); - virtual bool PointerMoved(Vector); - virtual void PointerReleased(void); - virtual bool HitTest(Point); - virtual void Translate(Vector); - virtual void Rotate(Point, double); - virtual void Mirror(Point, Point); - virtual void Save(void); - virtual void Restore(void); - virtual void Enumerate(FILE *); - virtual Object * Copy(void); - virtual Vector GetPointAtParameter(double parameter); - virtual void MovePointAtParameter(double parameter, Vector); - virtual QRectF Extents(void); - void FlipSides(void); - - protected: - void SaveHitState(void); - bool HitStateChanged(void); - - protected: - Vector endpoint; // Starting point is Object::position - Vector oldPoint; // Used for dragging - Point oldEndpoint; - Point linePt1, linePt2; // Used for testing dimension line hits - - private: - bool dragging; - bool draggingHandle1; - bool draggingHandle2; - bool objectWasDragged; - double length; - DimensionType dimensionType; - bool hitPoint1; - bool hitPoint2; - bool hitLine; - bool hitFlipSwitch; - bool hitChangeSwitch1; - bool hitChangeSwitch2; - bool oldHitPoint1, oldHitPoint2, oldHitLine, oldHitFlipSwitch, oldHitChangeSwitch1, oldHitChangeSwitch2; - public: - double size; // Size of arrows/text in base units -}; - -#endif // __DIMENSION_H__ diff --git a/src/drawdimensionaction.cpp b/src/drawdimensionaction.cpp deleted file mode 100644 index d366c22..0000000 --- a/src/drawdimensionaction.cpp +++ /dev/null @@ -1,141 +0,0 @@ -// drawdimensionaction.cpp: Action class for drawing dimensions -// -// Part of the Architektonas Project -// (C) 2011 Underground Software -// See the README and GPLv3 files for licensing and warranty information -// -// JLH = James Hammons -// -// WHO WHEN WHAT -// --- ---------- ------------------------------------------------------------ -// JLH 03/15/2013 Created this file -// - -#include "drawdimensionaction.h" -#include "applicationwindow.h" -#include "dimension.h" -#include "drawingview.h" -#include "line.h" -#include "painter.h" - - -enum { FIRST_POINT, NEXT_POINT, NO_POINT }; - - -DrawDimensionAction::DrawDimensionAction(): state(0), dimension(NULL) -{ -} - - -DrawDimensionAction::~DrawDimensionAction() -{ -} - - -/*virtual*/ void DrawDimensionAction::Draw(Painter * painter) -{ - painter->SetPen(QPen(Qt::red, 2.0, Qt::DotLine)); - - if (state == FIRST_POINT) - { - painter->DrawHandle(p1); - } - else if (state == NEXT_POINT) - { - painter->DrawLine(p1, p2); - painter->DrawHandle(p2); - } -} - - -/*virtual*/ void DrawDimensionAction::MouseDown(Vector point) -{ - obj = ApplicationWindow::drawing->document.lastObjectClicked; - - if (obj) - { - if (obj->type == OTLine) - { - // Make sure we didn't hit an endpoint... - if (!(((Line *) obj)->hitPoint1 || ((Line *)obj)->hitPoint2)) - { - state = NO_POINT; - return; - } - } - } - - if (state == FIRST_POINT) - p1 = point; - else - p2 = point; -} - - -/*virtual*/ void DrawDimensionAction::MouseMoved(Vector point) -{ - if (state == FIRST_POINT) - p1 = point; - else - p2 = point; -} - - -/*virtual*/ void DrawDimensionAction::MouseReleased(void) -{ - if (state == NO_POINT) - { - HandleAddDimensionToObject();//ApplicationWindow::drawing->document.lastObjectClicked); - state = FIRST_POINT; - } - else if (state == FIRST_POINT) - { - p2 = p1; - state = NEXT_POINT; - } - else if (state == NEXT_POINT) - { - // We create the new object here, and then pass it off to the - // DrawingView which stuffs it into the document. - dimension = new Dimension(p1, p2); - // We don't need no stinkin' sentinels, when we have signals & slots! - emit ObjectReady(dimension); - - state = FIRST_POINT; - } -} - - -/*virtual*/ void DrawDimensionAction::KeyDown(int /*key*/) -{ -} - - -/*virtual*/ void DrawDimensionAction::KeyReleased(int /*key*/) -{ -} - - -void DrawDimensionAction::HandleAddDimensionToObject(void)//Object * obj) -{ -//printf("Adding dimension to object...\n"); - if (obj->type == OTLine) - { - Object * existing = ((Line *)obj)->FindAttachedDimension(); - - if (existing) - { - ((Dimension *)existing)->FlipSides(); - } -//printf("--> type == LINE\n"); - // Should also check here to see if it hit the line proper or just hit - // an endpoint... - else - { - dimension = new Dimension(p1, p2); - ((Line *)obj)->SetDimensionOnLine(dimension); - emit ObjectReady(dimension); - } - } -} - diff --git a/src/drawdimensionaction.h b/src/drawdimensionaction.h deleted file mode 100644 index 0e691ed..0000000 --- a/src/drawdimensionaction.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef __DRAWDIMENSIONACTION_H__ -#define __DRAWDIMENSIONACTION_H__ - -#include "action.h" - -class Dimension; -class Object; - -class DrawDimensionAction: public Action -{ - public: - DrawDimensionAction(); - ~DrawDimensionAction(); - - virtual void Draw(Painter *); - virtual void MouseDown(Vector); - virtual void MouseMoved(Vector); - virtual void MouseReleased(void); - virtual void KeyDown(int); - virtual void KeyReleased(int); - - private: -// void HandleAddDimensionToObject(Object *); - void HandleAddDimensionToObject(void); - - private: - int state; - Dimension * dimension; - Vector p1, p2; - Object * obj; -}; - -#endif // __DRAWDIMENSIONACTION_H__ - diff --git a/src/drawingview.cpp b/src/drawingview.cpp index 943a9b9..ca063c5 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -1596,6 +1596,7 @@ Rect DrawingView::GetObjectExtents(Object * obj) switch (obj->type) { case OTLine: + case OTDimension: { rect = Rect(obj->p[0], obj->p[1]); break; @@ -1675,6 +1676,7 @@ void DrawingView::CheckObjectBounds(void) switch (obj->type) { case OTLine: + case OTDimension: { Line * l = (Line *)obj; diff --git a/src/structs.h b/src/structs.h index 54e2f51..7fe1f09 100644 --- a/src/structs.h +++ b/src/structs.h @@ -73,7 +73,8 @@ struct Dimension { OBJECT_COMMON; int subtype; double offset; - Point lp[2]; // Line point, the actual dimension line + Point lp[2]; // Line point, the actual dimension line + Object * obj[2]; // Pointer to attached objects (circle, lines for angle) Dimension(): type(OTDimension), id(Global::objectID++) {} Dimension(Vector pt1, Vector pt2, DimensionType dt = DTLinear, float th = 1.0, uint32_t c = 0x0000FF, int l = LSSolid): -- 2.37.2