X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_AttributeSelection.cpp;h=be028e276f5cab1909cd0c0bdd9840588e7e1a4f;hb=8f2e8789faa06405e900ee2272858a8ca898ba32;hp=2353e002fd103eeb080cbc94032807d2d1c5bdea;hpb=711a187617f507dd582e4c048c3257b981cbfe1f;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index 2353e002f..be028e276 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -61,7 +61,7 @@ using namespace std; #ifdef DEB_NAMING #include #endif -/// adeed to the index in the packed map to signalize that the vertex of edge is seleted +/// added to the index in the packed map to signalize that the vertex of edge is selected /// (multiplied by the index of the edge) static const int kSTART_VERTEX_DELTA = 1000000; // identifier that there is simple reference: selection equals to context @@ -181,11 +181,16 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, std::shared_ptr Model_AttributeSelection::value() { + GeomShapePtr aResult; if (myTmpContext.get() || myTmpSubShape.get()) { - return myTmpSubShape; + ResultConstructionPtr aResulConstruction = std::dynamic_pointer_cast(myTmpContext); + if(aResulConstruction.get()) { + // it is just reference to construction. + return myTmpSubShape; + } + return myTmpSubShape.get() ? myTmpSubShape : myTmpContext->shape(); } - std::shared_ptr aResult; TDF_Label aSelLab = selectionLabel(); if (aSelLab.IsAttribute(kINVALID_SELECTION)) return aResult; @@ -247,7 +252,7 @@ bool Model_AttributeSelection::isInvalid() bool Model_AttributeSelection::isInitialized() { - if (ModelAPI_AttributeSelection::isInitialized()) { // additional checkings if it is initialized + if (ModelAPI_AttributeSelection::isInitialized()) { // additional checks if it is initialized std::shared_ptr aResult; if (myRef.isInitialized()) { TDF_Label aSelLab = selectionLabel(); @@ -320,7 +325,7 @@ void Model_AttributeSelection::setObject(const std::shared_ptr& TDF_LabelMap& Model_AttributeSelection::scope() { if (myScope.IsEmpty()) { // create a new scope if not yet done - // gets all featueres with named shapes that are bofore this feature label (before in history) + // gets all features with named shapes that are before this feature label (before in history) DocumentPtr aMyDoc = owner()->document(); std::list > allFeatures = aMyDoc->allFeatures(); std::list >::iterator aFIter = allFeatures.begin(); @@ -416,13 +421,27 @@ bool Model_AttributeSelection::update() std::shared_ptr aShape(new GeomAPI_Shape); aShape->setImpl(new TopoDS_Shape(aComp)); selectConstruction(aContext, aShape); + } else { + // For correct naming selection, put the shape into the naming structure. + // It seems sub-shapes are not needed: only this shape is (and can be ) selected. + TNaming_Builder aBuilder(aSelLab); + aBuilder.Generated(aContext->shape()->impl()); + std::shared_ptr aMyDoc = + std::dynamic_pointer_cast(owner()->document()); + std::string aName = aContext->data()->name(); + aMyDoc->addNamingName(aSelLab, aName); + TDataStd_Name::Set(aSelLab, aName.c_str()); } return setInvalidIfFalse(aSelLab, aContext->shape() && !aContext->shape()->isNull()); } if (aSelLab.IsAttribute(kPART_REF_ID)) { // it is reference to the part object std::shared_ptr aNoSelection; - return setInvalidIfFalse(aSelLab, selectPart(aContext, aNoSelection, true)); + bool aResult = selectPart(aContext, aNoSelection, true); + if (aResult) { + owner()->data()->sendAttributeUpdated(this); + } + return setInvalidIfFalse(aSelLab, aResult); } if (aContext->groupName() == ModelAPI_ResultBody::group()) { @@ -460,8 +479,8 @@ bool Model_AttributeSelection::update() return setInvalidIfFalse(aSelLab, false); } - if (aShapeType == TopAbs_FACE) { // compound is for the whole sketch selection - // If this is a wire with plane defined thin it is a sketch-like object + if (aShapeType == TopAbs_FACE || aShapeType == TopAbs_WIRE) { // compound is for the whole sketch selection + // If this is a wire with plane defined then it is a sketch-like object if (!aConstructionContext->facesNum()) // no faces, update can not work correctly return setInvalidIfFalse(aSelLab, false); // if there is no edges indexes, any face can be used: take the first @@ -469,7 +488,7 @@ bool Model_AttributeSelection::update() if (aNoIndexes) { aNewSelected = aConstructionContext->face(0); } else { // searching for most looks-like initial face by the indexes - // prepare edges of the current resut for the fast searching + // prepare edges of the current result for the fast searching NCollection_DataMap allCurves; // curves and orientations of edges const int aSubNum = aComposite->numberOfSubs(); for(int a = 0; a < aSubNum; a++) { @@ -538,6 +557,13 @@ bool Model_AttributeSelection::update() } } if (aNewSelected) { // store this new selection + if (aShapeType == TopAbs_WIRE) { // just get a wire from face to have wire + TopExp_Explorer aWireExp(aNewSelected->impl(), TopAbs_WIRE); + if (aWireExp.More()) { + aNewSelected.reset(new GeomAPI_Shape); + aNewSelected->setImpl(new TopoDS_Shape(aWireExp.Current())); + } + } selectConstruction(aContext, aNewSelected); owner()->data()->sendAttributeUpdated(this); return setInvalidIfFalse(aSelLab, true); @@ -672,6 +698,7 @@ static void registerSubShape(TDF_Label theMainLabel, TopoDS_Shape theShape, if (!theAdditionalName.empty()) aName<GetMap()); for(; aRef.More(); aRef.Next()) { aName<<"-"< aData = std::dynamic_pointer_cast(owner()->data()); TDF_Label aLab = myRef.myRef->Label(); - // identify the reuslts of sub-object of the composite by edges + // identify the results of sub-object of the composite by edges // save type of the selected shape in integer attribute TopAbs_ShapeEnum aShapeType = aSubShape.ShapeType(); TDataStd_Integer::Set(aLab, (int)aShapeType); @@ -837,7 +864,7 @@ bool Model_AttributeSelection::selectPart( } return true; // nothing to do, referencing just by name } - // store the shape (in case part is not loaded it should be usefull + // store the shape (in case part is not loaded it should be useful TopoDS_Shape aShape; std::string aName = theContext->data()->name(); if (!theSubShape.get() || theSubShape->isNull()) {// the whole part shape is selected