0022807: Loading of STEP entities in model during reading of STEP file requires redun...
[occt.git] / src / Interface / Interface_ShareFlags.cxx
1 #include <Interface_ShareFlags.ixx>
2 #include <Interface_GeneralModule.hxx>
3 #include <Interface_ReportEntity.hxx>
4 #include <Interface_IntList.hxx>
5 #include <Standard_DomainError.hxx>
6
7
8
9     Interface_ShareFlags::Interface_ShareFlags
10   (const Handle(Interface_InterfaceModel)& amodel,
11    const Interface_GeneralLib& lib)
12    : theflags (amodel->NbEntities())
13 {
14   Handle(Interface_GTool) gtool;  // null
15   themodel = amodel;
16   Evaluate(lib,gtool);
17 }
18
19     Interface_ShareFlags::Interface_ShareFlags
20   (const Handle(Interface_InterfaceModel)& amodel,
21    const Handle(Interface_GTool)& gtool)
22    : theflags (amodel->NbEntities())
23 {
24   themodel = amodel;
25   Evaluate(gtool->Lib(),gtool);
26 }
27
28     Interface_ShareFlags::Interface_ShareFlags
29   (const Handle(Interface_InterfaceModel)& amodel,
30    const Handle(Interface_Protocol)& protocol)
31    : theflags (amodel->NbEntities())
32 {
33   Handle(Interface_GTool) gtool;  // null
34   themodel = amodel;
35   Evaluate(Interface_GeneralLib(protocol),gtool);
36 }
37
38     Interface_ShareFlags::Interface_ShareFlags
39   (const Handle(Interface_InterfaceModel)& amodel)
40    : theflags (amodel->NbEntities())
41 {
42   Handle(Interface_GTool) gtool = themodel->GTool();
43   gtool->Reservate(amodel->NbEntities());
44   themodel = amodel;
45   Evaluate (gtool->Lib(),gtool);
46 }
47
48     Interface_ShareFlags::Interface_ShareFlags (const Interface_Graph& agraph)
49       : theflags (agraph.Model()->NbEntities())
50     {
51       themodel = agraph.Model();
52       Standard_Integer nb = themodel->NbEntities();
53       if (nb == 0) return;
54       theroots = new TColStd_HSequenceOfTransient();
55       for (Standard_Integer i = 1; i <= nb; i ++) {
56         //    Resultat obtenu depuis le Graph
57         Handle(Standard_Transient) ent = themodel->Value(i);
58         Handle(TColStd_HSequenceOfTransient) list = agraph.GetSharings(ent);
59        
60         if (!list.IsNull() && list->Length() > 0) theflags.SetTrue(i);
61         else theroots->Append (ent);
62       }
63     }
64
65
66     void  Interface_ShareFlags::Evaluate
67   (const Interface_GeneralLib& lib, const Handle(Interface_GTool)& gtool)
68 {
69   Standard_Boolean patool = gtool.IsNull();
70   Standard_Integer nb = themodel->NbEntities();
71   if (nb == 0) return;
72   theroots = new TColStd_HSequenceOfTransient();
73   Standard_Integer i; // svv Jan11 2000 : porting on DEC
74   for (i = 1; i <= nb; i ++) {
75
76 //    ATTENTION : Si Entite non chargee donc illisible, basculer sur son
77 //    "Contenu" equivalent
78     Handle(Standard_Transient) ent = themodel->Value(i);
79     if (themodel->IsRedefinedContent(i)) ent = themodel->ReportEntity(i)->Content();
80
81 //    Resultat obtenu via GeneralLib
82     Interface_EntityIterator iter;
83     Handle(Interface_GeneralModule) module;
84     Standard_Integer CN;
85     if (patool) {
86       if (lib.Select(ent,module,CN))  module->FillShared(themodel,CN,ent,iter);
87     } else {
88       if (gtool->Select(ent,module,CN))  module->FillShared(themodel,CN,ent,iter);
89     }
90
91 //    Entites partagees par <ent> : reste a noter chacune comme "Shared"
92     for (iter.Start(); iter.More(); iter.Next()) {
93       Standard_Integer num = themodel->Number(iter.Value());
94       theflags.SetTrue(num);    // Et Voila
95     }
96   }
97   for (i = 1; i <= nb; i ++) {
98     if (!theflags.Value(i)) theroots->Append (themodel->Value(i));
99   }
100 }
101
102
103     Handle(Interface_InterfaceModel)  Interface_ShareFlags::Model () const 
104       {  return themodel;  }
105
106     Standard_Boolean  Interface_ShareFlags::IsShared
107   (const Handle(Standard_Transient)& ent) const 
108 {
109   Standard_Integer num = themodel->Number(ent);
110   if (num == 0 || num > themodel->NbEntities()) Standard_DomainError::Raise
111     ("Interface ShareFlags : IsShared");
112   return theflags.Value(num);
113 }
114
115     Interface_EntityIterator  Interface_ShareFlags::RootEntities () const
116 {
117   Interface_EntityIterator iter (theroots);
118   return iter;
119 }
120
121     Standard_Integer  Interface_ShareFlags::NbRoots () const
122       {  return (theroots.IsNull() ? 0 : theroots->Length());  }
123
124     Handle(Standard_Transient)  Interface_ShareFlags::Root
125   (const Standard_Integer num) const
126       {  return theroots->Value(num);  }