void LineObject::updateRubber(QPainter* painter) { int rubberMode = objectRubberMode(); if(rubberMode == OBJ_RUBBER_LINE) { QPointF sceneStartPoint = objectRubberPoint("LINE_START"); QPointF sceneQSnapPoint = objectRubberPoint("LINE_END"); setObjectEndPoint1(sceneStartPoint); setObjectEndPoint2(sceneQSnapPoint); drawRubberLine(line(), painter, VIEW_COLOR_CROSSHAIR); } else if(rubberMode == OBJ_RUBBER_GRIP) { if(painter) { QPointF gripPoint = objectRubberPoint("GRIP_POINT"); if (gripPoint == objectEndPoint1()) painter->drawLine(line().p2(), mapFromScene(objectRubberPoint(QString()))); else if(gripPoint == objectEndPoint2()) painter->drawLine(line().p1(), mapFromScene(objectRubberPoint(QString()))); else if(gripPoint == objectMidPoint()) painter->drawLine(line().translated(mapFromScene(objectRubberPoint(QString()))-mapFromScene(gripPoint))); QLineF rubLine(mapFromScene(gripPoint), mapFromScene(objectRubberPoint(QString()))); drawRubberLine(rubLine, painter, VIEW_COLOR_CROSSHAIR); } } }
void LineObject::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* /*widget*/) { QGraphicsScene* objScene = scene(); if(!objScene) return; QPen paintPen = pen(); painter->setPen(paintPen); updateRubber(painter); if(option->state & QStyle::State_Selected) { paintPen.setStyle(Qt::DashLine); } if(objScene->property(ENABLE_LWT).toBool()) { paintPen = lineWeightPen(); } painter->setPen(paintPen); if(objectRubberMode() != OBJ_RUBBER_LINE) painter->drawLine(line()); //TODO: This is the initial concept for what realistic rendering be like. It's somewhat decent but needs improvement. if(objScene->property(ENABLE_LWT).toBool() && objScene->property(ENABLE_REAL).toBool()) { painter->setPen(objectColor().darker(150)); //TODO: Improve this for black and dark colors QPainterPathStroker stroker; stroker.setWidth(0.35); stroker.setCapStyle(Qt::RoundCap); stroker.setJoinStyle(Qt::RoundJoin); QPainterPath realPath = stroker.createStroke(path()); painter->drawPath(realPath); QLinearGradient grad(mapFromScene(objectMidPoint()), mapFromScene(objectEndPoint1())); grad.setColorAt(0, objectColor()); grad.setColorAt(1, objectColor().darker(150)); //TODO: Improve this for black and dark colors grad.setSpread(QGradient::ReflectSpread); painter->fillPath(realPath, QBrush(grad)); } }
void RectObject::updateRubber(QPainter* painter) { int rubberMode = objectRubberMode(); if(rubberMode == OBJ_RUBBER_RECTANGLE) { QPointF sceneStartPoint = objectRubberPoint("RECTANGLE_START"); QPointF sceneEndPoint = objectRubberPoint("RECTANGLE_END"); qreal x = sceneStartPoint.x(); qreal y = sceneStartPoint.y(); qreal w = sceneEndPoint.x() - sceneStartPoint.x(); qreal h = sceneEndPoint.y() - sceneStartPoint.y(); setObjectRect(x,y,w,h); updatePath(); } }
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 PolygonObject::updateRubber(QPainter* painter) { int rubberMode = objectRubberMode(); if(rubberMode == OBJ_RUBBER_POLYGON) { setObjectPos(objectRubberPoint("POLYGON_POINT_0")); bool ok = false; QString numStr = objectRubberText("POLYGON_NUM_POINTS"); if(numStr.isNull()) return; int num = numStr.toInt(&ok); if(!ok) return; QString appendStr; QPainterPath rubberPath; rubberPath.moveTo(mapFromScene(objectRubberPoint("POLYGON_POINT_0"))); for(int i = 1; i <= num; i++) { appendStr = "POLYGON_POINT_" + QString().setNum(i); QPointF appendPoint = mapFromScene(objectRubberPoint(appendStr)); rubberPath.lineTo(appendPoint); } //rubberPath.lineTo(0,0); updatePath(rubberPath); //Ensure the path isn't updated until the number of points is changed again setObjectRubberText("POLYGON_NUM_POINTS", QString()); } else if(rubberMode == OBJ_RUBBER_POLYGON_INSCRIBE) { setObjectPos(objectRubberPoint("POLYGON_CENTER")); quint16 numSides = objectRubberPoint("POLYGON_NUM_SIDES").x(); QPointF inscribePoint = mapFromScene(objectRubberPoint("POLYGON_INSCRIBE_POINT")); QLineF inscribeLine = QLineF(QPointF(0,0), inscribePoint); qreal inscribeAngle = inscribeLine.angle(); qreal inscribeInc = 360.0/numSides; if(painter) drawRubberLine(inscribeLine, painter, VIEW_COLOR_CROSSHAIR); QPainterPath inscribePath; //First Point inscribePath.moveTo(inscribePoint); //Remaining Points for(int i = 1; i < numSides; i++) { inscribeLine.setAngle(inscribeAngle + inscribeInc*i); inscribePath.lineTo(inscribeLine.p2()); } updatePath(inscribePath); } else if(rubberMode == OBJ_RUBBER_POLYGON_CIRCUMSCRIBE) { setObjectPos(objectRubberPoint("POLYGON_CENTER")); quint16 numSides = objectRubberPoint("POLYGON_NUM_SIDES").x(); QPointF circumscribePoint = mapFromScene(objectRubberPoint("POLYGON_CIRCUMSCRIBE_POINT")); QLineF circumscribeLine = QLineF(QPointF(0,0), circumscribePoint); qreal circumscribeAngle = circumscribeLine.angle(); qreal circumscribeInc = 360.0/numSides; if(painter) drawRubberLine(circumscribeLine, painter, VIEW_COLOR_CROSSHAIR); QPainterPath circumscribePath; //First Point QLineF prev(circumscribeLine.p2(), QPointF(0,0)); prev = prev.normalVector(); circumscribeLine.setAngle(circumscribeAngle + circumscribeInc); QLineF perp(circumscribeLine.p2(), QPointF(0,0)); perp = perp.normalVector(); QPointF iPoint; perp.intersect(prev, &iPoint); circumscribePath.moveTo(iPoint); //Remaining Points for(int i = 2; i <= numSides; i++) { prev = perp; circumscribeLine.setAngle(circumscribeAngle + circumscribeInc*i); perp = QLineF(circumscribeLine.p2(), QPointF(0,0)); perp = perp.normalVector(); perp.intersect(prev, &iPoint); circumscribePath.lineTo(iPoint); } updatePath(circumscribePath); } else if(rubberMode == OBJ_RUBBER_GRIP) { if(painter) { int elemCount = normalPath.elementCount(); QPointF gripPoint = objectRubberPoint("GRIP_POINT"); if(gripIndex == -1) gripIndex = findIndex(gripPoint); if(gripIndex == -1) return; int m = 0; int n = 0; if(!gripIndex) { m = elemCount-1; n = 1; } else if(gripIndex == elemCount-1) { m = elemCount-2; n = 0; } else { m = gripIndex-1; n = gripIndex+1; } QPainterPath::Element em = normalPath.elementAt(m); QPainterPath::Element en = normalPath.elementAt(n); QPointF emPoint = QPointF(em.x, em.y); QPointF enPoint = QPointF(en.x, en.y); painter->drawLine(emPoint, mapFromScene(objectRubberPoint(QString()))); painter->drawLine(enPoint, mapFromScene(objectRubberPoint(QString()))); QLineF rubLine(mapFromScene(gripPoint), mapFromScene(objectRubberPoint(QString()))); drawRubberLine(rubLine, painter, VIEW_COLOR_CROSSHAIR); } } }
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); } } }