#include "Model_Data.h"
#include "Model_Document.h"
#include "Model_SelectionNaming.h"
+#include <Model_Objects.h>
#include <ModelAPI_Feature.h>
#include <ModelAPI_ResultBody.h>
#include <ModelAPI_ResultConstruction.h>
#include <ModelAPI_CompositeFeature.h>
#include <ModelAPI_Tools.h>
#include <GeomAPI_Shape.h>
+#include <ModelAPI_Session.h>
#include <GeomAPI_PlanarEdges.h>
#include <Events_InfoMessage.h>
#include <TNaming_Tool.hxx>
#include <TNaming_Builder.hxx>
#include <TNaming_Localizer.hxx>
+#include <TNaming_SameShapeIterator.hxx>
+#include <TNaming_Iterator.hxx>
+#include <TNaming_NewShapeIterator.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Compound.hxx>
#include <TDataStd_IntPackedMap.hxx>
#include <TDataStd_Name.hxx>
#include <TopAbs_ShapeEnum.hxx>
#include <TopoDS_Iterator.hxx>
-#include <TNaming_Iterator.hxx>
#include <BRep_Builder.hxx>
+
using namespace std;
//#define DEB_NAMING 1
#ifdef DEB_NAMING
aBuilder.Generated(theContext->shape()->impl<TopoDS_Shape>());
std::shared_ptr<Model_Document> aMyDoc =
std::dynamic_pointer_cast<Model_Document>(owner()->document());
- std::string aName = theContext->data()->name();
- aMyDoc->addNamingName(aSelLab, aName);
- TDataStd_Name::Set(aSelLab, aName.c_str());
+ //std::string aName = contextName(theContext);
+ // for selection in different document, add the document name
+ //aMyDoc->addNamingName(aSelLab, aName);
+ //TDataStd_Name::Set(aSelLab, aName.c_str());
} else { // for sketch the naming is needed in DS
BRep_Builder aCompoundBuilder;
TopoDS_Compound aComp;
//myIsInitialized = true;
owner()->data()->sendAttributeUpdated(this);
+}
- std::string aSelName = namingName();
- if(!aSelName.empty())
- TDataStd_Name::Set(selectionLabel(), aSelName.c_str()); //set name
+void Model_AttributeSelection::removeTemporaryValues()
+{
+ if (myTmpContext.get() || myTmpSubShape.get()) {
+ myTmpContext.reset();
+ myTmpSubShape.reset();
+ }
}
std::shared_ptr<GeomAPI_Shape> Model_AttributeSelection::value()
{
GeomShapePtr aResult;
if (myTmpContext.get() || myTmpSubShape.get()) {
- ResultConstructionPtr aResulConstruction = std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(myTmpContext);
+ ResultConstructionPtr aResulConstruction =
+ std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(myTmpContext);
if(aResulConstruction.get()) {
// it is just reference to construction.
return myTmpSubShape;
return aResult; // empty result
return aContext->shape();
}
- if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value
+ if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) {
+ // it is just reference to construction, nothing is in value
return aResult; // empty result
}
if (aSelLab.IsAttribute(kPART_REF_ID)) {
ResultPtr aContext = context();
return aContext.get() != NULL;
}
- if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value
+ if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) {
+ // it is just reference to construction, nothing is in value
return true;
}
}
if (isGroup) aMePassed = false;
bool isInScope = !aMePassed;
- if (!isInScope && aComposite.get()) { // try to add sub-elements of composite if this is composite
+ if (!isInScope && aComposite.get()) {
+ // try to add sub-elements of composite if this is composite
if (aComposite->isSub(*aFIter))
isInScope = true;
}
if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // it is just reference to shape, not sub-shape
return setInvalidIfFalse(aSelLab, aContext->shape() && !aContext->shape()->isNull());
}
- if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, not sub-shape
+ if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) {
+ // it is just reference to construction, not sub-shape
// if there is a sketch, the sketch-naming must be updated
ResultConstructionPtr aConstruction =
std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
aBuilder.Generated(aContext->shape()->impl<TopoDS_Shape>());
std::shared_ptr<Model_Document> aMyDoc =
std::dynamic_pointer_cast<Model_Document>(owner()->document());
- std::string aName = aContext->data()->name();
- aMyDoc->addNamingName(aSelLab, aName);
- TDataStd_Name::Set(aSelLab, aName.c_str());
+ //std::string aName = contextName(aContext);
+ //aMyDoc->addNamingName(aSelLab, aName);
+ //TDataStd_Name::Set(aSelLab, aName.c_str());
}
return setInvalidIfFalse(aSelLab, aContext->shape() && !aContext->shape()->isNull());
}
if (aContext->groupName() == ModelAPI_ResultBody::group()) {
// body: just a named shape, use selection mechanism from OCCT
TNaming_Selector aSelector(aSelLab);
+ TopoDS_Shape anOldShape;
+ if (!aSelector.NamedShape().IsNull()) {
+ anOldShape = aSelector.NamedShape()->Get();
+ }
bool aResult = aSelector.Solve(scope()) == Standard_True;
- aResult = setInvalidIfFalse(aSelLab, aResult); // must be before sending of updated attribute (1556)
- owner()->data()->sendAttributeUpdated(this);
+ // must be before sending of updated attribute (1556)
+ aResult = setInvalidIfFalse(aSelLab, aResult);
+ TopoDS_Shape aNewShape;
+ if (!aSelector.NamedShape().IsNull()) {
+ aNewShape = aSelector.NamedShape()->Get();
+ }
+ if (anOldShape.IsNull() || aNewShape.IsNull() ||
+ !anOldShape.IsEqual(aSelector.NamedShape()->Get())) // send updated if shape is changed
+ owner()->data()->sendAttributeUpdated(this);
return aResult;
} else if (aContext->groupName() == ModelAPI_ResultConstruction::group()) {
// construction: identification by the results indexes, recompute faces and
return setInvalidIfFalse(aSelLab, false);
}
- if (aShapeType == TopAbs_FACE || aShapeType == TopAbs_WIRE) { // compound is for the whole sketch selection
+ 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);
aNewSelected = aConstructionContext->face(0);
} else { // searching for most looks-like initial face by the indexes
// prepare edges of the current result for the fast searching
- NCollection_DataMap<Handle(Geom_Curve), int> allCurves; // curves and orientations of edges
+ // curves and orientations of edges
+ NCollection_DataMap<Handle(Geom_Curve), int> allCurves;
const int aSubNum = aComposite->numberOfSubs();
for(int a = 0; a < aSubNum; a++) {
int aSubID = aComposite->subFeatureId(a);
}
}
}
- aNewSelected = Model_SelectionNaming::findAppropriateFace(aContext, allCurves);
+ aNewSelected = Model_SelectionNaming::findAppropriateFace(
+ aContext, allCurves, aShapeType == TopAbs_WIRE);
}
if (aNewSelected) { // store this new selection
- if (aShapeType == TopAbs_WIRE) { // just get a wire from face to have wire
- TopExp_Explorer aWireExp(aNewSelected->impl<TopoDS_Shape>(), TopAbs_WIRE);
- if (aWireExp.More()) {
- aNewSelected.reset(new GeomAPI_Shape);
- aNewSelected->setImpl<TopoDS_Shape>(new TopoDS_Shape(aWireExp.Current()));
- }
- }
selectConstruction(aContext, aNewSelected);
setInvalidIfFalse(aSelLab, true);
owner()->data()->sendAttributeUpdated(this);
return true;
- } else { // if the selection is not found, put the empty shape: it's better to have disappeared shape, than the old, the lost one
+ } else {
+ // if the selection is not found, put the empty shape:
+ // it's better to have disappeared shape, than the old, the lost one
TNaming_Builder anEmptyBuilder(selectionLabel());
return setInvalidIfFalse(aSelLab, false);
}
return setInvalidIfFalse(aSelLab, false); // unknown case
}
-
void Model_AttributeSelection::selectBody(
const ResultPtr& theContext, const std::shared_ptr<GeomAPI_Shape>& theSubShape)
{
return;
}
}
- TopoDS_Shape aNewShape = theSubShape ? theSubShape->impl<TopoDS_Shape>() : aContext;
+
+ // with "recover" feature the selected context may be not up to date (issue 1710)
+ Handle(TNaming_NamedShape) aResult;
+ TDF_Label aSelLab = selectionLabel();
+ TopoDS_Shape aNewContext = aContext;
+ bool isUpdated = true;
+ while(!aNewContext.IsNull() && isUpdated) {
+ // searching for the very last shape that was produced from this one
+ isUpdated = false;
+ if (!TNaming_Tool::HasLabel(aSelLab, aNewContext))
+ // to avoid crash of TNaming_SameShapeIterator if pure shape does not exists
+ break;
+ for(TNaming_SameShapeIterator anIter(aNewContext, aSelLab); anIter.More(); anIter.Next()) {
+ TDF_Label aNSLab = anIter.Label();
+ if (!scope().Contains(aNSLab))
+ continue;
+ Handle(TNaming_NamedShape) aNS;
+ if (aNSLab.FindAttribute(TNaming_NamedShape::GetID(), aNS)) {
+ for(TNaming_Iterator aShapesIter(aNS); aShapesIter.More(); aShapesIter.Next()) {
+ if (aShapesIter.Evolution() == TNaming_SELECTED)
+ continue; // don't use the selection evolution
+ if (!aShapesIter.OldShape().IsNull() && aShapesIter.OldShape().IsSame(aNewContext)) {
+ // found the original shape
+ aNewContext = aShapesIter.NewShape(); // go to the newer shape
+ isUpdated = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (aNewContext.IsNull()) { // a context is already deleted
+ setInvalidIfFalse(aSelLab, false);
+ Events_InfoMessage("Model_AttributeSelection", "Failed to select shape already deleted").send();
+ return;
+ }
+
+ TopoDS_Shape aNewSub = theSubShape ? theSubShape->impl<TopoDS_Shape>() : aContext;
+ if (!aNewSub.IsEqual(aContext)) { // searching for subshape in the new context
+ bool isFound = false;
+ TopExp_Explorer anExp(aNewContext, aNewSub.ShapeType());
+ for(; anExp.More(); anExp.Next()) {
+ if (anExp.Current().IsEqual(aNewSub)) {
+ isFound = true;
+ break;
+ }
+ }
+ if (!isFound) { // sub-shape is not found in the up-to-date instance of the context shape
+ setInvalidIfFalse(aSelLab, false);
+ Events_InfoMessage("Model_AttributeSelection",
+ "Failed to select sub-shape already modified").send();
+ return;
+ }
+ }
+
+
/// fix for issue 411: result modified shapes must not participate in this selection mechanism
FeaturePtr aFeatureOwner = std::dynamic_pointer_cast<ModelAPI_Feature>(owner());
if (aFeatureOwner.get())
aFeatureOwner->eraseResults();
if (!aContext.IsNull()) {
- aSel.Select(aNewShape, aContext);
+ aSel.Select(aNewSub, aNewContext);
}
}
/// -1 is out, 1 is in, 0 is not needed
static void registerSubShape(TDF_Label theMainLabel, TopoDS_Shape theShape,
const int theID, const FeaturePtr& theContextFeature, std::shared_ptr<Model_Document> theDoc,
- std::string theAdditionalName, std::map<int, int>& theOrientations,
- std::map<int, std::string>& theSubNames, // name of sub-elements by ID to be exported instead of indexes
+ std::map<int, int>& theOrientations,
+ // name of sub-elements by ID to be exported instead of indexes
+ std::map<int, std::string>& theSubNames,
Handle(TDataStd_IntPackedMap) theRefs = Handle(TDataStd_IntPackedMap)(),
const int theOrientation = 0)
{
TNaming_Builder aBuilder(aLab);
aBuilder.Generated(theShape);
std::stringstream aName;
- aName<<theContextFeature->name();
+ // #1839 : do not store name of the feature in the tree, since this name could be changed
+ //aName<<theContextFeature->name();
if (theShape.ShapeType() != TopAbs_COMPOUND) { // compound means the whole result for construction
- aName<<"/";
- if (!theAdditionalName.empty())
- aName<<theAdditionalName<<"/";
+ //aName<<"/";
if (theShape.ShapeType() == TopAbs_FACE) aName<<"Face";
else if (theShape.ShapeType() == TopAbs_WIRE) aName<<"Wire";
else if (theShape.ShapeType() == TopAbs_EDGE) aName<<"Edge";
// saving of context is enough: result construction contains exactly the needed shape
TNaming_Builder aBuilder(selectionLabel());
aBuilder.Generated(aSubShape);
- aMyDoc->addNamingName(selectionLabel(), theContext->data()->name());
- TDataStd_Name::Set(selectionLabel(), theContext->data()->name().c_str());
+ //std::string aName = contextName(theContext);
+ //aMyDoc->addNamingName(selectionLabel(), aName);
+ //TDataStd_Name::Set(selectionLabel(), aName.c_str());
return;
}
std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(owner()->data());
int anOrient = Model_SelectionNaming::edgeOrientation(aSubShape, anEdge);
anOrientations[anID] = anOrient;
registerSubShape(
- selectionLabel(), anEdge, anID, aContextFeature, aMyDoc, "", anOrientations,
+ selectionLabel(), anEdge, anID, aContextFeature, aMyDoc, anOrientations,
aSubNames, Handle(TDataStd_IntPackedMap)(), anOrient);
}
}
std::stringstream anAdditionalName;
registerSubShape(
- selectionLabel(), aV, aTagIndex, aContextFeature, aMyDoc, "", anOrientations,
+ selectionLabel(), aV, aTagIndex, aContextFeature, aMyDoc, anOrientations,
aSubNames);
}
}
TNaming_Builder aBuilder(selectionLabel());
aBuilder.Generated(aSubShape);
registerSubShape(
- selectionLabel(), aSubShape, 0, aContextFeature, aMyDoc, "", anOrientations, aSubNames, aRefs);
+ selectionLabel(), aSubShape, 0, aContextFeature, aMyDoc, anOrientations, aSubNames, aRefs);
}
bool Model_AttributeSelection::selectPart(
return true; // postponed naming
if (theUpdate) {
Handle(TDataStd_Integer) anIndex;
- if (selectionLabel().FindAttribute(TDataStd_Integer::GetID(), anIndex)) { // by internal selection
+ if (selectionLabel().FindAttribute(TDataStd_Integer::GetID(), anIndex)) {
+ // by internal selection
if (anIndex->Get() > 0) {
// update the selection by index
return aPart->updateInPart(anIndex->Get());
std::string aName("");
if(!this->isInitialized())
return !theDefaultName.empty() ? theDefaultName : aName;
- Handle(TDataStd_Name) anAtt;
- if(selectionLabel().FindAttribute(TDataStd_Name::GetID(), anAtt)) {
- aName = TCollection_AsciiString(anAtt->Get()).ToCString();
- return aName;
- }
std::shared_ptr<GeomAPI_Shape> aSubSh = value();
ResultPtr aCont = context();
Model_SelectionNaming aSelNaming(selectionLabel());
- return aSelNaming.namingName(aCont, aSubSh, theDefaultName);
+ return aSelNaming.namingName(
+ aCont, aSubSh, theDefaultName, owner()->document() != aCont->document());
}
// type ::= COMP | COMS | SOLD | SHEL | FACE | WIRE | EDGE | VERT
std::shared_ptr<GeomAPI_Shape> aShapeToBeSelected;
ResultPtr aCont;
if (aSelNaming.selectSubShape(theType, theSubShapeName, aDoc, aShapeToBeSelected, aCont)) {
+ // try to find the last context to find the up to date shape
+ if (aCont->shape().get() && !aCont->shape()->isNull() &&
+ aCont->groupName() == ModelAPI_ResultBody::group() && aDoc == owner()->document()) {
+ const TopoDS_Shape aConShape = aCont->shape()->impl<TopoDS_Shape>();
+ if (!aConShape.IsNull()) {
+ Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aConShape, selectionLabel());
+ if (!aNS.IsNull()) {
+ aNS = TNaming_Tool::CurrentNamedShape(aNS);
+ if (!aNS.IsNull()) {
+ TDF_Label aLab = aNS->Label();
+ while(aLab.Depth() != 7 && aLab.Depth() > 5)
+ aLab = aLab.Father();
+ ObjectPtr anObj = aDoc->objects()->object(aLab);
+ if (anObj.get()) {
+ ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(anObj);
+ if (aRes)
+ aCont = aRes;
+ }
+ }
+ }
+ }
+ }
setValue(aCont, aShapeToBeSelected);
}
}
setValue(aContext, aSelection);
}
+std::string Model_AttributeSelection::contextName(const ResultPtr& theContext) const
+{
+ std::string aResult;
+ if (owner()->document() != theContext->document()) {
+ if (theContext->document() == ModelAPI_Session::get()->moduleDocument()) {
+ aResult = theContext->document()->kind() + "/";
+ } else {
+ ResultPtr aDocRes = ModelAPI_Tools::findPartResult(
+ ModelAPI_Session::get()->moduleDocument(), theContext->document());
+ if (aDocRes.get()) {
+ aResult = aDocRes->data()->name() + "/";
+ }
+ }
+ }
+ aResult += theContext->data()->name();
+ return aResult;
+}
+
+void Model_AttributeSelection::updateInHistory()
+{
+ ResultPtr aContext = std::dynamic_pointer_cast<ModelAPI_Result>(myRef.value());
+ // only bodies may be modified later in the history, don't do anything otherwise
+ if (!aContext.get() || aContext->groupName() != ModelAPI_ResultBody::group())
+ return;
+ std::shared_ptr<Model_Data> aContData = std::dynamic_pointer_cast<Model_Data>(aContext->data());
+ if (!aContData.get() || !aContData->isValid())
+ return;
+ TDF_Label aContLab = aContData->label(); // named shape where the selected context is located
+ Handle(TNaming_NamedShape) aContNS;
+ if (!aContLab.FindAttribute(TNaming_NamedShape::GetID(), aContNS))
+ return;
+ std::shared_ptr<Model_Document> aDoc =
+ std::dynamic_pointer_cast<Model_Document>(aContext->document());
+ FeaturePtr aThisFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(owner());
+ FeaturePtr aCurrentModifierFeat = aDoc->feature(aContext);
+ // iterate the context shape modifications in order to find a feature that is upper in history
+ // that this one and is really modifies the referenced result to refer to it
+ ResultPtr aModifierResFound;
+ TNaming_Iterator aPairIter(aContNS);
+ TopoDS_Shape aNewShape = aPairIter.NewShape();
+ bool anIterate = true;
+ // trying to update also the sub-shape selected
+ GeomShapePtr aSubShape = value();
+ if (aSubShape.get() && aSubShape->isEqual(aContext->shape()))
+ aSubShape.reset();
+
+ while(anIterate) {
+ anIterate = false;
+ TNaming_SameShapeIterator aModifIter(aNewShape, aContLab);
+ for(; aModifIter.More(); aModifIter.Next()) {
+ ResultPtr aModifierObj = std::dynamic_pointer_cast<ModelAPI_Result>
+ (aDoc->objects()->object(aModifIter.Label().Father()));
+ if (!aModifierObj.get())
+ break;
+ FeaturePtr aModifierFeat = aDoc->feature(aModifierObj);
+ if (!aModifierFeat.get())
+ break;
+ if (aModifierFeat == aThisFeature || aDoc->objects()->isLater(aModifierFeat, aThisFeature))
+ continue; // the modifier feature is later than this, so, should not be used
+ if (aCurrentModifierFeat == aModifierFeat ||
+ aDoc->objects()->isLater(aCurrentModifierFeat, aModifierFeat))
+ continue; // the current modifier is later than the found, so, useless
+ Handle(TNaming_NamedShape) aNewNS;
+ aModifIter.Label().FindAttribute(TNaming_NamedShape::GetID(), aNewNS);
+ if (aNewNS->Evolution() == TNaming_MODIFY || aNewNS->Evolution() == TNaming_GENERATED) {
+ aModifierResFound = aModifierObj;
+ aCurrentModifierFeat = aModifierFeat;
+ TNaming_Iterator aPairIter(aNewNS);
+ aNewShape = aPairIter.NewShape();
+ /*
+ // searching for sub-shape equivalent on the sub-label of the new context result
+ TDF_ChildIDIterator aNSIter(aNewNS->Label(), TNaming_NamedShape::GetID());
+ for(; aNSIter.More(); aNSIter.Next()) {
+ TNaming_Iterator aPairsIter(aNSIter.Value()->Label());
+ for(; aPairsIter.More(); aPairsIter.Next()) {
+ if (aSubShape->impl<TopoDS_Shape>().IsEqual()
+ }
+ }*/
+ anIterate = true;
+ break;
+ } else if (aNewNS->Evolution() == TNaming_DELETE) { // a shape was deleted => result is null
+ ResultPtr anEmptyContext;
+ std::shared_ptr<GeomAPI_Shape> anEmptyShape;
+ setValue(anEmptyContext, anEmptyShape); // nullify the selection
+ return;
+ } else { // not-precessed modification => don't support it
+ continue;
+ }
+ }
+
+ /*
+ TNaming_NewShapeIterator aModifIter(aPairIter.NewShape(), aContLab);
+ if (aModifIter.More()) aModifIter.Next(); // skip this shape result
+ for(; aModifIter.More(); aModifIter.Next()) {
+ ResultPtr aModifierObj = std::dynamic_pointer_cast<ModelAPI_Result>
+ (aDoc->objects()->object(aModifIter.Label().Father()));
+ if (!aModifierObj.get())
+ break;
+ FeaturePtr aModifierFeat = aDoc->feature(aModifierObj);
+ if (!aModifierFeat.get())
+ break;
+ if (aModifierFeat == aThisFeature || aDoc->objects()->isLater(aModifierFeat, aThisFeature))
+ break; // the modifier feature is later than this, so, should not be used
+ Handle(TNaming_NamedShape) aNewNS = aModifIter.NamedShape();
+ if (aNewNS->Evolution() == TNaming_MODIFY || aNewNS->Evolution() == TNaming_GENERATED) {
+ aModifierResFound = aModifierObj;
+ } else if (aNewNS->Evolution() == TNaming_DELETE) { // a shape was deleted => result is null
+ ResultPtr anEmptyContext;
+ std::shared_ptr<GeomAPI_Shape> anEmptyShape;
+ setValue(anEmptyContext, anEmptyShape); // nullify the selection
+ return;
+ } else { // not-precessed modification => don't support it
+ break;
+ }
+ }
+ // already found what is needed, don't iterate the next pair since normally
+ if (aModifierResFound.get()) // there must be only one pair in the result-shape
+ break;
+ */
+ }
+ if (aModifierResFound.get()) {
+ // update scope to reset to a new one
+ myScope.Clear();
+ myRef.setValue(aModifierResFound);
+ update(); // it must recompute a new sub-shape automatically
+ }
+ /*
+ if (aModifierResFound.get()) {
+ // update scope to reset to a new one
+ myScope.Clear();
+ if (!aSubShape.get() || aSubShape->isNull()) { // no sub-shape, so, just update a context
+ setValue(aModifierResFound, aSubShape);
+ return;
+ }
+ // seaching for the same sub-shape: the old topology stays the same
+ TopoDS_Shape anOldShape = aSubShape->impl<TopoDS_Shape>();
+ TopAbs_ShapeEnum aSubType = anOldShape.ShapeType();
+ TopoDS_Shape aNewContext = aModifierResFound->shape()->impl<TopoDS_Shape>();
+ TopExp_Explorer anExp(aNewContext, aSubType);
+ for(; anExp.More(); anExp.Next()) {
+ if (anExp.Current().IsEqual(anOldShape))
+ break;
+ }
+ if (anExp.More()) { // found
+ setValue(aModifierResFound, aSubShape);
+ return;
+ }
+ // seaching for the same sub-shape: equal geometry
+ for(anExp.Init(aNewContext, aSubType); anExp.More(); anExp.Next()) {
+ if (aSubType == TopAbs_VERTEX) {
+
+ }
+ }
+ }*/
+ // if sub-shape selection exists, search also sub-shape new instance
+ /*
+ GeomShapePtr aSubShape = value();
+ if (aSubShape.get() && aSubShape != aContext->shape()) {
+
+ }*/
+}