0026377: Passing Handle objects as arguments to functions as non-const reference...
[occt.git] / src / IFSelect / IFSelect_DispPerCount.cxx
CommitLineData
973c2be1 1// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 2//
973c2be1 3// This file is part of Open CASCADE Technology software library.
b311480e 4//
d5f74e42 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
973c2be1 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.
b311480e 10//
973c2be1 11// Alternatively, this file may be used under the terms of Open CASCADE
12// commercial license or contractual agreement.
b311480e 13
42cf5bc1 14
7fd59977 15#include <IFGraph_SCRoots.hxx>
42cf5bc1 16#include <IFGraph_SubPartsIterator.hxx>
17#include <IFSelect_DispPerCount.hxx>
18#include <IFSelect_IntParam.hxx>
19#include <IFSelect_Selection.hxx>
7fd59977 20#include <Interface_EntityIterator.hxx>
42cf5bc1 21#include <Interface_Graph.hxx>
22#include <Interface_InterfaceError.hxx>
23#include <Interface_InterfaceModel.hxx>
24#include <Standard_Type.hxx>
25#include <TCollection_AsciiString.hxx>
7fd59977 26
92efcf78 27IMPLEMENT_STANDARD_RTTIEXT(IFSelect_DispPerCount,IFSelect_Dispatch)
28
b311480e 29IFSelect_DispPerCount::IFSelect_DispPerCount () { }
7fd59977 30
31 Handle(IFSelect_IntParam) IFSelect_DispPerCount::Count () const
32 { return thecount; }
33
34 void IFSelect_DispPerCount::SetCount
35 (const Handle(IFSelect_IntParam)& pcount)
36 { thecount = pcount; }
37
38 Standard_Integer IFSelect_DispPerCount::CountValue () const
39{
40 Standard_Integer pcount = 0;
41 if (!thecount.IsNull()) pcount = thecount->Value();
42 if (pcount <= 0) pcount = 1; // option prise par defaut
43 return pcount;
44}
45
46 TCollection_AsciiString IFSelect_DispPerCount::Label () const
47{
48 TCollection_AsciiString lab(CountValue());
49 lab.Insert(1,"One File per ");
50 lab.AssignCat(" Entities");
51 return lab;
52}
53
54
55 Standard_Boolean IFSelect_DispPerCount::LimitedMax
56 (const Standard_Integer nbent, Standard_Integer& pcount) const
57{
58 pcount = 1 + nbent / CountValue();
59 return Standard_True;
60}
61
62 Standard_Boolean IFSelect_DispPerCount::PacketsCount
63 (const Interface_Graph& G, Standard_Integer& /*count*/) const
64 { return 1 + G.Size() / CountValue(); }
65
66 void IFSelect_DispPerCount::Packets
67 (const Interface_Graph& G, IFGraph_SubPartsIterator& packs) const
68{
69// Ressemble a DispPerOne, mais fait un AddPart tous les "count" racines
70 Standard_Integer pcount = CountValue();
71
72 IFGraph_SCRoots roots(G,Standard_False);
73 roots.SetLoad();
74 roots.GetFromIter(FinalSelection()->UniqueResult(G));
75// SCRoots a initie la resolution : decoupage en StrongComponants + selection
76// des racines. Un paquet correspond des lors a <count> racines
77// Donc, il faut iterer sur les Parts de roots et les prendre par <count>
78
79 Standard_Integer i = 0;
80 for (roots.Start(); roots.More(); roots.Next()) {
81 if (i == 0) packs.AddPart();
82 i ++; if (i >= pcount) i = 0; // regroupement selon "count"
83 packs.GetFromIter(roots.Entities());
84 }
85}