1 // Created on: 1992-02-11 2 // Created by: Christian CAILLET 3 // Copyright (c) 1992-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 _StepData_StepWriter_HeaderFile 18 #define _StepData_StepWriter_HeaderFile 19 20 #include <Standard.hxx> 21 #include <Standard_DefineAlloc.hxx> 22 #include <Standard_Handle.hxx> 23 24 #include <TColStd_HSequenceOfHAsciiString.hxx> 25 #include <Interface_LineBuffer.hxx> 26 #include <Standard_Boolean.hxx> 27 #include <Standard_Integer.hxx> 28 #include <Interface_FloatWriter.hxx> 29 #include <Interface_CheckIterator.hxx> 30 #include <TColStd_HArray1OfInteger.hxx> 31 #include <Standard_CString.hxx> 32 #include <Standard_Real.hxx> 33 #include <StepData_Logical.hxx> 34 #include <TColStd_HArray1OfReal.hxx> 35 #include <Standard_OStream.hxx> 36 class StepData_StepModel; 37 class Interface_InterfaceMismatch; 38 class Interface_FloatWriter; 39 class StepData_Protocol; 40 class StepData_WriterLib; 41 class TCollection_AsciiString; 42 class TCollection_HAsciiString; 43 class StepData_Field; 44 class StepData_PDescr; 45 class StepData_SelectMember; 46 class StepData_FieldList; 47 class StepData_ESDescr; 48 class Standard_Transient; 49 class Interface_CheckIterator; 50 51 52 //! manages atomic file writing, under control of StepModel (for 53 //! general organisation of file) and each class of Transient 54 //! (for its own parameters) : prepares text to be written then 55 //! writes it 56 //! A stream cannot be used because Step limits line length at 72 57 //! In more, a specific object offers more appropriate functions 58 class StepData_StepWriter 59 { 60 public: 61 62 DEFINE_STANDARD_ALLOC 63 64 65 //! Creates an empty StepWriter from a StepModel. The StepModel 66 //! provides the Number of Entities, as identifiers for File 67 Standard_EXPORT StepData_StepWriter(const Handle(StepData_StepModel)& amodel); 68 69 //! ModeLabel controls how to display entity ids : 70 //! 0 (D) gives entity number in the model 71 //! 1 gives the already recorded label (else, its number) 72 //! Warning : conflicts are not controlled 73 Standard_EXPORT Standard_Integer& LabelMode(); 74 75 //! TypeMode controls the type form to use : 76 //! 0 (D) for normal long form 77 //! 1 for short form (if a type name has no short form, normal 78 //! long form is then used) 79 Standard_EXPORT Standard_Integer& TypeMode(); 80 81 //! Returns the embedded FloatWriter, which controls sending Reals 82 //! Use this method to access FloatWriter in order to consult or 83 //! change its options (MainFormat, FormatForRange,ZeroSuppress), 84 //! because it is returned as the address of its field 85 Standard_EXPORT Interface_FloatWriter& FloatWriter(); 86 87 //! Declares the Entity Number <numscope> to correspond to a Scope 88 //! which contains the Entity Number <numin>. Several calls to the 89 //! same <numscope> add Entities in this Scope, in this order. 90 //! Error if <numin> is already declared in the Scope 91 //! Warning : the declaration of the Scopes is assumed to be consistent, 92 //! i.e. <numin> is not referenced from outside this Scope 93 //! (not checked here) 94 Standard_EXPORT void SetScope (const Standard_Integer numscope, const Standard_Integer numin); 95 96 //! Returns True if an Entity identified by its Number is in a Scope 97 Standard_EXPORT Standard_Boolean IsInScope (const Standard_Integer num) const; 98 99 //! Sends the complete Model, included HEADER and DATA Sections 100 //! Works with a WriterLib defined through a Protocol 101 //! If <headeronly> is given True, only the HEADER Section is sent 102 //! (used to Dump the Header of a StepModel) 103 Standard_EXPORT void SendModel (const Handle(StepData_Protocol)& protocol, const Standard_Boolean headeronly = Standard_False); 104 105 //! Begins model header 106 Standard_EXPORT void SendHeader(); 107 108 //! Begins data section; error if EndSec was not set 109 Standard_EXPORT void SendData(); 110 111 //! Send an Entity of the Data Section. If it corresponds to a 112 //! Scope, also Sends the Scope informations and contained Items 113 Standard_EXPORT void SendEntity (const Standard_Integer nument, const StepData_WriterLib& lib); 114 115 //! sets end of section; to be done before passing to next one 116 Standard_EXPORT void EndSec(); 117 118 //! sets end of file; error is EndSec was not set 119 Standard_EXPORT void EndFile(); 120 121 //! flushes current line; if empty, flushes it (defines a new 122 //! empty line) if evenempty is True; else, skips it 123 Standard_EXPORT void NewLine (const Standard_Boolean evenempty); 124 125 //! joins current line to last one, only if new length is 72 max 126 //! if newline is True, a new current line begins; else, current 127 //! line is set to the last line (once joined) itself an can be 128 //! completed 129 Standard_EXPORT void JoinLast (const Standard_Boolean newline); 130 131 //! asks that further indentations will begin at position of 132 //! entity first opening bracket; else they begin at zero (def) 133 //! for each sublist level, two more blancks are added at beginning 134 //! (except for text continuation, which must begin at true zero) 135 Standard_EXPORT void Indent (const Standard_Boolean onent); 136 137 //! begins an entity with an ident plus '=' (at beginning of line) 138 //! entity ident is its Number given by the containing Model 139 //! Warning : <ident> must be, either Number or Label, according LabelMode 140 Standard_EXPORT void SendIdent (const Standard_Integer ident); 141 142 //! sets a begin of Scope (ends this line) 143 Standard_EXPORT void SendScope(); 144 145 //! sets an end of Scope (on a separate line) 146 Standard_EXPORT void SendEndscope(); 147 148 //! sets a comment mark : if mode is True, begins Comment zone, 149 //! if mode is False, ends Comment zone (if one is begun) 150 Standard_EXPORT void Comment (const Standard_Boolean mode); 151 152 //! sends a comment. Error if we are not inside a comment zone 153 Standard_EXPORT void SendComment (const Handle(TCollection_HAsciiString)& text); 154 155 //! same as above but accepts a CString (ex.: "..." directly) 156 Standard_EXPORT void SendComment (const Standard_CString text); 157 158 //! sets entity's StepType, opens brakets, starts param no to 0 159 //! params are separated by comma 160 //! Remark : for a Multiple Type Entity (see Express ANDOR clause) 161 //! StartComplex must be called before sending componants, then 162 //! each "Componant" must be send separately (one call to 163 //! StartEntity for each one) : the Type which preceeds is then 164 //! automaticaly closed. Once all the componants have been sent, 165 //! EndComplex must be called, then and only then EndEntity 166 Standard_EXPORT void StartEntity (const TCollection_AsciiString& atype); 167 168 //! sends the start of a complex entity, which is a simple open 169 //! bracket (without increasing braket level) 170 //! It must be called JUST AFTER SendEntity and BEFORE sending 171 //! componants, each one begins by StartEntity 172 Standard_EXPORT void StartComplex(); 173 174 //! sends the end of a complex entity : a simple closed bracket 175 //! It must be called AFTER sending all the componants and BEFORE 176 //! the final call to EndEntity 177 Standard_EXPORT void EndComplex(); 178 179 //! Sends the content of a field, controlled by its descriptor 180 //! If the descriptor is not defined, follows the description 181 //! detained by the field itself 182 Standard_EXPORT void SendField (const StepData_Field& fild, const Handle(StepData_PDescr)& descr); 183 184 //! Sends a SelectMember, which cab be named or not 185 Standard_EXPORT void SendSelect (const Handle(StepData_SelectMember)& sm, const Handle(StepData_PDescr)& descr); 186 187 //! Send the content of an entity as being a FieldList controlled 188 //! by its descriptor. This includes start and end brackets but 189 //! not the entity type 190 Standard_EXPORT void SendList (const StepData_FieldList& list, const Handle(StepData_ESDescr)& descr); 191 192 //! open a sublist by a '(' 193 Standard_EXPORT void OpenSub(); 194 195 //! open a sublist with its type then a '(' 196 Standard_EXPORT void OpenTypedSub (const Standard_CString subtype); 197 198 //! closes a sublist by a ')' 199 Standard_EXPORT void CloseSub(); 200 201 //! prepares adding a parameter (that is, adds ',' except for 202 //! first one); normally for internal use; can be used to send 203 //! a totally empty parameter (with no litteral value) 204 Standard_EXPORT void AddParam(); 205 206 //! sends an integer parameter 207 Standard_EXPORT void Send (const Standard_Integer val); 208 209 //! sends a real parameter (wroks with FloatWriter) 210 Standard_EXPORT void Send (const Standard_Real val); 211 212 //! sends a text given as string (it will be set between '...') 213 Standard_EXPORT void Send (const TCollection_AsciiString& val); 214 215 //! sends a reference to an entity (its identifier with '#') 216 //! REMARK 1 : a Null <val> is interpreted as "Undefined" 217 //! REMARK 2 : for an HAsciiString which is not recorded in the 218 //! Model, it is send as its String Content, between quotes 219 Standard_EXPORT void Send (const Handle(Standard_Transient)& val); 220 221 //! sends a Boolean as .T. for True or .F. for False 222 //! (it is an useful case of Enum, which is built-in) 223 Standard_EXPORT void SendBoolean (const Standard_Boolean val); 224 225 //! sends a Logical as .T. or .F. or .U. according its Value 226 //! (it is a standard case of Enum for Step, and is built-in) 227 Standard_EXPORT void SendLogical (const StepData_Logical val); 228 229 //! sends a string exactly as it is given 230 Standard_EXPORT void SendString (const TCollection_AsciiString& val); 231 232 //! sends a string exactly as it is given 233 Standard_EXPORT void SendString (const Standard_CString val); 234 235 //! sends an enum given by String (litteral expression) 236 //! adds '.' around it if not done 237 //! Remark : val can be computed by class EnumTool from StepData: 238 //! StepWriter.SendEnum (myenum.Text(enumval)); 239 Standard_EXPORT void SendEnum (const TCollection_AsciiString& val); 240 241 //! sends an enum given by String (litteral expression) 242 //! adds '.' around it if not done 243 Standard_EXPORT void SendEnum (const Standard_CString val); 244 245 //! sends an array of real 246 Standard_EXPORT void SendArrReal (const Handle(TColStd_HArray1OfReal)& anArr); 247 248 //! sends an undefined (optionnal absent) parameter (by '$') 249 Standard_EXPORT void SendUndef(); 250 251 //! sends a "Derived" parameter (by '*'). A Derived Parameter has 252 //! been inherited from a Super-Type then redefined as being 253 //! computed by a function. Hence its value in file is senseless. 254 Standard_EXPORT void SendDerived(); 255 256 //! sends end of entity (closing bracket plus ';') 257 //! Error if count of opened-closed brackets is not null 258 Standard_EXPORT void EndEntity(); 259 260 //! Returns the check-list, which has received possible checks : 261 //! for unknown entities, badly loaded ones, null or unknown 262 //! references 263 Standard_EXPORT Interface_CheckIterator CheckList() const; 264 265 //! Returns count of Lines 266 Standard_EXPORT Standard_Integer NbLines() const; 267 268 //! Returns a Line given its rank in the File 269 Standard_EXPORT Handle(TCollection_HAsciiString) Line (const Standard_Integer num) const; 270 271 //! writes result on an output defined as an OStream 272 //! then clears it 273 Standard_EXPORT Standard_Boolean Print (Standard_OStream& S); 274 275 276 277 278 protected: 279 280 281 282 283 284 private: 285 286 287 //! adds a string to current line; first flushes it if full 288 //! (72 char); more allows to ask a reserve at end of line : flush 289 //! is done if remaining length (to 72) is less than <more> 290 Standard_EXPORT void AddString (const TCollection_AsciiString& str, const Standard_Integer more = 0); 291 292 //! Same as above, but the string is given by CString + Length 293 Standard_EXPORT void AddString (const Standard_CString str, const Standard_Integer lnstr, const Standard_Integer more = 0); 294 295 296 Handle(StepData_StepModel) themodel; 297 Handle(TColStd_HSequenceOfHAsciiString) thefile; 298 Interface_LineBuffer thecurr; 299 Standard_Boolean thesect; 300 Standard_Boolean thecomm; 301 Standard_Boolean thefirst; 302 Standard_Boolean themult; 303 Standard_Integer thelevel; 304 Standard_Boolean theindent; 305 Standard_Integer theindval; 306 Standard_Integer thetypmode; 307 Interface_FloatWriter thefloatw; 308 Interface_CheckIterator thechecks; 309 Standard_Integer thenum; 310 Standard_Integer thelabmode; 311 Handle(TColStd_HArray1OfInteger) thescopebeg; 312 Handle(TColStd_HArray1OfInteger) thescopeend; 313 Handle(TColStd_HArray1OfInteger) thescopenext; 314 315 316 }; 317 318 319 320 321 322 323 324 #endif // _StepData_StepWriter_HeaderFile 325