The "Return", "Escape" buttons processing.
#include <ModelAPI_Document.h>
#include <ModelAPI_Feature.h>
#include <ModelAPI_Data.h>
-#include <ModelAPI_PluginManager.h>
#include <ModelAPI_Document.h>
#ifdef _DEBUG
void ModuleBase_Operation::startOperation()
{
- boost::shared_ptr<ModelAPI_Document> aDoc = ModelAPI_PluginManager::get()->rootDocument();
- myFeature = aDoc->addFeature(getDescription()->operationId().toStdString());
- if (myFeature) // TODO: generate an error if feature was not created
- myFeature->execute();
+ createFeature();
//emit callSlot();
//commit();
}
{
if (myFeature) myFeature->execute();
}
+
+void ModuleBase_Operation::createFeature()
+{
+ boost::shared_ptr<ModelAPI_Document> aDoc = document();
+ myFeature = aDoc->addFeature(getDescription()->operationId().toStdString());
+ if (myFeature) // TODO: generate an error if feature was not created
+ myFeature->execute();
+}
/// Virtual method called when operation committed (see commit() method for more description)
virtual void commitOperation();
+ /// Creates a new feature and save it in the operation internal field
+ virtual void createFeature();
+
private:
boost::shared_ptr<ModelAPI_Feature> myFeature; /// the operation feature to be handled
};
if (aPreviewOp) {
visualizePreview(aPreviewOp->feature(), true);
- connect(aPreviewOp, SIGNAL(featureConstructed(boost::shared_ptr<ModelAPI_Feature>)),
- this, SLOT(onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature>)));
+ connect(aPreviewOp, SIGNAL(featureConstructed(boost::shared_ptr<ModelAPI_Feature>, int)),
+ this, SLOT(onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature>, int)));
PartSet_OperationSketch* aSketchOp = dynamic_cast<PartSet_OperationSketch*>(aPreviewOp);
if (aSketchOp) {
myWorkshop->actionsMgr()->setNestedActionsEnabled(true);
}
-void PartSet_Module::onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature)
+void PartSet_Module::onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature,
+ int theMode)
{
- visualizePreview(theFeature, true);
+ bool isDisplay = theMode != PartSet_OperationSketchBase::FM_Abort;
+ visualizePreview(theFeature, isDisplay);
}
void PartSet_Module::visualizePreview(boost::shared_ptr<ModelAPI_Feature> theFeature, bool isDisplay)
if (isDisplay) {
boost::shared_ptr<GeomAPI_Shape> aPreview = aPreviewOp->preview(theFeature);
if (aPreview) {
- aDisplayer->DisplayInLocalContext(theFeature, aPreview->impl<TopoDS_Shape>(),
- aPreviewOp->getSelectionMode(theFeature));
+ aDisplayer->RedisplayInLocalContext(theFeature, aPreview->impl<TopoDS_Shape>(),
+ aPreviewOp->getSelectionMode(theFeature));
}
}
else {
- aDisplayer->CloseLocalContexts(false);
+ //aDisplayer->CloseLocalContexts(false);
aDisplayer->Erase(anOperation->feature());
}
}
/// SLOT, to visualize the feature in another local context mode
/// \param theFeature the feature to be put in another local context mode
- void onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature);
+ /// \param theMode the mode appeared on the feature
+ void onFeatureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature,
+ int theMode);
private:
XGUI_Workshop* myWorkshop;
class PARTSET_EXPORT PartSet_OperationSketchBase : public ModuleBase_Operation
{
Q_OBJECT
+public:
+ enum FeatureActionMode { FM_Activation, FM_Deactivation, FM_Abort };
+
public:
/// Constructor
/// \param theId an feature index
signals:
/// Signal about the feature construing is finished
/// \param theFeature the result feature
- void featureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature);
+ /// \param theMode the mode of the feature modification
+ void featureConstructed(boost::shared_ptr<ModelAPI_Feature> theFeature,
+ int theMode);
public:
/// temporary code to provide edition mode
setLinePoint(aPrevFeature, LINE_ATTR_END, LINE_ATTR_START);
myPointSelectionMode = SM_SecondPoint;
- emit featureConstructed(aPrevFeature);
+ emit featureConstructed(aPrevFeature, FM_Deactivation);
}
break;
default:
void PartSet_OperationSketchLine::keyReleased(const int theKey)
{
switch (theKey) {
- case Qt::Key_Escape:
+ case Qt::Key_Escape: {
+ if (myPointSelectionMode != SM_None)
+ emit featureConstructed(feature(), FM_Abort);
abort();
- break;
- case Qt::Key_Enter:
- //myPointSelectionMode = myPointSelectionMode;
- break;
+ }
+ break;
+ case Qt::Key_Return: {
+ if (myPointSelectionMode != SM_None) {
+ emit featureConstructed(feature(), FM_Abort);
+ myPointSelectionMode = SM_FirstPoint;
+ document()->abortOperation();
+ }
+ }
+ break;
default:
- break;
+ break;
}
}
void PartSet_OperationSketchLine::startOperation()
{
PartSet_OperationSketchBase::startOperation();
-
- if (mySketch) {
- boost::shared_ptr<SketchPlugin_Feature> aFeature =
- boost::dynamic_pointer_cast<SketchPlugin_Feature>(mySketch);
-
- aFeature->addSub(feature());
- }
myPointSelectionMode = SM_FirstPoint;
}
myPointSelectionMode = SM_None;
}
+void PartSet_OperationSketchLine::createFeature()
+{
+ PartSet_OperationSketchBase::createFeature();
+ if (mySketch) {
+ boost::shared_ptr<SketchPlugin_Feature> aFeature =
+ boost::dynamic_pointer_cast<SketchPlugin_Feature>(mySketch);
+
+ aFeature->addSub(feature());
+ }
+ //emit featureConstructed(aPrevFeature, FM_Activation);
+}
+
void PartSet_OperationSketchLine::setLinePoint(const gp_Pnt& thePoint,
const std::string& theAttribute)
{
/// After the parent operation body perform, reset selection point mode of the operation
virtual void stopOperation();
+ /// Creates a new feature and save it in the operation internal field.
+ /// In addition to the default realization it set a sketch feature to the created feature
+ virtual void createFeature();
+
protected:
/// \brief Save the point to the line.
/// \param thePoint the 3D point in the viewer
continue;
aContext->Erase(anAISShape);
}
+ myFeature2AISObjectMap.erase(theFeature);
if (isUpdateViewer)
aContext->UpdateCurrentViewer();
}
-void XGUI_Displayer::DisplayInLocalContext(boost::shared_ptr<ModelAPI_Feature> theFeature,
- const TopoDS_Shape& theShape,
- const int theMode, const bool isUpdateViewer)
+void XGUI_Displayer::RedisplayInLocalContext(boost::shared_ptr<ModelAPI_Feature> theFeature,
+ const TopoDS_Shape& theShape,
+ const int theMode, const bool isUpdateViewer)
{
Handle(AIS_InteractiveContext) aContext = AISContext();
}
aDispAIS.push_back(anAIS);
myFeature2AISObjectMap[theFeature] = aDispAIS;
- aContext->Display(anAIS, Standard_False);
-
- AIS_ListOfInteractive anAISList;
- anAISList.Append(anAIS);
- activateInLocalContext(anAISList, theMode, true);
-}
-
-void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer)
-{
- closeAllContexts(true);
-}
-void XGUI_Displayer::activateInLocalContext(const AIS_ListOfInteractive& theAISObjects, const int theMode,
- const bool isUpdateViewer)
-{
Handle(AIS_InteractiveContext) ic = AISContext();
// Open local context if there is no one
- bool allObjects = false; // calculate by AIS shape
if (!ic->HasOpenedContext()) {
ic->ClearCurrents(false);
- ic->OpenLocalContext(allObjects, true, true);
+ ic->OpenLocalContext(false/*use displayed objects*/, /*true*/false/*use displayed objects*/,
+ true/*allow shape decomposition*/);
}
-
// Activate selection of objects from prs
- AIS_ListIteratorOfListOfInteractive aIter(theAISObjects);
- for (; aIter.More(); aIter.Next()) {
- Handle(AIS_InteractiveObject) anAIS = aIter.Value();
- if (!anAIS.IsNull()) {
- if (anAIS->IsKind(STANDARD_TYPE(AIS_Shape))) {
- ic->Load(anAIS, -1, false);
- ic->Activate(anAIS, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)theMode));
- }
- else if (anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron)) {
- ic->Load(anAIS, -1, false);
- ic->Activate(anAIS, theMode);
- }
+ if (!anAIS.IsNull()) {
+ if (anAIS->IsKind(STANDARD_TYPE(AIS_Shape))) {
+ ic->Display(anAIS, 0/*display mode*/, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)theMode),
+ false/*update viewer*/, true/*allow decomposition*/);
+ /*if (theMode == TopAbs_VERTEX) {
+ ic->ActivateStandardMode(TopAbs_EDGE);
+ ic->ActivateStandardMode(TopAbs_VERTEX);
+ }*/
}
}
if (isUpdateViewer)
ic->UpdateCurrentViewer();
}
+void XGUI_Displayer::CloseLocalContexts(const bool isUpdateViewer)
+{
+ closeAllContexts(true);
+}
+
void XGUI_Displayer::closeAllContexts(const bool isUpdateViewer)
{
Handle(AIS_InteractiveContext) ic = AISContext();
/// \param theShape a shape
/// \param theMode a local selection mode
/// \param isUpdateViewer the parameter whether the viewer should be update immediatelly
- void DisplayInLocalContext(boost::shared_ptr<ModelAPI_Feature> theFeature,
+ void RedisplayInLocalContext(boost::shared_ptr<ModelAPI_Feature> theFeature,
const TopoDS_Shape& theShape,
const int theMode, const bool isUpdateViewer = true);
void CloseLocalContexts(const bool isUpdateViewer = true);
protected:
- /// Activate local selection
- /// \param theAIS the list of objects
- /// \param theMode the selection mode
- /// \param isUpdateViewer the state wether the viewer should be updated immediatelly
- void activateInLocalContext(const AIS_ListOfInteractive& theAISObjects, const int theMode,
- const bool isUpdateViewer);
/// Deactivate local selection
/// \param isUpdateViewer the state wether the viewer should be updated immediatelly
void closeAllContexts(const bool isUpdateViewer);