1 #include <StepData_Protocol.ixx>
2 #include <StepData_StepModel.hxx>
3 #include <StepData_UndefinedEntity.hxx>
4 #include <StepData_Described.hxx>
5 #include <Interface_DataMapIteratorOfDataMapOfTransientInteger.hxx>
9 // Le Protocol de base reconnait UnknownEntity
11 //static TCollection_AsciiString thename("(DEFAULT)");
12 static Standard_CString thename = "(DEFAULT)";
14 StepData_Protocol::StepData_Protocol ()
18 Standard_Integer StepData_Protocol::NbResources () const
24 Handle(Interface_Protocol) StepData_Protocol::Resource
25 (const Standard_Integer /*num*/) const
27 Handle(Interface_Protocol) nulproto;
32 Standard_Integer StepData_Protocol::CaseNumber
33 (const Handle(Standard_Transient)& obj) const
35 if (obj.IsNull()) return 0;
36 Standard_Integer num = TypeNumber (obj->DynamicType());
37 if (num > 0) return num;
38 Handle(StepData_Described) dc = Handle(StepData_Described)::DownCast(obj);
39 if (dc.IsNull()) return 0;
40 return DescrNumber (dc->Description());
44 Standard_Integer StepData_Protocol::TypeNumber
45 (const Handle(Standard_Type)& atype) const
47 if (atype == STANDARD_TYPE(StepData_UndefinedEntity)) return 1;
52 Standard_CString StepData_Protocol::SchemaName () const
58 Handle(Interface_InterfaceModel) StepData_Protocol::NewModel () const
60 return new StepData_StepModel;
64 Standard_Boolean StepData_Protocol::IsSuitableModel
65 (const Handle(Interface_InterfaceModel)& model) const
67 return model->IsKind(STANDARD_TYPE(StepData_StepModel));
71 Handle(Standard_Transient) StepData_Protocol::UnknownEntity () const
73 return new StepData_UndefinedEntity;
77 Standard_Boolean StepData_Protocol::IsUnknownEntity
78 (const Handle(Standard_Transient)& ent) const
81 return ent->IsKind(STANDARD_TYPE(StepData_UndefinedEntity));
82 return Standard_False;
86 // #### Description pour LateBinding
88 Standard_Integer StepData_Protocol::DescrNumber
89 (const Handle(StepData_EDescr)& adescr) const
91 if (thedscnum.IsBound(adescr)) return thedscnum.Find(adescr);
96 void StepData_Protocol::AddDescr
97 (const Handle(StepData_EDescr)& adescr, const Standard_Integer CN)
99 Handle(StepData_ESDescr) sd = Handle(StepData_ESDescr)::DownCast(adescr);
100 thedscnum.Bind (adescr,CN);
102 // Simple : memorisee selon son nom
103 // sinon que faire ? on memorise selon le numero passe en alpha-num ...
105 if (thedscnam.IsNull()) thedscnam = new Dico_DictionaryOfTransient;
106 if (!sd.IsNull()) thedscnam->SetItem (sd->TypeName(),sd);
108 sprintf(fonom,"%d",CN);
109 thedscnam->SetItem (fonom,adescr);
113 Standard_Boolean StepData_Protocol::HasDescr () const
115 return !thedscnam.IsNull();
119 Handle(StepData_EDescr) StepData_Protocol::Descr
120 (const Standard_Integer num) const
122 Handle(StepData_EDescr) dsc;
123 if (thedscnam.IsNull()) return dsc;
125 sprintf(fonom,"%d",num);
126 if (!thedscnam->GetItem (fonom,dsc)) dsc.Nullify();
131 Handle(StepData_EDescr) StepData_Protocol::Descr
132 (const Standard_CString name, const Standard_Boolean anylevel) const
134 Handle(StepData_EDescr) sd;
135 if (!thedscnam.IsNull()) {
136 if (thedscnam->GetItem (name,sd)) return sd;
138 if (!anylevel) return sd;
140 Standard_Integer i, nb = NbResources();
141 for (i = 1; i <= nb; i ++) {
142 Handle(StepData_Protocol) sp = Handle(StepData_Protocol)::DownCast(Resource(i));
143 if (sp.IsNull()) continue;
144 sd = sp->Descr (name,anylevel);
145 if (!sd.IsNull()) return sd;
151 Handle(StepData_ESDescr) StepData_Protocol::ESDescr
152 (const Standard_CString name, const Standard_Boolean anylevel) const
154 return Handle(StepData_ESDescr)::DownCast(Descr(name,anylevel));
158 Handle(StepData_ECDescr) StepData_Protocol::ECDescr
159 (const TColStd_SequenceOfAsciiString& names, const Standard_Boolean anylevel) const
161 Standard_Integer i, nb = names.Length();
162 Handle(StepData_ECDescr) cd;
163 Interface_DataMapIteratorOfDataMapOfTransientInteger iter(thedscnum);
164 for (; iter.More(); iter.Next()) {
165 cd = Handle(StepData_ECDescr)::DownCast (iter.Key());
166 if (cd.IsNull()) continue;
167 if (cd->NbMembers() != nb) continue;
168 Standard_Boolean ok = Standard_True;
169 for (i = 1; i <= nb; i ++) {
170 if (!names(i).IsEqual (cd->Member(i)->TypeName())) { ok = Standard_False; break; }
175 if (!anylevel) return cd;
178 for (i = 1; i <= nb; i ++) {
179 Handle(StepData_Protocol) sp = Handle(StepData_Protocol)::DownCast(Resource(i));
180 if (sp.IsNull()) continue;
181 cd = sp->ECDescr (names,anylevel);
182 if (!cd.IsNull()) return cd;
188 void StepData_Protocol::AddPDescr
189 (const Handle(StepData_PDescr)& pdescr)
191 if (thepdescr.IsNull()) thepdescr = new Dico_DictionaryOfTransient;
192 thepdescr->SetItem (pdescr->Name(),pdescr);
196 Handle(StepData_PDescr) StepData_Protocol::PDescr
197 (const Standard_CString name, const Standard_Boolean anylevel) const
199 Handle(StepData_PDescr) sd;
200 if (!thepdescr.IsNull()) {
201 if (thepdescr->GetItem (name,sd)) return sd;
203 if (!anylevel) return sd;
205 Standard_Integer i, nb = NbResources();
206 for (i = 1; i <= nb; i ++) {
207 Handle(StepData_Protocol) sp = Handle(StepData_Protocol)::DownCast(Resource(i));
208 if (sp.IsNull()) continue;
209 sd = sp->PDescr (name,anylevel);
210 if (!sd.IsNull()) return sd;
216 void StepData_Protocol::AddBasicDescr
217 (const Handle(StepData_ESDescr)& esdescr)
219 if (thedscbas.IsNull()) thedscbas = new Dico_DictionaryOfTransient;
220 thedscbas->SetItem (esdescr->TypeName(),esdescr);
224 Handle(StepData_EDescr) StepData_Protocol::BasicDescr
225 (const Standard_CString name, const Standard_Boolean anylevel) const
227 Handle(StepData_EDescr) sd;
228 if (!thedscbas.IsNull()) {
229 if (thedscbas->GetItem (name,sd)) return sd;
231 if (!anylevel) return sd;
233 Standard_Integer i, nb = NbResources();
234 for (i = 1; i <= nb; i ++) {
235 Handle(StepData_Protocol) sp = Handle(StepData_Protocol)::DownCast(Resource(i));
236 if (sp.IsNull()) continue;
237 sd = sp->BasicDescr (name,anylevel);
238 if (!sd.IsNull()) return sd;