0031501: Foundation Classes, Message_Printer - remove theToPutEndl argument -- prepar...
[occt.git] / src / StepData / StepData_StepModel.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14
15 #include <Interface_Check.hxx>
16 #include <Interface_CopyTool.hxx>
17 #include <Interface_EntityIterator.hxx>
18 #include <Interface_GeneralLib.hxx>
19 #include <Interface_GeneralModule.hxx>
20 #include <Interface_InterfaceModel.hxx>
21 #include <Interface_Macros.hxx>
22 #include <Interface_ShareTool.hxx>
23 #include <Standard_NoSuchObject.hxx>
24 #include <Standard_Transient.hxx>
25 #include <Standard_Type.hxx>
26 #include <StepData.hxx>
27 #include <StepData_Protocol.hxx>
28 #include <StepData_StepModel.hxx>
29 #include <StepData_StepWriter.hxx>
30 #include <TCollection_HAsciiString.hxx>
31
32 #include <stdio.h>
33 IMPLEMENT_STANDARD_RTTIEXT(StepData_StepModel,Interface_InterfaceModel)
34
35 // Entete de fichier : liste d entites
36 StepData_StepModel::StepData_StepModel ()  {  }
37
38
39 Handle(Standard_Transient) StepData_StepModel::Entity
40 (const Standard_Integer num) const
41 {  return Value(num);  }      // nom plus joli
42
43 void StepData_StepModel::GetFromAnother
44 (const Handle(Interface_InterfaceModel)& other)
45 {
46   theheader.Clear();
47   DeclareAndCast(StepData_StepModel,another,other);
48   if (another.IsNull()) return;
49   Interface_EntityIterator iter = another->Header();
50   //  recopier le header. Attention, header distinct du contenu ...
51   Interface_CopyTool TC (this,StepData::HeaderProtocol());
52   for (; iter.More(); iter.Next()) {
53     Handle(Standard_Transient) newhead;
54     if (!TC.Copy(iter.Value(),newhead,Standard_False,Standard_False)) continue;
55     if (!newhead.IsNull()) theheader.Append(newhead);
56   }
57 }
58
59 Handle(Interface_InterfaceModel) StepData_StepModel::NewEmptyModel () const
60 {  return new StepData_StepModel;  }
61
62
63 Interface_EntityIterator StepData_StepModel::Header () const
64 {
65   Interface_EntityIterator iter;
66   theheader.FillIterator(iter);
67   return iter;
68 }
69
70 Standard_Boolean StepData_StepModel::HasHeaderEntity
71 (const Handle(Standard_Type)& atype) const
72 {  return (theheader.NbTypedEntities(atype) == 1);  }
73
74 Handle(Standard_Transient) StepData_StepModel::HeaderEntity
75 (const Handle(Standard_Type)& atype) const
76 {  return theheader.TypedEntity(atype);  }
77
78
79 //   Remplissage du Header
80
81 void StepData_StepModel::ClearHeader ()
82 {  theheader.Clear();  }
83
84
85 void StepData_StepModel::AddHeaderEntity
86 (const Handle(Standard_Transient)& ent)
87 {  theheader.Append(ent);  }
88
89
90 void StepData_StepModel::VerifyCheck(Handle(Interface_Check)& ach) const
91 {
92   Interface_GeneralLib lib(StepData::HeaderProtocol());
93   Handle(StepData_StepModel) me (this);
94   Handle(Interface_Protocol) aHP = StepData::HeaderProtocol();
95   Interface_ShareTool sh(me,aHP);
96   Handle(Interface_GeneralModule) module;  Standard_Integer CN;
97   for (Interface_EntityIterator iter = Header(); iter.More(); iter.Next()) {
98     Handle(Standard_Transient) head = iter.Value();
99     if (!lib.Select(head,module,CN)) continue;
100     module->CheckCase(CN,head,sh,ach);
101   }
102 }
103
104
105 void StepData_StepModel::DumpHeader (Standard_OStream& S, const Standard_Integer /*level*/) const
106 {
107   //  NB : level n est pas utilise
108
109   Handle(StepData_Protocol) stepro = StepData::HeaderProtocol();
110   Standard_Boolean iapro = !stepro.IsNull();
111   if (!iapro) S <<" -- WARNING : StepModel DumpHeader, Protocol not defined\n";
112
113   Interface_EntityIterator iter = Header();
114   Standard_Integer nb = iter.NbEntities();
115   S << " --  Step Model Header : " <<iter.NbEntities() << " Entities :\n";
116   for (iter.Start(); iter.More(); iter.Next()) {
117     S << "  "  << iter.Value()->DynamicType()->Name() << "\n";
118   }
119   if (!iapro || nb == 0) return;
120   S << " --  --        STEP MODEL    HEADER  CONTENT      --  --" << "\n";
121   S << " --   Dumped with Protocol : " << stepro->DynamicType()->Name()
122     << "   --\n";
123
124   Handle(StepData_StepModel) me (this);
125   StepData_StepWriter SW(me);
126   SW.SendModel(stepro,Standard_True);    // envoi HEADER seul
127   SW.Print(S);
128 }
129
130
131 void  StepData_StepModel::ClearLabels ()
132 {  theidnums.Nullify();  }
133
134 void  StepData_StepModel::SetIdentLabel
135 (const Handle(Standard_Transient)& ent, const Standard_Integer ident)
136 {
137   Standard_Integer num = Number(ent);
138   if (!num) 
139     return;
140   Standard_Integer nbEnt = NbEntities();
141   if(theidnums.IsNull())
142   {
143     theidnums = new TColStd_HArray1OfInteger(1,nbEnt);
144     theidnums->Init(0);
145   }
146   else if(nbEnt > theidnums->Length())
147   {
148     Standard_Integer prevLength = theidnums->Length();
149     Handle(TColStd_HArray1OfInteger) idnums1 = new TColStd_HArray1OfInteger(1,nbEnt);
150     idnums1->Init(0);
151     Standard_Integer k =1;
152     for( ; k <= prevLength; k++)
153       idnums1->SetValue(k , theidnums->Value(k));
154     theidnums = idnums1;
155   }
156   theidnums->SetValue(num,ident);
157
158 }
159
160 Standard_Integer  StepData_StepModel::IdentLabel
161 (const Handle(Standard_Transient)& ent) const
162 {
163   if(theidnums.IsNull())
164     return 0;
165   Standard_Integer num = Number(ent);
166   return (!num ? 0 : theidnums->Value(num));
167  }
168
169 void  StepData_StepModel::PrintLabel
170 (const Handle(Standard_Transient)& ent, Standard_OStream& S) const
171 {
172   Standard_Integer num = (theidnums.IsNull() ? 0 : Number(ent));
173   Standard_Integer  nid = (!num ? 0 : theidnums->Value(num));
174   if      (nid > 0) S <<"#"<<nid;
175   else if (num > 0) S <<"(#"<<num<<")";
176   else              S <<"(#0..)";
177 }
178
179 Handle(TCollection_HAsciiString) StepData_StepModel::StringLabel
180 (const Handle(Standard_Transient)& ent) const
181 {
182   Handle(TCollection_HAsciiString) label;
183   char text[20];
184   Standard_Integer num = (theidnums.IsNull() ? 0 : Number(ent));
185   Standard_Integer  nid = (!num ? 0 : theidnums->Value(num));
186
187   if      (nid > 0) sprintf (text, "#%d",nid);
188   else if (num > 0) sprintf (text, "(#%d)",num);
189   else              sprintf (text, "(#0..)");
190
191   label = new TCollection_HAsciiString(text);
192   return label;
193 }