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 MDTV_DEB_HASL
52 //=======================================================================
55 //=======================================================================
57 const Standard_GUID& TNaming_NamedShape::GetID()
59 static Standard_GUID TNaming_NamedShapeID("c4ef4200-568f-11d1-8940-080009dc3333");
60 return TNaming_NamedShapeID;
63 //=======================================================================
65 //=======================================================================
69 TNaming_Node(TNaming_PtrRefShape Old,
70 TNaming_PtrRefShape New)
71 : myOld(Old),myNew(New),
73 nextSameAttribute(0L), nextSameOld(0L),nextSameNew(0L)
76 //Label : Donne le Label
80 TNaming_Node* NextSameShape(TNaming_RefShape* prs);
82 // Test si l evolution est valide dans la transaction Trans
83 // ie : Trans n est pas anterieure a sa creation
84 // et Trans n est pas posterieure a son BackUp
85 Standard_Boolean IsValidInTrans(Standard_Integer Trans);
90 TNaming_PtrRefShape myOld;
91 TNaming_PtrRefShape myNew;
92 TNaming_NamedShape* myAtt;
93 TNaming_PtrNode nextSameAttribute;
94 TNaming_PtrNode nextSameOld;
95 TNaming_PtrNode nextSameNew;
98 //=======================================================================
99 //function : NextSameShape
101 //=======================================================================
103 TNaming_Node* TNaming_Node::NextSameShape(TNaming_RefShape* prs)
105 if (myOld == prs) return nextSameOld;
106 if (myNew == prs) return nextSameNew;
110 //=======================================================================
113 //=======================================================================
115 TDF_Label TNaming_Node::Label()
117 return myAtt->Label();
120 //=======================================================================
121 //function : IsValidInTrans
123 //=======================================================================
125 Standard_Boolean TNaming_Node::IsValidInTrans(Standard_Integer Trans)
127 if (myAtt->Transaction() <= Trans && Trans <= myAtt->UntilTransaction()) {
133 //**********************************************************************
134 // Methods of TNaming_NamedShape
135 //**********************************************************************
137 //=======================================================================
138 //function : TNaming_NamedShape
140 //=======================================================================
142 TNaming_NamedShape::TNaming_NamedShape()
148 //=======================================================================
151 //=======================================================================
153 Standard_Boolean TNaming_NamedShape::IsEmpty () const
155 TNaming_Iterator it (this);
160 //=======================================================================
163 //=======================================================================
165 TopoDS_Shape TNaming_NamedShape::Get () const
167 return TNaming_Tool::GetShape (this);
173 //=======================================================================
174 //function : RemoveNode
176 //=======================================================================
178 static void RemoveNode(Standard_Boolean MapExist ,
179 TNaming_DataMapOfShapePtrRefShape& M,
182 TNaming_RefShape* pos = N->myOld;
184 if (pos->FirstUse() == N) {
185 TNaming_Node* nextOld = N->nextSameOld;
187 pos->FirstUse(nextOld);
189 // le shape disparait
191 M.UnBind(pos->Shape());
201 TNaming_Node* pdn = pos->FirstUse();
204 if (pdn->NextSameShape(pos) == N) {
205 if (pdn->myOld == pos) pdn->nextSameOld = N->nextSameOld;
206 else pdn->nextSameNew = N->nextSameOld;
209 pdn = pdn->NextSameShape(pos);
214 TNaming_RefShape* pns = N->myNew;
216 if (pns->FirstUse() == N) {
217 TNaming_Node* nextNew = N->nextSameNew;
219 pns->FirstUse(nextNew);
222 // le shape disparait
224 M.UnBind(pns->Shape());
235 TNaming_Node* pdn = pns->FirstUse();
237 if (pdn->NextSameShape(pns) == N) {
238 if (pdn->myOld == pns) pdn->nextSameOld = N->nextSameNew;
239 else pdn->nextSameNew = N->nextSameNew;
242 pdn = pdn->NextSameShape(pns);
248 //=======================================================================
251 //=======================================================================
253 void TNaming_NamedShape::Clear()
255 if (Label().IsNull()) {
256 #ifdef OCCT_DEBUG_BUILDER
257 cout << "attention etat fantomatique" << endl;
262 Handle(TNaming_UsedShapes) US;
264 TNaming_DataMapOfShapePtrRefShape* M=NULL;
266 // Recuperation de la map si celle-ci n est pas deja detruite.
267 //Standard_Boolean MapExist = Ins.FindInRoot(TNaming_UsedShapes::GetID(),US);
269 Standard_Boolean MapExist = Label().Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
270 if (MapExist) M = &(US->Map());
272 TNaming_Node* p = myNode;
274 RemoveNode (MapExist,*M,p);
275 p = p->nextSameAttribute;
282 p = p->nextSameAttribute;
293 //=======================================================================
294 //function : BeforeRemoval
296 //=======================================================================
298 void TNaming_NamedShape::BeforeRemoval()
304 //=======================================================================
305 //function : BeforeUndo
306 //purpose : before application of a TDF_Delta.
307 //=======================================================================
309 Standard_Boolean TNaming_NamedShape::BeforeUndo
310 (const Handle(TDF_AttributeDelta)& /*anAttDelta*/,
311 const Standard_Boolean /*forceIt*/)
313 // if (anAttDelta->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) {
314 // anAttDelta->Attribute()->BeforeRemoval();
316 return Standard_True;
319 //=======================================================================
320 //function : AfterUndo
321 //purpose : After application of a TDF_Delta.
322 //=======================================================================
324 Standard_Boolean TNaming_NamedShape::AfterUndo
325 (const Handle(TDF_AttributeDelta)& anAttDelta,
326 const Standard_Boolean /*forceIt*/)
328 if (anAttDelta->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) {
329 Handle(TNaming_UsedShapes) US;
331 TNaming_DataMapOfShapePtrRefShape* M=NULL;
333 // Recuperation de la map si celle-ci n est pas deja detruite.
334 //Standard_Boolean MapExist = Ins.FindInRoot(TNaming_UsedShapes::GetID(),US);
336 Standard_Boolean MapExist = anAttDelta->Label().Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
338 if (MapExist) M = &(US->Map());
340 TNaming_Node* p = myNode;
342 RemoveNode (MapExist,*M,p);
343 p = p->nextSameAttribute;
350 p = p->nextSameAttribute;
360 return Standard_True;
364 //=======================================================================
365 //function : BackupCopy
367 //=======================================================================
369 Handle(TDF_Attribute) TNaming_NamedShape::BackupCopy() const
371 // Remarque dans le copy il est important de reporter le noeud de l attribut
372 // pour ne pas casser le chemin nextSameShape.
374 Handle(TNaming_NamedShape) Cop = new TNaming_NamedShape();
375 Cop->myNode = myNode;
376 Cop->myEvolution = myEvolution;
377 Cop->myVersion = myVersion;
379 // Mise a jour de myAtt sur les noeuds dans l attribut.
380 TNaming_Node* CN = Cop->myNode;
382 Handle(TNaming_NamedShape) A = this;
386 CN->myAtt = Cop.operator->();
387 CN = CN->nextSameAttribute;
393 //=======================================================================
396 //=======================================================================
398 void TNaming_NamedShape::Restore(const Handle(TDF_Attribute)& anAttribute)
402 TNaming_NamedShape* PAtt = (TNaming_NamedShape*)anAttribute.operator->();
403 myNode = PAtt->myNode;
404 myEvolution = PAtt->myEvolution;
405 myVersion = PAtt->myVersion;
407 // Mise a jour de myAtt sur les noeuds dans l attribut.
408 TNaming_Node* CN = myNode;
411 CN = CN->nextSameAttribute;
413 PAtt->myNode = 0L; //un noeud est dans un seul attribut.
417 //=======================================================================
418 //function : DeltaOnModification
420 //=======================================================================
422 Handle(TDF_DeltaOnModification) TNaming_NamedShape::DeltaOnModification
423 (const Handle(TDF_Attribute)& anOldAttribute) const
426 return new TNaming_DeltaOnModification(*((Handle(TNaming_NamedShape)*)&anOldAttribute));
429 //=======================================================================
430 //function : DeltaOnModification
432 //=======================================================================
434 void TNaming_NamedShape::DeltaOnModification(const Handle(TDF_DeltaOnModification)& aDelta)
439 //=======================================================================
440 //function : DeltaOnRemoval
442 //=======================================================================
444 Handle(TDF_DeltaOnRemoval) TNaming_NamedShape::DeltaOnRemoval() const
446 return new TNaming_DeltaOnRemoval(this);
449 //=======================================================================
450 //function : NewEmpty
452 //=======================================================================
454 Handle(TDF_Attribute) TNaming_NamedShape::NewEmpty () const
456 return new TNaming_NamedShape();
459 //=======================================================================
462 //=======================================================================
464 void TNaming_NamedShape::Paste(const Handle(TDF_Attribute)& into,
465 const Handle(TDF_RelocationTable)& Tab)
468 TDF_Label Lab = into->Label();
470 Standard_NullObject::Raise("TNaming_NamedShape::Paste");
472 TNaming_Builder B(Lab);
474 TNaming_Iterator It (this);
475 for ( ;It.More() ; It.Next()) {
476 const TopoDS_Shape& OS = It.OldShape();
477 const TopoDS_Shape& NS = It.NewShape();
478 TNaming_Evolution Status = It.Evolution();
480 // Modification_1 24.06.99 (szy)
481 TopoDS_Shape copOS, copNS;
482 if(Status != TNaming_PRIMITIVE)
483 TNaming_CopyShape::CopyTool(OS, Tab->TransientTable(), copOS);
484 else copOS.Nullify();
485 if(Status != TNaming_DELETE )
486 TNaming_CopyShape::CopyTool(NS, Tab->TransientTable(), copNS);
487 else copNS.Nullify();
490 case TNaming_PRIMITIVE :
495 case TNaming_GENERATED :
497 B.Generated(copOS, copNS);
500 case TNaming_MODIFY :
502 B.Modify(copOS, copNS);
505 case TNaming_DELETE :
510 case TNaming_SELECTED :
512 B.Select(copNS,copOS);
522 //=======================================================================
523 //function : References
525 //=======================================================================
527 void TNaming_NamedShape::References(const Handle(TDF_DataSet)& aDataSet) const
529 // Recherche des dependances.
530 // Pour chaque OldShape de l attribut on ajoute au dataSet son label d origine.
531 TNaming_Node* Current = myNode;
532 while (Current != NULL) {
533 if (Current->myOld != NULL) {
534 TNaming_RefShape* prs = Current->myOld;
535 TNaming_Node* pdn = prs->FirstUse();
537 while (pdn != NULL) {
538 if (pdn->myNew == prs && pdn->myAtt->Evolution() != TNaming_SELECTED) {
539 aDataSet->AddLabel(pdn->Label());
541 pdn = pdn->NextSameShape(prs);
544 Current = Current->nextSameAttribute;
549 //=======================================================================
552 //=======================================================================
554 void TNaming_NamedShape::Add(TNaming_Node*& pdn )
558 pdn->nextSameAttribute = myNode;
563 //=======================================================================
566 //=======================================================================
568 Standard_OStream& TNaming_NamedShape::Dump(Standard_OStream& anOS) const
573 //***************************************
574 // Fin Class Named_Shape.
575 //***************************************
578 //**********************************************************************
579 // Methods of the TNaming_Builder class
580 //**********************************************************************
582 ///=======================================================================
583 //function : TNaming_Builder
585 //=======================================================================
587 TNaming_Builder::TNaming_Builder (const TDF_Label& L)
589 // Find or Build Map;
590 const TDF_Label& root = L.Root();
591 if (!root.FindAttribute(TNaming_UsedShapes::GetID(),myShapes)) {
592 myShapes = new TNaming_UsedShapes();
593 root.AddAttribute (myShapes);
596 //Find Or Build Attribute in LIns.
597 if (!L.FindAttribute(TNaming_NamedShape::GetID(),myAtt)) {
598 myAtt = new TNaming_NamedShape();
599 L.AddAttribute(myAtt);
608 //=======================================================================
609 //function : TNaming_Builder
611 //=======================================================================
613 Handle(TNaming_NamedShape) TNaming_Builder::NamedShape() const
618 //=======================================================================
619 //function : UpdateNextSameShape
621 //=======================================================================
623 static void UpdateFirstUseOrNextSameShape(TNaming_RefShape*& prs,
626 TNaming_Node* ldn = prs->FirstUse();
631 TNaming_Node* cdn = ldn;
634 cdn = cdn->NextSameShape(prs);
636 Standard_ConstructionError::Raise("UpdateFirstUseOrNextSameShape");
640 // boucle interdite et inutile.
642 if (ldn->myOld == prs) ldn->nextSameOld = pdn;
643 if (ldn->myNew == prs) ldn->nextSameNew = pdn;
648 //=======================================================================
649 //function : Generate
651 //=======================================================================
653 void TNaming_Builder::Generated(const TopoDS_Shape& newShape)
655 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_PRIMITIVE;
657 if (myAtt->myEvolution != TNaming_PRIMITIVE)
658 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
661 TNaming_RefShape* pos = 0L;
662 TNaming_RefShape* pns;
664 if (myShapes->myMap.IsBound(newShape)) {
665 #ifdef OCCT_DEBUG_BUILDER
666 cout <<"TNaming_Builder::Generate : the shape is already in the attribute"<<endl;
668 pns = myShapes->myMap.ChangeFind(newShape);
669 if (pns->FirstUse()->myAtt == myAtt.operator->()) {
670 Standard_ConstructionError::Raise("TNaming_Builder::Generate");
672 TNaming_Node* pdn = new TNaming_Node(pos,pns);
674 UpdateFirstUseOrNextSameShape (pns,pdn);
677 pns = new TNaming_RefShape(newShape);
678 TNaming_Node* pdn = new TNaming_Node(pos,pns);
680 myShapes->myMap.Bind (newShape , pns);
687 //=======================================================================
690 //=======================================================================
692 void TNaming_Builder::Delete(const TopoDS_Shape& oldShape)
694 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_DELETE;
696 if (myAtt->myEvolution != TNaming_DELETE)
697 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
700 TNaming_RefShape* pns = 0L;
701 TNaming_RefShape* pos;
703 if (myShapes->myMap.IsBound(oldShape))
704 pos = myShapes->myMap.ChangeFind(oldShape);
706 #ifdef OCCT_DEBUG_BUILDER
707 cout <<"TNaming_Builder::Delete : the shape is not in the data"<<endl;
709 pos = new TNaming_RefShape(oldShape);
710 myShapes->myMap.Bind(oldShape, pos);
712 TNaming_Node* pdn = new TNaming_Node(pos,pns);
714 UpdateFirstUseOrNextSameShape (pos,pdn);
717 //=======================================================================
718 //function : Generate
720 //=======================================================================
722 void TNaming_Builder::Generated(const TopoDS_Shape& oldShape,
723 const TopoDS_Shape& newShape)
725 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_GENERATED;
727 if (myAtt->myEvolution != TNaming_GENERATED)
728 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
731 if (oldShape.IsSame(newShape)) {
732 #ifdef OCCT_DEBUG_BUILDER
733 cout <<"TNaming_Builder::Generate : oldShape IsSame newShape"<<endl;
737 TNaming_RefShape* pos;
738 if (!myShapes->myMap.IsBound(oldShape)) {
739 pos = new TNaming_RefShape(oldShape);
740 myShapes->myMap.Bind(oldShape,pos);
743 pos = myShapes->myMap.ChangeFind(oldShape);
745 TNaming_RefShape* pns;
746 if (!myShapes->myMap.IsBound(newShape)) {
747 pns = new TNaming_RefShape(newShape);
748 myShapes->myMap.Bind(newShape,pns);
751 pns = myShapes->myMap.ChangeFind(newShape);
753 TNaming_Node* pdn = new TNaming_Node(pos,pns);
755 UpdateFirstUseOrNextSameShape (pos,pdn);
756 UpdateFirstUseOrNextSameShape (pns,pdn);
760 //=======================================================================
763 //=======================================================================
765 void TNaming_Builder::Modify(const TopoDS_Shape& oldShape,
766 const TopoDS_Shape& newShape)
768 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_MODIFY;
770 if (myAtt->myEvolution != TNaming_MODIFY)
771 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
774 if (oldShape.IsSame(newShape)) {
775 #ifdef OCCT_DEBUG_BUILDER
776 cout <<"TNaming_Builder::Modify : oldShape IsSame newShape"<<endl;
780 TNaming_RefShape* pos;
781 if (!myShapes->myMap.IsBound(oldShape)) {
782 pos = new TNaming_RefShape(oldShape);
783 myShapes->myMap.Bind(oldShape,pos);
786 pos = myShapes->myMap.ChangeFind(oldShape);
788 TNaming_RefShape* pns;
789 if (!myShapes->myMap.IsBound(newShape)) {
790 pns = new TNaming_RefShape(newShape);
791 myShapes->myMap.Bind(newShape,pns);
794 pns = myShapes->myMap.ChangeFind(newShape);
796 TNaming_Node* pdn = new TNaming_Node(pos,pns);
798 UpdateFirstUseOrNextSameShape (pos,pdn);
799 UpdateFirstUseOrNextSameShape (pns,pdn);
803 //=======================================================================
806 //=======================================================================
807 void TNaming_Builder::Select (const TopoDS_Shape& S,
808 const TopoDS_Shape& InS)
810 if (myAtt->myNode == 0L) myAtt->myEvolution = TNaming_SELECTED;
812 if (myAtt->myEvolution != TNaming_SELECTED)
813 Standard_ConstructionError::Raise("TNaming_Builder : not same evolution");
816 TNaming_RefShape* pos;
817 if (!myShapes->myMap.IsBound(InS)) {
818 pos = new TNaming_RefShape(InS);
819 myShapes->myMap.Bind(InS,pos);
822 pos = myShapes->myMap.ChangeFind(InS);
824 TNaming_RefShape* pns;
825 if (!myShapes->myMap.IsBound(S)) {
826 pns = new TNaming_RefShape(S);
827 myShapes->myMap.Bind(S,pns);
830 pns = myShapes->myMap.ChangeFind(S);
832 TNaming_Node* pdn = new TNaming_Node(pos,pns);
834 UpdateFirstUseOrNextSameShape (pos,pdn);
835 UpdateFirstUseOrNextSameShape (pns,pdn);
838 //**********************************************************************
839 //Methods of the TNaming_Iterator class
840 //**********************************************************************
842 //=======================================================================
843 //function : TNaming_Iterator
845 //=======================================================================
847 TNaming_Iterator::TNaming_Iterator(const Handle(TNaming_NamedShape)& Att)
850 myNode = Att->myNode;
853 //=======================================================================
854 //function : TNaming_Iterator
856 //=======================================================================
858 TNaming_Iterator::TNaming_Iterator(const TDF_Label& Lab)
861 Handle(TNaming_NamedShape) Att;
862 if (Lab.FindAttribute(TNaming_NamedShape::GetID(),Att)) {
863 myNode = Att->myNode;
870 //=====================================================================
871 //function : TNaming_Iterator
873 //=======================================================================
875 TNaming_Iterator::TNaming_Iterator(const TDF_Label& Lab,
876 const Standard_Integer Trans)
879 Handle(TNaming_NamedShape) Att;
880 if (Lab.FindAttribute(TNaming_NamedShape::GetID(),Trans,Att)) {
881 myNode = Att->myNode;
886 cout <<"TNaming_Iterator : No Shape for this label"<<endl;
891 //=======================================================================
894 //=======================================================================
896 void TNaming_Iterator::Next()
898 Standard_NoMoreObject_Raise_if(myNode == 0L,
899 "TNaming_Iterator::Next");
900 myNode = myNode->nextSameAttribute;
903 //=======================================================================
904 //function : OldShape
906 //=======================================================================
908 const TopoDS_Shape& TNaming_Iterator::OldShape() const
910 Standard_NoSuchObject_Raise_if(myNode == 0L,
911 "TNaming_Iterator::OldShape");
912 if (myNode->myOld == 0L) {
913 static TopoDS_Shape NullShape;
916 return myNode->myOld->Shape();
919 //=======================================================================
920 //function : NewShape
922 //=======================================================================
924 const TopoDS_Shape& TNaming_Iterator::NewShape() const
926 Standard_NoSuchObject_Raise_if(myNode == 0L,
927 "TNaming_Iterator::NewShape");
928 if (myNode->myNew == 0L) {
929 static TopoDS_Shape NullShape;
932 return myNode->myNew->Shape();
936 //=======================================================================
937 //function : IsModification
939 //=======================================================================
941 Standard_Boolean TNaming_Iterator::IsModification() const
943 Standard_NoSuchObject_Raise_if(myNode == 0L,
944 "TNaming_Iterator::IsModification");
945 return (myNode->myAtt->myEvolution == TNaming_MODIFY ||
946 myNode->myAtt->myEvolution == TNaming_DELETE );
949 //=======================================================================
950 //function : Evolution
952 //=======================================================================
954 TNaming_Evolution TNaming_Iterator::Evolution() const
956 Standard_NoSuchObject_Raise_if(myNode == 0L,
957 "TNaming_Iterator::IsModification");
958 return myNode->myAtt->myEvolution;
963 //**********************************************************************
964 //Methods of the TNaming_NewShapeIterator class
965 //**********************************************************************
967 //=======================================================================
968 //function : SelectSameShape
969 //purpose : Selectionne le prochain noeud ou le shape est le meme que celui
970 // de RS. Old = 0 si il doit etre new dans le noeud a chercher.
971 // selection dans la transaction valide.
972 // On saute aussi les noeud ou OS = NS;
973 //=======================================================================
975 static void SelectSameShape (TNaming_Node*& myNode,
976 Standard_Boolean Old,
977 TNaming_RefShape*& RS,
978 const Standard_Integer& Trans)
980 TNaming_Node* pdn = myNode;
983 Standard_Boolean Valid;
984 if (Trans < 0) Valid = pdn->myAtt->IsValid();
985 else Valid = pdn->IsValidInTrans(Trans);
990 if( pdn->myOld == RS && pdn->myNew != 0L && pdn->myNew != RS) {
995 if( pdn->myNew == RS && pdn->myOld != 0L && pdn->myOld != RS) {
1000 pdn = pdn->NextSameShape(RS);
1005 //=======================================================================
1006 //function : TNaming_NewShapeIterator
1008 //=======================================================================
1010 TNaming_NewShapeIterator::TNaming_NewShapeIterator
1011 (const TopoDS_Shape& aShape,
1012 const Standard_Integer Trans,
1013 const Handle(TNaming_UsedShapes)& Shapes)
1016 Standard_Boolean Old = Standard_True;
1017 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1018 myNode = RS->FirstUse();
1019 SelectSameShape(myNode,Old,RS,myTrans);
1022 //=======================================================================
1023 //function : TNaming_NewShapeIterator
1025 //=======================================================================
1027 TNaming_NewShapeIterator::TNaming_NewShapeIterator
1028 (const TopoDS_Shape& aShape,
1029 const Standard_Integer Trans,
1030 const TDF_Label& access)
1033 Handle(TNaming_UsedShapes) Shapes;
1034 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1035 Standard_Boolean Old = Standard_True;
1036 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1037 myNode = RS->FirstUse();
1038 SelectSameShape(myNode,Old,RS,myTrans);
1042 //=======================================================================
1043 //function : TNaming_NewShapeIterator
1045 //=======================================================================
1047 TNaming_NewShapeIterator::TNaming_NewShapeIterator (const TNaming_Iterator& anIterator)
1048 :myTrans(anIterator.myTrans)
1050 Standard_Boolean Old = Standard_True;
1051 myNode = anIterator.myNode;
1052 TNaming_RefShape* RS = myNode->myNew;
1054 myNode = 0L; // No descendant
1056 // il faut repartir de la premiere utilisation.
1057 myNode = RS->FirstUse();
1058 SelectSameShape(myNode,Old,RS,myTrans);
1062 //=======================================================================
1063 //function : TNaming_NewShapeIterator
1065 //=======================================================================
1067 TNaming_NewShapeIterator::TNaming_NewShapeIterator
1068 (const TopoDS_Shape& aShape,
1069 const Handle(TNaming_UsedShapes)& Shapes)
1072 Standard_Boolean Old = Standard_True;
1073 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1074 myNode = RS->FirstUse();
1075 SelectSameShape(myNode,Old,RS,myTrans);
1078 //=======================================================================
1079 //function : TNaming_NewShapeIterator
1081 //=======================================================================
1083 TNaming_NewShapeIterator::TNaming_NewShapeIterator
1084 (const TopoDS_Shape& aShape,
1085 const TDF_Label& access)
1088 Handle(TNaming_UsedShapes) Shapes;
1089 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1090 Standard_Boolean Old = Standard_True;
1091 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1092 myNode = RS->FirstUse();
1093 SelectSameShape(myNode,Old,RS,myTrans);
1097 //=======================================================================
1098 //function : TNaming_NewShapeIterator
1100 //=======================================================================
1102 TNaming_NewShapeIterator::TNaming_NewShapeIterator(const TNaming_NewShapeIterator& anIterator)
1103 :myTrans(anIterator.myTrans)
1105 Standard_Boolean Old = Standard_True;
1106 myNode = anIterator.myNode;
1107 TNaming_RefShape* RS = myNode->myNew;
1109 myNode = 0L; // No descendant
1111 // il faut repartir de la premiere utilisation.
1112 myNode = RS->FirstUse();
1113 SelectSameShape(myNode,Old,RS,myTrans);
1117 //=======================================================================
1120 //=======================================================================
1122 void TNaming_NewShapeIterator::Next()
1124 Standard_Boolean Old = Standard_True;
1125 TNaming_RefShape* RS = myNode->myOld;
1126 myNode = myNode->NextSameShape(RS);
1127 SelectSameShape(myNode,Old,RS,myTrans);
1130 //=======================================================================
1133 //=======================================================================
1135 TDF_Label TNaming_NewShapeIterator::Label() const
1137 Standard_NoSuchObject_Raise_if(myNode == 0L,
1138 "TNaming_NewShapeIterator::Label");
1139 return myNode->Label();
1142 //=======================================================================
1143 //function : NamedShape
1145 //=======================================================================
1147 Handle(TNaming_NamedShape) TNaming_NewShapeIterator::NamedShape() const
1149 Standard_NoSuchObject_Raise_if(myNode == 0L,
1150 "TNaming_NewShapeIterator::Label");
1151 return myNode->myAtt;
1154 //=======================================================================
1157 //=======================================================================
1159 const TopoDS_Shape& TNaming_NewShapeIterator::Shape() const
1161 Standard_NoSuchObject_Raise_if(myNode == 0L,
1162 "TNaming_NewShapeIterator::Shape");
1163 return myNode->myNew->Shape();
1166 //=======================================================================
1167 //function : IsModification
1169 //=======================================================================
1171 Standard_Boolean TNaming_NewShapeIterator::IsModification() const
1173 Standard_NoSuchObject_Raise_if(myNode == 0L,
1174 "TNaming_NewShapeIterator::IsModification");
1176 return (myNode->myAtt->myEvolution == TNaming_MODIFY ||
1177 myNode->myAtt->myEvolution == TNaming_DELETE );
1180 //**********************************************************************
1181 //Methods of the TNaming_OldShapeIterator class
1182 //**********************************************************************
1183 //=======================================================================
1184 //function : TNaming_OldShapeIterator
1186 //=======================================================================
1188 TNaming_OldShapeIterator::TNaming_OldShapeIterator
1189 (const TopoDS_Shape& aShape,
1190 const Standard_Integer Trans,
1191 const Handle(TNaming_UsedShapes)& Shapes)
1194 Standard_Boolean Old = Standard_False;
1195 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1196 myNode = RS->FirstUse();
1197 SelectSameShape(myNode,Old,RS,myTrans);
1200 //=======================================================================
1201 //function : TNaming_OldShapeIterator
1203 //=======================================================================
1205 TNaming_OldShapeIterator::TNaming_OldShapeIterator
1206 (const TopoDS_Shape& aShape,
1207 const Standard_Integer Trans,
1208 const TDF_Label& access)
1211 Handle(TNaming_UsedShapes) Shapes;
1212 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1213 Standard_Boolean Old = Standard_False;
1214 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1215 myNode = RS->FirstUse();
1216 SelectSameShape(myNode,Old,RS,myTrans);
1219 //=======================================================================
1220 //function : TNaming_OldShapeIterator
1222 //=======================================================================
1224 TNaming_OldShapeIterator::TNaming_OldShapeIterator
1225 (const TopoDS_Shape& aShape,
1226 const Handle(TNaming_UsedShapes)& Shapes)
1229 Standard_Boolean Old = Standard_False;
1230 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1231 myNode = RS->FirstUse();
1232 SelectSameShape(myNode,Old,RS,myTrans);
1235 //=======================================================================
1236 //function : TNaming_OldShapeIterator
1238 //=======================================================================
1240 TNaming_OldShapeIterator::TNaming_OldShapeIterator
1241 (const TopoDS_Shape& aShape,
1242 const TDF_Label& access)
1245 Handle(TNaming_UsedShapes) Shapes;
1246 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1247 Standard_Boolean Old = Standard_False;
1248 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1249 myNode = RS->FirstUse();
1250 SelectSameShape(myNode,Old,RS,myTrans);
1254 //=======================================================================
1255 //function : TNaming_OldShapeIterator
1257 //=======================================================================
1259 TNaming_OldShapeIterator::TNaming_OldShapeIterator (const TNaming_Iterator& anIterator)
1260 :myTrans(anIterator.myTrans)
1262 Standard_Boolean Old = Standard_False;
1263 myNode = anIterator.myNode;
1264 TNaming_RefShape* RS = myNode->myNew;
1266 myNode = 0L; // No descendant
1268 // il faut repartir de la premiere utilisation.
1269 myNode = RS->FirstUse();
1270 SelectSameShape(myNode,Old,RS,myTrans);
1274 //=======================================================================
1275 //function : TNaming_OldShapeIterator
1277 //=======================================================================
1279 TNaming_OldShapeIterator::TNaming_OldShapeIterator(const TNaming_OldShapeIterator& anIterator)
1280 :myTrans(anIterator.myTrans)
1282 Standard_Boolean Old = Standard_False;
1283 myNode = anIterator.myNode;
1284 TNaming_RefShape* RS = myNode->myOld;
1286 myNode = 0L; // No descendant
1288 // il faut repartir de la premiere utilisation.
1289 myNode = RS->FirstUse();
1290 SelectSameShape(myNode,Old,RS,myTrans);
1294 //=======================================================================
1297 //=======================================================================
1299 void TNaming_OldShapeIterator::Next()
1301 Standard_Boolean Old = Standard_False;
1302 TNaming_RefShape* RS = myNode->myNew;
1303 myNode = myNode->NextSameShape(RS);
1304 SelectSameShape(myNode,Old,RS,myTrans);
1307 //=======================================================================
1310 //=======================================================================
1312 TDF_Label TNaming_OldShapeIterator::Label() const
1314 if (myNode == 0L) Standard_NoSuchObject::Raise("TNaming_OldShapeIterator::Label");
1315 return myNode->Label();
1319 //=======================================================================
1320 //function : NamedShape
1322 //=======================================================================
1324 Handle(TNaming_NamedShape) TNaming_OldShapeIterator::NamedShape() const
1326 if (myNode == 0L) Standard_NoSuchObject::Raise("TNaming_OldShapeIterator::Label");
1327 return myNode->myAtt;
1329 //=======================================================================
1332 //=======================================================================
1334 const TopoDS_Shape& TNaming_OldShapeIterator::Shape() const
1336 if(myNode == 0L) Standard_NoSuchObject::Raise("TNaming_OldShapeIterator::Shape");
1337 return myNode->myOld->Shape();
1340 //=======================================================================
1341 //function : IsModification
1343 //=======================================================================
1345 Standard_Boolean TNaming_OldShapeIterator::IsModification() const
1347 Standard_NoSuchObject_Raise_if(myNode == 0L,
1348 "TNaming_OldShapeIterator::IsModification");
1349 return (myNode->myAtt->myEvolution == TNaming_MODIFY ||
1350 myNode->myAtt->myEvolution == TNaming_DELETE );
1354 //**********************************************************************
1355 //Methods of the SameShapeIterator
1356 //**********************************************************************
1358 //=======================================================================
1361 //=======================================================================
1363 TNaming_SameShapeIterator::TNaming_SameShapeIterator
1364 (const TopoDS_Shape& aShape,
1365 const Handle(TNaming_UsedShapes)& Shapes)
1367 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1368 myNode = RS->FirstUse();
1369 myIsNew = (myNode->myNew == RS);
1373 //=======================================================================
1374 //function : TNaming_SameShapeIterator
1376 //=======================================================================
1378 TNaming_SameShapeIterator::TNaming_SameShapeIterator
1379 (const TopoDS_Shape& aShape,
1380 const TDF_Label& access)
1382 Handle(TNaming_UsedShapes) Shapes;
1383 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),Shapes)) {
1384 TNaming_RefShape* RS = Shapes->Map().ChangeFind(aShape);
1385 myNode = RS->FirstUse();
1386 myIsNew = (myNode->myNew == RS);
1390 //=======================================================================
1393 //=======================================================================
1395 void TNaming_SameShapeIterator::Next()
1397 TNaming_RefShape* prs;
1398 if (myIsNew) prs = myNode->myNew; else prs = myNode->myOld;
1400 myNode = myNode->NextSameShape(prs);
1401 if (myNode != 0L) myIsNew = (myNode->myNew == prs);
1404 //=======================================================================
1407 //=======================================================================
1409 TDF_Label TNaming_SameShapeIterator::Label() const
1411 Standard_NoSuchObject_Raise_if(myNode == 0L,
1412 "TNaming_SameShapeIterator::Label");
1413 return myNode->Label();
1417 //**********************************************************************
1418 //Methods of the TNaming_RefShape
1419 //**********************************************************************
1420 //=======================================================================
1423 //=======================================================================
1425 TDF_Label TNaming_RefShape::Label() const
1427 return myFirstUse->myAtt->Label();
1430 //=======================================================================
1431 //function : NamedShape
1433 //=======================================================================
1435 Handle(TNaming_NamedShape) TNaming_RefShape::NamedShape() const
1437 return myFirstUse->myAtt;
1441 //**********************************************************************
1442 //Methods of the TNaming_Tool class
1443 //**********************************************************************
1445 //=======================================================================
1446 //function : HasLabel
1448 //=======================================================================
1450 Standard_Boolean TNaming_Tool::HasLabel (const TDF_Label& access,
1451 const TopoDS_Shape& S)
1453 Handle(TNaming_UsedShapes) US;
1454 if (access.Root().FindAttribute(TNaming_UsedShapes::GetID(),US)) {
1455 return (US->Map().IsBound(S));
1457 #ifdef OCCT_DEBUG_HASL
1458 cout << "##==> Sub-Shape has no Label!" <<endl;
1460 return Standard_False;
1464 //=======================================================================
1467 //=======================================================================
1469 TDF_Label TNaming_Tool::Label(const TDF_Label& access,
1470 const TopoDS_Shape& S,
1471 Standard_Integer& Trans)
1473 Standard_NoSuchObject_Raise_if(!TNaming_Tool::HasLabel(access,S),"TNaming_Tool::Label");
1474 Handle(TNaming_UsedShapes) US;
1475 access.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
1476 return TNaming_Tool::Label(US,S,Trans);
1480 //=======================================================================
1481 //function : IsValidInTrans
1482 //purpose : un shape est valid tant que l attribut ou il est cree est valid
1483 //=======================================================================
1485 Standard_Integer TNaming_Tool::ValidUntil (const TDF_Label& access, const TopoDS_Shape& S)
1487 Standard_NoSuchObject_Raise_if(!TNaming_Tool::HasLabel(access,S),"TNaming_Tool::ValidUntil");
1488 Handle(TNaming_UsedShapes) US;
1489 access.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
1490 return TNaming_Tool::ValidUntil(S,US);
1494 //=======================================================================
1495 //function : HasLabel
1497 //=======================================================================
1499 Standard_Boolean TNaming_Tool::HasLabel(const Handle(TNaming_UsedShapes)& Shapes,
1500 const TopoDS_Shape& S)
1502 return (Shapes->Map().IsBound(S));
1506 //=======================================================================
1509 //=======================================================================
1511 TDF_Label TNaming_Tool::Label(const Handle(TNaming_UsedShapes)& Shapes,
1512 const TopoDS_Shape& S,
1513 Standard_Integer& Trans)
1515 Standard_NoSuchObject_Raise_if(!TNaming_Tool::HasLabel(Shapes,S),"TNaming_Tool::Label");
1516 TNaming_RefShape* prs = Shapes->Map().Find(S);
1517 TNaming_Node* pdn = prs->FirstUse();
1519 while (pdn != 0L && !(pdn->myNew == prs && pdn->myAtt->Evolution() != TNaming_SELECTED)){
1520 pdn = pdn->NextSameShape(prs);
1522 if (pdn == 0L) pdn = prs->FirstUse();
1524 TDF_Label L = pdn->Label();
1525 Trans = pdn->myAtt->Transaction();
1528 //=======================================================================
1529 //function : NamedShape
1531 //=======================================================================
1532 Handle(TNaming_NamedShape) TNaming_Tool::NamedShape(const TopoDS_Shape& S,
1533 const TDF_Label& Acces)
1535 Handle(TNaming_UsedShapes) US;
1536 Acces.Root().FindAttribute(TNaming_UsedShapes::GetID(),US);
1537 Handle(TNaming_NamedShape) NS;
1539 if(!TNaming_Tool::HasLabel(US,S)) {
1543 TNaming_RefShape* prs = US->Map().Find(S);
1544 TNaming_Node* pdn = prs->FirstUse();
1545 TNaming_Node* res = 0L;
1548 if (pdn->myNew == prs && pdn->myAtt->Evolution() != TNaming_SELECTED) {
1550 if (pdn->myAtt->Evolution() != TNaming_GENERATED) {
1551 // Les modifications sont privilegiees par rapport au generation.
1552 // Dans le cas des shapes qui sont a la fois des modifications et des generations
1557 pdn = pdn->NextSameShape(prs);
1560 if (res == 0L) return NS;
1562 // VERUE EN ATTENDANT DE REVOIR ABORT 03/11/98
1563 // Protection pour eviter de renvoyer un attribut backuped
1564 TDF_Label Lab = res->Label();
1565 Lab.FindAttribute(TNaming_NamedShape::GetID(),NS);
1567 // return res->myAtt;
1570 //=======================================================================
1571 //function : IsValidInTrans
1572 //purpose : un shape est valid tant que l attribut ou il est cree est valid
1573 //=======================================================================
1575 Standard_Integer TNaming_Tool::ValidUntil (const TopoDS_Shape& S,
1576 const Handle(TNaming_UsedShapes)& US)
1578 Standard_NoSuchObject_Raise_if(!TNaming_Tool::HasLabel(US,S),"TNaming_Tool::ValidUntil");
1580 TNaming_RefShape* RS = US->Map().ChangeFind(S);
1581 Standard_Integer Cur;
1582 Standard_Integer Until = 0;
1583 TNaming_Node* Node = RS->FirstUse();
1585 while (Node != 0L) {
1586 if (Node->myNew != 0L && Node->myNew == RS) {
1587 Cur = Node->myAtt->UntilTransaction();
1588 if (Cur > Until) Until = Cur;
1590 Node = Node->NextSameShape(RS);