void EllipseObject::init(qreal centerX, qreal centerY, qreal width, qreal height, QRgb rgb, Qt::PenStyle lineType) { setData(OBJ_TYPE, type()); setData(OBJ_NAME, OBJ_NAME_ELLIPSE); //WARNING: DO NOT enable QGraphicsItem::ItemIsMovable. If it is enabled, //WARNING: and the item is double clicked, the scene will erratically move the item while zooming. //WARNING: All movement has to be handled explicitly by us, not by the scene. setFlag(QGraphicsItem::ItemIsSelectable, true); setObjectSize(width, height); setObjectCenter(centerX, centerY); setObjectColor(rgb); setObjectLineType(lineType); setObjectLineWeight(0.35); //TODO: pass in proper lineweight setPen(objectPen()); updatePath(); }
void EllipseObject::setObjectCenter(const QPointF& center) { setObjectCenter(center.x(), center.y()); }
void EllipseObject::updateRubber(QPainter* painter) { int rubberMode = objectRubberMode(); if(rubberMode == OBJ_RUBBER_ELLIPSE_LINE) { QPointF sceneLinePoint1 = objectRubberPoint("ELLIPSE_LINE_POINT1"); QPointF sceneLinePoint2 = objectRubberPoint("ELLIPSE_LINE_POINT2"); QPointF itemLinePoint1 = mapFromScene(sceneLinePoint1); QPointF itemLinePoint2 = mapFromScene(sceneLinePoint2); QLineF itemLine(itemLinePoint1, itemLinePoint2); if(painter) painter->drawLine(itemLine); updatePath(); } else if(rubberMode == OBJ_RUBBER_ELLIPSE_MAJORDIAMETER_MINORRADIUS) { QPointF sceneAxis1Point1 = objectRubberPoint("ELLIPSE_AXIS1_POINT1"); QPointF sceneAxis1Point2 = objectRubberPoint("ELLIPSE_AXIS1_POINT2"); QPointF sceneCenterPoint = objectRubberPoint("ELLIPSE_CENTER"); QPointF sceneAxis2Point2 = objectRubberPoint("ELLIPSE_AXIS2_POINT2"); qreal ellipseWidth = objectRubberPoint("ELLIPSE_WIDTH").x(); qreal ellipseRot = objectRubberPoint("ELLIPSE_ROT").x(); //TODO: incorporate perpendicularDistance() into libcgeometry qreal px = sceneAxis2Point2.x(); qreal py = sceneAxis2Point2.y(); qreal x1 = sceneAxis1Point1.x(); qreal y1 = sceneAxis1Point1.y(); QLineF line(sceneAxis1Point1, sceneAxis1Point2); QLineF norm = line.normalVector(); qreal dx = px-x1; qreal dy = py-y1; norm.translate(dx, dy); QPointF iPoint; norm.intersect(line, &iPoint); qreal ellipseHeight = QLineF(px, py, iPoint.x(), iPoint.y()).length()*2.0; setObjectCenter(sceneCenterPoint); setObjectSize(ellipseWidth, ellipseHeight); setRotation(-ellipseRot); QPointF itemCenterPoint = mapFromScene(sceneCenterPoint); QPointF itemAxis2Point2 = mapFromScene(sceneAxis2Point2); QLineF itemLine(itemCenterPoint, itemAxis2Point2); if(painter) painter->drawLine(itemLine); updatePath(); } else if(rubberMode == OBJ_RUBBER_ELLIPSE_MAJORRADIUS_MINORRADIUS) { QPointF sceneAxis1Point2 = objectRubberPoint("ELLIPSE_AXIS1_POINT2"); QPointF sceneCenterPoint = objectRubberPoint("ELLIPSE_CENTER"); QPointF sceneAxis2Point2 = objectRubberPoint("ELLIPSE_AXIS2_POINT2"); qreal ellipseWidth = objectRubberPoint("ELLIPSE_WIDTH").x(); qreal ellipseRot = objectRubberPoint("ELLIPSE_ROT").x(); //TODO: incorporate perpendicularDistance() into libcgeometry qreal px = sceneAxis2Point2.x(); qreal py = sceneAxis2Point2.y(); qreal x1 = sceneCenterPoint.x(); qreal y1 = sceneCenterPoint.y(); QLineF line(sceneCenterPoint, sceneAxis1Point2); QLineF norm = line.normalVector(); qreal dx = px-x1; qreal dy = py-y1; norm.translate(dx, dy); QPointF iPoint; norm.intersect(line, &iPoint); qreal ellipseHeight = QLineF(px, py, iPoint.x(), iPoint.y()).length()*2.0; setObjectCenter(sceneCenterPoint); setObjectSize(ellipseWidth, ellipseHeight); setRotation(-ellipseRot); QPointF itemCenterPoint = mapFromScene(sceneCenterPoint); QPointF itemAxis2Point2 = mapFromScene(sceneAxis2Point2); QLineF itemLine(itemCenterPoint, itemAxis2Point2); if(painter) painter->drawLine(itemLine); updatePath(); } }
void CircleObject::setObjectCenter(const QPointF& center) { setObjectCenter(center.x(), center.y()); }
void CircleObject::updateRubber(QPainter* painter) { int rubberMode = objectRubberMode(); if(rubberMode == OBJ_RUBBER_CIRCLE_1P_RAD) { QPointF sceneCenterPoint = objectRubberPoint("CIRCLE_CENTER"); QPointF sceneQSnapPoint = objectRubberPoint("CIRCLE_RADIUS"); QPointF itemCenterPoint = mapFromScene(sceneCenterPoint); QPointF itemQSnapPoint = mapFromScene(sceneQSnapPoint); QLineF itemLine(itemCenterPoint, itemQSnapPoint); setObjectCenter(sceneCenterPoint); QLineF sceneLine(sceneCenterPoint, sceneQSnapPoint); qreal radius = sceneLine.length(); setObjectRadius(radius); if(painter) painter->drawLine(itemLine); updatePath(); } else if(rubberMode == OBJ_RUBBER_CIRCLE_1P_DIA) { QPointF sceneCenterPoint = objectRubberPoint("CIRCLE_CENTER"); QPointF sceneQSnapPoint = objectRubberPoint("CIRCLE_DIAMETER"); QPointF itemCenterPoint = mapFromScene(sceneCenterPoint); QPointF itemQSnapPoint = mapFromScene(sceneQSnapPoint); QLineF itemLine(itemCenterPoint, itemQSnapPoint); setObjectCenter(sceneCenterPoint); QLineF sceneLine(sceneCenterPoint, sceneQSnapPoint); qreal diameter = sceneLine.length(); setObjectDiameter(diameter); if(painter) painter->drawLine(itemLine); updatePath(); } else if(rubberMode == OBJ_RUBBER_CIRCLE_2P) { QPointF sceneTan1Point = objectRubberPoint("CIRCLE_TAN1"); QPointF sceneQSnapPoint = objectRubberPoint("CIRCLE_TAN2"); QLineF sceneLine(sceneTan1Point, sceneQSnapPoint); setObjectCenter(sceneLine.pointAt(0.5)); qreal diameter = sceneLine.length(); setObjectDiameter(diameter); updatePath(); } else if(rubberMode == OBJ_RUBBER_CIRCLE_3P) { QPointF sceneTan1Point = objectRubberPoint("CIRCLE_TAN1"); QPointF sceneTan2Point = objectRubberPoint("CIRCLE_TAN2"); QPointF sceneTan3Point = objectRubberPoint("CIRCLE_TAN3"); double sceneCenterX; double sceneCenterY; getArcCenter(sceneTan1Point.x(), sceneTan1Point.y(), sceneTan2Point.x(), sceneTan2Point.y(), sceneTan3Point.x(), sceneTan3Point.y(), &sceneCenterX, &sceneCenterY); QPointF sceneCenterPoint(sceneCenterX, sceneCenterY); QLineF sceneLine(sceneCenterPoint, sceneTan3Point); setObjectCenter(sceneCenterPoint); qreal radius = sceneLine.length(); setObjectRadius(radius); updatePath(); } }
void CircleObject::updateRubber(QPainter* painter) { int rubberMode = objectRubberMode(); if(rubberMode == OBJ_RUBBER_CIRCLE_1P_RAD) { QPointF sceneCenterPoint = objectRubberPoint("CIRCLE_CENTER"); QPointF sceneQSnapPoint = objectRubberPoint("CIRCLE_RADIUS"); QPointF itemCenterPoint = mapFromScene(sceneCenterPoint); QPointF itemQSnapPoint = mapFromScene(sceneQSnapPoint); QLineF itemLine(itemCenterPoint, itemQSnapPoint); setObjectCenter(sceneCenterPoint); QLineF sceneLine(sceneCenterPoint, sceneQSnapPoint); qreal radius = sceneLine.length(); setObjectRadius(radius); if(painter) drawRubberLine(itemLine, painter, VIEW_COLOR_CROSSHAIR); updatePath(); } else if(rubberMode == OBJ_RUBBER_CIRCLE_1P_DIA) { QPointF sceneCenterPoint = objectRubberPoint("CIRCLE_CENTER"); QPointF sceneQSnapPoint = objectRubberPoint("CIRCLE_DIAMETER"); QPointF itemCenterPoint = mapFromScene(sceneCenterPoint); QPointF itemQSnapPoint = mapFromScene(sceneQSnapPoint); QLineF itemLine(itemCenterPoint, itemQSnapPoint); setObjectCenter(sceneCenterPoint); QLineF sceneLine(sceneCenterPoint, sceneQSnapPoint); qreal diameter = sceneLine.length(); setObjectDiameter(diameter); if(painter) drawRubberLine(itemLine, painter, VIEW_COLOR_CROSSHAIR); updatePath(); } else if(rubberMode == OBJ_RUBBER_CIRCLE_2P) { QPointF sceneTan1Point = objectRubberPoint("CIRCLE_TAN1"); QPointF sceneQSnapPoint = objectRubberPoint("CIRCLE_TAN2"); QLineF sceneLine(sceneTan1Point, sceneQSnapPoint); setObjectCenter(sceneLine.pointAt(0.5)); qreal diameter = sceneLine.length(); setObjectDiameter(diameter); updatePath(); } else if(rubberMode == OBJ_RUBBER_CIRCLE_3P) { QPointF sceneTan1Point = objectRubberPoint("CIRCLE_TAN1"); QPointF sceneTan2Point = objectRubberPoint("CIRCLE_TAN2"); QPointF sceneTan3Point = objectRubberPoint("CIRCLE_TAN3"); double sceneCenterX; double sceneCenterY; getArcCenter(sceneTan1Point.x(), sceneTan1Point.y(), sceneTan2Point.x(), sceneTan2Point.y(), sceneTan3Point.x(), sceneTan3Point.y(), &sceneCenterX, &sceneCenterY); QPointF sceneCenterPoint(sceneCenterX, sceneCenterY); QLineF sceneLine(sceneCenterPoint, sceneTan3Point); setObjectCenter(sceneCenterPoint); qreal radius = sceneLine.length(); setObjectRadius(radius); updatePath(); } else if(rubberMode == OBJ_RUBBER_GRIP) { if(painter) { QPointF gripPoint = objectRubberPoint("GRIP_POINT"); if(gripPoint == objectCenter()) { painter->drawEllipse(rect().translated(mapFromScene(objectRubberPoint(QString()))-mapFromScene(gripPoint))); } else { qreal gripRadius = QLineF(objectCenter(), objectRubberPoint(QString())).length(); painter->drawEllipse(QPointF(), gripRadius, gripRadius); } QLineF rubLine(mapFromScene(gripPoint), mapFromScene(objectRubberPoint(QString()))); drawRubberLine(rubLine, painter, VIEW_COLOR_CROSSHAIR); } } }