2 * ModuleBase_Operation.cpp
4 * Created on: Apr 2, 2014
8 #include "ModuleBase_Operation.h"
10 #include <ModelAPI_AttributeDouble.h>
11 #include <ModelAPI_Document.h>
12 #include <ModelAPI_Feature.h>
13 #include <ModelAPI_Data.h>
14 #include <ModelAPI_PluginManager.h>
15 #include <ModelAPI_Document.h>
23 \param XGUI_Workshop - workshop for this operation
25 Constructs an empty operation. Constructor should work very fast because many
26 operators may be created after starting workshop but only several from them
27 may be used. As result this constructor stores given workshop in myApp field
28 and set Waiting status.
30 ModuleBase_Operation::ModuleBase_Operation(const QString& theId, QObject* parent)
34 myExecStatus(Rejected),
42 ModuleBase_Operation::~ModuleBase_Operation()
48 * \brief Unique name of the operation
50 * Returns string name of the operation.
52 QString ModuleBase_Operation::operationId() const
57 std::shared_ptr<ModelAPI_Feature> ModuleBase_Operation::feature() const
63 * \brief Gets state of operation
64 * \return Value from OperationState enumeration
66 * Gets state of operation (see OperationState enumeration)
68 ModuleBase_Operation::OperationState ModuleBase_Operation::state() const
74 * \brief Verifies whether operation is an ran one (state()==Running)
75 * \return TRUE if operation is active, FALSE otherwise
77 * Verifies whether operation is an running. Returns TRUE if state of operator
80 bool ModuleBase_Operation::isRunning() const
82 return state() == Running;
86 * \brief Verifies whether given operator is valid for this one
87 * \param theOtherOp - other operation
88 * \return Returns TRUE if the given operator is valid for this one
90 * Verifies whether given operator is valid for this one (i.e. can be started "above"
93 bool ModuleBase_Operation::isValid(ModuleBase_Operation*) const
99 * \brief Verifies whether this operator can be always started above any already running one
100 * \return Returns TRUE if current operation must not be checked for ActiveOperation->IsValid( this )
102 * This method must be redefined in derived operation if operation of derived class
103 * must be always can start above any launched one. Default implementation returns FALSE,
104 * so it is being checked for IsValid, but some operations may overload IsGranted()
105 * In this case they will always start, no matter what operation is running.
107 bool ModuleBase_Operation::isGranted() const
113 * Returns pointer to the root document.
115 std::shared_ptr<ModelAPI_Document> ModuleBase_Operation::document() const
117 return ModelAPI_PluginManager::get()->rootDocument();
121 * \brief Sets slot which is called when operation is started
122 * \param theReceiver - object containing slot
123 * \param theSlot - slot of theReceiver object
124 * \return TR if slot was connected successfully, FALSE otherwise
126 * Sets slot which is called when operation is started. There is no point in
127 * using this method. It would be better to inherit own operator from base
128 * one and redefine startOperation method
130 bool ModuleBase_Operation::setSlot(const QObject* theReceiver, const char* theSlot)
132 return connect(this, SIGNAL(callSlot()), theReceiver, theSlot);
136 * \brief Sets the flags of operation
137 * \param f - flags of operation to be set
139 * Sets flags of operation (see Flags enumeration)
141 void ModuleBase_Operation::setFlags(const int f)
143 myFlags = myFlags | f;
147 * \brief Clears the flags of operation
148 * \param f - flags of operation to be cleared
150 * Clears flags of operation (see Flags enumeration)
152 void ModuleBase_Operation::clearFlags(const int f)
154 myFlags = myFlags & ~f;
158 * \brief Test the flags of operation
159 * \param f - flags of operation to be tested
161 * Returns TRUE if the specified flags set in the operation (see Flags enumeration)
163 bool ModuleBase_Operation::testFlags(const int f) const
165 return (myFlags & f) == f;
169 * \brief Gets execution status
170 * \return Execution status
172 * Gets execution status
174 int ModuleBase_Operation::execStatus() const
180 * \brief Returns XML representation of the operation's widget.
181 * \return XML QString
183 * Returns XML representation of the operation's widget.
185 const QString& ModuleBase_Operation::xmlRepresentation() const
191 * \brief Sets XML representation of the operation's widget.
192 * \param xmlRepr - XML QString
194 * Sets XML representation of the operation's widget.
196 void ModuleBase_Operation::setXmlRepresentation(const QString& xmlRepr)
202 * \brief Starts operation
204 * Public slot. Verifies whether operation can be started and starts operation.
205 * This slot is not virtual and cannot be redefined. Redefine startOperation method
206 * to change behavior of operation. There is no point in using this method. It would
207 * be better to inherit own operator from base one and redefine startOperation method
210 void ModuleBase_Operation::start()
212 //document()->start(this);
213 document()->startOperation();
220 * \brief Aborts operation
222 * Public slot. Aborts operation. This slot is not virtual and cannot be redefined.
223 * Redefine abortOperation method to change behavior of operation instead
225 void ModuleBase_Operation::abort()
233 document()->abortOperation();
238 * \brief Commits operation
240 * Public slot. Commits operation. This slot is not virtual and cannot be redefined.
241 * Redefine commitOperation method to change behavior of operation instead
243 void ModuleBase_Operation::commit()
251 document()->finishOperation();
256 * \brief Stores a real value in model.
257 * \param theValue - to store
259 * Public slot. Passes theValue into the model.
261 void ModuleBase_Operation::storeReal(double theValue)
265 qDebug() << "ModuleBase_Operation::storeReal: " <<
266 "trying to store value without opening a transaction.";
270 QString anId = sender()->objectName();
271 std::shared_ptr<ModelAPI_Data> aData = myFeature->data();
272 std::shared_ptr<ModelAPI_AttributeDouble> aReal = aData->real(anId.toStdString());
273 aReal->setValue(theValue);
277 * \brief Verifies whether operator is ready to start.
278 * \return TRUE if operation is ready to start
280 * Default implementation returns TRUE. Redefine this method to add own verifications
282 bool ModuleBase_Operation::isReadyToStart() const
288 * \brief Virtual method called when operation is started
290 * Virtual method called when operation started (see start() method for more description)
291 * Default implementation calls corresponding slot and commits immediately.
293 void ModuleBase_Operation::startOperation()
295 std::shared_ptr<ModelAPI_Document> aDoc = ModelAPI_PluginManager::get()->rootDocument();
296 myFeature = aDoc->addFeature(myOperationId.toStdString());
297 if (myFeature) // TODO: generate an error if feature was not created
298 myFeature->execute();
304 * \brief Virtual method called when operation is started
306 * Virtual method called when operation stopped - committed or aborted.
308 void ModuleBase_Operation::stopOperation()
313 * \brief Virtual method called when operation aborted
315 * Virtual method called when operation aborted (see abort() method for more description)
317 void ModuleBase_Operation::abortOperation()
322 * \brief Virtual method called when operation committed
324 * Virtual method called when operation committed (see commit() method for more description)
326 void ModuleBase_Operation::commitOperation()
328 if (myFeature) myFeature->execute();
332 * \brief Sets execution status
333 * \param theStatus - execution status
335 * Sets myExecStatus to the given value
337 void ModuleBase_Operation::setExecStatus(const int theVal)
339 myExecStatus = (ExecStatus) theVal;
343 * \brief Sets state of operation
344 * \param theState - state of operation to be set
346 * Sets state of operation (see OperationState enumeration)
348 void ModuleBase_Operation::setState(const ModuleBase_Operation::OperationState theState)