switch (obj->type)
{
case OTLine:
- {
- Line * l = (Line *)obj;
- painter->DrawLine(l->p[0], l->p[1]);
+ painter->DrawLine(obj->p[0], obj->p[1]);
- if (l->hitPoint[0])
- painter->DrawHandle(l->p[0]);
+ if (obj->hitPoint[0])
+ painter->DrawHandle(obj->p[0]);
- if (l->hitPoint[1])
- painter->DrawHandle(l->p[1]);
+ if (obj->hitPoint[1])
+ painter->DrawHandle(obj->p[1]);
break;
- }
case OTCircle:
- {
- Circle * ci = (Circle *)obj;
painter->SetBrush(QBrush(Qt::NoBrush));
- painter->DrawEllipse(ci->p[0], ci->radius, ci->radius);
+ painter->DrawEllipse(obj->p[0], obj->radius[0], obj->radius[0]);
+
+ if (obj->hitPoint[0])
+ painter->DrawHandle(obj->p[0]);
+
break;
- }
case OTArc:
- {
- Arc * a = (Arc *)obj;
- painter->DrawArc(a->p[0], a->radius, a->angle1, a->angle2);
+ painter->DrawArc(obj->p[0], obj->radius[0], obj->angle[0], obj->angle[1]);
break;
- }
case OTDimension:
{
Dimension * d = (Dimension *)obj;
if (shiftDown)
return;
- double angle = Vector(toolPoint[1], toolPoint[0]).Angle();
+ double angle = Vector(toolPoint[0], toolPoint[1]).Angle();
std::vector<void *>::iterator j = select.begin();
std::vector<Object>::iterator i = toolScratch.begin();
Object * obj2 = (Object *)(*j);
obj2->p[0] = p1;
obj2->p[1] = p2;
+
+ if (obj.type == OTArc)
+ {
+//printf("Obj2->angle[0] = %f, obj.angle[0] = %f, angle = %f\n", obj2->angle[0], obj.angle[0], angle);
+ obj2->angle[0] = obj.angle[0] + angle;
+
+ if (obj2->angle[0] > PI_TIMES_2)
+ obj2->angle[0] -= PI_TIMES_2;
+ }
}
}
}
if (Global::selectionInProgress)
- {
- // Select all the stuff inside of selection
Global::selectionInProgress = false;
- // Clear our vectors
- select.clear();
- hover.clear();
+// Should be we do this automagically? Hmm...
+ // Clear our vectors
+ select.clear();
+ hover.clear();
- // Scoop 'em up
- std::vector<void *>::iterator i;
+ // Scoop 'em up
+ std::vector<void *>::iterator i;
- for(i=document.objects.begin(); i!=document.objects.end(); i++)
- {
- if (((Object *)(*i))->selected)
- select.push_back(*i);
+ for(i=document.objects.begin(); i!=document.objects.end(); i++)
+ {
+ if (((Object *)(*i))->selected)
+ select.push_back(*i);
//hmm, this is no good, too late to do any good :-P
// if ((*i)->hovered)
// hover.push_back(*i);
- }
+// }
}
}
else if (event->button() == Qt::MiddleButton)
{
Circle * c = (Circle *)obj;
- if (Global::selection.contains(c->p[0].x - c->radius, c->p[0].y - c->radius) && Global::selection.contains(c->p[0].x + c->radius, c->p[0].y + c->radius))
+ if (Global::selection.contains(c->p[0].x - c->radius[0], c->p[0].y - c->radius[0]) && Global::selection.contains(c->p[0].x + c->radius[0], c->p[0].y + c->radius[0]))
c->selected = true;
break;
{
Arc * a = (Arc *)obj;
- double start = a->angle1;
- double end = start + a->angle2;
+ double start = a->angle[0];
+ double end = start + a->angle[1];
QPointF p1(cos(start), sin(start));
QPointF p2(cos(end), sin(end));
QRectF bounds(p1, p2);
if ((start < ((3.0 * PI) + PI_OVER_2)) && (end > ((3.0 * PI) + PI_OVER_2)))
bounds.setBottom(-1.0);
- bounds.setTopLeft(QPointF(bounds.left() * a->radius, bounds.top() * a->radius));
- bounds.setBottomRight(QPointF(bounds.right() * a->radius, bounds.bottom() * a->radius));
+ bounds.setTopLeft(QPointF(bounds.left() * a->radius[0], bounds.top() * a->radius[0]));
+ bounds.setBottomRight(QPointF(bounds.right() * a->radius[0], bounds.bottom() * a->radius[0]));
bounds.translate(a->p[0].x, a->p[0].y);
if (Global::selection.contains(bounds))
{
case OTLine:
{
- Line * l = (Line *)obj;
- bool oldHP0 = l->hitPoint[0], oldHP1 = l->hitPoint[1], oldHO = l->hitObject;
- l->hitPoint[0] = l->hitPoint[1] = l->hitObject = false;
- Vector lineSegment = l->p[1] - l->p[0];
- Vector v1 = point - l->p[0];
- Vector v2 = point - l->p[1];
- double t = Geometry::ParameterOfLineAndPoint(l->p[0], l->p[1], point);
+ bool oldHP0 = obj->hitPoint[0], oldHP1 = obj->hitPoint[1], oldHO = obj->hitObject;
+ obj->hitPoint[0] = obj->hitPoint[1] = obj->hitObject = false;
+ Vector lineSegment = obj->p[1] - obj->p[0];
+ Vector v1 = point - obj->p[0];
+ Vector v2 = point - obj->p[1];
+ double t = Geometry::ParameterOfLineAndPoint(obj->p[0], obj->p[1], point);
double distance;
if (t < 0.0)
/ lineSegment.Magnitude());
if ((v1.Magnitude() * Global::zoom) < 8.0)
- {
- l->hitPoint[0] = true;
-// snapPoint = l->p1;
-// snapPointIsValid = true;
- }
+ obj->hitPoint[0] = true;
else if ((v2.Magnitude() * Global::zoom) < 8.0)
- {
- l->hitPoint[1] = true;
-// snapPoint = l->p2;
-// snapPointIsValid = true;
- }
+ obj->hitPoint[1] = true;
else if ((distance * Global::zoom) < 5.0)
- l->hitObject = true;
+ obj->hitObject = true;
-// bool oldHovered = l->hovered;
- l->hovered = (l->hitPoint[0] || l->hitPoint[1] || l->hitObject ? true : false);
-// l->hovered = l->hitObject;
+ obj->hovered = (obj->hitPoint[0] || obj->hitPoint[1] || obj->hitObject ? true : false);
-// if (oldHovered != l->hovered)
- if ((oldHP0 != l->hitPoint[0]) || (oldHP1 != l->hitPoint[1]) || (oldHO != l->hitObject))
+ if ((oldHP0 != obj->hitPoint[0]) || (oldHP1 != obj->hitPoint[1]) || (oldHO != obj->hitObject))
needUpdate = true;
break;
}
case OTCircle:
{
- Circle * c = (Circle *)obj;
+ bool oldHP = obj->hitPoint[0], oldHO = obj->hitObject;
+ obj->hitPoint[0] = obj->hitObject = false;
+ double length = Vector::Magnitude(obj->p[0], point);
+ if ((length * Global::zoom) < 8.0)
+ obj->hitPoint[0] = true;
+ else if ((fabs(length - obj->radius[0]) * Global::zoom) < 2.0)
+ obj->hitObject = true;
+
+ obj->hovered = (obj->hitPoint[0] || obj->hitObject ? true : false);
+
+ if ((oldHP != obj->hitPoint[0]) || (oldHO != obj->hitObject))
+ needUpdate = true;
break;
}
{
case OTLine:
{
- Line * l = (Line *)obj;
+// Line * l = (Line *)obj;
- if (l->hitPoint[0])
- l->p[0] = point;
- else if (l->hitPoint[1])
- l->p[1] = point;
- else if (l->hitObject)
+ if (obj->hitPoint[0])
+ obj->p[0] = point;
+ else if (obj->hitPoint[1])
+ obj->p[1] = point;
+ else if (obj->hitObject)
{
- l->p[0] += delta;
- l->p[1] += delta;
+ obj->p[0] += delta;
+ obj->p[1] += delta;
}
break;