-// Copyright (C) 2014-2019 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023 CEA, EDF
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
static TDF_Label findGoodLabelWithShape(const TDF_Label theAccess, const TopoDS_Shape& theShape) {
TDF_Label aResult;
+ TDF_Label aMyOpLab;
+ bool aMyOpLabIsComputed = false;
if (TNaming_Tool::HasLabel(theAccess, theShape)) { // selection and delete evolution are not used
for(TNaming_SameShapeIterator aShapes(theShape, theAccess); aShapes.More(); aShapes.Next())
{
if (aShapes.Label().FindAttribute(TNaming_NamedShape::GetID(), aNS)) {
if (aNS->Evolution() == TNaming_MODIFY || aNS->Evolution() == TNaming_GENERATED ||
aNS->Evolution() == TNaming_PRIMITIVE) {
+ // getting label of this operation to avoid usage of ready shapes of this
+ if (!aMyOpLabIsComputed) {
+ aMyOpLab = theAccess;
+ if (!aMyOpLab.IsNull()) {
+ int aDepth = aMyOpLab.Depth();
+ if (aDepth < 3)
+ aMyOpLab.Nullify();
+ else {
+ for(; aDepth != 3; aDepth--)
+ aMyOpLab = aMyOpLab.Father();
+ }
+ }
+ aMyOpLabIsComputed = true;
+ }
+ if (!aMyOpLab.IsNull() && aNS->Label().IsDescendant(aMyOpLab))
+ continue;
aResult = aNS->Label();
break;
}
}
return NULL; // not found value in the tree, not found context shape in the tree also
}
+ // getting label of this operation to avoid usage of ready shapes of this
+ TDF_Label aMyOpLab = theAccess;
+ if (!aMyOpLab.IsNull()) {
+ int aDepth = aMyOpLab.Depth();
+ if (aDepth < 3)
+ aMyOpLab.Nullify();
+ else {
+ for(; aDepth != 3; aDepth--)
+ aMyOpLab = aMyOpLab.Father();
+ }
+ }
// searching for the base shapes of the value
Handle(TNaming_NamedShape) aPrimitiveNS;
NCollection_List<Handle(TNaming_NamedShape)> aModifList;
Handle(TNaming_NamedShape) aNS;
if (aShapes.Label().FindAttribute(TNaming_NamedShape::GetID(), aNS)) {
TNaming_Evolution anEvolution = aNS->Evolution();
+ if (anEvolution == TNaming_SELECTED || anEvolution == TNaming_DELETE)
+ continue;
+ if (!aMyOpLab.IsNull() && aNS->Label().IsDescendant(aMyOpLab))
+ continue;
if (anEvolution == TNaming_PRIMITIVE) { // the value shape is declared as PRIMITIVE
aPrimitiveNS = aNS;
break;
}
Selector_Algo* Selector_Algo::restoreByName(TDF_Label theLab, TDF_Label theBaseDocLab,
- std::string theName, const TopAbs_ShapeEnum theShapeType, const bool theGeomNaming,
+ std::wstring theName, const TopAbs_ShapeEnum theShapeType, const bool theGeomNaming,
Selector_NameGenerator* theNameGenerator, TDF_Label& theContextLab)
{
Selector_Algo* aResult = NULL;
- if (theName[0] == '[') { // intersection or container
+ if (theName[0] == L'[') { // intersection or container
switch(theShapeType) {
case TopAbs_COMPOUND:
case TopAbs_COMPSOLID:
break;
default:;
}
- } else if (theName[0] == '(') { // filter by neighbors
+ } else if (theName[0] == L'(') { // filter by neighbors
aResult = new Selector_FilterByNeighbors;
- } else if (theName.find(pureWeakNameID()) == 0) { // weak naming identifier
+ } else if (theName.find(pureWeakNameID()) == 0 ||
+ theName.find(oldPureWeakNameID()) == 0) { // weak naming identifier
aResult = new Selector_WeakName;
- } else if (theName.find('&') != std::string::npos) { // modification
+ } else if (theName.find(L'&') != std::wstring::npos) { // modification
aResult = new Selector_Modify;
} else { // primitive
aResult = new Selector_Primitive;
TopoDS_Shape aNextModification = aBaseIter.Shape();
if (aNextModification.IsNull())
continue;
- if (isInContext(theContext, aNextModification))
+ if (isInContext(theContext, aNextModification)) {
// don't add vertices generated from edges
if (aNextModification.ShapeType() <= theResult.ShapeType())
aResultShapes.Add(aNextModification);
- else if (findNewVersion(theContext, aNextModification))
+ }
+ else if (findNewVersion(theContext, aNextModification)) {
if (aNextModification.ShapeType() <= theResult.ShapeType())
aResultShapes.Add(aNextModification);
+ }
}
}
if (aResultShapes.IsEmpty())