From 067600d72f6fb538deb4e9232964bb42f18745f7 Mon Sep 17 00:00:00 2001 From: nds Date: Wed, 29 Oct 2014 17:54:04 +0300 Subject: [PATCH] refs #156: Behavior of the Sketch during edition Edit Multi operation is correct to modify the feature attribute only. --- src/PartSet/PartSet_OperationFeatureEditMulti.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/PartSet/PartSet_OperationFeatureEditMulti.cpp b/src/PartSet/PartSet_OperationFeatureEditMulti.cpp index c513216ba..de16634b3 100644 --- a/src/PartSet/PartSet_OperationFeatureEditMulti.cpp +++ b/src/PartSet/PartSet_OperationFeatureEditMulti.cpp @@ -64,6 +64,8 @@ bool isContains(const QList& theSelected, const ModuleBase void PartSet_OperationFeatureEditMulti::initSelection(ModuleBase_ISelection* theSelection, ModuleBase_IViewer* theViewer) { + // 1. unite selected and hightlighted objects in order to have an opportunity to drag + // by the highlighted object QList aFeatures; aFeatures = theSelection->getSelected(); QList aHighlighted = theSelection->getHighlighted(); @@ -73,8 +75,7 @@ void PartSet_OperationFeatureEditMulti::initSelection(ModuleBase_ISelection* the aFeatures.append(aPrs); } - // firstly iterate the operation presentations and move all features - // if there is no selected vertex shape for it. Create a set of moved features + // 1. find all features with skipping features with selected vertex shapes myFeature2Attribute.clear(); // firstly, collect the features without local selection std::set aMovedFeatures; @@ -93,12 +94,15 @@ void PartSet_OperationFeatureEditMulti::initSelection(ModuleBase_ISelection* the FeaturePtr aFeature = ModelAPI_Feature::feature(aObject); if (aFeature && myFeature2Attribute.find(aFeature) == myFeature2Attribute.end()) { std::list aList; + // using an empty list as a sign, that this feature should be moved itself myFeature2Attribute[aFeature] = aList; } } } - // secondly, collect the features with a local selection on them + // 2. collect the features with a local selection on them. // if the list already has this feature, the local selection is skipped + // that means that if the selection contains a feature and a feature with local selected point, + // the edit is performed for a full feature Handle(V3d_View) aView = theViewer->activeView(); foreach (ModuleBase_ViewerPrs aPrs, aFeatures) { const TopoDS_Shape& aShape = aPrs.shape(); @@ -113,14 +117,13 @@ void PartSet_OperationFeatureEditMulti::initSelection(ModuleBase_ISelection* the if (!aFeature) continue; // if the feature is already moved, do nothing for this feature local selection - if (myFeature2Attribute.find(aFeature) != myFeature2Attribute.end()) continue; + // append the attribute of the vertex if it is found on the current feature gp_Pnt aPoint = BRep_Tool::Pnt(aVertex); double aVX, aVY; PartSet_Tools::convertTo2D(aPoint, sketch(), aView, aVX, aVY); - boost::shared_ptr aPoint2D = PartSet_Tools::getFeaturePoint( aFeature, aVX, aVY); std::string anAttribute = aFeature->data()->id(aPoint2D); @@ -169,6 +172,7 @@ void PartSet_OperationFeatureEditMulti::mouseMoved(QMouseEvent* theEvent, Module while (aFeatIter != myFeature2Attribute.end()) { FeaturePtr aFeature = aFeatIter->first; std::list anAttributes = aFeatIter->second; + // perform edit for the feature if (anAttributes.empty()) { boost::shared_ptr aSketchFeature = boost::dynamic_pointer_cast(aFeature); @@ -176,6 +180,7 @@ void PartSet_OperationFeatureEditMulti::mouseMoved(QMouseEvent* theEvent, Module aSketchFeature->move(aDeltaX, aDeltaY); } } + // perform edit for the feature's attribute else { std::list::const_iterator anAttrIter = anAttributes.begin(), anAttrEnd = anAttributes.end(); -- 2.39.2