Engauge Digitizer 2
Loading...
Searching...
No Matches
CmdAddScale.cpp
Go to the documentation of this file.
1/******************************************************************************************************
2 * (C) 2017 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3 * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4 * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5 ******************************************************************************************************/
6
7#include "CmdAddScale.h"
8#include "Document.h"
9#include "DocumentSerialize.h"
10#include "EngaugeAssert.h"
11#include "Logger.h"
12#include "MainWindow.h"
13#include "QtToString.h"
14#include <QXmlStreamReader>
15#include "Xml.h"
16
17const QString CMD_DESCRIPTION ("Add scale point");
18
20 Document &document,
21 const QPointF &posScreen0,
22 const QPointF &posScreen1,
23 double scaleLength,
24 double ordinal0,
25 double ordinal1) :
26 CmdPointChangeBase (mainWindow,
27 document,
29 m_posScreen0 (posScreen0),
30 m_posScreen1 (posScreen1),
31 m_scaleLength (scaleLength),
32 m_ordinal0 (ordinal0),
33 m_ordinal1 (ordinal1)
34{
35 LOG4CPP_INFO_S ((*mainCat)) << "CmdAddScale::CmdAddScale"
36 << " posScreen0=" << QPointFToString (posScreen0).toLatin1 ().data ()
37 << " posScreen1=" << QPointFToString (posScreen1).toLatin1 ().data ()
38 << " scaleLength=" << scaleLength
39 << " ordinal0=" << ordinal0
40 << " ordinal1=" << ordinal1;
41}
42
44 Document &document,
45 const QString &cmdDescription,
46 QXmlStreamReader &reader) :
47 CmdPointChangeBase (mainWindow,
48 document,
49 cmdDescription)
50{
51 LOG4CPP_INFO_S ((*mainCat)) << "CmdAddScale::CmdAddScale";
52
53 QXmlStreamAttributes attributes = reader.attributes();
54
55 if (!attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_X) ||
56 !attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_Y) ||
57 !attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_X1) ||
58 !attributes.hasAttribute(DOCUMENT_SERIALIZE_SCREEN_Y1) ||
59 !attributes.hasAttribute(DOCUMENT_SERIALIZE_SCALE_LENGTH) ||
60 !attributes.hasAttribute(DOCUMENT_SERIALIZE_IDENTIFIER) ||
61 !attributes.hasAttribute(DOCUMENT_SERIALIZE_IDENTIFIER1) ||
62 !attributes.hasAttribute(DOCUMENT_SERIALIZE_ORDINAL) ||
63 !attributes.hasAttribute(DOCUMENT_SERIALIZE_ORDINAL1)) {
64 xmlExitWithError (reader,
65 QString ("Missing attribute(s) %1, %2, %3, %4, %5, %6, %7, %8 and/or %9")
75 }
76
77 m_posScreen0.setX(attributes.value(DOCUMENT_SERIALIZE_SCREEN_X).toDouble());
78 m_posScreen0.setY(attributes.value(DOCUMENT_SERIALIZE_SCREEN_Y).toDouble());
79 m_posScreen1.setX(attributes.value(DOCUMENT_SERIALIZE_SCREEN_X1).toDouble());
80 m_posScreen1.setY(attributes.value(DOCUMENT_SERIALIZE_SCREEN_Y1).toDouble());
81 m_scaleLength = attributes.value(DOCUMENT_SERIALIZE_SCALE_LENGTH).toDouble();
82 m_identifierAdded0 = attributes.value(DOCUMENT_SERIALIZE_IDENTIFIER).toString();
83 m_identifierAdded1 = attributes.value(DOCUMENT_SERIALIZE_IDENTIFIER1).toString();
84 m_ordinal0 = attributes.value(DOCUMENT_SERIALIZE_ORDINAL).toDouble();
85 m_ordinal1 = attributes.value(DOCUMENT_SERIALIZE_ORDINAL1).toDouble();
86}
87
91
93{
94 LOG4CPP_INFO_S ((*mainCat)) << "CmdAddScale::cmdRedo";
95
99 m_posScreen1,
100 m_scaleLength,
101 m_identifierAdded0,
102 m_identifierAdded1,
103 m_ordinal0,
104 m_ordinal1);
105 document().updatePointOrdinals (mainWindow().transformation());
108}
109
119
120void CmdAddScale::saveXml (QXmlStreamWriter &writer) const
121{
122 // For time coordinates, many digits of precision are needed since a typical date is 1,246,870,000 = July 6, 2009
123 // and we want seconds of precision
124 const char FORMAT = 'g';
125 const int PRECISION = 16;
126
127 writer.writeStartElement(DOCUMENT_SERIALIZE_CMD);
129 writer.writeAttribute(DOCUMENT_SERIALIZE_CMD_DESCRIPTION, QUndoCommand::text ());
130 writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_X, QString::number (m_posScreen0.x()));
131 writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_Y, QString::number (m_posScreen0.y()));
132 writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_X1, QString::number (m_posScreen1.x()));
133 writer.writeAttribute(DOCUMENT_SERIALIZE_SCREEN_Y1, QString::number (m_posScreen1.y()));
134 writer.writeAttribute(DOCUMENT_SERIALIZE_SCALE_LENGTH, QString::number (m_scaleLength, FORMAT, PRECISION));
135 writer.writeAttribute(DOCUMENT_SERIALIZE_IDENTIFIER, m_identifierAdded0);
136 writer.writeAttribute(DOCUMENT_SERIALIZE_IDENTIFIER1, m_identifierAdded1);
137 writer.writeAttribute(DOCUMENT_SERIALIZE_ORDINAL, QString::number (m_ordinal0));
138 writer.writeAttribute(DOCUMENT_SERIALIZE_ORDINAL1, QString::number (m_ordinal1));
139 writer.writeEndElement();
140}
const QString CMD_DESCRIPTION("Add scale point")
const QString DOCUMENT_SERIALIZE_SCREEN_X1
const QString DOCUMENT_SERIALIZE_IDENTIFIER
const QString DOCUMENT_SERIALIZE_CMD_ADD_SCALE
const QString DOCUMENT_SERIALIZE_ORDINAL1
const QString DOCUMENT_SERIALIZE_SCREEN_Y
const QString DOCUMENT_SERIALIZE_CMD
const QString DOCUMENT_SERIALIZE_ORDINAL
const QString DOCUMENT_SERIALIZE_SCREEN_X
const QString DOCUMENT_SERIALIZE_CMD_TYPE
const QString DOCUMENT_SERIALIZE_CMD_DESCRIPTION
const QString DOCUMENT_SERIALIZE_SCALE_LENGTH
const QString DOCUMENT_SERIALIZE_SCREEN_Y1
const QString DOCUMENT_SERIALIZE_IDENTIFIER1
log4cpp::Category * mainCat
Definition Logger.cpp:14
QString QPointFToString(const QPointF &pos)
void xmlExitWithError(QXmlStreamReader &reader, const QString &message)
Show specified message for an error while reading xml, then quit.
Definition Xml.cpp:25
Document & document()
Return the Document that this command will modify during redo and undo.
MainWindow & mainWindow()
Return the MainWindow so it can be updated by this command as a last step.
void saveOrCheckPostCommandDocumentStateHash(const Document &document)
Save, when called the first time, a hash value representing the state of the Document.
void saveOrCheckPreCommandDocumentStateHash(const Document &document)
Save, when called the first time, a hash value representing the state of the Document.
virtual void cmdRedo()
Redo method that is called when QUndoStack is moved one command forward.
virtual ~CmdAddScale()
CmdAddScale(MainWindow &mainWindow, Document &document, const QPointF &posScreen0, const QPointF &posScreen1, double scaleLength, double ordinal0, double ordinal1)
Constructor for normal creation.
virtual void cmdUndo()
Undo method that is called when QUndoStack is moved one command backward.
virtual void saveXml(QXmlStreamWriter &writer) const
Save commands as xml for later uploading.
Base class for CmdBase leaf subclasses that involve point additions, deletions and/or modifications.
void saveDocumentState(const Document &document)
Save the document state for restoration by restoreDocumentState.
void restoreDocumentState(Document &document) const
Restore the document previously saved by saveDocumentState.
Storage of one imported image and the data attached to that image.
Definition Document.h:42
void updatePointOrdinals(const Transformation &transformation)
Update point ordinals after point addition/removal or dragging.
void addScaleWithGeneratedIdentifier(const QPointF &posScreen0, const QPointF &posScreen1, double scaleLength, QString &identifier0, QString &identifier1, double ordinal0, double ordinal1)
Add scale with a generated point identifier.
Definition Document.cpp:228
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition MainWindow.h:92
void updateAfterCommand()
See GraphicsScene::updateAfterCommand.
#define LOG4CPP_INFO_S(logger)
Definition convenience.h:18