1 // Created on: 1996-12-18
2 // Created by: Yves FRICAUD
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <TNaming_NamedShape.ixx>
18 #include <TNaming_Builder.ixx>
20 #include <TDF_Label.hxx>
21 #include <TDF_Data.hxx>
22 #include <TDF_DeltaOnAddition.hxx>
23 #include <TDF_AttributeIterator.hxx>
24 #include <TNaming_PtrNode.hxx>
25 #include <TNaming_PtrRefShape.hxx>
26 #include <TNaming_RefShape.hxx>
27 #include <TNaming_PtrDataMapOfShapePtrRefShape.hxx>
28 #include <TNaming_UsedShapes.hxx>
29 #include <TNaming_Tool.hxx>
30 #include <TNaming_Iterator.hxx>
31 #include <TNaming_NewShapeIterator.hxx>
32 #include <TNaming_OldShapeIterator.hxx>
33 #include <TNaming_SameShapeIterator.hxx>
35 #include <TNaming_DeltaOnModification.hxx>
36 #include <TNaming_DeltaOnRemoval.hxx>
37 #include <Standard_NoMoreObject.hxx>
38 #include <Standard_NoSuchObject.hxx>
39 #include <Standard_ConstructionError.hxx>
40 #include <Standard_NullObject.hxx>
43 #include <BRepBuilderAPI_MakeVertex.hxx>
44 #include <TopoDS_Vertex.hxx>
46 // Defines the nodes classes
48 #include <Standard.hxx>
49 #include <TNaming_CopyShape.hxx>
51 #define BUC60921 //SRN 15/05/01 : Fixes the memory leak due to pointer to RefShape is not deleted
52 //#define MDTV_DEB_HASL
53 //=======================================================================
56 //=======================================================================
58 const Standard_GUID& TNaming_NamedShape::GetID()
60 static Standard_GUID TNaming_NamedShapeID("c4ef4200-568f-11d1-8940-080009dc3333");
61 return TNaming_NamedShapeID;
64 //=======================================================================
66 //=======================================================================
70 TNaming_Node(TNaming_PtrRefShape Old,
71 TNaming_PtrRefShape New)
72 : myOld(Old),myNew(New),
74 nextSameAttribute(0L), nextSameOld(0L),nextSameNew(0L)
77 //Label : Donne le Label
81 TNaming_Node* NextSameShape(TNaming_RefShape* prs);
83 // Test si l evolution est valide dans la transaction Trans
84 // ie : Trans n est pas anterieure a sa creation
85 // et Trans n est pas posterieure a son BackUp
86 Standard_Boolean IsValidInTrans(Standard_Integer Trans);
91 TNaming_PtrRefShape myOld;
92 TNaming_PtrRefShape myNew;
93 TNaming_NamedShape* myAtt;
94 TNaming_PtrNode nextSameAttribute;
95 TNaming_PtrNode nextSameOld;
96 TNaming_PtrNode nextSameNew;
99 //=======================================================================
100 //function : NextSameShape
102 //=======================================================================
104 TNaming_Node* TNaming_Node::NextSameShape(TNaming_RefShape* prs)
106 if (myOld == prs) return nextSameOld;
107 if (myNew == prs) return nextSameNew;
111 //=======================================================================
114 //=======================================================================
116 TDF_Label TNaming_Node::Label()
118 return myAtt->Label();
121 //=======================================================================
122 //function : IsValidInTrans
124 //=======================================================================
126 Standard_Boolean TNaming_Node::IsValidInTrans(Standard_Integer Trans)
128 if (myAtt->Transaction() <= Trans && Trans <= myAtt->UntilTransaction()) {
134 //**********************************************************************
135 // Methods of TNaming_NamedShape
136 //**********************************************************************
138 //=======================================================================
139 //function : TNaming_NamedShape
141 //=======================================================================
143 TNaming_NamedShape::TNaming_NamedShape()
149 //=======================================================================
152 //=======================================================================
154 Standard_Boolean TNaming_NamedShape::IsEmpty () const
156 TNaming_Iterator it (this);
161 //=======================================================================
164 //=======================================================================
166 TopoDS_Shape TNaming_NamedShape::Get () const
168 return TNaming_Tool::GetShape (this);
174 //=======================================================================
175 //function : RemoveNode
177 //=======================================================================
179 static void RemoveNode(Standard_Boolean MapExist ,
180 TNaming_DataMapOfShapePtrRefShape& M,
183 TNaming_RefShape* pos = N->myOld;
185 if (pos->FirstUse() == N) {
186 TNaming_Node* nextOld = N->nextSameOld;
188 pos->FirstUse(nextOld);
190 // le shape disparait
192 M.UnBind(pos->Shape());
204 TNaming_Node* pdn = pos->FirstUse();
207 if (pdn->NextSameShape(pos) == N) {
208 if (pdn->myOld == pos) pdn->nextSameOld = N->nextSameOld;
209 else pdn->nextSameNew = N->nextSameOld;
212 pdn = pdn->NextSameShape(pos);
217 TNaming_RefShape* pns = N->myNew;
219 if (pns->FirstUse() == N) {
220 TNaming_Node* nextNew = N->nextSameNew;
222 pns->FirstUse(nextNew);
225 // le shape disparait
227 M.UnBind(pns->Shape());
238 TNaming_Node* pdn = pns->FirstUse();
240 if (pdn->NextSameShape(pns) == N) {
241 if (pdn->myOld == pns) pdn->nextSameOld = N->nextSameNew;
242 else pdn->nextSameNew = N->nextSameNew;
245 pdn = pdn->NextSameShape(pns);
251 //=======================================================================
254 //=======================================================================
256 void TNaming_NamedShape::Clear()
258 if (Label().IsNull()) {
260 cout << "attention etat fantomatique" << endl;
265 Handle(TNaming_UsedShapes) US;
267 TNaming_DataMapOfShapePtrRefShape* M=NULL;
269 // Recuperation de la map si celle-ci n est pas deja detruite.
270 //Standard_Boolean MapExist = Ins.FindInRoot(TNaming_UsedShapes::GetID(),US);
272 Standard_Boolean MapExist = Label().Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
273 if (MapExist) M = &(US->Map());
275 TNaming_Node* p = myNode;
277 RemoveNode (MapExist,*M,p);
278 p = p->nextSameAttribute;
285 p = p->nextSameAttribute;
296 //=======================================================================
297 //function : BeforeRemoval
299 //=======================================================================
301 void TNaming_NamedShape::BeforeRemoval()
307 //=======================================================================
308 //function : BeforeUndo
309 //purpose : before application of a TDF_Delta.
310 //=======================================================================
312 Standard_Boolean TNaming_NamedShape::BeforeUndo
313 (const Handle(TDF_AttributeDelta)& /*anAttDelta*/,
314 const Standard_Boolean /*forceIt*/)
316 // if (anAttDelta->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) {
317 // anAttDelta->Attribute()->BeforeRemoval();
319 return Standard_True;
322 //=======================================================================
323 //function : AfterUndo
324 //purpose : After application of a TDF_Delta.
325 //=======================================================================
327 Standard_Boolean TNaming_NamedShape::AfterUndo
328 (const Handle(TDF_AttributeDelta)& anAttDelta,
329 const Standard_Boolean /*forceIt*/)
331 if (anAttDelta->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) {
332 Handle(TNaming_UsedShapes) US;
334 TNaming_DataMapOfShapePtrRefShape* M=NULL;
336 // Recuperation de la map si celle-ci n est pas deja detruite.
337 //Standard_Boolean MapExist = Ins.FindInRoot(TNaming_UsedShapes::GetID(),US);
339 Standard_Boolean MapExist = anAttDelta->Label().Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
341 if (MapExist) M = &(US->Map());
343 TNaming_Node* p = myNode;
345 RemoveNode (MapExist,*M,p);
346 p = p->nextSameAttribute;
353 p = p->nextSameAttribute;
363 return Standard_True;
367 //=======================================================================
368 //function : BackupCopy
370 //=======================================================================
372 Handle(TDF_Attribute) TNaming_NamedShape::BackupCopy() const
374 // Remarque dans le copy il est important de reporter le noeud de l attribut
375 // pour ne pas casser le chemin nextSameShape.
377 Handle(TNaming_NamedShape) Cop = new TNaming_NamedShape();
378 Cop->myNode = myNode;
379 Cop->myEvolution = myEvolution;
380 Cop->myVersion = myVersion;
382 // Mise a jour de myAtt sur les noeuds dans l attribut.
383 TNaming_Node* CN = Cop->myNode;
385 Handle(TNaming_NamedShape) A = this;
389 CN->myAtt = Cop.operator->();
390 CN = CN->nextSameAttribute;
396 //=======================================================================
399 //=======================================================================
401 void TNaming_NamedShape::Restore(const Handle(TDF_Attribute)& anAttribute)
405 TNaming_NamedShape* PAtt = (TNaming_NamedShape*)anAttribute.operator->();
406 myNode = PAtt->myNode;
407 myEvolution = PAtt->myEvolution;
408 myVersion = PAtt->myVersion;
410 // Mise a jour de myAtt sur les noeuds dans l attribut.
411 TNaming_Node* CN = myNode;
414 CN = CN->nextSameAttribute;
416 PAtt->myNode = 0L; //un noeud est dans un seul attribut.
420 //=======================================================================
421 //function : DeltaOnModification
423 //=======================================================================
425 Handle(TDF_DeltaOnModification) TNaming_NamedShape::DeltaOnModification
426 (const Handle(TDF_Attribute)& anOldAttribute) const
429 return new TNaming_DeltaOnModification(*((Handle(TNaming_NamedShape)*)&anOldAttribute));
432 //=======================================================================
433 //function : DeltaOnModification
435 //=======================================================================
437 void TNaming_NamedShape::DeltaOnModification(const Handle(TDF_DeltaOnModification)& aDelta)
442 //=======================================================================
443 //function : DeltaOnRemoval
445 //=======================================================================
447 Handle(TDF_DeltaOnRemoval) TNaming_NamedShape::DeltaOnRemoval() const
449 return new TNaming_DeltaOnRemoval(this);
452 //=======================================================================
453 //function : NewEmpty
455 //=======================================================================
457 Handle(TDF_Attribute) TNaming_NamedShape::NewEmpty () const
459 return new TNaming_NamedShape();
462 //=======================================================================
465 //=======================================================================
467 void TNaming_NamedShape::Paste(const Handle(TDF_Attribute)& into,
468 const Handle(TDF_RelocationTable)& Tab)
471 TDF_Label Lab = into->Label();
473 Standard_NullObject::Raise("TNaming_NamedShape::Paste");
475 TNaming_Builder B(Lab);
477 TNaming_Iterator It (this);
478 for ( ;It.More() ; It.Next()) {
479 const TopoDS_Shape& OS = It.OldShape();
480 const TopoDS_Shape& NS = It.NewShape();
481 TNaming_Evolution Status = It.Evolution();
483 // Modification_1 24.06.99 (szy)
484 TopoDS_Shape copOS, copNS;
485 if(Status != TNaming_PRIMITIVE)
486 TNaming_CopyShape::CopyTool(OS, Tab->TransientTable(), copOS);
487 else copOS.Nullify();
488 if(Status != TNaming_DELETE )
489 TNaming_CopyShape::CopyTool(NS, Tab->TransientTable(), copNS);
490 else copNS.Nullify();
493 case TNaming_PRIMITIVE :
498 case TNaming_GENERATED :
500 B.Generated(copOS, copNS);
503 case TNaming_MODIFY :
505 B.Modify(copOS, copNS);
508 case TNaming_DELETE :
513 case TNaming_SELECTED :
515 B.Select(copNS,copOS);
525 //=======================================================================
526 //function : References
528 //=======================================================================
530 void TNaming_NamedShape::References(const Handle(TDF_DataSet)& aDataSet) const
532 // Recherche des dependances.
533 // Pour chaque OldShape de l attribut on ajoute au dataSet son label d origine.
534 TNaming_Node* Current = myNode;
535 while (Current != NULL) {
536 if (Current->myOld != NULL) {
537 TNaming_RefShape* prs = Current->myOld;
538 TNaming_Node* pdn = prs->FirstUse();
540 while (pdn != NULL) {
541 if (pdn->myNew == prs && pdn->myAtt->Evolution() != TNaming_SELECTED) {
542 aDataSet->AddLabel(pdn->Label());
544 pdn = pdn->NextSameShape(prs);
547 Current = Current->nextSameAttribute;
552 //=======================================================================
555 //=======================================================================
557 void TNaming_NamedShape::Add(TNaming_Node*& pdn )
561 pdn->nextSameAttribute = myNode;
566 //=======================================================================
569 //=======================================================================
571 Standard_OStream& TNaming_NamedShape::Dump(Standard_OStream& anOS) const
576 //***************************************
577 // Fin Class Named_Shape.
578 //***************************************
581 //**********************************************************************
582 // Methods of the TNaming_Builder class
583 //**********************************************************************
585 ///=======================================================================
586 //function : TNaming_Builder
588 //=======================================================================
590 TNaming_Builder::TNaming_Builder (const TDF_Label& L)
592 // Find or Build Map;
593 const TDF_Label& root = L.Root();
594 if (!root.FindAttribute(TNaming_UsedShapes::GetID(),myShapes)) {
595 myShapes = new TNaming_UsedShapes();
596 root.AddAttribute (myShapes);
599 //Find Or Build Attribute in LIns.
600 if (!L.FindAttribute(TNaming_NamedShape::GetID(),myAtt)) {
601 myAtt = new TNaming_NamedShape();
602 L.AddAttribute(myAtt);
611 //=======================================================================
612 //function : TNaming_Builder
614 //=======================================================================
616 Handle(TNaming_NamedShape) TNaming_Builder::NamedShape() const
621 //=======================================================================
622 //function : UpdateNextSameShape
624 //=======================================================================
626 static void UpdateFirstUseOrNextSameShape(TNaming_RefShape*& prs,
629 TNaming_Node* ldn = prs->FirstUse();
634 TNaming_Node* cdn = ldn;
637 cdn = cdn->NextSameShape(prs);
639 Standard_ConstructionError::Raise("UpdateFirstUseOrNextSameShape");
643 // boucle interdite et inutile.
645 if (ldn->myOld == prs) ldn->nextSameOld = pdn;
646 if (ldn->myNew == prs) ldn->nextSameNew = pdn;
651 //=======================================================================
652 //function : Generate
654 //=======================================================================
656 void TNaming_Builder::Generated(const TopoDS_Shape& newShape)
658 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_PRIMITIVE;
660 if (myAtt->myEvolution != TNaming_PRIMITIVE)
661 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
664 TNaming_RefShape* pos = 0L;
665 TNaming_RefShape* pns;
667 if (myShapes->myMap.IsBound(newShape)) {
669 cout <<"TNaming_Builder::Generate : the shape is already in the attribute"<<endl;
671 pns = myShapes->myMap.ChangeFind(newShape);
672 if (pns->FirstUse()->myAtt == myAtt.operator->()) {
673 Standard_ConstructionError::Raise("TNaming_Builder::Generate");
675 TNaming_Node* pdn = new TNaming_Node(pos,pns);
677 UpdateFirstUseOrNextSameShape (pns,pdn);
680 pns = new TNaming_RefShape(newShape);
681 TNaming_Node* pdn = new TNaming_Node(pos,pns);
683 myShapes->myMap.Bind (newShape , pns);
690 //=======================================================================
693 //=======================================================================
695 void TNaming_Builder::Delete(const TopoDS_Shape& oldShape)
697 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_DELETE;
699 if (myAtt->myEvolution != TNaming_DELETE)
700 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
703 TNaming_RefShape* pns = 0L;
704 TNaming_RefShape* pos;
706 if (myShapes->myMap.IsBound(oldShape))
707 pos = myShapes->myMap.ChangeFind(oldShape);
710 cout <<"TNaming_Builder::Delete : the shape is not in the data"<<endl;
712 pos = new TNaming_RefShape(oldShape);
713 myShapes->myMap.Bind(oldShape, pos);
715 TNaming_Node* pdn = new TNaming_Node(pos,pns);
717 UpdateFirstUseOrNextSameShape (pos,pdn);
720 //=======================================================================
721 //function : Generate
723 //=======================================================================
725 void TNaming_Builder::Generated(const TopoDS_Shape& oldShape,
726 const TopoDS_Shape& newShape)
728 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_GENERATED;
730 if (myAtt->myEvolution != TNaming_GENERATED)
731 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
734 if (oldShape.IsSame(newShape)) {
736 cout <<"TNaming_Builder::Generate : oldShape IsSame newShape"<<endl;
740 TNaming_RefShape* pos;
741 if (!myShapes->myMap.IsBound(oldShape)) {
742 pos = new TNaming_RefShape(oldShape);
743 myShapes->myMap.Bind(oldShape,pos);
746 pos = myShapes->myMap.ChangeFind(oldShape);
748 TNaming_RefShape* pns;
749 if (!myShapes->myMap.IsBound(newShape)) {
750 pns = new TNaming_RefShape(newShape);
751 myShapes->myMap.Bind(newShape,pns);
754 pns = myShapes->myMap.ChangeFind(newShape);
756 TNaming_Node* pdn = new TNaming_Node(pos,pns);
758 UpdateFirstUseOrNextSameShape (pos,pdn);
759 UpdateFirstUseOrNextSameShape (pns,pdn);
763 //=======================================================================
766 //=======================================================================
768 void TNaming_Builder::Modify(const TopoDS_Shape& oldShape,
769 const TopoDS_Shape& newShape)
771 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_MODIFY;
773 if (myAtt->myEvolution != TNaming_MODIFY)
774 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
777 if (oldShape.IsSame(newShape)) {
779 cout <<"TNaming_Builder::Modify : oldShape IsSame newShape"<<endl;
783 TNaming_RefShape* pos;
784 if (!myShapes->myMap.IsBound(oldShape)) {
785 pos = new TNaming_RefShape(oldShape);
786 myShapes->myMap.Bind(oldShape,pos);
789 pos = myShapes->myMap.ChangeFind(oldShape);
791 TNaming_RefShape* pns;
792 if (!myShapes->myMap.IsBound(newShape)) {
793 pns = new TNaming_RefShape(newShape);
794 myShapes->myMap.Bind(newShape,pns);
797 pns = myShapes->myMap.ChangeFind(newShape);
799 TNaming_Node* pdn = new TNaming_Node(pos,pns);
801 UpdateFirstUseOrNextSameShape (pos,pdn);
802 UpdateFirstUseOrNextSameShape (pns,pdn);
806 //=======================================================================
809 //=======================================================================
810 void TNaming_Builder::Select (const TopoDS_Shape& S,
811 const TopoDS_Shape& InS)
813 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_SELECTED;
815 if (myAtt->myEvolution != TNaming_SELECTED)
816 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
819 TNaming_RefShape* pos;
820 if (!myShapes->myMap.IsBound(InS)) {
821 pos = new TNaming_RefShape(InS);
822 myShapes->myMap.Bind(InS,pos);
825 pos = myShapes->myMap.ChangeFind(InS);
827 TNaming_RefShape* pns;
828 if (!myShapes->myMap.IsBound(S)) {
829 pns = new TNaming_RefShape(S);
830 myShapes->myMap.Bind(S,pns);
833 pns = myShapes->myMap.ChangeFind(S);
835 TNaming_Node* pdn = new TNaming_Node(pos,pns);
837 UpdateFirstUseOrNextSameShape (pos,pdn);
838 UpdateFirstUseOrNextSameShape (pns,pdn);
841 //**********************************************************************
842 //Methods of the TNaming_Iterator class
843 //**********************************************************************
845 //=======================================================================
846 //function : TNaming_Iterator
848 //=======================================================================
850 TNaming_Iterator::TNaming_Iterator(const Handle(TNaming_NamedShape)& Att)
853 myNode = Att->myNode;
856 //=======================================================================
857 //function : TNaming_Iterator
859 //=======================================================================
861 TNaming_Iterator::TNaming_Iterator(const TDF_Label& Lab)
864 Handle(TNaming_NamedShape) Att;
865 if (Lab.FindAttribute(TNaming_NamedShape::GetID(),Att)) {
866 myNode = Att->myNode;
873 //=====================================================================
874 //function : TNaming_Iterator
876 //=======================================================================
878 TNaming_Iterator::TNaming_Iterator(const TDF_Label& Lab,
879 const Standard_Integer Trans)
882 Handle(TNaming_NamedShape) Att;
883 if (Lab.FindAttribute(TNaming_NamedShape::GetID(),Trans,Att)) {
884 myNode = Att->myNode;
889 cout <<"TNaming_Iterator : No Shape for this label"<<endl;
894 //=======================================================================
897 //=======================================================================
899 void TNaming_Iterator::Next()
901 Standard_NoMoreObject_Raise_if(myNode == 0L,
902 "TNaming_Iterator::Next");
903 myNode = myNode->nextSameAttribute;
906 //=======================================================================
907 //function : OldShape
909 //=======================================================================
911 const TopoDS_Shape& TNaming_Iterator::OldShape() const
913 Standard_NoSuchObject_Raise_if(myNode == 0L,
914 "TNaming_Iterator::OldShape");
915 if (myNode->myOld == 0L) {
916 static TopoDS_Shape NullShape;
919 return myNode->myOld->Shape();
922 //=======================================================================
923 //function : NewShape
925 //=======================================================================
927 const TopoDS_Shape& TNaming_Iterator::NewShape() const
929 Standard_NoSuchObject_Raise_if(myNode == 0L,
930 "TNaming_Iterator::NewShape");
931 if (myNode->myNew == 0L) {
932 static TopoDS_Shape NullShape;
935 return myNode->myNew->Shape();
939 //=======================================================================
940 //function : IsModification
942 //=======================================================================
944 Standard_Boolean TNaming_Iterator::IsModification() const
946 Standard_NoSuchObject_Raise_if(myNode == 0L,
947 "TNaming_Iterator::IsModification");
948 return (myNode->myAtt->myEvolution == TNaming_MODIFY ||
949 myNode->myAtt->myEvolution == TNaming_DELETE );
952 //=======================================================================
953 //function : Evolution
955 //=======================================================================
957 TNaming_Evolution TNaming_Iterator::Evolution() const
959 Standard_NoSuchObject_Raise_if(myNode == 0L,
960 "TNaming_Iterator::IsModification");
961 return myNode->myAtt->myEvolution;
966 //**********************************************************************
967 //Methods of the TNaming_NewShapeIterator class
968 //**********************************************************************
970 //=======================================================================
971 //function : SelectSameShape
972 //purpose : Selectionne le prochain noeud ou le shape est le meme que celui
973 // de RS. Old = 0 si il doit etre new dans le noeud a chercher.
974 // selection dans la transaction valide.
975 // On saute aussi les noeud ou OS = NS;
976 //=======================================================================
978 static void SelectSameShape (TNaming_Node*& myNode,
979 Standard_Boolean Old,
980 TNaming_RefShape*& RS,
981 const Standard_Integer& Trans)
983 TNaming_Node* pdn = myNode;
986 Standard_Boolean Valid;
987 if (Trans < 0) Valid = pdn->myAtt->IsValid();
988 else Valid = pdn->IsValidInTrans(Trans);
993 if( pdn->myOld == RS && pdn->myNew != 0L && pdn->myNew != RS) {
998 if( pdn->myNew == RS && pdn->myOld != 0L && pdn->myOld != RS) {
1003 pdn = pdn->NextSameShape(RS);
1008 //=======================================================================
1009 //function : TNaming_NewShapeIterator
1011 //=======================================================================
1013 TNaming_NewShapeIterator::TNaming_NewShapeIterator
1014 (const TopoDS_Shape& aShape,
1015 const Standard_Integer Trans,
1016 const Handle(TNaming_UsedShapes)& Shapes)
1019 Standard_Boolean Old = Standard_True;
1020 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1021 myNode = RS->FirstUse();
1022 SelectSameShape(myNode,Old,RS,myTrans);
1025 //=======================================================================
1026 //function : TNaming_NewShapeIterator
1028 //=======================================================================
1030 TNaming_NewShapeIterator::TNaming_NewShapeIterator
1031 (const TopoDS_Shape& aShape,
1032 const Standard_Integer Trans,
1033 const TDF_Label& access)
1036 Handle(TNaming_UsedShapes) Shapes;
1037 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1038 Standard_Boolean Old = Standard_True;
1039 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1040 myNode = RS->FirstUse();
1041 SelectSameShape(myNode,Old,RS,myTrans);
1045 //=======================================================================
1046 //function : TNaming_NewShapeIterator
1048 //=======================================================================
1050 TNaming_NewShapeIterator::TNaming_NewShapeIterator (const TNaming_Iterator& anIterator)
1051 :myTrans(anIterator.myTrans)
1053 Standard_Boolean Old = Standard_True;
1054 myNode = anIterator.myNode;
1055 TNaming_RefShape* RS = myNode->myNew;
1057 myNode = 0L; // No descendant
1059 // il faut repartir de la premiere utilisation.
1060 myNode = RS->FirstUse();
1061 SelectSameShape(myNode,Old,RS,myTrans);
1065 //=======================================================================
1066 //function : TNaming_NewShapeIterator
1068 //=======================================================================
1070 TNaming_NewShapeIterator::TNaming_NewShapeIterator
1071 (const TopoDS_Shape& aShape,
1072 const Handle(TNaming_UsedShapes)& Shapes)
1075 Standard_Boolean Old = Standard_True;
1076 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1077 myNode = RS->FirstUse();
1078 SelectSameShape(myNode,Old,RS,myTrans);
1081 //=======================================================================
1082 //function : TNaming_NewShapeIterator
1084 //=======================================================================
1086 TNaming_NewShapeIterator::TNaming_NewShapeIterator
1087 (const TopoDS_Shape& aShape,
1088 const TDF_Label& access)
1091 Handle(TNaming_UsedShapes) Shapes;
1092 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1093 Standard_Boolean Old = Standard_True;
1094 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1095 myNode = RS->FirstUse();
1096 SelectSameShape(myNode,Old,RS,myTrans);
1100 //=======================================================================
1101 //function : TNaming_NewShapeIterator
1103 //=======================================================================
1105 TNaming_NewShapeIterator::TNaming_NewShapeIterator(const TNaming_NewShapeIterator& anIterator)
1106 :myTrans(anIterator.myTrans)
1108 Standard_Boolean Old = Standard_True;
1109 myNode = anIterator.myNode;
1110 TNaming_RefShape* RS = myNode->myNew;
1112 myNode = 0L; // No descendant
1114 // il faut repartir de la premiere utilisation.
1115 myNode = RS->FirstUse();
1116 SelectSameShape(myNode,Old,RS,myTrans);
1120 //=======================================================================
1123 //=======================================================================
1125 void TNaming_NewShapeIterator::Next()
1127 Standard_Boolean Old = Standard_True;
1128 TNaming_RefShape* RS = myNode->myOld;
1129 myNode = myNode->NextSameShape(RS);
1130 SelectSameShape(myNode,Old,RS,myTrans);
1133 //=======================================================================
1136 //=======================================================================
1138 TDF_Label TNaming_NewShapeIterator::Label() const
1140 Standard_NoSuchObject_Raise_if(myNode == 0L,
1141 "TNaming_NewShapeIterator::Label");
1142 return myNode->Label();
1145 //=======================================================================
1146 //function : NamedShape
1148 //=======================================================================
1150 Handle(TNaming_NamedShape) TNaming_NewShapeIterator::NamedShape() const
1152 Standard_NoSuchObject_Raise_if(myNode == 0L,
1153 "TNaming_NewShapeIterator::Label");
1154 return myNode->myAtt;
1157 //=======================================================================
1160 //=======================================================================
1162 const TopoDS_Shape& TNaming_NewShapeIterator::Shape() const
1164 Standard_NoSuchObject_Raise_if(myNode == 0L,
1165 "TNaming_NewShapeIterator::Shape");
1166 return myNode->myNew->Shape();
1169 //=======================================================================
1170 //function : IsModification
1172 //=======================================================================
1174 Standard_Boolean TNaming_NewShapeIterator::IsModification() const
1176 Standard_NoSuchObject_Raise_if(myNode == 0L,
1177 "TNaming_NewShapeIterator::IsModification");
1179 return (myNode->myAtt->myEvolution == TNaming_MODIFY ||
1180 myNode->myAtt->myEvolution == TNaming_DELETE );
1183 //**********************************************************************
1184 //Methods of the TNaming_OldShapeIterator class
1185 //**********************************************************************
1186 //=======================================================================
1187 //function : TNaming_OldShapeIterator
1189 //=======================================================================
1191 TNaming_OldShapeIterator::TNaming_OldShapeIterator
1192 (const TopoDS_Shape& aShape,
1193 const Standard_Integer Trans,
1194 const Handle(TNaming_UsedShapes)& Shapes)
1197 Standard_Boolean Old = Standard_False;
1198 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1199 myNode = RS->FirstUse();
1200 SelectSameShape(myNode,Old,RS,myTrans);
1203 //=======================================================================
1204 //function : TNaming_OldShapeIterator
1206 //=======================================================================
1208 TNaming_OldShapeIterator::TNaming_OldShapeIterator
1209 (const TopoDS_Shape& aShape,
1210 const Standard_Integer Trans,
1211 const TDF_Label& access)
1214 Handle(TNaming_UsedShapes) Shapes;
1215 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1216 Standard_Boolean Old = Standard_False;
1217 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1218 myNode = RS->FirstUse();
1219 SelectSameShape(myNode,Old,RS,myTrans);
1222 //=======================================================================
1223 //function : TNaming_OldShapeIterator
1225 //=======================================================================
1227 TNaming_OldShapeIterator::TNaming_OldShapeIterator
1228 (const TopoDS_Shape& aShape,
1229 const Handle(TNaming_UsedShapes)& Shapes)
1232 Standard_Boolean Old = Standard_False;
1233 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1234 myNode = RS->FirstUse();
1235 SelectSameShape(myNode,Old,RS,myTrans);
1238 //=======================================================================
1239 //function : TNaming_OldShapeIterator
1241 //=======================================================================
1243 TNaming_OldShapeIterator::TNaming_OldShapeIterator
1244 (const TopoDS_Shape& aShape,
1245 const TDF_Label& access)
1248 Handle(TNaming_UsedShapes) Shapes;
1249 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1250 Standard_Boolean Old = Standard_False;
1251 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1252 myNode = RS->FirstUse();
1253 SelectSameShape(myNode,Old,RS,myTrans);
1257 //=======================================================================
1258 //function : TNaming_OldShapeIterator
1260 //=======================================================================
1262 TNaming_OldShapeIterator::TNaming_OldShapeIterator (const TNaming_Iterator& anIterator)
1263 :myTrans(anIterator.myTrans)
1265 Standard_Boolean Old = Standard_False;
1266 myNode = anIterator.myNode;
1267 TNaming_RefShape* RS = myNode->myNew;
1269 myNode = 0L; // No descendant
1271 // il faut repartir de la premiere utilisation.
1272 myNode = RS->FirstUse();
1273 SelectSameShape(myNode,Old,RS,myTrans);
1277 //=======================================================================
1278 //function : TNaming_OldShapeIterator
1280 //=======================================================================
1282 TNaming_OldShapeIterator::TNaming_OldShapeIterator(const TNaming_OldShapeIterator& anIterator)
1283 :myTrans(anIterator.myTrans)
1285 Standard_Boolean Old = Standard_False;
1286 myNode = anIterator.myNode;
1287 TNaming_RefShape* RS = myNode->myOld;
1289 myNode = 0L; // No descendant
1291 // il faut repartir de la premiere utilisation.
1292 myNode = RS->FirstUse();
1293 SelectSameShape(myNode,Old,RS,myTrans);
1297 //=======================================================================
1300 //=======================================================================
1302 void TNaming_OldShapeIterator::Next()
1304 Standard_Boolean Old = Standard_False;
1305 TNaming_RefShape* RS = myNode->myNew;
1306 myNode = myNode->NextSameShape(RS);
1307 SelectSameShape(myNode,Old,RS,myTrans);
1310 //=======================================================================
1313 //=======================================================================
1315 TDF_Label TNaming_OldShapeIterator::Label() const
1317 if (myNode == 0L) Standard_NoSuchObject::Raise("TNaming_OldShapeIterator::Label");
1318 return myNode->Label();
1322 //=======================================================================
1323 //function : NamedShape
1325 //=======================================================================
1327 Handle(TNaming_NamedShape) TNaming_OldShapeIterator::NamedShape() const
1329 if (myNode == 0L) Standard_NoSuchObject::Raise("TNaming_OldShapeIterator::Label");
1330 return myNode->myAtt;
1332 //=======================================================================
1335 //=======================================================================
1337 const TopoDS_Shape& TNaming_OldShapeIterator::Shape() const
1339 if(myNode == 0L) Standard_NoSuchObject::Raise("TNaming_OldShapeIterator::Shape");
1340 return myNode->myOld->Shape();
1343 //=======================================================================
1344 //function : IsModification
1346 //=======================================================================
1348 Standard_Boolean TNaming_OldShapeIterator::IsModification() const
1350 Standard_NoSuchObject_Raise_if(myNode == 0L,
1351 "TNaming_OldShapeIterator::IsModification");
1352 return (myNode->myAtt->myEvolution == TNaming_MODIFY ||
1353 myNode->myAtt->myEvolution == TNaming_DELETE );
1357 //**********************************************************************
1358 //Methods of the SameShapeIterator
1359 //**********************************************************************
1361 //=======================================================================
1364 //=======================================================================
1366 TNaming_SameShapeIterator::TNaming_SameShapeIterator
1367 (const TopoDS_Shape& aShape,
1368 const Handle(TNaming_UsedShapes)& Shapes)
1370 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1371 myNode = RS->FirstUse();
1372 myIsNew = (myNode->myNew == RS);
1376 //=======================================================================
1377 //function : TNaming_SameShapeIterator
1379 //=======================================================================
1381 TNaming_SameShapeIterator::TNaming_SameShapeIterator
1382 (const TopoDS_Shape& aShape,
1383 const TDF_Label& access)
1385 Handle(TNaming_UsedShapes) Shapes;
1386 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1387 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1388 myNode = RS->FirstUse();
1389 myIsNew = (myNode->myNew == RS);
1393 //=======================================================================
1396 //=======================================================================
1398 void TNaming_SameShapeIterator::Next()
1400 TNaming_RefShape* prs;
1401 if (myIsNew) prs = myNode->myNew; else prs = myNode->myOld;
1403 myNode = myNode->NextSameShape(prs);
1404 if (myNode != 0L) myIsNew = (myNode->myNew == prs);
1407 //=======================================================================
1410 //=======================================================================
1412 TDF_Label TNaming_SameShapeIterator::Label() const
1414 Standard_NoSuchObject_Raise_if(myNode == 0L,
1415 "TNaming_SameShapeIterator::Label");
1416 return myNode->Label();
1420 //**********************************************************************
1421 //Methods of the TNaming_RefShape
1422 //**********************************************************************
1423 //=======================================================================
1426 //=======================================================================
1428 TDF_Label TNaming_RefShape::Label() const
1430 return myFirstUse->myAtt->Label();
1433 //=======================================================================
1434 //function : NamedShape
1436 //=======================================================================
1438 Handle(TNaming_NamedShape) TNaming_RefShape::NamedShape() const
1440 return myFirstUse->myAtt;
1444 //**********************************************************************
1445 //Methods of the TNaming_Tool class
1446 //**********************************************************************
1448 //=======================================================================
1449 //function : HasLabel
1451 //=======================================================================
1453 Standard_Boolean TNaming_Tool::HasLabel (const TDF_Label& access,
1454 const TopoDS_Shape& S)
1456 Handle(TNaming_UsedShapes) US;
1457 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),US)) {
1458 return (US->Map().IsBound(S));
1460 #ifdef MDTV_DEB_HASL
1461 cout << "##==> Sub-Shape has no Label!" <<endl;
1463 return Standard_False;
1467 //=======================================================================
1470 //=======================================================================
1472 TDF_Label TNaming_Tool::Label(const TDF_Label& access,
1473 const TopoDS_Shape& S,
1474 Standard_Integer& Trans)
1476 Standard_NoSuchObject_Raise_if(!TNaming_Tool::HasLabel(access,S),"TNaming_Tool::Label");
1477 Handle(TNaming_UsedShapes) US;
1478 access.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
1479 return TNaming_Tool::Label(US,S,Trans);
1483 //=======================================================================
1484 //function : IsValidInTrans
1485 //purpose : un shape est valid tant que l attribut ou il est cree est valid
1486 //=======================================================================
1488 Standard_Integer TNaming_Tool::ValidUntil (const TDF_Label& access, const TopoDS_Shape& S)
1490 Standard_NoSuchObject_Raise_if(!TNaming_Tool::HasLabel(access,S),"TNaming_Tool::ValidUntil");
1491 Handle(TNaming_UsedShapes) US;
1492 access.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
1493 return TNaming_Tool::ValidUntil(S,US);
1497 //=======================================================================
1498 //function : HasLabel
1500 //=======================================================================
1502 Standard_Boolean TNaming_Tool::HasLabel(const Handle(TNaming_UsedShapes)& Shapes,
1503 const TopoDS_Shape& S)
1505 return (Shapes->Map().IsBound(S));
1509 //=======================================================================
1512 //=======================================================================
1514 TDF_Label TNaming_Tool::Label(const Handle(TNaming_UsedShapes)& Shapes,
1515 const TopoDS_Shape& S,
1516 Standard_Integer& Trans)
1518 Standard_NoSuchObject_Raise_if(!TNaming_Tool::HasLabel(Shapes,S),"TNaming_Tool::Label");
1519 TNaming_RefShape* prs = Shapes->Map().Find(S);
1520 TNaming_Node* pdn = prs->FirstUse();
1522 while (pdn != 0L && !(pdn->myNew == prs && pdn->myAtt->Evolution() != TNaming_SELECTED)){
1523 pdn = pdn->NextSameShape(prs);
1525 if (pdn == 0L) pdn = prs->FirstUse();
1527 TDF_Label L = pdn->Label();
1528 Trans = pdn->myAtt->Transaction();
1531 //=======================================================================
1532 //function : NamedShape
1534 //=======================================================================
1535 Handle(TNaming_NamedShape) TNaming_Tool::NamedShape(const TopoDS_Shape& S,
1536 const TDF_Label& Acces)
1538 Handle(TNaming_UsedShapes) US;
1539 Acces.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
1540 Handle(TNaming_NamedShape) NS;
1542 if(!TNaming_Tool::HasLabel(US,S)) {
1546 TNaming_RefShape* prs = US->Map().Find(S);
1547 TNaming_Node* pdn = prs->FirstUse();
1548 TNaming_Node* res = 0L;
1551 if (pdn->myNew == prs && pdn->myAtt->Evolution() != TNaming_SELECTED) {
1553 if (pdn->myAtt->Evolution() != TNaming_GENERATED) {
1554 // Les modifications sont privilegiees par rapport au generation.
1555 // Dans le cas des shapes qui sont a la fois des modifications et des generations
1560 pdn = pdn->NextSameShape(prs);
1563 if (res == 0L) return NS;
1565 // VERUE EN ATTENDANT DE REVOIR ABORT 03/11/98
1566 // Protection pour eviter de renvoyer un attribut backuped
1567 TDF_Label Lab = res->Label();
1568 Lab.FindAttribute(TNaming_NamedShape::GetID(),NS);
1570 // return res->myAtt;
1573 //=======================================================================
1574 //function : IsValidInTrans
1575 //purpose : un shape est valid tant que l attribut ou il est cree est valid
1576 //=======================================================================
1578 Standard_Integer TNaming_Tool::ValidUntil (const TopoDS_Shape& S,
1579 const Handle(TNaming_UsedShapes)& US)
1581 Standard_NoSuchObject_Raise_if(!TNaming_Tool::HasLabel(US,S),"TNaming_Tool::ValidUntil");
1583 TNaming_RefShape* RS = US->Map().ChangeFind(S);
1584 Standard_Integer Cur;
1585 Standard_Integer Until = 0;
1586 TNaming_Node* Node = RS->FirstUse();
1588 while (Node != 0L) {
1589 if (Node->myNew != 0L && Node->myNew == RS) {
1590 Cur = Node->myAtt->UntilTransaction();
1591 if (Cur > Until) Until = Cur;
1593 Node = Node->NextSameShape(RS);