0024157: Parallelization of assembly part of BO
[occt.git] / src / IFSelect / IFSelect_ShareOut.cxx
CommitLineData
b311480e 1// Copyright (c) 1999-2012 OPEN CASCADE SAS
2//
3// The content of this file is subject to the Open CASCADE Technology Public
4// License Version 6.5 (the "License"). You may not use the content of this file
5// except in compliance with the License. Please obtain a copy of the License
6// at http://www.opencascade.org and read it completely before using this file.
7//
8// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
10//
11// The Original Code and all software distributed under the License is
12// distributed on an "AS IS" basis, without warranty of any kind, and the
13// Initial Developer hereby disclaims all such warranties, including without
14// limitation, any warranties of merchantability, fitness for a particular
15// purpose or non-infringement. Please see the License for the specific terms
16// and conditions governing the rights and limitations under the License.
17
7fd59977 18#include <IFSelect_ShareOut.ixx>
19#include <Interface_InterfaceError.hxx>
20#include <Interface_Macros.hxx>
21#include <stdio.h>
22
23
b311480e 24IFSelect_ShareOut::IFSelect_ShareOut ()
7fd59977 25{
26 thedefrt = new TCollection_HAsciiString ("Default");
27 thenbdefs = thelastrun = 0;
28}
29
30
31 void IFSelect_ShareOut::Clear (const Standard_Boolean onlydisp)
32{
33 thedisps.Clear();
34 ClearResult(!onlydisp);
35 if (onlydisp) return;
36 themodelmodifiers.Clear();
37 thefilemodifiers.Clear();
38}
39
40 Standard_Boolean IFSelect_ShareOut::RemoveItem
41 (const Handle(Standard_Transient)& item)
42{
43 DeclareAndCast(IFSelect_GeneralModifier,modifier,item);
44 if (!modifier.IsNull()) {
7fd59977 45 Standard_Boolean formodel = modifier->IsKind(STANDARD_TYPE(IFSelect_Modifier));
46 Standard_Integer atnum = ModifierRank(modifier);
47 return RemoveModifier (formodel,atnum);
48 }
49 DeclareAndCast(IFSelect_Dispatch,disp,item);
50 if (!disp.IsNull()) {
51 Standard_Integer atnum = DispatchRank(disp);
52 return RemoveDispatch(atnum);
53 }
54 return Standard_False;
55}
56
57
58 void IFSelect_ShareOut::ClearResult (const Standard_Boolean alsoname)
59{
60 thelastrun = 0;
61 if (alsoname) thenbdefs = 0;
62}
63
64 Standard_Integer IFSelect_ShareOut::LastRun () const
65 { return thelastrun; }
66
67 void IFSelect_ShareOut::SetLastRun (const Standard_Integer lastrun)
68 { thelastrun = lastrun; }
69
70// #######################################################################
71// #### DISPATCHES (ENVOI DES FICHIERS) ####
72
73 Standard_Integer IFSelect_ShareOut::NbDispatches () const
74 { return thedisps.Length(); }
75
76 Standard_Integer IFSelect_ShareOut::DispatchRank
77 (const Handle(IFSelect_Dispatch)& disp) const
78{
79 if (disp.IsNull()) return 0;
80 for (Standard_Integer i = thedisps.Length(); i >= 1; i --)
81 if (disp == thedisps.Value(i)) return i;
82 return 0;
83}
84
85 const Handle(IFSelect_Dispatch)& IFSelect_ShareOut::Dispatch
86 (const Standard_Integer num) const
87{
88 return thedisps.Value(num);
89}
90
91 void IFSelect_ShareOut::AddDispatch
92 (const Handle(IFSelect_Dispatch)& disp)
93{
94 if (disp.IsNull()) return;
95 thedisps.Append(disp);
96}
97
98
99 Standard_Boolean IFSelect_ShareOut::RemoveDispatch
100 (const Standard_Integer rank)
101{
102 if (rank <= thelastrun || rank > thedisps.Length()) return Standard_False;
103 thedisps.Remove(rank);
104 return Standard_True;
105}
106
107// ##########################################################################
108// #### MODIFIERS ####
109
110 void IFSelect_ShareOut::AddModifier
111 (const Handle(IFSelect_GeneralModifier)& modifier,
112 const Standard_Integer atnum)
113{
114 Standard_Boolean formodel = modifier->IsKind(STANDARD_TYPE(IFSelect_Modifier));
115 if (ModifierRank(modifier) == 0) AddModif (modifier,formodel,atnum);
116 Handle(IFSelect_Dispatch) nuldisp;
117 modifier->SetDispatch(nuldisp);
118}
119
120 void IFSelect_ShareOut::AddModifier
121 (const Handle(IFSelect_GeneralModifier)& modifier,
122 const Standard_Integer dispnum, const Standard_Integer atnum)
123{
124 Standard_Boolean formodel = modifier->IsKind(STANDARD_TYPE(IFSelect_Modifier));
125 if (ModifierRank(modifier) == 0) AddModif (modifier,formodel,atnum);
126 Handle(IFSelect_Dispatch) disp = Dispatch(dispnum);
127 modifier->SetDispatch(disp);
128}
129
130
131 void IFSelect_ShareOut::AddModif
132 (const Handle(IFSelect_GeneralModifier)& modifier,
133 const Standard_Boolean formodel, const Standard_Integer atnum)
134{
135 if (formodel) {
136 if (atnum > 0 && atnum <= themodelmodifiers.Length())
137 themodelmodifiers.InsertBefore(atnum,modifier);
138 else themodelmodifiers.Append(modifier);
139 } else {
140 if (atnum > 0 && atnum <= thefilemodifiers.Length())
141 thefilemodifiers.InsertBefore(atnum,modifier);
142 else thefilemodifiers.Append(modifier);
143 }
144}
145
146 Standard_Integer IFSelect_ShareOut::NbModifiers
147 (const Standard_Boolean formodel) const
148{
149 if (formodel) return themodelmodifiers.Length();
150 else return thefilemodifiers.Length();
151}
152
153 Handle(IFSelect_GeneralModifier) IFSelect_ShareOut::GeneralModifier
154 (const Standard_Boolean formodel, const Standard_Integer atnum) const
155{
156 if (formodel) return themodelmodifiers.Value(atnum);
157 else return thefilemodifiers.Value(atnum);
158}
159
160 Handle(IFSelect_Modifier) IFSelect_ShareOut::ModelModifier
161 (const Standard_Integer num) const
162{ return Handle(IFSelect_Modifier)::DownCast(themodelmodifiers.Value(num)); }
163
164 Standard_Integer IFSelect_ShareOut::ModifierRank
165 (const Handle(IFSelect_GeneralModifier)& modifier) const
166{
167 Standard_Integer i;
168 Standard_Boolean formodel = modifier->IsKind(STANDARD_TYPE(IFSelect_Modifier));
169 if (formodel) {
170 for (i = themodelmodifiers.Length(); i >= 1; i --)
171 if (modifier == themodelmodifiers.Value(i)) return i;
172 } else {
173 for (i = thefilemodifiers.Length(); i >= 1; i --)
174 if (modifier == thefilemodifiers.Value(i)) return i;
175 }
176 return 0;
177}
178
179
180 Standard_Boolean IFSelect_ShareOut::RemoveModifier
181 (const Standard_Boolean formodel, const Standard_Integer atnum)
182{
183 if (atnum <= 0) return Standard_False;
184 if (formodel) {
185 if (atnum > themodelmodifiers.Length()) return Standard_False;
186 themodelmodifiers.Remove(atnum);
187 } else {
188 if (atnum > thefilemodifiers.Length()) return Standard_False;
189 thefilemodifiers.Remove(atnum);
190 }
191 return Standard_True;
192}
193
194
195// ChangeModifierRank revient a une permutation circulaire :
196// before est mis en after, ceux qui sont entre tournent
197 Standard_Boolean IFSelect_ShareOut::ChangeModifierRank
198 (const Standard_Boolean formodel,
199 const Standard_Integer before, const Standard_Integer after)
200{
201 Standard_Integer nb;
202 if (before <= 0 || after <= 0) return Standard_False;
203 if (before == after) return Standard_True;
204 if (formodel) {
205 nb = themodelmodifiers.Length();
206 if (before > nb || after > nb) return Standard_False;
207 Handle(IFSelect_GeneralModifier) bef = themodelmodifiers.Value(before);
208 themodelmodifiers.Remove(before);
209 if (after == nb) themodelmodifiers.Append(bef);
210 else themodelmodifiers.InsertBefore(after,bef);
211 } else {
212 nb = thefilemodifiers.Length();
213 if (before > nb || after > nb) return Standard_False;
214 Handle(IFSelect_GeneralModifier) bef = thefilemodifiers.Value(before);
215 thefilemodifiers.Remove(before);
216 if (after == nb) thefilemodifiers.Append(bef);
217 else thefilemodifiers.InsertBefore(after,bef);
218 }
219 return Standard_True;
220}
221
222// #######################################################################
223// #### NOMINATION DES FICHIERS ####
224// Rq : thenbdefs s applique tant que l on ne change pas les termes principaux
225
226 Standard_Boolean IFSelect_ShareOut::SetRootName
227 (const Standard_Integer num, const Handle(TCollection_HAsciiString)& name)
228{
229 if (num < 1 || num > thedisps.Length()) return Standard_False;
230 if (RootNumber(name) != 0) return Standard_False;
231 Dispatch(num)->SetRootName (name);
232 return Standard_True;
233}
234
235 Standard_Boolean IFSelect_ShareOut::HasRootName
236 (const Standard_Integer num) const
237{
238 if (num < 1 || num > thedisps.Length()) return Standard_False;
239 return Dispatch(num)->HasRootName();
240}
241
242 Handle(TCollection_HAsciiString) IFSelect_ShareOut::RootName
243 (const Standard_Integer num) const
244{
245 Handle(TCollection_HAsciiString) nulname;
246 if (num < 1 || num > thedisps.Length()) return nulname;
247 return Dispatch(num)->RootName();
248}
249
250 Standard_Integer IFSelect_ShareOut::RootNumber
251 (const Handle(TCollection_HAsciiString)& name) const
252{
253 if (name.IsNull()) return 0;
254 if (!thedefrt.IsNull()) {
255 if (thedefrt->IsSameString(name)) return -1;
256 }
257 for (Standard_Integer i = 1; i <= thedisps.Length(); i ++) {
258 Handle(TCollection_HAsciiString) root = thedisps.Value(i)->RootName();
259 if (root.IsNull()) continue;
260 if (root->IsSameString(name)) return i;
261 }
262 return 0;
263}
264
265
266 void IFSelect_ShareOut::SetPrefix
267 (const Handle(TCollection_HAsciiString)& pref)
268 { thepref = pref; thenbdefs = 0; }
269
270 Standard_Boolean IFSelect_ShareOut::SetDefaultRootName
271 (const Handle(TCollection_HAsciiString)& defrt)
272{
273 if (RootNumber(defrt) != 0) return Standard_False;
274 if (thedefrt.IsNull() || !thedefrt->IsSameString(defrt)) thenbdefs = 0;
275 thedefrt = defrt;
276 return Standard_True;
277}
278
279 void IFSelect_ShareOut::SetExtension
280 (const Handle(TCollection_HAsciiString)& ext)
281 { theext = ext; thenbdefs = 0; }
282
283 Handle(TCollection_HAsciiString) IFSelect_ShareOut::Prefix () const
284{
285 if (thepref.IsNull()) return new TCollection_HAsciiString("");
286 return thepref;
287}
288
289 Handle(TCollection_HAsciiString) IFSelect_ShareOut::DefaultRootName () const
290{
291 if (thedefrt.IsNull()) return new TCollection_HAsciiString("");
292 return thedefrt;
293}
294
295 Handle(TCollection_HAsciiString) IFSelect_ShareOut::Extension () const
296{
297 if (theext.IsNull()) return new TCollection_HAsciiString("");
298 return theext;
299}
300
301
302 TCollection_AsciiString IFSelect_ShareOut::FileName
303 (const Standard_Integer dnum, const Standard_Integer pnum,
304 const Standard_Integer nbpack)
305{
306 Handle(TCollection_HAsciiString) rot = RootName(dnum);
307 Standard_Integer num = pnum;
308 Standard_Integer npac = nbpack;
309 Standard_Boolean sufnum = (npac > 1 || num > 1);
310 if (rot.IsNull()) {
311 rot = thedefrt;
312 thenbdefs ++; num = thenbdefs;
313 npac = 0;
314 sufnum = Standard_True; // numeroter sur noms par defaut, des le 1er sans 0
315 }
316
317 TCollection_AsciiString res;
318 if (!thepref.IsNull()) res.AssignCat (thepref->ToCString());
319 if (!rot.IsNull()) res.AssignCat (rot->ToCString());
320
321// Suffixe numerique
322 if (sufnum) { // sinon, pas de suffixe numerique
323// Nom du PacketSuffix : _ suivi du numero <num>
324// Si nbpack non nul, alors on a un majorant et on peut preceder de zeros
325// Ex.: nbpack = 50 (donc 2 chiffres), num = 3, cela donnera _03
326// idnum pas utilise : cette methode peut etre redefinie et utiliser idnum ...
327// Si nbpack = 0 ou 1, num = 1 pas de suffixe, sinon suffixe "_num" tel quel
328// MODIF du 3-NOV-1995 -> pour eviter toute confusion, num = 1 donne aussi _1
329 Standard_Integer nbch = 0;
330 char format[10],suffixe[30]; format[1] = ' ';
331 if (npac >= num) {
332 Standard_Integer nbpa = 1;
333 while (nbpa <= npac) { nbpa *= 10; nbch ++; }
334 }
335 if (nbch > 1) {
336 sprintf(format,"_ %d.%dd",nbch,nbch);
337 format[1] = '%';
338 } else if (npac >= num || num >= 1) {
339 sprintf(format,"_ d");
340 format[1] = '%';
341 }
342 if (format[1] == '%') {
343 sprintf (suffixe,format,num);
344 res.AssignCat (suffixe);
345 }
346 }
347
348 if (!theext.IsNull()) res.AssignCat (theext->ToCString());
349 return res;
350}