1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-09 18:50:54 +03:00
occt/src/TNaming/TNaming_Localizer.cxx
szy 57c718c4b9 0026061: TNaming_Selector crash in select method.
TNaming_Selector crash in select method.

TNaming_Localizer is protected from not expected input arguments.

Test case for issue CR26061
2015-04-23 17:30:43 +03:00

988 lines
30 KiB
C++

// Created on: 1997-06-11
// Created by: Yves FRICAUD
// Copyright (c) 1997-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <TNaming_Localizer.ixx>
#include <TNaming_Identifier.hxx>
#include <TNaming_ShapesSet.hxx>
#include <TNaming_ListIteratorOfListOfMapOfShape.hxx>
#include <TNaming_ListIteratorOfListOfIndexedDataMapOfShapeListOfShape.hxx>
#include <TNaming_DataMapOfShapeShapesSet.hxx>
#include <TNaming_IteratorOnShapesSet.hxx>
#include <TNaming_Evolution.hxx>
#include <TNaming_Iterator.hxx>
#include <TNaming_NewShapeIterator.hxx>
#include <TNaming_OldShapeIterator.hxx>
#include <TNaming_Tool.hxx>
#include <TNaming_ListOfNamedShape.hxx>
#include <TNaming_ListIteratorOfListOfNamedShape.hxx>
#include <TDF_Label.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TopTools_MapIteratorOfMapOfShape.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#ifdef OCCT_DEBUG
//#define MDTV_DEB_SC
#ifdef OCCT_DEBUG_SC
#include <TDF_Tool.hxx>
#include <TDF_MapIteratorOfLabelMap.hxx>
#include <TCollection_AsciiString.hxx>
#include <BRepTools.hxx>
void LPrintEntry(const TDF_Label& label)
{
TCollection_AsciiString entry;
TDF_Tool::Entry(label, entry);
cout << "LabelEntry = "<< entry << endl;
}
static void LWrite(const TopoDS_Shape& shape,
const Standard_CString filename)
{
char buf[256];
if(strlen(filename) > 256) return;
#if defined WNT
strcpy_s (buf, filename);
#else
strcpy (buf, filename);
#endif
char* p = buf;
while (*p) {
if(*p == ':')
*p = '-';
p++;
}
ofstream save (buf);
if(!save)
cout << "File " << buf << " was not created: rdstate = " << save.rdstate() << endl;
save << "DBRep_DrawableShape" << endl << endl;
if(!shape.IsNull()) BRepTools::Write(shape, save);
save.close();
}
//=======================================================================
static void LWriteNSOnLabel (const Handle(TNaming_NamedShape)& NS,
const Standard_CString filename)
{
if(!NS.IsNull() && !NS->IsEmpty() ) {
TCollection_AsciiString aNam (filename);
TCollection_AsciiString oldS ("_Old");
TCollection_AsciiString newS ("_New_");
Standard_Integer i(0);
TNaming_Iterator it(NS);
for(;it.More(); it.Next(),i++) {
TCollection_AsciiString aName1 = aNam + oldS + i + ".brep";
TCollection_AsciiString aName2 = aNam + newS + i + ".brep";
const TopoDS_Shape& oldShape = it.OldShape();
const TopoDS_Shape& newShape = it.NewShape();
if(!oldShape.IsNull())
LWrite ( oldShape, aName1.ToCString());
if(!newShape.IsNull())
LWrite ( newShape, aName2.ToCString());
}
}
}
#endif
#endif
//=======================================================================
//function : FindFeatureInAncestors
//purpose : Cherche les ancetres de S qui sont sous des labels
//=======================================================================
void TNaming_Localizer::FindFeaturesInAncestors
(const TopoDS_Shape& S,
const TopoDS_Shape& Context,
TopTools_MapOfShape& AncInFeature)
{
#ifdef OCCT_DEBUG_SC
LWrite(S, "Localizer_S.brep");
LWrite(Context, "Localizer_Context.brep");
#endif
const TopTools_IndexedDataMapOfShapeListOfShape& Anc = Ancestors(Context,S.ShapeType());
if (Anc.Contains(S)) {
#ifdef OCCT_DEBUG_SC
cout <<"Localizer: S in ancestor" <<endl;
#endif
const TopTools_ListOfShape& L = Anc.FindFromKey(S);
TopTools_ListIteratorOfListOfShape itL(L);
for (; itL.More(); itL.Next()) {
const TopoDS_Shape& AS = itL.Value();
#ifdef OCCT_DEBUG_SC
LWrite(AS, "Localizer_AS.brep");
#endif
Handle(TNaming_NamedShape) NS = TNaming_Tool::NamedShape(AS,myUS->Label());
if (!NS.IsNull()) {
// if (TNaming_Tool::HasLabel(myUS,AS)) {
AncInFeature.Add(AS);
}
else if (AS.ShapeType() > TopAbs_FACE) {
FindFeaturesInAncestors (AS, Context, AncInFeature);
}
else {
#ifdef OCCT_DEBUG
cout <<" TNaming_Localization : Failure in the research of ancetres in TDF"<<endl;
#endif
}
}
}
else {
#ifdef OCCT_DEBUG
cout <<" TNaming_Localization : S n est pas dans le solide"<<endl;//S is not in the solid
#endif
}
}
//=======================================================================
//function : SubShapes
//purpose :
//=======================================================================
const TopTools_MapOfShape& TNaming_Localizer::SubShapes (const TopoDS_Shape& In,
const TopAbs_ShapeEnum TS)
{
TopTools_ListIteratorOfListOfShape itS(myShapeWithSubShapes) ;
TNaming_ListIteratorOfListOfMapOfShape itSS(mySubShapes);
// Standard_Boolean Found = Standard_False;
for (; itS.More(); itS.Next(),itSS.Next()) {
if (In.IsSame(itS.Value())) {
TopTools_MapOfShape& SubShapes = itSS.Value();
for (TopExp_Explorer exp(In,TS); exp.More(); exp.Next()) {
const TopoDS_Shape& SS = exp.Current();
if (SubShapes.Contains(SS)) {
break;
}
SubShapes.Add(SS);
}
return SubShapes;
}
}
TopTools_MapOfShape emptyMap;
mySubShapes.Prepend(emptyMap);
myShapeWithSubShapes.Prepend(In);
TopTools_MapOfShape& SubShapes = mySubShapes.First();
for (TopExp_Explorer exp(In,TS); exp.More(); exp.Next()) {
const TopoDS_Shape& SS = exp.Current();
if (SubShapes.Contains(SS)) {
break;
}
SubShapes.Add(SS);
}
return SubShapes;
}
//=======================================================================
//function : Ancestors
//purpose :
//=======================================================================
const TopTools_IndexedDataMapOfShapeListOfShape& TNaming_Localizer::Ancestors
(const TopoDS_Shape& In,
const TopAbs_ShapeEnum TS)
{
TopTools_ListIteratorOfListOfShape itS(myShapeWithAncestors) ;
TNaming_ListIteratorOfListOfIndexedDataMapOfShapeListOfShape itA(myAncestors);
// Standard_Boolean Found = Standard_False;
for (; itS.More(); itS.Next(),itA.Next()) {
if (In.IsSame(itS.Value())) {
//-----------------------
// Ancetres existent.
//-----------------------
TopTools_IndexedDataMapOfShapeListOfShape& Anc = itA.Value();
TopExp_Explorer exp(In,TS);
#ifdef OCCT_DEBUG
if (!exp.More()) cout <<" TNaming_Localization : Construction ancetres impossible"<<endl;
#endif
const TopoDS_Shape& SS = exp.Current();
if (Anc.Contains(SS)) {
return Anc;
}
else {
//----------------------------
// Completion des ancetres.
//----------------------------
TopAbs_ShapeEnum TA = TopAbs_FACE;
if (TS == TopAbs_EDGE) TA = TopAbs_FACE;
if (TS == TopAbs_VERTEX) TA = TopAbs_EDGE;
if (TA >= In.ShapeType()) {
TopExp::MapShapesAndAncestors(In, TS, TA, Anc);
}
else {
#ifdef OCCT_DEBUG
cout <<" TNaming_Localization : Construction ancetres impossible"<<endl;
#endif
}
}
return Anc;
}
}
//-----------------------------------
// Construction des ancetres
//-----------------------------------
TopTools_IndexedDataMapOfShapeListOfShape emptyAnc;
myShapeWithAncestors.Prepend(In);
myAncestors .Prepend(emptyAnc);
TopAbs_ShapeEnum TA=TopAbs_COMPOUND;
if (TS == TopAbs_VERTEX) TA = TopAbs_EDGE;
else if (TS == TopAbs_EDGE) TA = TopAbs_FACE;
else if (TS == TopAbs_FACE) TA = TopAbs_SOLID;
if ((TS == TopAbs_EDGE || TS == TopAbs_VERTEX || TS == TopAbs_FACE) && TA >= In.ShapeType()) {
TopExp::MapShapesAndAncestors(In, TS, TA, myAncestors.First());
}
else {
#ifdef OCCT_DEBUG
cout <<" TNaming_Localization : Construction ancetres impossible"<<endl;
#endif
}
return myAncestors.First();
}
//=======================================================================
//function : IsNew
//purpose :
//=======================================================================
Standard_Boolean TNaming_Localizer::IsNew (const TopoDS_Shape& S,
const Handle(TNaming_NamedShape)& NS)
{
TNaming_Iterator itLab(NS);
for (; itLab.More(); itLab.Next()) {
if (itLab.OldShape().IsSame(S)) {
return Standard_False;
}
if (itLab.NewShape().IsSame(S)) {
return Standard_True;
}
}
#ifdef OCCT_DEBUG
cout <<"TNaming_Localizer:IsNewInLab : Shape n est pas dans le Label."<<endl;
#endif
return Standard_False;
}
//=======================================================================
//function : Back
//purpose :
//=======================================================================
void TNaming_Localizer::GoBack (const TopoDS_Shape& S,
const TDF_Label& Lab,
const TNaming_Evolution Evol,
TopTools_ListOfShape& LBS,
TNaming_ListOfNamedShape& LBNS)
{
// Standard_Integer TrDef;
TNaming_OldShapeIterator it(S,myCurTrans,myUS);
TopoDS_Shape Sol;
if (!it.More()) {
//-----------------------------------------------------------
// Pas d'ascendants => Recherche et exploration du contenant
//----------------------------------------------------------
const TDF_Label& Father = Lab.Father();
TNaming_Iterator itLab(Father);
if(itLab.More())
Sol = itLab.OldShape();
//-------------------------------------------
// Recherche des ancetres dans des features.
//-------------------------------------------
if (!Sol.IsNull()) {
TopTools_MapOfShape AncInFeature;
FindFeaturesInAncestors (S, Sol, AncInFeature);
TopTools_MapIteratorOfMapOfShape itF(AncInFeature);
for ( ; itF.More(); itF.Next()) {
const TopoDS_Shape& AncOfS = itF.Key();
LBS .Append(AncOfS);
LBNS.Append(TNaming_Tool::NamedShape(AncOfS,Lab));
}
}
}
else {
for ( ; it.More(); it.Next()) {
// if (it.NamedShape()->Evolution() != TNaming_SELECTED) {
if (it.NamedShape()->Evolution() == Evol) {
Handle(TNaming_NamedShape) NS = TNaming_Tool::NamedShape(it.Shape(),Lab);
if (!NS.IsNull()) {
LBS.Append (it.Shape());
LBNS.Append (TNaming_Tool::NamedShape(it.Shape(),Lab));
}
else {
#ifdef OCCT_DEBUG
cout <<"TNaming_Localizer: Shape modifie sans avoir ete cree"<<endl;
#endif
}
}
}
}
}
/*
//=======================================================================
//function : Backward
//purpose :
//=======================================================================
void TNaming_Localizer::Backward (const TopoDS_Shape& S,
TDF_LabelMap& Primitives,
TopTools_MapOfShape& ValidShapes)
{
Standard_Integer PrevTrans = myCurTrans - 1;
Standard_Integer TrDef;
TDF_Label Lab = TNaming_Tool::Label (myUS, S, TrDef);
TNaming_Evolution Evol = Evolution(Lab);
TopTools_ListOfShape LBS;
TDF_LabelList LBLab;
GoBack(S,Lab,LBS,LBLab);
TopTools_ListIteratorOfListOfShape itLBS (LBS);
TDF_ListIteratorOfLabelList itLBLab(LBLab);
if (LBS.IsEmpty()) {
Primitives.Add(Lab);
}
for ( ; itLBS.More(); itLBS.Next(), itLBLab.Next()) {
const TopoDS_Shape& OS = itLBS.Value();
const TDF_Label& LabOS = itLBLab.Value();
Evol = Evolution(LabOS);
if (TNaming_Tool::ValidUntil(OS,myUS) >= myCurTrans) {
//---------------------------------------------------------
// Le Shape est valid dans la transaction myCurTrans => STOP
//---------------------------------------------------------
ValidShapes.Add(OS);
}
else if (Evol == TNaming_PRIMITIVE) {
Primitives.Add(LabOS);
}
else if ((Evol == TNaming_GENERATED) && IsNewInLab (OS,LabOS,PrevTrans)) {
//--------------------------------------------------------------
// Passage par une generation
// le shape dans myCurTrans descendra d un element de cet attribut.
// Localisation de OS dans la transaction courrante.
// les shapes obtenus seront des antecedants du shape cherche.
//--------------------------------------------------------------
// A faire seulememt si OS est un newShape dans LabOS.
TNaming_ShapesSet ResGen;
TopoDS_Shape PrevIn;
TDF_Label Father = LabOS.Father();
TNaming_Iterator itLab(Father,PrevTrans);
for (; itLab.More(); itLab.Next()) {
PrevIn= itLab.OldShape();
break;
}
Localize(PrevIn,LabOS,OS,ResGen);
for (TNaming_IteratorOnShapesSet itLoc(ResGen); itLoc.More(); itLoc.Next()) {
ValidShapes.Add(itLoc.Value());
}
}
else if (Evol == TNaming_SELECTED) {
//PAS FINI.
TNaming_ShapesSet ResSel;
TopoDS_Shape PrevIn,CurIn;
// FindIn (LabOS,PrevIn,CurIn);
Localize(PrevIn,CurIn,OS,ResSel);
for (TNaming_IteratorOnShapesSet itLoc(ResSel); itLoc.More(); itLoc.Next()) {
ValidShapes.Add(itLoc.Value());
}
}
else {
Backward(itLBS.Value(),Primitives,ValidShapes);
}
}
}
*/
//=======================================================================
//function : NamedShape
//purpose :
//=======================================================================
Handle(TNaming_NamedShape) NamedShape(const TDF_Label& Lab)
{
Handle(TNaming_NamedShape) NS;
Lab.FindAttribute(TNaming_NamedShape::GetID(),NS);
return NS;
}
//=======================================================================
//function : Backward
//purpose :
//=======================================================================
void TNaming_Localizer::Backward (const Handle(TNaming_NamedShape)& NS,
const TopoDS_Shape& S,
TNaming_MapOfNamedShape& Primitives,
TopTools_MapOfShape& Shapes)
{
TNaming_Evolution Evol = NS->Evolution();
TDF_Label LabNS = NS->Label();
TopTools_ListOfShape LBS;
TNaming_ListOfNamedShape LBNS;
GoBack(S,LabNS,Evol,LBS,LBNS);
TopTools_ListIteratorOfListOfShape itLBS (LBS);
TNaming_ListIteratorOfListOfNamedShape itLBNS (LBNS);
if (LBS.IsEmpty()) {
Primitives.Add(NS);
}
for ( ; itLBS.More(); itLBS.Next(), itLBNS.Next()) {
const TopoDS_Shape& OS = itLBS.Value();
Handle(TNaming_NamedShape) NOS = itLBNS.Value();
Evol = NOS->Evolution();
if (Evol == TNaming_PRIMITIVE) {
Primitives.Add(NOS);
}
else if (Evol == TNaming_GENERATED) {
Shapes.Add(OS);
}
else {
Backward(NOS, itLBS.Value(),Primitives,Shapes);
}
}
}
//=======================================================================
//function : ValidCandidat
//purpose :
//=======================================================================
#ifdef OCCT_DEBUG
/*static Standard_Boolean StoreValid (const TopoDS_Shape& S,
const TopTools_MapOfShape& ShapeOfSol,
TopAbs_ShapeEnum TargetType,
TNaming_ShapesSet& Res)
{
Standard_Boolean Valid = Standard_False;
if (ShapeOfSol.Contains(S)) {
if (S.ShapeType() == TargetType) {
Res.Add(S);
return Standard_True;
}
else if (S.ShapeType() < TargetType) {
for (TopExp_Explorer exp(S,TargetType); exp.More(); exp.Next()) {
const TopoDS_Shape& SS = exp.Current();
Res.Add(SS);
Valid = Standard_True;
}
}
}
return Valid;
}*/
#endif
/*
//=======================================================================
//function : Forward
//purpose :
//=======================================================================
void TNaming_Localizer::GoForward(const TopoDS_Shape& S,
const TopTools_MapOfShape& Target,
const TopAbs_ShapeEnum TargetType,
TNaming_ShapesSet& Res)
{
Standard_Integer TrDef;
TDF_Label Lab = TNaming_Tool::Label (myUS, S, TrDef);
if (StoreValid (S, Target, TargetType, Res)) {
return;
}
TNaming_Evolution Evol = Evolution(Lab);
TNaming_NewShapeIterator NewIt(S,myCurTrans,myUS);
for ( ; NewIt.More(); NewIt.Next()) {
const TopoDS_Shape& NS = NewIt.Shape();
GoForward ( NS, Target, TargetType, Res);
}
}
*/
//=======================================================================
//function : FindNeighbourg
//purpose :
//=======================================================================
void TNaming_Localizer::FindNeighbourg (const TopoDS_Shape& Sol,
const TopoDS_Shape& S,
TopTools_MapOfShape& Neighbourg)
{
if(Sol.IsNull() || S.IsNull()) return;
TopAbs_ShapeEnum TA = S.ShapeType();
TopAbs_ShapeEnum TS=TopAbs_COMPOUND;
if (TA == TopAbs_FACE) TS = TopAbs_EDGE;
if (TA == TopAbs_EDGE) TS = TopAbs_VERTEX;
if (TA == TopAbs_VERTEX) TS = TopAbs_VERTEX; // szy 30.03.10
const TopTools_IndexedDataMapOfShapeListOfShape& Anc = Ancestors(Sol,TS);
// szy 30.03.10 to process case when Candidate is of type Vertex
// if (TA == TopAbs_VERTEX) {
//#ifdef OCCT_DEBUG
// cout <<"construction voisins des vertex impossible"<<endl;
//#endif
// return;
// }
for (TopExp_Explorer Exp(S,TS); Exp.More(); Exp.Next()) {
const TopoDS_Shape& SS = Exp.Current();
if (!Anc.Contains(SS)) {
//----------------------------------------------------
// Construction des ancetres
//----------------------------------------------------
break;
}
else {
TopTools_ListIteratorOfListOfShape itL(Anc.FindFromKey(SS));
for ( ; itL.More(); itL.Next()) {
if (!itL.Value().IsSame(S)) {
Neighbourg.Add(itL.Value());
}
}
}
}
}
//=======================================================================
//function : TNaming_Localizer
//purpose :
//=======================================================================
TNaming_Localizer::TNaming_Localizer()
{
}
//=======================================================================
//function : Init
//purpose :
//=======================================================================
void TNaming_Localizer::Init(const Handle(TNaming_UsedShapes)& US,
const Standard_Integer CurTrans)
{
myUS = US;
myCurTrans = CurTrans;
}
//=======================================================================
//function : Explode
//purpose :
//=======================================================================
#ifdef OCCT_DEBUG
/*static void Explode (TNaming_ShapesSet& Res,
TopAbs_ShapeEnum TS,
TNaming_ShapesSet& ResGoodType)
{
TNaming_IteratorOnShapesSet it(Res);
for ( ; it.More(); it.Next()) {
const TopoDS_Shape& S = it.Value();
TopExp_Explorer exp(S,TS);
for (; exp.More(); exp.Next()) {
ResGoodType.Add(exp.Current());
}
}
} */
#endif
/*
//=======================================================================
//function : Localize
//purpose :
//=======================================================================
void TNaming_Localizer::Localize(const TopoDS_Shape& PrevIn,
const TopoDS_Shape& CurIn ,
const TopoDS_Shape& S,
TNaming_ShapesSet& Res)
{
Res.Clear();
TDF_LabelMap Primitives;
TopTools_MapOfShape ValidShapes;
Standard_Integer PrevTrans = myCurTrans-1;
const TopTools_MapOfShape& CurSubShapes = SubShapes (CurIn,S.ShapeType());
Standard_Boolean HasLabel = TNaming_Tool::HasLabel(myUS,S);
if (HasLabel) {
Standard_Integer TrDef;
TDF_Label Lab = TNaming_Tool::Label (myUS, S, TrDef);
TNaming_Evolution Evol = Evolution(Lab);
if (Evol == TNaming_PRIMITIVE) {
//------------------------
// Label est une primitive
//------------------------
Primitives.Add(Lab);
Forward (CurSubShapes,S.ShapeType(),Primitives,ValidShapes,Res);
return;
}
if ((Evol == TNaming_GENERATED) && IsNewInLab (S,Lab,PrevTrans)) {
Localize(PrevIn,Lab,S,Res);
return;
}
}
if (HasLabel && HasAscendant(myUS,S,PrevTrans)) {
//-------------------
// Remontee Descente.
//-------------------
Backward (S, Primitives, ValidShapes);
Forward (CurSubShapes,S.ShapeType(),Primitives,ValidShapes,Res);
}
else {
//----------------------------------------------
// Localisation des ancetres.
//----------------------------------------------
TopTools_MapOfShape AncInFeature;
FindFeaturesInAncestors (S, PrevIn, AncInFeature);
TopTools_MapIteratorOfMapOfShape itF(AncInFeature);
Standard_Boolean First = Standard_True;
for ( ; itF.More(); itF.Next()) {
const TopoDS_Shape& AncOfS = itF.Key();
TNaming_ShapesSet ResAnc;
Localize (PrevIn, CurIn, AncOfS, ResAnc);
//---------------------------
// Res = Commun des resultats
//---------------------------
if (First) {
Explode (ResAnc,S.ShapeType(),Res);
First = 0;
}
else {
TNaming_ShapesSet ResGoodType;
Explode (ResAnc,S.ShapeType(),ResGoodType);
Res.Filter(ResGoodType);
}
}
}
}
*/
//=======================================================================
//function : FindGenerator
//purpose : Finds all generators of the <S> kept in <NS>
//=======================================================================
void TNaming_Localizer::FindGenerator (const Handle(TNaming_NamedShape)& NS,
const TopoDS_Shape& S,
TopTools_ListOfShape& theListOfGenerators)
{
Handle(TNaming_UsedShapes) US;
TDF_Label LabNS = NS->Label();
(LabNS.Root()).FindAttribute(TNaming_UsedShapes::GetID(),US);
for (TNaming_OldShapeIterator it (S,US); it.More(); it.Next()) {
if (it.Label() == LabNS) {
theListOfGenerators.Append(it.Shape());
// break; //szy 16.10.03
}
}
}
//=======================================================================
//function : FindShapeContext
//purpose : Finds context of the shape <S>.
// : Looks for all oldshapes kept at father label of <NS>.
// : If <S> validated as subshape of one of the old shapes -
// : this oldshape is Context.
//=======================================================================
void TNaming_Localizer::FindShapeContext (const Handle(TNaming_NamedShape)& NS,
const TopoDS_Shape& S,
TopoDS_Shape& SC)
{
#ifdef OCCT_DEBUG_SC
LWrite(S, "FSC_Sel.brep"); LPrintEntry( NS->Label());
#endif
TopTools_ListOfShape aList;
TDF_Label Father = NS->Label().Father();
TNaming_Iterator itLab(Father);
for (; itLab.More(); itLab.Next()) {
aList.Append(itLab.OldShape()); //szy
}
// szy
TopTools_ListIteratorOfListOfShape it(aList);
Standard_Boolean found = 0;
for(;it.More();it.Next()) {
SC = it.Value();
#ifdef OCCT_DEBUG_SC
LWrite(SC, "FSC_OldShape.brep");
#endif
if (SC.IsNull()) continue;
else {
if (SC.ShapeType() < S.ShapeType()) {
for (TopExp_Explorer exp(SC,S.ShapeType()); exp.More(); exp.Next()) {
if (exp.Current().IsSame(S)) {
found = 1;
#ifdef OCCT_DEBUG_SC
cout << "Find Context shape = " << SC.TShape() << "ShapeType = " << SC.ShapeType() <<endl;
#endif
break;
}
}
if(found) break;
}
}
}
// end szy
if (!SC.IsNull()) {
Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(SC,Father);
if (!aNS.IsNull()) {
#ifdef OCCT_DEBUG_SC
cout << "FindShapeContext: ";LPrintEntry(aNS->Label());
#endif
if (aNS->Label().Father().FindAttribute(TNaming_NamedShape::GetID(),aNS)) {
TopoDS_Shape aShape;
#ifdef OCCT_DEBUG_SC
LWriteNSOnLabel(aNS, "FSC");
#endif
TNaming_Iterator anIter(aNS->Label());
for(;anIter.More();anIter.Next()) {
aShape = anIter.NewShape();
if (!aShape.IsNull()) break;
}
if (!aShape.IsNull()) SC=aShape;
}
}
}
}
/*
//=======================================================================
//function : Localize
//purpose :
//=======================================================================
void TNaming_Localizer::Localize(const TopoDS_Shape& PrevIn,
const TDF_Label& InLab ,
const TopoDS_Shape& S,
TNaming_ShapesSet& Res)
{
Res.Clear();
TDF_LabelMap Primitives;
TopTools_MapOfShape ValidShapes;
Standard_Integer PrevTrans = myCurTrans - 1;
//---------------------------------------------
// Recuperation du nouveau contenant generateur.
//---------------------------------------------
TopoDS_Shape CurIn;
TDF_Label Father = InLab.Father();
TNaming_Iterator itLab(Father,myCurTrans);
for (; itLab.More(); itLab.Next()) {
CurIn= itLab.OldShape();
break;
}
Standard_Boolean First = 1;
TNaming_OldShapeIterator OldIt(S, PrevTrans,myUS);
for (; OldIt.More(); OldIt.Next()) {
if (OldIt.Label().IsEqual(InLab)) {
TNaming_ShapesSet RO;
TNaming_ShapesSet RInLab;
const TopoDS_Shape& OS = OldIt.Shape();
//---------------------------------
// Localisation des generateurs.
//---------------------------------
Localize(PrevIn,CurIn ,OS, RO);
//--------------------------------------------------------------------
// Resultat = intersection des descendants(dans InLab) des generateurs
//--------------------------------------------------------------------
TNaming_IteratorOnShapesSet itRO(RO);
for (; itRO.More(); itRO.Next()) {
const TopoDS_Shape& CO = itRO.Value();
TNaming_NewShapeIterator NewIt(CO,myCurTrans,myUS);
for (; NewIt.More(); NewIt.Next()) {
if (NewIt.Label().IsEqual(InLab)) {
if (First) Res.Add(NewIt.Shape());
else {
RInLab.Add(NewIt.Shape());
}
}
}
}
if (!First) Res.Filter(RInLab);
First = Standard_False;
}
}
}
//=======================================================================
//function : Forward
//purpose :
//=======================================================================
void TNaming_Localizer::Forward(const TopTools_MapOfShape& CurSubShapes,
const TopAbs_ShapeEnum TS,
const TDF_LabelMap& Primitives,
const TopTools_MapOfShape& ValidShapes,
TNaming_ShapesSet& Res)
{
//-------------------------------------------------------
// Descente dans la transaction courrante = myCurTrans
//----------------------------------------------------------
TopTools_MapIteratorOfMapOfShape itV(ValidShapes);
Standard_Boolean First = 1;
Standard_Boolean YaFromValid = 0;
Standard_Boolean YaFromPrimitives = 0;
for (; itV.More(); itV.Next()) {
YaFromValid = 1;
const TopoDS_Shape& NS = itV.Key();
if (First) {
GoForward (NS, CurSubShapes, TS, Res);
First = 0;
}
else {
TNaming_ShapesSet ResNS;
GoForward (NS, CurSubShapes, TS, ResNS);
Res.Filter(ResNS);
}
}
TDF_MapIteratorOfLabelMap itP(Primitives);
TNaming_ShapesSet ResPrim;
for ( ; itP.More(); itP.Next()) {
YaFromPrimitives = 1;
const TDF_Label& Lab = itP.Key();
TNaming_Iterator itL(Lab,myCurTrans);
TNaming_ShapesSet ResLab;
for (; itL.More(); itL.Next()) {
const TopoDS_Shape& NS = itL.NewShape();
GoForward (NS, CurSubShapes, TS, ResLab);
}
if (First) {
ResPrim = ResLab;
First = 0;
}
else
ResPrim.Filter(ResLab);
}
if (YaFromValid) {
if (YaFromPrimitives) {
Res.Filter(ResPrim);
}
}
else {
Res = ResPrim;
}
}
//=======================================================================
//function : FilterbyNeighbourgs
//purpose :
//=======================================================================
void TNaming_Localizer::FilterByNeighbourgs(const TopoDS_Shape& PrevIn,
const TopoDS_Shape& CurIn ,
const TopoDS_Shape& S,
TNaming_ShapesSet& Res)
{
TopTools_MapOfShape Neighbourg;
TopAbs_ShapeEnum TA = S.ShapeType();
TopAbs_ShapeEnum TS = TopAbs_ShapeEnum (S.ShapeType()+1);
TNaming_DataMapOfShapeShapesSet MapShapeRes;
const TopTools_IndexedDataMapOfShapeListOfShape& PreAnc =
Ancestors(PrevIn,TS);
//--------------------------------
// Construction des Voisins.
//--------------------------------
FindNeighbourg (PrevIn,PreAnc,S,Neighbourg);
TopTools_MapIteratorOfMapOfShape itNeig(Neighbourg);
TNaming_ShapesSet NewNeig;
for (; itNeig.More(); itNeig.Next()) {
const TopoDS_Shape& Neig = itNeig.Key();
//--------------------------------------------
// Localisation des voisins.
//--------------------------------------------
if (!MapShapeRes.IsBound(Neig)) {
TNaming_ShapesSet ResNeig;
Localize(PrevIn,CurIn,Neig,ResNeig);
MapShapeRes.Bind(Neig,ResNeig);
NewNeig.Add(ResNeig);
}
else {
NewNeig.Add(MapShapeRes(Neig));
}
}
//---------------------------------------------
// Filtre la solution par le resultat du voisin.
// ie : F est solution si ses voisins dans CurSol
// sont dans les descendants des voisins
//---------------------------------------------
TNaming_ShapesSet Reject;
TNaming_IteratorOnShapesSet itRes(Res);
const TopTools_IndexedDataMapOfShapeListOfShape& CurAnc =
Ancestors(CurIn,TS);
for (; itRes.More(); itRes.Next()) {
const TopoDS_Shape& Cand = itRes.Value();
TopTools_MapOfShape Neighbourg;
FindNeighbourg (CurIn,CurAnc,Cand,Neighbourg);
TopTools_MapIteratorOfMapOfShape itNeig(Neighbourg);
for (; itNeig.More(); itNeig.Next()) {
const TopoDS_Shape& Neig = itNeig.Key();
if (!NewNeig.Contains(Neig)) {
Reject.Add(Cand);
break;
}
}
}
Res.Remove(Reject);
}
*/