| 1 | #include <IFSelect_SelectPointed.ixx> |
| 2 | #include <TColStd_MapOfTransient.hxx> |
| 3 | |
| 4 | |
| 5 | |
| 6 | IFSelect_SelectPointed::IFSelect_SelectPointed () |
| 7 | : theset (Standard_False) { } |
| 8 | |
| 9 | void IFSelect_SelectPointed::Clear() |
| 10 | { theitems.Clear(); theset = Standard_False; } |
| 11 | |
| 12 | Standard_Boolean IFSelect_SelectPointed::IsSet () const |
| 13 | { return theset; } |
| 14 | |
| 15 | void IFSelect_SelectPointed::SetEntity |
| 16 | (const Handle(Standard_Transient)& ent) |
| 17 | { |
| 18 | theitems.Clear(); |
| 19 | theset = Standard_True; |
| 20 | if (ent.IsNull()) return; |
| 21 | theitems.Append (ent); |
| 22 | } |
| 23 | |
| 24 | void IFSelect_SelectPointed::SetList |
| 25 | (const Handle(TColStd_HSequenceOfTransient)& list) |
| 26 | { |
| 27 | theitems.Clear(); |
| 28 | theset = Standard_True; |
| 29 | if (list.IsNull()) return; |
| 30 | Standard_Integer i,nb = list->Length(); |
| 31 | for (i = 1; i <= nb; i ++) theitems.Append (list->Value(i)); |
| 32 | } |
| 33 | |
| 34 | // .... Editions |
| 35 | |
| 36 | Standard_Boolean IFSelect_SelectPointed::Add |
| 37 | (const Handle(Standard_Transient)& item) |
| 38 | { |
| 39 | if (item.IsNull()) return Standard_False; |
| 40 | for (Standard_Integer i = theitems.Length(); i >= 1; i --) |
| 41 | if (item == theitems.Value(i)) return Standard_False; |
| 42 | theitems.Append(item); |
| 43 | theset = Standard_True; |
| 44 | return Standard_True; |
| 45 | } |
| 46 | |
| 47 | Standard_Boolean IFSelect_SelectPointed::Remove |
| 48 | (const Handle(Standard_Transient)& item) |
| 49 | { |
| 50 | if (item.IsNull()) return Standard_False; |
| 51 | for (Standard_Integer i = theitems.Length(); i >= 1; i --) |
| 52 | if (item == theitems.Value(i)) { theitems.Remove(i); return Standard_True;} |
| 53 | return Standard_True; |
| 54 | } |
| 55 | |
| 56 | Standard_Boolean IFSelect_SelectPointed::Toggle |
| 57 | (const Handle(Standard_Transient)& item) |
| 58 | { |
| 59 | if (item.IsNull()) return Standard_False; |
| 60 | Standard_Integer num = 0; |
| 61 | for (Standard_Integer i = theitems.Length(); i >= 1; i --) |
| 62 | if (item == theitems.Value(i)) num = i; |
| 63 | if (num == 0) theitems.Append(item); |
| 64 | else theitems.Remove(num); |
| 65 | return (num == 0); |
| 66 | } |
| 67 | |
| 68 | Standard_Boolean IFSelect_SelectPointed::AddList |
| 69 | (const Handle(TColStd_HSequenceOfTransient)& list) |
| 70 | { |
| 71 | // Optimise avec une Map |
| 72 | Standard_Boolean res = Standard_False; |
| 73 | if (list.IsNull()) return res; |
| 74 | Standard_Integer i, nb = theitems.Length(), nl = list->Length(); |
| 75 | TColStd_MapOfTransient deja (nb+nl+1); |
| 76 | for (i = 1; i <= nb; i ++) deja.Add (theitems.Value(i)); |
| 77 | |
| 78 | for (i = 1; i <= nl; i ++) { |
| 79 | if (!deja.Contains (list->Value(i)) ) theitems.Append (list->Value(i)); |
| 80 | } |
| 81 | theset = Standard_True; |
| 82 | return res; |
| 83 | } |
| 84 | |
| 85 | Standard_Boolean IFSelect_SelectPointed::RemoveList |
| 86 | (const Handle(TColStd_HSequenceOfTransient)& list) |
| 87 | { |
| 88 | Standard_Boolean res = Standard_False; |
| 89 | if (list.IsNull()) return res; |
| 90 | Standard_Integer i, nb = list->Length(); |
| 91 | for (i = 1; i <= nb; i ++) res |= Remove (list->Value(i)); |
| 92 | return res; |
| 93 | } |
| 94 | |
| 95 | Standard_Boolean IFSelect_SelectPointed::ToggleList |
| 96 | (const Handle(TColStd_HSequenceOfTransient)& list) |
| 97 | { |
| 98 | Standard_Boolean res = Standard_True; |
| 99 | if (list.IsNull()) return res; |
| 100 | Standard_Integer i, nb = list->Length(); |
| 101 | for (i = 1; i <= nb; i ++) res |= Toggle (list->Value(i)); |
| 102 | return res; |
| 103 | } |
| 104 | |
| 105 | |
| 106 | // .... Consultations |
| 107 | |
| 108 | Standard_Integer IFSelect_SelectPointed::Rank |
| 109 | (const Handle(Standard_Transient)& item) const |
| 110 | { |
| 111 | if (item.IsNull()) return 0; |
| 112 | for (Standard_Integer i = theitems.Length(); i >= 1; i --) |
| 113 | if (item == theitems.Value(i)) return i; |
| 114 | return 0; |
| 115 | } |
| 116 | |
| 117 | Standard_Integer IFSelect_SelectPointed::NbItems () const |
| 118 | { return theitems.Length(); } |
| 119 | |
| 120 | Handle(Standard_Transient) IFSelect_SelectPointed::Item |
| 121 | (const Standard_Integer num) const |
| 122 | { |
| 123 | Handle(Standard_Transient) item; |
| 124 | if (num <= 0 || num > theitems.Length()) return item; |
| 125 | return theitems.Value(num); |
| 126 | } |
| 127 | |
| 128 | void IFSelect_SelectPointed::Update |
| 129 | (const Handle(Interface_CopyControl)& control) |
| 130 | { |
| 131 | Standard_Integer nb = theitems.Length(); |
| 132 | for (Standard_Integer i = nb; i > 0; i --) { |
| 133 | Handle(Standard_Transient) enfr, ento; |
| 134 | enfr = theitems.Value(i); |
| 135 | if (!control->Search(enfr,ento)) theitems.Remove(i); |
| 136 | else theitems.SetValue(i,ento); |
| 137 | } |
| 138 | } |
| 139 | |
| 140 | void IFSelect_SelectPointed::Update |
| 141 | (const Handle(IFSelect_Transformer)& trf) |
| 142 | { |
| 143 | Standard_Integer nb = theitems.Length(); |
| 144 | for (Standard_Integer i = nb; i > 0; i --) { |
| 145 | Handle(Standard_Transient) enfr, ento; |
| 146 | enfr = theitems.Value(i); |
| 147 | if (!trf->Updated(enfr,ento)) theitems.Remove(i); |
| 148 | else theitems.SetValue(i,ento); |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | // .... Actions Generales |
| 153 | |
| 154 | Interface_EntityIterator IFSelect_SelectPointed::RootResult |
| 155 | (const Interface_Graph& G) const |
| 156 | { |
| 157 | Interface_EntityIterator result; |
| 158 | Standard_Integer nb = theitems.Length(); |
| 159 | for (Standard_Integer i = 1; i <= nb; i ++) { |
| 160 | Handle(Standard_Transient) item = theitems.Value(i); |
| 161 | if (G.EntityNumber(item) > 0) result.GetOneItem(item); |
| 162 | } |
| 163 | return result; |
| 164 | } |
| 165 | |
| 166 | TCollection_AsciiString IFSelect_SelectPointed::Label () const |
| 167 | { return TCollection_AsciiString ("Pointed Entities"); } |