1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
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.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
15 #include <Interface_BitMap.hxx>
16 #include <Interface_EntityIterator.hxx>
17 #include <Interface_GeneralLib.hxx>
18 #include <Interface_GeneralModule.hxx>
19 #include <Interface_Graph.hxx>
20 #include <Interface_GTool.hxx>
21 #include <Interface_InterfaceModel.hxx>
22 #include <Interface_Protocol.hxx>
23 #include <Interface_ReportEntity.hxx>
24 #include <Interface_ShareTool.hxx>
25 #include <Standard_DomainError.hxx>
26 #include <Standard_Transient.hxx>
27 #include <TCollection_HAsciiString.hxx>
28 #include <TColStd_Array1OfInteger.hxx>
29 #include <TColStd_HSequenceOfTransient.hxx>
30 #include <TColStd_ListIteratorOfListOfInteger.hxx>
32 // Flags : 0 = Presence, 1 = Sharing Error
33 #define Graph_Present 0
34 #define Graph_ShareError 1
37 // ###########################################################################
39 // .... CONSTRUCTEURS ....
41 // .... Construction a partir de la connaissance des Entites ....
44 Interface_Graph::Interface_Graph
45 (const Handle(Interface_InterfaceModel)& amodel,
46 const Interface_GeneralLib& /*lib*/,
47 Standard_Boolean theModeStat)
48 : themodel (amodel), thepresents ("")
55 Interface_Graph::Interface_Graph
56 (const Handle(Interface_InterfaceModel)& amodel,
57 const Handle(Interface_Protocol)& /*protocol*/,
58 Standard_Boolean theModeStat)
59 : themodel (amodel) , thepresents ("")
67 Interface_Graph::Interface_Graph
68 (const Handle(Interface_InterfaceModel)& amodel,
69 const Handle(Interface_GTool)& /*gtool*/,
70 Standard_Boolean theModeStat)
71 : themodel (amodel) , thepresents ("")
78 Interface_Graph::Interface_Graph
79 (const Handle(Interface_InterfaceModel)& amodel,
80 Standard_Boolean theModeStat)
81 : themodel (amodel) , thepresents ("")
88 // .... Construction depuis un autre Graph ....
90 Interface_Graph::Interface_Graph
91 (const Interface_Graph& agraph, const Standard_Boolean /*copied*/)
92 : themodel (agraph.Model()), thepresents ("")
94 thesharings = agraph.SharingTable();
95 Standard_Integer nb = agraph.NbStatuses();
99 thestats = new TColStd_HArray1OfInteger(1,nb);
100 for (Standard_Integer i = 1; i <= nb; i ++)
101 thestats->SetValue (i,agraph.Status(i));
102 theflags.Initialize(agraph.BitMap(),Standard_True);
105 Interface_Graph& Interface_Graph::operator= (const Interface_Graph& theOther)
107 themodel = theOther.Model();
108 thepresents = theOther.thepresents;
109 thesharings = theOther.SharingTable();
112 const Standard_Integer nb = theOther.NbStatuses();
115 thestats = new TColStd_HArray1OfInteger(1, nb);
116 for (Standard_Integer i = 1; i <= nb; ++i)
118 thestats->SetValue (i, theOther.Status(i));
120 theflags.Initialize (theOther.BitMap(), Standard_True);
125 void Interface_Graph::InitStats()
127 thestats = new TColStd_HArray1OfInteger(1,themodel->NbEntities()) ,
128 theflags.Initialize(themodel->NbEntities(),2);
129 theflags.AddFlag ("ShareError");
132 Standard_Integer Interface_Graph::NbStatuses() const
134 return (thestats.IsNull() ? 0 : thestats->Length());
137 const Handle(TColStd_HArray1OfListOfInteger)& Interface_Graph::SharingTable () const
138 { return thesharings; }
140 void Interface_Graph::Evaluate()
142 // Evaluation d un Graphe de dependances : sur chaque Entite, on prend sa
143 // liste "Shared". On en deduit les "Sharing" directement
144 Standard_Integer n = Size();
145 thesharings = new TColStd_HArray1OfListOfInteger(1,n);//TColStd_HArray1OfTransient(1,n);//Clear();
146 if(themodel->GTool().IsNull())
150 Standard_Integer i; // svv Jan11 2000 : porting on DEC
151 for (i = 1; i <= n; i ++) {
152 // ATTENTION : Si Entite non chargee donc illisible, basculer sur son
153 // "Contenu" equivalent
154 Handle(Standard_Transient) ent = themodel->Value(i);
157 // Resultat obtenu via GeneralLib
158 Interface_EntityIterator iter = GetShareds(ent);
160 // Mise en forme : liste d entiers
161 for (iter.Start(); iter.More(); iter.Next()) {
162 // num = 0 -> on sort du Model de depart, le noter "Error" et passer
163 Handle(Standard_Transient) entshare = iter.Value();
167 Standard_Integer num = EntityNumber(entshare);
171 if(!thestats.IsNull())
172 theflags.SetTrue (i,Graph_ShareError);
175 thesharings->ChangeValue(num).Append(i);
180 // .... Construction depuis un autre Graph ....
183 // ###########################################################################
185 // .... ACCES UNITAIRES AUX DONNEES DE BASE ....
187 void Interface_Graph::Reset ()
189 if(!thestats.IsNull())
192 theflags.Init (Standard_False, Graph_Present);
197 void Interface_Graph::ResetStatus ()
199 if(!thestats.IsNull())
202 theflags.Init (Standard_False, Graph_Present);
207 Standard_Integer Interface_Graph::Size () const
208 { return themodel->NbEntities(); }//thestats.Upper(); }
210 Standard_Integer Interface_Graph::EntityNumber
211 (const Handle(Standard_Transient)& ent) const
212 { return themodel->Number(ent); }
214 Standard_Boolean Interface_Graph::IsPresent
215 (const Standard_Integer num) const
217 if (num <= 0 || num > Size())
218 return Standard_False;
219 return (!thestats.IsNull() ? theflags.Value (num,Graph_Present) : Standard_False);
222 Standard_Boolean Interface_Graph::IsPresent
223 (const Handle(Standard_Transient)& ent) const
224 { return IsPresent(EntityNumber(ent)); }
226 const Handle(Standard_Transient)& Interface_Graph::Entity
227 (const Standard_Integer num) const
229 return themodel->Value(num);
233 Standard_Integer Interface_Graph::Status (const Standard_Integer num) const
235 return (!thestats.IsNull() ? thestats->Value(num) : 0);
238 void Interface_Graph::SetStatus
239 (const Standard_Integer num, const Standard_Integer stat)
241 if(!thestats.IsNull())
242 thestats->SetValue(num,stat);
245 void Interface_Graph::RemoveItem(const Standard_Integer num)
247 if(!thestats.IsNull())
249 thestats->SetValue(num,0);
250 theflags.SetFalse (num,Graph_Present);
254 void Interface_Graph::ChangeStatus
255 (const Standard_Integer oldstat, const Standard_Integer newstat)
257 if(thestats.IsNull())
259 Standard_Integer nb = thestats->Upper();
260 for (Standard_Integer i = 1; i <= nb; i ++) {
261 if (thestats->Value(i) == oldstat)
262 thestats->SetValue(i,newstat);
266 void Interface_Graph::RemoveStatus(const Standard_Integer stat)
268 if(thestats.IsNull())
270 Standard_Integer nb = thestats->Upper();
271 for (Standard_Integer i = 1; i <= nb; i ++) {
272 if (thestats->Value(i) == stat) RemoveItem(i);
276 const Interface_BitMap& Interface_Graph::BitMap () const
279 Interface_BitMap& Interface_Graph::CBitMap ()
282 // ###########################################################################
284 // .... Chargements Elementaires avec Propagation de "Share" .... //
286 const Handle(Interface_InterfaceModel)& Interface_Graph::Model() const
289 void Interface_Graph::GetFromModel ()
291 if (themodel.IsNull() || thestats.IsNull())
292 return; // no model ... (-> on n ira pas loin)
293 theflags.Init (Standard_True,Graph_Present);
297 void Interface_Graph::GetFromEntity
298 (const Handle(Standard_Transient)& ent, const Standard_Boolean shared,
299 const Standard_Integer newstat)
301 if(thestats.IsNull())
303 Standard_Integer num = EntityNumber(ent);
306 if (theflags.CTrue(num,Graph_Present)) return; // deja pris : on passe
307 thestats->SetValue(num,newstat);
309 // Attention a la redefinition !
310 Interface_EntityIterator aIter = GetShareds(ent);
312 for ( ; aIter.More() ; aIter.Next())
313 GetFromEntity(aIter.Value(),Standard_True,newstat);
316 void Interface_Graph::GetFromEntity
317 (const Handle(Standard_Transient)& ent, const Standard_Boolean shared,
318 const Standard_Integer newstat, const Standard_Integer overlapstat,
319 const Standard_Boolean cumul)
321 if(thestats.IsNull())
323 Standard_Integer num = EntityNumber(ent);
325 Standard_Boolean pasla = !theflags.CTrue (num,Graph_Present);
326 Standard_Integer stat = thestats->Value(num);
329 /// theflags.SetTrue (num, Graph_Present); // nouveau : noter avec newstat
330 thestats->SetValue(num,newstat);
332 Standard_Integer overstat = stat;
333 if (stat != newstat) { // deja pris, meme statut : passer
334 if (cumul) overstat += overlapstat; // nouveau statut : avec cumul ...
335 else overstat = overlapstat; // ... ou sans (statut force)
336 if (stat != overstat) // si repasse deja faite, passer
337 thestats->SetValue(num,overstat);
341 // Attention a la redefinition !
342 Interface_EntityIterator aIter = GetShareds(ent);
344 for ( ; aIter.More() ; aIter.Next())
345 GetFromEntity(aIter.Value(),Standard_True,newstat);
348 void Interface_Graph::GetFromIter
349 (const Interface_EntityIterator& iter, const Standard_Integer newstat)
351 if(thestats.IsNull())
353 for (iter.Start(); iter.More(); iter.Next()) {
354 Handle(Standard_Transient) ent = iter.Value();
355 Standard_Integer num = EntityNumber(ent);
358 if (theflags.CTrue(num,Graph_Present))
360 thestats->SetValue(num,newstat);
365 void Interface_Graph::GetFromIter
366 (const Interface_EntityIterator& iter,
367 const Standard_Integer newstat, const Standard_Integer overlapstat,
368 const Standard_Boolean cumul)
370 if(thestats.IsNull())
372 for (iter.Start(); iter.More(); iter.Next()) {
373 Handle(Standard_Transient) ent = iter.Value();
374 Standard_Integer num = EntityNumber(ent);
377 /*Standard_Boolean pasla = !*/theflags.Value(num,Graph_Present);
378 /*Standard_Integer stat = */thestats->Value(num);
379 GetFromEntity (ent,Standard_False,newstat,overlapstat,cumul);
384 void Interface_Graph::GetFromGraph (const Interface_Graph& agraph)
386 if (Model() != agraph.Model()) throw Standard_DomainError("Graph from Interface : GetFromGraph");
387 Standard_Integer nb = Size();
388 for (Standard_Integer i = 1; i <= nb; i ++) {
389 if (agraph.IsPresent(i))
390 GetFromEntity (agraph.Entity(i),Standard_False,agraph.Status(i));
394 void Interface_Graph::GetFromGraph
395 (const Interface_Graph& agraph, const Standard_Integer stat)
397 if (Model() != agraph.Model()) throw Standard_DomainError("Graph from Interface : GetFromGraph");
398 Standard_Integer nb = Size();
399 for (Standard_Integer i = 1; i <= nb; i ++) {
400 if (agraph.IsPresent(i) && agraph.Status(i) == stat)
401 GetFromEntity (agraph.Entity(i),Standard_False,stat);
405 // #####################################################################
407 // .... Listage des Entites Partagees ....
409 Standard_Boolean Interface_Graph::HasShareErrors
410 (const Handle(Standard_Transient)& ent) const
412 if(thestats.IsNull())
413 return Standard_False;
414 Standard_Integer num = EntityNumber(ent);
415 if (num == 0) return Standard_True;
416 return theflags.Value (num,Graph_ShareError);
419 Interface_EntityIterator Interface_Graph::Shareds
420 (const Handle(Standard_Transient)& ent) const
422 Interface_EntityIterator iter;
423 Standard_Integer num = EntityNumber(ent);
427 Handle(Standard_Transient) aCurEnt = ent;
428 if (themodel->IsRedefinedContent(num))
429 aCurEnt = themodel->ReportEntity(num)->Content();
431 //if (num == 0) throw Standard_DomainError("Interface : Shareds");
432 Handle(Interface_GeneralModule) module;
434 if (themodel->GTool()->Select(aCurEnt,module,CN))
435 module->FillShared(themodel,CN,aCurEnt,iter);
439 Handle(TColStd_HSequenceOfTransient) Interface_Graph::GetShareds(const Handle(Standard_Transient)& ent) const
441 Handle(TColStd_HSequenceOfTransient) aseq = new TColStd_HSequenceOfTransient;
442 Interface_EntityIterator iter = Shareds(ent);
443 for( ; iter.More(); iter.Next())
444 aseq->Append(iter.Value());
448 Handle(TColStd_HSequenceOfTransient) Interface_Graph::GetSharings(const Handle(Standard_Transient)& ent) const
450 Standard_Integer num = EntityNumber(ent);
453 //return Handle(TColStd_HSequenceOfTransient)::DownCast(thesharings->Value(num));
454 const TColStd_ListOfInteger& alist = thesharings->Value(num);
455 Handle(TColStd_HSequenceOfTransient) aSharings = new TColStd_HSequenceOfTransient;
456 TColStd_ListIteratorOfListOfInteger aIt(alist);
457 for( ; aIt.More() ; aIt.Next())
458 aSharings->Append(Entity(aIt.Value()));
462 Interface_EntityIterator Interface_Graph::Sharings
463 (const Handle(Standard_Transient)& ent) const
465 Interface_EntityIterator iter;
466 iter.AddList(GetSharings(ent));
471 static void AddTypedSharings
472 (const Handle(Standard_Transient)& ent, const Handle(Standard_Type)& type,
473 Interface_EntityIterator& iter, const Standard_Integer n,
474 const Interface_Graph& G)
476 if (ent.IsNull()) return;
477 if (ent->IsKind(type)) { iter.AddItem (ent); return; }
478 if (iter.NbEntities() > n) return;
480 Handle(TColStd_HSequenceOfTransient) list = G.GetSharings(ent);
484 Standard_Integer nb = list->Length();
485 for (Standard_Integer i = 1; i <= nb; i ++)
486 AddTypedSharings (list->Value(i) ,type,iter,nb,G);
489 Interface_EntityIterator Interface_Graph::TypedSharings
490 (const Handle(Standard_Transient)& ent, const Handle(Standard_Type)& type) const
492 Interface_EntityIterator iter;
493 Standard_Integer n = Size();
494 AddTypedSharings (ent,type,iter,n,*this);
499 Interface_EntityIterator Interface_Graph::RootEntities () const
501 Interface_EntityIterator iter;
502 Standard_Integer nb = thesharings->Length();
503 for (Standard_Integer i = 1; i <= nb; i ++) {
504 if(!thesharings->Value(i).IsEmpty())
506 iter.AddItem(Entity(i));
511 Handle(TCollection_HAsciiString) Interface_Graph::Name(const Handle(Standard_Transient)& ent) const
513 Handle(TCollection_HAsciiString) str;
514 if (themodel.IsNull()) return str;
515 if (themodel->Number(ent)) return str;
517 Handle(Interface_GTool) gtool = themodel->GTool();
518 if (gtool.IsNull()) return str;
520 Handle(Interface_GeneralModule) module;
522 if (!gtool->Select(ent,module,CN)) return str;
524 Interface_ShareTool sht (*this);
525 return module->Name (CN,ent,sht);
528 Standard_Boolean Interface_Graph::ModeStat() const
530 return (!thestats.IsNull());