X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModel%2FModel_AttributeSelection.cpp;h=03ccb8984e47be420ea1d0c204d1374a0dc98cda;hb=0b503091623876eda1ae9214e32f8831ef03778b;hp=53c04b6863ad4cb7fd7eb1dea4ce00907a292e21;hpb=83bb88d84077d060259edddf8b789d88685800a6;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index 53c04b686..03ccb8984 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -61,6 +61,7 @@ using namespace std; static const int kSTART_VERTEX_DELTA = 1000000; // identifier that there is simple reference: selection equals to context Standard_GUID kSIMPLE_REF_ID("635eacb2-a1d6-4dec-8348-471fae17cb29"); +Standard_GUID kCONSTUCTION_SIMPLE_REF_ID("635eacb2-a1d6-4dec-8348-471fae17cb28"); // on this label is stored: // TNaming_NamedShape - selected shape @@ -73,19 +74,18 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, const std::shared_ptr& theSubShape) { const std::shared_ptr& anOldShape = value(); - bool isOldShape = + bool isOldContext = theContext == myRef.value(); + bool isOldShape = isOldContext && (theSubShape == anOldShape || (theSubShape && anOldShape && theSubShape->isEqual(anOldShape))); if (isOldShape) return; // shape is the same, so context is also unchanged // update the referenced object if needed - bool isOldContext = theContext == myRef.value(); - - if (!isOldContext) myRef.setValue(theContext); // do noth use naming if selected shape is result shape itself, but not sub-shape TDF_Label aSelLab = selectionLabel(); aSelLab.ForgetAttribute(kSIMPLE_REF_ID); + aSelLab.ForgetAttribute(kCONSTUCTION_SIMPLE_REF_ID); if (theContext->groupName() == ModelAPI_ResultBody::group()) { // do not select the whole shape for body:it is already must be in the data framework if (theContext->shape().get() && theContext->shape()->isEqual(theSubShape)) { @@ -95,7 +95,13 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext, selectBody(theContext, theSubShape); } } else if (theContext->groupName() == ModelAPI_ResultConstruction::group()) { - selectConstruction(theContext, theSubShape); + if (!theSubShape.get()) { + // to sub, so the whole result is selected + aSelLab.ForgetAllAttributes(true); + TDataStd_UAttribute::Set(aSelLab, kCONSTUCTION_SIMPLE_REF_ID); + } else { + selectConstruction(theContext, theSubShape); + } } myIsInitialized = true; @@ -123,6 +129,9 @@ std::shared_ptr Model_AttributeSelection::value() return aResult; // empty result return aContext->shape(); } + if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value + return aResult; // empty result + } Handle(TNaming_NamedShape) aSelection; if (selectionLabel().FindAttribute(TNaming_NamedShape::GetID(), aSelection)) { @@ -188,6 +197,9 @@ bool Model_AttributeSelection::update() if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // it is just reference to shape, not sub-shape return aContext->shape() && !aContext->shape()->isNull(); } + if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, not sub-shape + return aContext->shape() && !aContext->shape()->isNull(); + } if (aContext->groupName() == ModelAPI_ResultBody::group()) { // body: just a named shape, use selection mechanism from OCCT @@ -222,7 +234,7 @@ bool Model_AttributeSelection::update() return false; } - if (aShapeType == TopAbs_FACE) { + 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 std::list > aFaces; GeomAlgoAPI_SketchBuilder::createFaces(aWirePtr->origin(), aWirePtr->dirX(), @@ -611,8 +623,11 @@ std::string Model_AttributeSelection::namingName() std::shared_ptr aSubSh = value(); ResultPtr aCont = context(); aName = "Undefined name"; - if(!aSubSh.get() || aSubSh->isNull() || !aCont.get() || aCont->shape()->isNull()) + if(!aCont.get() || aCont->shape()->isNull()) return aName; + if (!aSubSh.get() || aSubSh->isNull()) { // no subshape, so just the whole feature name + return aCont->data()->name(); + } TopoDS_Shape aSubShape = aSubSh->impl(); TopoDS_Shape aContext = aCont->shape()->impl(); #ifdef DEB_NAMING @@ -777,25 +792,33 @@ std::string Model_AttributeSelection::namingName() TopAbs_ShapeEnum translateType (const std::string& theType) { - TCollection_AsciiString aStr(theType.c_str()); - aStr.UpperCase(); - if(aStr.IsEqual("COMP")) - return TopAbs_COMPOUND; - else if(aStr.IsEqual("COMS")) - return TopAbs_COMPSOLID; - else if(aStr.IsEqual("SOLD")) - return TopAbs_SOLID; - else if(aStr.IsEqual("SHEL")) - return TopAbs_SHELL; - else if(aStr.IsEqual("FACE")) - return TopAbs_FACE; - else if(aStr.IsEqual("WIRE")) - return TopAbs_WIRE; - else if(aStr.IsEqual("EDGE")) - return TopAbs_EDGE; - else if(aStr.IsEqual("VERT")) - return TopAbs_VERTEX; - + // map from the textual shape types to OCCT enumeration + static std::map MyShapeTypes; + if (MyShapeTypes.size() == 0) { + MyShapeTypes["face"] = TopAbs_FACE; + MyShapeTypes["faces"] = TopAbs_FACE; + MyShapeTypes["vertex"] = TopAbs_VERTEX; + MyShapeTypes["vertices"] = TopAbs_VERTEX; + MyShapeTypes["wire"] = TopAbs_WIRE; + MyShapeTypes["edge"] = TopAbs_EDGE; + MyShapeTypes["edges"] = TopAbs_EDGE; + MyShapeTypes["shell"] = TopAbs_SHELL; + MyShapeTypes["solid"] = TopAbs_SOLID; + MyShapeTypes["solids"] = TopAbs_SOLID; + MyShapeTypes["FACE"] = TopAbs_FACE; + MyShapeTypes["FACES"] = TopAbs_FACE; + MyShapeTypes["VERTEX"] = TopAbs_VERTEX; + MyShapeTypes["VERTICES"] = TopAbs_VERTEX; + MyShapeTypes["WIRE"] = TopAbs_WIRE; + MyShapeTypes["EDGE"] = TopAbs_EDGE; + MyShapeTypes["EDGES"] = TopAbs_EDGE; + MyShapeTypes["SHELL"] = TopAbs_SHELL; + MyShapeTypes["SOLID"] = TopAbs_SOLID; + MyShapeTypes["SOLIDS"] = TopAbs_SOLID; + } + if (MyShapeTypes.find(theType) != MyShapeTypes.end()) + return MyShapeTypes[theType]; + Events_Error::send("Shape type defined in XML is not implemented!"); return TopAbs_SHAPE; }