0026377: Passing Handle objects as arguments to functions as non-const reference...
[occt.git] / src / IFSelect / IFSelect_ModelCopier.hxx
1 // Created on: 1993-08-26
2 // Created by: Christian CAILLET
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #ifndef _IFSelect_ModelCopier_HeaderFile
18 #define _IFSelect_ModelCopier_HeaderFile
19
20 #include <Standard.hxx>
21 #include <Standard_Type.hxx>
22
23 #include <IFSelect_SequenceOfInterfaceModel.hxx>
24 #include <TColStd_SequenceOfAsciiString.hxx>
25 #include <IFSelect_SequenceOfAppliedModifiers.hxx>
26 #include <TColStd_HArray1OfInteger.hxx>
27 #include <TColStd_HSequenceOfHAsciiString.hxx>
28 #include <MMgt_TShared.hxx>
29 #include <Standard_Boolean.hxx>
30 #include <Standard_Integer.hxx>
31 #include <Standard_CString.hxx>
32 class IFSelect_ShareOut;
33 class TCollection_AsciiString;
34 class Interface_InterfaceModel;
35 class IFSelect_AppliedModifiers;
36 class Interface_CheckIterator;
37 class IFSelect_ShareOutResult;
38 class IFSelect_WorkLibrary;
39 class Interface_Protocol;
40 class Interface_CopyTool;
41 class Interface_Graph;
42 class Interface_EntityIterator;
43
44
45 class IFSelect_ModelCopier;
46 DEFINE_STANDARD_HANDLE(IFSelect_ModelCopier, MMgt_TShared)
47
48 //! This class performs the Copy operations involved by the
49 //! description of a ShareOut (evaluated by a ShareOutResult)
50 //! plus, if there are, the Modifications on the results, with
51 //! the help of Modifiers. Each Modifier can work on one or more
52 //! resulting packets, accoding its criteria : it operates on a
53 //! Model once copied and filled with the content of the packet.
54 //!
55 //! Modifiers can be :
56 //! - Model Modifiers, inheriting from the specific class Modifier
57 //! able to run on the content of a Model (header or entities),
58 //! activated by the ModelCopier itself
59 //! - File Modifiers, inheriting directly from GeneralModifier,
60 //! intended to be activated under the control of a WorkLibrary,
61 //! once the Model has been produced (i.e. to act on output
62 //! format, or other specific file features)
63 //!
64 //! The Copy operations can be :
65 //! - immediately put to files : for each packet, a Model is
66 //! created and filled, then the file is output, at that's all
67 //! - memorized : for each packet, a Model is created and filled,
68 //! it is memorized with the corresponding file name.
69 //! it is possible to query the result of memorization (list of
70 //! produced Models and their file names)
71 //! -> it is also possible to send it into the files :
72 //! once files are written, the result is cleared
73 //!
74 //! In addition, a list of really written files is managed :
75 //! A first call to BeginSentFiles clears the list and commands,
76 //! either to begin a new list, or to stop recording it. A call
77 //! to SentFiles returns the list (if recording has been required)
78 //! This list allows to globally exploit the set of produced files
79 //!
80 //! Remark : For operations which concern specific Entities, see
81 //! also in package IFAdapt : a sub-class of ModelCopier allows
82 //! to work with EntityModifier, in addition to Modifier itself
83 //! which still applies to a whole copied Model.
84 class IFSelect_ModelCopier : public MMgt_TShared
85 {
86
87 public:
88
89   
90   //! Creates an empty ModelCopier
91   Standard_EXPORT IFSelect_ModelCopier();
92   
93   //! Sets the ShareOut, which is used to define Modifiers to apply
94   Standard_EXPORT void SetShareOut (const Handle(IFSelect_ShareOut)& sho);
95   
96   //! Clears the list of produced Models
97   Standard_EXPORT void ClearResult();
98   
99   //! Records a new File to be sent, as a couple
100   //! (Name as AsciiString, Content as InterfaceModel)
101   //! Returns True if Done, False if <filename> is already attached
102   //! to another File
103   Standard_EXPORT Standard_Boolean AddFile (const TCollection_AsciiString& filename, const Handle(Interface_InterfaceModel)& content);
104   
105   //! Changes the Name attached to a File which was formerly defined
106   //! by a call to AddFile
107   //! Returns True if Done, False else : if <num> out of range or if
108   //! the new <filename> is already attached to another File
109   //! Remark : Giving an empty File Name is equivalent to ClearFile
110   Standard_EXPORT Standard_Boolean NameFile (const Standard_Integer num, const TCollection_AsciiString& filename);
111   
112   //! Clears the Name attached to a File which was formerly defined
113   //! by a call to AddFile. This Clearing can be undone by a call to
114   //! NameFile (with same <num>)
115   //! Returns True if Done, False else : if <num> is out of range
116   Standard_EXPORT Standard_Boolean ClearFile (const Standard_Integer num);
117   
118   //! Sets a list of File Modifiers to be applied on a file
119   Standard_EXPORT Standard_Boolean SetAppliedModifiers (const Standard_Integer num, const Handle(IFSelect_AppliedModifiers)& applied);
120   
121   //! Clears the list of File Modifiers to be applied on a file
122   Standard_EXPORT Standard_Boolean ClearAppliedModifiers (const Standard_Integer num);
123   
124   //! Performs the Copy Operations, which include the Modifications
125   //! defined by the list of Modifiers. Memorizes the result, as a
126   //! list of InterfaceModels with the corresponding FileNames
127   //! They can then be sent, by the method Send, or queried
128   //! Copy calls internal method Copying.
129   //! Returns the produced CheckList
130   Standard_EXPORT Interface_CheckIterator Copy (IFSelect_ShareOutResult& eval, const Handle(IFSelect_WorkLibrary)& WL, const Handle(Interface_Protocol)& protocol);
131   
132   //! Sends the formerly defined results (see method Copy) to files,
133   //! then clears it
134   //! Remark : A Null File Name cause file to be not produced
135   Standard_EXPORT Interface_CheckIterator SendCopied (const Handle(IFSelect_WorkLibrary)& WL, const Handle(Interface_Protocol)& protocol);
136   
137   //! Performs the Copy Operations (which include the Modifications)
138   //! and Sends the result on files, without memorizing it.
139   //! (the memorized result is ignored : neither queried not filled)
140   Standard_EXPORT Interface_CheckIterator Send (IFSelect_ShareOutResult& eval, const Handle(IFSelect_WorkLibrary)& WL, const Handle(Interface_Protocol)& protocol);
141   
142   //! Sends a model (defined in <G>) into one file, without managing
143   //! remaining data, already sent files, etc. Applies the Model and
144   //! File Modifiers.
145   //! Returns True if well done, False else
146   Standard_EXPORT Interface_CheckIterator SendAll (const Standard_CString filename, const Interface_Graph& G, const Handle(IFSelect_WorkLibrary)& WL, const Handle(Interface_Protocol)& protocol);
147   
148   //! Sends a part of a model into one file. Model is gotten from
149   //! <G>, the part is defined in <iter>.
150   //! Remaining data are managed and can be later be worked on.
151   //! Returns True if well done, False else
152   Standard_EXPORT Interface_CheckIterator SendSelected (const Standard_CString filename, const Interface_Graph& G, const Handle(IFSelect_WorkLibrary)& WL, const Handle(Interface_Protocol)& protocol, const Interface_EntityIterator& iter);
153   
154   //! Produces a Model copied from the Remaining List as <newmod>
155   //! <newmod> is a Null Handle if this list is empty
156   //! <WL> performs the copy by using <TC>
157   //! <TC> is assumed to have been defined with the starting model
158   //! same as defined by <G>.
159   Standard_EXPORT void CopiedRemaining (const Interface_Graph& G, const Handle(IFSelect_WorkLibrary)& WL, Interface_CopyTool& TC, Handle(Interface_InterfaceModel)& newmod);
160   
161   //! Updates Graph status for remaining data, for each entity :
162   //! - Entities just Sent to file or Copied (by CopiedRemaining)
163   //! have their status set to 1
164   //! - the other keep their former status (1 for Send/Copied,
165   //! 0 for Remaining)
166   //! These status are computed by Copying/Sending/CopiedRemaining
167   //! Then, SetRemaining updates graph status, and mustr be called
168   //! just after one of these method has been called
169   //! Returns True if done, False if remaining info if not in phase
170   //! which the Graph (not same counts of items)
171   Standard_EXPORT Standard_Boolean SetRemaining (Interface_Graph& CG) const;
172   
173   //! Returns the count of Files produced, i.e. the count of Models
174   //! memorized (produced by the mmethod Copy) with their file names
175   Standard_EXPORT Standard_Integer NbFiles() const;
176   
177   //! Returns the File Name for a file given its rank
178   //! It is empty after a call to ClearFile on same <num>
179   Standard_EXPORT TCollection_AsciiString FileName (const Standard_Integer num) const;
180   
181   //! Returns the content of a file before sending, under the form
182   //! of an InterfaceModel, given its rank
183   Standard_EXPORT Handle(Interface_InterfaceModel) FileModel (const Standard_Integer num) const;
184   
185   //! Returns the list of File Modifiers to be applied on a file
186   //! when it will be sent, as computed by CopiedModel :
187   //! If it is a null handle, no File Modifier has to be applied.
188   Standard_EXPORT Handle(IFSelect_AppliedModifiers) AppliedModifiers (const Standard_Integer num) const;
189   
190   //! Begins a sequence of recording the really sent files
191   //! <sho> : the default file numbering is cleared
192   //! If <record> is False, clears the list and stops recording
193   //! If <record> is True, clears the list and commands recording
194   //! Creation time corresponds to "stop recording"
195   Standard_EXPORT void BeginSentFiles (const Handle(IFSelect_ShareOut)& sho, const Standard_Boolean record);
196   
197   //! Adds the name of a just sent file, if BeginSentFiles
198   //! has commanded recording; else does nothing
199   //! It is called by methods SendCopied Sending
200   Standard_EXPORT void AddSentFile (const Standard_CString filename);
201   
202   //! Returns the list of recorded names of sent files. Can be empty
203   //! (if no file has been sent). Returns a Null Handle if
204   //! BeginSentFiles has stopped recording.
205   Standard_EXPORT Handle(TColStd_HSequenceOfHAsciiString) SentFiles() const;
206
207
208
209
210   DEFINE_STANDARD_RTTIEXT(IFSelect_ModelCopier,MMgt_TShared)
211
212 protected:
213
214   
215   //! Internal routine which does the effective Copy. It allows to
216   //! work, either with a standard CopyTool, or a specialised one
217   //! Copying itself is done by <WL> which uses a CopyTool
218   Standard_EXPORT Interface_CheckIterator Copying (IFSelect_ShareOutResult& eval, const Handle(IFSelect_WorkLibrary)& WL, const Handle(Interface_Protocol)& protocol, Interface_CopyTool& TC);
219   
220   //! Internal routine which does the effective Send. It allows to
221   //! work, either with a standard CopyTool, or a specialised one
222   Standard_EXPORT Interface_CheckIterator Sending (IFSelect_ShareOutResult& eval, const Handle(IFSelect_WorkLibrary)& WL, const Handle(Interface_Protocol)& protocol, Interface_CopyTool& TC);
223   
224   //! Performs the Copy of a unitary Packet
225   //! Input parameters are :
226   //! <G> is the graph which defines the starting entities, it
227   //! contains the original InterfaceModel
228   //! <WL> performs the copy by using <TC>
229   //! <protocol> is the used protocol (can be usefull for Modifiers)
230   //! <topcopy> is the list of Entities which are the Roots of the
231   //! packet to be copied
232   //! <filename> is the name of the file which will receive it
233   //! <dispid> is the Identifier of the Dispatch which have produced
234   //! this packet, <numod> is the rank of the packet for this
235   //! Dispatch
236   //! <TC> is a CopyTool, which performs the copy
237   //!
238   //! Returned values (as arguments) are :
239   //! <newmod> is the result of the copy, as a new InterfaceModel on
240   //! which Model Modifiers have already been applied (if there are)
241   //! <applied> determines the File Modifiers which remain to be
242   //! applied (when the file itself will be output) : for each File
243   //! Modifier recorded in <me>, <applied>'s Value is :
244   //! - Null if this Modifier has not to be applied
245   //! - an empty list if this Modifier has to be applied without
246   //! distinguishing specific entities
247   //! - a list of numbers of entities in <model> if this Modifier
248   //! concerns particularly these entities (which are the results
249   //! of copying the result of its input selection)
250   //! <checks> is the produced Check List (by Modifiers as required)
251   //!
252   //! Warning : File Modifiers are evaluated at the time of Copy itself
253   //! If their list is changed between this Copy and the Sending
254   //! itself of the file, these changes are ignored
255   Standard_EXPORT void CopiedModel (const Interface_Graph& G, const Handle(IFSelect_WorkLibrary)& WL, const Handle(Interface_Protocol)& protocol, const Interface_EntityIterator& topcopy, const TCollection_AsciiString& filename, const Standard_Integer dispnum, const Standard_Integer numod, Interface_CopyTool& TC, Handle(Interface_InterfaceModel)& newmod, Handle(IFSelect_AppliedModifiers)& applied, Interface_CheckIterator& checks) const;
256
257
258
259 private:
260
261
262   IFSelect_SequenceOfInterfaceModel thefilemodels;
263   TColStd_SequenceOfAsciiString thefilenames;
264   IFSelect_SequenceOfAppliedModifiers theapplieds;
265   Handle(IFSelect_ShareOut) theshareout;
266   Handle(TColStd_HArray1OfInteger) theremain;
267   Handle(TColStd_HSequenceOfHAsciiString) thesentfiles;
268
269
270 };
271
272
273
274
275
276
277
278 #endif // _IFSelect_ModelCopier_HeaderFile