0022627: Change OCCT memory management defaults
[occt.git] / src / IGESSelect / IGESSelect_CounterOfLevelNumber.cxx
1 #include <IGESSelect_CounterOfLevelNumber.ixx>
2 #include <IGESData_IGESEntity.hxx>
3 #include <IGESGraph_DefinitionLevel.hxx>
4 #include <Dico_DictionaryOfInteger.hxx>
5 #include <Interface_Macros.hxx>
6 #include <stdio.h>
7
8 #include <Message_Messenger.hxx>
9
10     IGESSelect_CounterOfLevelNumber::IGESSelect_CounterOfLevelNumber
11   (const Standard_Boolean withmap, const Standard_Boolean withlist)
12     : IFSelect_SignCounter (withmap,withlist)
13       {  thehigh = thenblists = 0;  SetName("IGES Level Number");  }
14
15     void  IGESSelect_CounterOfLevelNumber::Clear ()
16       {  IFSelect_SignCounter::Clear();
17          thelevels.Nullify();  thehigh = thenblists = 0;  }
18
19
20     void  IGESSelect_CounterOfLevelNumber::AddSign
21   (const Handle(Standard_Transient)& ent,
22    const Handle(Interface_InterfaceModel)& /*model*/)
23 {
24   DeclareAndCast(IGESData_IGESEntity,igesent,ent);
25   if (igesent.IsNull()) return;
26   DeclareAndCast(IGESGraph_DefinitionLevel,levelist,igesent->LevelList());
27   Standard_Integer level = igesent->Level();
28   if (levelist.IsNull() && level < 0) return;
29
30 //  Enregistrer ce/ces niveau(x)
31   if (levelist.IsNull()) AddLevel(ent,level);
32   else {
33     Standard_Integer nb = levelist->NbPropertyValues();
34     for (Standard_Integer i = 1; i <= nb; i ++) {
35       level = levelist->LevelNumber(i);
36       AddLevel(ent,level);
37     }
38     AddLevel(ent,-1);
39   }
40 }
41
42
43     void  IGESSelect_CounterOfLevelNumber::AddLevel
44   (const Handle(Standard_Transient)& ent, const Standard_Integer level)
45 {
46   if (level < 0) {
47     thenblists ++;
48     Add (ent,"LEVEL LIST");
49     return;
50   }
51   if (thelevels.IsNull()) { thelevels =
52     new TColStd_HArray1OfInteger ( 0, (level > 100 ? level : 100) );
53                             thelevels->Init(0); }
54   Standard_Integer upper = thelevels->Upper();
55   if (level > upper) {
56     Handle(TColStd_HArray1OfInteger) levels =
57       new TColStd_HArray1OfInteger (0,level + 100);  levels->Init(0);
58     for (Standard_Integer i = 1; i <= upper; i ++)
59       levels->SetValue(i,thelevels->Value(i));
60     thelevels = levels;
61   }
62   thelevels->SetValue (level,thelevels->Value(level)+1);
63   if (level > thehigh) thehigh = level;
64
65 //  if (level == 0) Add(ent," NO LEVEL");
66 //  else {
67     char signature[30];
68     sprintf (signature,"%7d",level);
69     Add (ent,signature);
70 //  }
71 }
72
73
74     Standard_Integer  IGESSelect_CounterOfLevelNumber::HighestLevel () const
75       {  return thehigh;  }
76
77     Standard_Integer  IGESSelect_CounterOfLevelNumber::NbTimesLevel
78   (const Standard_Integer level) const
79 {
80   if (level < 0) return thenblists;
81   if (level > thehigh) return 0;
82   return thelevels->Value(level);
83 }
84
85
86     Handle(TColStd_HSequenceOfInteger)  IGESSelect_CounterOfLevelNumber::Levels
87   () const
88 {
89   Handle(TColStd_HSequenceOfInteger) list = new TColStd_HSequenceOfInteger ();
90   for (Standard_Integer i = 1; i <= thehigh; i ++) {
91     if (thelevels->Value(i) > 0) list->Append(i);
92   }
93   return list;
94 }
95
96
97     Handle(TCollection_HAsciiString)  IGESSelect_CounterOfLevelNumber::Sign
98   (const Handle(Standard_Transient)& ent,
99    const Handle(Interface_InterfaceModel)& /*model*/) const
100 {
101   Handle(TCollection_HAsciiString) res;
102 //  reprend les termes de AddSign pour la preparation (lecture du level) ...
103   DeclareAndCast(IGESData_IGESEntity,igesent,ent);
104   if (igesent.IsNull()) return res;
105   DeclareAndCast(IGESGraph_DefinitionLevel,levelist,igesent->LevelList());
106   Standard_Integer level = igesent->Level();
107   if (levelist.IsNull() && level < 0) return res;
108
109 //  puis ceux de AddLevel pour calculer la signature
110   if (level < 0) return new TCollection_HAsciiString ("LEVEL LIST");
111   char signature[30];
112   sprintf (signature,"%7d",level);
113   return new TCollection_HAsciiString (signature);
114 }
115
116
117     void  IGESSelect_CounterOfLevelNumber::PrintCount
118   (const Handle(Message_Messenger)& S) const
119 {
120   IFSelect_SignatureList::PrintCount(S);
121   S<<" Highest value : " << thehigh << endl;
122   if (thenblists > 0) S<<"REMARK for LEVEL LIST : Entities are counted in"
123     <<" <LEVEL LIST>\n, and in each Level value of their list"<<endl;
124 }