3 // Part of the Architektonas Project
4 // Originally part of QCad Community Edition by Andrew Mustun
5 // Extensively rewritten and refactored by James L. Hammons
6 // (C) 2010 Underground Software
8 // JLH = James L. Hammons <jlhamm@acm.org>
11 // --- ---------- -----------------------------------------------------------
12 // JLH 06/03/2010 Added this text. :-)
15 #include "actiondimradial.h"
17 #include "rs_commandevent.h"
18 #include "rs_dialogfactory.h"
19 #include "graphicview.h"
20 #include "rs_preview.h"
22 ActionDimRadial::ActionDimRadial(RS_EntityContainer & container, GraphicView & graphicView):
23 ActionDimension("Draw Radial Dimensions", container, graphicView)
28 ActionDimRadial::~ActionDimRadial()
32 /*virtual*/ RS2::ActionType ActionDimRadial::rtti()
34 return RS2::ActionDimRadial;
37 void ActionDimRadial::reset()
39 ActionDimension::reset();
41 edata = RS_DimRadialData(Vector(false), 0.0);
44 RS_DIALOGFACTORY->requestOptions(this, true, true);
47 void ActionDimRadial::trigger()
49 ActionDimension::trigger();
55 RS_DimRadial * newEntity = new RS_DimRadial(container, data, edata);
56 newEntity->setLayerToActive();
57 newEntity->setPenToActive();
59 container->addEntity(newEntity);
64 document->startUndoCycle();
65 document->addUndoable(newEntity);
66 document->endUndoCycle();
70 Vector rz = graphicView->getRelativeZero();
71 graphicView->moveRelativeZero(Vector(0.0, 0.0));
72 graphicView->drawEntity(newEntity);
73 graphicView->moveRelativeZero(rz);
77 RS_DEBUG->print("ActionDimRadial::trigger: Entity is NULL\n");
80 void ActionDimRadial::preparePreview()
84 double angle = data.definitionPoint.angleTo(pos);
87 if (entity->rtti() == RS2::EntityArc)
88 radius = ((RS_Arc *)entity)->getRadius();
89 else if (entity->rtti() == RS2::EntityCircle)
90 radius = ((RS_Circle *)entity)->getRadius();
92 edata.definitionPoint.setPolar(radius, angle);
93 edata.definitionPoint += data.definitionPoint;
97 void ActionDimRadial::mouseMoveEvent(QMouseEvent * e)
99 RS_DEBUG->print("ActionDimRadial::mouseMoveEvent begin");
104 entity = catchEntity(e, RS2::ResolveAll);
115 // RS_DimRadial * d = new RS_DimRadial(preview, data, edata);
120 // preview->addEntity(d);
129 RS_DEBUG->print("ActionDimRadial::mouseMoveEvent end");
132 void ActionDimRadial::mouseReleaseEvent(QMouseEvent * e)
134 if (e->button() == Qt::LeftButton)
139 RS_Entity * en = catchEntity(e, RS2::ResolveAll);
143 if (en->rtti() == RS2::EntityArc
144 || en->rtti() == RS2::EntityCircle)
148 if (entity->rtti() == RS2::EntityArc)
149 data.definitionPoint =
150 ((RS_Arc *)entity)->getCenter();
151 else if (entity->rtti() == RS2::EntityCircle)
152 data.definitionPoint =
153 ((RS_Circle *)entity)->getCenter();
154 graphicView->moveRelativeZero(data.definitionPoint);
158 RS_DIALOGFACTORY->commandMessage(tr("Not a circle "
165 Vector ce(snapPoint(e));
166 coordinateEvent(&ce);
174 else if (e->button() == Qt::RightButton)
179 init(getStatus() - 1);
183 void ActionDimRadial::coordinateEvent(Vector * e)
194 setStatus(SetEntity);
202 void ActionDimRadial::commandEvent(RS_CommandEvent * e)
204 QString c = e->getCommand().toLower();
206 if (checkCommand("help", c))
208 RS_DIALOGFACTORY->commandMessage(msgAvailableCommands()
209 + getAvailableCommands().join(", "));
213 // setting new text label:
214 if (getStatus() == SetText)
217 RS_DIALOGFACTORY->requestOptions(this, true, true);
218 graphicView->enableCoordinateInput();
219 setStatus(lastStatus);
224 if (checkCommand("text", c))
226 lastStatus = (Status)getStatus();
227 graphicView->disableCoordinateInput();
232 if (getStatus() == SetPos)
235 double a = RS_Math::eval(c, &ok);
239 pos.setPolar(1.0, RS_Math::deg2rad(a));
240 pos += data.definitionPoint;
243 setStatus(SetEntity);
246 RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
252 QStringList ActionDimRadial::getAvailableCommands()
260 cmd += command("text");
270 void ActionDimRadial::updateMouseButtonHints()
275 RS_DIALOGFACTORY->updateMouseWidget(tr("Select arc or circle entity"),
280 RS_DIALOGFACTORY->updateMouseWidget(
281 tr("Specify dimension line position or enter angle:"),
286 RS_DIALOGFACTORY->updateMouseWidget(tr("Enter dimension text:"), "");
290 RS_DIALOGFACTORY->updateMouseWidget("", "");
295 void ActionDimRadial::showOptions()
297 ActionInterface::showOptions();
299 RS_DIALOGFACTORY->requestOptions(this, true);
300 //RS_DIALOGFACTORY->requestDimRadialOptions(edata, true);
303 void ActionDimRadial::hideOptions()
305 ActionInterface::hideOptions();
307 //RS_DIALOGFACTORY->requestDimRadialOptions(edata, false);
308 RS_DIALOGFACTORY->requestOptions(this, false);