00001
00002
00003
00004
00005
00006
00007 #include "CmdAddPointsGraph.h"
00008 #include "DigitizeStateContext.h"
00009 #include "DigitizeStateSegment.h"
00010 #include "EngaugeAssert.h"
00011 #include "Logger.h"
00012 #include "MainWindow.h"
00013 #include "OrdinalGenerator.h"
00014 #include <QGraphicsPixmapItem>
00015 #include <QGraphicsScene>
00016 #include <QImage>
00017 #include "Segment.h"
00018 #include "SegmentFactory.h"
00019
00020 DigitizeStateSegment::DigitizeStateSegment (DigitizeStateContext &context) :
00021 DigitizeStateAbstractBase (context)
00022 {
00023 }
00024
00025 DigitizeStateSegment::~DigitizeStateSegment ()
00026 {
00027 }
00028
00029 QString DigitizeStateSegment::activeCurve () const
00030 {
00031 return context().mainWindow().selectedGraphCurve();
00032 }
00033
00034 void DigitizeStateSegment::begin (CmdMediator *cmdMediator,
00035 DigitizeState )
00036 {
00037 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::begin";
00038
00039 m_cmdMediator = cmdMediator;
00040
00041 setCursor(cmdMediator);
00042 context().setDragMode(QGraphicsView::NoDrag);
00043 context().mainWindow().updateViewsOfSettings(activeCurve ());
00044
00045 handleCurveChange(cmdMediator);
00046 }
00047
00048 QCursor DigitizeStateSegment::cursor(CmdMediator * ) const
00049 {
00050 LOG4CPP_DEBUG_S ((*mainCat)) << "DigitizeStateSegment::cursor";
00051
00052 return QCursor (Qt::ArrowCursor);
00053 }
00054
00055 void DigitizeStateSegment::end ()
00056 {
00057 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::end";
00058
00059 GraphicsScene &scene = context().mainWindow().scene();
00060 SegmentFactory segmentFactory ((QGraphicsScene &) scene,
00061 context().isGnuplot());
00062
00063 segmentFactory.clearSegments(m_segments);
00064 }
00065
00066 void DigitizeStateSegment::handleCurveChange(CmdMediator *cmdMediator)
00067 {
00068 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::handleCurveChange";
00069
00070 QImage img = context().mainWindow().imageFiltered();
00071
00072 GraphicsScene &scene = context().mainWindow().scene();
00073 SegmentFactory segmentFactory ((QGraphicsScene &) scene,
00074 context().isGnuplot());
00075
00076 segmentFactory.clearSegments (m_segments);
00077
00078
00079 segmentFactory.makeSegments (img,
00080 cmdMediator->document().modelSegments(),
00081 m_segments);
00082
00083
00084 QList<Segment*>::iterator itr;
00085 for (itr = m_segments.begin(); itr != m_segments.end(); itr++) {
00086 Segment *segment = *itr;
00087
00088 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::handleCurveChange"
00089 << " lines=" << segment->lineCount();
00090
00091 connect (segment, SIGNAL (signalMouseClickOnSegment (QPointF)), this, SLOT (slotMouseClickOnSegment (QPointF)));
00092 }
00093 }
00094
00095 void DigitizeStateSegment::handleKeyPress (CmdMediator * ,
00096 Qt::Key key,
00097 bool )
00098 {
00099 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::handleKeyPress"
00100 << " key=" << QKeySequence (key).toString ().toLatin1 ().data ();
00101 }
00102
00103 void DigitizeStateSegment::handleMouseMove (CmdMediator * ,
00104 QPointF )
00105 {
00106
00107 }
00108
00109 void DigitizeStateSegment::handleMousePress (CmdMediator * ,
00110 QPointF )
00111 {
00112 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::handleMousePress";
00113 }
00114
00115 void DigitizeStateSegment::handleMouseRelease (CmdMediator * ,
00116 QPointF )
00117 {
00118 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::handleMouseRelease";
00119 }
00120
00121 Segment *DigitizeStateSegment::segmentFromSegmentStart (const QPointF &posSegmentStart) const
00122 {
00123 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::segmentFromSegmentStart"
00124 << " segments=" << m_segments.count();
00125
00126 QList<Segment*>::const_iterator itr;
00127 for (itr = m_segments.begin(); itr != m_segments.end(); itr++) {
00128 Segment *segment = *itr;
00129
00130 if (segment->firstPoint() == posSegmentStart) {
00131
00132 return segment;
00133 }
00134 }
00135
00136 LOG4CPP_ERROR_S ((*mainCat)) << "DigitizeStateSegment::segmentFromSegmentStart";
00137 ENGAUGE_ASSERT (false);
00138 return 0;
00139 }
00140
00141 void DigitizeStateSegment::slotMouseClickOnSegment(QPointF posSegmentStart)
00142 {
00143 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::slotMouseClickOnSegment";
00144
00145 Segment *segment = segmentFromSegmentStart (posSegmentStart);
00146
00147
00148 QList<Segment*> segments;
00149 segments.push_back (segment);
00150
00151
00152 GraphicsScene &scene = context().mainWindow().scene();
00153 SegmentFactory segmentFactory ((QGraphicsScene &) scene,
00154 context().isGnuplot());
00155
00156 QList<QPoint> points = segmentFactory.fillPoints (m_cmdMediator->document().modelSegments(),
00157 segments);
00158
00159
00160 OrdinalGenerator ordinalGenerator;
00161 Document &document = m_cmdMediator->document ();
00162 const Transformation &transformation = context ().mainWindow ().transformation();
00163 QList<double> ordinals;
00164 QList<QPoint>::iterator itr;
00165 for (itr = points.begin(); itr != points.end(); itr++) {
00166
00167 QPoint point = *itr;
00168 ordinals << ordinalGenerator.generateCurvePointOrdinal(document,
00169 transformation,
00170 point,
00171 activeCurve ());
00172 }
00173
00174
00175 QUndoCommand *cmd = new CmdAddPointsGraph (context ().mainWindow(),
00176 document,
00177 context ().mainWindow().selectedGraphCurve(),
00178 points,
00179 ordinals);
00180 context().appendNewCmd(m_cmdMediator,
00181 cmd);
00182 }
00183
00184 QString DigitizeStateSegment::state() const
00185 {
00186 return "DigitizeStateSegment";
00187 }
00188
00189 void DigitizeStateSegment::updateModelDigitizeCurve (CmdMediator * ,
00190 const DocumentModelDigitizeCurve & )
00191 {
00192 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::updateModelDigitizeCurve";
00193 }
00194
00195 void DigitizeStateSegment::updateModelSegments(const DocumentModelSegments &modelSegments)
00196 {
00197 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSegment::updateModelSegments";
00198
00199 QList<Segment*>::const_iterator itr;
00200 for (itr = m_segments.begin(); itr != m_segments.end(); itr++) {
00201 Segment *segment = *itr;
00202
00203 segment->updateModelSegment (modelSegments);
00204 }
00205 }