X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Factions%2Frs_actiondrawellipseaxis.cpp;h=a262fa12482efedac4e2050ac51d4d21520865a0;hb=3f46c180da0806c9c263e6d87d0f1404632402da;hp=35c3bb4b6fcb37f3ae47f6b8b3542a6c735371cc;hpb=16ce54abf01ca3032e42a5bb11a4afcf9014dcca;p=architektonas diff --git a/src/actions/rs_actiondrawellipseaxis.cpp b/src/actions/rs_actiondrawellipseaxis.cpp index 35c3bb4..a262fa1 100644 --- a/src/actions/rs_actiondrawellipseaxis.cpp +++ b/src/actions/rs_actiondrawellipseaxis.cpp @@ -13,7 +13,10 @@ // #include "rs_actiondrawellipseaxis.h" -#include "rs_snapper.h" + +#include "rs_dialogfactory.h" +#include "rs_graphicview.h" +#include "rs_preview.h" /** * Constructor. @@ -21,401 +24,374 @@ * @param isArc true if this action will produce an ellipse arc. * false if it will produce a full ellipse. */ -RS_ActionDrawEllipseAxis::RS_ActionDrawEllipseAxis( - RS_EntityContainer& container, - RS_GraphicView& graphicView, - bool isArc) - :RS_PreviewActionInterface("Draw ellipse with axis", - container, graphicView) { - - this->isArc = isArc; - center = Vector(false); - major = Vector(false); - ratio = 0.5; - angle1 = 0.0; - angle2 = 2*M_PI; +RS_ActionDrawEllipseAxis::RS_ActionDrawEllipseAxis(RS_EntityContainer & container, RS_GraphicView & graphicView, bool isArc): RS_PreviewActionInterface("Draw ellipse with axis", + container, graphicView) +{ + this->isArc = isArc; + center = Vector(false); + major = Vector(false); + ratio = 0.5; + angle1 = 0.0; + angle2 = 2 * M_PI; } RS_ActionDrawEllipseAxis::~RS_ActionDrawEllipseAxis() { } -QAction * RS_ActionDrawEllipseAxis::createGUIAction(RS2::ActionType type, QObject * /*parent*/) +void RS_ActionDrawEllipseAxis::init(int status) { - QAction * action; + RS_PreviewActionInterface::init(status); - if (type==RS2::ActionDrawEllipseArcAxis) - { - action = new QAction(tr("&Ellipse Arc (Axis)"), 0); -// action = new QAction(tr("Ellipse Arc with Axis"), -// tr("&Ellipse Arc (Axis)"), QKeySequence(), NULL); - action->setStatusTip(tr("Draw Ellipse Arcs")); - } - else - { - action = new QAction(tr("&Ellipse (Axis)"), 0); -// action = new QAction(tr("Ellipse with Axis"), -// tr("&Ellipse (Axis)"), QKeySequence(), NULL); - action->setStatusTip(tr("Draw Ellipses")); - } - return action; -} + if (status == SetCenter) + center = Vector(false); -void RS_ActionDrawEllipseAxis::init(int status) -{ - RS_PreviewActionInterface::init(status); + if (status <= SetMajor) + major = Vector(false); - if (status==SetCenter) - { - center = Vector(false); - } - if (status<=SetMajor) - { - major = Vector(false); - } - if (status<=SetMinor) - { - ratio = 0.5; - } - if (status<=SetAngle1) - { - angle1 = 0.0; - } - if (status<=SetAngle2) - { - angle2 = 2*M_PI; - } -} + if (status <= SetMinor) + ratio = 0.5; + if (status <= SetAngle1) + angle1 = 0.0; + if (status <= SetAngle2) + angle2 = 2 * M_PI; +} -void RS_ActionDrawEllipseAxis::trigger() { - RS_PreviewActionInterface::trigger(); +void RS_ActionDrawEllipseAxis::trigger() +{ + RS_PreviewActionInterface::trigger(); - RS_EllipseData ellipseData(center, major, - ratio, - angle1, angle2, - false); - RS_Ellipse* ellipse = new RS_Ellipse(container, ellipseData); - ellipse->setLayerToActive(); - ellipse->setPenToActive(); + RS_EllipseData ellipseData(center, major, ratio, angle1, angle2, false); + RS_Ellipse * ellipse = new RS_Ellipse(container, ellipseData); + ellipse->setLayerToActive(); + ellipse->setPenToActive(); - container->addEntity(ellipse); + container->addEntity(ellipse); - // upd. undo list: - if (document!=NULL) { - document->startUndoCycle(); - document->addUndoable(ellipse); - document->endUndoCycle(); - } + // upd. undo list: + if (document != NULL) + { + document->startUndoCycle(); + document->addUndoable(ellipse); + document->endUndoCycle(); + } - deleteSnapper(); - Vector rz = graphicView->getRelativeZero(); - graphicView->moveRelativeZero(Vector(0.0,0.0)); - graphicView->drawEntity(ellipse); - graphicView->moveRelativeZero(rz); - drawSnapper(); + deleteSnapper(); + Vector rz = graphicView->getRelativeZero(); + graphicView->moveRelativeZero(Vector(0.0, 0.0)); + graphicView->drawEntity(ellipse); + graphicView->moveRelativeZero(rz); + drawSnapper(); - setStatus(SetCenter); + setStatus(SetCenter); - RS_DEBUG->print("RS_ActionDrawEllipseAxis::trigger():" - " entity added: %d", ellipse->getId()); + RS_DEBUG->print("RS_ActionDrawEllipseAxis::trigger():" + " entity added: %d", ellipse->getId()); } +void RS_ActionDrawEllipseAxis::mouseMoveEvent(QMouseEvent * e) +{ + RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent begin"); + Vector mouse = snapPoint(e); -void RS_ActionDrawEllipseAxis::mouseMoveEvent(QMouseEvent* e) { - RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent begin"); - - Vector mouse = snapPoint(e); - - switch (getStatus()) { - case SetCenter: - break; - - case SetMajor: - if (center.valid) { - deletePreview(); - clearPreview(); - RS_EllipseData ed(center, mouse-center, - 0.5, - 0.0, 2*M_PI, - false); - preview->addEntity(new RS_Ellipse(preview, ed)); - drawPreview(); - } - break; - - case SetMinor: - if (center.valid && major.valid) { - deletePreview(); - clearPreview(); - RS_Line line(NULL, RS_LineData(center-major, center+major)); - double d = line.getDistanceToPoint(mouse); - ratio = d/(line.getLength()/2); - RS_EllipseData ed(center, major, - ratio, - 0.0, 2*M_PI, - false); - preview->addEntity(new RS_Ellipse(preview, ed)); - drawPreview(); - } - break; - - case SetAngle1: - if (center.valid && major.valid) { - deletePreview(); - clearPreview(); - - //angle1 = center.angleTo(mouse); + switch (getStatus()) + { + case SetCenter: + break; + + case SetMajor: + + if (center.valid) + { + deletePreview(); + clearPreview(); + RS_EllipseData ed(center, mouse - center, 0.5, 0.0, 2 * M_PI, false); + preview->addEntity(new RS_Ellipse(preview, ed)); + drawPreview(); + } + break; + + case SetMinor: + + if (center.valid && major.valid) + { + deletePreview(); + clearPreview(); + RS_Line line(NULL, RS_LineData(center - major, center + major)); + double d = line.getDistanceToPoint(mouse); + ratio = d / (line.getLength() / 2); + RS_EllipseData ed(center, major, ratio, 0.0, 2 * M_PI, false); + preview->addEntity(new RS_Ellipse(preview, ed)); + drawPreview(); + } + break; + + case SetAngle1: + + if (center.valid && major.valid) + { + deletePreview(); + clearPreview(); + + //angle1 = center.angleTo(mouse); Vector m = mouse; m.rotate(center, -major.angle()); - Vector v = m-center; - v.scale(Vector(1.0, 1.0/ratio)); + Vector v = m - center; + v.scale(Vector(1.0, 1.0 / ratio)); angle1 = v.angle(); // + major.angle(); - preview->addEntity(new RS_Line(preview, RS_LineData(center, mouse))); + preview->addEntity(new RS_Line(preview, RS_LineData(center, mouse))); - RS_EllipseData ed(center, major, - ratio, - angle1, angle1+1.0, - false); - preview->addEntity(new RS_Ellipse(preview, ed)); - drawPreview(); - } - break; + RS_EllipseData ed(center, major, ratio, angle1, angle1 + 1.0, false); + preview->addEntity(new RS_Ellipse(preview, ed)); + drawPreview(); + } + break; - case SetAngle2: - if (center.valid && major.valid) { - deletePreview(); - clearPreview(); - //angle2 = center.angleTo(mouse); + case SetAngle2: + + if (center.valid && major.valid) + { + deletePreview(); + clearPreview(); + //angle2 = center.angleTo(mouse); Vector m = mouse; m.rotate(center, -major.angle()); - Vector v = m-center; - v.scale(Vector(1.0, 1.0/ratio)); + Vector v = m - center; + v.scale(Vector(1.0, 1.0 / ratio)); angle2 = v.angle(); // + major.angle(); - preview->addEntity(new RS_Line(preview, RS_LineData(center, mouse))); + preview->addEntity(new RS_Line(preview, RS_LineData(center, mouse))); - RS_EllipseData ed( - center, major, - ratio, - angle1, angle2, - false); - preview->addEntity(new RS_Ellipse(preview, ed)); - drawPreview(); - } + RS_EllipseData ed( + center, major, ratio, angle1, angle2, false); + preview->addEntity(new RS_Ellipse(preview, ed)); + drawPreview(); + } - default: - break; - } + default: + break; + } - RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent end"); + RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent end"); } +void RS_ActionDrawEllipseAxis::mouseReleaseEvent(QMouseEvent * e) +{ + // Proceed to next status +// if (RS2::qtToRsButtonState(e->button())==RS2::LeftButton) + if (e->button() == Qt::LeftButton) + { + Vector ce(snapPoint(e)); + coordinateEvent(&ce); + } + // Return to last status: +// else if (RS2::qtToRsButtonState(e->button())==RS2::RightButton) + else if (e->button() == Qt::RightButton) + { + deletePreview(); + deleteSnapper(); + init(getStatus() - 1); + } +} +void RS_ActionDrawEllipseAxis::coordinateEvent(Vector * e) +{ + if (e == NULL) + return; -void RS_ActionDrawEllipseAxis::mouseReleaseEvent(QMouseEvent* e) { - // Proceed to next status - if (RS2::qtToRsButtonState(e->button())==RS2::LeftButton) { - RS_CoordinateEvent ce(snapPoint(e)); - coordinateEvent(&ce); - } - - // Return to last status: - else if (RS2::qtToRsButtonState(e->button())==RS2::RightButton) { - deletePreview(); - deleteSnapper(); - init(getStatus()-1); - } -} + Vector mouse = *e; + switch (getStatus()) + { + case SetCenter: + center = mouse; + graphicView->moveRelativeZero(mouse); + setStatus(SetMajor); + break; + + case SetMajor: + major = mouse - center; + setStatus(SetMinor); + break; + + case SetMinor: + { + RS_Line line(NULL, RS_LineData(center - major, center + major)); + double d = line.getDistanceToPoint(mouse); + ratio = d / (line.getLength() / 2); + + if (!isArc) + { + trigger(); + setStatus(SetCenter); + } + else + setStatus(SetAngle1); + } + break; -void RS_ActionDrawEllipseAxis::coordinateEvent(RS_CoordinateEvent* e) { - if (e==NULL) { - return; - } - Vector mouse = e->getCoordinate(); - - switch (getStatus()) { - case SetCenter: - center = mouse; - graphicView->moveRelativeZero(mouse); - setStatus(SetMajor); - break; - - case SetMajor: - major = mouse-center; - setStatus(SetMinor); - break; - - case SetMinor: { - RS_Line line(NULL, RS_LineData(center-major, center+major)); - double d = line.getDistanceToPoint(mouse); - ratio = d/(line.getLength()/2); - if (!isArc) { - trigger(); - setStatus(SetCenter); - } else { - setStatus(SetAngle1); - } - } - break; - - case SetAngle1: { - //angle1 = center.angleTo(mouse); + case SetAngle1: + { + //angle1 = center.angleTo(mouse); Vector m = mouse; m.rotate(center, -major.angle()); - Vector v = m-center; - v.scale(Vector(1.0, 1.0/ratio)); + Vector v = m - center; + v.scale(Vector(1.0, 1.0 / ratio)); angle1 = v.angle(); - setStatus(SetAngle2); - } break; + setStatus(SetAngle2); + } + break; - case SetAngle2: { - //angle2 = center.angleTo(mouse); + case SetAngle2: + { + //angle2 = center.angleTo(mouse); Vector m = mouse; m.rotate(center, -major.angle()); - Vector v = m-center; - v.scale(Vector(1.0, 1.0/ratio)); + Vector v = m - center; + v.scale(Vector(1.0, 1.0 / ratio)); angle2 = v.angle(); - trigger(); - } break; + trigger(); + } + break; - default: - break; - } + default: + break; + } } +void RS_ActionDrawEllipseAxis::commandEvent(RS_CommandEvent * e) +{ + QString c = e->getCommand().toLower(); + if (checkCommand("help", c)) + { + if (RS_DIALOGFACTORY != NULL) + RS_DIALOGFACTORY->commandMessage(msgAvailableCommands() + + getAvailableCommands().join(", ")); + return; + } -void RS_ActionDrawEllipseAxis::commandEvent(RS_CommandEvent* e) { - QString c = e->getCommand().toLower(); - - if (checkCommand("help", c)) { - if (RS_DIALOGFACTORY!=NULL) { - RS_DIALOGFACTORY->commandMessage(msgAvailableCommands() - + getAvailableCommands().join(", ")); - } - return; - } - - switch (getStatus()) { - case SetMinor: { - bool ok; - double m = RS_Math::eval(c, &ok); - if (ok==true) { - ratio = m / major.magnitude(); - if (!isArc) { - trigger(); - } else { - setStatus(SetAngle1); - } - } else { - if (RS_DIALOGFACTORY!=NULL) { - RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); - } - } - } - break; - - case SetAngle1: { - bool ok; - double a = RS_Math::eval(c, &ok); - if (ok==true) { - angle1 = RS_Math::deg2rad(a); - setStatus(SetAngle2); - } else { - if (RS_DIALOGFACTORY!=NULL) { - RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); - } - } - } - break; - - case SetAngle2: { - bool ok; - double a = RS_Math::eval(c, &ok); - if (ok==true) { - angle2 = RS_Math::deg2rad(a); - trigger(); - } else { - if (RS_DIALOGFACTORY!=NULL) { - RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); - } - } - } - break; - - default: - break; - } -} + switch (getStatus()) + { + case SetMinor: { + bool ok; + double m = RS_Math::eval(c, &ok); + + if (ok == true) + { + ratio = m / major.magnitude(); + + if (!isArc) + trigger(); + else + setStatus(SetAngle1); + } + else if (RS_DIALOGFACTORY != NULL) + RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); + } + break; + case SetAngle1: { + bool ok; + double a = RS_Math::eval(c, &ok); -QStringList RS_ActionDrawEllipseAxis::getAvailableCommands() { - QStringList cmd; - return cmd; -} + if (ok == true) + { + angle1 = RS_Math::deg2rad(a); + setStatus(SetAngle2); + } + else if (RS_DIALOGFACTORY != NULL) + RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); + } + break; + case SetAngle2: { + bool ok; + double a = RS_Math::eval(c, &ok); -void RS_ActionDrawEllipseAxis::updateMouseButtonHints() { - if (RS_DIALOGFACTORY!=NULL) { - switch (getStatus()) { - case SetCenter: - RS_DIALOGFACTORY->updateMouseWidget(tr("Specify ellipse center"), - tr("Cancel")); - break; - - case SetMajor: - RS_DIALOGFACTORY->updateMouseWidget(tr("Specify endpoint of major axis"), - tr("Back")); - break; - - case SetMinor: - RS_DIALOGFACTORY->updateMouseWidget( - tr("Specify endpoint or length of minor axis:"), - tr("Back")); - break; - - case SetAngle1: - RS_DIALOGFACTORY->updateMouseWidget(tr("Specify start angle"), - tr("Back")); - break; - - case SetAngle2: - RS_DIALOGFACTORY->updateMouseWidget(tr("Specify end angle"), - tr("Back")); - break; - - default: - RS_DIALOGFACTORY->updateMouseWidget("", ""); - break; - } - } -} + if (ok == true) + { + angle2 = RS_Math::deg2rad(a); + trigger(); + } + else if (RS_DIALOGFACTORY != NULL) + RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); + } + break; + default: + break; + } +} -void RS_ActionDrawEllipseAxis::updateMouseCursor() { - graphicView->setMouseCursor(RS2::CadCursor); +QStringList RS_ActionDrawEllipseAxis::getAvailableCommands() +{ + QStringList cmd; + return cmd; } +void RS_ActionDrawEllipseAxis::updateMouseButtonHints() +{ + if (RS_DIALOGFACTORY != NULL) + { + switch (getStatus()) + { + case SetCenter: + RS_DIALOGFACTORY->updateMouseWidget(tr("Specify ellipse center"), + tr("Cancel")); + break; + + case SetMajor: + RS_DIALOGFACTORY->updateMouseWidget(tr("Specify endpoint of major axis"), + tr("Back")); + break; + + case SetMinor: + RS_DIALOGFACTORY->updateMouseWidget( + tr("Specify endpoint or length of minor axis:"), + tr("Back")); + break; + + case SetAngle1: + RS_DIALOGFACTORY->updateMouseWidget(tr("Specify start angle"), + tr("Back")); + break; + + case SetAngle2: + RS_DIALOGFACTORY->updateMouseWidget(tr("Specify end angle"), + tr("Back")); + break; + + default: + RS_DIALOGFACTORY->updateMouseWidget("", ""); + break; + } + } +} +void RS_ActionDrawEllipseAxis::updateMouseCursor() +{ + graphicView->setMouseCursor(RS2::CadCursor); +} -void RS_ActionDrawEllipseAxis::updateToolBar() { - if (RS_DIALOGFACTORY!=NULL) { - if (!isFinished()) { - RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap); - } else { - RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarEllipses); - } - } +void RS_ActionDrawEllipseAxis::updateToolBar() +{ + if (RS_DIALOGFACTORY != NULL) + { + if (!isFinished()) + RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap); + else + RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarEllipses); + } } // EOF